-Rewrote entire GUI in .NET

-Several other fixes (bugfixes, refactoring, etc.)
-Added a few more features to debugger
This commit is contained in:
Souryo 2015-07-01 23:17:14 -04:00
parent f8f9755eff
commit 48409ae82b
148 changed files with 10445 additions and 5762 deletions

View file

@ -77,13 +77,22 @@ bool APU::Exec(uint32_t executedCycles)
uint32_t availableSampleCount = _buf.samples_avail();
if(availableSampleCount >= APU::SamplesPerFrame) {
size_t sampleCount = _buf.read_samples(_outputBuffer, APU::SamplesPerFrame);
if(APU::AudioDevice) {
APU::AudioDevice->PlayBuffer(_outputBuffer, sampleCount * BitsPerSample / 8);
}
}
return true;
}
return false;
}
void APU::StopAudio()
{
if(APU::AudioDevice) {
APU::AudioDevice->Pause();
}
}
void APU::StreamState(bool saving)
{
apu_snapshot_t snapshot;

View file

@ -55,4 +55,5 @@ class APU : public IMemoryHandler, public Snapshotable
void WriteRAM(uint16_t addr, uint8_t value);
bool Exec(uint32_t executedCycles);
static void StopAudio();
};

View file

@ -327,7 +327,7 @@ class BaseMapper : public IMemoryHandler, public Snapshotable
if(_hasCHRRAM) {
_chrPages[AddrToCHRSlot(addr)][addr & (GetCHRPageSize() - 1)] = value;
} else {
assert(false);
//assert(false);
}
}

View file

@ -1,14 +1,12 @@
#include "stdafx.h"
#include "CPU.h"
int32_t CPU::CycleCount = 0;
int32_t CPU::RelativeCycleCount = 0;
uint32_t CPU::CyclePenalty = 0;
bool CPU::NMIFlag = false;
uint32_t CPU::IRQFlag = 0;
CPU* CPU::Instance = nullptr;
CPU::CPU(MemoryManager *memoryManager) : _memoryManager(memoryManager)
{
CPU::Instance = this;
Func opTable[] = {
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
&CPU::BRK, &CPU::ORA, nullptr, nullptr, &CPU::NOP, &CPU::ORA, &CPU::ASL_Memory, nullptr, &CPU::PHP, &CPU::ORA, &CPU::ASL_Acc, nullptr, &CPU::NOP, &CPU::ORA, &CPU::ASL_Memory, nullptr, //0
@ -94,10 +92,11 @@ CPU::CPU(MemoryManager *memoryManager) : _memoryManager(memoryManager)
void CPU::Reset(bool softReset)
{
CPU::NMIFlag = false;
CPU::IRQFlag = 0;
CPU::CycleCount = 0;
CPU::RelativeCycleCount = 0;
_state.NMIFlag = false;
_state.IRQFlag = 0;
_cycleCount = 0;
_relativeCycleCount = 0;
_cyclePenalty = 0;
_state.PC = MemoryReadWord(CPU::ResetVector);
if(softReset) {
@ -122,9 +121,9 @@ uint32_t CPU::Exec()
if(!_runNMI && !_runIRQ) {
uint8_t opCode = GetOPCode();
if(CPU::NMIFlag) {
if(_state.NMIFlag) {
_runNMI = true;
} else if(opCode != 0x40 && CPU::IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) {
} else if(opCode != 0x40 && _state.IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) {
_runIRQ = true;
}
@ -139,7 +138,7 @@ uint32_t CPU::Exec()
//throw exception("Invalid opcode");
}
if(!_runIRQ && opCode == 0x40 && CPU::IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) {
if(!_runIRQ && opCode == 0x40 && _state.IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) {
//"If an IRQ is pending and an RTI is executed that clears the I flag, the CPU will invoke the IRQ handler immediately after RTI finishes executing."
_runIRQ = true;
}
@ -147,7 +146,7 @@ uint32_t CPU::Exec()
if(_runNMI) {
NMI();
_runNMI = false;
CPU::NMIFlag = false;
_state.NMIFlag = false;
} else if(_runIRQ) {
IRQ();
}
@ -156,14 +155,14 @@ uint32_t CPU::Exec()
executedCycles = 7;
}
CPU::CycleCount += executedCycles;
_cycleCount += executedCycles;
return executedCycles + GetCyclePenalty();
}
void CPU::EndFrame()
{
CPU::RelativeCycleCount += CPU::CycleCount;
CPU::CycleCount = 0;
_relativeCycleCount += _cycleCount;
_cycleCount = 0;
}
void CPU::StreamState(bool saving)
@ -175,12 +174,12 @@ void CPU::StreamState(bool saving)
Stream<uint8_t>(_state.X);
Stream<uint8_t>(_state.Y);
Stream<int32_t>(CPU::CycleCount);
Stream<bool>(CPU::NMIFlag);
Stream<uint32_t>(CPU::IRQFlag);
Stream<int32_t>(_cycleCount);
Stream<bool>(_state.NMIFlag);
Stream<uint32_t>(_state.IRQFlag);
Stream<bool>(_runNMI);
Stream<bool>(_runIRQ);
Stream<int32_t>(CPU::RelativeCycleCount);
Stream<int32_t>(_relativeCycleCount);
}

View file

@ -36,12 +36,14 @@ enum class IRQSource
struct State
{
uint16_t PC;
uint8_t SP;
uint8_t A;
uint8_t X;
uint8_t Y;
uint8_t PS;
uint16_t PC = 0;
uint8_t SP = 0;
uint8_t A = 0;
uint8_t X = 0;
uint8_t Y = 0;
uint8_t PS = 0;
uint32_t IRQFlag = 0;
bool NMIFlag = false;
};
class CPU : public Snapshotable
@ -51,11 +53,13 @@ private:
const uint16_t ResetVector = 0xFFFC;
const uint16_t IRQVector = 0xFFFE;
static CPU* Instance;
typedef void(CPU::*Func)();
static int32_t CycleCount;
static int32_t RelativeCycleCount;
static uint32_t CyclePenalty;
int32_t _cycleCount;
int32_t _relativeCycleCount;
uint32_t _cyclePenalty;
Func _opTable[256];
uint8_t _cycles[256];
@ -67,8 +71,6 @@ private:
State _state;
MemoryManager *_memoryManager = nullptr;
static bool NMIFlag;
static uint32_t IRQFlag;
bool _runNMI = false;
bool _runIRQ = false;
@ -465,8 +467,8 @@ private:
}
uint32_t GetCyclePenalty() {
uint32_t cyclePenalty = CPU::CyclePenalty;
CPU::CyclePenalty = 0;
uint32_t cyclePenalty = _cyclePenalty;
_cyclePenalty = 0;
return cyclePenalty;
}
@ -570,7 +572,7 @@ private:
Push((uint16_t)(PC() + 1));
uint8_t flags = PS() | PSFlags::Break;
if(CPU::NMIFlag) {
if(_state.NMIFlag) {
Push((uint8_t)flags);
SetFlags(PSFlags::Interrupt);
@ -594,7 +596,7 @@ private:
void IRQ() {
Push((uint16_t)(PC()));
if(CPU::NMIFlag) {
if(_state.NMIFlag) {
Push((uint8_t)PS());
SetFlags(PSFlags::Interrupt);
@ -624,27 +626,20 @@ public:
static const uint32_t ClockRate = 1789773;
CPU(MemoryManager *memoryManager);
static int32_t GetCycleCount() { return CPU::CycleCount; }
static int32_t GetRelativeCycleCount() { return CPU::RelativeCycleCount + CPU::CycleCount; }
static int32_t GetCycleCount() { return CPU::Instance->_cycleCount; }
static int32_t GetRelativeCycleCount() { return CPU::Instance->_relativeCycleCount + CPU::Instance->_cycleCount; }
static void IncCycleCount(uint32_t cycles) {
CPU::CyclePenalty += cycles;
CPU::CycleCount += cycles;
}
static void SetNMIFlag() { CPU::NMIFlag = true; }
static void ClearNMIFlag() { CPU::NMIFlag = false; }
static void SetIRQSource(IRQSource source)
{
CPU::IRQFlag |= (int)source;
}
static void ClearIRQSource(IRQSource source)
{
CPU::IRQFlag &= ~(int)source;
CPU::Instance->_cyclePenalty += cycles;
CPU::Instance->_cycleCount += cycles;
}
static void SetNMIFlag() { CPU::Instance->_state.NMIFlag = true; }
static void ClearNMIFlag() { CPU::Instance->_state.NMIFlag = false; }
static void SetIRQSource(IRQSource source) { CPU::Instance->_state.IRQFlag |= (int)source; }
static void ClearIRQSource(IRQSource source) { CPU::Instance->_state.IRQFlag &= ~(int)source; }
void Reset(bool softReset);
uint32_t Exec();
void EndFrame();
State GetState() { return _state; }
};

View file

@ -0,0 +1,32 @@
#pragma once
#include "stdafx.h"
class ClientConnectionData
{
public:
string Host;
uint16_t Port;
wstring PlayerName;
uint8_t* AvatarData;
uint32_t AvatarSize;
ClientConnectionData(string host, uint16_t port, wstring playerName, uint8_t* avatarData, uint32_t avatarSize) :
Host(host), Port(port), PlayerName(playerName), AvatarSize(avatarSize)
{
if(avatarSize > 0) {
AvatarData = new uint8_t[avatarSize];
memcpy(AvatarData, avatarData, avatarSize);
} else {
AvatarData = nullptr;
}
}
~ClientConnectionData()
{
if(AvatarData) {
delete[] AvatarData;
}
}
};

View file

@ -1,13 +1,14 @@
#include "stdafx.h"
#include <thread>
#include "Console.h"
#include "BaseMapper.h"
#include "MapperFactory.h"
#include "Debugger.h"
#include "../Utilities/Timer.h"
#include "../Utilities/FolderUtilities.h"
#include "../Utilities/ConfigManager.h"
#include "../Core/MessageManager.h"
Console* Console::Instance = nullptr;
IMessageManager* Console::MessageManager = nullptr;
list<INotificationListener*> Console::NotificationListeners;
shared_ptr<Console> Console::Instance = nullptr;
uint32_t Console::Flags = 0;
uint32_t Console::CurrentFPS = 0;
SimpleLock Console::PauseLock;
@ -15,26 +16,28 @@ SimpleLock Console::RunningLock;
Console::Console(wstring filename)
{
Console::Instance = this;
Initialize(filename);
}
Console::~Console()
{
Movie::Stop();
if(Console::Instance == this) {
Console::Instance = nullptr;
if(Console::Instance.get() == this) {
Console::Instance.reset();
}
}
Console* Console::GetInstance()
shared_ptr<Console> Console::GetInstance()
{
return Console::Instance;
}
void Console::Initialize(wstring filename)
{
if(Console::Instance == nullptr) {
Console::Instance.reset(this);
}
shared_ptr<BaseMapper> mapper = MapperFactory::InitializeFromFile(filename);
if(mapper) {
_romFilepath = filename;
@ -54,10 +57,9 @@ void Console::Initialize(wstring filename)
ResetComponents(false);
Console::SendNotification(ConsoleNotificationType::GameLoaded);
Console::DisplayMessage(wstring(L"Game loaded: ") + FolderUtilities::GetFilename(filename, false));
MessageManager::DisplayMessage(L"Game loaded", FolderUtilities::GetFilename(filename, false));
} else {
Console::DisplayMessage(wstring(L"Could not load file: ") + FolderUtilities::GetFilename(filename, true));
MessageManager::DisplayMessage(L"Error", wstring(L"Could not load file: ") + FolderUtilities::GetFilename(filename, true));
}
}
@ -73,42 +75,6 @@ void Console::LoadROM(wstring filename)
}
}
bool Console::AttemptLoadROM(wstring filename, uint32_t crc32Hash)
{
if(Instance) {
if(ROMLoader::GetCRC32(Instance->_romFilepath) == crc32Hash) {
//Current game matches, no need to do anything
return true;
}
}
vector<wstring> romFiles = FolderUtilities::GetFilesInFolder(ConfigManager::GetValue<wstring>(Config::LastGameFolder), L"*.nes", true);
for(wstring zipFile : FolderUtilities::GetFilesInFolder(ConfigManager::GetValue<wstring>(Config::LastGameFolder), L"*.zip", true)) {
romFiles.push_back(zipFile);
}
for(wstring romFile : romFiles) {
//Quick search by filename
if(FolderUtilities::GetFilename(romFile, true).compare(filename) == 0) {
if(ROMLoader::GetCRC32(romFile) == crc32Hash) {
//Matching ROM found
Console::LoadROM(romFile);
return true;
}
}
}
for(wstring romFile : romFiles) {
//Slower search by CRC value
if(ROMLoader::GetCRC32(romFile) == crc32Hash) {
//Matching ROM found
Console::LoadROM(romFile);
return true;
}
}
return false;
}
wstring Console::GetROMPath()
{
wstring filepath;
@ -122,21 +88,30 @@ void Console::Reset()
{
Movie::Stop();
if(Instance) {
Console::Pause();
Instance->ResetComponents(true);
Console::Resume();
}
}
void Console::ResetComponents(bool softReset)
{
_cpu->Reset(softReset);
_ppu->Reset();
_apu->Reset();
_cpu->Reset(softReset);
if(softReset) {
MessageManager::SendNotification(ConsoleNotificationType::GameReset);
} else {
MessageManager::SendNotification(ConsoleNotificationType::GameLoaded);
}
}
void Console::Stop()
{
_stop = true;
Console::ClearFlags(EmulationFlags::Paused);
Console::RunningLock.Acquire();
Console::RunningLock.Release();
}
void Console::Pause()
@ -168,45 +143,11 @@ bool Console::CheckFlag(int flag)
return (Console::Flags & flag) == flag;
}
void Console::RegisterMessageManager(IMessageManager* messageManager)
{
Console::MessageManager = messageManager;
}
void Console::DisplayMessage(wstring message)
{
std::wcout << message << std::endl;
if(Console::MessageManager) {
Console::MessageManager->DisplayMessage(message);
}
}
uint32_t Console::GetFPS()
{
return Console::CurrentFPS;
}
void Console::RegisterNotificationListener(INotificationListener* notificationListener)
{
Console::NotificationListeners.push_back(notificationListener);
Console::NotificationListeners.unique();
}
void Console::UnregisterNotificationListener(INotificationListener* notificationListener)
{
Console::NotificationListeners.remove(notificationListener);
}
void Console::SendNotification(ConsoleNotificationType type)
{
list<INotificationListener*> listeners = Console::NotificationListeners;
//Iterate on a copy to prevent issues if a notification causes a listener to unregister itself
for(INotificationListener* notificationListener : listeners) {
notificationListener->ProcessNotification(type);
}
}
void Console::Run()
{
Timer clockTimer;
@ -247,14 +188,18 @@ void Console::Run()
}
if(CheckFlag(EmulationFlags::Paused) && !_stop) {
Console::SendNotification(ConsoleNotificationType::GamePaused);
MessageManager::SendNotification(ConsoleNotificationType::GamePaused);
Console::RunningLock.Release();
//Prevent audio from looping endlessly while game is paused
_apu->StopAudio();
while(CheckFlag(EmulationFlags::Paused)) {
//Sleep until emulation is resumed
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(100));
}
Console::RunningLock.Acquire();
Console::SendNotification(ConsoleNotificationType::GameResumed);
MessageManager::SendNotification(ConsoleNotificationType::GameResumed);
}
clockTimer.Reset();
@ -266,42 +211,17 @@ void Console::Run()
if(fpsTimer.GetElapsedMS() > 1000) {
uint32_t frameCount = _ppu->GetFrameCount();
if((int32_t)frameCount - (int32_t)lastFrameCount < 0) {
Console::CurrentFPS = 0;
} else {
Console::CurrentFPS = (int)(std::round((double)(frameCount - lastFrameCount) / (fpsTimer.GetElapsedMS() / 1000)));
}
lastFrameCount = frameCount;
fpsTimer.Reset();
}
}
Console::RunningLock.Release();
}
void Console::SaveState(wstring filename)
{
ofstream file(filename, ios::out | ios::binary);
if(file) {
Console::Pause();
Console::SaveState(file);
Console::Resume();
file.close();
Console::DisplayMessage(L"State saved.");
}
}
bool Console::LoadState(wstring filename)
{
ifstream file(filename, ios::out | ios::binary);
if(file) {
Console::Pause();
Console::LoadState(file);
Console::Resume();
file.close();
Console::DisplayMessage(L"State loaded.");
return true;
}
Console::DisplayMessage(L"Slot is empty.");
return false;
_apu->StopAudio();
}
void Console::SaveState(ostream &saveStream)
@ -326,7 +246,7 @@ void Console::LoadState(istream &loadStream)
Instance->_apu->LoadSnapshot(&loadStream);
Instance->_controlManager->LoadSnapshot(&loadStream);
Console::SendNotification(ConsoleNotificationType::StateLoaded);
MessageManager::SendNotification(ConsoleNotificationType::StateLoaded);
}
}
@ -340,7 +260,7 @@ void Console::LoadState(uint8_t *buffer, uint32_t bufferSize)
shared_ptr<Debugger> Console::GetDebugger()
{
return shared_ptr<Debugger>(new Debugger(shared_ptr<Console>(this), _cpu, _memoryManager, _mapper));
return shared_ptr<Debugger>(new Debugger(Console::Instance, _cpu, _ppu, _memoryManager, _mapper));
}
bool Console::RunTest(uint8_t *expectedResult)

View file

@ -4,13 +4,9 @@
#include "CPU.h"
#include "PPU.h"
#include "APU.h"
#include "BaseMapper.h"
#include "MemoryManager.h"
#include "ControlManager.h"
#include "Debugger.h"
#include "../Utilities/SimpleLock.h"
#include "IMessageManager.h"
#include "INotificationListener.h"
enum EmulationFlags
{
@ -18,19 +14,20 @@ enum EmulationFlags
Paused = 0x02,
};
class Debugger;
class BaseMapper;
class Console
{
private:
static Console* Instance;
static shared_ptr<Console> Instance;
static uint32_t Flags;
static uint32_t CurrentFPS;
static SimpleLock PauseLock;
static SimpleLock RunningLock;
static IMessageManager* MessageManager;
static list<INotificationListener*> NotificationListeners;
shared_ptr<CPU> _cpu;
unique_ptr<PPU> _ppu;
shared_ptr<PPU> _ppu;
unique_ptr<APU> _apu;
shared_ptr<BaseMapper> _mapper;
unique_ptr<ControlManager> _controlManager;
@ -62,14 +59,11 @@ class Console
shared_ptr<Debugger> Console::GetDebugger();
static void SaveState(wstring filename);
static void SaveState(ostream &saveStream);
static bool LoadState(wstring filename);
static void LoadState(istream &loadStream);
static void LoadState(uint8_t *buffer, uint32_t bufferSize);
static void LoadROM(wstring filename);
static bool AttemptLoadROM(wstring filename, uint32_t crc32Hash);
static wstring GetROMPath();
static bool CheckFlag(int flag);
@ -77,12 +71,5 @@ class Console
static void ClearFlags(int flags);
static uint32_t GetFPS();
static void RegisterMessageManager(IMessageManager* messageManager);
static void DisplayMessage(wstring message);
static void RegisterNotificationListener(INotificationListener* notificationListener);
static void UnregisterNotificationListener(INotificationListener* notificationListener);
static void SendNotification(ConsoleNotificationType type);
static Console* GetInstance();
static shared_ptr<Console> GetInstance();
};

View file

@ -58,6 +58,7 @@
<InlineFunctionExpansion />
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<CallingConvention>Cdecl</CallingConvention>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
@ -93,6 +94,7 @@
<ClInclude Include="AXROM.h" />
<ClInclude Include="BaseMapper.h" />
<ClInclude Include="Breakpoint.h" />
<ClInclude Include="ClientConnectionData.h" />
<ClInclude Include="CNROM.h" />
<ClInclude Include="ColorDreams.h" />
<ClInclude Include="ControlManager.h" />
@ -114,6 +116,7 @@
<ClInclude Include="IMessageManager.h" />
<ClInclude Include="INotificationListener.h" />
<ClInclude Include="InputDataMessage.h" />
<ClInclude Include="MessageManager.h" />
<ClInclude Include="MessageType.h" />
<ClInclude Include="MMC2.h" />
<ClInclude Include="MMC3_189.h" />
@ -121,6 +124,7 @@
<ClInclude Include="MovieDataMessage.h" />
<ClInclude Include="Nanjing.h" />
<ClInclude Include="NetMessage.h" />
<ClInclude Include="SaveStateManager.h" />
<ClInclude Include="SaveStateMessage.h" />
<ClInclude Include="Snapshotable.h" />
<ClInclude Include="IVideoDevice.h" />
@ -163,9 +167,11 @@
<ClCompile Include="GameServerConnection.cpp" />
<ClCompile Include="MapperFactory.cpp" />
<ClCompile Include="MemoryManager.cpp" />
<ClCompile Include="MessageManager.cpp" />
<ClCompile Include="Movie.cpp" />
<ClCompile Include="PPU.cpp" />
<ClCompile Include="CPU.cpp" />
<ClCompile Include="SaveStateManager.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>

View file

@ -206,6 +206,15 @@
<ClInclude Include="Breakpoint.h">
<Filter>Debugger</Filter>
</ClInclude>
<ClInclude Include="ClientConnectionData.h">
<Filter>Header Files\NetPlay</Filter>
</ClInclude>
<ClInclude Include="SaveStateManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="MessageManager.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="CPU.cpp">
@ -265,5 +274,11 @@
<ClCompile Include="Breakpoint.cpp">
<Filter>Debugger</Filter>
</ClCompile>
<ClCompile Include="SaveStateManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="MessageManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View file

@ -1,20 +1,25 @@
#pragma once
#include "stdafx.h"
#include <thread>
#include "MessageManager.h"
#include "Debugger.h"
#include "Console.h"
#include "BaseMapper.h"
#include "Disassembler.h"
#include "APU.h"
Debugger* Debugger::Instance = nullptr;
Debugger::Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper)
Debugger::Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<PPU> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper)
{
_console = console;
_cpu = cpu;
_ppu = ppu;
_memoryManager = memoryManager;
_mapper = mapper;
_disassembler.reset(new Disassembler(mapper->GetPRGCopy(), mapper->GetPRGSize()));
_disassembler.reset(new Disassembler(memoryManager->GetInternalRAM(), mapper->GetPRGCopy(), mapper->GetPRGSize()));
_stepCount = -1;
@ -23,9 +28,12 @@ Debugger::Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<
Debugger::~Debugger()
{
if(Debugger::Instance == this) {
Console::Pause();
Debugger::Instance = nullptr;
}
Run();
_breakLock.Acquire();
_breakLock.Release();
Console::Resume();
}
void Debugger::AddBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr)
@ -123,9 +131,20 @@ shared_ptr<Breakpoint> Debugger::GetMatchingBreakpoint(BreakpointType type, uint
void Debugger::PrivateCheckBreakpoint(BreakpointType type, uint32_t addr)
{
_breakLock.Acquire();
//Check if a breakpoint has been hit and freeze execution if one has
bool breakDone = false;
if(type == BreakpointType::Execute) {
_lastInstruction = _memoryManager->DebugRead(addr);
if(_stepOut && _lastInstruction == 0x60) {
//RTS found, set StepCount to 2 to break on the following instruction
Step(2);
} else if(_stepOverAddr != -1 && addr == _stepOverAddr) {
Step(1);
} else if(_stepCycleCount != -1 && abs(_cpu->GetRelativeCycleCount() - _stepCycleCount) < 100 && _cpu->GetRelativeCycleCount() >= _stepCycleCount) {
Step(1);
}
_disassembler->BuildCache(_mapper->ToAbsoluteAddress(addr), addr);
breakDone = SleepUntilResume();
}
@ -135,6 +154,8 @@ void Debugger::PrivateCheckBreakpoint(BreakpointType type, uint32_t addr)
Step(1);
SleepUntilResume();
}
_breakLock.Release();
}
bool Debugger::SleepUntilResume()
@ -147,7 +168,9 @@ bool Debugger::SleepUntilResume()
if(stepCount == 0) {
//Break
_console->SendNotification(ConsoleNotificationType::CodeBreak);
APU::StopAudio();
MessageManager::SendNotification(ConsoleNotificationType::CodeBreak);
_stepOverAddr = -1;
while(stepCount == 0) {
std::this_thread::sleep_for(std::chrono::duration<int, std::milli>(10));
stepCount = _stepCount.load();
@ -157,15 +180,46 @@ bool Debugger::SleepUntilResume()
return false;
}
State Debugger::GetCPUState()
void Debugger::GetState(DebugState *state)
{
return _cpu->GetState();
state->CPU = _cpu->GetState();
state->PPU = _ppu->GetState();
}
void Debugger::Step(uint32_t count)
{
//Run CPU for [count] cycles and before breaking again
//Run CPU for [count] INSTRUCTIONS and before breaking again
_stepOut = false;
_stepCount = count;
_stepOverAddr = -1;
_stepCycleCount = -1;
}
void Debugger::StepCycles(uint32_t count)
{
//Run CPU for [count] CYCLES and before breaking again
_stepCycleCount = _cpu->GetRelativeCycleCount() + count;
Run();
}
void Debugger::StepOut()
{
_stepOut = true;
_stepCount = -1;
_stepOverAddr = -1;
_stepCycleCount = -1;
}
void Debugger::StepOver()
{
if(_lastInstruction == 0x20 || _lastInstruction == 0x00) {
//We are on a JSR/BRK instruction, need to continue until the following instruction
_stepOverAddr = _cpu->GetState().PC + (_lastInstruction == 0x20 ? 3 : 1);
Run();
} else {
//Except for JSR & BRK, StepOver behaves the same as StepTnto
Step(1);
}
}
void Debugger::Run()
@ -187,9 +241,12 @@ bool Debugger::IsCodeChanged()
string Debugger::GenerateOutput()
{
std::ostringstream output;
vector<uint32_t> memoryRanges = _mapper->GetPRGRanges();
std::ostringstream output;
//RAM code viewer doesn't work well yet
//output << _disassembler->GetRAMCode();
uint16_t memoryAddr = 0x8000;
for(int i = 0, size = memoryRanges.size(); i < size; i += 2) {
output << _disassembler->GetCode(memoryRanges[i], memoryRanges[i+1], memoryAddr);
@ -198,9 +255,9 @@ string Debugger::GenerateOutput()
return output.str();
}
string Debugger::GetCode()
string* Debugger::GetCode()
{
return _outputCache;
return &_outputCache;
}
uint8_t Debugger::GetMemoryValue(uint32_t addr)

77
Core/Debugger.h Normal file
View file

@ -0,0 +1,77 @@
#pragma once
#include "stdafx.h"
#include <atomic>
using std::atomic;
#include "CPU.h"
#include "PPU.h"
#include "Breakpoint.h"
#include "../Utilities/SimpleLock.h"
class MemoryManager;
class Console;
class Disassembler;
struct DebugState
{
State CPU;
PPUDebugState PPU;
};
class Debugger
{
private:
static Debugger* Instance;
unique_ptr<Disassembler> _disassembler;
shared_ptr<Console> _console;
shared_ptr<CPU> _cpu;
shared_ptr<PPU> _ppu;
shared_ptr<MemoryManager> _memoryManager;
shared_ptr<BaseMapper> _mapper;
vector<shared_ptr<Breakpoint>> _readBreakpoints;
vector<shared_ptr<Breakpoint>> _writeBreakpoints;
vector<shared_ptr<Breakpoint>> _execBreakpoints;
SimpleLock _bpLock;
SimpleLock _breakLock;
string _outputCache;
atomic<uint32_t> _stepCount;
atomic<int32_t> _stepCycleCount;
atomic<uint8_t> _lastInstruction;
atomic<bool> _stepOut;
atomic<int32_t> _stepOverAddr;
private:
void PrivateCheckBreakpoint(BreakpointType type, uint32_t addr);
bool SleepUntilResume();
public:
Debugger(shared_ptr<Console> console, shared_ptr<CPU> cpu, shared_ptr<PPU> ppu, shared_ptr<MemoryManager> memoryManager, shared_ptr<BaseMapper> mapper);
~Debugger();
void AddBreakpoint(BreakpointType type, uint32_t address, bool isAbsoluteAddr);
void RemoveBreakpoint(shared_ptr<Breakpoint> breakpoint);
shared_ptr<Breakpoint> GetMatchingBreakpoint(BreakpointType type, uint32_t addr);
vector<shared_ptr<Breakpoint>> GetBreakpoints();
vector<uint32_t> GetExecBreakpointAddresses();
void GetState(DebugState *state);
void Step(uint32_t count = 1);
void StepCycles(uint32_t cycleCount = 1);
void StepOver();
void StepOut();
void Run();
bool IsCodeChanged();
string GenerateOutput();
string* GetCode();
uint8_t GetMemoryValue(uint32_t addr);
uint32_t GetRelativeAddress(uint32_t addr);
static void CheckBreakpoint(BreakpointType type, uint32_t addr);
};

View file

@ -3,13 +3,18 @@
#include "DisassemblyInfo.h"
#include "CPU.h"
Disassembler::Disassembler(uint8_t* prgROM, uint32_t prgSize)
Disassembler::Disassembler(uint8_t* internalRAM, uint8_t* prgROM, uint32_t prgSize)
{
_internalRAM = internalRAM;
_prgROM = prgROM;
_prgSize = prgSize;
for(uint32_t i = 0; i < prgSize; i++) {
_disassembleCache.push_back(shared_ptr<DisassemblyInfo>(nullptr));
}
for(uint32_t i = 0; i < 0x2000; i++) {
_disassembleMemoryCache.push_back(shared_ptr<DisassemblyInfo>(nullptr));
}
string opName[256] = {
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
@ -81,8 +86,22 @@ Disassembler::Disassembler(uint8_t* prgROM, uint32_t prgSize)
}
}
Disassembler::~Disassembler()
{
if(_prgROM) {
delete[] _prgROM;
}
}
void Disassembler::BuildCache(uint32_t absoluteAddr, uint16_t memoryAddr)
{
if(memoryAddr < 0x2000) {
memoryAddr = memoryAddr & 0x7FF;
if(!_disassembleMemoryCache[memoryAddr]) {
shared_ptr<DisassemblyInfo> disInfo(new DisassemblyInfo(&_internalRAM[memoryAddr]));
_disassembleMemoryCache[memoryAddr] = disInfo;
}
} else {
while(!_disassembleCache[absoluteAddr]) {
shared_ptr<DisassemblyInfo> disInfo(new DisassemblyInfo(&_prgROM[absoluteAddr]));
_disassembleCache[absoluteAddr] = disInfo;
@ -97,6 +116,42 @@ void Disassembler::BuildCache(uint32_t absoluteAddr, uint16_t memoryAddr)
absoluteAddr += disInfo->GetSize();
memoryAddr += disInfo->GetSize();
}
}
}
string Disassembler::GetRAMCode()
{
std::ostringstream output;
uint32_t addr = 0x0000;
uint32_t byteCount = 0;
while(addr < 0x2000) {
shared_ptr<DisassemblyInfo> info;
if(info = _disassembleMemoryCache[addr&0x7FF]) {
if(byteCount > 0) {
output << "\n";
byteCount = 0;
}
output << std::hex << std::uppercase << addr << ":" << info->ToString(addr) << "\n";
addr += info->GetSize();
} else {
if(byteCount >= 8) {
output << "\n";
byteCount = 0;
}
if(byteCount == 0) {
output << std::hex << std::uppercase << addr << ":" << ".db";
}
output << std::hex << " $" << std::setfill('0') << std::setw(2) << (short)_internalRAM[addr];
byteCount++;
addr++;
}
}
output << "\n1FFF:--END OF INTERNAL RAM--\n";
return output.str();
}
string Disassembler::GetCode(uint32_t startAddr, uint32_t endAddr, uint16_t &memoryAddr)
@ -109,19 +164,19 @@ string Disassembler::GetCode(uint32_t startAddr, uint32_t endAddr, uint16_t &mem
shared_ptr<DisassemblyInfo> info;
if(info = _disassembleCache[addr]) {
if(byteCount > 0) {
output << "\\par\n";
output << "\n";
byteCount = 0;
}
output << "{\\highlight1\n " << std::hex << std::uppercase << memoryAddr << ":} " << info->ToString(memoryAddr) << "\\par\n";
output << std::hex << std::uppercase << memoryAddr << ":" << info->ToString(memoryAddr) << "\n";
addr += info->GetSize();
memoryAddr += info->GetSize();
} else {
if(byteCount >= 8) {
output << "\\par\n";
output << "\n";
byteCount = 0;
}
if(byteCount == 0) {
output << "{\\highlight1\n " << std::hex << std::uppercase << memoryAddr << ":} " << ".db";
output << std::hex << std::uppercase << memoryAddr << ":" << ".db";
}
output << std::hex << " $" << std::setfill('0') << std::setw(2) << (short)_prgROM[addr];
@ -131,9 +186,7 @@ string Disassembler::GetCode(uint32_t startAddr, uint32_t endAddr, uint16_t &mem
}
}
if(byteCount > 0) {
output << "\\par\n";
}
output << "\n";
return output.str();
}

View file

@ -7,12 +7,16 @@ class Disassembler
{
private:
vector<shared_ptr<DisassemblyInfo>> _disassembleCache;
vector<shared_ptr<DisassemblyInfo>> _disassembleMemoryCache;
uint8_t* _internalRAM;
uint8_t* _prgROM;
uint32_t _prgSize;
public:
Disassembler(uint8_t* prgROM, uint32_t prgSize);
Disassembler(uint8_t* internalRAM, uint8_t* prgROM, uint32_t prgSize);
~Disassembler();
void BuildCache(uint32_t absoluteAddr, uint16_t memoryAddr);
string GetRAMCode();
string GetCode(uint32_t startAddr, uint32_t endAddr, uint16_t &memoryAddr);
};

View file

@ -22,7 +22,7 @@ void DisassemblyInfo::Initialize(uint32_t memoryAddr)
}
if(DisassemblyInfo::OPName[opCode].empty()) {
std::cout << "error";
output << "invalid opcode";
}
std::ostringstream nextByte;

View file

@ -1,20 +1,26 @@
#pragma once
#include "stdafx.h"
#include <thread>
using std::thread;
#include "MessageManager.h"
#include "GameClient.h"
#include "Console.h"
#include "../Utilities/Socket.h"
#include "ClientConnectionData.h"
unique_ptr<GameClient> GameClient::Instance;
GameClient::GameClient()
{
Console::RegisterNotificationListener(this);
MessageManager::RegisterNotificationListener(this);
}
GameClient::~GameClient()
{
_stop = true;
_clientThread->join();
Console::UnregisterNotificationListener(this);
MessageManager::UnregisterNotificationListener(this);
}
bool GameClient::Connected()
@ -26,10 +32,10 @@ bool GameClient::Connected()
}
}
void GameClient::Connect(const char *host, u_short port)
void GameClient::Connect(shared_ptr<ClientConnectionData> connectionData)
{
Instance.reset(new GameClient());
Instance->PrivateConnect(host, port);
Instance->PrivateConnect(connectionData);
Instance->_clientThread.reset(new thread(&GameClient::Exec, Instance.get()));
}
@ -38,15 +44,15 @@ void GameClient::Disconnect()
Instance.reset();
}
void GameClient::PrivateConnect(const char *host, u_short port)
void GameClient::PrivateConnect(shared_ptr<ClientConnectionData> connectionData)
{
_stop = false;
_socket.reset(new Socket());
if(_socket->Connect(host, port)) {
_connection.reset(new GameClientConnection(_socket));
if(_socket->Connect(connectionData->Host.c_str(), connectionData->Port)) {
_connection.reset(new GameClientConnection(_socket, connectionData));
_connected = true;
} else {
Console::DisplayMessage(L"Could not connect to server.");
MessageManager::DisplayMessage(L"Net Play", L"Could not connect to server.");
_connected = false;
_socket.reset();
}

View file

@ -1,8 +1,12 @@
#pragma once
#include "stdafx.h"
#include "GameClientConnection.h"
#include "INotificationListener.h"
class ClientConnectionData;
class thread;
class GameClient : public INotificationListener
{
private:
@ -14,7 +18,7 @@ private:
unique_ptr<GameClientConnection> _connection;
bool _connected = false;
void PrivateConnect(const char *host, u_short port);
void PrivateConnect(shared_ptr<ClientConnectionData> connectionData);
void Exec();
void PrivateDisconnect();
@ -23,7 +27,7 @@ public:
~GameClient();
static bool Connected();
static void Connect(const char *host, u_short port);
static void Connect(shared_ptr<ClientConnectionData> connectionData);
static void Disconnect();
void ProcessNotification(ConsoleNotificationType type);

View file

@ -8,13 +8,15 @@
#include "SaveStateMessage.h"
#include "Console.h"
#include "ControlManager.h"
#include "VirtualController.h"
#include "ClientConnectionData.h"
GameClientConnection::GameClientConnection(shared_ptr<Socket> socket) : GameConnection(socket)
GameClientConnection::GameClientConnection(shared_ptr<Socket> socket, shared_ptr<ClientConnectionData> connectionData) : GameConnection(socket, connectionData)
{
_controlDevice = ControlManager::GetControlDevice(0);
ControlManager::BackupControlDevices();
Console::DisplayMessage(L"Connected to server.");
MessageManager::DisplayMessage(L"Net Play", L"Connected to server.");
SendHandshake();
}
@ -23,12 +25,12 @@ GameClientConnection::~GameClientConnection()
{
_virtualControllers.clear();
ControlManager::RestoreControlDevices();
Console::DisplayMessage(L"Connection to server lost.");
MessageManager::DisplayMessage(L"Net Play", L"Connection to server lost.");
}
void GameClientConnection::SendHandshake()
{
SendNetMessage(HandShakeMessage());
SendNetMessage(HandShakeMessage(_connectionData->PlayerName, _connectionData->AvatarData, _connectionData->AvatarSize));
}
void GameClientConnection::InitializeVirtualControllers()
@ -49,7 +51,7 @@ void GameClientConnection::ProcessMessage(NetMessage* message)
uint8_t state;
GameInformationMessage* gameInfo;
switch(message->Type) {
switch(message->GetType()) {
case MessageType::SaveState:
if(_gameLoaded) {
DisposeVirtualControllers();
@ -65,23 +67,23 @@ void GameClientConnection::ProcessMessage(NetMessage* message)
break;
case MessageType::MovieData:
if(_gameLoaded) {
port = ((MovieDataMessage*)message)->PortNumber;
state = ((MovieDataMessage*)message)->InputState;
port = ((MovieDataMessage*)message)->GetPortNumber();
state = ((MovieDataMessage*)message)->GetInputState();
_virtualControllers[port]->PushState(state);
}
break;
case MessageType::GameInformation:
gameInfo = (GameInformationMessage*)message;
if(gameInfo->ControllerPort != _controllerPort) {
_controllerPort = gameInfo->ControllerPort;
Console::DisplayMessage(wstring(L"Connected as player ") + std::to_wstring(_controllerPort + 1));
if(gameInfo->GetPort() != _controllerPort) {
_controllerPort = gameInfo->GetPort();
MessageManager::DisplayMessage(wstring(L"Connected as player ") + std::to_wstring(_controllerPort + 1));
}
DisposeVirtualControllers();
_gameLoaded = gameInfo->AttemptLoadGame();
if(gameInfo->Paused) {
if(gameInfo->IsPaused()) {
Console::SetFlags(EmulationFlags::Paused);
} else {
Console::ClearFlags(EmulationFlags::Paused);

View file

@ -1,7 +1,10 @@
#pragma once
#include "stdafx.h"
#include "GameConnection.h"
#include "VirtualController.h"
#include "IControlDevice.h"
class ClientConnectionData;
class VirtualController;
class GameClientConnection : public GameConnection
{
@ -21,7 +24,7 @@ protected:
void ProcessMessage(NetMessage* message);
public:
GameClientConnection(shared_ptr<Socket> socket);
GameClientConnection(shared_ptr<Socket> socket, shared_ptr<ClientConnectionData> connectionData);
~GameClientConnection();
void SendInput();

View file

@ -6,9 +6,11 @@
#include "MovieDataMessage.h"
#include "GameInformationMessage.h"
#include "SaveStateMessage.h"
#include "ClientConnectionData.h"
GameConnection::GameConnection(shared_ptr<Socket> socket)
GameConnection::GameConnection(shared_ptr<Socket> socket, shared_ptr<ClientConnectionData> connectionData)
{
_connectionData = connectionData;
_socket = socket;
}
@ -48,11 +50,11 @@ NetMessage* GameConnection::ReadMessage()
uint32_t messageLength;
if(ExtractMessage(_messageBuffer, messageLength)) {
switch((MessageType)_messageBuffer[0]) {
case MessageType::HandShake: return new HandShakeMessage(_messageBuffer + 1);
case MessageType::SaveState: return new SaveStateMessage(_messageBuffer + 1, messageLength - 1);
case MessageType::InputData: return new InputDataMessage(_messageBuffer + 1);
case MessageType::MovieData: return new MovieDataMessage(_messageBuffer + 1);
case MessageType::GameInformation: return new GameInformationMessage(_messageBuffer + 1);
case MessageType::HandShake: return new HandShakeMessage(_messageBuffer, messageLength);
case MessageType::SaveState: return new SaveStateMessage(_messageBuffer, messageLength);
case MessageType::InputData: return new InputDataMessage(_messageBuffer, messageLength);
case MessageType::MovieData: return new MovieDataMessage(_messageBuffer, messageLength);
case MessageType::GameInformation: return new GameInformationMessage(_messageBuffer, messageLength);
}
}
return nullptr;
@ -75,6 +77,7 @@ void GameConnection::ProcessMessages()
NetMessage* message;
while(message = ReadMessage()) {
//Loop until all messages have been processed
message->Initialize();
ProcessMessage(message);
delete message;
}

View file

@ -1,13 +1,16 @@
#pragma once
#include "stdafx.h"
#include "NetMessage.h"
#include "../Utilities/Socket.h"
#include "../Utilities/SimpleLock.h"
class Socket;
class NetMessage;
class ClientConnectionData;
class GameConnection
{
protected:
shared_ptr<Socket> _socket;
shared_ptr<ClientConnectionData> _connectionData;
char _readBuffer[0x40000];
char _messageBuffer[0x40000];
int _readPosition = 0;
@ -25,7 +28,7 @@ protected:
void SendNetMessage(NetMessage &message);
public:
GameConnection(shared_ptr<Socket> socket);
GameConnection(shared_ptr<Socket> socket, shared_ptr<ClientConnectionData> connectionData);
bool ConnectionError();

View file

@ -1,5 +1,6 @@
#pragma once
#include "stdafx.h"
#include "MessageManager.h"
#include "NetMessage.h"
#include "Console.h"
#include "ROMLoader.h"
@ -7,54 +8,90 @@
class GameInformationMessage : public NetMessage
{
protected:
virtual uint32_t GetMessageLength()
{
return sizeof(ROMFilename) + sizeof(CRC32Hash) + sizeof(ControllerPort) + sizeof(Paused);
}
private:
wchar_t *_romFilename = nullptr;
uint32_t _romFilenameLength = 0;
uint32_t _crc32Hash = 0;
uint8_t _controllerPort = 0;
bool _paused = false;
virtual void ProtectedSend(Socket &socket)
protected:
virtual void ProtectedStreamState()
{
socket.BufferedSend((char*)&ROMFilename, sizeof(ROMFilename));
socket.BufferedSend((char*)&CRC32Hash, sizeof(CRC32Hash));
socket.BufferedSend((char*)&ControllerPort, sizeof(ControllerPort));
socket.BufferedSend((char*)&Paused, sizeof(Paused));
StreamArray((void**)&_romFilename, _romFilenameLength);
Stream<uint32_t>(_crc32Hash);
Stream<uint8_t>(_controllerPort);
Stream<bool>(_paused);
}
public:
wchar_t ROMFilename[255];
uint32_t CRC32Hash;
uint8_t ControllerPort;
bool Paused;
GameInformationMessage(char *readBuffer) : NetMessage(MessageType::GameInformation)
{
memcpy((char*)ROMFilename, readBuffer, sizeof(ROMFilename));
memcpy((char*)&CRC32Hash, readBuffer + sizeof(ROMFilename), sizeof(CRC32Hash));
ControllerPort = readBuffer[sizeof(ROMFilename) + sizeof(CRC32Hash)];
Paused = readBuffer[sizeof(ROMFilename) + sizeof(CRC32Hash) + sizeof(ControllerPort)] == 1;
}
GameInformationMessage(void* buffer, uint32_t length) : NetMessage(buffer, length) { }
GameInformationMessage(wstring filepath, uint8_t port, bool paused) : NetMessage(MessageType::GameInformation)
{
memset(ROMFilename, 0, sizeof(ROMFilename));
wcscpy_s(ROMFilename, FolderUtilities::GetFilename(filepath, true).c_str());
CRC32Hash = ROMLoader::GetCRC32(filepath);
ControllerPort = port;
Paused = paused;
CopyString(&_romFilename, _romFilenameLength, FolderUtilities::GetFilename(filepath, true));
_crc32Hash = ROMLoader::GetCRC32(filepath);
_controllerPort = port;
_paused = paused;
}
bool AttemptLoadGame()
{
wstring filename = ROMFilename;
wstring filename = _romFilename;
if(filename.size() > 0) {
if(Console::AttemptLoadROM(filename, CRC32Hash)) {
if(AttemptLoadROM(filename, _crc32Hash)) {
return true;
} else {
Console::DisplayMessage(L"Could not find matching game ROM.");
MessageManager::DisplayMessage(L"Net Play", L"Could not find matching game ROM.");
return false;
}
}
return false;
}
uint8_t GetPort()
{
return _controllerPort;
}
bool IsPaused()
{
return _paused;
}
bool AttemptLoadROM(wstring filename, uint32_t crc32Hash)
{
if(!Console::GetROMPath().empty()) {
if(ROMLoader::GetCRC32(Console::GetROMPath()) == crc32Hash) {
//Current game matches, no need to do anything
return true;
}
}
vector<wstring> romFiles = FolderUtilities::GetFilesInFolder(L"D:\\Users\\Saitoh Hajime\\Desktop\\CPPApp\\NES\\Games", L"*.nes", true);
for(wstring zipFile : FolderUtilities::GetFilesInFolder(L"D:\\Users\\Saitoh Hajime\\Desktop\\CPPApp\\NES\\Games", L"*.zip", true)) {
romFiles.push_back(zipFile);
}
for(wstring romFile : romFiles) {
//Quick search by filename
if(FolderUtilities::GetFilename(romFile, true).compare(filename) == 0) {
if(ROMLoader::GetCRC32(romFile) == crc32Hash) {
//Matching ROM found
Console::LoadROM(romFile);
return true;
}
}
}
for(wstring romFile : romFiles) {
//Slower search by CRC value
if(ROMLoader::GetCRC32(romFile) == crc32Hash) {
//Matching ROM found
Console::LoadROM(romFile);
return true;
}
}
return false;
}
};

View file

@ -1,10 +1,30 @@
#pragma once
#include "stdafx.h"
#include <thread>
using std::thread;
#include "MessageManager.h"
#include "GameServer.h"
#include "Console.h"
#include "../Utilities/Socket.h"
unique_ptr<GameServer> GameServer::Instance;
GameServer::GameServer()
{
ControlManager::RegisterBroadcaster(this);
}
GameServer::~GameServer()
{
_stop = true;
_serverThread->join();
Stop();
ControlManager::UnregisterBroadcaster(this);
}
void GameServer::AcceptConnections()
{
while(true) {
@ -35,18 +55,15 @@ void GameServer::UpdateConnections()
}
}
void GameServer::Start()
void GameServer::Exec()
{
Console::DisplayMessage(L"Server started.");
_listener.reset(new Socket());
_listener->Bind(8888);
_listener->Bind(_port);
_listener->Listen(10);
_stop = false;
_initialized = true;
}
MessageManager::DisplayMessage(L"Net Play" , L"Server started (Port: " + std::to_wstring(_port) + L")");
void GameServer::Exec()
{
while(!_stop) {
AcceptConnections();
UpdateConnections();
@ -59,28 +76,13 @@ void GameServer::Stop()
{
_initialized = false;
_listener.reset();
Console::DisplayMessage(L"Server stopped.");
MessageManager::DisplayMessage(L"Net Play", L"Server stopped");
}
GameServer::GameServer()
{
ControlManager::RegisterBroadcaster(this);
Console::RegisterNotificationListener(this);
}
GameServer::~GameServer()
{
_stop = true;
_serverThread->join();
ControlManager::UnregisterBroadcaster(this);
Console::UnregisterNotificationListener(this);
}
void GameServer::StartServer()
void GameServer::StartServer(uint16_t port)
{
Instance.reset(new GameServer());
Instance->Start();
Instance->_port = port;
Instance->_serverThread.reset(new thread(&GameServer::Exec, Instance.get()));
}
@ -109,21 +111,3 @@ void GameServer::BroadcastInput(uint8_t inputData, uint8_t port)
}
}
}
void GameServer::ProcessNotification(ConsoleNotificationType type)
{
if(type == ConsoleNotificationType::StateLoaded) {
for(shared_ptr<GameServerConnection> connection : _openConnections) {
if(!connection->ConnectionError()) {
connection->SendGameState();
}
}
} else if(type == ConsoleNotificationType::GameLoaded) {
for(shared_ptr<GameServerConnection> connection : _openConnections) {
if(!connection->ConnectionError()) {
connection->SendGameInformation();
connection->SendGameState();
}
}
}
}

View file

@ -1,9 +1,12 @@
#pragma once
#include "stdafx.h"
#include <thread>
#include "GameServerConnection.h"
#include "INotificationListener.h"
class GameServer : public IGameBroadcaster, public INotificationListener
using std::thread;
class GameServer : public IGameBroadcaster
{
private:
static unique_ptr<GameServer> Instance;
@ -11,13 +14,13 @@ private:
atomic<bool> _stop;
unique_ptr<Socket> _listener;
uint16_t _port;
list<shared_ptr<GameServerConnection>> _openConnections;
bool _initialized = false;
void AcceptConnections();
void UpdateConnections();
void Start();
void Exec();
void Stop();
@ -25,10 +28,9 @@ public:
GameServer();
~GameServer();
static void StartServer();
static void StartServer(uint16_t port);
static void StopServer();
static bool Started();
virtual void BroadcastInput(uint8_t inputData, uint8_t port);
virtual void ProcessNotification(ConsoleNotificationType type);
};

View file

@ -1,5 +1,6 @@
#pragma once
#include "stdafx.h"
#include "MessageManager.h"
#include "GameServerConnection.h"
#include "HandShakeMessage.h"
#include "InputDataMessage.h"
@ -8,47 +9,30 @@
#include "SaveStateMessage.h"
#include "Console.h"
#include "ControlManager.h"
#include "ClientConnectionData.h"
void GameServerConnection::ProcessMessage(NetMessage* message)
{
switch(message->Type) {
case MessageType::HandShake:
//Send the game's current state to the client and register the controller
if(((HandShakeMessage*)message)->IsValid()) {
SendGameInformation();
SendGameState();
}
break;
case MessageType::InputData:
uint8_t state = ((InputDataMessage*)message)->InputState;
if(_inputData.size() == 0 || state != _inputData.back()) {
_inputData.push_back(state);
}
break;
}
}
GameServerConnection::GameServerConnection(shared_ptr<Socket> socket, int controllerPort, IGameBroadcaster* gameBroadcaster) : GameConnection(socket)
GameServerConnection::GameServerConnection(shared_ptr<Socket> socket, int controllerPort, IGameBroadcaster* gameBroadcaster) : GameConnection(socket, nullptr)
{
//Server-side connection
_gameBroadcaster = gameBroadcaster;
_controllerPort = controllerPort;
Console::DisplayMessage(L"Player " + std::to_wstring(_controllerPort+1) + L" connected.");
ControlManager::BackupControlDevices();
Console::RegisterNotificationListener(this);
MessageManager::RegisterNotificationListener(this);
}
GameServerConnection::~GameServerConnection()
{
Console::DisplayMessage(L"Player " + std::to_wstring(_controllerPort+1) + L" disconnected.");
if(_connectionData) {
MessageManager::DisplayToast(L"Net Play", _connectionData->PlayerName + L" (Player " + std::to_wstring(_controllerPort + 1) + L") disconnected.", _connectionData->AvatarData, _connectionData->AvatarSize);
} else {
MessageManager::DisplayMessage(L"Net Play", L"Player " + std::to_wstring(_controllerPort + 1) + L" disconnected.");
}
ControlManager::RestoreControlDevices();
Console::UnregisterNotificationListener(this);
MessageManager::UnregisterNotificationListener(this);
}
void GameServerConnection::SendGameState()
@ -64,7 +48,7 @@ void GameServerConnection::SendGameState()
char* buffer = new char[size];
state.read(buffer, size);
SendNetMessage(SaveStateMessage(buffer, size));
SendNetMessage(SaveStateMessage(buffer, size, true));
delete[] buffer;
}
@ -96,13 +80,37 @@ ButtonState GameServerConnection::GetButtonState()
return state;
}
void GameServerConnection::ProcessMessage(NetMessage* message)
{
switch(message->GetType()) {
case MessageType::HandShake:
//Send the game's current state to the client and register the controller
if(((HandShakeMessage*)message)->IsValid()) {
_connectionData.reset(new ClientConnectionData("", 0, ((HandShakeMessage*)message)->GetPlayerName(), ((HandShakeMessage*)message)->GetAvatarData(), ((HandShakeMessage*)message)->GetAvatarSize()));
MessageManager::DisplayToast(L"Net Play", _connectionData->PlayerName + L" (Player " + std::to_wstring(_controllerPort + 1) + L") connected.", _connectionData->AvatarData, _connectionData->AvatarSize);
SendGameInformation();
SendGameState();
}
break;
case MessageType::InputData:
uint8_t state = ((InputDataMessage*)message)->GetInputState();
if(_inputData.size() == 0 || state != _inputData.back()) {
_inputData.push_back(state);
}
break;
}
}
void GameServerConnection::ProcessNotification(ConsoleNotificationType type)
{
switch(type) {
case ConsoleNotificationType::GamePaused:
SendGameInformation();
break;
case ConsoleNotificationType::GameLoaded:
case ConsoleNotificationType::GameResumed:
case ConsoleNotificationType::GameReset:
SendGameInformation();
SendGameState();
break;

View file

@ -5,34 +5,48 @@
class HandShakeMessage : public NetMessage
{
private:
const int CurrentVersion = 1;
const static int CurrentVersion = 1;
uint32_t _protocolVersion = CurrentVersion;
wchar_t *_playerName = nullptr;
uint32_t _playerNameLength = 0;
void* _avatarData = nullptr;
uint32_t _avatarSize = 0;
protected:
virtual uint32_t GetMessageLength()
virtual void ProtectedStreamState()
{
return sizeof(ProtocolVersion);
}
virtual void ProtectedSend(Socket &socket)
{
socket.BufferedSend((char*)&ProtocolVersion, sizeof(ProtocolVersion));
Stream<uint32_t>(_protocolVersion);
StreamArray((void**)&_playerName, _playerNameLength);
StreamArray(&_avatarData, _avatarSize);
}
public:
uint32_t ProtocolVersion;
HandShakeMessage(char *readBuffer) : NetMessage(MessageType::HandShake)
HandShakeMessage(void* buffer, uint32_t length) : NetMessage(buffer, length) { }
HandShakeMessage(wstring playerName, uint8_t* avatarData, uint32_t avatarSize) : NetMessage(MessageType::HandShake)
{
ProtocolVersion = *(uint32_t*)readBuffer;
_protocolVersion = 1;
CopyString(&_playerName, _playerNameLength, playerName);
_avatarSize = avatarSize;
_avatarData = avatarData;
}
HandShakeMessage() : NetMessage(MessageType::HandShake)
wstring GetPlayerName()
{
ProtocolVersion = 1;
return wstring(_playerName);
}
uint8_t* GetAvatarData()
{
return (uint8_t*)_avatarData;
}
uint32_t GetAvatarSize()
{
return _avatarSize;
}
bool IsValid()
{
return ProtocolVersion == CurrentVersion;
return _protocolVersion == CurrentVersion;
}
};

View file

@ -6,4 +6,5 @@ class IAudioDevice
{
public:
virtual void PlayBuffer(int16_t *soundBuffer, uint32_t bufferSize) = 0;
virtual void Pause() = 0;
};

View file

@ -1,9 +1,118 @@
#pragma once
#include "stdafx.h"
#include <chrono>
class ToastInfo;
class IMessageManager
{
public:
virtual void DisplayMessage(wstring message) = 0;
virtual void DisplayMessage(wstring title, wstring message) = 0;
virtual void DisplayToast(shared_ptr<ToastInfo> toast) = 0;
};
class ToastInfo
{
private:
wstring _title;
wstring _message;
uint8_t* _icon;
uint32_t _iconSize;
uint64_t _endTime;
uint64_t _startTime;
uint8_t* ReadFile(wstring filename, uint32_t &fileSize)
{
ifstream file(filename, ios::in | ios::binary);
if(file) {
file.seekg(0, ios::end);
fileSize = (uint32_t)file.tellg();
file.seekg(0, ios::beg);
uint8_t* buffer = new uint8_t[fileSize];
file.read((char*)buffer, fileSize);
return buffer;
}
return nullptr;
}
uint64_t GetCurrentTime()
{
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count();
}
public:
ToastInfo(wstring title, wstring message, int displayDuration, wstring iconFile)
{
_title = title;
_message = message;
_icon = ReadFile(iconFile, _iconSize);
_startTime = GetCurrentTime();
_endTime = _startTime + displayDuration;
}
ToastInfo(wstring title, wstring message, int displayDuration, uint8_t* iconData, uint32_t iconSize)
{
_title = title;
_message = message;
_iconSize = iconSize;
_icon = new uint8_t[iconSize];
memcpy(_icon, iconData, iconSize);
_startTime = GetCurrentTime();
_endTime = _startTime + displayDuration;
}
~ToastInfo()
{
if(_icon) {
delete _icon;
}
}
wstring GetToastTitle()
{
return _title;
}
wstring GetToastMessage()
{
return _message;
}
uint8_t* GetToastIcon()
{
return _icon;
}
uint32_t GetIconSize()
{
return _iconSize;
}
bool HasIcon()
{
return _iconSize > 0;
}
float GetOpacity()
{
uint64_t currentTime = GetCurrentTime();
if(currentTime - _startTime < 333) {
return (currentTime - _startTime) * 3.0f / 1000.0f;
} else if(_endTime - currentTime < 333) {
return (_endTime - currentTime) * 3.0f / 1000.0f;
} else {
return 1.0f;
}
}
bool IsToastExpired()
{
return _endTime < GetCurrentTime();
}
};

View file

@ -4,27 +4,24 @@
class InputDataMessage : public NetMessage
{
private:
uint8_t _inputState;
protected:
virtual uint32_t GetMessageLength()
virtual void ProtectedStreamState()
{
return sizeof(InputState);
}
virtual void ProtectedSend(Socket &socket)
{
socket.BufferedSend((char*)&InputState, sizeof(InputState));
Stream<uint8_t>(_inputState);
}
public:
uint8_t InputState;
InputDataMessage(char *readBuffer) : NetMessage(MessageType::InputData)
{
InputState = readBuffer[0];
}
InputDataMessage(void* buffer, uint32_t length) : NetMessage(buffer, length) { }
InputDataMessage(uint8_t inputState) : NetMessage(MessageType::InputData)
{
InputState = inputState;
_inputState = inputState;
}
uint8_t GetInputState()
{
return _inputState;
}
};

View file

@ -1,4 +1,5 @@
#include "stdafx.h"
#include "CPU.h"
#include "BaseMapper.h"
class MMC1 : public BaseMapper

View file

@ -1,6 +1,6 @@
#pragma once
#include "stdafx.h"
#include "Console.h"
#include "MessageManager.h"
#include "MapperFactory.h"
#include "ROMLoader.h"
#include "AXROM.h"
@ -37,7 +37,7 @@ BaseMapper* MapperFactory::GetMapperFromID(uint8_t mapperID)
case 71: return new UNROM(); //TODO: "It's largely a clone of UNROM, and Camerica games were initially emulated under iNES Mapper 002 before 071 was assigned."
case 163: return new Nanjing();
case 189: return new MMC3_189();
default: Console::DisplayMessage(L"Unsupported mapper, cannot load file.");
default: MessageManager::DisplayMessage(L"Error", L"Unsupported mapper, cannot load game.");
}
return nullptr;

View file

@ -1,5 +1,6 @@
#include "stdafx.h"
#include "MemoryManager.h"
#include "BaseMapper.h"
#include "PPU.h"
#include "Debugger.h"
@ -93,6 +94,11 @@ void MemoryManager::RegisterIODevice(IMemoryHandler *handler)
InitializeMemoryHandlers(_vramWriteHandlers, handler, ranges.GetVRAMWriteAddresses());
}
uint8_t* MemoryManager::GetInternalRAM()
{
return _internalRAM;
}
uint8_t MemoryManager::DebugRead(uint16_t addr)
{
if(addr <= 0x1FFF) {

View file

@ -2,10 +2,10 @@
#include "stdafx.h"
#include "IMemoryHandler.h"
#include "ROMLoader.h"
#include "BaseMapper.h"
#include "Snapshotable.h"
class BaseMapper;
class MemoryManager: public Snapshotable
{
private:
@ -47,6 +47,8 @@ class MemoryManager: public Snapshotable
void RegisterIODevice(IMemoryHandler *handler);
uint8_t DebugRead(uint16_t addr);
uint8_t* GetInternalRAM();
uint8_t Read(uint16_t addr, bool forExecution = false);
uint16_t ReadWord(uint16_t addr);
void Write(uint16_t addr, uint8_t value);

46
Core/MessageManager.cpp Normal file
View file

@ -0,0 +1,46 @@
#include "stdafx.h"
#include "MessageManager.h"
IMessageManager* MessageManager::_messageManager = nullptr;
list<INotificationListener*> MessageManager::_notificationListeners;
void MessageManager::RegisterMessageManager(IMessageManager* messageManager)
{
MessageManager::_messageManager = messageManager;
}
void MessageManager::DisplayMessage(wstring title, wstring message)
{
std::wcout << message << std::endl;
if(MessageManager::_messageManager) {
MessageManager::_messageManager->DisplayMessage(title, message);
}
}
void MessageManager::DisplayToast(wstring title, wstring message, uint8_t* iconData, uint32_t iconSize)
{
if(MessageManager::_messageManager) {
MessageManager::_messageManager->DisplayToast(shared_ptr<ToastInfo>(new ToastInfo(title, message, 4000, iconData, iconSize)));
}
}
void MessageManager::RegisterNotificationListener(INotificationListener* notificationListener)
{
MessageManager::_notificationListeners.push_back(notificationListener);
MessageManager::_notificationListeners.unique();
}
void MessageManager::UnregisterNotificationListener(INotificationListener* notificationListener)
{
MessageManager::_notificationListeners.remove(notificationListener);
}
void MessageManager::SendNotification(ConsoleNotificationType type)
{
list<INotificationListener*> listeners = MessageManager::_notificationListeners;
//Iterate on a copy to prevent issues if a notification causes a listener to unregister itself
for(INotificationListener* notificationListener : listeners) {
notificationListener->ProcessNotification(type);
}
}

22
Core/MessageManager.h Normal file
View file

@ -0,0 +1,22 @@
#pragma once
#include "stdafx.h"
#include "IMessageManager.h"
#include "INotificationListener.h"
class MessageManager
{
private:
static IMessageManager* _messageManager;
static list<INotificationListener*> _notificationListeners;
public:
static void RegisterMessageManager(IMessageManager* messageManager);
static void DisplayMessage(wstring title, wstring message = L"");
static void DisplayToast(wstring title, wstring message, uint8_t* iconData, uint32_t iconSize);
static void RegisterNotificationListener(INotificationListener* notificationListener);
static void UnregisterNotificationListener(INotificationListener* notificationListener);
static void SendNotification(ConsoleNotificationType type);
};

View file

@ -1,6 +1,8 @@
#include "stdafx.h"
#include "MessageManager.h"
#include "Movie.h"
#include "Console.h"
#include "../Utilities/FolderUtilities.h"
Movie* Movie::Instance = new Movie();
@ -43,7 +45,7 @@ uint8_t Movie::GetState(uint8_t port)
if(_readPosition[port] >= _data.DataSize[port]) {
//End of movie file
Console::DisplayMessage(L"Movie ended.");
MessageManager::DisplayMessage(L"Movie ended.");
_playing = false;
}
@ -84,7 +86,7 @@ void Movie::StartRecording(wstring filename, bool reset)
Console::Resume();
Console::DisplayMessage(L"Recording...");
MessageManager::DisplayMessage(L"Recording...");
}
}
@ -116,7 +118,7 @@ void Movie::PlayMovie(wstring filename)
}
_playing = true;
Console::Resume();
Console::DisplayMessage(L"Playing movie: " + FolderUtilities::GetFilename(filename, true));
MessageManager::DisplayMessage(L"Playing movie: " + FolderUtilities::GetFilename(filename, true));
}
}

View file

@ -10,7 +10,7 @@ struct MovieData
bool Save(ofstream &file, stringstream &startState)
{
file.write("NMO", 3);
file.write("MMO", 3);
SaveStateSize = (uint32_t)startState.tellp();
file.write((char*)&SaveStateSize, sizeof(uint32_t));
@ -43,7 +43,7 @@ struct MovieData
char header[3];
file.read((char*)&header, 3);
if(memcmp((char*)&header, "NMO", 3) != 0) {
if(memcmp((char*)&header, "MMO", 3) != 0) {
//Invalid movie file
return false;
}

View file

@ -4,31 +4,33 @@
class MovieDataMessage : public NetMessage
{
protected:
virtual uint32_t GetMessageLength()
{
return sizeof(PortNumber) + sizeof(InputState);
}
private:
uint8_t _portNumber;
uint8_t _inputState;
virtual void ProtectedSend(Socket &socket)
protected:
virtual void ProtectedStreamState()
{
socket.BufferedSend((char*)&PortNumber, sizeof(PortNumber));
socket.BufferedSend((char*)&InputState, sizeof(InputState));
Stream<uint8_t>(_portNumber);
Stream<uint8_t>(_inputState);
}
public:
uint8_t PortNumber;
uint8_t InputState;
MovieDataMessage(char *readBuffer) : NetMessage(MessageType::MovieData)
{
PortNumber = readBuffer[0];
InputState = readBuffer[1];
}
MovieDataMessage(void* buffer, uint32_t length) : NetMessage(buffer, length) { }
MovieDataMessage(uint8_t state, uint8_t port) : NetMessage(MessageType::MovieData)
{
PortNumber = port;
InputState = state;
_portNumber = port;
_inputState = state;
}
uint8_t GetPortNumber()
{
return _portNumber;
}
uint8_t GetInputState()
{
return _inputState;
}
};

View file

@ -5,24 +5,104 @@
class NetMessage
{
public:
MessageType Type;
protected:
MessageType _type;
bool _sending;
vector<uint8_t> _buffer;
uint32_t _position = 0;
vector<void*> _pointersToRelease;
template<typename T>
void Stream(T &value)
{
if(_sending) {
uint8_t* bytes = (uint8_t*)&value;
int typeSize = sizeof(T);
for(int i = 0; i < typeSize; i++) {
_buffer.push_back(bytes[i]);
}
} else {
value = *((T*)(&_buffer[0] + _position));
_position += sizeof(T);
}
}
void StreamArray(void** value, uint32_t &length)
{
if(_sending) {
Stream<uint32_t>(length);
uint8_t* bytes = (uint8_t*)(*value);
for(uint32_t i = 0, len = length; i < len; i++) {
_buffer.push_back(bytes[i]);
_position++;
}
} else {
Stream<uint32_t>(length);
if(*value == nullptr) {
*value = (void*)new uint8_t[length];
_pointersToRelease.push_back(*value);
}
uint8_t* bytes = (uint8_t*)(*value);
for(uint32_t i = 0, len = length; i < len; i++) {
bytes[i] = _buffer[_position];
_position++;
}
}
}
void StreamState()
{
Stream<MessageType>(_type);
ProtectedStreamState();
}
NetMessage(MessageType type)
{
Type = type;
_type = type;
_sending = true;
}
NetMessage(void* buffer, uint32_t length)
{
_buffer.assign((uint8_t*)buffer, (uint8_t*)buffer + length);
_sending = false;
}
public:
virtual ~NetMessage()
{
for(void *pointer : _pointersToRelease) {
delete[] pointer;
}
}
void Initialize()
{
StreamState();
}
MessageType GetType()
{
return _type;
}
void Send(Socket &socket)
{
uint32_t messageLength = GetMessageLength() + sizeof(Type);
StreamState();
uint32_t messageLength = _buffer.size();
socket.BufferedSend((char*)&messageLength, sizeof(messageLength));
socket.BufferedSend((char*)&Type, sizeof(Type));
ProtectedSend(socket);
socket.BufferedSend((char*)&_buffer[0], messageLength);
socket.SendBuffer();
}
void CopyString(wchar_t** dest, uint32_t &length, wstring src)
{
length = (src.length() + 1)*sizeof(wchar_t);
*dest = (wchar_t*)new uint8_t[length];
memcpy(*dest, src.c_str(), length);
_pointersToRelease.push_back(*dest);
}
protected:
virtual uint32_t GetMessageLength() = 0;
virtual void ProtectedSend(Socket &socket) = 0;
virtual void ProtectedStreamState() = 0;
};

View file

@ -52,9 +52,15 @@ void PPU::Reset()
memset(_spriteRAM, 0xFF, 0x100);
}
bool PPU::CheckFlag(PPUControlFlags flag)
PPUDebugState PPU::GetState()
{
return false;
PPUDebugState state;
state.ControlFlags = _flags;
state.StatusFlags = _statusFlags;
state.State = _state;
state.Cycle = _cycle;
state.Scanline = _scanline;
return state;
}
void PPU::UpdateVideoRamAddr()
@ -293,13 +299,13 @@ void PPU::IncHorizontalScrolling()
_state.VideoRamAddr = addr;
}
//Take from http://wiki.nesdev.com/w/index.php/The_skinny_on_NES_scrolling#Tile_and_attribute_fetching
//Taken from http://wiki.nesdev.com/w/index.php/The_skinny_on_NES_scrolling#Tile_and_attribute_fetching
uint16_t PPU::GetNameTableAddr()
{
return 0x2000 | (_state.VideoRamAddr & 0x0FFF);
}
//Take from http://wiki.nesdev.com/w/index.php/The_skinny_on_NES_scrolling#Tile_and_attribute_fetching
//Taken from http://wiki.nesdev.com/w/index.php/The_skinny_on_NES_scrolling#Tile_and_attribute_fetching
uint16_t PPU::GetAttributeAddr()
{
return 0x23C0 | (_state.VideoRamAddr & 0x0C00) | ((_state.VideoRamAddr >> 4) & 0x38) | ((_state.VideoRamAddr >> 2) & 0x07);

View file

@ -74,6 +74,15 @@ struct SpriteInfo
bool BackgroundPriority;
};
struct PPUDebugState
{
PPUControlFlags ControlFlags;
PPUStatusFlags StatusFlags;
PPUState State;
int32_t Scanline;
uint32_t Cycle;
};
class PPU : public IMemoryHandler, public Snapshotable
{
private:
@ -120,7 +129,6 @@ class PPU : public IMemoryHandler, public Snapshotable
void SetControlRegister(uint8_t value);
void SetMaskRegister(uint8_t value);
bool CheckFlag(PPUControlFlags flag);
bool IsRenderingEnabled();
@ -172,6 +180,8 @@ class PPU : public IMemoryHandler, public Snapshotable
void Reset();
PPUDebugState GetState();
void GetMemoryRanges(MemoryRanges &ranges)
{
ranges.AddHandler(MemoryType::RAM, MemoryOperation::Read, 0x2000, 0x3FFF);

57
Core/SaveStateManager.cpp Normal file
View file

@ -0,0 +1,57 @@
#include "stdafx.h"
#include "SaveStateManager.h"
#include "MessageManager.h"
#include "Console.h"
#include "../Utilities/FolderUtilities.h"
wstring SaveStateManager::GetStateFilepath(int stateIndex)
{
wstring folder = FolderUtilities::GetSaveStateFolder();
wstring filename = FolderUtilities::GetFilename(Console::GetROMPath(), false) + L"_" + std::to_wstring(stateIndex) + L".mst";
return FolderUtilities::CombinePath(folder, filename);
}
uint64_t SaveStateManager::GetStateInfo(int stateIndex)
{
wstring filepath = SaveStateManager::GetStateFilepath(stateIndex);
ifstream file(filepath, ios::in | ios::binary);
if(file) {
file.close();
return FolderUtilities::GetFileModificationTime(filepath);
}
return 0;
}
void SaveStateManager::SaveState(int stateIndex)
{
wstring filepath = SaveStateManager::GetStateFilepath(stateIndex);
ofstream file(filepath, ios::out | ios::binary);
if(file) {
Console::Pause();
Console::SaveState(file);
Console::Resume();
file.close();
MessageManager::DisplayMessage(L"Game States", L"State #" + std::to_wstring(stateIndex) + L" saved.");
}
}
bool SaveStateManager::LoadState(int stateIndex)
{
wstring filepath = SaveStateManager::GetStateFilepath(stateIndex);
ifstream file(filepath, ios::in | ios::binary);
if(file) {
Console::Pause();
Console::LoadState(file);
Console::Resume();
file.close();
MessageManager::DisplayMessage(L"Game States", L"State #" + std::to_wstring(stateIndex) + L" loaded.");
return true;
}
MessageManager::DisplayMessage(L"Game States", L"Slot is empty.");
return false;
}

15
Core/SaveStateManager.h Normal file
View file

@ -0,0 +1,15 @@
#pragma once
#include "stdafx.h"
class SaveStateManager
{
private:
static wstring SaveStateManager::GetStateFilepath(int stateIndex);
public:
static uint64_t SaveStateManager::GetStateInfo(int stateIndex);
static void SaveStateManager::SaveState(int stateIndex);
static bool SaveStateManager::LoadState(int stateIndex);
};

View file

@ -6,31 +6,22 @@
class SaveStateMessage : public NetMessage
{
private:
char* _stateData;
void* _stateData;
uint32_t _dataSize;
protected:
virtual uint32_t GetMessageLength()
virtual void ProtectedStreamState()
{
return _dataSize;
}
virtual void ProtectedSend(Socket &socket)
{
socket.BufferedSend(_stateData, _dataSize);
StreamArray(&_stateData, _dataSize);
}
public:
SaveStateMessage(char *readBuffer, uint32_t bufferLength) : NetMessage(MessageType::SaveState)
{
_stateData = new char[bufferLength];
_dataSize = bufferLength;
memcpy(_stateData, readBuffer, bufferLength);
}
SaveStateMessage(void* buffer, uint32_t length) : NetMessage(buffer, length) { }
~SaveStateMessage()
SaveStateMessage(void* stateData, uint32_t dataSize, bool forSend) : NetMessage(MessageType::SaveState)
{
delete[] _stateData;
_stateData = stateData;
_dataSize = dataSize;
}
void LoadState()

View file

@ -37,7 +37,7 @@ class Snapshotable
_stream[_position++] = bytes[i];
}
} else {
for(uint32_t i = 0; i < length*typeSize; i++) {
for(uint32_t i = 0, len = length*typeSize; i < len; i++) {
((uint8_t*)value)[i] = _stream[_position];
_position++;
}

View file

@ -1,6 +1,9 @@
#pragma once
#include "stdafx.h"
#include <atomic>
using std::atomic;
#include "IControlDevice.h"
#include "../Utilities/SimpleLock.h"

View file

@ -14,12 +14,11 @@
#include <string>
#include <cctype>
#include <memory>
#include <thread>
#include <vector>
#include <array>
#include <sstream>
#include <atomic>
#include <list>
#include <atomic>
using std::vector;
using std::shared_ptr;
@ -32,9 +31,8 @@ using std::stringstream;
using std::ofstream;
using std::wstring;
using std::exception;
using std::atomic_flag;
using std::atomic;
using std::list;
using std::max;
using std::thread;
using std::string;
using std::atomic_flag;
using std::atomic;

6
GUI.NET/App.config Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

View file

@ -0,0 +1,205 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml.Serialization;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
namespace Mesen.GUI
{
class ConfigManager
{
private static Configuration _config;
private static Configuration _dirtyConfig;
private static void LoadConfig()
{
if(_config == null) {
if(File.Exists(ConfigFile)) {
_config = Configuration.Deserialize(ConfigFile);
_dirtyConfig = Configuration.Deserialize(ConfigFile);
} else {
//Create new config file and save it to disk
_config = new Configuration();
_dirtyConfig = new Configuration();
SaveConfig();
}
}
}
private static void SaveConfig()
{
_config.Serialize(ConfigFile);
}
private static string ConfigFile
{
get
{
string configPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.Create), "Mesen");
if(!Directory.Exists(configPath)) {
Directory.CreateDirectory(configPath);
}
return Path.Combine(configPath, "settings.xml");
}
}
public static Configuration Config
{
get
{
LoadConfig();
return _dirtyConfig;
}
}
public static void ApplyChanges()
{
_config = _dirtyConfig.Clone();
SaveConfig();
}
public static void RejectChanges()
{
_dirtyConfig = _config.Clone();
}
}
public class PlayerProfile
{
public string PlayerName = "NewPlayer";
public byte[] PlayerAvatar;
public PlayerProfile()
{
SetAvatar(Properties.Resources.MesenLogo);
}
public void SetAvatar(Image image)
{
PlayerAvatar = image.ResizeImage(64, 64).ToByteArray(ImageFormat.Bmp);
}
public void SetAvatar(string filename)
{
PlayerAvatar = File.ReadAllBytes(filename);
}
public Image GetAvatarImage()
{
return Image.FromStream(new MemoryStream(PlayerAvatar));
}
}
public class ClientConnectionInfo
{
public string Host = "localhost";
public UInt16 Port = 8888;
}
public class ServerInfo
{
public string Name = "Default";
public UInt16 Port = 8888;
public string Password = null;
public int MaxPlayers = 4;
public bool AllowSpectators = true;
public bool PublicServer = false;
}
public class Configuration
{
private const int MaxRecentFiles = 10;
public PlayerProfile Profile;
public ClientConnectionInfo ClientConnectionInfo;
public ServerInfo ServerInfo;
public List<string> RecentFiles;
public Configuration()
{
Profile = new PlayerProfile();
ClientConnectionInfo = new ClientConnectionInfo();
ServerInfo = new ServerInfo();
RecentFiles = new List<string>();
}
public void AddRecentFile(string filepath)
{
if(RecentFiles.Contains(filepath)) {
RecentFiles.Remove(filepath);
}
RecentFiles.Insert(0, filepath);
if(RecentFiles.Count > Configuration.MaxRecentFiles) {
RecentFiles.RemoveAt(Configuration.MaxRecentFiles);
}
ConfigManager.ApplyChanges();
}
public static Configuration Deserialize(string configFile)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration));
using(TextReader textReader = new StreamReader(configFile)) {
return (Configuration)xmlSerializer.Deserialize(textReader);
}
}
public void Serialize(string configFile)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration));
using(TextWriter textWriter = new StreamWriter(configFile)) {
xmlSerializer.Serialize(textWriter, this);
}
}
public Configuration Clone()
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Configuration));
StringWriter stringWriter = new StringWriter();
xmlSerializer.Serialize(stringWriter, this);
StringReader stringReader = new StringReader(stringWriter.ToString());
return (Configuration)xmlSerializer.Deserialize(stringReader);
}
}
public static class ImageExtensions
{
public static byte[] ToByteArray(this Image image, ImageFormat format)
{
using(MemoryStream ms = new MemoryStream()) {
image.Save(ms, format);
return ms.ToArray();
}
}
public static Image ResizeImage(this Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using(var graphics = Graphics.FromImage(destImage)) {
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using(var wrapMode = new ImageAttributes()) {
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
}
}

36
GUI.NET/Controls/DXViewer.Designer.cs generated Normal file
View file

@ -0,0 +1,36 @@
namespace Mesen.GUI.Controls
{
partial class DXViewer
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
}
#endregion
}
}

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Controls
{
public partial class DXViewer : UserControl
{
public DXViewer()
{
InitializeComponent();
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,89 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Mesen.GUI.Debugger
{
public partial class ctrlConsoleStatus : UserControl
{
public ctrlConsoleStatus()
{
InitializeComponent();
}
private void UpdateCPUStatus(ref DebugState state)
{
txtA.Text = state.CPU.A.ToString("x").ToUpper();
txtX.Text = state.CPU.X.ToString("x").ToUpper();
txtY.Text = state.CPU.Y.ToString("x").ToUpper();
txtPC.Text = state.CPU.PC.ToString("x").ToUpper();
txtSP.Text = state.CPU.SP.ToString("x").ToUpper();
txtStatus.Text = state.CPU.PS.ToString("x").ToUpper();
PSFlags flags = (PSFlags)state.CPU.PS;
chkBreak.Checked = flags.HasFlag(PSFlags.Break);
chkCarry.Checked = flags.HasFlag(PSFlags.Carry);
chkDecimal.Checked = flags.HasFlag(PSFlags.Decimal);
chkInterrupt.Checked = flags.HasFlag(PSFlags.Interrupt);
chkNegative.Checked = flags.HasFlag(PSFlags.Negative);
chkOverflow.Checked = flags.HasFlag(PSFlags.Overflow);
chkReserved.Checked = flags.HasFlag(PSFlags.Reserved);
chkZero.Checked = flags.HasFlag(PSFlags.Zero);
chkExternal.Checked = state.CPU.IRQFlag.HasFlag(IRQSource.External);
chkFrameCounter.Checked = state.CPU.IRQFlag.HasFlag(IRQSource.FrameCounter);
chkDMC.Checked = state.CPU.IRQFlag.HasFlag(IRQSource.DMC);
chkNMI.Checked = state.CPU.NMIFlag;
}
private void UpdatePPUStatus(ref DebugState state)
{
chkVerticalBlank.Checked = Convert.ToBoolean(state.PPU.StatusFlags.VerticalBlank);
chkSprite0Hit.Checked = Convert.ToBoolean(state.PPU.StatusFlags.Sprite0Hit);
chkSpriteOverflow.Checked = Convert.ToBoolean(state.PPU.StatusFlags.SpriteOverflow);
chkBGEnabled.Checked = Convert.ToBoolean(state.PPU.ControlFlags.BackgroundEnabled);
chkSpritesEnabled.Checked = Convert.ToBoolean(state.PPU.ControlFlags.SpritesEnabled);
chkDrawLeftBG.Checked = Convert.ToBoolean(state.PPU.ControlFlags.BackgroundMask);
chkDrawLeftSpr.Checked = Convert.ToBoolean(state.PPU.ControlFlags.SpriteMask);
chkVerticalWrite.Checked = Convert.ToBoolean(state.PPU.ControlFlags.VerticalWrite);
chkNMIOnBlank.Checked = Convert.ToBoolean(state.PPU.ControlFlags.VBlank);
chkLargeSprites.Checked = Convert.ToBoolean(state.PPU.ControlFlags.LargeSprites);
chkGrayscale.Checked = Convert.ToBoolean(state.PPU.ControlFlags.Grayscale);
chkIntensifyRed.Checked = Convert.ToBoolean(state.PPU.ControlFlags.IntensifyRed);
chkIntensifyGreen.Checked = Convert.ToBoolean(state.PPU.ControlFlags.IntensifyGreen);
chkIntensifyBlue.Checked = Convert.ToBoolean(state.PPU.ControlFlags.IntensifyBlue);
txtBGAddr.Text = state.PPU.ControlFlags.BackgroundPatternAddr.ToString("x").ToUpper();
txtSprAddr.Text = state.PPU.ControlFlags.SpritePatternAddr.ToString("x").ToUpper();
txtVRAMAddr.Text = state.PPU.State.VideoRamAddr.ToString("x").ToUpper();
txtCycle.Text = state.PPU.Cycle.ToString();
txtScanline.Text = state.PPU.Scanline.ToString();
txtNTAddr.Text = (0x2000 | (state.PPU.State.VideoRamAddr & 0x0FFF)).ToString("x").ToUpper();
}
private void UpdateStack(UInt16 stackPointer)
{
lstStack.Items.Clear();
for(UInt32 i = (UInt32)0x100 + stackPointer; i < 0x200; i++) {
lstStack.Items.Add("$" + InteropEmu.DebugGetMemoryValue(i).ToString("x").ToUpper());
}
}
public void UpdateStatus(ref DebugState state)
{
UpdateCPUStatus(ref state);
UpdatePPUStatus(ref state);
UpdateStack(state.CPU.SP);
}
}
}

View file

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -0,0 +1,206 @@
namespace Mesen.GUI.Debugger
{
partial class ctrlDebuggerCode
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.tableLayoutPanel11 = new System.Windows.Forms.TableLayoutPanel();
this.txtCode = new Mesen.GUI.Debugger.ctrlSyncTextBox();
this.contextMenuCode = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuShowNextStatement = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSetNextStatement = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuShowOnlyDisassembledCode = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuGoToLocation = new System.Windows.Forms.ToolStripMenuItem();
this.panel1 = new System.Windows.Forms.Panel();
this.txtCodeMargin = new Mesen.GUI.Debugger.ctrlSyncTextBox();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
this.mnuAddToWatch = new System.Windows.Forms.ToolStripMenuItem();
this.tableLayoutPanel11.SuspendLayout();
this.contextMenuCode.SuspendLayout();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel11
//
this.tableLayoutPanel11.CellBorderStyle = System.Windows.Forms.TableLayoutPanelCellBorderStyle.Single;
this.tableLayoutPanel11.ColumnCount = 2;
this.tableLayoutPanel11.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 74F));
this.tableLayoutPanel11.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel11.Controls.Add(this.txtCode, 1, 0);
this.tableLayoutPanel11.Controls.Add(this.panel1, 0, 0);
this.tableLayoutPanel11.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel11.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel11.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel11.Name = "tableLayoutPanel11";
this.tableLayoutPanel11.RowCount = 1;
this.tableLayoutPanel11.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel11.Size = new System.Drawing.Size(379, 218);
this.tableLayoutPanel11.TabIndex = 3;
//
// txtCode
//
this.txtCode.BackColor = System.Drawing.Color.White;
this.txtCode.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCode.ContextMenuStrip = this.contextMenuCode;
this.txtCode.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtCode.Font = new System.Drawing.Font("Consolas", 11F);
this.txtCode.Location = new System.Drawing.Point(76, 1);
this.txtCode.Margin = new System.Windows.Forms.Padding(0);
this.txtCode.Name = "txtCode";
this.txtCode.ReadOnly = true;
this.txtCode.Size = new System.Drawing.Size(302, 216);
this.txtCode.SyncedTextbox = null;
this.txtCode.TabIndex = 0;
this.txtCode.Text = "";
this.txtCode.MouseMove += new System.Windows.Forms.MouseEventHandler(this.txtCode_MouseMove);
this.txtCode.MouseUp += new System.Windows.Forms.MouseEventHandler(this.txtCode_MouseUp);
//
// contextMenuCode
//
this.contextMenuCode.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuShowNextStatement,
this.mnuSetNextStatement,
this.toolStripMenuItem1,
this.mnuShowOnlyDisassembledCode,
this.toolStripMenuItem2,
this.mnuGoToLocation,
this.mnuAddToWatch});
this.contextMenuCode.Name = "contextMenuWatch";
this.contextMenuCode.Size = new System.Drawing.Size(259, 148);
this.contextMenuCode.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuCode_Opening);
//
// mnuShowNextStatement
//
this.mnuShowNextStatement.Name = "mnuShowNextStatement";
this.mnuShowNextStatement.ShortcutKeyDisplayString = "Alt+*";
this.mnuShowNextStatement.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.Multiply)));
this.mnuShowNextStatement.Size = new System.Drawing.Size(258, 22);
this.mnuShowNextStatement.Text = "Show Next Statement";
this.mnuShowNextStatement.Click += new System.EventHandler(this.mnuShowNextStatement_Click);
//
// mnuSetNextStatement
//
this.mnuSetNextStatement.Name = "mnuSetNextStatement";
this.mnuSetNextStatement.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.F10)));
this.mnuSetNextStatement.Size = new System.Drawing.Size(258, 22);
this.mnuSetNextStatement.Text = "Set Next Statement";
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(255, 6);
//
// mnuShowOnlyDisassembledCode
//
this.mnuShowOnlyDisassembledCode.Checked = true;
this.mnuShowOnlyDisassembledCode.CheckOnClick = true;
this.mnuShowOnlyDisassembledCode.CheckState = System.Windows.Forms.CheckState.Checked;
this.mnuShowOnlyDisassembledCode.Name = "mnuShowOnlyDisassembledCode";
this.mnuShowOnlyDisassembledCode.Size = new System.Drawing.Size(258, 22);
this.mnuShowOnlyDisassembledCode.Text = "Show Only Disassembled Code";
this.mnuShowOnlyDisassembledCode.Click += new System.EventHandler(this.mnuShowOnlyDisassembledCode_Click);
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(255, 6);
//
// mnuGoToLocation
//
this.mnuGoToLocation.Name = "mnuGoToLocation";
this.mnuGoToLocation.Size = new System.Drawing.Size(258, 22);
this.mnuGoToLocation.Text = "Go To Location";
this.mnuGoToLocation.Click += new System.EventHandler(this.mnuGoToLocation_Click);
//
// panel1
//
this.panel1.Controls.Add(this.txtCodeMargin);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(1, 1);
this.panel1.Margin = new System.Windows.Forms.Padding(0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(74, 216);
this.panel1.TabIndex = 1;
//
// txtCodeMargin
//
this.txtCodeMargin.BackColor = System.Drawing.Color.WhiteSmoke;
this.txtCodeMargin.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txtCodeMargin.Dock = System.Windows.Forms.DockStyle.Left;
this.txtCodeMargin.Font = new System.Drawing.Font("Consolas", 11F);
this.txtCodeMargin.Location = new System.Drawing.Point(0, 0);
this.txtCodeMargin.Margin = new System.Windows.Forms.Padding(0);
this.txtCodeMargin.Name = "txtCodeMargin";
this.txtCodeMargin.ReadOnly = true;
this.txtCodeMargin.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;
this.txtCodeMargin.Size = new System.Drawing.Size(90, 216);
this.txtCodeMargin.SyncedTextbox = null;
this.txtCodeMargin.TabIndex = 1;
this.txtCodeMargin.Text = "";
this.txtCodeMargin.Enter += new System.EventHandler(this.txtCodeMargin_Enter);
//
// mnuAddToWatch
//
this.mnuAddToWatch.Name = "mnuAddToWatch";
this.mnuAddToWatch.Size = new System.Drawing.Size(258, 22);
this.mnuAddToWatch.Text = "Add to Watch";
this.mnuAddToWatch.Click += new System.EventHandler(this.mnuAddToWatch_Click);
//
// ctrlDebuggerCode
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.tableLayoutPanel11);
this.Name = "ctrlDebuggerCode";
this.Size = new System.Drawing.Size(379, 218);
this.tableLayoutPanel11.ResumeLayout(false);
this.contextMenuCode.ResumeLayout(false);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel11;
private ctrlSyncTextBox txtCode;
private System.Windows.Forms.Panel panel1;
private ctrlSyncTextBox txtCodeMargin;
private System.Windows.Forms.ToolTip toolTip;
private System.Windows.Forms.ContextMenuStrip contextMenuCode;
private System.Windows.Forms.ToolStripMenuItem mnuShowNextStatement;
private System.Windows.Forms.ToolStripMenuItem mnuSetNextStatement;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem mnuShowOnlyDisassembledCode;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
private System.Windows.Forms.ToolStripMenuItem mnuGoToLocation;
private System.Windows.Forms.ToolStripMenuItem mnuAddToWatch;
}
}

View file

@ -0,0 +1,292 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Debugger
{
public partial class ctrlDebuggerCode : UserControl
{
public delegate void WatchAddedEventHandler(WatchAddedEventArgs args);
public event WatchAddedEventHandler OnWatchAdded;
public ctrlDebuggerCode()
{
InitializeComponent();
txtCode.SyncedTextbox = txtCodeMargin;
}
private string _code;
private bool _codeChanged;
public string Code
{
get { return _code; }
set
{
if(value != _code) {
_codeChanged = true;
_code = value;
}
}
}
private UInt32? _currentActiveAddress = null;
public void SelectActiveAddress(UInt32 address)
{
txtCode.BeginUpdate();
txtCodeMargin.BeginUpdate();
if(!UpdateCode()) {
RemoveActiveHighlight();
}
int lineIndex = GetAddressLine(address);
if(lineIndex >= 0) {
if(!IsLineVisible(lineIndex)) {
//Scroll active line to middle of viewport if it wasn't already visible
ScrollToLine(lineIndex);
}
//Set line background to yellow
HighlightLine(lineIndex, Color.Yellow, Color.Black);
}
txtCode.EndUpdate();
txtCodeMargin.EndUpdate();
_currentActiveAddress = address;
}
public void RemoveActiveHighlight()
{
//Didn't update code, need to remove previous highlighting
if(_currentActiveAddress.HasValue) {
int lineIndex = GetAddressLine(_currentActiveAddress.Value);
if(lineIndex != -1) {
HighlightLine(lineIndex, Color.White, Color.Black);
}
}
}
public int GetCurrentLine()
{
int cursorPos = txtCode.GetFirstCharIndexOfCurrentLine();
return txtCode.GetLineFromCharIndex(cursorPos);
}
public string GetWordUnderLocation(Point position)
{
int charIndex = txtCode.GetCharIndexFromPosition(position);
if(txtCode.Text.Length > charIndex) {
List<char> wordDelimiters = new List<char>(new char[] { ' ', '\r', '\n', ',' });
if(wordDelimiters.Contains(txtCode.Text[charIndex])) {
return string.Empty;
} else {
int endIndex = txtCode.Text.IndexOfAny(wordDelimiters.ToArray(), charIndex);
int startIndex = txtCode.Text.LastIndexOfAny(wordDelimiters.ToArray(), charIndex);
return txtCode.Text.Substring(startIndex + 1, endIndex - startIndex - 1);
}
} else {
return string.Empty;
}
}
private int GetLineCount()
{
return (int)((float)txtCodeMargin.Height / (txtCodeMargin.Font.GetHeight() + 1)) - 1;
}
private void ScrollToAddress(UInt32 address)
{
int lineIndex = GetAddressLine(address);
if(lineIndex != -1 && !IsLineVisible(lineIndex)) {
ScrollToLine(lineIndex);
}
}
private void ScrollToLine(int lineIndex)
{
lineIndex = Math.Max(0, lineIndex - GetLineCount()/2);
txtCodeMargin.SelectionStart = txtCodeMargin.GetFirstCharIndexFromLine(lineIndex);
txtCodeMargin.ScrollToCaret();
txtCode.SelectionStart = txtCode.GetFirstCharIndexFromLine(lineIndex);
txtCode.ScrollToCaret();
}
private bool IsLineVisible(int lineIndex)
{
int firstLine = txtCodeMargin.GetLineFromCharIndex(txtCodeMargin.GetCharIndexFromPosition(new Point(0, 0)));
return lineIndex >= firstLine && lineIndex <= firstLine+GetLineCount();
}
public bool UpdateCode(bool forceUpdate = false)
{
if(_codeChanged || forceUpdate) {
StringBuilder lineNumbers = new StringBuilder();
StringBuilder codeString = new StringBuilder();
bool diassembledCodeOnly = mnuShowOnlyDisassembledCode.Checked;
bool skippingCode = false;
foreach(string line in _code.Split('\n')) {
string[] lineParts = line.Split(':');
if(skippingCode && (lineParts.Length != 2 || lineParts[1][0] != '.')) {
lineNumbers.AppendLine(" .. ");
codeString.AppendLine("[code not disassembled]");
UInt32 previousAddress = lineParts[0].Length > 0 ? ParseHexAddress(lineParts[0])-1 : 0xFFFF;
lineNumbers.AppendLine(previousAddress.ToString("x").ToUpper());
codeString.AppendLine("[code not disassembled]");
skippingCode = false;
}
if(lineParts.Length == 2) {
if(diassembledCodeOnly && lineParts[1][0] == '.') {
if(!skippingCode) {
lineNumbers.AppendLine(lineParts[0]);
codeString.AppendLine("[code not disassembled]");
skippingCode = true;
}
} else {
lineNumbers.AppendLine(lineParts[0]);
codeString.AppendLine(lineParts[1]);
}
}
}
txtCode.Text = codeString.ToString();
txtCodeMargin.Text = lineNumbers.ToString();
txtCodeMargin.SelectAll();
txtCodeMargin.SelectionAlignment = HorizontalAlignment.Right;
txtCodeMargin.SelectionLength = 0;
_codeChanged = false;
return true;
}
return false;
}
private int GetAddressLine(UInt32 address)
{
int attempts = 8;
do {
int pos = txtCodeMargin.Text.IndexOf(address.ToString("x"), StringComparison.InvariantCultureIgnoreCase);
if(pos >= 0) {
return txtCodeMargin.GetLineFromCharIndex(pos);
}
address--;
attempts--;
} while(attempts > 0);
return -1;
}
private UInt32 ParseHexAddress(string hexAddress)
{
return UInt32.Parse(hexAddress, System.Globalization.NumberStyles.AllowHexSpecifier);
}
private UInt32 GetLineAddress(int lineIndex)
{
int lineStartIndex = txtCodeMargin.GetFirstCharIndexFromLine(lineIndex);
txtCodeMargin.SelectionStart = lineStartIndex + 3;
txtCodeMargin.SelectionLength = 4;
return ParseHexAddress(txtCodeMargin.SelectedText);
}
public void HighlightLine(int lineIndex, Color bgColor, Color fgColor)
{
int lineStartIndex = txtCodeMargin.GetFirstCharIndexFromLine(lineIndex);
txtCodeMargin.SelectionStart = lineStartIndex;
txtCodeMargin.SelectionLength = 4;
txtCodeMargin.SelectionBackColor = bgColor;
txtCodeMargin.SelectionColor = fgColor;
txtCodeMargin.SelectionLength = 0;
lineStartIndex = txtCode.GetFirstCharIndexFromLine(lineIndex);
txtCode.SelectionStart = lineStartIndex;
txtCode.SelectionLength = txtCode.GetFirstCharIndexFromLine(lineIndex+1) - lineStartIndex;
txtCode.SelectionBackColor = bgColor;
txtCode.SelectionColor = fgColor;
txtCode.SelectionLength = 0;
}
#region Events
private Point _previousLocation;
private void txtCode_MouseMove(object sender, MouseEventArgs e)
{
if(_previousLocation != e.Location) {
string word = GetWordUnderLocation(e.Location);
if(word.StartsWith("$")) {
UInt32 address = UInt32.Parse(word.Substring(1), System.Globalization.NumberStyles.AllowHexSpecifier);
Byte memoryValue = InteropEmu.DebugGetMemoryValue(address);
string valueText = "$" + memoryValue.ToString("x").ToUpper();
toolTip.Show(valueText, txtCode, e.Location.X + 5, e.Location.Y + 5, 3000);
}
_previousLocation = e.Location;
}
}
UInt32 _lastClickedAddress = UInt32.MaxValue;
private void txtCode_MouseUp(object sender, MouseEventArgs e)
{
string word = GetWordUnderLocation(e.Location);
if(word.StartsWith("$")) {
_lastClickedAddress = UInt32.Parse(word.Substring(1), System.Globalization.NumberStyles.AllowHexSpecifier);
mnuGoToLocation.Enabled = true;
mnuGoToLocation.Text = "Go to Location (" + word + ")";
mnuAddToWatch.Enabled = true;
mnuAddToWatch.Text = "Add to Watch (" + word + ")";
} else {
mnuGoToLocation.Enabled = false;
mnuGoToLocation.Text = "Go to Location";
mnuAddToWatch.Enabled = false;
mnuAddToWatch.Text = "Add to Watch";
}
}
private void txtCodeMargin_Enter(object sender, EventArgs e)
{
txtCode.Focus();
}
#region Context Menu
private void contextMenuCode_Opening(object sender, CancelEventArgs e)
{
mnuShowNextStatement.Enabled = _currentActiveAddress.HasValue;
mnuSetNextStatement.Enabled = false;
}
private void mnuShowNextStatement_Click(object sender, EventArgs e)
{
ScrollToAddress(_currentActiveAddress.Value);
}
private void mnuShowOnlyDisassembledCode_Click(object sender, EventArgs e)
{
UpdateCode(true);
}
private void mnuGoToLocation_Click(object sender, EventArgs e)
{
ScrollToAddress(_lastClickedAddress);
}
private void mnuAddToWatch_Click(object sender, EventArgs e)
{
if(this.OnWatchAdded != null) {
this.OnWatchAdded(new WatchAddedEventArgs() { Address = _lastClickedAddress});
}
}
#endregion
#endregion
}
public class WatchAddedEventArgs : EventArgs
{
public UInt32 Address { get; set; }
}
}

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>143, 24</value>
</metadata>
<metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View file

@ -0,0 +1,110 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Mesen.GUI.Debugger
{
class ctrlSyncTextBox : RichTextBox
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int WM_MOUSEWHEEL = 0x20A;
private const int WM_VSCROLL = 0x115;
private const int WM_USER = 0x0400;
private const int EM_SETEVENTMASK = (WM_USER + 69);
private const int WM_SETREDRAW = 0x0b;
private IntPtr OldEventMask;
private Timer _syncTimer;
private RichTextBox _syncedTextbox;
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
public RichTextBox SyncedTextbox
{
get
{
return _syncedTextbox;
}
set
{
if(_syncedTextbox == null) {
_syncedTextbox = value;
if(!DesignMode && value != null && _syncTimer == null) {
CreateTimer();
}
}
}
}
public void BeginUpdate()
{
SendMessage(Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero);
OldEventMask = (IntPtr)SendMessage(Handle, EM_SETEVENTMASK, IntPtr.Zero, IntPtr.Zero);
}
public void EndUpdate()
{
SendMessage(Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
SendMessage(Handle, EM_SETEVENTMASK, IntPtr.Zero, OldEventMask);
}
private void CreateTimer()
{
_syncTimer = new Timer();
_syncTimer.Interval = 50;
_syncTimer.Enabled = true;
_syncTimer.Tick += (object sender, EventArgs e) => {
int line1 = SyncedTextbox.GetLineFromCharIndex(SyncedTextbox.GetCharIndexFromPosition(new Point(0, 0)));
int line2 = GetLineFromCharIndex(GetCharIndexFromPosition(new Point(0, 0)));
if(line1 != line2) {
int selectionStart = SyncedTextbox.GetFirstCharIndexFromLine(line2);
if(selectionStart >= 0) {
SyncedTextbox.SelectionStart = selectionStart;
SyncedTextbox.ScrollToCaret();
}
}
};
_syncTimer.Start();
}
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_VSCROLL && SyncedTextbox != null && SyncedTextbox.IsHandleCreated) {
SendMessage(SyncedTextbox.Handle, m.Msg, m.WParam, m.LParam);
}
if(m.Msg == WM_MOUSEWHEEL) {
//Disable smooth scrolling by replacing the WM_MOUSEWHEEL event by regular VM_VSCROLL events
int scrollLines = SystemInformation.MouseWheelScrollLines;
for(int i = 0; i < scrollLines; i++) {
if((int)m.WParam > 0) {
SendMessage(Handle, WM_VSCROLL, (IntPtr)0, IntPtr.Zero);
} else {
SendMessage(Handle, WM_VSCROLL, (IntPtr)1, IntPtr.Zero);
}
}
return;
} else {
base.WndProc(ref m);
}
}
protected override void Dispose(bool disposing)
{
if(disposing) {
if(_syncTimer != null) {
_syncTimer.Stop();
_syncTimer = null;
}
}
base.Dispose(disposing);
}
}
}

View file

@ -0,0 +1,126 @@
namespace Mesen.GUI.Debugger
{
partial class ctrlWatch
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.ListViewItem listViewItem1 = new System.Windows.Forms.ListViewItem("");
this.lstWatch = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuWatch = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuRemoveWatch = new System.Windows.Forms.ToolStripMenuItem();
this.mnuHexDisplay = new System.Windows.Forms.ToolStripMenuItem();
this.colLastColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuWatch.SuspendLayout();
this.SuspendLayout();
//
// lstWatch
//
this.lstWatch.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1,
this.columnHeader2,
this.colLastColumn});
this.lstWatch.ContextMenuStrip = this.contextMenuWatch;
this.lstWatch.Dock = System.Windows.Forms.DockStyle.Fill;
this.lstWatch.FullRowSelect = true;
this.lstWatch.GridLines = true;
this.lstWatch.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.lstWatch.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
listViewItem1});
this.lstWatch.LabelEdit = true;
this.lstWatch.Location = new System.Drawing.Point(0, 0);
this.lstWatch.Name = "lstWatch";
this.lstWatch.Size = new System.Drawing.Size(378, 112);
this.lstWatch.TabIndex = 6;
this.lstWatch.UseCompatibleStateImageBehavior = false;
this.lstWatch.View = System.Windows.Forms.View.Details;
this.lstWatch.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.lstWatch_AfterLabelEdit);
this.lstWatch.SelectedIndexChanged += new System.EventHandler(this.lstWatch_SelectedIndexChanged);
//
// columnHeader1
//
this.columnHeader1.Text = "Address";
//
// columnHeader2
//
this.columnHeader2.Text = "Value";
this.columnHeader2.Width = 100;
//
// contextMenuWatch
//
this.contextMenuWatch.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuRemoveWatch,
this.mnuHexDisplay});
this.contextMenuWatch.Name = "contextMenuWatch";
this.contextMenuWatch.Size = new System.Drawing.Size(184, 48);
//
// mnuRemoveWatch
//
this.mnuRemoveWatch.Name = "mnuRemoveWatch";
this.mnuRemoveWatch.ShortcutKeys = System.Windows.Forms.Keys.Delete;
this.mnuRemoveWatch.Size = new System.Drawing.Size(183, 22);
this.mnuRemoveWatch.Text = "Remove";
this.mnuRemoveWatch.Click += new System.EventHandler(this.mnuRemoveWatch_Click);
//
// mnuHexDisplay
//
this.mnuHexDisplay.Checked = true;
this.mnuHexDisplay.CheckOnClick = true;
this.mnuHexDisplay.CheckState = System.Windows.Forms.CheckState.Checked;
this.mnuHexDisplay.Name = "mnuHexDisplay";
this.mnuHexDisplay.Size = new System.Drawing.Size(183, 22);
this.mnuHexDisplay.Text = "Hexadecimal Display";
this.mnuHexDisplay.Click += new System.EventHandler(this.mnuHexDisplay_Click);
//
// colLastColumn
//
this.colLastColumn.Text = "";
//
// ctrlWatch
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.lstWatch);
this.Name = "ctrlWatch";
this.Size = new System.Drawing.Size(378, 112);
this.contextMenuWatch.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListView lstWatch;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ContextMenuStrip contextMenuWatch;
private System.Windows.Forms.ToolStripMenuItem mnuRemoveWatch;
private System.Windows.Forms.ToolStripMenuItem mnuHexDisplay;
private System.Windows.Forms.ColumnHeader colLastColumn;
}
}

View file

@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Debugger
{
public partial class ctrlWatch : UserControl
{
public ctrlWatch()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
AdjustColumnWidth();
}
private void lstWatch_ColumnWidthChanging(object sender, ColumnWidthChangingEventArgs e)
{
if(e.ColumnIndex == 2) {
e.Cancel = true;
}
AdjustColumnWidth();
}
void lstWatch_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
{
AdjustColumnWidth();
}
private void AdjustColumnWidth()
{
lstWatch.ColumnWidthChanging -= lstWatch_ColumnWidthChanging;
lstWatch.ColumnWidthChanged -= lstWatch_ColumnWidthChanged;
//Force watch values to take the full width of the list
int totalWidth = lstWatch.Columns[0].Width + lstWatch.Columns[1].Width;
lstWatch.Columns[2].Width = lstWatch.ClientSize.Width - totalWidth;
lstWatch.ColumnWidthChanging += lstWatch_ColumnWidthChanging;
lstWatch.ColumnWidthChanged += lstWatch_ColumnWidthChanged;
}
public void UpdateWatch()
{
lstWatch.SelectedIndices.Clear();
//Remove empty items
for(int i = lstWatch.Items.Count - 1; i >= 0; i--) {
if(string.IsNullOrWhiteSpace(lstWatch.Items[i].Text)) {
lstWatch.Items.RemoveAt(i);
}
}
lstWatch.Items.Add("");
ListViewItem lastItem = lstWatch.Items[lstWatch.Items.Count - 1];
foreach(ListViewItem item in lstWatch.Items) {
item.UseItemStyleForSubItems = false;
if(item != lastItem) {
string previousValue = null;
if(item.SubItems.Count > 1) {
previousValue = item.SubItems[1].Text;
item.SubItems.RemoveAt(1);
}
item.SubItems[0].Text = item.SubItems[0].Text.ToUpper();
string newValue;
Byte memoryValue = InteropEmu.DebugGetMemoryValue((UInt32)item.Tag);
if(mnuHexDisplay.Checked) {
newValue = "$" + memoryValue.ToString("x").ToUpper();
} else {
newValue = memoryValue.ToString();
}
item.SubItems.Add(newValue);
item.SubItems[1].ForeColor = newValue != previousValue ? Color.Red : Color.Black;
}
}
AdjustColumnWidth();
}
public void AddWatch(UInt32 address)
{
ListViewItem item = lstWatch.Items.Insert(lstWatch.Items.Count - 1, "$" + address.ToString("x"));
item.Tag = address;
UpdateWatch();
}
private void lstWatch_AfterLabelEdit(object sender, LabelEditEventArgs e)
{
e.CancelEdit = true;
if(e.Label != null) {
ListViewItem item = lstWatch.Items[e.Item];
item.Text = e.Label;
if(!string.IsNullOrWhiteSpace(item.Text)) {
if(!item.Text.StartsWith("$")) {
item.Text = "$" + item.Text;
}
UInt32 address;
if(UInt32.TryParse(item.Text.Substring(1), System.Globalization.NumberStyles.AllowHexSpecifier, null, out address)) {
lstWatch.Items[e.Item].Tag = address;
} else {
item.Text = string.Empty;
}
}
UpdateWatch();
}
}
private void mnuRemoveWatch_Click(object sender, EventArgs e)
{
if(lstWatch.SelectedItems.Count >= 1) {
var itemsToRemove = new List<ListViewItem>();
foreach(ListViewItem item in lstWatch.SelectedItems) {
itemsToRemove.Add(item);
}
foreach(ListViewItem item in itemsToRemove) {
lstWatch.Items.Remove(item);
}
UpdateWatch();
}
}
private void mnuHexDisplay_Click(object sender, EventArgs e)
{
UpdateWatch();
}
private void lstWatch_SelectedIndexChanged(object sender, EventArgs e)
{
mnuRemoveWatch.Enabled = lstWatch.SelectedItems.Count >= 1;
}
}
}

View file

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuWatch.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

522
GUI.NET/Debugger/frmDebugger.Designer.cs generated Normal file
View file

@ -0,0 +1,522 @@
namespace Mesen.GUI.Debugger
{
partial class frmDebugger
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
if(_notifListener != null) {
_notifListener.Dispose();
_notifListener = null;
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmDebugger));
this.splitContainer = new System.Windows.Forms.SplitContainer();
this.tlpTop = new System.Windows.Forms.TableLayoutPanel();
this.contextMenuCode = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuShowNextStatement = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSetNextStatement = new System.Windows.Forms.ToolStripMenuItem();
this.tableLayoutPanel10 = new System.Windows.Forms.TableLayoutPanel();
this.grpBreakpoints = new System.Windows.Forms.GroupBox();
this.lstBreakpoints = new System.Windows.Forms.ListView();
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.contextMenuBreakpoints = new System.Windows.Forms.ContextMenuStrip(this.components);
this.mnuRemoveBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisableBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.mnuAddBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.grpWatch = new System.Windows.Forms.GroupBox();
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuContinue = new System.Windows.Forms.ToolStripMenuItem();
this.mnuBreak = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStepInto = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStepOver = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStepOut = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuToggleBreakpoint = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuRunOneFrame = new System.Windows.Forms.ToolStripMenuItem();
this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFind = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindNext = new System.Windows.Forms.ToolStripMenuItem();
this.mnuFindPrev = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGoTo = new System.Windows.Forms.ToolStripMenuItem();
this.mnuClose = new System.Windows.Forms.ToolStripMenuItem();
this.mnuView = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSplitView = new System.Windows.Forms.ToolStripMenuItem();
this.ctrlDebuggerCode = new Mesen.GUI.Debugger.ctrlDebuggerCode();
this.ctrlConsoleStatus = new Mesen.GUI.Debugger.ctrlConsoleStatus();
this.ctrlDebuggerCodeSplit = new Mesen.GUI.Debugger.ctrlDebuggerCode();
this.ctrlWatch = new Mesen.GUI.Debugger.ctrlWatch();
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit();
this.splitContainer.Panel1.SuspendLayout();
this.splitContainer.Panel2.SuspendLayout();
this.splitContainer.SuspendLayout();
this.tlpTop.SuspendLayout();
this.contextMenuCode.SuspendLayout();
this.tableLayoutPanel10.SuspendLayout();
this.grpBreakpoints.SuspendLayout();
this.contextMenuBreakpoints.SuspendLayout();
this.grpWatch.SuspendLayout();
this.menuStrip.SuspendLayout();
this.SuspendLayout();
//
// splitContainer
//
this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
this.splitContainer.Location = new System.Drawing.Point(0, 24);
this.splitContainer.Name = "splitContainer";
this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer.Panel1
//
this.splitContainer.Panel1.Controls.Add(this.tlpTop);
this.splitContainer.Panel1MinSize = 375;
//
// splitContainer.Panel2
//
this.splitContainer.Panel2.Controls.Add(this.tableLayoutPanel10);
this.splitContainer.Panel2MinSize = 50;
this.splitContainer.Size = new System.Drawing.Size(984, 588);
this.splitContainer.SplitterDistance = 422;
this.splitContainer.TabIndex = 1;
//
// tlpTop
//
this.tlpTop.ColumnCount = 3;
this.tlpTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tlpTop.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpTop.Controls.Add(this.ctrlDebuggerCode, 0, 0);
this.tlpTop.Controls.Add(this.ctrlConsoleStatus, 2, 0);
this.tlpTop.Controls.Add(this.ctrlDebuggerCodeSplit, 1, 0);
this.tlpTop.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpTop.Location = new System.Drawing.Point(0, 0);
this.tlpTop.Name = "tlpTop";
this.tlpTop.RowCount = 1;
this.tlpTop.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpTop.Size = new System.Drawing.Size(984, 422);
this.tlpTop.TabIndex = 2;
//
// contextMenuCode
//
this.contextMenuCode.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuShowNextStatement,
this.mnuSetNextStatement});
this.contextMenuCode.Name = "contextMenuWatch";
this.contextMenuCode.Size = new System.Drawing.Size(259, 48);
//
// mnuShowNextStatement
//
this.mnuShowNextStatement.Name = "mnuShowNextStatement";
this.mnuShowNextStatement.ShortcutKeyDisplayString = "Alt+*";
this.mnuShowNextStatement.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.Multiply)));
this.mnuShowNextStatement.Size = new System.Drawing.Size(258, 22);
this.mnuShowNextStatement.Text = "Show Next Statement";
//
// mnuSetNextStatement
//
this.mnuSetNextStatement.Name = "mnuSetNextStatement";
this.mnuSetNextStatement.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.F10)));
this.mnuSetNextStatement.Size = new System.Drawing.Size(258, 22);
this.mnuSetNextStatement.Text = "Set Next Statement";
//
// tableLayoutPanel10
//
this.tableLayoutPanel10.ColumnCount = 2;
this.tableLayoutPanel10.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel10.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel10.Controls.Add(this.grpBreakpoints, 0, 0);
this.tableLayoutPanel10.Controls.Add(this.grpWatch, 0, 0);
this.tableLayoutPanel10.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel10.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel10.Name = "tableLayoutPanel10";
this.tableLayoutPanel10.RowCount = 1;
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 195F));
this.tableLayoutPanel10.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 195F));
this.tableLayoutPanel10.Size = new System.Drawing.Size(984, 162);
this.tableLayoutPanel10.TabIndex = 0;
//
// grpBreakpoints
//
this.grpBreakpoints.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpBreakpoints.Controls.Add(this.lstBreakpoints);
this.grpBreakpoints.Location = new System.Drawing.Point(495, 3);
this.grpBreakpoints.Name = "grpBreakpoints";
this.grpBreakpoints.Size = new System.Drawing.Size(486, 156);
this.grpBreakpoints.TabIndex = 3;
this.grpBreakpoints.TabStop = false;
this.grpBreakpoints.Text = "Breakpoints";
//
// lstBreakpoints
//
this.lstBreakpoints.CheckBoxes = true;
this.lstBreakpoints.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader3,
this.columnHeader4});
this.lstBreakpoints.ContextMenuStrip = this.contextMenuBreakpoints;
this.lstBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
this.lstBreakpoints.FullRowSelect = true;
this.lstBreakpoints.GridLines = true;
this.lstBreakpoints.LabelEdit = true;
this.lstBreakpoints.Location = new System.Drawing.Point(3, 16);
this.lstBreakpoints.Name = "lstBreakpoints";
this.lstBreakpoints.Size = new System.Drawing.Size(480, 137);
this.lstBreakpoints.TabIndex = 5;
this.lstBreakpoints.UseCompatibleStateImageBehavior = false;
this.lstBreakpoints.View = System.Windows.Forms.View.Details;
//
// columnHeader3
//
this.columnHeader3.Text = "Address";
this.columnHeader3.Width = 59;
//
// columnHeader4
//
this.columnHeader4.Text = "Breakpoint Type";
this.columnHeader4.Width = 100;
//
// contextMenuBreakpoints
//
this.contextMenuBreakpoints.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuRemoveBreakpoint,
this.mnuDisableBreakpoint,
this.mnuAddBreakpoint});
this.contextMenuBreakpoints.Name = "contextMenuWatch";
this.contextMenuBreakpoints.Size = new System.Drawing.Size(173, 70);
//
// mnuRemoveBreakpoint
//
this.mnuRemoveBreakpoint.Name = "mnuRemoveBreakpoint";
this.mnuRemoveBreakpoint.Size = new System.Drawing.Size(172, 22);
this.mnuRemoveBreakpoint.Text = "Remove";
//
// mnuDisableBreakpoint
//
this.mnuDisableBreakpoint.Name = "mnuDisableBreakpoint";
this.mnuDisableBreakpoint.Size = new System.Drawing.Size(172, 22);
this.mnuDisableBreakpoint.Text = "Disable Breakpoint";
//
// mnuAddBreakpoint
//
this.mnuAddBreakpoint.Name = "mnuAddBreakpoint";
this.mnuAddBreakpoint.Size = new System.Drawing.Size(172, 22);
this.mnuAddBreakpoint.Text = "Add...";
//
// grpWatch
//
this.grpWatch.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.grpWatch.Controls.Add(this.ctrlWatch);
this.grpWatch.Location = new System.Drawing.Point(3, 3);
this.grpWatch.Name = "grpWatch";
this.grpWatch.Size = new System.Drawing.Size(486, 156);
this.grpWatch.TabIndex = 2;
this.grpWatch.TabStop = false;
this.grpWatch.Text = "Watch";
//
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem,
this.mnuView,
this.debugToolStripMenuItem,
this.searchToolStripMenuItem});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(984, 24);
this.menuStrip.TabIndex = 2;
this.menuStrip.Text = "menuStrip1";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuClose});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// debugToolStripMenuItem
//
this.debugToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuContinue,
this.mnuBreak,
this.mnuStepInto,
this.mnuStepOver,
this.mnuStepOut,
this.toolStripMenuItem1,
this.mnuToggleBreakpoint,
this.toolStripMenuItem2,
this.mnuRunOneFrame});
this.debugToolStripMenuItem.Name = "debugToolStripMenuItem";
this.debugToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.debugToolStripMenuItem.Text = "Debug";
//
// mnuContinue
//
this.mnuContinue.Name = "mnuContinue";
this.mnuContinue.ShortcutKeys = System.Windows.Forms.Keys.F5;
this.mnuContinue.Size = new System.Drawing.Size(190, 22);
this.mnuContinue.Text = "Continue";
this.mnuContinue.Click += new System.EventHandler(this.mnuContinue_Click);
//
// mnuBreak
//
this.mnuBreak.Name = "mnuBreak";
this.mnuBreak.ShortcutKeyDisplayString = "Ctrl+Alt+Break";
this.mnuBreak.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Alt)
| System.Windows.Forms.Keys.Cancel)));
this.mnuBreak.Size = new System.Drawing.Size(190, 22);
this.mnuBreak.Text = "Break";
this.mnuBreak.Click += new System.EventHandler(this.mnuBreak_Click);
//
// mnuStepInto
//
this.mnuStepInto.Name = "mnuStepInto";
this.mnuStepInto.ShortcutKeys = System.Windows.Forms.Keys.F11;
this.mnuStepInto.Size = new System.Drawing.Size(190, 22);
this.mnuStepInto.Text = "Step Into";
this.mnuStepInto.Click += new System.EventHandler(this.mnuStepInto_Click);
//
// mnuStepOver
//
this.mnuStepOver.Name = "mnuStepOver";
this.mnuStepOver.ShortcutKeys = System.Windows.Forms.Keys.F10;
this.mnuStepOver.Size = new System.Drawing.Size(190, 22);
this.mnuStepOver.Text = "Step Over";
this.mnuStepOver.Click += new System.EventHandler(this.mnuStepOver_Click);
//
// mnuStepOut
//
this.mnuStepOut.Name = "mnuStepOut";
this.mnuStepOut.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.F11)));
this.mnuStepOut.Size = new System.Drawing.Size(190, 22);
this.mnuStepOut.Text = "Step Out";
this.mnuStepOut.Click += new System.EventHandler(this.mnuStepOut_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(187, 6);
//
// mnuToggleBreakpoint
//
this.mnuToggleBreakpoint.Name = "mnuToggleBreakpoint";
this.mnuToggleBreakpoint.ShortcutKeys = System.Windows.Forms.Keys.F9;
this.mnuToggleBreakpoint.Size = new System.Drawing.Size(190, 22);
this.mnuToggleBreakpoint.Text = "Toggle Breakpoint";
this.mnuToggleBreakpoint.Click += new System.EventHandler(this.mnuToggleBreakpoint_Click);
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(187, 6);
//
// mnuRunOneFrame
//
this.mnuRunOneFrame.Name = "mnuRunOneFrame";
this.mnuRunOneFrame.ShortcutKeys = System.Windows.Forms.Keys.F12;
this.mnuRunOneFrame.Size = new System.Drawing.Size(190, 22);
this.mnuRunOneFrame.Text = "Run one frame";
this.mnuRunOneFrame.Click += new System.EventHandler(this.mnuRunOneFrame_Click);
//
// searchToolStripMenuItem
//
this.searchToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuFind,
this.mnuFindNext,
this.mnuFindPrev,
this.mnuGoTo});
this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
this.searchToolStripMenuItem.Size = new System.Drawing.Size(54, 20);
this.searchToolStripMenuItem.Text = "Search";
//
// mnuFind
//
this.mnuFind.Name = "mnuFind";
this.mnuFind.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this.mnuFind.Size = new System.Drawing.Size(196, 22);
this.mnuFind.Text = "Find...";
this.mnuFind.Click += new System.EventHandler(this.mnuFind_Click);
//
// mnuFindNext
//
this.mnuFindNext.Name = "mnuFindNext";
this.mnuFindNext.ShortcutKeys = System.Windows.Forms.Keys.F3;
this.mnuFindNext.Size = new System.Drawing.Size(196, 22);
this.mnuFindNext.Text = "Find Next";
//
// mnuFindPrev
//
this.mnuFindPrev.Name = "mnuFindPrev";
this.mnuFindPrev.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.F3)));
this.mnuFindPrev.Size = new System.Drawing.Size(196, 22);
this.mnuFindPrev.Text = "Find Previous";
//
// mnuGoTo
//
this.mnuGoTo.Name = "mnuGoTo";
this.mnuGoTo.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G)));
this.mnuGoTo.Size = new System.Drawing.Size(196, 22);
this.mnuGoTo.Text = "Go to...";
//
// mnuClose
//
this.mnuClose.Name = "mnuClose";
this.mnuClose.Size = new System.Drawing.Size(103, 22);
this.mnuClose.Text = "Close";
//
// mnuView
//
this.mnuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuSplitView});
this.mnuView.Name = "mnuView";
this.mnuView.Size = new System.Drawing.Size(44, 20);
this.mnuView.Text = "View";
//
// mnuSplitView
//
this.mnuSplitView.CheckOnClick = true;
this.mnuSplitView.Name = "mnuSplitView";
this.mnuSplitView.Size = new System.Drawing.Size(125, 22);
this.mnuSplitView.Text = "Split View";
this.mnuSplitView.Click += new System.EventHandler(this.mnuSplitView_Click);
//
// ctrlDebuggerCode
//
this.ctrlDebuggerCode.ContextMenuStrip = this.contextMenuCode;
this.ctrlDebuggerCode.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlDebuggerCode.Location = new System.Drawing.Point(3, 3);
this.ctrlDebuggerCode.Name = "ctrlDebuggerCode";
this.ctrlDebuggerCode.Size = new System.Drawing.Size(270, 416);
this.ctrlDebuggerCode.TabIndex = 2;
this.ctrlDebuggerCode.OnWatchAdded += new Mesen.GUI.Debugger.ctrlDebuggerCode.WatchAddedEventHandler(this.ctrlDebuggerCode_OnWatchAdded);
//
// ctrlConsoleStatus
//
this.ctrlConsoleStatus.Dock = System.Windows.Forms.DockStyle.Top;
this.ctrlConsoleStatus.Location = new System.Drawing.Point(552, 0);
this.ctrlConsoleStatus.Margin = new System.Windows.Forms.Padding(0);
this.ctrlConsoleStatus.Name = "ctrlConsoleStatus";
this.ctrlConsoleStatus.Size = new System.Drawing.Size(432, 362);
this.ctrlConsoleStatus.TabIndex = 3;
//
// ctrlDebuggerCodeSplit
//
this.ctrlDebuggerCodeSplit.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlDebuggerCodeSplit.Location = new System.Drawing.Point(279, 3);
this.ctrlDebuggerCodeSplit.Name = "ctrlDebuggerCodeSplit";
this.ctrlDebuggerCodeSplit.Size = new System.Drawing.Size(270, 416);
this.ctrlDebuggerCodeSplit.TabIndex = 4;
//
// ctrlWatch
//
this.ctrlWatch.Dock = System.Windows.Forms.DockStyle.Fill;
this.ctrlWatch.Location = new System.Drawing.Point(3, 16);
this.ctrlWatch.Name = "ctrlWatch";
this.ctrlWatch.Size = new System.Drawing.Size(480, 137);
this.ctrlWatch.TabIndex = 0;
//
// frmDebugger
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(984, 612);
this.Controls.Add(this.splitContainer);
this.Controls.Add(this.menuStrip);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip;
this.MinimumSize = new System.Drawing.Size(1000, 650);
this.Name = "frmDebugger";
this.Text = "Debugger";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.frmDebugger_FormClosed);
this.splitContainer.Panel1.ResumeLayout(false);
this.splitContainer.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit();
this.splitContainer.ResumeLayout(false);
this.tlpTop.ResumeLayout(false);
this.contextMenuCode.ResumeLayout(false);
this.tableLayoutPanel10.ResumeLayout(false);
this.grpBreakpoints.ResumeLayout(false);
this.contextMenuBreakpoints.ResumeLayout(false);
this.grpWatch.ResumeLayout(false);
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.SplitContainer splitContainer;
private System.Windows.Forms.TableLayoutPanel tlpTop;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel10;
private System.Windows.Forms.GroupBox grpBreakpoints;
private System.Windows.Forms.ListView lstBreakpoints;
private System.Windows.Forms.GroupBox grpWatch;
private System.Windows.Forms.MenuStrip menuStrip;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem;
private System.Windows.Forms.ContextMenuStrip contextMenuBreakpoints;
private System.Windows.Forms.ToolStripMenuItem mnuRemoveBreakpoint;
private System.Windows.Forms.ToolStripMenuItem mnuDisableBreakpoint;
private System.Windows.Forms.ToolStripMenuItem mnuAddBreakpoint;
private System.Windows.Forms.ToolStripMenuItem mnuContinue;
private System.Windows.Forms.ToolStripMenuItem mnuBreak;
private System.Windows.Forms.ToolStripMenuItem mnuStepInto;
private System.Windows.Forms.ToolStripMenuItem mnuStepOver;
private System.Windows.Forms.ToolStripMenuItem mnuStepOut;
private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem mnuFind;
private System.Windows.Forms.ToolStripMenuItem mnuFindNext;
private System.Windows.Forms.ToolStripMenuItem mnuFindPrev;
private System.Windows.Forms.ToolStripMenuItem mnuGoTo;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.ColumnHeader columnHeader4;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem mnuToggleBreakpoint;
private ctrlDebuggerCode ctrlDebuggerCode;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
private System.Windows.Forms.ToolStripMenuItem mnuRunOneFrame;
private System.Windows.Forms.ContextMenuStrip contextMenuCode;
private System.Windows.Forms.ToolStripMenuItem mnuShowNextStatement;
private System.Windows.Forms.ToolStripMenuItem mnuSetNextStatement;
private ctrlWatch ctrlWatch;
private ctrlConsoleStatus ctrlConsoleStatus;
private System.Windows.Forms.ToolStripMenuItem mnuClose;
private ctrlDebuggerCode ctrlDebuggerCodeSplit;
private System.Windows.Forms.ToolStripMenuItem mnuView;
private System.Windows.Forms.ToolStripMenuItem mnuSplitView;
}
}

View file

@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Debugger
{
public partial class frmDebugger : Form
{
InteropEmu.NotificationListener _notifListener;
public frmDebugger()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_notifListener = new InteropEmu.NotificationListener();
_notifListener.OnNotification += _notifListener_OnNotification;
InteropEmu.DebugInitialize();
InteropEmu.DebugStep(1);
}
void _notifListener_OnNotification(InteropEmu.NotificationEventArgs e)
{
if(e.NotificationType == InteropEmu.ConsoleNotificationType.CodeBreak) {
this.BeginInvoke((MethodInvoker)(() => UpdateDebugger()));
}
}
private bool UpdateSplitView()
{
if(mnuSplitView.Checked) {
tlpTop.ColumnStyles[1].SizeType = SizeType.Percent;
tlpTop.ColumnStyles[1].Width = 50f;
this.MinimumSize = new Size(1250, 650);
} else {
tlpTop.ColumnStyles[1].SizeType = SizeType.Absolute;
tlpTop.ColumnStyles[1].Width = 0f;
this.MinimumSize = new Size(1000, 650);
}
return mnuSplitView.Checked;
}
private void UpdateDebugger()
{
if(InteropEmu.DebugIsCodeChanged()) {
string code = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(InteropEmu.DebugGetCode());
ctrlDebuggerCode.Code = code;
ctrlDebuggerCodeSplit.Code = code;
}
DebugState state = new DebugState();
InteropEmu.DebugGetState(ref state);
if(UpdateSplitView()) {
ctrlDebuggerCodeSplit.UpdateCode(true);
}
ctrlDebuggerCode.SelectActiveAddress(state.CPU.PC);
ctrlConsoleStatus.UpdateStatus(ref state);
ctrlWatch.UpdateWatch();
}
private void ToggleBreakpoint()
{
this.ctrlDebuggerCode.HighlightLine(this.ctrlDebuggerCode.GetCurrentLine(), Color.FromArgb(158, 84, 94), Color.White);
//this.AddBreakpoint(this.GetLineAddress(lineIndex));
}
private void mnuContinue_Click(object sender, EventArgs e)
{
InteropEmu.DebugRun();
this.ctrlDebuggerCode.RemoveActiveHighlight();
}
private void frmDebugger_FormClosed(object sender, FormClosedEventArgs e)
{
InteropEmu.DebugRelease();
}
private void mnuToggleBreakpoint_Click(object sender, EventArgs e)
{
ToggleBreakpoint();
}
private void mnuBreak_Click(object sender, EventArgs e)
{
InteropEmu.DebugStep(1);
}
private void mnuStepInto_Click(object sender, EventArgs e)
{
InteropEmu.DebugStep(1);
}
private void mnuStepOut_Click(object sender, EventArgs e)
{
InteropEmu.DebugStepOut();
}
private void mnuStepOver_Click(object sender, EventArgs e)
{
InteropEmu.DebugStepOver();
}
private void mnuRunOneFrame_Click(object sender, EventArgs e)
{
InteropEmu.DebugStepCycles(29780);
}
private void ctrlDebuggerCode_OnWatchAdded(WatchAddedEventArgs args)
{
this.ctrlWatch.AddWatch(args.Address);
}
private void mnuFind_Click(object sender, EventArgs e)
{
}
private void mnuSplitView_Click(object sender, EventArgs e)
{
UpdateDebugger();
}
}
}

View file

@ -0,0 +1,418 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuCode.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>561, 17</value>
</metadata>
<metadata name="contextMenuBreakpoints.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>373, 17</value>
</metadata>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>107, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

View file

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms
{
public class BaseConfigForm : Form
{
protected override void OnFormClosed(FormClosedEventArgs e)
{
if(this.DialogResult == System.Windows.Forms.DialogResult.OK) {
UpdateConfig();
ConfigManager.ApplyChanges();
} else {
ConfigManager.RejectChanges();
}
base.OnFormClosed(e);
}
protected virtual void UpdateConfig()
{
}
}
}

View file

@ -0,0 +1,177 @@
namespace Mesen.GUI.Forms.Config
{
partial class frmVideoConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmVideoConfig));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.txtPort = new System.Windows.Forms.TextBox();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnCancel = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.lblHost = new System.Windows.Forms.Label();
this.lblPort = new System.Windows.Forms.Label();
this.txtHost = new System.Windows.Forms.TextBox();
this.chkSpectator = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel1.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.txtPort, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lblHost, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.lblPort, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.txtHost, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.chkSpectator, 0, 2);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(284, 262);
this.tableLayoutPanel1.TabIndex = 1;
//
// txtPort
//
this.txtPort.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPort.Location = new System.Drawing.Point(41, 29);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(240, 20);
this.txtPort.TabIndex = 6;
this.txtPort.Text = "8888";
//
// flowLayoutPanel1
//
this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2);
this.flowLayoutPanel1.Controls.Add(this.btnCancel);
this.flowLayoutPanel1.Controls.Add(this.btnOK);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 233);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(284, 29);
this.flowLayoutPanel1.TabIndex = 2;
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(206, 3);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(125, 3);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(75, 23);
this.btnOK.TabIndex = 1;
this.btnOK.Text = "Connect";
this.btnOK.UseVisualStyleBackColor = true;
//
// lblHost
//
this.lblHost.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblHost.AutoSize = true;
this.lblHost.Location = new System.Drawing.Point(3, 6);
this.lblHost.Name = "lblHost";
this.lblHost.Size = new System.Drawing.Size(32, 13);
this.lblHost.TabIndex = 3;
this.lblHost.Text = "Host:";
//
// lblPort
//
this.lblPort.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPort.AutoSize = true;
this.lblPort.Location = new System.Drawing.Point(3, 32);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(29, 13);
this.lblPort.TabIndex = 4;
this.lblPort.Text = "Port:";
//
// txtHost
//
this.txtHost.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtHost.Location = new System.Drawing.Point(41, 3);
this.txtHost.Name = "txtHost";
this.txtHost.Size = new System.Drawing.Size(240, 20);
this.txtHost.TabIndex = 5;
this.txtHost.Text = "127.0.0.1";
//
// chkSpectator
//
this.chkSpectator.AutoSize = true;
this.tableLayoutPanel1.SetColumnSpan(this.chkSpectator, 2);
this.chkSpectator.Enabled = false;
this.chkSpectator.Location = new System.Drawing.Point(3, 55);
this.chkSpectator.Name = "chkSpectator";
this.chkSpectator.Size = new System.Drawing.Size(106, 17);
this.chkSpectator.TabIndex = 7;
this.chkSpectator.Text = "Join as spectator";
this.chkSpectator.UseVisualStyleBackColor = true;
//
// frmVideoConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.tableLayoutPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "frmVideoConfig";
this.Text = "Video Options";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TextBox txtPort;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Label lblHost;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox txtHost;
private System.Windows.Forms.CheckBox chkSpectator;
}
}

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms.Config
{
public partial class frmVideoConfig : Form
{
public frmVideoConfig()
{
InitializeComponent();
}
}
}

View file

@ -0,0 +1,409 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

View file

@ -0,0 +1,186 @@
namespace Mesen.GUI.Forms.NetPlay
{
partial class frmClientConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmClientConfig));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.txtPort = new System.Windows.Forms.TextBox();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnCancel = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.lblHost = new System.Windows.Forms.Label();
this.lblPort = new System.Windows.Forms.Label();
this.txtHost = new System.Windows.Forms.TextBox();
this.chkSpectator = new System.Windows.Forms.CheckBox();
this.tableLayoutPanel1.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.txtPort, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lblHost, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.lblPort, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.txtHost, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.chkSpectator, 0, 2);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(290, 140);
this.tableLayoutPanel1.TabIndex = 0;
//
// txtPort
//
this.txtPort.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPort.Location = new System.Drawing.Point(41, 29);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(246, 20);
this.txtPort.TabIndex = 6;
this.txtPort.TextChanged += new System.EventHandler(this.Field_TextChanged);
//
// flowLayoutPanel1
//
this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2);
this.flowLayoutPanel1.Controls.Add(this.btnCancel);
this.flowLayoutPanel1.Controls.Add(this.btnOK);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 111);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(290, 29);
this.flowLayoutPanel1.TabIndex = 2;
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(212, 3);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(131, 3);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(75, 23);
this.btnOK.TabIndex = 1;
this.btnOK.Text = "Connect";
this.btnOK.UseVisualStyleBackColor = true;
//
// lblHost
//
this.lblHost.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblHost.AutoSize = true;
this.lblHost.Location = new System.Drawing.Point(3, 6);
this.lblHost.Name = "lblHost";
this.lblHost.Size = new System.Drawing.Size(32, 13);
this.lblHost.TabIndex = 3;
this.lblHost.Text = "Host:";
//
// lblPort
//
this.lblPort.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPort.AutoSize = true;
this.lblPort.Location = new System.Drawing.Point(3, 32);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(29, 13);
this.lblPort.TabIndex = 4;
this.lblPort.Text = "Port:";
//
// txtHost
//
this.txtHost.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtHost.Location = new System.Drawing.Point(41, 3);
this.txtHost.Name = "txtHost";
this.txtHost.Size = new System.Drawing.Size(246, 20);
this.txtHost.TabIndex = 5;
this.txtHost.TextChanged += new System.EventHandler(this.Field_TextChanged);
//
// chkSpectator
//
this.chkSpectator.AutoSize = true;
this.tableLayoutPanel1.SetColumnSpan(this.chkSpectator, 2);
this.chkSpectator.Enabled = false;
this.chkSpectator.Location = new System.Drawing.Point(3, 55);
this.chkSpectator.Name = "chkSpectator";
this.chkSpectator.Size = new System.Drawing.Size(106, 17);
this.chkSpectator.TabIndex = 7;
this.chkSpectator.Text = "Join as spectator";
this.chkSpectator.UseVisualStyleBackColor = true;
//
// frmClientConfig
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel;
this.ClientSize = new System.Drawing.Size(290, 140);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(306, 178);
this.MinimizeBox = false;
this.MinimumSize = new System.Drawing.Size(306, 178);
this.Name = "frmClientConfig";
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Connect...";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TextBox txtPort;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Label lblHost;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox txtHost;
private System.Windows.Forms.CheckBox chkSpectator;
}
}

View file

@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms.NetPlay
{
public partial class frmClientConfig : BaseConfigForm
{
public frmClientConfig()
{
InitializeComponent();
this.txtHost.Text = ConfigManager.Config.ClientConnectionInfo.Host;
this.txtPort.Text = ConfigManager.Config.ClientConnectionInfo.Port.ToString();
}
protected override void UpdateConfig()
{
ConfigManager.Config.ClientConnectionInfo = new ClientConnectionInfo() { Host = this.txtHost.Text, Port = Convert.ToUInt16(this.txtPort.Text) };
}
private void Field_TextChanged(object sender, EventArgs e)
{
UInt16 port;
if(!UInt16.TryParse(this.txtPort.Text, out port)) {
this.btnOK.Enabled = false;
} else {
this.btnOK.Enabled = !string.IsNullOrWhiteSpace(this.txtHost.Text);
}
}
}
}

View file

@ -0,0 +1,409 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

View file

@ -0,0 +1,171 @@
namespace Mesen.GUI.Forms.NetPlay
{
partial class frmPlayerProfile
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmPlayerProfile));
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnCancel = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.lblName = new System.Windows.Forms.Label();
this.lblAvatar = new System.Windows.Forms.Label();
this.txtPlayerName = new System.Windows.Forms.TextBox();
this.picAvatar = new System.Windows.Forms.PictureBox();
this.tableLayoutPanel1.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picAvatar)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.lblName, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.lblAvatar, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.txtPlayerName, 1, 0);
this.tableLayoutPanel1.Controls.Add(this.picAvatar, 1, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 4;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.Size = new System.Drawing.Size(302, 163);
this.tableLayoutPanel1.TabIndex = 1;
//
// flowLayoutPanel1
//
this.tableLayoutPanel1.SetColumnSpan(this.flowLayoutPanel1, 2);
this.flowLayoutPanel1.Controls.Add(this.btnCancel);
this.flowLayoutPanel1.Controls.Add(this.btnOK);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 134);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(302, 29);
this.flowLayoutPanel1.TabIndex = 2;
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(224, 3);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(143, 3);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(75, 23);
this.btnOK.TabIndex = 1;
this.btnOK.Text = "OK";
this.btnOK.UseVisualStyleBackColor = true;
//
// lblName
//
this.lblName.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblName.AutoSize = true;
this.lblName.Location = new System.Drawing.Point(3, 6);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(68, 13);
this.lblName.TabIndex = 3;
this.lblName.Text = "Player name:";
//
// lblAvatar
//
this.lblAvatar.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblAvatar.AutoSize = true;
this.lblAvatar.Location = new System.Drawing.Point(3, 55);
this.lblAvatar.Name = "lblAvatar";
this.lblAvatar.Size = new System.Drawing.Size(41, 13);
this.lblAvatar.TabIndex = 4;
this.lblAvatar.Text = "Avatar:";
//
// txtPlayerName
//
this.txtPlayerName.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPlayerName.Location = new System.Drawing.Point(77, 3);
this.txtPlayerName.Name = "txtPlayerName";
this.txtPlayerName.Size = new System.Drawing.Size(222, 20);
this.txtPlayerName.TabIndex = 5;
this.txtPlayerName.Text = "DefaultPlayer";
//
// picAvatar
//
this.picAvatar.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.picAvatar.Location = new System.Drawing.Point(77, 29);
this.picAvatar.Name = "picAvatar";
this.picAvatar.Size = new System.Drawing.Size(66, 66);
this.picAvatar.TabIndex = 8;
this.picAvatar.TabStop = false;
this.picAvatar.Click += new System.EventHandler(this.picAvatar_Click);
//
// frmPlayerProfile
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel;
this.ClientSize = new System.Drawing.Size(302, 163);
this.Controls.Add(this.tableLayoutPanel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "frmPlayerProfile";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Profile";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.picAvatar)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Label lblName;
private System.Windows.Forms.Label lblAvatar;
private System.Windows.Forms.TextBox txtPlayerName;
private System.Windows.Forms.PictureBox picAvatar;
}
}

View file

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms.NetPlay
{
public partial class frmPlayerProfile : BaseConfigForm
{
public frmPlayerProfile()
{
InitializeComponent();
this.txtPlayerName.Text = ConfigManager.Config.Profile.PlayerName;
this.picAvatar.Image = ConfigManager.Config.Profile.GetAvatarImage();
}
private void picAvatar_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "All supported image files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png";
if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
try {
this.picAvatar.Image = Image.FromFile(ofd.FileName).ResizeImage(64, 64);
} catch {
MessageBox.Show("Invalid image format.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
protected override void UpdateConfig()
{
PlayerProfile profile = new PlayerProfile();
profile.PlayerName = this.txtPlayerName.Text;
profile.SetAvatar(this.picAvatar.Image);
ConfigManager.Config.Profile = profile;
}
}
}

View file

@ -0,0 +1,409 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

View file

@ -0,0 +1,270 @@
namespace Mesen.GUI.Forms.NetPlay
{
partial class frmServerConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmServerConfig));
this.tlpMain = new System.Windows.Forms.TableLayoutPanel();
this.txtPort = new System.Windows.Forms.TextBox();
this.lblPort = new System.Windows.Forms.Label();
this.chkPublicServer = new System.Windows.Forms.CheckBox();
this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
this.btnCancel = new System.Windows.Forms.Button();
this.btnOK = new System.Windows.Forms.Button();
this.lblServerName = new System.Windows.Forms.Label();
this.txtServerName = new System.Windows.Forms.TextBox();
this.chkSpectator = new System.Windows.Forms.CheckBox();
this.lblMaxPlayers = new System.Windows.Forms.Label();
this.lblPassword = new System.Windows.Forms.Label();
this.txtPassword = new System.Windows.Forms.TextBox();
this.nudNbPlayers = new System.Windows.Forms.NumericUpDown();
this.tlpMain.SuspendLayout();
this.flowLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.nudNbPlayers)).BeginInit();
this.SuspendLayout();
//
// tlpMain
//
this.tlpMain.ColumnCount = 2;
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tlpMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpMain.Controls.Add(this.txtPort, 1, 1);
this.tlpMain.Controls.Add(this.lblPort, 0, 1);
this.tlpMain.Controls.Add(this.chkPublicServer, 0, 4);
this.tlpMain.Controls.Add(this.flowLayoutPanel1, 0, 6);
this.tlpMain.Controls.Add(this.lblServerName, 0, 0);
this.tlpMain.Controls.Add(this.txtServerName, 1, 0);
this.tlpMain.Controls.Add(this.chkSpectator, 0, 5);
this.tlpMain.Controls.Add(this.lblMaxPlayers, 0, 3);
this.tlpMain.Controls.Add(this.lblPassword, 0, 2);
this.tlpMain.Controls.Add(this.txtPassword, 1, 2);
this.tlpMain.Controls.Add(this.nudNbPlayers, 1, 3);
this.tlpMain.Dock = System.Windows.Forms.DockStyle.Fill;
this.tlpMain.Location = new System.Drawing.Point(0, 0);
this.tlpMain.Name = "tlpMain";
this.tlpMain.RowCount = 7;
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tlpMain.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tlpMain.Size = new System.Drawing.Size(302, 190);
this.tlpMain.TabIndex = 1;
//
// txtPort
//
this.txtPort.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPort.Location = new System.Drawing.Point(128, 29);
this.txtPort.Name = "txtPort";
this.txtPort.Size = new System.Drawing.Size(171, 20);
this.txtPort.TabIndex = 13;
this.txtPort.TextChanged += new System.EventHandler(this.Field_ValueChanged);
//
// lblPort
//
this.lblPort.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPort.AutoSize = true;
this.lblPort.Location = new System.Drawing.Point(3, 32);
this.lblPort.Name = "lblPort";
this.lblPort.Size = new System.Drawing.Size(29, 13);
this.lblPort.TabIndex = 12;
this.lblPort.Text = "Port:";
//
// chkPublicServer
//
this.chkPublicServer.AutoSize = true;
this.tlpMain.SetColumnSpan(this.chkPublicServer, 2);
this.chkPublicServer.Enabled = false;
this.chkPublicServer.Location = new System.Drawing.Point(3, 107);
this.chkPublicServer.Name = "chkPublicServer";
this.chkPublicServer.Size = new System.Drawing.Size(87, 17);
this.chkPublicServer.TabIndex = 11;
this.chkPublicServer.Text = "Public server";
this.chkPublicServer.UseVisualStyleBackColor = true;
this.chkPublicServer.CheckedChanged += new System.EventHandler(this.Field_ValueChanged);
//
// flowLayoutPanel1
//
this.tlpMain.SetColumnSpan(this.flowLayoutPanel1, 2);
this.flowLayoutPanel1.Controls.Add(this.btnCancel);
this.flowLayoutPanel1.Controls.Add(this.btnOK);
this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.flowLayoutPanel1.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
this.flowLayoutPanel1.Location = new System.Drawing.Point(0, 161);
this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutPanel1.Name = "flowLayoutPanel1";
this.flowLayoutPanel1.Size = new System.Drawing.Size(302, 29);
this.flowLayoutPanel1.TabIndex = 2;
//
// btnCancel
//
this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btnCancel.Location = new System.Drawing.Point(224, 3);
this.btnCancel.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 0;
this.btnCancel.Text = "Cancel";
this.btnCancel.UseVisualStyleBackColor = true;
//
// btnOK
//
this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btnOK.Location = new System.Drawing.Point(143, 3);
this.btnOK.Name = "btnOK";
this.btnOK.Size = new System.Drawing.Size(75, 23);
this.btnOK.TabIndex = 1;
this.btnOK.Text = "Start Server";
this.btnOK.UseVisualStyleBackColor = true;
//
// lblServerName
//
this.lblServerName.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblServerName.AutoSize = true;
this.lblServerName.Location = new System.Drawing.Point(3, 6);
this.lblServerName.Name = "lblServerName";
this.lblServerName.Size = new System.Drawing.Size(70, 13);
this.lblServerName.TabIndex = 3;
this.lblServerName.Text = "Server name:";
//
// txtServerName
//
this.txtServerName.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtServerName.Location = new System.Drawing.Point(128, 3);
this.txtServerName.Name = "txtServerName";
this.txtServerName.Size = new System.Drawing.Size(171, 20);
this.txtServerName.TabIndex = 5;
this.txtServerName.TextChanged += new System.EventHandler(this.Field_ValueChanged);
//
// chkSpectator
//
this.chkSpectator.AutoSize = true;
this.tlpMain.SetColumnSpan(this.chkSpectator, 2);
this.chkSpectator.Enabled = false;
this.chkSpectator.Location = new System.Drawing.Point(3, 130);
this.chkSpectator.Name = "chkSpectator";
this.chkSpectator.Size = new System.Drawing.Size(103, 17);
this.chkSpectator.TabIndex = 7;
this.chkSpectator.Text = "Allow spectators";
this.chkSpectator.UseVisualStyleBackColor = true;
this.chkSpectator.CheckedChanged += new System.EventHandler(this.Field_ValueChanged);
//
// lblMaxPlayers
//
this.lblMaxPlayers.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblMaxPlayers.AutoSize = true;
this.lblMaxPlayers.Location = new System.Drawing.Point(3, 84);
this.lblMaxPlayers.Name = "lblMaxPlayers";
this.lblMaxPlayers.Size = new System.Drawing.Size(119, 13);
this.lblMaxPlayers.TabIndex = 4;
this.lblMaxPlayers.Text = "Max. number of players:";
//
// lblPassword
//
this.lblPassword.Anchor = System.Windows.Forms.AnchorStyles.Left;
this.lblPassword.AutoSize = true;
this.lblPassword.Location = new System.Drawing.Point(3, 58);
this.lblPassword.Name = "lblPassword";
this.lblPassword.Size = new System.Drawing.Size(56, 13);
this.lblPassword.TabIndex = 9;
this.lblPassword.Text = "Password:";
//
// txtPassword
//
this.txtPassword.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtPassword.Location = new System.Drawing.Point(128, 55);
this.txtPassword.Name = "txtPassword";
this.txtPassword.Size = new System.Drawing.Size(171, 20);
this.txtPassword.TabIndex = 10;
this.txtPassword.UseSystemPasswordChar = true;
this.txtPassword.TextChanged += new System.EventHandler(this.Field_ValueChanged);
//
// nudNbPlayers
//
this.nudNbPlayers.Location = new System.Drawing.Point(128, 81);
this.nudNbPlayers.Maximum = new decimal(new int[] {
4,
0,
0,
0});
this.nudNbPlayers.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.nudNbPlayers.Name = "nudNbPlayers";
this.nudNbPlayers.Size = new System.Drawing.Size(39, 20);
this.nudNbPlayers.TabIndex = 8;
this.nudNbPlayers.Value = new decimal(new int[] {
4,
0,
0,
0});
this.nudNbPlayers.ValueChanged += new System.EventHandler(this.Field_ValueChanged);
//
// frmServerConfig
//
this.AcceptButton = this.btnOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel;
this.ClientSize = new System.Drawing.Size(302, 190);
this.Controls.Add(this.tlpMain);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "frmServerConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Server Configuration";
this.tlpMain.ResumeLayout(false);
this.tlpMain.PerformLayout();
this.flowLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.nudNbPlayers)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tlpMain;
private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Label lblServerName;
private System.Windows.Forms.Label lblMaxPlayers;
private System.Windows.Forms.TextBox txtServerName;
private System.Windows.Forms.CheckBox chkSpectator;
private System.Windows.Forms.NumericUpDown nudNbPlayers;
private System.Windows.Forms.CheckBox chkPublicServer;
private System.Windows.Forms.Label lblPassword;
private System.Windows.Forms.TextBox txtPassword;
private System.Windows.Forms.Label lblPort;
private System.Windows.Forms.TextBox txtPort;
}
}

View file

@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI.Forms.NetPlay
{
public partial class frmServerConfig : BaseConfigForm
{
public frmServerConfig()
{
InitializeComponent();
this.txtServerName.Text = ConfigManager.Config.ServerInfo.Name;
this.txtPort.Text = ConfigManager.Config.ServerInfo.Port.ToString();
this.txtPassword.Text = string.Empty;
this.nudNbPlayers.Value = ConfigManager.Config.ServerInfo.MaxPlayers;
this.chkSpectator.Checked = ConfigManager.Config.ServerInfo.AllowSpectators;
this.chkPublicServer.Checked = ConfigManager.Config.ServerInfo.PublicServer;
}
protected override void UpdateConfig()
{
ConfigManager.Config.ServerInfo = new ServerInfo() {
Name = this.txtServerName.Text,
Port = Convert.ToUInt16(this.txtPort.Text),
Password = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(this.txtPassword.Text))).Replace("-", ""),
MaxPlayers = (int)this.nudNbPlayers.Value,
AllowSpectators = this.chkSpectator.Checked,
PublicServer = this.chkPublicServer.Checked
};
}
private void Field_ValueChanged(object sender, EventArgs e)
{
UInt16 port;
if(!UInt16.TryParse(this.txtPort.Text, out port)) {
this.btnOK.Enabled = false;
} else {
this.btnOK.Enabled = !string.IsNullOrWhiteSpace(this.txtServerName.Text);
}
}
}
}

View file

@ -0,0 +1,409 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

526
GUI.NET/Forms/frmMain.Designer.cs generated Normal file
View file

@ -0,0 +1,526 @@
namespace Mesen.GUI.Forms
{
partial class frmMain
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if(disposing && (components != null)) {
components.Dispose();
}
if(_notifListener != null) {
_notifListener.Dispose();
_notifListener = null;
}
StopEmu();
InteropEmu.Release();
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain));
this.menuStrip = new System.Windows.Forms.MenuStrip();
this.mnuFile = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOpen = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator();
this.mnuRecentFiles = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator();
this.mnuExit = new System.Windows.Forms.ToolStripMenuItem();
this.mnuGame = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPause = new System.Windows.Forms.ToolStripMenuItem();
this.mnuReset = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStop = new System.Windows.Forms.ToolStripMenuItem();
this.mnuOptions = new System.Windows.Forms.ToolStripMenuItem();
this.mnuLimitFPS = new System.Windows.Forms.ToolStripMenuItem();
this.mnuShowFPS = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.mnuInputDevices = new System.Windows.Forms.ToolStripMenuItem();
this.mnuVideoConfig = new System.Windows.Forms.ToolStripMenuItem();
this.mnuAudioConfig = new System.Windows.Forms.ToolStripMenuItem();
this.mnuTools = new System.Windows.Forms.ToolStripMenuItem();
this.mnuNetPlay = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStartServer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStopServer = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator();
this.mnuFindServer = new System.Windows.Forms.ToolStripMenuItem();
this.mnuConnect = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDisconnect = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator();
this.mnuProfile = new System.Windows.Forms.ToolStripMenuItem();
this.mnuMovies = new System.Windows.Forms.ToolStripMenuItem();
this.mnuPlayMovie = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRecordFrom = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRecordFromStart = new System.Windows.Forms.ToolStripMenuItem();
this.mnuRecordFromNow = new System.Windows.Forms.ToolStripMenuItem();
this.mnuStopMovie = new System.Windows.Forms.ToolStripMenuItem();
this.mnuDebugger = new System.Windows.Forms.ToolStripMenuItem();
this.mnuTakeScreenshot = new System.Windows.Forms.ToolStripMenuItem();
this.mnuHelp = new System.Windows.Forms.ToolStripMenuItem();
this.mnuCheckForUpdates = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator();
this.mnuAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripSeparator();
this.mnuSaveState = new System.Windows.Forms.ToolStripMenuItem();
this.mnuLoadState = new System.Windows.Forms.ToolStripMenuItem();
this.mnuSaveState1 = new System.Windows.Forms.ToolStripMenuItem();
this.mnuLoadState1 = new System.Windows.Forms.ToolStripMenuItem();
this.dxViewer = new Mesen.GUI.Controls.DXViewer();
this.menuStrip.SuspendLayout();
this.SuspendLayout();
//
// menuStrip
//
this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuFile,
this.mnuGame,
this.mnuOptions,
this.mnuTools,
this.mnuHelp});
this.menuStrip.Location = new System.Drawing.Point(0, 0);
this.menuStrip.Name = "menuStrip";
this.menuStrip.Size = new System.Drawing.Size(365, 24);
this.menuStrip.TabIndex = 0;
this.menuStrip.Text = "menuStrip1";
//
// mnuFile
//
this.mnuFile.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuOpen,
this.toolStripMenuItem4,
this.mnuSaveState,
this.mnuLoadState,
this.toolStripMenuItem7,
this.mnuRecentFiles,
this.toolStripMenuItem6,
this.mnuExit});
this.mnuFile.Name = "mnuFile";
this.mnuFile.Size = new System.Drawing.Size(37, 20);
this.mnuFile.Text = "File";
//
// mnuOpen
//
this.mnuOpen.Name = "mnuOpen";
this.mnuOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
this.mnuOpen.Size = new System.Drawing.Size(146, 22);
this.mnuOpen.Text = "Open";
this.mnuOpen.Click += new System.EventHandler(this.mnuOpen_Click);
//
// toolStripMenuItem4
//
this.toolStripMenuItem4.Name = "toolStripMenuItem4";
this.toolStripMenuItem4.Size = new System.Drawing.Size(143, 6);
//
// mnuRecentFiles
//
this.mnuRecentFiles.Name = "mnuRecentFiles";
this.mnuRecentFiles.Size = new System.Drawing.Size(146, 22);
this.mnuRecentFiles.Text = "Recent Files";
//
// toolStripMenuItem6
//
this.toolStripMenuItem6.Name = "toolStripMenuItem6";
this.toolStripMenuItem6.Size = new System.Drawing.Size(143, 6);
//
// mnuExit
//
this.mnuExit.Name = "mnuExit";
this.mnuExit.Size = new System.Drawing.Size(146, 22);
this.mnuExit.Text = "Exit";
this.mnuExit.Click += new System.EventHandler(this.mnuExit_Click);
//
// mnuGame
//
this.mnuGame.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuPause,
this.mnuReset,
this.mnuStop});
this.mnuGame.Name = "mnuGame";
this.mnuGame.Size = new System.Drawing.Size(50, 20);
this.mnuGame.Text = "Game";
//
// mnuPause
//
this.mnuPause.Enabled = false;
this.mnuPause.Name = "mnuPause";
this.mnuPause.ShortcutKeyDisplayString = "Esc";
this.mnuPause.Size = new System.Drawing.Size(152, 22);
this.mnuPause.Text = "Pause";
this.mnuPause.Click += new System.EventHandler(this.mnuPause_Click);
//
// mnuReset
//
this.mnuReset.Enabled = false;
this.mnuReset.Name = "mnuReset";
this.mnuReset.Size = new System.Drawing.Size(152, 22);
this.mnuReset.Text = "Reset";
this.mnuReset.Click += new System.EventHandler(this.mnuReset_Click);
//
// mnuStop
//
this.mnuStop.Enabled = false;
this.mnuStop.Name = "mnuStop";
this.mnuStop.Size = new System.Drawing.Size(152, 22);
this.mnuStop.Text = "Stop";
this.mnuStop.Click += new System.EventHandler(this.mnuStop_Click);
//
// mnuOptions
//
this.mnuOptions.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuLimitFPS,
this.mnuShowFPS,
this.toolStripMenuItem1,
this.mnuInputDevices,
this.mnuVideoConfig,
this.mnuAudioConfig});
this.mnuOptions.Name = "mnuOptions";
this.mnuOptions.Size = new System.Drawing.Size(61, 20);
this.mnuOptions.Text = "Options";
//
// mnuLimitFPS
//
this.mnuLimitFPS.Checked = true;
this.mnuLimitFPS.CheckState = System.Windows.Forms.CheckState.Checked;
this.mnuLimitFPS.Name = "mnuLimitFPS";
this.mnuLimitFPS.ShortcutKeys = System.Windows.Forms.Keys.F9;
this.mnuLimitFPS.Size = new System.Drawing.Size(152, 22);
this.mnuLimitFPS.Text = "Limit FPS";
this.mnuLimitFPS.Click += new System.EventHandler(this.mnuLimitFPS_Click);
//
// mnuShowFPS
//
this.mnuShowFPS.Name = "mnuShowFPS";
this.mnuShowFPS.ShortcutKeys = System.Windows.Forms.Keys.F10;
this.mnuShowFPS.Size = new System.Drawing.Size(152, 22);
this.mnuShowFPS.Text = "Show FPS";
this.mnuShowFPS.Click += new System.EventHandler(this.mnuShowFPS_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(149, 6);
//
// mnuInputDevices
//
this.mnuInputDevices.Enabled = false;
this.mnuInputDevices.Name = "mnuInputDevices";
this.mnuInputDevices.Size = new System.Drawing.Size(152, 22);
this.mnuInputDevices.Text = "Input Devices";
//
// mnuVideoConfig
//
this.mnuVideoConfig.Enabled = false;
this.mnuVideoConfig.Name = "mnuVideoConfig";
this.mnuVideoConfig.Size = new System.Drawing.Size(152, 22);
this.mnuVideoConfig.Text = "Video";
this.mnuVideoConfig.Click += new System.EventHandler(this.mnuVideoConfig_Click);
//
// mnuAudioConfig
//
this.mnuAudioConfig.Enabled = false;
this.mnuAudioConfig.Name = "mnuAudioConfig";
this.mnuAudioConfig.Size = new System.Drawing.Size(152, 22);
this.mnuAudioConfig.Text = "Audio";
//
// mnuTools
//
this.mnuTools.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuNetPlay,
this.mnuMovies,
this.mnuDebugger,
this.mnuTakeScreenshot});
this.mnuTools.Name = "mnuTools";
this.mnuTools.Size = new System.Drawing.Size(48, 20);
this.mnuTools.Text = "Tools";
//
// mnuNetPlay
//
this.mnuNetPlay.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuStartServer,
this.mnuStopServer,
this.toolStripMenuItem2,
this.mnuFindServer,
this.mnuConnect,
this.mnuDisconnect,
this.toolStripMenuItem3,
this.mnuProfile});
this.mnuNetPlay.Name = "mnuNetPlay";
this.mnuNetPlay.Size = new System.Drawing.Size(185, 22);
this.mnuNetPlay.Text = "Net Play";
//
// mnuStartServer
//
this.mnuStartServer.Name = "mnuStartServer";
this.mnuStartServer.Size = new System.Drawing.Size(177, 22);
this.mnuStartServer.Text = "Start Server";
this.mnuStartServer.Click += new System.EventHandler(this.mnuStartServer_Click);
//
// mnuStopServer
//
this.mnuStopServer.Name = "mnuStopServer";
this.mnuStopServer.Size = new System.Drawing.Size(177, 22);
this.mnuStopServer.Text = "Stop Server";
this.mnuStopServer.Click += new System.EventHandler(this.mnuStopServer_Click);
//
// toolStripMenuItem2
//
this.toolStripMenuItem2.Name = "toolStripMenuItem2";
this.toolStripMenuItem2.Size = new System.Drawing.Size(174, 6);
//
// mnuFindServer
//
this.mnuFindServer.Enabled = false;
this.mnuFindServer.Name = "mnuFindServer";
this.mnuFindServer.Size = new System.Drawing.Size(177, 22);
this.mnuFindServer.Text = "Find Public Server...";
//
// mnuConnect
//
this.mnuConnect.Name = "mnuConnect";
this.mnuConnect.Size = new System.Drawing.Size(177, 22);
this.mnuConnect.Text = "Connect...";
this.mnuConnect.Click += new System.EventHandler(this.mnuConnect_Click);
//
// mnuDisconnect
//
this.mnuDisconnect.Name = "mnuDisconnect";
this.mnuDisconnect.Size = new System.Drawing.Size(177, 22);
this.mnuDisconnect.Text = "Disconnect";
this.mnuDisconnect.Click += new System.EventHandler(this.mnuDisconnect_Click);
//
// toolStripMenuItem3
//
this.toolStripMenuItem3.Name = "toolStripMenuItem3";
this.toolStripMenuItem3.Size = new System.Drawing.Size(174, 6);
//
// mnuProfile
//
this.mnuProfile.Name = "mnuProfile";
this.mnuProfile.Size = new System.Drawing.Size(177, 22);
this.mnuProfile.Text = "Configure Profile";
this.mnuProfile.Click += new System.EventHandler(this.mnuProfile_Click);
//
// mnuMovies
//
this.mnuMovies.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuPlayMovie,
this.mnuRecordFrom,
this.mnuStopMovie});
this.mnuMovies.Name = "mnuMovies";
this.mnuMovies.Size = new System.Drawing.Size(185, 22);
this.mnuMovies.Text = "Movies";
//
// mnuPlayMovie
//
this.mnuPlayMovie.Name = "mnuPlayMovie";
this.mnuPlayMovie.Size = new System.Drawing.Size(152, 22);
this.mnuPlayMovie.Text = "Play...";
this.mnuPlayMovie.Click += new System.EventHandler(this.mnuPlayMovie_Click);
//
// mnuRecordFrom
//
this.mnuRecordFrom.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuRecordFromStart,
this.mnuRecordFromNow});
this.mnuRecordFrom.Name = "mnuRecordFrom";
this.mnuRecordFrom.Size = new System.Drawing.Size(152, 22);
this.mnuRecordFrom.Text = "Record from...";
//
// mnuRecordFromStart
//
this.mnuRecordFromStart.Name = "mnuRecordFromStart";
this.mnuRecordFromStart.Size = new System.Drawing.Size(152, 22);
this.mnuRecordFromStart.Text = "Start";
this.mnuRecordFromStart.Click += new System.EventHandler(this.mnuRecordFromStart_Click);
//
// mnuRecordFromNow
//
this.mnuRecordFromNow.Name = "mnuRecordFromNow";
this.mnuRecordFromNow.Size = new System.Drawing.Size(152, 22);
this.mnuRecordFromNow.Text = "Now";
this.mnuRecordFromNow.Click += new System.EventHandler(this.mnuRecordFromNow_Click);
//
// mnuStopMovie
//
this.mnuStopMovie.Name = "mnuStopMovie";
this.mnuStopMovie.Size = new System.Drawing.Size(152, 22);
this.mnuStopMovie.Text = "Stop";
this.mnuStopMovie.Click += new System.EventHandler(this.mnuStopMovie_Click);
//
// mnuDebugger
//
this.mnuDebugger.Name = "mnuDebugger";
this.mnuDebugger.Size = new System.Drawing.Size(185, 22);
this.mnuDebugger.Text = "Debugger";
this.mnuDebugger.Click += new System.EventHandler(this.mnuDebugger_Click);
//
// mnuTakeScreenshot
//
this.mnuTakeScreenshot.Name = "mnuTakeScreenshot";
this.mnuTakeScreenshot.ShortcutKeys = System.Windows.Forms.Keys.F12;
this.mnuTakeScreenshot.Size = new System.Drawing.Size(185, 22);
this.mnuTakeScreenshot.Text = "Take Screenshot";
this.mnuTakeScreenshot.Click += new System.EventHandler(this.mnuTakeScreenshot_Click);
//
// mnuHelp
//
this.mnuHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuCheckForUpdates,
this.toolStripMenuItem5,
this.mnuAbout});
this.mnuHelp.Name = "mnuHelp";
this.mnuHelp.Size = new System.Drawing.Size(44, 20);
this.mnuHelp.Text = "Help";
//
// mnuCheckForUpdates
//
this.mnuCheckForUpdates.Enabled = false;
this.mnuCheckForUpdates.Name = "mnuCheckForUpdates";
this.mnuCheckForUpdates.Size = new System.Drawing.Size(170, 22);
this.mnuCheckForUpdates.Text = "Check for updates";
//
// toolStripMenuItem5
//
this.toolStripMenuItem5.Name = "toolStripMenuItem5";
this.toolStripMenuItem5.Size = new System.Drawing.Size(167, 6);
//
// mnuAbout
//
this.mnuAbout.Enabled = false;
this.mnuAbout.Name = "mnuAbout";
this.mnuAbout.Size = new System.Drawing.Size(170, 22);
this.mnuAbout.Text = "About";
//
// toolStripMenuItem7
//
this.toolStripMenuItem7.Name = "toolStripMenuItem7";
this.toolStripMenuItem7.Size = new System.Drawing.Size(143, 6);
//
// mnuSaveState
//
this.mnuSaveState.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuSaveState1});
this.mnuSaveState.Name = "mnuSaveState";
this.mnuSaveState.Size = new System.Drawing.Size(146, 22);
this.mnuSaveState.Text = "Save State";
this.mnuSaveState.DropDownOpening += new System.EventHandler(this.mnuSaveState_DropDownOpening);
//
// mnuLoadState
//
this.mnuLoadState.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.mnuLoadState1});
this.mnuLoadState.Name = "mnuLoadState";
this.mnuLoadState.Size = new System.Drawing.Size(146, 22);
this.mnuLoadState.Text = "Load State";
this.mnuLoadState.DropDownOpening += new System.EventHandler(this.mnuLoadState_DropDownOpening);
//
// mnuSaveState1
//
this.mnuSaveState1.Font = new System.Drawing.Font("Segoe UI", 9F);
this.mnuSaveState1.Name = "mnuSaveState1";
this.mnuSaveState1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.F1)));
this.mnuSaveState1.Size = new System.Drawing.Size(187, 22);
this.mnuSaveState1.Text = "1. <empty>";
this.mnuSaveState1.Click += new System.EventHandler(this.mnuSaveState1_Click);
//
// mnuLoadState1
//
this.mnuLoadState1.Name = "mnuLoadState1";
this.mnuLoadState1.ShortcutKeys = System.Windows.Forms.Keys.F1;
this.mnuLoadState1.Size = new System.Drawing.Size(155, 22);
this.mnuLoadState1.Text = "1. <empty>";
this.mnuLoadState1.Click += new System.EventHandler(this.mnuLoadState1_Click);
//
// dxViewer
//
this.dxViewer.BackColor = System.Drawing.Color.Black;
this.dxViewer.Location = new System.Drawing.Point(0, 24);
this.dxViewer.Margin = new System.Windows.Forms.Padding(0);
this.dxViewer.Name = "dxViewer";
this.dxViewer.Size = new System.Drawing.Size(1024, 896);
this.dxViewer.TabIndex = 1;
//
// frmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSize = true;
this.ClientSize = new System.Drawing.Size(365, 272);
this.Controls.Add(this.dxViewer);
this.Controls.Add(this.menuStrip);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip;
this.Name = "frmMain";
this.Text = "Mesen";
this.menuStrip.ResumeLayout(false);
this.menuStrip.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.MenuStrip menuStrip;
private System.Windows.Forms.ToolStripMenuItem mnuFile;
private System.Windows.Forms.ToolStripMenuItem mnuOpen;
private System.Windows.Forms.ToolStripMenuItem mnuGame;
private Mesen.GUI.Controls.DXViewer dxViewer;
private System.Windows.Forms.ToolStripMenuItem mnuPause;
private System.Windows.Forms.ToolStripMenuItem mnuReset;
private System.Windows.Forms.ToolStripMenuItem mnuStop;
private System.Windows.Forms.ToolStripMenuItem mnuOptions;
private System.Windows.Forms.ToolStripMenuItem mnuLimitFPS;
private System.Windows.Forms.ToolStripMenuItem mnuShowFPS;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem mnuInputDevices;
private System.Windows.Forms.ToolStripMenuItem mnuVideoConfig;
private System.Windows.Forms.ToolStripMenuItem mnuAudioConfig;
private System.Windows.Forms.ToolStripMenuItem mnuTools;
private System.Windows.Forms.ToolStripMenuItem mnuNetPlay;
private System.Windows.Forms.ToolStripMenuItem mnuStartServer;
private System.Windows.Forms.ToolStripMenuItem mnuStopServer;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2;
private System.Windows.Forms.ToolStripMenuItem mnuConnect;
private System.Windows.Forms.ToolStripMenuItem mnuDisconnect;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem3;
private System.Windows.Forms.ToolStripMenuItem mnuProfile;
private System.Windows.Forms.ToolStripMenuItem mnuMovies;
private System.Windows.Forms.ToolStripMenuItem mnuPlayMovie;
private System.Windows.Forms.ToolStripMenuItem mnuDebugger;
private System.Windows.Forms.ToolStripMenuItem mnuTakeScreenshot;
private System.Windows.Forms.ToolStripMenuItem mnuRecordFrom;
private System.Windows.Forms.ToolStripMenuItem mnuRecordFromStart;
private System.Windows.Forms.ToolStripMenuItem mnuRecordFromNow;
private System.Windows.Forms.ToolStripMenuItem mnuStopMovie;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem4;
private System.Windows.Forms.ToolStripMenuItem mnuExit;
private System.Windows.Forms.ToolStripMenuItem mnuFindServer;
private System.Windows.Forms.ToolStripMenuItem mnuHelp;
private System.Windows.Forms.ToolStripMenuItem mnuCheckForUpdates;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem5;
private System.Windows.Forms.ToolStripMenuItem mnuAbout;
private System.Windows.Forms.ToolStripMenuItem mnuRecentFiles;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem6;
private System.Windows.Forms.ToolStripMenuItem mnuSaveState;
private System.Windows.Forms.ToolStripMenuItem mnuLoadState;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem7;
private System.Windows.Forms.ToolStripMenuItem mnuSaveState1;
private System.Windows.Forms.ToolStripMenuItem mnuLoadState1;
}
}

353
GUI.NET/Forms/frmMain.cs Normal file
View file

@ -0,0 +1,353 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Mesen.GUI.Debugger;
using Mesen.GUI.Forms.NetPlay;
namespace Mesen.GUI.Forms
{
public partial class frmMain : Form
{
private InteropEmu.NotificationListener _notifListener;
private Thread _emuThread;
private Thread _renderThread;
private bool _stop = false;
public frmMain()
{
Application.ThreadException += Application_ThreadException;
InitializeComponent();
InteropEmu.InitializeEmu(this.Handle, this.dxViewer.Handle);
InteropEmu.SetFlags((int)EmulationFlags.LimitFPS);
_notifListener = new InteropEmu.NotificationListener();
_notifListener.OnNotification += _notifListener_OnNotification;
UpdateMenus();
UpdateRecentFiles();
StartRenderThread();
}
void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show(e.Exception.ToString(), "Unexpected Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
void _notifListener_OnNotification(InteropEmu.NotificationEventArgs e)
{
if(e.NotificationType == InteropEmu.ConsoleNotificationType.GameLoaded) {
this.StartEmuThread();
}
UpdateMenus();
}
private void mnuOpen_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "All supported formats (*.nes, *.zip)|*.NES;*.ZIP|NES Roms (*.nes)|*.NES|ZIP Archives (*.zip)|*.ZIP|All (*.*)|*.*";
if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
LoadROM(ofd.FileName);
}
}
private void LoadROM(string filename)
{
ConfigManager.Config.AddRecentFile(filename);
InteropEmu.LoadROM(filename);
UpdateRecentFiles();
}
private void UpdateMenus()
{
try {
if(this.InvokeRequired) {
this.BeginInvoke((MethodInvoker)(() => this.UpdateMenus()));
} else {
mnuSaveState.Enabled = mnuLoadState.Enabled = mnuPause.Enabled = mnuStop.Enabled = mnuReset.Enabled = (_emuThread != null && !InteropEmu.IsConnected());
mnuPause.Text = InteropEmu.IsPaused() ? "Resume" : "Pause";
bool netPlay = InteropEmu.IsServerRunning() || InteropEmu.IsConnected();
mnuStartServer.Enabled = !netPlay;
mnuStopServer.Enabled = !mnuStartServer.Enabled && !InteropEmu.IsConnected();
mnuConnect.Enabled = !netPlay;
mnuDisconnect.Enabled = !mnuConnect.Enabled && !InteropEmu.IsServerRunning();
bool moviePlaying = InteropEmu.MoviePlaying();
bool movieRecording = InteropEmu.MovieRecording();
mnuPlayMovie.Enabled = _emuThread != null && !netPlay && !moviePlaying && !movieRecording;
mnuStopMovie.Enabled = _emuThread != null && !netPlay && (moviePlaying || movieRecording);
mnuRecordFrom.Enabled = _emuThread != null && !moviePlaying && !movieRecording;
mnuRecordFromStart.Enabled = _emuThread != null && !InteropEmu.IsConnected() && !moviePlaying && !movieRecording;
mnuRecordFromNow.Enabled = _emuThread != null && !moviePlaying && !movieRecording;
mnuDebugger.Enabled = !netPlay && _emuThread != null;
mnuTakeScreenshot.Enabled = _emuThread != null;
}
} catch { }
}
private void UpdateRecentFiles()
{
mnuRecentFiles.DropDownItems.Clear();
foreach(string filepath in ConfigManager.Config.RecentFiles) {
ToolStripMenuItem tsmi = new ToolStripMenuItem();
tsmi.Text = System.IO.Path.GetFileName(filepath);
tsmi.Click += (object sender, EventArgs args) => {
LoadROM(filepath);
};
mnuRecentFiles.DropDownItems.Add(tsmi);
}
}
private void StartEmuThread()
{
if(_emuThread == null) {
_emuThread = new Thread(() => {
try {
InteropEmu.Run();
_emuThread = null;
} catch(Exception ex) {
MessageBox.Show(ex.Message);
}
});
_emuThread.Start();
}
UpdateMenus();
}
private void StartRenderThread()
{
_renderThread = new Thread(() => {
int count = 0;
while(true) {
InteropEmu.Render();
count++;
if(count == 20) {
count = 0;
UpdateMenus();
}
System.Threading.Thread.Sleep(5);
System.Threading.Thread.MemoryBarrier();
if(_stop) {
break;
}
}
});
_renderThread.Start();
}
private void StopEmu()
{
InteropEmu.Stop();
_stop = true;
_renderThread.Join();
}
private void PauseEmu()
{
if(InteropEmu.IsPaused()) {
InteropEmu.Resume();
} else {
InteropEmu.Pause();
}
}
private void ResetEmu()
{
InteropEmu.Reset();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if(keyData == Keys.Escape && _emuThread != null && mnuPause.Enabled) {
PauseEmu();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
const int NumberOfSaveSlots = 5;
private void InitializeStateMenu(ToolStripMenuItem menu, bool forSave)
{
menu.DropDownItems.Clear();
for(uint i = 1; i <= frmMain.NumberOfSaveSlots; i++) {
Int64 fileTime = InteropEmu.GetStateInfo(i);
string label;
if(fileTime == 0) {
label = i.ToString() + ". <empty>";
} else {
DateTime dateTime = DateTime.FromFileTime(fileTime);
label = i.ToString() + ". " + dateTime.ToShortDateString() + " " + dateTime.ToShortTimeString();
}
ToolStripMenuItem item = (ToolStripMenuItem)menu.DropDownItems.Add(label);
uint stateIndex = i;
item.Click += (object sender, EventArgs e) => {
if(forSave) {
InteropEmu.SaveState(stateIndex);
} else {
InteropEmu.LoadState(stateIndex);
}
};
item.ShortcutKeys = (Keys)((int)Keys.F1 + i - 1);
if(forSave) {
item.ShortcutKeys |= Keys.Shift;
}
}
}
#region Events
private void mnuPause_Click(object sender, EventArgs e)
{
PauseEmu();
}
private void mnuReset_Click(object sender, EventArgs e)
{
ResetEmu();
}
private void mnuStop_Click(object sender, EventArgs e)
{
InteropEmu.Stop();
}
private void mnuLimitFPS_Click(object sender, EventArgs e)
{
if(mnuLimitFPS.Checked) {
InteropEmu.ClearFlags((int)EmulationFlags.LimitFPS);
} else {
InteropEmu.SetFlags((int)EmulationFlags.LimitFPS);
}
mnuLimitFPS.Checked = !mnuLimitFPS.Checked;
}
private void mnuShowFPS_Click(object sender, EventArgs e)
{
}
private void mnuStartServer_Click(object sender, EventArgs e)
{
frmServerConfig frm = new frmServerConfig();
if(frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
InteropEmu.StartServer(ConfigManager.Config.ServerInfo.Port);
}
}
private void mnuConnect_Click(object sender, EventArgs e)
{
frmClientConfig frm = new frmClientConfig();
if(frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
InteropEmu.Connect(ConfigManager.Config.ClientConnectionInfo.Host, ConfigManager.Config.ClientConnectionInfo.Port, ConfigManager.Config.Profile.PlayerName, ConfigManager.Config.Profile.PlayerAvatar, (UInt16)ConfigManager.Config.Profile.PlayerAvatar.Length);
}
}
private void mnuProfile_Click(object sender, EventArgs e)
{
new frmPlayerProfile().ShowDialog();
}
private void mnuStopServer_Click(object sender, EventArgs e)
{
Task.Run(() => InteropEmu.StopServer());
}
private void mnuDisconnect_Click(object sender, EventArgs e)
{
Task.Run(() => InteropEmu.Disconnect());
}
private void mnuExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void mnuVideoConfig_Click(object sender, EventArgs e)
{
}
private void mnuDebugger_Click(object sender, EventArgs e)
{
new frmDebugger().Show();
}
private void mnuSaveState1_Click(object sender, EventArgs e)
{
InteropEmu.SaveState(1);
}
private void mnuLoadState1_Click(object sender, EventArgs e)
{
InteropEmu.LoadState(1);
}
private void mnuSaveState_DropDownOpening(object sender, EventArgs e)
{
InitializeStateMenu(mnuSaveState, true);
}
private void mnuLoadState_DropDownOpening(object sender, EventArgs e)
{
InitializeStateMenu(mnuLoadState, false);
}
private void mnuTakeScreenshot_Click(object sender, EventArgs e)
{
InteropEmu.TakeScreenshot();
}
#endregion
private enum EmulationFlags
{
LimitFPS = 0x01,
Paused = 0x02,
}
private void RecordMovie(bool resetEmu)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Movie files (*.mmo)|*.mmo|All (*.*)|*.*";
if(sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
InteropEmu.MovieRecord(sfd.FileName, resetEmu);
}
}
private void mnuPlayMovie_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Movie files (*.mmo)|*.mmo|All (*.*)|*.*";
if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
InteropEmu.MoviePlay(ofd.FileName);
}
}
private void mnuStopMovie_Click(object sender, EventArgs e)
{
InteropEmu.MovieStop();
}
private void mnuRecordFromStart_Click(object sender, EventArgs e)
{
RecordMovie(true);
}
private void mnuRecordFromNow_Click(object sender, EventArgs e)
{
RecordMovie(false);
}
}
}

412
GUI.NET/Forms/frmMain.resx Normal file
View file

@ -0,0 +1,412 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAMAEBAAAAAAGABoAwAANgAAACAgAAAAABgAqAwAAJ4DAABAQAAAAAAYACgyAABGEAAAKAAAABAA
AAAgAAAAAQAYAAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT0/////////////////////////7+/v7+/v///////////////////////9PT09PT
0////////////+np6cHBwaamppubm5qamqWlpb6+vuTk5P///////////9PT09PT0/////j4+Ly8vJqa
mpqamq2trb6+vr6+vq6urpubm5qamrW1tfT09P///9PT09PT0/b29qqqqpqamry8vPDw8Pz8/Ofn5+fn
5/z8/PPz88PDw5ubm6WlpfLy8tPT09PT07a2tpqamtbW1v///+Li4qKiopqampqamqKiouLi4v///9/f
35ubm7Ozs9PT09PT06WlpcPDw/////T09J6enp6enqmpqZqampqamp6envT09P///8XFxaWlpdPT09PT
0/f5/f7+/////9jY2JqamsTExO3t7ZqampqampqamtjY2P////7+//f5/dPT09PT0xxv/22i/////93d
3ZqamsbGxu/v75qampqampqamt3d3f///2mg/xxv/9PT09PT00CG/wRg/67L//v7+6mpqbq6uuHh4Zqa
mpqamqmpqfv7+5e9/wFf/0eL/9PT09PT093q/xtv/wJf/2mg/9ji9b29vaCgoKCgoL29vc/d9FeV/wBe
/yh3/+jw/9PT09PT0////+Pt/0SJ/wBe/wJf/zR//1uX/1qX/zF8/wFf/wBe/1eV/+70/////9PT09PT
0////////////7zU/1yY/x1w/wFf/wFf/x9x/2Kc/8jc/////////////9PT09PT0///////////////
//////////z9//z9/////////////////////////9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT0///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/Pz84eHhycnJtra2qqqqpKSkpKSkqqqqtra2x8fH3t7e+fn5////////////////////////////////
////09PT09PT////////////////////////////7u7uwcHBn5+fmpqampqampqampqampqampqampqa
mpqampqampqanJycubm54+Pj////////////////////////////09PT09PT////////////////////
8/Pzvb29m5ubmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqasLCw6Ojo
////////////////////09PT09PT////////////////2NjYn5+fmpqampqampqampqampqampqapqam
tbW1vb29vb29tbW1p6enmpqampqampqampqampqampqam5ubxcXF/Pz8////////////09PT09PT////
/////f39wcHBmpqampqampqampqampqarKys1NTU8/Pz////////////////////////9vb22tratbW1
mpqampqampqampqampqasLCw9vb2////////09PT09PT/////f39ubm5mpqampqampqampqaqqqq4eHh
////////////////////////////////////////////////7e3tt7e3mpqampqampqampqaq6ur9/f3
////09PT09PT////wcHBmpqampqampqampqayMjI/Pz8////////////7e3txMTEqqqqnZ2dnZ2dqqqq
xMTE7e3t////////////////29vbn5+fmpqampqampqatLS0/v7+09PT09PT3t7empqampqampqanJyc
3Nzc/////////////f39xsbGm5ubmpqampqampqampqampqampqam5ubxsbG/f39////////////7Ozs
o6Ojmpqampqampqa1tbW09PT09PTrKysmpqampqampqa3d3d/////////////v7+u7u7mpqampqampqa
mpqampqampqampqampqampqampqau7u7/v7+////////////6urqnZ2dmpqampqaqqqq09PT09PTnZ2d
mpqampqawcHB////////////////1dXVmpqampqampqampqampqampqampqampqampqampqampqampqa
1dXV////////////////xcXFmpqampqanZ2d09PT09PTz8/Pm5ubqKio8/Pz/////////////v7+pKSk
mpqampqampqavLy819fXpaWlmpqampqampqampqampqampqapaWl/v7+////////////8/PzqKiom5ub
0NDQ09PT09PT/////Pz8/v7+////////////////6+vrmpqampqampqanp6e/f39////19fXmpqampqa
mpqampqampqampqampqa6+vr/////////////////v7+/Pz8////09PT09PT////+Pr//v7/////////
////////3t7empqampqampqaoqKi////////3d3dmpqampqampqampqampqampqampqa3t7e////////
/////////v7/+Pr/////09PT09PTiLP/BWD/JXT/4ez/////////////4uLimpqampqampqaoqKi////
////3d3dmpqampqampqampqampqampqampqa4uLi////////////4ez/JXT/BWD/ibP/09PT09PTCmT/
AF7/AF7/b6P/////////////9vb2m5ubmpqampqaoqKi////////3d3dmpqampqampqampqampqampqa
m5ub9vb2////////////Y5z/AF7/AF7/CmT/09PT09PTKnj/AF7/AF7/B2L/zN7/////////////ubm5
mpqampqaoqKi////////3d3dmpqampqampqampqampqampqauLi4////////////qsj/AV//AF7/AF7/
Lnr/09PT09PTmr7/AF7/AF7/AF7/F2z/0eH/////////8PDwn5+fmpqam5ub8fHx////yMjImpqampqa
mpqampqampqan5+f8PDw////////qMf/BmH/AF7/AF7/AF7/rcv/09PT09PT/f3/Qof/AF7/AF7/AF7/
DWb/pcX/////////5eXloKCgmpqaoaGhsbGxmpqampqampqampqampqaoKCg5eXl////+fv/dqf/AV//
AF7/AF7/AF7/ZJz/////09PT09PT////7PL/Knj/AF7/AF7/AF7/AF7/Soz/0uL/////8fHxurq6m5ub
mpqampqampqampqam5uburq68fHx////tM//KXf/AF7/AF7/AF7/AF7/UI//+vz/////09PT09PT////
////6vH/OIH/AF7/AF7/AF7/AF7/AV//RYn/osP/6vH/9PT02trazs7Ozs7O2tra9PT04uz/k7r/L3v/
AF7/AF7/AF7/AF7/AF7/ZJz/+vz/////////09PT09PT////////////+Pr/bqP/Al//AF7/AF7/AF7/
AF7/AF7/AV7/InP/Ror/WJX/WZX/RYn/HnD/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ncH/////////////
////09PT09PT////////////////////xtr/OIH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al//WZb/4u3/////////////////////09PT09PT////////////////////
////////utP/UJD/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/DWb/ZZ3/1OP/////////
////////////////////09PT09PT////////////////////////////////////8PX/rMr/cqX/R4r/
Knj/G27/G27/Knj/SYv/d6n/ttD/9vn/////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
AAAAAAAA09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////+vr66Ojo2dnZzc3NxMTE
v7+/vLy8vLy8v7+/xcXFzc3N2NjY5ubm+Pj4////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////+fn53d3dwsLCqqqqmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqapaWlvLy81dXV8vLy////////////
////////////////////////////////////////////////////////////////////09PT09PT////
/////////////////////////////////////////////////////////////////Pz83Nzct7e3nJyc
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaq6urzc3N8/Pz////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////9fX1ysrK
oqKimpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqam5ubtra24uLi////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
9vb2xcXFnZ2dmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqara2t4ODg////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////f39z8/Pn5+fmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
sbGx6+vr////////////////////////////////////////////09PT09PT////////////////////
////////////////////6Ojoqqqqmpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqam5ubxsbG+/v7////////////////////////////////////09PT09PT////
/////////////////////////////f39ysrKm5ubmpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqaoqKirq6utbW1uLi4uLi4tbW1rq6uo6Ojmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqaqKio6urq////////////////////////////
////09PT09PT////////////////////////////9fX1sbGxmpqampqampqampqampqampqampqampqa
mpqampqampqampqampqanJyctLS0z8/P5eXl+fn5////////////////////////////////+/v76enp
1NTUvLy8oaGhmpqampqampqampqampqampqampqampqampqampqampqampqampqanJyc1tbW////////
////////////////////09PT09PT////////////////////////6+vrpKSkmpqampqampqampqampqa
mpqampqampqampqampqampqampqasrKy2NjY+fn5////////////////////////////////////////
/////////////////////////v7+5eXlwsLCn5+fmpqampqampqampqampqampqampqampqampqampqa
mpqampqaxcXF/v7+////////////////////09PT09PT////////////////////5OTkn5+fmpqampqa
mpqampqampqampqampqampqampqampqam5ubvr6+7Ozs////////////////////////////////////
////////////////////////////////////////////////////+vr61NTUpqammpqampqampqampqa
mpqampqampqampqampqampqampqavb29/v7+////////////////09PT09PT////////////////4+Pj
nZ2dmpqampqampqampqampqampqampqampqampqampqauLi47+/v////////////////////////////
/////////////////////////////////////////////////////////////////////////////f39
1dXVoqKimpqampqampqampqampqampqampqampqampqampqavb29/v7+////////////09PT09PT////
////////6OjonZ2dmpqampqampqampqampqampqampqampqampqapaWl4eHh////////////////////
////////////////////////+/v76enp3d3d19fX19fX3d3d6enp+/v7////////////////////////
////////////////////+fn5w8PDmpqampqampqampqampqampqampqampqampqampqaxsbG////////
////09PT09PT////////8vLyoaGhmpqampqampqampqampqampqampqampqampqavr6++fn5////////
////////////////////////////9vb20NDQsLCwm5ubmpqampqampqampqampqampqam5ubsLCw0NDQ
9vb2////////////////////////////////////////5OTkpKSkmpqampqampqampqampqampqampqa
mpqampqa29vb////////09PT09PT/////f39rq6umpqampqampqampqampqampqampqampqanJyc19fX
////////////////////////////////////9/f3xMTEnZ2dmpqampqampqampqampqampqampqampqa
mpqampqampqampqanZ2dxMTE9/f3////////////////////////////////////9vb2sbGxmpqampqa
mpqampqampqampqampqampqan5+f8/Pz////09PT09PT////zMzMmpqampqampqampqampqampqampqa
mpqaoKCg5ubm////////////////////////////////////39/foqKimpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqaoqKi39/f////////////////////////////////
/////Pz8urq6mpqampqampqampqampqampqampqampqau7u7////09PT09PT8/PznZ2dmpqampqampqa
mpqampqampqampqaoaGh7Ozs////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqazMzM////////////
/////////////////////////f39urq6mpqampqampqampqampqampqampqampqa7Ozs09PT09PTx8fH
mpqampqampqampqampqampqampqanp6e6urq////////////////////////////////////ysrKmpqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqaysrK/////////////////////////////////////Pz8sLCwmpqampqampqampqampqampqampqa
w8PD09PT09PTpaWlmpqampqampqampqampqampqampqa3t7e////////////////////////////////
////2dnZmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqa2dnZ////////////////////////////////////8/Pzn5+fmpqampqa
mpqampqampqampqapaWl09PT09PTm5ubmpqampqampqampqampqampqav7+/////////////////////
////////////////8/Pznp6empqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqan5+f8/Pz////////////////////////////////
////zc3Nmpqampqampqampqampqampqam5ub09PT09PTrKysmpqampqampqampqampqam5ub8vLy////
////////////////////////////////vb29mpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29////////////////
////////////////////8/PzmpqampqampqampqampqampqarKys09PT09PT39/fmpqampqampqampqa
mpqawsLC////////////////////////////////////8fHxmpqampqampqampqampqampqampqampqa
mpqasLCwxcXFrq6umpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam5ub
8fHx////////////////////////////////////wsLCmpqampqampqampqampqa39/f09PT09PT////
3d3dqKiompqaoKCgysrK/f39////////////////////////////////////zMzMmpqampqampqampqa
mpqampqampqampqazs7O////////////yMjImpqampqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqazMzM/////////////////////////////////////f39ysrKoKCgmpqaqKio3d3d
////09PT09PT////////////+/v7/v7+////////////////////////////////////////////r6+v
mpqampqampqampqampqampqampqaqqqq/////////////////f39paWlmpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqar6+v////////////////////////////////////////////
/v7++/v7////////////09PT09PT////////////////////////////////////////////////////
/////////f39nJycmpqampqampqampqampqampqampqavb29////////////////////uLi4mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqanJyc/v7+////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////9PT0mpqampqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqa9PT0////////
////////////////////////////////////////////////////09PT09PT////////////+vz//f7/
////////////////////////////////////////7+/vmpqampqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqa7u7u/////////////////////////////////////////f7/+vz/////////////09PT09PT////
rMn/J3X/Al7/FGn/fKr/+/z/////////////////////////////////8/Pzmpqampqampqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqampqampqa8/Pz////////////////////////////////+/z/e6r/FGn/Al7/KHX/rMn/
////09PT09PTsMv/AV7/AF7/AF7/AF7/AF7/aJ7//////////////////////////////////Pz8m5ub
mpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqa
mpqampqampqampqampqampqampqampqam5ub/f39////////////////////////////////aJ7/AF7/
AF7/AF7/AF7/Al//sMz/09PT09PTMHv/AF7/AF7/AF7/AF7/AF7/A1//4+3/////////////////////
////////////rKysmpqampqampqampqampqampqampqavr6+////////////////////ubm5mpqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqarKys////////////////////////////
////3+r/Al7/AF7/AF7/AF7/AF7/AF7/MHv/09PT09PTBGD/AF7/AF7/AF7/AF7/AF7/AF7/hbD/////
////////////////////////////x8fHmpqampqampqampqampqampqampqavr6+////////////////
////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqax8fH////////////
////////////////////YZr/AF7/AF7/AF7/AF7/AF7/AF7/BGD/09PT09PTHm//AF7/AF7/AF7/AF7/
AF7/AF7/D2b/4uz/////////////////////////////7Ozsmpqampqampqampqampqampqampqavr6+
////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqampqampqampqampqa
7Ozs////////////////////////////rcr/AV7/AF7/AF7/AF7/AF7/AF7/AF7/HnD/09PT09PTaZ//
AF7/AF7/AF7/AF7/AF7/AF7/AF7/OoH/+Pr/////////////////////////////tbW1mpqampqampqa
mpqampqampqavr6+////////////////////ubm5mpqampqampqampqampqampqampqampqampqampqa
mpqampqampqatbW1////////////////////////////zN7/DGX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
dKX/09PT09PTz+D/AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH//P3/////////////////////////
7e3tm5ubmpqampqampqampqampqauLi4////////////////////srKympqampqampqampqampqampqa
mpqampqampqampqampqampqanJyc7e3t////////////////////////0OD/FGn/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/CWP/4+z/09PT09PT////VJH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/VZH/+fv/////
////////////////////zs7OmpqampqampqampqampqanZ2d8vLy////////////7e3tm5ubmpqampqa
mpqampqampqampqampqampqampqampqampqampqazs7O////////////////////////wtf/EWj/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/gK3/////09PT09PT////4ez/Dmb/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/PYP/6fD//////////////////////v7+vb29mpqampqampqampqampqaqKio4+Pj+fn54ODg
paWlmpqampqampqampqampqampqampqampqampqampqampqampqavLy8/v7+////////////////////
nL//B2L/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/NH3/+vv/////09PT09PT////////pcX/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/G27/vtX//////////////////////f39vb29mpqampqampqampqa
mpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqavb29/f39////////
////////8fb/Xpj/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/3+r/////////09PT09PT////
////////c6T/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Al//bKD/8fb/////////////////////
0NDQnJycmpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqanJyc0NDQ
////////////////////ttD/H3D/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CmT/xtr/////////
////09PT09PT/////////////f3/WZX/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/GGz/mL3/
+/z/////////////////7u7utra2mpqampqampqampqampqampqampqampqampqampqampqampqampqa
mpqatra27u7u////////////////2OX/T47/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/
utL/////////////////09PT09PT////////////////+vz/WZT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/InL/lbr/9Pj/////////////////6urqwsLCoqKimpqampqampqampqampqampqa
mpqampqaoqKiwsLC6urq////////////////0+L/XZf/BGD/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/DWX/vdT/////////////////////09PT09PT/////////////////////P3/bqL/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/EGf/Z53/wdb//P3//////////////v7+7e3t2tra
zs7OyMjIyMjIzs7O2tra7e3t/v7+////////////8PX/oMH/P4T/AV7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/HG7/z9//////////////////////////09PT09PT////////////////////
////////mL3/BmH/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/WJT/lrv/
ytz/9fn/////////////////////////////////8fb/wdb/iLL/RIj/B2L/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/PYP/5+//////////////////////////////09PT09PT////
////////////////////////////zN7/JnT/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/Al7/Gm3/NH3/Ron/To7/T47/R4n/NH3/GGz/AV3/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/A1//fKv/+/z/////////////////////////////
////09PT09PT////////////////////////////////////9Pj/cKP/Al//AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Knf/x9r/////////////////////
////////////////////09PT09PT////////////////////////////////////////////zd7/PIP/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/Dmb/ibP/+fv/////////
////////////////////////////////////09PT09PT////////////////////////////////////
/////////////v7/sc3/MXz/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/CWP/cKP/6fH/
////////////////////////////////////////////////////09PT09PT////////////////////
/////////////////////////////////////v//uNH/Sov/Al7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/FWr/
e6r/5+//////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////4Or/hLD/LXj/AV7/
AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
BmH/TI3/qcf/9/r/////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////3en/l7z/V5P/HW//AV7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/AF7/
A17/KXb/Zp3/q8n/7/X/////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
/////////////////////////////////////////v//7PL/wtf/n8H/g6//bqL/YJn/WZT/WJT/X5n/
bqL/hLD/osP/x9r/8fb/////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////09PT09PT////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////09PT09PT////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////09PT09PT////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////09PT09PT////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT
09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

185
GUI.NET/GUI.NET.csproj Normal file
View file

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{08D83A7E-52A9-451E-A53A-1A7946F8BB77}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Mesen.GUI</RootNamespace>
<AssemblyName>Mesen</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>..\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ConfigManager\ConfigManager.cs" />
<Compile Include="Controls\DXViewer.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Controls\DXViewer.Designer.cs">
<DependentUpon>DXViewer.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\Controls\ctrlConsoleStatus.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlConsoleStatus.Designer.cs">
<DependentUpon>ctrlConsoleStatus.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\Controls\ctrlDebuggerCode.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlDebuggerCode.Designer.cs">
<DependentUpon>ctrlDebuggerCode.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\Controls\ctrlSyncTextBox.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlWatch.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="Debugger\Controls\ctrlWatch.Designer.cs">
<DependentUpon>ctrlWatch.cs</DependentUpon>
</Compile>
<Compile Include="Debugger\frmDebugger.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Debugger\frmDebugger.Designer.cs">
<DependentUpon>frmDebugger.cs</DependentUpon>
</Compile>
<Compile Include="Forms\BaseConfigForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\Config\frmVideoConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\Config\frmVideoConfig.Designer.cs">
<DependentUpon>frmVideoConfig.cs</DependentUpon>
</Compile>
<Compile Include="Forms\NetPlay\frmClientConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\NetPlay\frmClientConfig.Designer.cs">
<DependentUpon>frmClientConfig.cs</DependentUpon>
</Compile>
<Compile Include="Forms\frmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\frmMain.Designer.cs">
<DependentUpon>frmMain.cs</DependentUpon>
</Compile>
<Compile Include="Forms\NetPlay\frmPlayerProfile.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\NetPlay\frmPlayerProfile.Designer.cs">
<DependentUpon>frmPlayerProfile.cs</DependentUpon>
</Compile>
<Compile Include="Forms\NetPlay\frmServerConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms\NetPlay\frmServerConfig.Designer.cs">
<DependentUpon>frmServerConfig.cs</DependentUpon>
</Compile>
<Compile Include="InteropEmu.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Debugger\Controls\ctrlConsoleStatus.resx">
<DependentUpon>ctrlConsoleStatus.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\Controls\ctrlDebuggerCode.resx">
<DependentUpon>ctrlDebuggerCode.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\Controls\ctrlWatch.resx">
<DependentUpon>ctrlWatch.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Debugger\frmDebugger.resx">
<DependentUpon>frmDebugger.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\Config\frmVideoConfig.resx">
<DependentUpon>frmVideoConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\frmMain.resx">
<DependentUpon>frmMain.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\NetPlay\frmClientConfig.resx">
<DependentUpon>frmClientConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\NetPlay\frmPlayerProfile.resx">
<DependentUpon>frmPlayerProfile.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms\NetPlay\frmServerConfig.resx">
<DependentUpon>frmServerConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Icon.ico" />
<None Include="Resources\MesenLogo.bmp" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

BIN
GUI.NET/Icon.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

BIN
GUI.NET/Icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

195
GUI.NET/InteropEmu.cs Normal file
View file

@ -0,0 +1,195 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Mesen.GUI
{
public class InteropEmu
{
private const string DLLPath = "WinMesen.dll";
[DllImport(DLLPath)] public static extern void InitializeEmu(IntPtr windowHandle, IntPtr dxViewerHandle);
[DllImport(DLLPath)] public static extern void Release();
[DllImport(DLLPath)] public static extern void LoadROM([MarshalAs(UnmanagedType.LPWStr)]string filename);
[DllImport(DLLPath)] public static extern void Run();
[DllImport(DLLPath)] public static extern void Pause();
[DllImport(DLLPath)] public static extern void Resume();
[DllImport(DLLPath)] public static extern bool IsPaused();
[DllImport(DLLPath)] public static extern void Stop();
[DllImport(DLLPath)] public static extern void Reset();
[DllImport(DLLPath)] public static extern void SetFlags(int flags);
[DllImport(DLLPath)] public static extern void ClearFlags(int flags);
[DllImport(DLLPath)] public static extern void StartServer(UInt16 port);
[DllImport(DLLPath)] public static extern void StopServer();
[DllImport(DLLPath)] public static extern bool IsServerRunning();
[DllImport(DLLPath)] public static extern void Connect(string host, UInt16 port, [MarshalAs(UnmanagedType.LPWStr)]string playerName, byte[] avatarData, UInt32 avatarSize);
[DllImport(DLLPath)] public static extern void Disconnect();
[DllImport(DLLPath)] public static extern bool IsConnected();
[DllImport(DLLPath)] public static extern void Render();
[DllImport(DLLPath)] public static extern IntPtr RegisterNotificationCallback(NotificationListener.NotificationCallback callback);
[DllImport(DLLPath)] public static extern void UnregisterNotificationCallback(IntPtr notificationListener);
[DllImport(DLLPath)] public static extern void TakeScreenshot();
[DllImport(DLLPath)] public static extern void MoviePlay([MarshalAs(UnmanagedType.LPWStr)]string filename);
[DllImport(DLLPath)] public static extern void MovieRecord([MarshalAs(UnmanagedType.LPWStr)]string filename, bool reset);
[DllImport(DLLPath)] public static extern void MovieStop();
[DllImport(DLLPath)] public static extern bool MoviePlaying();
[DllImport(DLLPath)] public static extern bool MovieRecording();
[DllImport(DLLPath)] public static extern void SaveState(UInt32 stateIndex);
[DllImport(DLLPath)] public static extern void LoadState(UInt32 stateIndex);
[DllImport(DLLPath)] public static extern Int64 GetStateInfo(UInt32 stateIndex);
[DllImport(DLLPath)] public static extern void DebugInitialize();
[DllImport(DLLPath)] public static extern void DebugRelease();
[DllImport(DLLPath)] public static extern void DebugGetState(ref DebugState state);
//[DllImport(DLLPath)] public static extern void DebugSetBreakpoints();
[DllImport(DLLPath)] public static extern void DebugStep(UInt32 count);
[DllImport(DLLPath)] public static extern void DebugStepCycles(UInt32 count);
[DllImport(DLLPath)] public static extern void DebugStepOut();
[DllImport(DLLPath)] public static extern void DebugStepOver();
[DllImport(DLLPath)] public static extern void DebugRun();
[DllImport(DLLPath)] public static extern bool DebugIsCodeChanged();
[DllImport(DLLPath)] public static extern IntPtr DebugGetCode();
[DllImport(DLLPath)] public static extern Byte DebugGetMemoryValue(UInt32 addr);
[DllImport(DLLPath)] public static extern UInt32 DebugGetRelativeAddress(UInt32 addr);
public enum ConsoleNotificationType
{
GameLoaded = 0,
StateLoaded = 1,
GameReset = 2,
GamePaused = 3,
GameResumed = 4,
GameStopped = 5,
CodeBreak = 6,
}
public class NotificationEventArgs
{
public ConsoleNotificationType NotificationType;
}
public class NotificationListener : IDisposable
{
public delegate void NotificationCallback(int type);
public delegate void NotificationEventHandler(NotificationEventArgs e);
public event NotificationEventHandler OnNotification;
//Need to keep a reference to this callback, or it will get garbage collected (since the only reference to it is on the native side)
NotificationCallback _callback;
IntPtr _notificationListener;
public NotificationListener()
{
_callback = (int type) => {
this.ProcessNotification(type);
};
_notificationListener = InteropEmu.RegisterNotificationCallback(_callback);
}
public void Dispose()
{
InteropEmu.UnregisterNotificationCallback(_notificationListener);
}
public void ProcessNotification(int type)
{
if(this.OnNotification != null) {
this.OnNotification(new NotificationEventArgs() { NotificationType = (ConsoleNotificationType)type });
}
}
}
}
public struct DebugState
{
public CPUState CPU;
public PPUDebugState PPU;
}
public struct PPUDebugState
{
public PPUControlFlags ControlFlags;
public PPUStatusFlags StatusFlags;
public PPUState State;
public Int32 Scanline;
public UInt32 Cycle;
}
public struct PPUState
{
public Byte Control;
public Byte Mask;
public Byte Status;
public UInt32 SpriteRamAddr;
public UInt16 VideoRamAddr;
public Byte XScroll;
public UInt16 TmpVideoRamAddr;
public Byte WriteToggle;
public UInt16 HighBitShift;
public UInt16 LowBitShift;
}
public struct PPUControlFlags
{
public Byte VerticalWrite;
public UInt16 SpritePatternAddr;
public UInt16 BackgroundPatternAddr;
public Byte LargeSprites;
public Byte VBlank;
public Byte Grayscale;
public Byte BackgroundMask;
public Byte SpriteMask;
public Byte BackgroundEnabled;
public Byte SpritesEnabled;
public Byte IntensifyRed;
public Byte IntensifyGreen;
public Byte IntensifyBlue;
}
public struct PPUStatusFlags
{
public Byte SpriteOverflow;
public Byte Sprite0Hit;
public Byte VerticalBlank;
}
public struct CPUState
{
public UInt16 PC;
public Byte SP;
public Byte A;
public Byte X;
public Byte Y;
public Byte PS;
public IRQSource IRQFlag;
public bool NMIFlag;
};
[Flags]
public enum IRQSource : uint
{
External = 1,
FrameCounter = 2,
DMC = 4,
}
[Flags]
public enum PSFlags
{
Carry = 0x01,
Zero = 0x02,
Interrupt = 0x04,
Decimal = 0x08,
Break = 0x10,
Reserved = 0x20,
Overflow = 0x40,
Negative = 0x80
}
}

22
GUI.NET/Program.cs Normal file
View file

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesen.GUI
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Mesen.GUI.Forms.frmMain());
}
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Mesen")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Mesen")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("c8d4fadf-6247-47bc-8cd5-4c2e29812c3c")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

73
GUI.NET/Properties/Resources.Designer.cs generated Normal file
View file

@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18408
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Mesen.GUI.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Mesen.GUI.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap MesenLogo {
get {
object obj = ResourceManager.GetObject("MesenLogo", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="MesenLogo" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\MesenLogo.bmp;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

26
GUI.NET/Properties/Settings.Designer.cs generated Normal file
View file

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18408
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Mesen.GUI.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View file

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -99,37 +99,14 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="DebugWindow.h" />
<ClInclude Include="DirectXTK\Audio.h" />
<ClInclude Include="DirectXTK\CommonStates.h" />
<ClInclude Include="DirectXTK\DDSTextureLoader.h" />
<ClInclude Include="DirectXTK\DirectXHelpers.h" />
<ClInclude Include="DirectXTK\Effects.h" />
<ClInclude Include="DirectXTK\GeometricPrimitive.h" />
<ClInclude Include="DirectXTK\Model.h" />
<ClInclude Include="DirectXTK\PrimitiveBatch.h" />
<ClInclude Include="DirectXTK\ScreenGrab.h" />
<ClInclude Include="DirectXTK\SimpleMath.h" />
<ClInclude Include="DirectXTK\SpriteBatch.h" />
<ClInclude Include="DirectXTK\SpriteFont.h" />
<ClInclude Include="DirectXTK\VertexTypes.h" />
<ClInclude Include="DirectXTK\WICTextureLoader.h" />
<ClInclude Include="DirectXTK\XboxDDSTextureLoader.h" />
<ClInclude Include="GamePad.h" />
<ClInclude Include="InputManager.h" />
<ClInclude Include="NavigationHistory.h" />
<ClInclude Include="Renderer.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="SoundManager.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="MainWindow.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="DebugWindow.cpp" />
<ClCompile Include="GamePad.cpp" />
<ClCompile Include="InputManager.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="Renderer.cpp" />
<ClCompile Include="SoundManager.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
@ -157,7 +134,6 @@
<None Include="Calibri.30.spritefont">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="DirectXTK\SimpleMath.inl" />
</ItemGroup>
<ItemGroup>
<Content Include="Calibri.30.spritefont">

View file

@ -13,9 +13,6 @@
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Header Files\DirectXTK">
<UniqueIdentifier>{e3fb11e9-60dd-47df-8444-72d62eb07828}</UniqueIdentifier>
</Filter>
<Filter Include="Debugger">
<UniqueIdentifier>{5c2b5caf-e71a-40cc-823a-625c65ee7cb2}</UniqueIdentifier>
</Filter>
@ -27,66 +24,9 @@
<ClInclude Include="MainWindow.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Renderer.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\Audio.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\CommonStates.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\DDSTextureLoader.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\DirectXHelpers.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\Effects.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\GeometricPrimitive.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\Model.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\PrimitiveBatch.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\ScreenGrab.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\SimpleMath.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\SpriteBatch.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\SpriteFont.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\VertexTypes.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\WICTextureLoader.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="DirectXTK\XboxDDSTextureLoader.h">
<Filter>Header Files\DirectXTK</Filter>
</ClInclude>
<ClInclude Include="InputManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="GamePad.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SoundManager.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DebugWindow.h">
<Filter>Debugger</Filter>
</ClInclude>
@ -104,18 +44,6 @@
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="Renderer.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="InputManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GamePad.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SoundManager.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DebugWindow.cpp">
<Filter>Debugger</Filter>
</ClCompile>
@ -134,9 +62,6 @@
</Image>
</ItemGroup>
<ItemGroup>
<None Include="DirectXTK\SimpleMath.inl">
<Filter>Header Files\DirectXTK</Filter>
</None>
<None Include="Calibri.30.spritefont">
<Filter>Resource Files</Filter>
</None>

View file

@ -0,0 +1,130 @@
#include "stdafx.h"
#include "../Core/MessageManager.h"
#include "../Core/Console.h"
#include "../Windows/Renderer.h"
#include "../Windows/SoundManager.h"
#include "../Windows/InputManager.h"
#include "../Core/GameServer.h"
#include "../Core/GameClient.h"
#include "../Core/ClientConnectionData.h"
#include "../Core/SaveStateManager.h"
static NES::Renderer *_renderer = nullptr;
static SoundManager *_soundManager = nullptr;
static InputManager *_inputManager = nullptr;
static HWND _windowHandle = nullptr;
static HWND _viewerHandle = nullptr;
typedef void (__stdcall *NotificationListenerCallback)(int);
namespace InteropEmu {
class InteropNotificationListener : public INotificationListener
{
NotificationListenerCallback _callback;
public:
InteropNotificationListener(NotificationListenerCallback callback)
{
_callback = callback;
}
void ProcessNotification(ConsoleNotificationType type)
{
_callback((int)type);
}
};
extern "C" {
DllExport void __stdcall InitializeEmu(HWND windowHandle, HWND dxViewerHandle)
{
_windowHandle = windowHandle;
_viewerHandle = dxViewerHandle;
_renderer = new NES::Renderer(_viewerHandle);
MessageManager::RegisterMessageManager(_renderer);
_renderer->SetFlags(NES::UIFlags::ShowFPS);
_soundManager = new SoundManager(_windowHandle);
_inputManager = new InputManager(_windowHandle, 0);
}
DllExport void __stdcall LoadROM(wchar_t* filename) { Console::LoadROM(filename); }
DllExport void __stdcall Run()
{
if(Console::GetInstance()) {
Console::GetInstance()->Run();
}
}
DllExport void __stdcall Resume() { Console::ClearFlags(EmulationFlags::Paused); }
DllExport int __stdcall IsPaused() { return Console::CheckFlag(EmulationFlags::Paused); }
DllExport void __stdcall Stop()
{
if(Console::GetInstance()) {
Console::GetInstance()->Stop();
}
}
DllExport void __stdcall Reset() { Console::Reset(); }
DllExport void __stdcall SetFlags(int flags) { Console::SetFlags(flags); }
DllExport void __stdcall ClearFlags(int flags) { Console::ClearFlags(flags); }
DllExport void __stdcall StartServer(uint16_t port) { GameServer::StartServer(port); }
DllExport void __stdcall StopServer() { GameServer::StopServer(); }
DllExport int __stdcall IsServerRunning() { return GameServer::Started(); }
DllExport void __stdcall Connect(char* host, uint16_t port, wchar_t* playerName, uint8_t* avatarData, uint32_t avatarSize)
{
shared_ptr<ClientConnectionData> connectionData(new ClientConnectionData(
host,
port,
playerName,
avatarData,
avatarSize
));
GameClient::Connect(connectionData);
}
DllExport void __stdcall Disconnect() { GameClient::Disconnect(); }
DllExport int __stdcall IsConnected() { return GameClient::Connected(); }
DllExport void __stdcall Pause()
{
if(!IsConnected()) {
Console::SetFlags(EmulationFlags::Paused);
}
}
DllExport void __stdcall Release()
{
GameServer::StopServer();
GameClient::Disconnect();
MessageManager::RegisterMessageManager(nullptr);
delete _renderer;
delete _soundManager;
delete _inputManager;
}
DllExport void __stdcall Render() { _renderer->Render(); }
DllExport void __stdcall TakeScreenshot() { _renderer->TakeScreenshot(Console::GetROMPath()); }
DllExport INotificationListener* __stdcall RegisterNotificationCallback(NotificationListenerCallback callback)
{
INotificationListener* listener = new InteropNotificationListener(callback);
MessageManager::RegisterNotificationListener(listener);
return listener;
}
DllExport void __stdcall UnregisterNotificationCallback(INotificationListener *listener) { MessageManager::UnregisterNotificationListener(listener); }
DllExport void __stdcall SaveState(uint32_t stateIndex) { SaveStateManager::SaveState(stateIndex); }
DllExport uint32_t __stdcall LoadState(uint32_t stateIndex) { return SaveStateManager::LoadState(stateIndex); }
DllExport int64_t __stdcall GetStateInfo(uint32_t stateIndex) { return SaveStateManager::GetStateInfo(stateIndex); }
DllExport void __stdcall MoviePlay(wchar_t* filename) { Movie::Play(filename); }
DllExport void __stdcall MovieRecord(wchar_t* filename, int reset) { Movie::Record(filename, reset != 0); }
DllExport void __stdcall MovieStop() { Movie::Stop(); }
DllExport int __stdcall MoviePlaying() { return Movie::Playing(); }
DllExport int __stdcall MovieRecording() { return Movie::Recording(); }
}
}

View file

@ -0,0 +1,40 @@
#include "stdafx.h"
#include "../Core/Console.h"
#include "../Core/Debugger.h"
static shared_ptr<Debugger> _debugger = nullptr;
extern "C"
{
//Debugger wrapper
DllExport void __stdcall DebugInitialize()
{
_debugger = Console::GetInstance()->GetDebugger();
}
DllExport void __stdcall DebugRelease()
{
if(_debugger != nullptr) {
_debugger->Run();
_debugger.reset();
}
}
DllExport void __stdcall DebugGetState(DebugState *state) { _debugger->GetState(state); }
DllExport void DebugSetBreakpoints()
{
}
DllExport void __stdcall DebugRun() { _debugger->Run(); }
DllExport void __stdcall DebugStep(uint32_t count) { _debugger->Step(count); }
DllExport void __stdcall DebugStepCycles(uint32_t count) { _debugger->StepCycles(count); }
DllExport void __stdcall DebugStepOver() { _debugger->StepOver(); }
DllExport void __stdcall DebugStepOut() { _debugger->StepOut(); }
DllExport int __stdcall DebugIsCodeChanged() { return _debugger->IsCodeChanged(); }
DllExport const char* __stdcall DebugGetCode() { return _debugger->GetCode()->c_str(); }
DllExport uint8_t __stdcall DebugGetMemoryValue(uint32_t addr) { return _debugger->GetMemoryValue(addr); }
DllExport uint32_t __stdcall DebugGetRelativeAddress(uint32_t addr) { return _debugger->GetRelativeAddress(addr); }
};

View file

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{37749BB2-FA78-4EC9-8990-5628FC0BBA19}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>InteropDLL</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<TargetName>WinMesen</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<TargetName>WinMesen</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;INTEROPDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<CallingConvention>Cdecl</CallingConvention>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>Xinput9_1_0.lib;d3d11.lib;d3dcompiler.lib;dxguid.lib;winmm.lib;comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;INTEROPDLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Xinput9_1_0.lib;d3d11.lib;d3dcompiler.lib;dxguid.lib;winmm.lib;comctl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="ConsoleWrapper.cpp" />
<ClCompile Include="DebugWrapper.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ConsoleWrapper.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DebugWrapper.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

8
InteropDLL/stdafx.cpp Normal file
View file

@ -0,0 +1,8 @@
// stdafx.cpp : source file that includes just the standard includes
// InteropDLL.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

31
InteropDLL/stdafx.h Normal file
View file

@ -0,0 +1,31 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <tchar.h>
#ifdef _DEBUG
#pragma comment(lib, "../Debug/Core.lib")
#pragma comment(lib, "../Debug/Utilities.lib")
#pragma comment(lib, "../Debug/Windows.lib")
#pragma comment(lib, "../Windows/DirectXTK/DirectXTK.debug.lib")
#pragma comment(lib, "../Core/Nes_Apu/Nes_Apu.debug.lib")
#else
#pragma comment(lib, "../Release/Core.lib")
#pragma comment(lib, "../Release/Utilities.lib")
#pragma comment(lib, "../Release/Windows.lib")
#pragma comment(lib, "../Windows/DirectXTK/DirectXTK.lib")
#pragma comment(lib, "../Core/Nes_Apu/Nes_Apu.lib")
#endif
#define DllExport __declspec(dllexport)
// TODO: reference additional headers your program requires here

8
InteropDLL/targetver.h Normal file
View file

@ -0,0 +1,8 @@
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>

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