Merge branch 'master' into wii-network

Conflicts:
	CMakeLists.txt
	Source/Core/Core/Core.vcxproj
	Source/Core/DolphinWX/Dolphin.vcxproj
	Source/Core/DolphinWX/Dolphin.vcxproj.filters
	Source/Dolphin_2010.sln
	Source/VSProps/Dolphin.Win32.props
	Source/VSProps/Dolphin.x64.props
This commit is contained in:
Matthew Parlane
2013-08-16 19:17:07 +12:00
613 changed files with 28216 additions and 20036 deletions

View File

@ -11,6 +11,7 @@ set(LIBS core
if(NOT ANDROID)
if(USE_X11)
set(LIBS ${LIBS} ${X11_LIBRARIES}
${XINPUT2_LIBRARIES}
${XRANDR_LIBRARIES})
endif()
if(USE_WAYLAND)
@ -92,6 +93,7 @@ if(wxWidgets_FOUND)
else()
if(ANDROID)
set(SRCS Src/Android/TextureLoader.cpp
Src/Android/ButtonManager.cpp
Src/MainAndroid.cpp)
else()
set(SRCS Src/MainNoGUI.cpp)
@ -163,6 +165,10 @@ else()
set(DOLPHIN_EXE ${DOLPHIN_EXE_BASE}-nogui)
endif()
if(USE_UPNP)
set(LIBS ${LIBS} miniupnpc)
endif()
if(ANDROID)
add_library(${DOLPHIN_EXE} SHARED ${SRCS})
target_link_libraries(${DOLPHIN_EXE}
@ -172,6 +178,24 @@ if(ANDROID)
${LIBS}
"-Wl,--no-whole-archive"
)
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips")
set (SO_TARGET "mips")
endif()
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm")
set (SO_TARGET "armeabi-v7a")
endif()
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686")
set (SO_TARGET "x86")
endif()
add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD
COMMAND mkdir ARGS -p ${CMAKE_SOURCE_DIR}/Source/Android/libs/${SO_TARGET}
)
add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD
COMMAND cp ARGS ${CMAKE_SOURCE_DIR}/libs/${SO_TARGET}/lib${DOLPHIN_EXE}.so ${CMAKE_SOURCE_DIR}/Source/Android/libs/${SO_TARGET}/
)
add_custom_command(TARGET ${DOLPHIN_EXE} POST_BUILD
COMMAND cp ARGS ${CMAKE_SOURCE_DIR}/Data/Sys/GC/* ${CMAKE_SOURCE_DIR}/Source/Android/assets/
)
else()
add_executable(${DOLPHIN_EXE} ${SRCS})
target_link_libraries(${DOLPHIN_EXE} ${LIBS} ${WXLIBS})

View File

@ -130,7 +130,7 @@
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link />
<PostBuildEvent>
@ -141,11 +141,10 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</Command>
<Message>Copying Data\* to $(TargetDir)</Message>
</PostBuildEvent>
<Link />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link />
<PostBuildEvent>
@ -156,11 +155,10 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</Command>
<Message>Copying Data\* to $(TargetDir)</Message>
</PostBuildEvent>
<Link />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\polarssl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;..\..\..\Externals\polarssl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<OpenMPSupport>
</OpenMPSupport>
</ClCompile>
@ -173,11 +171,10 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</Command>
<Message>Copying Data\* to $(TargetDir)</Message>
</PostBuildEvent>
<Link />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|Win32'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link />
<PostBuildEvent>
@ -188,11 +185,10 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</Command>
<Message>Copying Data\* to $(TargetDir)</Message>
</PostBuildEvent>
<Link />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\polarssl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;..\..\..\Externals\polarssl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<OpenMPSupport>
</OpenMPSupport>
</ClCompile>
@ -207,12 +203,10 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</PostBuildEvent>
<ResourceCompile>
</ResourceCompile>
<Link />
<Link />
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|x64'">
<ClCompile>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\..\..\Externals\GLew\include;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\Core\Src;..\Core\Src\PowerPC\JitCommon;..\DebuggerWX\Src;..\..\..\Externals\Bochs_disasm;..\InputCommon\Src;..\DiscIO\Src;..\..\..\Externals\SFML\include;..\..\..\Externals\wxWidgets3;..\..\..\Externals\wxWidgets3\include;..\..\..\Externals\CLRun\include;..\..\..\Externals\miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link />
<PostBuildEvent>
@ -223,7 +217,6 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
</Command>
<Message>Copying Data\* to $(TargetDir)</Message>
</PostBuildEvent>
<Link />
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="Src\AboutDolphin.cpp" />
@ -354,6 +347,9 @@ xcopy "$(SolutionDir)..\Externals\SDL\$(PlatformName)\*.dll" "$(TargetDir)" /e /
<ProjectReference Include="..\..\..\Externals\LZO\LZO.vcxproj">
<Project>{d8890b98-26f7-4cff-bbfb-b95f371b5f20}</Project>
</ProjectReference>
<ProjectReference Include="..\..\..\Externals\miniupnpc\miniupnpc.vcxproj">
<Project>{a680190d-0764-485b-9cf3-a82c5edd5715}</Project>
</ProjectReference>
<ProjectReference Include="..\..\..\Externals\SFML\build\vc2010\SFML_Network.vcxproj">
<Project>{93d73454-2512-424e-9cda-4bb357fe13dd}</Project>
</ProjectReference>

View File

@ -0,0 +1,223 @@
// Copyright (C) 2003 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include <vector>
#include "GLInterface.h"
#include "Android/TextureLoader.h"
#include "Android/ButtonManager.h"
extern void DrawButton(GLuint tex, float *coords);
namespace ButtonManager
{
std::vector<Button*> m_buttons;
std::map<std::string, InputDevice*> m_controllers;
// XXX: This needs to not be here so we can load the locations from file
// This will allow customizable button locations in the future
// These are the OpenGL on screen coordinates
float m_coords[][8] = { // X, Y, X, EY, EX, EY, EX, Y
{0.75f, -1.0f, 0.75f, -0.75f, 1.0f, -0.75f, 1.0f, -1.0f}, // A
{0.50f, -1.0f, 0.50f, -0.75f, 0.75f, -0.75f, 0.75f, -1.0f}, // B
{-0.10f, -1.0f, -0.10f, -0.80f, 0.10f, -0.80f, 0.10f, -1.0f}, // Start
};
const char *configStrings[] = { "InputA",
"InputB",
"InputStart",
"InputX",
"InputY",
"InputZ",
"DPadUp",
"DPadDown",
"DPadLeft",
"DPadRight",
"MainUp",
"MainDown",
"MainLeft",
"MainRight",
"CStickUp",
"CStickDown",
"CStickLeft",
"CStickRight",
"InputL",
"InputR" };
const int configStringNum = 20;
void AddBind(std::string dev, sBind *bind)
{
auto it = m_controllers.find(dev);
if (it != m_controllers.end())
{
it->second->AddBind(bind);
return;
}
m_controllers[dev] = new InputDevice(dev);
m_controllers[dev]->AddBind(bind);
}
void Init()
{
// Initialize our touchscreen buttons
m_buttons.push_back(new Button("ButtonA.png", BUTTON_A, m_coords[0]));
m_buttons.push_back(new Button("ButtonB.png", BUTTON_B, m_coords[1]));
m_buttons.push_back(new Button("ButtonStart.png", BUTTON_START, m_coords[2]));
// Init our controller bindings
IniFile ini;
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string("Dolphin.ini"));
for (int a = 0; a < configStringNum; ++a)
{
BindType type;
int bindnum;
char dev[128];
bool hasbind = false;
char modifier = 0;
std::string value;
ini.Get("Android", configStrings[a], &value, "None");
if (value == "None")
continue;
if (std::string::npos != value.find("Axis"))
{
hasbind = true;
type = BIND_AXIS;
sscanf(value.c_str(), "Device '%[^\']'-Axis %d%c", dev, &bindnum, &modifier);
}
else if (std::string::npos != value.find("Button"))
{
hasbind = true;
type = BIND_BUTTON;
sscanf(value.c_str(), "Device '%[^\']'-Button %d", dev, &bindnum);
}
if (hasbind)
AddBind(std::string(dev), new sBind((ButtonType)a, type, bindnum, modifier == '-' ? -1.0f : 1.0f));
}
}
bool GetButtonPressed(ButtonType button)
{
bool pressed = false;
for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it)
if ((*it)->GetButtonType() == button)
pressed = (*it)->Pressed();
for (auto it = m_controllers.begin(); it != m_controllers.end(); ++it)
pressed |= it->second->ButtonValue(button);
return pressed;
}
float GetAxisValue(ButtonType axis)
{
auto it = m_controllers.begin();
if (it == m_controllers.end())
return 0.0f;
return it->second->AxisValue(axis);
}
void TouchEvent(int action, float x, float y)
{
// Actions
// 0 is press
// 1 is let go
// 2 is move
for (auto it = m_buttons.begin(); it != m_buttons.end(); ++it)
{
float *coords = (*it)->GetCoords();
if ( x >= coords[0] &&
x <= coords[4] &&
y >= coords[1] &&
y <= coords[3])
{
if (action == 0)
(*it)->SetState(BUTTON_PRESSED);
if (action == 1)
(*it)->SetState(BUTTON_RELEASED);
if (action == 2)
; // XXX: Be used later for analog stick
}
}
}
void GamepadEvent(std::string dev, int button, int action)
{
auto it = m_controllers.find(dev);
if (it != m_controllers.end())
{
it->second->PressEvent(button, action);
return;
}
m_controllers[dev] = new InputDevice(dev);
m_controllers[dev]->PressEvent(button, action);
}
void GamepadAxisEvent(std::string dev, int axis, float value)
{
auto it = m_controllers.find(dev);
if (it != m_controllers.end())
{
it->second->AxisEvent(axis, value);
return;
}
m_controllers[dev] = new InputDevice(dev);
m_controllers[dev]->AxisEvent(axis, value);
}
void Shutdown()
{
for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it)
delete *it;
for (auto it = m_controllers.begin(); it != m_controllers.end(); ++it)
delete it->second;
}
void DrawButtons()
{
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
for(auto it = m_buttons.begin(); it != m_buttons.end(); ++it)
DrawButton((*it)->GetTexture(), (*it)->GetCoords());
glDisable(GL_BLEND);
}
// InputDevice
void InputDevice::PressEvent(int button, int action)
{
m_buttons[button] = action == 0 ? true : false;
}
void InputDevice::AxisEvent(int axis, float value)
{
m_axises[axis] = value;
}
bool InputDevice::ButtonValue(ButtonType button)
{
auto it = m_binds.find(button);
if (it == m_binds.end())
return false;
if (it->second->m_bindtype == BIND_BUTTON)
return m_buttons[it->second->m_bind];
else
return AxisValue(button);
}
float InputDevice::AxisValue(ButtonType axis)
{
auto it = m_binds.find(axis);
if (it == m_binds.end())
return 0.0f;
if (it->second->m_bindtype == BIND_BUTTON)
return ButtonValue(axis);
else
return m_axises[it->second->m_bind] * it->second->m_neg;
}
}

View File

@ -0,0 +1,133 @@
// Copyright (C) 2003 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#pragma once
#include <string>
#include <map>
#include "CommonPaths.h"
#include "Android/TextureLoader.h"
namespace ButtonManager
{
enum ButtonType
{
BUTTON_A = 0,
BUTTON_B,
BUTTON_START,
BUTTON_X,
BUTTON_Y,
BUTTON_Z,
BUTTON_UP,
BUTTON_DOWN,
BUTTON_LEFT,
BUTTON_RIGHT,
STICK_MAIN_UP,
STICK_MAIN_DOWN,
STICK_MAIN_LEFT,
STICK_MAIN_RIGHT,
STICK_C_UP,
STICK_C_DOWN,
STICK_C_LEFT,
STICK_C_RIGHT,
TRIGGER_L,
TRIGGER_R
};
enum ButtonState
{
BUTTON_RELEASED = 0,
BUTTON_PRESSED = 1
};
enum BindType
{
BIND_BUTTON = 0,
BIND_AXIS
};
class Button
{
private:
GLuint m_tex;
ButtonType m_button;
ButtonState m_state;
float m_coords[8];
public:
Button(std::string filename, ButtonType button, float *coords)
{
m_tex = LoadPNG((std::string(DOLPHIN_DATA_DIR "/") + filename).c_str());
m_button = button;
memcpy(m_coords, coords, sizeof(float) * 8);
m_state = BUTTON_RELEASED;
}
Button(ButtonType button)
{
m_button = button;
m_state = BUTTON_RELEASED;
}
void SetState(ButtonState state) { m_state = state; }
bool Pressed() { return m_state == BUTTON_PRESSED; }
ButtonType GetButtonType() { return m_button; }
GLuint GetTexture() { return m_tex; }
float *GetCoords() { return m_coords; }
~Button() { if(m_tex) glDeleteTextures(1, &m_tex); }
};
struct sBind
{
const ButtonType m_buttontype;
const BindType m_bindtype;
const int m_bind;
const float m_neg;
sBind(ButtonType buttontype, BindType bindtype, int bind, float neg)
: m_buttontype(buttontype), m_bindtype(bindtype), m_bind(bind), m_neg(neg)
{}
};
class InputDevice
{
private:
std::string m_dev;
std::map<int, bool> m_buttons;
std::map<int, float> m_axises;
std::map<ButtonType, sBind*> m_binds;
public:
InputDevice(std::string dev)
{
m_dev = dev;
}
~InputDevice()
{
for (auto it = m_binds.begin(); it != m_binds.end(); ++it)
delete it->second;
}
void AddBind(sBind *bind) { m_binds[bind->m_buttontype] = bind; }
void PressEvent(int button, int action);
void AxisEvent(int axis, float value);
bool ButtonValue(ButtonType button);
float AxisValue(ButtonType axis);
};
void Init();
void DrawButtons();
bool GetButtonPressed(ButtonType button);
float GetAxisValue(ButtonType axis);
void TouchEvent(int action, float x, float y);
void GamepadEvent(std::string dev, int button, int action);
void GamepadAxisEvent(std::string dev, int axis, float value);
void Shutdown();
}

View File

@ -14,6 +14,7 @@
#include "WxUtils.h"
#define MAX_CHEAT_SEARCH_RESULTS_DISPLAY 256
const wxString title = _("Cheats Manager");
extern std::vector<ActionReplay::ARCode> arCodes;
extern CFrame* main_frame;
@ -22,26 +23,15 @@ extern CFrame* main_frame;
static wxCheatsWindow *g_cheat_window;
wxCheatsWindow::wxCheatsWindow(wxWindow* const parent)
: wxDialog(parent, wxID_ANY, _("Cheats Manager"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxDIALOG_NO_PARENT)
: wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxDIALOG_NO_PARENT)
{
::g_cheat_window = this;
// Create the GUI controls
Init_ChildControls();
// Load Data
Load_ARCodes();
// Load Gecko Codes :/
{
const DiscIO::IVolume* const vol = VolumeHandler::GetVolume();
if (vol)
{
m_gameini_path = File::GetUserPath(D_GAMECONFIG_IDX) + vol->GetUniqueID() + ".ini";
m_gameini.Load(m_gameini_path);
m_geckocode_panel->LoadCodes(m_gameini);
}
}
// load codes
UpdateGUI();
SetSize(wxSize(-1, 600));
Center();
@ -119,7 +109,7 @@ void wxCheatsWindow::Init_ChildControls()
m_Notebook_Main->AddPage(m_Tab_Log, _("Logging"));
// Button Strip
wxButton* const button_apply = new wxButton(panel, wxID_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize);
button_apply = new wxButton(panel, wxID_APPLY, _("Apply"), wxDefaultPosition, wxDefaultSize);
button_apply->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &wxCheatsWindow::OnEvent_ApplyChanges_Press, this);
wxButton* const button_cancel = new wxButton(panel, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize);
button_cancel->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &wxCheatsWindow::OnEvent_ButtonClose_Press, this);
@ -249,12 +239,34 @@ void wxCheatsWindow::OnEvent_Close(wxCloseEvent& ev)
Destroy();
}
// load codes for a new ISO ID
void wxCheatsWindow::UpdateGUI()
{
// load code
m_gameini_path = File::GetUserPath(D_GAMECONFIG_IDX) + Core::g_CoreStartupParameter.GetUniqueID() + ".ini";
m_gameini.Load(m_gameini_path);
Load_ARCodes();
Load_GeckoCodes();
// enable controls
button_apply->Enable(Core::IsRunning());
// write the ISO name in the title
if (Core::IsRunning())
SetTitle(title + ": " + Core::g_CoreStartupParameter.GetUniqueID() + " - " + Core::g_CoreStartupParameter.m_strName);
else
SetTitle(title);
}
void wxCheatsWindow::Load_ARCodes()
{
using namespace ActionReplay;
m_CheckListBox_CheatsList->Clear();
if (!Core::IsRunning())
return;
indexList.clear();
size_t size = GetCodeListSize();
for (size_t i = 0; i < size; i++)
@ -269,6 +281,11 @@ void wxCheatsWindow::Load_ARCodes()
}
}
void wxCheatsWindow::Load_GeckoCodes()
{
m_geckocode_panel->LoadCodes(m_gameini, Core::g_CoreStartupParameter.GetUniqueID(), true);
}
void wxCheatsWindow::OnEvent_CheatsList_ItemSelected(wxCommandEvent& WXUNUSED (event))
{
using namespace ActionReplay;

View File

@ -96,6 +96,7 @@ class wxCheatsWindow : public wxDialog
public:
wxCheatsWindow(wxWindow* const parent);
~wxCheatsWindow();
void UpdateGUI();
protected:
@ -105,6 +106,7 @@ class wxCheatsWindow : public wxDialog
};
// --- GUI Controls ---
wxButton* button_apply;
wxNotebook *m_Notebook_Main;
wxPanel *m_Tab_Cheats;
@ -134,6 +136,7 @@ class wxCheatsWindow : public wxDialog
void Init_ChildControls();
void Load_ARCodes();
void Load_GeckoCodes();
// --- Wx Events Handlers ---

View File

@ -87,6 +87,7 @@ static const wxLanguage langIds[] =
#define SIDEV_STDCONT_STR _trans("Standard Controller")
#define SIDEV_STEERING_STR _trans("Steering Wheel")
#define SIDEV_DANCEMAT_STR _trans("Dance Mat")
#define SIDEV_BONGO_STR _trans("TaruKonga (Bongos)")
#define SIDEV_GBA_STR "GBA"
#define SIDEV_AM_BB_STR _trans("AM-Baseboard")
@ -388,6 +389,7 @@ void CConfigMain::InitializeGUIValues()
SIDevices.Add(_(DEV_NONE_STR));
SIDevices.Add(_(SIDEV_STDCONT_STR));
SIDevices.Add(_(SIDEV_STEERING_STR));
SIDevices.Add(_(SIDEV_DANCEMAT_STR));
SIDevices.Add(_(SIDEV_BONGO_STR));
SIDevices.Add(_(SIDEV_GBA_STR));
SIDevices.Add(_(SIDEV_AM_BB_STR));
@ -443,15 +445,18 @@ void CConfigMain::InitializeGUIValues()
case SIDEVICE_GC_STEERING:
GCSIDevice[i]->SetStringSelection(SIDevices[2]);
break;
case SIDEVICE_GC_TARUKONGA:
case SIDEVICE_DANCEMAT:
GCSIDevice[i]->SetStringSelection(SIDevices[3]);
break;
case SIDEVICE_GC_GBA:
case SIDEVICE_GC_TARUKONGA:
GCSIDevice[i]->SetStringSelection(SIDevices[4]);
break;
case SIDEVICE_AM_BASEBOARD:
case SIDEVICE_GC_GBA:
GCSIDevice[i]->SetStringSelection(SIDevices[5]);
break;
case SIDEVICE_AM_BASEBOARD:
GCSIDevice[i]->SetStringSelection(SIDevices[6]);
break;
default:
GCSIDevice[i]->SetStringSelection(SIDevices[0]);
break;
@ -1103,6 +1108,8 @@ void CConfigMain::ChooseSIDevice(wxString deviceName, int deviceNum)
tempType = SIDEVICE_GC_CONTROLLER;
else if (!deviceName.compare(WXSTR_TRANS(SIDEV_STEERING_STR)))
tempType = SIDEVICE_GC_STEERING;
else if (!deviceName.compare(WXSTR_TRANS(SIDEV_DANCEMAT_STR)))
tempType = SIDEVICE_DANCEMAT;
else if (!deviceName.compare(WXSTR_TRANS(SIDEV_BONGO_STR)))
tempType = SIDEVICE_GC_TARUKONGA;
else if (!deviceName.compare(wxT(SIDEV_GBA_STR)))

View File

@ -34,8 +34,8 @@ FifoPlayerDlg::FifoPlayerDlg(wxWindow * const parent) :
{
CreateGUIControls();
sMutex.lock();
m_EvtHandler = GetEventHandler();
sMutex.lock();
m_EvtHandler = GetEventHandler();
sMutex.unlock();
FifoPlayer::GetInstance().SetFileLoadedCallback(FileLoaded);
@ -55,7 +55,7 @@ FifoPlayerDlg::~FifoPlayerDlg()
m_ObjectToCtrl->Unbind(wxEVT_COMMAND_SPINCTRL_UPDATED, &FifoPlayerDlg::OnObjectTo, this);
m_EarlyMemoryUpdates->Unbind(wxEVT_COMMAND_CHECKBOX_CLICKED, &FifoPlayerDlg::OnCheckEarlyMemoryUpdates, this);
m_RecordStop->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &FifoPlayerDlg::OnRecordStop, this);
m_Save->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &FifoPlayerDlg::OnSaveFile, this);
m_Save->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &FifoPlayerDlg::OnSaveFile, this);
m_FramesToRecordCtrl->Unbind(wxEVT_COMMAND_SPINCTRL_UPDATED, &FifoPlayerDlg::OnNumFramesToRecord, this);
m_Close->Unbind(wxEVT_COMMAND_BUTTON_CLICKED, &FifoPlayerDlg::OnCloseClick, this);
@ -65,7 +65,7 @@ FifoPlayerDlg::~FifoPlayerDlg()
FifoPlayer::GetInstance().SetFrameWrittenCallback(NULL);
sMutex.lock();
sMutex.lock();
m_EvtHandler = NULL;
sMutex.unlock();
}
@ -192,7 +192,8 @@ void FifoPlayerDlg::CreateGUIControls()
m_FramesToRecordLabel->Wrap(-1);
sRecordingOptions->Add(m_FramesToRecordLabel, 0, wxALL, 5);
m_FramesToRecordCtrl = new wxSpinCtrl(m_RecordPage, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 1);
wxString initialNum = wxString::Format(_T("%d"), m_FramesToRecord);
m_FramesToRecordCtrl = new wxSpinCtrl(m_RecordPage, wxID_ANY, initialNum, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 10000, 1);
sRecordingOptions->Add(m_FramesToRecordCtrl, 0, wxALL, 5);
sRecordPage->Add(sRecordingOptions, 0, wxEXPAND, 5);
@ -252,9 +253,7 @@ void FifoPlayerDlg::CreateGUIControls()
m_findNext = new wxButton(m_AnalyzePage, wxID_ANY, _("Find next"));
m_findPrevious = new wxButton(m_AnalyzePage, wxID_ANY, _("Find previous"));
m_beginSearch->Disable();
m_findNext->Disable();
m_findPrevious->Disable();
ResetSearch();
sSearchButtons->Add(m_beginSearch, 0, wxALL, 5);
sSearchButtons->Add(m_findNext, 0, wxALL, 5);
@ -407,8 +406,8 @@ void FifoPlayerDlg::OnRecordStop(wxCommandEvent& WXUNUSED(event))
// Then stop recording
recorder.StopRecording();
// and disable the button to stop recording
m_RecordStop->Disable();
// and change the button label accordingly.
m_RecordStop->SetLabel(_("Record"));
}
else // Recorder is actually about to start recording
{
@ -499,16 +498,12 @@ void FifoPlayerDlg::OnBeginSearch(wxCommandEvent& event)
ChangeSearchResult(0);
m_beginSearch->Disable();
m_findNext->Enable();
m_findPrevious->Enable();
m_numResultsText->SetLabel(wxString::Format(_("Found %d results for \'"), search_results.size()) + m_searchField->GetValue() + _("\'"));
}
void FifoPlayerDlg::OnSearchFieldTextChanged(wxCommandEvent& event)
{
m_beginSearch->Enable(m_searchField->GetLineLength(0) > 0);
m_findNext->Disable();
m_findPrevious->Disable();
ResetSearch();
}
void FifoPlayerDlg::OnFindNextClick(wxCommandEvent& event)
@ -551,7 +546,7 @@ void FifoPlayerDlg::OnFindPreviousClick(wxCommandEvent& event)
void FifoPlayerDlg::ChangeSearchResult(unsigned int result_idx)
{
if (search_results.size() > result_idx)
if (result_idx < search_results.size()) // if index is valid
{
m_search_result_idx = result_idx;
int prev_frame = m_framesList->GetSelection();
@ -577,6 +572,9 @@ void FifoPlayerDlg::ChangeSearchResult(unsigned int result_idx)
ev.SetInt(m_objectCmdList->GetSelection());
OnObjectCmdListSelectionChanged(ev);
}
m_findNext->Enable(result_idx+1 < search_results.size());
m_findPrevious->Enable(result_idx != 0);
}
else if (search_results.size())
{
@ -584,6 +582,15 @@ void FifoPlayerDlg::ChangeSearchResult(unsigned int result_idx)
}
}
void FifoPlayerDlg::ResetSearch()
{
m_beginSearch->Enable(m_searchField->GetLineLength(0) > 0);
m_findNext->Disable();
m_findPrevious->Disable();
search_results.clear();
}
void FifoPlayerDlg::OnFrameListSelectionChanged(wxCommandEvent& event)
{
FifoPlayer& player = FifoPlayer::GetInstance();
@ -600,6 +607,8 @@ void FifoPlayerDlg::OnFrameListSelectionChanged(wxCommandEvent& event)
wxCommandEvent ev = wxCommandEvent(wxEVT_COMMAND_LISTBOX_SELECTED);
ev.SetInt(-1);
OnObjectListSelectionChanged(ev);
ResetSearch();
}
void FifoPlayerDlg::OnObjectListSelectionChanged(wxCommandEvent& event)
@ -727,6 +736,8 @@ void FifoPlayerDlg::OnObjectListSelectionChanged(wxCommandEvent& event)
wxCommandEvent ev = wxCommandEvent(wxEVT_COMMAND_LISTBOX_SELECTED);
ev.SetInt(-1);
OnObjectCmdListSelectionChanged(ev);
ResetSearch();
}
void FifoPlayerDlg::OnObjectCmdListSelectionChanged(wxCommandEvent& event)

View File

@ -37,6 +37,7 @@ private:
void OnFindPreviousClick(wxCommandEvent& event);
void OnSearchFieldTextChanged(wxCommandEvent& event);
void ChangeSearchResult(unsigned int result_idx);
void ResetSearch();
void OnRecordingFinished(wxEvent& event);
void OnFrameWritten(wxEvent& event);

View File

@ -30,6 +30,9 @@
#include "State.h"
#include "VolumeHandler.h"
#include "Movie.h"
#include "RenderBase.h"
#include "VideoConfig.h"
#include "VertexShaderManager.h"
#include "VideoBackendBase.h"
@ -204,17 +207,18 @@ EVT_MENU_RANGE(IDM_LOGWINDOW, IDM_VIDEOWINDOW, CFrame::OnToggleWindow)
EVT_MENU(IDM_PURGECACHE, CFrame::GameListChanged)
EVT_MENU(IDM_LOADLASTSTATE, CFrame::OnLoadLastState)
EVT_MENU(IDM_SAVEFIRSTSTATE, CFrame::OnSaveFirstState)
EVT_MENU(IDM_UNDOLOADSTATE, CFrame::OnUndoLoadState)
EVT_MENU(IDM_UNDOSAVESTATE, CFrame::OnUndoSaveState)
EVT_MENU(IDM_LOADSTATEFILE, CFrame::OnLoadStateFromFile)
EVT_MENU(IDM_SAVESTATEFILE, CFrame::OnSaveStateToFile)
EVT_MENU_RANGE(IDM_LOADSLOT1, IDM_LOADSLOT8, CFrame::OnLoadState)
EVT_MENU_RANGE(IDM_LOADLAST1, IDM_LOADLAST8, CFrame::OnLoadLastState)
EVT_MENU_RANGE(IDM_SAVESLOT1, IDM_SAVESLOT8, CFrame::OnSaveState)
EVT_MENU_RANGE(IDM_FRAMESKIP0, IDM_FRAMESKIP9, CFrame::OnFrameSkip)
EVT_MENU_RANGE(IDM_DRIVE1, IDM_DRIVE24, CFrame::OnBootDrive)
EVT_MENU_RANGE(IDM_CONNECT_WIIMOTE1, IDM_CONNECT_WIIMOTE4, CFrame::OnConnectWiimote)
EVT_MENU_RANGE(IDM_CONNECT_WIIMOTE1, IDM_CONNECT_BALANCEBOARD, CFrame::OnConnectWiimote)
EVT_MENU_RANGE(IDM_LISTWAD, IDM_LISTDRIVES, CFrame::GameListChanged)
// Other
@ -323,7 +327,11 @@ CFrame::CFrame(wxFrame* parent,
m_LogWindow->Hide();
m_LogWindow->Disable();
g_TASInputDlg = new TASInputDlg(this);
g_TASInputDlg[0] = new TASInputDlg(this);
g_TASInputDlg[1] = new TASInputDlg(this);
g_TASInputDlg[2] = new TASInputDlg(this);
g_TASInputDlg[3] = new TASInputDlg(this);
Movie::SetInputManip(TASManipFunction);
State::SetOnAfterLoadCallback(OnAfterLoadCallback);
@ -719,104 +727,59 @@ int GetCmdForHotkey(unsigned int key)
{
switch (key)
{
case HK_OPEN:
return wxID_OPEN;
case HK_OPEN: return wxID_OPEN;
case HK_CHANGE_DISC: return IDM_CHANGEDISC;
case HK_REFRESH_LIST: return wxID_REFRESH;
case HK_PLAY_PAUSE: return IDM_PLAY;
case HK_STOP: return IDM_STOP;
case HK_RESET: return IDM_RESET;
case HK_FRAME_ADVANCE: return IDM_FRAMESTEP;
case HK_START_RECORDING: return IDM_RECORD;
case HK_PLAY_RECORDING: return IDM_PLAYRECORD;
case HK_EXPORT_RECORDING: return IDM_RECORDEXPORT;
case HK_READ_ONLY_MODE: return IDM_RECORDREADONLY;
case HK_FULLSCREEN: return IDM_TOGGLE_FULLSCREEN;
case HK_SCREENSHOT: return IDM_SCREENSHOT;
case HK_EXIT: return wxID_EXIT;
case HK_CHANGE_DISC:
return IDM_CHANGEDISC;
case HK_WIIMOTE1_CONNECT: return IDM_CONNECT_WIIMOTE1;
case HK_WIIMOTE2_CONNECT: return IDM_CONNECT_WIIMOTE2;
case HK_WIIMOTE3_CONNECT: return IDM_CONNECT_WIIMOTE3;
case HK_WIIMOTE4_CONNECT: return IDM_CONNECT_WIIMOTE4;
case HK_BALANCEBOARD_CONNECT: return IDM_CONNECT_BALANCEBOARD;
case HK_REFRESH_LIST:
return wxID_REFRESH;
case HK_LOAD_STATE_SLOT_1: return IDM_LOADSLOT1;
case HK_LOAD_STATE_SLOT_2: return IDM_LOADSLOT2;
case HK_LOAD_STATE_SLOT_3: return IDM_LOADSLOT3;
case HK_LOAD_STATE_SLOT_4: return IDM_LOADSLOT4;
case HK_LOAD_STATE_SLOT_5: return IDM_LOADSLOT5;
case HK_LOAD_STATE_SLOT_6: return IDM_LOADSLOT6;
case HK_LOAD_STATE_SLOT_7: return IDM_LOADSLOT7;
case HK_LOAD_STATE_SLOT_8: return IDM_LOADSLOT8;
case HK_PLAY_PAUSE:
return IDM_PLAY;
case HK_SAVE_STATE_SLOT_1: return IDM_SAVESLOT1;
case HK_SAVE_STATE_SLOT_2: return IDM_SAVESLOT2;
case HK_SAVE_STATE_SLOT_3: return IDM_SAVESLOT3;
case HK_SAVE_STATE_SLOT_4: return IDM_SAVESLOT4;
case HK_SAVE_STATE_SLOT_5: return IDM_SAVESLOT5;
case HK_SAVE_STATE_SLOT_6: return IDM_SAVESLOT6;
case HK_SAVE_STATE_SLOT_7: return IDM_SAVESLOT7;
case HK_SAVE_STATE_SLOT_8: return IDM_SAVESLOT8;
case HK_STOP:
return IDM_STOP;
case HK_LOAD_LAST_STATE_1: return IDM_LOADLAST1;
case HK_LOAD_LAST_STATE_2: return IDM_LOADLAST2;
case HK_LOAD_LAST_STATE_3: return IDM_LOADLAST3;
case HK_LOAD_LAST_STATE_4: return IDM_LOADLAST4;
case HK_LOAD_LAST_STATE_5: return IDM_LOADLAST5;
case HK_LOAD_LAST_STATE_6: return IDM_LOADLAST6;
case HK_LOAD_LAST_STATE_7: return IDM_LOADLAST7;
case HK_LOAD_LAST_STATE_8: return IDM_LOADLAST8;
case HK_RESET:
return IDM_RESET;
case HK_FRAME_ADVANCE:
return IDM_FRAMESTEP;
case HK_START_RECORDING:
return IDM_RECORD;
case HK_PLAY_RECORDING:
return IDM_PLAYRECORD;
case HK_EXPORT_RECORDING:
return IDM_RECORDEXPORT;
case HK_READ_ONLY_MODE:
return IDM_RECORDREADONLY;
case HK_FULLSCREEN:
return IDM_TOGGLE_FULLSCREEN;
case HK_SCREENSHOT:
return IDM_SCREENSHOT;
case HK_WIIMOTE1_CONNECT:
return IDM_CONNECT_WIIMOTE1;
case HK_WIIMOTE2_CONNECT:
return IDM_CONNECT_WIIMOTE2;
case HK_WIIMOTE3_CONNECT:
return IDM_CONNECT_WIIMOTE3;
case HK_WIIMOTE4_CONNECT:
return IDM_CONNECT_WIIMOTE4;
case HK_LOAD_STATE_SLOT_1:
return IDM_LOADSLOT1;
case HK_LOAD_STATE_SLOT_2:
return IDM_LOADSLOT2;
case HK_LOAD_STATE_SLOT_3:
return IDM_LOADSLOT3;
case HK_LOAD_STATE_SLOT_4:
return IDM_LOADSLOT4;
case HK_LOAD_STATE_SLOT_5:
return IDM_LOADSLOT5;
case HK_LOAD_STATE_SLOT_6:
return IDM_LOADSLOT6;
case HK_LOAD_STATE_SLOT_7:
return IDM_LOADSLOT7;
case HK_LOAD_STATE_SLOT_8:
return IDM_LOADSLOT8;
case HK_SAVE_STATE_SLOT_1:
return IDM_SAVESLOT1;
case HK_SAVE_STATE_SLOT_2:
return IDM_SAVESLOT2;
case HK_SAVE_STATE_SLOT_3:
return IDM_SAVESLOT3;
case HK_SAVE_STATE_SLOT_4:
return IDM_SAVESLOT4;
case HK_SAVE_STATE_SLOT_5:
return IDM_SAVESLOT5;
case HK_SAVE_STATE_SLOT_6:
return IDM_SAVESLOT6;
case HK_SAVE_STATE_SLOT_7:
return IDM_SAVESLOT7;
case HK_SAVE_STATE_SLOT_8:
return IDM_SAVESLOT8;
case HK_SAVE_FIRST_STATE: return IDM_SAVEFIRSTSTATE;
case HK_UNDO_LOAD_STATE: return IDM_UNDOLOADSTATE;
case HK_UNDO_SAVE_STATE: return IDM_UNDOSAVESTATE;
case HK_LOAD_STATE_FILE: return IDM_LOADSTATEFILE;
case HK_SAVE_STATE_FILE: return IDM_SAVESTATEFILE;
}
return -1;
@ -825,7 +788,7 @@ int GetCmdForHotkey(unsigned int key)
void OnAfterLoadCallback()
{
// warning: this gets called from the CPU thread, so we should only queue things to do on the proper thread
if(main_frame)
if (main_frame)
{
wxCommandEvent event(wxEVT_HOST_COMMAND, IDM_UPDATEGUI);
main_frame->GetEventHandler()->AddPendingEvent(event);
@ -835,13 +798,24 @@ void OnAfterLoadCallback()
void TASManipFunction(SPADStatus *PadStatus, int controllerID)
{
if (main_frame)
main_frame->g_TASInputDlg->GetValues(PadStatus, controllerID);
main_frame->g_TASInputDlg[controllerID]->GetValues(PadStatus, controllerID);
}
bool TASInputHasFocus()
{
for (int i = 0; i < 4; i++)
{
if (main_frame->g_TASInputDlg[i]->HasFocus())
return true;
}
return false;
}
void CFrame::OnKeyDown(wxKeyEvent& event)
{
if(Core::GetState() != Core::CORE_UNINITIALIZED &&
(RendererHasFocus() || g_TASInputDlg->HasFocus()))
(RendererHasFocus() || TASInputHasFocus()))
{
int WiimoteId = -1;
// Toggle fullscreen
@ -859,6 +833,8 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
// Screenshot hotkey
else if (IsHotkey(event, HK_SCREENSHOT))
Core::SaveScreenShot();
else if (IsHotkey(event, HK_EXIT))
wxPostEvent(this, wxCommandEvent(wxID_EXIT));
// Wiimote connect and disconnect hotkeys
else if (IsHotkey(event, HK_WIIMOTE1_CONNECT))
WiimoteId = 0;
@ -868,32 +844,12 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
WiimoteId = 2;
else if (IsHotkey(event, HK_WIIMOTE4_CONNECT))
WiimoteId = 3;
// State save and state load hotkeys
/*else if (event.GetKeyCode() >= WXK_F1 && event.GetKeyCode() <= WXK_F8)
{
int slot_number = event.GetKeyCode() - WXK_F1 + 1;
if (event.GetModifiers() == wxMOD_NONE)
State::Load(slot_number);
else if (event.GetModifiers() == wxMOD_SHIFT)
State::Save(slot_number);
else
event.Skip();
}*/
else if (event.GetKeyCode() == WXK_F11 && event.GetModifiers() == wxMOD_NONE)
State::LoadLastSaved();
else if (event.GetKeyCode() == WXK_F12)
{
if (event.GetModifiers() == wxMOD_NONE)
State::UndoSaveState();
else if (event.GetModifiers() == wxMOD_SHIFT)
State::UndoLoadState();
else
event.Skip();
}
else if (IsHotkey(event, HK_BALANCEBOARD_CONNECT))
WiimoteId = 4;
else
{
unsigned int i = NUM_HOTKEYS;
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain || g_TASInputDlg->HasFocus())
if (!SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain || TASInputHasFocus())
{
for (i = 0; i < NUM_HOTKEYS; i++)
{
@ -935,28 +891,78 @@ void CFrame::OnKeyDown(wxKeyEvent& event)
ConnectWiimote(WiimoteId, connect);
}
// Send the OSD hotkeys to the video backend
if (event.GetKeyCode() >= '3' && event.GetKeyCode() <= '7' && event.GetModifiers() == wxMOD_NONE)
if (g_Config.bOSDHotKey && event.GetModifiers() == wxMOD_NONE)
{
#ifdef _WIN32
PostMessage((HWND)Core::GetWindowHandle(), WM_USER, WM_USER_KEYDOWN, event.GetKeyCode());
#elif defined(HAVE_X11) && HAVE_X11
X11Utils::SendKeyEvent(X11Utils::XDisplayFromHandle(GetHandle()), event.GetKeyCode());
#endif
switch (event.GetKeyCode())
{
case '3':
OSDChoice = 1;
// Toggle native resolution
g_Config.iEFBScale = g_Config.iEFBScale + 1;
if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0;
break;
case '4':
OSDChoice = 2;
// Toggle aspect ratio
g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3;
break;
case '5':
OSDChoice = 3;
// Toggle EFB copy
if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture)
{
g_Config.bEFBCopyEnable ^= true;
g_Config.bCopyEFBToTexture = false;
}
else
{
g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture;
}
break;
case '6':
OSDChoice = 4;
g_Config.bDisableFog = !g_Config.bDisableFog;
break;
default:
break;
}
}
// Send the freelook hotkeys to the video backend
if ((event.GetKeyCode() == ')' || event.GetKeyCode() == '(' ||
event.GetKeyCode() == '0' || event.GetKeyCode() == '9' ||
event.GetKeyCode() == 'W' || event.GetKeyCode() == 'S' ||
event.GetKeyCode() == 'A' || event.GetKeyCode() == 'D' ||
event.GetKeyCode() == 'R')
&& event.GetModifiers() == wxMOD_SHIFT)
if (g_Config.bFreeLook && event.GetModifiers() == wxMOD_SHIFT)
{
#ifdef _WIN32
PostMessage((HWND)Core::GetWindowHandle(), WM_USER, WM_USER_KEYDOWN, event.GetKeyCode());
#elif defined(HAVE_X11) && HAVE_X11
X11Utils::SendKeyEvent(X11Utils::XDisplayFromHandle(GetHandle()), event.GetKeyCode());
#endif
static float debugSpeed = 1.0f;
switch (event.GetKeyCode())
{
case '9':
debugSpeed /= 2.0f;
break;
case '0':
debugSpeed *= 2.0f;
break;
case 'W':
VertexShaderManager::TranslateView(0.0f, debugSpeed);
break;
case 'S':
VertexShaderManager::TranslateView(0.0f, -debugSpeed);
break;
case 'A':
VertexShaderManager::TranslateView(debugSpeed, 0.0f);
break;
case 'D':
VertexShaderManager::TranslateView(-debugSpeed, 0.0f);
break;
case 'Q':
VertexShaderManager::TranslateView(0.0f, 0.0f, debugSpeed);
break;
case 'E':
VertexShaderManager::TranslateView(0.0f, 0.0f, -debugSpeed);
break;
case 'R':
VertexShaderManager::ResetView();
break;
default:
break;
}
}
}
else

View File

@ -110,7 +110,7 @@ public:
CCodeWindow* g_pCodeWindow;
NetPlaySetupDiag* g_NetPlaySetupDiag;
wxCheatsWindow* g_CheatsWindow;
TASInputDlg* g_TASInputDlg;
TASInputDlg* g_TASInputDlg[4];
void InitBitmaps();
void DoPause();
@ -289,6 +289,7 @@ private:
void OnLoadStateFromFile(wxCommandEvent& event);
void OnSaveStateToFile(wxCommandEvent& event);
void OnLoadLastState(wxCommandEvent& event);
void OnSaveFirstState(wxCommandEvent& event);
void OnUndoLoadState(wxCommandEvent& event);
void OnUndoSaveState(wxCommandEvent& event);
@ -348,6 +349,7 @@ void OnAfterLoadCallback();
// For TASInputDlg
void TASManipFunction(SPADStatus *PadStatus, int controllerID);
bool TASInputHasFocus();
#endif // __FRAME_H_

View File

@ -149,27 +149,26 @@ void CFrame::CreateMenu()
emulationMenu->Append(IDM_LOADSTATE, _("&Load State"), loadMenu);
emulationMenu->Append(IDM_SAVESTATE, _("Sa&ve State"), saveMenu);
saveMenu->Append(IDM_SAVESTATEFILE, _("Save State..."));
loadMenu->Append(IDM_UNDOSAVESTATE, _("Last Overwritten State") + wxString(wxT("\tF12")));
saveMenu->Append(IDM_SAVESTATEFILE, GetMenuLabel(HK_SAVE_STATE_FILE));
saveMenu->Append(IDM_SAVEFIRSTSTATE, GetMenuLabel(HK_SAVE_FIRST_STATE));
loadMenu->Append(IDM_UNDOSAVESTATE, GetMenuLabel(HK_UNDO_SAVE_STATE));
saveMenu->AppendSeparator();
loadMenu->Append(IDM_LOADSTATEFILE, _("Load State..."));
// Reserve F11 for the "step into" function in the debugger
if (g_pCodeWindow)
loadMenu->Append(IDM_LOADLASTSTATE, _("Last Saved State"));
else
loadMenu->Append(IDM_LOADLASTSTATE, _("Last Saved State") + wxString(wxT("\tF11")));
loadMenu->Append(IDM_LOADSTATEFILE, GetMenuLabel(HK_LOAD_STATE_FILE));
loadMenu->Append(IDM_UNDOLOADSTATE, _("Undo Load State") + wxString(wxT("\tShift+F12")));
loadMenu->Append(IDM_UNDOLOADSTATE, GetMenuLabel(HK_UNDO_LOAD_STATE));
loadMenu->AppendSeparator();
for (int i = 1; i <= 8; i++)
for (unsigned int i = 1; i <= State::NUM_STATES; i++)
{
loadMenu->Append(IDM_LOADSLOT1 + i - 1, GetMenuLabel(HK_LOAD_STATE_SLOT_1 + i - 1));
saveMenu->Append(IDM_SAVESLOT1 + i - 1, GetMenuLabel(HK_SAVE_STATE_SLOT_1 + i - 1));
}
loadMenu->AppendSeparator();
for (unsigned int i = 1; i <= State::NUM_STATES; i++)
loadMenu->Append(IDM_LOADLAST1 + i - 1, GetMenuLabel(HK_LOAD_LAST_STATE_1 + i - 1));
m_MenuBar->Append(emulationMenu, _("&Emulation"));
// Options menu
@ -206,6 +205,7 @@ void CFrame::CreateMenu()
toolsMenu->AppendCheckItem(IDM_CONNECT_WIIMOTE2, GetMenuLabel(HK_WIIMOTE2_CONNECT));
toolsMenu->AppendCheckItem(IDM_CONNECT_WIIMOTE3, GetMenuLabel(HK_WIIMOTE3_CONNECT));
toolsMenu->AppendCheckItem(IDM_CONNECT_WIIMOTE4, GetMenuLabel(HK_WIIMOTE4_CONNECT));
toolsMenu->AppendCheckItem(IDM_CONNECT_BALANCEBOARD, GetMenuLabel(HK_BALANCEBOARD_CONNECT));
m_MenuBar->Append(toolsMenu, _("&Tools"));
@ -360,6 +360,9 @@ wxString CFrame::GetMenuLabel(int Id)
case HK_SCREENSHOT:
Label = _("Take Screenshot");
break;
case HK_EXIT:
Label = _("Exit");
break;
case HK_WIIMOTE1_CONNECT:
case HK_WIIMOTE2_CONNECT:
@ -368,7 +371,9 @@ wxString CFrame::GetMenuLabel(int Id)
Label = wxString::Format(_("Connect Wiimote %i"),
Id - HK_WIIMOTE1_CONNECT + 1);
break;
case HK_BALANCEBOARD_CONNECT:
Label = _("Connect Balance Board");
break;
case HK_LOAD_STATE_SLOT_1:
case HK_LOAD_STATE_SLOT_2:
case HK_LOAD_STATE_SLOT_3:
@ -392,6 +397,28 @@ wxString CFrame::GetMenuLabel(int Id)
Label = wxString::Format(_("Slot %i"),
Id - HK_SAVE_STATE_SLOT_1 + 1);
break;
case HK_SAVE_STATE_FILE:
Label = _("Save State...");
break;
case HK_LOAD_LAST_STATE_1:
case HK_LOAD_LAST_STATE_2:
case HK_LOAD_LAST_STATE_3:
case HK_LOAD_LAST_STATE_4:
case HK_LOAD_LAST_STATE_5:
case HK_LOAD_LAST_STATE_6:
case HK_LOAD_LAST_STATE_7:
case HK_LOAD_LAST_STATE_8:
Label = wxString::Format(_("Last %i"),
Id - HK_LOAD_LAST_STATE_1 + 1);
break;
case HK_LOAD_STATE_FILE:
Label = _("Load State...");
break;
case HK_SAVE_FIRST_STATE: Label = wxString("Save Oldest State"); break;
case HK_UNDO_LOAD_STATE: Label = wxString("Undo Load State"); break;
case HK_UNDO_SAVE_STATE: Label = wxString("Undo Save State"); break;
default:
Label = wxString::Format(_("Undefined %i"), Id);
@ -620,7 +647,16 @@ void CFrame::OnRecordReadOnly(wxCommandEvent& event)
void CFrame::OnTASInput(wxCommandEvent& event)
{
g_TASInputDlg->Show(true);
std::string number[4] = {"1","2","3","4"};
for (int i = 0; i < 4; ++i)
{
if (SConfig::GetInstance().m_SIDevice[i] == SIDEVICE_GC_CONTROLLER || SConfig::GetInstance().m_SIDevice[i] == SIDEVICE_GC_TARUKONGA)
{
g_TASInputDlg[i]->Show(true);
g_TASInputDlg[i]->SetTitle("TAS Input - Controller " + number[i]);
}
}
}
void CFrame::OnTogglePauseMovie(wxCommandEvent& WXUNUSED (event))
@ -768,8 +804,10 @@ void CFrame::OnRenderParentResize(wxSizeEvent& event)
}
#if defined(HAVE_X11) && HAVE_X11
wxRect client_rect = m_RenderParent->GetClientRect();
X11Utils::SendClientEvent(X11Utils::XDisplayFromHandle(GetHandle()),
"RESIZE", client_rect.x, client_rect.y, client_rect.width, client_rect.height);
XMoveResizeWindow(X11Utils::XDisplayFromHandle(GetHandle()),
(Window) Core::GetWindowHandle(),
client_rect.x, client_rect.y,
client_rect.width, client_rect.height);
#endif
m_LogWindow->Refresh();
m_LogWindow->Update();
@ -780,7 +818,7 @@ void CFrame::OnRenderParentResize(wxSizeEvent& event)
void CFrame::ToggleDisplayMode(bool bFullscreen)
{
#ifdef _WIN32
if (bFullscreen)
if (bFullscreen && SConfig::GetInstance().m_LocalCoreStartupParameter.strFullscreenResolution != "Auto")
{
DEVMODE dmScreenSettings;
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
@ -799,7 +837,8 @@ void CFrame::ToggleDisplayMode(bool bFullscreen)
ChangeDisplaySettings(NULL, CDS_FULLSCREEN);
}
#elif defined(HAVE_XRANDR) && HAVE_XRANDR
m_XRRConfig->ToggleDisplayMode(bFullscreen);
if (SConfig::GetInstance().m_LocalCoreStartupParameter.strFullscreenResolution != "Auto")
m_XRRConfig->ToggleDisplayMode(bFullscreen);
#elif defined __APPLE__
if(bFullscreen)
CGDisplayHideCursor(CGMainDisplayID());
@ -1115,6 +1154,7 @@ void CFrame::OnConfigMain(wxCommandEvent& WXUNUSED (event))
CConfigMain ConfigMain(this);
if (ConfigMain.ShowModal() == wxID_OK)
m_GameListCtrl->Update();
UpdateGUI();
}
void CFrame::OnConfigGFX(wxCommandEvent& WXUNUSED (event))
@ -1437,10 +1477,20 @@ void CFrame::OnSaveStateToFile(wxCommandEvent& WXUNUSED (event))
State::SaveAs(WxStrToStr(path));
}
void CFrame::OnLoadLastState(wxCommandEvent& WXUNUSED (event))
void CFrame::OnLoadLastState(wxCommandEvent& event)
{
if (Core::IsRunningAndStarted())
State::LoadLastSaved();
{
int id = event.GetId();
int slot = id - IDM_LOADLAST1 + 1;
State::LoadLastSaved(slot);
}
}
void CFrame::OnSaveFirstState(wxCommandEvent& WXUNUSED(event))
{
if (Core::GetState() != Core::CORE_UNINITIALIZED)
State::SaveFirstSaved();
}
void CFrame::OnUndoLoadState(wxCommandEvent& WXUNUSED (event))
@ -1540,10 +1590,14 @@ void CFrame::UpdateGUI()
if (DiscIO::CNANDContentManager::Access().GetNANDLoader(TITLEID_SYSMENU).IsValid())
GetMenuBar()->FindItem(IDM_LOAD_WII_MENU)->Enable(!Initialized);
// Tools
GetMenuBar()->FindItem(IDM_CHEATS)->Enable(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Enable(RunningWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Enable(RunningWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Enable(RunningWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Enable(RunningWii);
GetMenuBar()->FindItem(IDM_CONNECT_BALANCEBOARD)->Enable(RunningWii);
GetMenuBar()->FindItem(IDM_CONFIG_WIIMOTE_PLUGIN)->Enable(!RunningGamecube);
if (RunningWii)
{
@ -1555,6 +1609,8 @@ void CFrame::UpdateGUI()
AccessWiiMote(0x0102)->IsConnected());
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Check(GetUsbPointer()->
AccessWiiMote(0x0103)->IsConnected());
GetMenuBar()->FindItem(IDM_CONNECT_BALANCEBOARD)->Check(GetUsbPointer()->
AccessWiiMote(0x0104)->IsConnected());
}
if (Running)
@ -1647,6 +1703,15 @@ void CFrame::UpdateGUI()
// Commit changes to manager
m_Mgr->Update();
// Update non-modal windows
if (g_CheatsWindow)
{
if (SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats)
g_CheatsWindow->UpdateGUI();
else
g_CheatsWindow->Close();
}
}
void CFrame::UpdateGameList()

View File

@ -2,8 +2,8 @@
// Licensed under GPLv2
// Refer to the license.txt file included.
#ifndef __HOTKEYDIALOG_h__
#define __HOTKEYDIALOG_h__
#ifndef __GCMICDIALOG_h__
#define __GCMICDIALOG_h__
#include <wx/wx.h>
#include <wx/textctrl.h>

View File

@ -52,7 +52,16 @@ bool cInterfaceEGL::Create(void *&window_handle)
EGL_BLUE_SIZE, 8,
EGL_DEPTH_SIZE, 24,
#ifdef USE_GLES
#ifdef USE_GLES3
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
// OpenGL ES 3 bit is disabled for now, until we have a way to select it from runtime
// Qualcomm drivers don't even care if it is ES2 or ES3 bit set.
// Intel drivers /might/ not care, but that code path is untested
// EGL_RENDERABLE_TYPE, (1 << 6) /* EGL_OPENGL_ES3_BIT */,
#else
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
#endif
#else
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
#endif

View File

@ -18,7 +18,11 @@
#define _INTERFACEEGL_H_
#if USE_GLES
#ifdef USE_GLES3
#include <GLES3/gl3.h>
#else
#include <GLES2/gl2.h>
#endif
#else
#include <GL/glxew.h>
#include <GL/gl.h>

View File

@ -25,7 +25,7 @@
// Show the current FPS
void cInterfaceGLX::UpdateFPSDisplay(const char *text)
{
XStoreName(GLWin.dpy, GLWin.win, text);
XStoreName(GLWin.evdpy, GLWin.win, text);
}
void cInterfaceGLX::SwapInterval(int Interval)
@ -136,7 +136,7 @@ bool cInterfaceGLX::MakeCurrent()
#if defined(HAVE_WX) && (HAVE_WX)
Host_GetRenderWindowSize(GLWin.x, GLWin.y,
(int&)GLWin.width, (int&)GLWin.height);
XMoveResizeWindow(GLWin.dpy, GLWin.win, GLWin.x, GLWin.y,
XMoveResizeWindow(GLWin.evdpy, GLWin.win, GLWin.x, GLWin.y,
GLWin.width, GLWin.height);
#endif
return glXMakeCurrent(GLWin.dpy, GLWin.win, GLWin.ctx);

View File

@ -115,7 +115,10 @@ out:
#if HAVE_X11
if (selected_platform != EGL_PLATFORM_X11) {
if (GLWin.dpy)
{
XCloseDisplay(GLWin.dpy);
XCloseDisplay(GLWin.evdpy);
}
}
#endif
if (selected_platform == EGL_PLATFORM_NONE)

View File

@ -16,7 +16,6 @@
// http://code.google.com/p/dolphin-emu/
#include "Host.h"
#include "RenderBase.h"
#include "VideoConfig.h"
#include "../GLInterface.h"
#include "VertexShaderManager.h"
@ -24,9 +23,9 @@
#if USE_EGL
bool cXInterface::ServerConnect(void)
{
GLWin.evdpy = XOpenDisplay(NULL);
GLWin.dpy = XOpenDisplay(NULL);
if (!GLWin.evdpy)
if (!GLWin.dpy)
return false;
return true;
@ -39,7 +38,7 @@ bool cXInterface::Initialize(void *config)
int num_visuals;
EGLint vid;
if (!GLWin.evdpy) {
if (!GLWin.dpy) {
printf("Error: couldn't open X display\n");
return false;
}
@ -51,7 +50,7 @@ bool cXInterface::Initialize(void *config)
/* The X window visual must match the EGL config */
visTemplate.visualid = vid;
GLWin.vi = XGetVisualInfo(GLWin.evdpy, VisualIDMask, &visTemplate, &num_visuals);
GLWin.vi = XGetVisualInfo(GLWin.dpy, VisualIDMask, &visTemplate, &num_visuals);
if (!GLWin.vi) {
printf("Error: couldn't get X visual\n");
exit(1);
@ -64,12 +63,12 @@ bool cXInterface::Initialize(void *config)
GLWin.width = _twidth;
GLWin.height = _theight;
GLWin.dpy = XOpenDisplay(NULL);
GLWin.evdpy = XOpenDisplay(NULL);
GLWin.parent = GLWin.win;
GLWin.screen = DefaultScreen(GLWin.evdpy);
GLWin.screen = DefaultScreen(GLWin.dpy);
if (GLWin.parent == 0)
GLWin.parent = RootWindow(GLWin.evdpy, GLWin.screen);
GLWin.parent = RootWindow(GLWin.dpy, GLWin.screen);
/* Set initial projection/viewing transformation.
* We can't be sure we'll get a ConfigureNotify event when the window
@ -82,7 +81,7 @@ bool cXInterface::Initialize(void *config)
void *cXInterface::EGLGetDisplay(void)
{
return eglGetDisplay(GLWin.evdpy);
return eglGetDisplay(GLWin.dpy);
}
void *cXInterface::CreateWindow(void)
@ -90,22 +89,22 @@ void *cXInterface::CreateWindow(void)
Atom wmProtocols[1];
// Setup window attributes
GLWin.attr.colormap = XCreateColormap(GLWin.dpy,
GLWin.attr.colormap = XCreateColormap(GLWin.evdpy,
GLWin.parent, GLWin.vi->visual, AllocNone);
GLWin.attr.event_mask = KeyPressMask | StructureNotifyMask | FocusChangeMask;
GLWin.attr.background_pixel = BlackPixel(GLWin.dpy, GLWin.screen);
GLWin.attr.background_pixel = BlackPixel(GLWin.evdpy, GLWin.screen);
GLWin.attr.border_pixel = 0;
// Create the window
GLWin.win = XCreateWindow(GLWin.dpy, GLWin.parent,
GLWin.win = XCreateWindow(GLWin.evdpy, GLWin.parent,
GLWin.x, GLWin.y, GLWin.width, GLWin.height, 0,
GLWin.vi->depth, InputOutput, GLWin.vi->visual,
CWBorderPixel | CWBackPixel | CWColormap | CWEventMask, &GLWin.attr);
wmProtocols[0] = XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", True);
XSetWMProtocols(GLWin.dpy, GLWin.win, wmProtocols, 1);
XSetStandardProperties(GLWin.dpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL);
XMapRaised(GLWin.dpy, GLWin.win);
XSync(GLWin.dpy, True);
wmProtocols[0] = XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", True);
XSetWMProtocols(GLWin.evdpy, GLWin.win, wmProtocols, 1);
XSetStandardProperties(GLWin.evdpy, GLWin.win, "GPU", "GPU", None, NULL, 0, NULL);
XMapRaised(GLWin.evdpy, GLWin.win);
XSync(GLWin.evdpy, True);
GLWin.xEventThread = std::thread(&cXInterface::XEventThread, this);
// Control window size and picture scaling
@ -116,16 +115,16 @@ void *cXInterface::CreateWindow(void)
void cXInterface::DestroyWindow(void)
{
XDestroyWindow(GLWin.dpy, GLWin.win);
XDestroyWindow(GLWin.evdpy, GLWin.win);
GLWin.win = 0;
if (GLWin.xEventThread.joinable())
GLWin.xEventThread.join();
XFreeColormap(GLWin.dpy, GLWin.attr.colormap);
XFreeColormap(GLWin.evdpy, GLWin.attr.colormap);
}
void cXInterface::UpdateFPSDisplay(const char *text)
{
XStoreName(GLWin.dpy, GLWin.win, text);
XStoreName(GLWin.evdpy, GLWin.win, text);
}
void cXInterface::XEventThread()
@ -157,7 +156,7 @@ void cX11Window::CreateXWindow(void)
void cX11Window::DestroyXWindow(void)
{
XUnmapWindow(GLWin.dpy, GLWin.win);
XUnmapWindow(GLWin.evdpy, GLWin.win);
GLWin.win = 0;
if (GLWin.xEventThread.joinable())
GLWin.xEventThread.join();
@ -174,82 +173,10 @@ void cX11Window::XEventThread()
while (GLWin.win)
{
XEvent event;
KeySym key;
for (int num_events = XPending(GLWin.dpy); num_events > 0; num_events--)
for (int num_events = XPending(GLWin.evdpy); num_events > 0; num_events--)
{
XNextEvent(GLWin.dpy, &event);
XNextEvent(GLWin.evdpy, &event);
switch(event.type) {
case KeyPress:
key = XLookupKeysym((XKeyEvent*)&event, 0);
if (g_Config.bOSDHotKey)
{
switch (key)
{
case XK_3:
OSDChoice = 1;
// Toggle native resolution
g_Config.iEFBScale = g_Config.iEFBScale + 1;
if (g_Config.iEFBScale > 7) g_Config.iEFBScale = 0;
break;
case XK_4:
OSDChoice = 2;
// Toggle aspect ratio
g_Config.iAspectRatio = (g_Config.iAspectRatio + 1) & 3;
break;
case XK_5:
OSDChoice = 3;
// Toggle EFB copy
if (!g_Config.bEFBCopyEnable || g_Config.bCopyEFBToTexture)
{
g_Config.bEFBCopyEnable ^= true;
g_Config.bCopyEFBToTexture = false;
}
else
{
g_Config.bCopyEFBToTexture = !g_Config.bCopyEFBToTexture;
}
break;
case XK_6:
OSDChoice = 4;
g_Config.bDisableFog = !g_Config.bDisableFog;
break;
default:
break;
}
}
if (g_Config.bFreeLook)
{
static float debugSpeed = 1.0f;
switch (key)
{
case XK_parenleft:
debugSpeed /= 2.0f;
break;
case XK_parenright:
debugSpeed *= 2.0f;
break;
case XK_w:
VertexShaderManager::TranslateView(0.0f, debugSpeed);
break;
case XK_s:
VertexShaderManager::TranslateView(0.0f, -debugSpeed);
break;
case XK_a:
VertexShaderManager::TranslateView(debugSpeed, 0.0f);
break;
case XK_d:
VertexShaderManager::TranslateView(-debugSpeed, 0.0f);
break;
case XK_r:
VertexShaderManager::ResetView();
break;
}
}
break;
case ButtonPress:
if (g_Config.bFreeLook)
{
@ -303,21 +230,12 @@ void cX11Window::XEventThread()
}
break;
case ConfigureNotify:
Window winDummy;
unsigned int borderDummy, depthDummy;
XGetGeometry(GLWin.dpy, GLWin.win, &winDummy, &GLWin.x, &GLWin.y,
&GLWin.width, &GLWin.height, &borderDummy, &depthDummy);
GLInterface->SetBackBufferDimensions(GLWin.width, GLWin.height);
GLInterface->SetBackBufferDimensions(event.xconfigure.width, event.xconfigure.height);
break;
case ClientMessage:
if ((unsigned long) event.xclient.data.l[0] ==
XInternAtom(GLWin.dpy, "WM_DELETE_WINDOW", False))
XInternAtom(GLWin.evdpy, "WM_DELETE_WINDOW", False))
Host_Message(WM_USER_STOP);
if ((unsigned long) event.xclient.data.l[0] ==
XInternAtom(GLWin.dpy, "RESIZE", False))
XMoveResizeWindow(GLWin.dpy, GLWin.win,
event.xclient.data.l[1], event.xclient.data.l[2],
event.xclient.data.l[3], event.xclient.data.l[4]);
break;
default:
break;

View File

@ -23,6 +23,7 @@
#include "WxUtils.h"
#include "Main.h"
#include "MathUtil.h"
#include "HW/DVDInterface.h"
#include "../resources/Flag_Europe.xpm"
#include "../resources/Flag_Germany.xpm"
@ -174,6 +175,8 @@ CGameListCtrl::CGameListCtrl(wxWindow* parent, const wxWindowID id, const
wxPoint& pos, const wxSize& size, long style)
: wxListCtrl(parent, id, pos, size, style), toolTip(0)
{
DragAcceptFiles(true);
Connect(wxEVT_DROP_FILES, wxDropFilesEventHandler(CGameListCtrl::OnDropFiles), NULL, this);
}
CGameListCtrl::~CGameListCtrl()
@ -1298,4 +1301,36 @@ void CGameListCtrl::UnselectAll()
}
}
void CGameListCtrl::OnDropFiles(wxDropFilesEvent& event)
{
if (event.GetNumberOfFiles() != 1)
return;
if (File::IsDirectory(WxStrToStr(event.GetFiles()[0])))
return;
wxFileName file = event.GetFiles()[0];
if (file.GetExt() == "dtm")
{
if (Core::IsRunning())
return;
if (!Movie::IsReadOnly())
{
// let's make the read-only flag consistent at the start of a movie.
Movie::SetReadOnly(true);
main_frame->GetMenuBar()->FindItem(IDM_RECORDREADONLY)->Check(true);
}
if (Movie::PlayInput(file.GetFullPath().c_str()))
main_frame->BootGame(std::string(""));
}
else if (!Core::IsRunning())
{
main_frame->BootGame(WxStrToStr(file.GetFullPath()));
}
else
{
DVDInterface::ChangeDisc(WxStrToStr(file.GetFullPath()).c_str());
}
}

View File

@ -97,6 +97,7 @@ private:
void OnMultiCompressGCM(wxCommandEvent& event);
void OnMultiDecompressGCM(wxCommandEvent& event);
void OnInstallWAD(wxCommandEvent& event);
void OnDropFiles(wxDropFilesEvent& event);
void CompressSelection(bool _compress);
void AutomaticColumnWidth();

View File

@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include "GeckoCodeDiag.h"
#include "Core.h"
#include "WxUtils.h"
#include <SFML/Network/Http.hpp>
@ -41,7 +42,8 @@ CodeConfigPanel::CodeConfigPanel(wxWindow* const parent)
// button sizer
wxBoxSizer* const sizer_buttons = new wxBoxSizer(wxHORIZONTAL);
wxButton* const btn_download = new wxButton(this, -1, _("Download Codes (WiiRD Database)"), wxDefaultPosition, wxSize(128, -1));
btn_download = new wxButton(this, -1, _("Download Codes (WiiRD Database)"), wxDefaultPosition, wxSize(128, -1));
btn_download->Enable(false);
btn_download->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &CodeConfigPanel::DownloadCodes, this);
sizer_buttons->AddStretchSpacer(1);
sizer_buttons->Add(btn_download, 1, wxEXPAND);
@ -58,8 +60,11 @@ CodeConfigPanel::CodeConfigPanel(wxWindow* const parent)
SetSizerAndFit(sizer_main);
}
void CodeConfigPanel::UpdateCodeList()
void CodeConfigPanel::UpdateCodeList(bool checkRunning)
{
// disable the button if it doesn't have an effect
btn_download->Enable((!checkRunning || Core::IsRunning()) && !m_gameid.empty());
m_listbox_gcodes->Clear();
// add the codes to the listbox
std::vector<GeckoCode>::const_iterator
@ -76,14 +81,15 @@ void CodeConfigPanel::UpdateCodeList()
UpdateInfoBox(evt);
}
void CodeConfigPanel::LoadCodes(const IniFile& inifile, const std::string& gameid)
void CodeConfigPanel::LoadCodes(const IniFile& inifile, const std::string& gameid, bool checkRunning)
{
m_gameid = gameid;
m_gcodes.clear();
Gecko::LoadCodes(inifile, m_gcodes);
if (!checkRunning || Core::IsRunning())
Gecko::LoadCodes(inifile, m_gcodes);
UpdateCodeList();
UpdateCodeList(checkRunning);
}
void CodeConfigPanel::ToggleCode(wxCommandEvent& evt)
@ -277,9 +283,8 @@ void CodeConfigPanel::DownloadCodes(wxCommandEvent&)
break;
}
// code with this name+creator exists
if (existing_gcodes_iter->name == gcodes_iter->name &&
existing_gcodes_iter->creator == gcodes_iter->creator)
// code exists
if (existing_gcodes_iter->Compare(*gcodes_iter))
break;
}
}

View File

@ -20,7 +20,7 @@ public:
CodeConfigPanel(wxWindow* const parent);
void LoadCodes(const IniFile& inifile, const std::string& gameid = "");
void LoadCodes(const IniFile& inifile, const std::string& gameid = "", bool checkRunning = false);
const std::vector<GeckoCode>& GetCodes() const { return m_gcodes; }
protected:
@ -29,7 +29,7 @@ protected:
void DownloadCodes(wxCommandEvent&);
//void ApplyChanges(wxCommandEvent&);
void UpdateCodeList();
void UpdateCodeList(bool checkRunning = false);
private:
std::vector<GeckoCode> m_gcodes;
@ -44,7 +44,7 @@ private:
wxTextCtrl *textctrl_notes;
wxListBox *listbox_codes;
} m_infobox;
wxButton* btn_download;
};

View File

@ -25,7 +25,7 @@ enum
{
IDM_LOADSTATE = 200, // File menu
IDM_SAVESTATE,
IDM_LOADLASTSTATE,
IDM_SAVEFIRSTSTATE,
IDM_UNDOLOADSTATE,
IDM_UNDOSAVESTATE,
IDM_LOADSTATEFILE,
@ -46,6 +46,14 @@ enum
IDM_LOADSLOT6,
IDM_LOADSLOT7,
IDM_LOADSLOT8,
IDM_LOADLAST1,
IDM_LOADLAST2,
IDM_LOADLAST3,
IDM_LOADLAST4,
IDM_LOADLAST5,
IDM_LOADLAST6,
IDM_LOADLAST7,
IDM_LOADLAST8,
IDM_FRAMESKIP0,
IDM_FRAMESKIP1,
IDM_FRAMESKIP2,
@ -89,6 +97,7 @@ enum
IDM_CONNECT_WIIMOTE2,
IDM_CONNECT_WIIMOTE3,
IDM_CONNECT_WIIMOTE4,
IDM_CONNECT_BALANCEBOARD,
IDM_LISTWAD,
IDM_LISTWII,

View File

@ -179,11 +179,13 @@ void HotkeyConfigDialog::CreateHotkeyGUIControls(void)
_("Toggle Fullscreen"),
_("Take Screenshot"),
_("Exit"),
_("Connect Wiimote 1"),
_("Connect Wiimote 2"),
_("Connect Wiimote 3"),
_("Connect Wiimote 4"),
_("Connect Balance Board"),
_("Load State Slot 1"),
_("Load State Slot 2"),
@ -201,7 +203,22 @@ void HotkeyConfigDialog::CreateHotkeyGUIControls(void)
_("Save State Slot 5"),
_("Save State Slot 6"),
_("Save State Slot 7"),
_("Save State Slot 8")
_("Save State Slot 8"),
_("Load State Last 1"),
_("Load State Last 2"),
_("Load State Last 3"),
_("Load State Last 4"),
_("Load State Last 5"),
_("Load State Last 6"),
_("Load State Last 7"),
_("Load State Last 8"),
_("Save Oldest State"),
_("Undo Load State"),
_("Undo Save State"),
_("Save State"),
_("Load State"),
};
const int page_breaks[3] = {HK_OPEN, HK_LOAD_STATE_SLOT_1, NUM_HOTKEYS};

View File

@ -615,24 +615,26 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event)
if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0
&& m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection())
{
popupMenu->Append(IDM_EXTRACTDIR, _("Extract Partition..."));
}
else if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 1)
popupMenu->Append(IDM_EXTRACTDIR, _("Extract Directory..."));
else if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 2)
popupMenu->Append(IDM_EXTRACTFILE, _("Extract File..."));
popupMenu->Append(IDM_EXTRACTALL, _("Extract All Files..."));
popupMenu->AppendSeparator();
popupMenu->Append(IDM_EXTRACTAPPLOADER, _("Extract Apploader..."));
popupMenu->Append(IDM_EXTRACTDOL, _("Extract DOL..."));
if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0
&& m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection())
{
popupMenu->AppendSeparator();
popupMenu->Append(IDM_EXTRACTAPPLOADER, _("Extract Apploader..."));
popupMenu->Append(IDM_EXTRACTDOL, _("Extract DOL..."));
popupMenu->AppendSeparator();
popupMenu->Append(IDM_CHECKINTEGRITY, _("Check Partition Integrity"));
}
PopupMenu(popupMenu);
event.Skip();
@ -818,17 +820,34 @@ void CISOProperties::OnExtractDir(wxCommandEvent& event)
void CISOProperties::OnExtractDataFromHeader(wxCommandEvent& event)
{
std::vector<const DiscIO::SFileInfo *> fst;
DiscIO::IFileSystem *FS = 0;
DiscIO::IFileSystem *FS = NULL;
wxString Path = wxDirSelector(_("Choose the folder to extract to"));
if (Path.empty())
return;
if (DiscIO::IsVolumeWiiDisc(OpenISO))
FS = WiiDisc.at(1).FileSystem;
{
wxString Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection());
std::size_t partitionNum = (std::size_t)wxAtoi(Directory.Mid(Directory.find_first_of("/"), 1));
Directory.Remove(0, Directory.find_first_of("/") +1); // Remove "Partition x/"
if(WiiDisc.size() > partitionNum)
{
// Get the filesystem of the LAST partition
FS = WiiDisc.at(partitionNum).FileSystem;
}
else
{
PanicAlertT("Partition doesn't exist: %lu", partitionNum);
return;
}
}
else
{
FS = pFileSystem;
}
bool ret = false;
if (event.GetId() == IDM_EXTRACTAPPLOADER)
{

View File

@ -5,6 +5,10 @@
#include "InputConfigDiag.h"
#include "UDPConfigDiag.h"
#include "WxUtils.h"
#include "HW/Wiimote.h"
#include "ControllerInterface/ExpressionParser.h"
using namespace ciface::ExpressionParser;
void GamepadPage::ConfigUDPWii(wxCommandEvent &event)
{
@ -183,13 +187,13 @@ void ControlDialog::UpdateListContents()
{
control_lbox->Clear();
ControllerInterface::Device* const dev = g_controller_interface.FindDevice(m_devq);
Device* const dev = g_controller_interface.FindDevice(m_devq);
if (dev)
{
if (control_reference->is_input)
{
// for inputs
std::vector<ControllerInterface::Device::Input*>::const_iterator
std::vector<Device::Input*>::const_iterator
i = dev->Inputs().begin(),
e = dev->Inputs().end();
for (; i!=e; ++i)
@ -198,7 +202,7 @@ void ControlDialog::UpdateListContents()
else
{
// for outputs
std::vector<ControllerInterface::Device::Output*>::const_iterator
std::vector<Device::Output*>::const_iterator
i = dev->Outputs().begin(),
e = dev->Outputs().end();
for (; i!=e; ++i)
@ -224,6 +228,18 @@ void ControlDialog::UpdateGUI()
// updates the "bound controls:" label
m_bound_label->SetLabel(wxString::Format(_("Bound Controls: %lu"),
(unsigned long)control_reference->BoundCount()));
switch (control_reference->parse_error)
{
case EXPRESSION_PARSE_SYNTAX_ERROR:
m_error_label->SetLabel("Syntax error");
break;
case EXPRESSION_PARSE_NO_DEVICE:
m_error_label->SetLabel("Device not found");
break;
default:
m_error_label->SetLabel("");
}
};
void GamepadPage::UpdateGUI()
@ -237,11 +253,11 @@ void GamepadPage::UpdateGUI()
// buttons
std::vector<ControlButton*>::const_iterator i = (*g)->control_buttons.begin()
, e = (*g)->control_buttons.end();
for (; i!=e; ++i)
//if (std::string::npos == (*i)->control_reference->expression.find_first_of("`|&!#"))
(*i)->SetLabel(StrToWxStr((*i)->control_reference->expression));
//else
//(*i)->SetLabel(wxT("..."));
for (; i!=e; ++i) {
wxString expr = StrToWxStr((*i)->control_reference->expression);
expr.Replace("&", "&&");
(*i)->SetLabel(expr);
}
// cboxes
std::vector<PadSetting*>::const_iterator si = (*g)->options.begin()
@ -276,7 +292,7 @@ void GamepadPage::LoadDefaults(wxCommandEvent&)
UpdateGUI();
}
void ControlDialog::SetControl(wxCommandEvent&)
bool ControlDialog::Validate()
{
control_reference->expression = WxStrToStr(textctrl->GetValue());
@ -284,6 +300,8 @@ void ControlDialog::SetControl(wxCommandEvent&)
g_controller_interface.UpdateReference(control_reference, m_parent->controller->default_device);
UpdateGUI();
return (control_reference->parse_error == EXPRESSION_PARSE_SUCCESS);
}
void GamepadPage::SetDevice(wxCommandEvent&)
@ -322,23 +340,60 @@ void ControlDialog::ClearControl(wxCommandEvent&)
UpdateGUI();
}
void ControlDialog::SetSelectedControl(wxCommandEvent&)
inline bool IsAlphabetic(wxString &str)
{
for (wxString::const_iterator it = str.begin(); it != str.end(); ++it)
if (!isalpha(*it))
return false;
return true;
}
inline void GetExpressionForControl(wxString &expr,
wxString &control_name,
DeviceQualifier *control_device = NULL,
DeviceQualifier *default_device = NULL)
{
expr = "";
// non-default device
if (control_device && default_device && !(*control_device == *default_device))
{
expr += control_device->ToString();
expr += ":";
}
// append the control name
expr += control_name;
if (!IsAlphabetic(expr))
expr = wxString::Format("`%s`", expr);
}
bool ControlDialog::GetExpressionForSelectedControl(wxString &expr)
{
const int num = control_lbox->GetSelection();
if (num < 0)
return;
return false;
wxString control_name = control_lbox->GetString(num);
GetExpressionForControl(expr,
control_name,
&m_devq,
&m_parent->controller->default_device);
return true;
}
void ControlDialog::SetSelectedControl(wxCommandEvent&)
{
wxString expr;
// non-default device
if (false == (m_devq == m_parent->controller->default_device))
expr.append(wxT('`')).append(StrToWxStr(m_devq.ToString())).append(wxT('`'));
if (!GetExpressionForSelectedControl(expr))
return;
// append the control name
expr += control_lbox->GetString(num);
control_reference->expression = WxStrToStr(expr);
textctrl->WriteText(expr);
control_reference->expression = textctrl->GetValue();
std::lock_guard<std::recursive_mutex> lk(m_plugin.controls_lock);
g_controller_interface.UpdateReference(control_reference, m_parent->controller->default_device);
@ -348,28 +403,30 @@ void ControlDialog::SetSelectedControl(wxCommandEvent&)
void ControlDialog::AppendControl(wxCommandEvent& event)
{
const int num = control_lbox->GetSelection();
wxString device_expr, expr;
if (num < 0)
const wxString lbl = ((wxButton*)event.GetEventObject())->GetLabel();
char op = lbl[0];
if (!GetExpressionForSelectedControl(device_expr))
return;
// o boy!, hax
const wxString lbl = ((wxButton*)event.GetEventObject())->GetLabel();
// Unary ops (that is, '!') are a special case. When there's a selection,
// put parens around it and prepend it with a '!', but when there's nothing,
// just add a '!device'.
if (op == '!')
{
wxString selection = textctrl->GetStringSelection();
if (selection == "")
expr = wxString::Format("%c%s", op, device_expr);
else
expr = wxString::Format("%c(%s)", op, selection);
}
else
expr = wxString::Format(" %c %s", op, device_expr);
wxString expr = textctrl->GetValue();
// append the operator to the expression
if (wxT('!') == lbl[0] || false == expr.empty())
expr += lbl[0];
// non-default device
if (false == (m_devq == m_parent->controller->default_device))
expr.append(wxT('`')).append(StrToWxStr(m_devq.ToString())).append(wxT('`'));
// append the control name
expr += control_lbox->GetString(num);
control_reference->expression = WxStrToStr(expr);
textctrl->WriteText(expr);
control_reference->expression = textctrl->GetValue();
std::lock_guard<std::recursive_mutex> lk(m_plugin.controls_lock);
g_controller_interface.UpdateReference(control_reference, m_parent->controller->default_device);
@ -417,7 +474,7 @@ void ControlDialog::DetectControl(wxCommandEvent& event)
wxButton* const btn = (wxButton*)event.GetEventObject();
const wxString lbl = btn->GetLabel();
ControllerInterface::Device* const dev = g_controller_interface.FindDevice(m_devq);
Device* const dev = g_controller_interface.FindDevice(m_devq);
if (dev)
{
btn->SetLabel(_("[ waiting ]"));
@ -426,7 +483,7 @@ void ControlDialog::DetectControl(wxCommandEvent& event)
wxTheApp->Yield();
std::lock_guard<std::recursive_mutex> lk(m_plugin.controls_lock);
ControllerInterface::Device::Control* const ctrl = control_reference->Detect(DETECT_WAIT_TIME, dev);
Device::Control* const ctrl = control_reference->Detect(DETECT_WAIT_TIME, dev);
// if we got input, select it in the list
if (ctrl)
@ -441,7 +498,7 @@ void GamepadPage::DetectControl(wxCommandEvent& event)
ControlButton* btn = (ControlButton*)event.GetEventObject();
// find device :/
ControllerInterface::Device* const dev = g_controller_interface.FindDevice(controller->default_device);
Device* const dev = g_controller_interface.FindDevice(controller->default_device);
if (dev)
{
btn->SetLabel(_("[ waiting ]"));
@ -450,33 +507,41 @@ void GamepadPage::DetectControl(wxCommandEvent& event)
wxTheApp->Yield();
std::lock_guard<std::recursive_mutex> lk(m_plugin.controls_lock);
ControllerInterface::Device::Control* const ctrl = btn->control_reference->Detect(DETECT_WAIT_TIME, dev);
Device::Control* const ctrl = btn->control_reference->Detect(DETECT_WAIT_TIME, dev);
// if we got input, update expression and reference
if (ctrl)
{
btn->control_reference->expression = ctrl->GetName();
wxString control_name = ctrl->GetName();
wxString expr;
GetExpressionForControl(expr, control_name);
btn->control_reference->expression = expr;
g_controller_interface.UpdateReference(btn->control_reference, controller->default_device);
}
btn->SetLabel(StrToWxStr(btn->control_reference->expression));
}
UpdateGUI();
}
wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
{
wxStaticBoxSizer* const main_szr = new wxStaticBoxSizer(wxVERTICAL, this, control_reference->is_input ? _("Input") : _("Output"));
textctrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxSize(-1, 48), wxTE_MULTILINE);
textctrl = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxSize(-1, 48), wxTE_MULTILINE | wxTE_RICH2);
wxFont font = textctrl->GetFont();
font.SetFamily(wxFONTFAMILY_MODERN);
textctrl->SetFont(font);
wxButton* const detect_button = new wxButton(this, -1, control_reference->is_input ? _("Detect") : _("Test"));
wxButton* const clear_button = new wxButton(this, -1, _("Clear"));
wxButton* const set_button = new wxButton(this, -1, _("Set"));
wxButton* const select_button = new wxButton(this, -1, _("Select"));
select_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::SetSelectedControl, this);
wxButton* const not_button = new wxButton(this, -1, _("! NOT"), wxDefaultPosition);
not_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::AppendControl, this);
wxButton* const or_button = new wxButton(this, -1, _("| OR"), wxDefaultPosition);
or_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::AppendControl, this);
@ -491,11 +556,9 @@ wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
{
// TODO: check if && is good on other OS
wxButton* const and_button = new wxButton(this, -1, _("&& AND"), wxDefaultPosition);
wxButton* const not_button = new wxButton(this, -1, _("! NOT"), wxDefaultPosition);
wxButton* const add_button = new wxButton(this, -1, _("^ ADD"), wxDefaultPosition);
wxButton* const add_button = new wxButton(this, -1, _("+ ADD"), wxDefaultPosition);
and_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::AppendControl, this);
not_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::AppendControl, this);
add_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::AppendControl, this);
button_sizer->Add(and_button, 1, 0, 5);
@ -509,11 +572,12 @@ wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
detect_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::DetectControl, this);
clear_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::ClearControl, this);
set_button->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &ControlDialog::SetControl, this);
range_slider->Bind(wxEVT_SCROLL_CHANGED, &GamepadPage::AdjustControlOption, parent);
wxStaticText* const range_label = new wxStaticText(this, -1, _("Range"));
m_bound_label = new wxStaticText(this, -1, wxT(""));
m_error_label = new wxStaticText(this, -1, wxT(""));
wxBoxSizer* const range_sizer = new wxBoxSizer(wxHORIZONTAL);
range_sizer->Add(range_label, 0, wxCENTER|wxLEFT, 5);
@ -523,8 +587,7 @@ wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
ctrls_sizer->Add(control_lbox, 1, wxEXPAND, 0);
ctrls_sizer->Add(button_sizer, 0, wxEXPAND, 0);
wxSizer* const bottom_btns_sizer = CreateButtonSizer(wxOK);
bottom_btns_sizer->Prepend(set_button, 0, wxRIGHT, 5);
wxSizer* const bottom_btns_sizer = CreateButtonSizer(wxOK|wxAPPLY);
bottom_btns_sizer->Prepend(clear_button, 0, wxLEFT, 5);
main_szr->Add(range_sizer, 0, wxEXPAND|wxLEFT|wxRIGHT, 5);
@ -532,6 +595,7 @@ wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
main_szr->Add(textctrl, 1, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, 5);
main_szr->Add(bottom_btns_sizer, 0, wxEXPAND|wxBOTTOM|wxRIGHT, 5);
main_szr->Add(m_bound_label, 0, wxCENTER, 0);
main_szr->Add(m_error_label, 0, wxCENTER, 0);
UpdateListContents();
@ -613,11 +677,11 @@ void InputConfigDialog::UpdateDeviceComboBox()
{
std::vector< GamepadPage* >::iterator i = m_padpages.begin(),
e = m_padpages.end();
ControllerInterface::DeviceQualifier dq;
DeviceQualifier dq;
for (; i != e; ++i)
{
(*i)->device_cbox->Clear();
std::vector<ControllerInterface::Device*>::const_iterator
std::vector<Device*>::const_iterator
di = g_controller_interface.Devices().begin(),
de = g_controller_interface.Devices().end();
for (; di!=de; ++di)
@ -947,7 +1011,7 @@ InputConfigDialog::InputConfigDialog(wxWindow* const parent, InputPlugin& plugin
, m_plugin(plugin)
{
m_pad_notebook = new wxNotebook(this, -1, wxDefaultPosition, wxDefaultSize, wxNB_DEFAULT);
for (unsigned int i = 0; i < plugin.controllers.size(); ++i)
for (unsigned int i = 0; i < std::min(plugin.controllers.size(), (size_t)MAX_WIIMOTES); ++i)
{
GamepadPage* gp = new GamepadPage(m_pad_notebook, m_plugin, i, this);
m_padpages.push_back(gp);

View File

@ -89,9 +89,10 @@ public:
wxStaticBoxSizer* CreateControlChooser(GamepadPage* const parent);
virtual bool Validate();
void DetectControl(wxCommandEvent& event);
void ClearControl(wxCommandEvent& event);
void SetControl(wxCommandEvent& event);
void SetDevice(wxCommandEvent& event);
void UpdateGUI();
@ -112,7 +113,9 @@ public:
private:
GamepadPage* const m_parent;
wxStaticText* m_bound_label;
ControllerInterface::DeviceQualifier m_devq;
wxStaticText* m_error_label;
DeviceQualifier m_devq;
bool GetExpressionForSelectedControl(wxString &expr);
};
class ExtensionButton : public wxButton

View File

@ -89,13 +89,53 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
dc.DrawRectangle( 0, 31 - z*31, 64, 2);
}
// circle for visual aid for diagonal adjustment
// octagon for visual aid for diagonal adjustment
dc.SetPen(*wxLIGHT_GREY_PEN);
dc.SetBrush(*wxWHITE_BRUSH);
if ( GROUP_TYPE_STICK == (*g)->control_group->type )
{
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawCircle( 32, 32, 32);
// outline and fill colors
wxBrush LightGrayBrush(_T("#dddddd"));
wxPen LightGrayPen(_T("#bfbfbf"));
dc.SetBrush(LightGrayBrush);
dc.SetPen(LightGrayPen);
// polygon offset
float max
, diagonal
, box = 64
, d_of = box / 256.0
, x_of = box / 2.0;
if (strcmp((*g)->control_group->name, "Main Stick") == 0)
{
max = (87.0 / 127.0) * 100;
diagonal = (55.0 / 127.0) * 100.0;
}
else if (strcmp((*g)->control_group->name,"C-Stick") == 0)
{
max = (74.0 / 127.0) * 100;
diagonal = (46.0 / 127.0) * 100;
}
else
{
max = (82.0 / 127.0) * 100;
diagonal = (58.0 / 127.0) * 100;
}
// polygon corners
wxPoint Points[8];
Points[0].x = (int)(0.0 * d_of + x_of); Points[0].y = (int)(max * d_of + x_of);
Points[1].x = (int)(diagonal * d_of + x_of); Points[1].y = (int)(diagonal * d_of + x_of);
Points[2].x = (int)(max * d_of + x_of); Points[2].y = (int)(0.0 * d_of + x_of);
Points[3].x = (int)(diagonal * d_of + x_of); Points[3].y = (int)(-diagonal * d_of + x_of);
Points[4].x = (int)(0.0 * d_of + x_of); Points[4].y = (int)(-max * d_of + x_of);
Points[5].x = (int)(-diagonal * d_of + x_of); Points[5].y = (int)(-diagonal * d_of + x_of);
Points[6].x = (int)(-max * d_of + x_of); Points[6].y = (int)(0.0 * d_of + x_of);
Points[7].x = (int)(-diagonal * d_of + x_of); Points[7].y = (int)(diagonal * d_of + x_of);
// draw polygon
dc.DrawPolygon(8, Points);
}
else
{
@ -106,7 +146,7 @@ void InputConfigDialog::UpdateBitmaps(wxTimerEvent& WXUNUSED(event))
{
// deadzone circle
dc.SetBrush(*wxLIGHT_GREY_BRUSH);
dc.DrawCircle( 32, 32, ((*g)->control_group)->settings[0]->value * 32 );
dc.DrawCircle( 32, 32, ((*g)->control_group)->settings[SETTING_DEADZONE]->value * 32 );
}
// raw dot

View File

@ -64,7 +64,7 @@ private:
DECLARE_EVENT_TABLE()
wxTextCtrl * CreateTextCtrl(wxPanel* parent, wxWindowID id = wxID_ANY, long Style = NULL);
wxTextCtrl * CreateTextCtrl(wxPanel* parent, wxWindowID id, long Style);
void CreateGUIControls();
void PopulateBottom();
void UnPopulateBottom();

View File

@ -658,6 +658,8 @@ void Host_SetWiiMoteConnectionState(int _State)
// Update field 1 or 2
event.SetInt(1);
NOTICE_LOG(WIIMOTE, "%s", static_cast<const char*>(event.GetString().c_str()));
main_frame->GetEventHandler()->AddPendingEvent(event);
}

View File

@ -113,7 +113,7 @@ void Host_SysMessage(const char *fmt, ...)
char msg[512];
va_start(list, fmt);
vsprintf(msg, fmt, list);
vsnprintf(msg, 512, fmt, list);
va_end(list);
size_t len = strlen(msg);
@ -200,26 +200,39 @@ std::string GetName(std::string filename)
extern "C"
{
#endif
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_UnPauseEmulation(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_UnPauseEmulation(JNIEnv *env, jobject obj)
{
PowerPC::Start();
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_PauseEmulation(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_PauseEmulation(JNIEnv *env, jobject obj)
{
PowerPC::Pause();
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_StopEmulation(JNIEnv *env, jobject obj)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulation(JNIEnv *env, jobject obj)
{
PowerPC::Stop();
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_DolphinEmulator_onTouchEvent(JNIEnv *env, jobject obj, jint Action, jfloat X, jfloat Y)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onTouchEvent(JNIEnv *env, jobject obj, jint Action, jfloat X, jfloat Y)
{
ButtonManager::TouchEvent(Action, X, Y);
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Button, jint Action)
{
const char *Device = env->GetStringUTFChars(jDevice, NULL);
std::string strDevice = std::string(Device);
ButtonManager::GamepadEvent(strDevice, Button, Action);
env->ReleaseStringUTFChars(jDevice, Device);
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_onGamePadMoveEvent(JNIEnv *env, jobject obj, jstring jDevice, jint Axis, jfloat Value)
{
const char *Device = env->GetStringUTFChars(jDevice, NULL);
std::string strDevice = std::string(Device);
ButtonManager::GamepadAxisEvent(strDevice, Axis, Value);
env->ReleaseStringUTFChars(jDevice, Device);
}
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetBanner(JNIEnv *env, jobject obj, jstring jFile)
JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetBanner(JNIEnv *env, jobject obj, jstring jFile)
{
const char *File = env->GetStringUTFChars(jFile, NULL);
jintArray Banner = env->NewIntArray(DVD_BANNER_WIDTH * DVD_BANNER_HEIGHT);
@ -231,7 +244,7 @@ JNIEXPORT jintArray JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetBanne
env->ReleaseStringUTFChars(jFile, File);
return Banner;
}
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetTitle(JNIEnv *env, jobject obj, jstring jFile)
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetTitle(JNIEnv *env, jobject obj, jstring jFile)
{
const char *File = env->GetStringUTFChars(jFile, NULL);
std::string Name = GetName(File);
@ -241,41 +254,50 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListItem_GetTitle(J
env->ReleaseStringUTFChars(jFile, File);
return env->NewStringUTF(Name.c_str());
}
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_GameListView_GetConfig(JNIEnv *env, jobject obj, jstring jKey, jstring jValue, jstring jDefault)
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv *env, jobject obj)
{
return env->NewStringUTF(scm_rev_str);
}
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jKey, jstring jValue, jstring jDefault)
{
IniFile ini;
ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX));
const char *File = env->GetStringUTFChars(jFile, NULL);
const char *Key = env->GetStringUTFChars(jKey, NULL);
const char *Value = env->GetStringUTFChars(jValue, NULL);
const char *Default = env->GetStringUTFChars(jDefault, NULL);
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File));
std::string value;
ini.Get(Key, Value, &value, Default);
env->ReleaseStringUTFChars(jFile, File);
env->ReleaseStringUTFChars(jKey, Key);
env->ReleaseStringUTFChars(jValue, Value);
env->ReleaseStringUTFChars(jDefault, Default);
return env->NewStringUTF(value.c_str());
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_GameListView_SetConfig(JNIEnv *env, jobject obj, jstring jKey, jstring jValue, jstring jDefault)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetConfig(JNIEnv *env, jobject obj, jstring jFile, jstring jKey, jstring jValue, jstring jDefault)
{
IniFile ini;
ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX));
const char *File = env->GetStringUTFChars(jFile, NULL);
const char *Key = env->GetStringUTFChars(jKey, NULL);
const char *Value = env->GetStringUTFChars(jValue, NULL);
const char *Default = env->GetStringUTFChars(jDefault, NULL);
ini.Set(Key, Value, Default);
ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX));
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string(File));
ini.Set(Key, Value, Default);
ini.Save(File::GetUserPath(D_CONFIG_IDX) + std::string(File));
env->ReleaseStringUTFChars(jFile, File);
env->ReleaseStringUTFChars(jKey, Key);
env->ReleaseStringUTFChars(jValue, Value);
env->ReleaseStringUTFChars(jDefault, Default);
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(JNIEnv *env, jobject obj, jstring jFile, jobject _surf, jint _width, jint _height)
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run(JNIEnv *env, jobject obj, jstring jFile, jobject _surf, jint _width, jint _height)
{
surf = ANativeWindow_fromSurface(env, _surf);
g_width = (int)_width;
@ -283,7 +305,6 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(J
// Install our callbacks
OSD::AddCallback(OSD::OSD_INIT, OSDCallbacks, 0);
OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1);
OSD::AddCallback(OSD::OSD_SHUTDOWN, OSDCallbacks, 2);
LogManager::Init();
@ -292,6 +313,15 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeGLSurfaceView_main(J
VideoBackend::ActivateBackend(SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoBackend);
WiimoteReal::LoadSettings();
// Load our Android specific settings
IniFile ini;
bool onscreencontrols = true;
ini.Load(File::GetUserPath(D_CONFIG_IDX) + std::string("Dolphin.ini"));
ini.Get("Android", "ScreenControls", &onscreencontrols, true);
if (onscreencontrols)
OSD::AddCallback(OSD::OSD_ONFRAME, OSDCallbacks, 1);
const char *File = env->GetStringUTFChars(jFile, NULL);
// No use running the loop when booting fails
if ( BootManager::BootCore( File ) )

View File

@ -149,6 +149,10 @@ NetPlaySetupDiag::NetPlaySetupDiag(wxWindow* const parent, const CGameListCtrl*
wxBoxSizer* const top_szr = new wxBoxSizer(wxHORIZONTAL);
top_szr->Add(port_lbl, 0, wxCENTER | wxRIGHT, 5);
top_szr->Add(m_host_port_text, 0);
#ifdef USE_UPNP
m_upnp_chk = new wxCheckBox(host_tab, wxID_ANY, _("Forward port (UPnP)"));
top_szr->Add(m_upnp_chk, 0, wxALL | wxALIGN_RIGHT, 5);
#endif
wxBoxSizer* const host_szr = new wxBoxSizer(wxVERTICAL);
host_szr->Add(top_szr, 0, wxALL | wxEXPAND, 5);
@ -216,10 +220,14 @@ void NetPlaySetupDiag::OnHost(wxCommandEvent&)
npd = new NetPlayDiag(m_parent, m_game_list, game, true);
unsigned long port = 0;
m_host_port_text->GetValue().ToULong(&port);
netplay_ptr = new NetPlayServer(u16(port)
, WxStrToStr(m_nickname_text->GetValue()), npd, game);
netplay_ptr = new NetPlayServer(u16(port), WxStrToStr(m_nickname_text->GetValue()), npd);
netplay_ptr->ChangeGame(game);
if (netplay_ptr->is_connected)
{
#ifdef USE_UPNP
if(m_upnp_chk->GetValue())
((NetPlayServer*)netplay_ptr)->TryPortmapping(port);
#endif
npd->Show();
Destroy();
}

View File

@ -48,6 +48,9 @@ private:
*m_connect_ip_text;
wxListBox* m_game_lbox;
#ifdef USE_UPNP
wxCheckBox* m_upnp_chk;
#endif
const CGameListCtrl* const m_game_list;
};

View File

@ -31,7 +31,7 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title,
{
A_turbo = B_turbo = X_turbo = Y_turbo = Z_turbo = L_turbo = R_turbo = START_turbo = DL_turbo = DR_turbo = DD_turbo = DU_turbo = false;
xaxis = yaxis = c_xaxis = c_yaxis = 128;
A_cont = B_cont = X_cont = Y_cont = Z_cont = L_cont = R_cont = START_cont = DL_cont = DR_cont = DD_cont = DU_cont = mstickx = msticky = cstickx = csticky = false;
A_cont = B_cont = X_cont = Y_cont = Z_cont = L_cont = L_button_cont = R_cont = R_button_cont = START_cont = DL_cont = DR_cont = DD_cont = DU_cont = mstickx = msticky = cstickx = csticky = false;
wxBoxSizer* const top_box = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer* const bottom_box = new wxBoxSizer(wxHORIZONTAL);
@ -41,7 +41,8 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title,
wxBoxSizer* const main_stick_box = new wxBoxSizer(wxVERTICAL);
static_bitmap_main = new wxStaticBitmap(this, ID_MAIN_STICK, TASInputDlg::CreateStickBitmap(128,128), wxDefaultPosition, wxDefaultSize);
static_bitmap_main->Bind(wxEVT_LEFT_UP, &TASInputDlg::OnMouseUpL, this);
static_bitmap_main->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::OnMouseDownL, this);
static_bitmap_main->Bind(wxEVT_MOTION, &TASInputDlg::OnMouseDownL, this);
static_bitmap_main->Bind(wxEVT_RIGHT_UP, &TASInputDlg::OnMouseUpR, this);
wx_mainX_s = new wxSlider(this, ID_MAIN_X_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
wx_mainX_s->SetMinSize(wxSize(120,-1));
@ -67,7 +68,8 @@ TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title,
wxBoxSizer* const c_stick_box = new wxBoxSizer(wxVERTICAL);
static_bitmap_c = new wxStaticBitmap(this, ID_C_STICK, TASInputDlg::CreateStickBitmap(128,128), wxDefaultPosition, wxDefaultSize);
static_bitmap_c->Bind(wxEVT_LEFT_UP, &TASInputDlg::OnMouseUpL, this);
static_bitmap_c->Bind(wxEVT_LEFT_DOWN, &TASInputDlg::OnMouseDownL, this);
static_bitmap_c->Bind(wxEVT_MOTION, &TASInputDlg::OnMouseDownL, this);
static_bitmap_c->Bind(wxEVT_RIGHT_UP, &TASInputDlg::OnMouseUpR, this);
wx_cX_s = new wxSlider(this, ID_C_X_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
wx_cX_s->SetMinSize(wxSize(120,-1));
@ -362,25 +364,53 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus)
Y_cont = false;
}
if(((PadStatus->button & PAD_TRIGGER_L) != 0))
if(((PadStatus->triggerLeft) != 0))
{
wx_l_button->SetValue(true);
if (PadStatus->triggerLeft == 255)
{
wx_l_button->SetValue(true);
L_button_cont = true;
}
else if (L_button_cont)
{
wx_l_button->SetValue(false);
L_button_cont = false;
}
wx_l_s->SetValue(PadStatus->triggerLeft);
wx_l_t->SetValue(wxString::Format(wxT("%i"), PadStatus->triggerLeft));
L_cont = true;
}
else if(L_cont)
{
wx_l_button->SetValue(false);
wx_l_s->SetValue(0);
wx_l_t->SetValue(wxT("0"));
L_cont = false;
}
if(((PadStatus->button & PAD_TRIGGER_R) != 0))
if(((PadStatus->triggerRight) != 0))
{
wx_r_button->SetValue(true);
if (PadStatus->triggerRight == 255)
{
wx_r_button->SetValue(true);
R_button_cont = true;
}
else if (R_button_cont)
{
wx_r_button->SetValue(false);
R_button_cont = false;
}
wx_r_s->SetValue(PadStatus->triggerRight);
wx_r_t->SetValue(wxString::Format(wxT("%i"), PadStatus->triggerRight));
R_cont = true;
}
else if(R_cont)
{
wx_r_button->SetValue(false);
wx_r_s->SetValue(0);
wx_r_t->SetValue(wxT("0"));
R_cont = false;
}
@ -407,6 +437,19 @@ void TASInputDlg::GetKeyBoardInput(SPADStatus *PadStatus)
}
}
void TASInputDlg::SetLandRTriggers()
{
if (wx_l_button->GetValue())
lTrig = 255;
else
lTrig = wx_l_s->GetValue();
if (wx_r_button->GetValue())
rTrig = 255;
else
rTrig = wx_r_s->GetValue();
}
void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID)
{
if (!IsShown())
@ -414,10 +457,7 @@ void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID)
//TODO:: Make this instant not when polled.
GetKeyBoardInput(PadStatus);
// TODO: implement support for more controllers
if (controllerID != 0)
return;
SetLandRTriggers();
PadStatus->stickX = mainX;
PadStatus->stickY = mainY;
@ -478,16 +518,6 @@ void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID)
else
PadStatus->button &= ~PAD_BUTTON_Y;
if(wx_l_button->IsChecked())
PadStatus->button |= PAD_TRIGGER_L;
else
PadStatus->button &= ~PAD_TRIGGER_L;
if(wx_r_button->IsChecked())
PadStatus->button |= PAD_TRIGGER_R;
else
PadStatus->button &= ~PAD_TRIGGER_R;
if(wx_z_button->IsChecked())
PadStatus->button |= PAD_TRIGGER_Z;
else
@ -752,8 +782,11 @@ void TASInputDlg::OnMouseUpR(wxMouseEvent& event)
}
void TASInputDlg::OnMouseUpL(wxMouseEvent& event)
void TASInputDlg::OnMouseDownL(wxMouseEvent& event)
{
if (event.GetEventType() == wxEVT_MOTION && !event.LeftIsDown())
return;
wxSlider *sliderX,*sliderY;
wxStaticBitmap *sbitmap;
wxTextCtrl *textX, *textY;

View File

@ -24,7 +24,7 @@ class TASInputDlg : public wxDialog
void OnCloseWindow(wxCloseEvent& event);
void UpdateFromSliders(wxCommandEvent& event);
void UpdateFromText(wxCommandEvent& event);
void OnMouseUpL(wxMouseEvent& event);
void OnMouseDownL(wxMouseEvent& event);
void OnMouseUpR(wxMouseEvent& event);
void ResetValues();
void GetValues(SPADStatus *PadStatus, int controllerID);
@ -33,6 +33,7 @@ class TASInputDlg : public wxDialog
void ButtonTurbo();
void GetKeyBoardInput(SPADStatus *PadStatus);
bool TextBoxHasFocus();
void SetLandRTriggers();
bool HasFocus();
wxBitmap CreateStickBitmap(int x, int y);
@ -78,7 +79,7 @@ class TASInputDlg : public wxDialog
wxStaticBitmap* static_bitmap_main, *static_bitmap_c;
wxBitmap bitmap;
bool A_turbo,B_turbo, X_turbo, Y_turbo, Z_turbo, L_turbo, R_turbo, START_turbo,DL_turbo,DR_turbo,DD_turbo,DU_turbo;
bool A_cont,B_cont, X_cont, Y_cont, Z_cont, L_cont, R_cont, START_cont,DL_cont,DR_cont,DD_cont,DU_cont,mstickx,msticky,cstickx,csticky;
bool A_cont,B_cont, X_cont, Y_cont, Z_cont, L_cont, L_button_cont, R_cont, R_button_cont, START_cont,DL_cont,DR_cont,DD_cont,DU_cont,mstickx,msticky,cstickx,csticky;
int xaxis,yaxis,c_xaxis,c_yaxis,update,update_axis;
DECLARE_EVENT_TABLE();

View File

@ -87,6 +87,7 @@ wxString aa_desc = wxTRANSLATE("Reduces the amount of aliasing caused by rasteri
wxString scaled_efb_copy_desc = wxTRANSLATE("Greatly increases quality of textures generated using render to texture effects.\nRaising the internal resolution will improve the effect of this setting.\nSlightly decreases performance and possibly causes issues (although unlikely).\n\nIf unsure, leave this checked.");
wxString pixel_lighting_desc = wxTRANSLATE("Calculate lighting of 3D graphics per-pixel rather than per vertex.\nDecreases emulation speed by some percent (depending on your GPU).\nThis usually is a safe enhancement, but might cause issues sometimes.\n\nIf unsure, leave this unchecked.");
wxString hacked_buffer_upload_desc = wxTRANSLATE("Use a hacked upload strategy to stream vertices.\nThis usually speed up, but is forbidden by OpenGL specification and may causes heavy glitches.\n\nIf unsure, leave this unchecked.");
wxString fast_depth_calc_desc = wxTRANSLATE("Use a less accurate algorithm to calculate depth values.\nCauses issues in a few games but might give a decent speedup.\n\nIf unsure, leave this checked.");
wxString force_filtering_desc = wxTRANSLATE("Force texture filtering even if the emulated game explicitly disabled it.\nImproves texture quality slightly but causes glitches in some games.\n\nIf unsure, leave this unchecked.");
wxString _3d_vision_desc = wxTRANSLATE("Enable 3D effects via stereoscopy using Nvidia 3D Vision technology if it's supported by your GPU.\nPossibly causes issues.\nRequires fullscreen to work.\n\nIf unsure, leave this unchecked.");
wxString internal_res_desc = wxTRANSLATE("Specifies the resolution used to render at. A high resolution will improve visual quality a lot but is also quite heavy on performance and might cause glitches in certain games.\n\"Multiple of 640x528\" is a bit slower than \"Window Size\" but yields less issues. Generally speaking, the lower the internal resolution is, the better your performance will be.\n\nIf unsure, select 640x528.");
@ -130,6 +131,7 @@ wxString shader_errors_desc = wxTRANSLATE("Usually if shader compilation fails,
wxArrayString GetListOfResolutions()
{
wxArrayString retlist;
retlist.Add("Auto");
#ifdef _WIN32
DWORD iModeNum = 0;
DEVMODE dmi;
@ -496,15 +498,12 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
// - other hacks
{
wxGridSizer* const szr_other = new wxGridSizer(2, 5, 5);
SettingCheckBox* hacked_buffer_upload_cb;
szr_other->Add(CreateCheckBox(page_hacks, _("Cache Display Lists"), wxGetTranslation(dlc_desc), vconfig.bDlistCachingEnable));
szr_other->Add(CreateCheckBox(page_hacks, _("Disable Destination Alpha"), wxGetTranslation(disable_dstalpha_desc), vconfig.bDstAlphaPass));
szr_other->Add(CreateCheckBox(page_hacks, _("OpenCL Texture Decoder"), wxGetTranslation(opencl_desc), vconfig.bEnableOpenCL));
szr_other->Add(CreateCheckBox(page_hacks, _("OpenMP Texture Decoder"), wxGetTranslation(omp_desc), vconfig.bOMPDecoder));
szr_other->Add(hacked_buffer_upload_cb = CreateCheckBox(page_hacks, _("Hacked Buffer Upload"), wxGetTranslation(hacked_buffer_upload_desc), vconfig.bHackedBufferUpload));
if (Core::GetState() != Core::CORE_UNINITIALIZED)
hacked_buffer_upload_cb->Disable();
szr_other->Add(CreateCheckBox(page_hacks, _("Fast Depth Calculation"), wxGetTranslation(fast_depth_calc_desc), vconfig.bFastDepthCalc));
szr_other->Add(hacked_buffer_upload = CreateCheckBox(page_hacks, _("Hacked Buffer Upload"), wxGetTranslation(hacked_buffer_upload_desc), vconfig.bHackedBufferUpload));
wxStaticBoxSizer* const group_other = new wxStaticBoxSizer(wxVERTICAL, page_hacks, _("Other"));
group_other->Add(szr_other, 1, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);

View File

@ -8,6 +8,7 @@
#include "ConfigManager.h"
#include "VideoConfig.h"
#include "Core.h"
#include <wx/wx.h>
#include <wx/textctrl.h>
@ -165,6 +166,10 @@ protected:
// XFB
virtual_xfb->Enable(vconfig.bUseXFB);
real_xfb->Enable(vconfig.bUseXFB);
// OGL Hacked buffer
hacked_buffer_upload->Enable(Core::GetState() == Core::CORE_UNINITIALIZED && vconfig.backend_info.APIType == API_OPENGL);
hacked_buffer_upload->Show(vconfig.backend_info.APIType == API_OPENGL);
ev.Skip();
}
@ -194,6 +199,7 @@ protected:
SettingRadioButton* efbcopy_ram;
SettingCheckBox* cache_efb_copies;
SettingCheckBox* emulate_efb_format_changes;
SettingCheckBox* hacked_buffer_upload;
SettingRadioButton* virtual_xfb;
SettingRadioButton* real_xfb;

View File

@ -15,7 +15,7 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
wxStaticText* wiimote_label[4];
wxChoice* wiimote_source_ch[4];
for (unsigned int i = 0; i < 4; ++i)
for (unsigned int i = 0; i < MAX_WIIMOTES; ++i)
{
wxString str;
str.Printf(_("Wiimote %i"), i + 1);
@ -54,8 +54,25 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
wiimote_sizer->Add(wiimote_configure_bt[i]);
}
wiimote_group->Add(wiimote_sizer, 1, wxEXPAND, 5 );
// "BalanceBoard" layout
wxStaticBoxSizer* const bb_group = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Balance Board"));
wxFlexGridSizer* const bb_sizer = new wxFlexGridSizer(1, 5, 5);
int source_ctrl_id = wxWindow::NewControlId();
m_wiimote_index_from_ctrl_id.insert(std::pair<wxWindowID, unsigned int>(source_ctrl_id, WIIMOTE_BALANCE_BOARD));
const wxString src_choices[] = { _("None"), _("Real Balance Board") };
wxChoice* bb_source = new wxChoice(this, source_ctrl_id, wxDefaultPosition, wxDefaultSize, sizeof(src_choices)/sizeof(*src_choices), src_choices);
bb_source->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &WiimoteConfigDiag::SelectSource, this);
m_orig_wiimote_sources[WIIMOTE_BALANCE_BOARD] = g_wiimote_sources[WIIMOTE_BALANCE_BOARD];
bb_source->Select(m_orig_wiimote_sources[WIIMOTE_BALANCE_BOARD] ? 1 : 0);
bb_sizer->Add(bb_source, 0, wxALIGN_CENTER_VERTICAL);
bb_group->Add(bb_sizer, 1, wxEXPAND, 5 );
// "Real wiimotes" controls
wxButton* const refresh_btn = new wxButton(this, -1, _("Refresh"), wxDefaultPosition);
refresh_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, &WiimoteConfigDiag::RefreshRealWiimotes, this);
@ -89,7 +106,6 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
wxSlider* const WiiSensBarSens = new wxSlider(this, wxID_ANY, 0, 0, 4, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
wxSlider* const WiimoteSpkVolume = new wxSlider(this, wxID_ANY, 0, 0, 127);
wxCheckBox* const WiimoteMotor = new wxCheckBox(this, wxID_ANY, _("Wiimote Motor"));
wxCheckBox* const WiimoteReconnectOnLoad = new wxCheckBox(this, wxID_ANY, _("Reconnect Wiimote on State Loading"));
wxStaticText* const WiiSensBarPosText = new wxStaticText(this, wxID_ANY, _("Sensor Bar Position:"));
wxStaticText* const WiiSensBarSensText = new wxStaticText(this, wxID_ANY, _("IR Sensitivity:"));
@ -126,13 +142,11 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
WiiSensBarSens->SetValue(SConfig::GetInstance().m_SYSCONF->GetData<u32>("BT.SENS"));
WiimoteSpkVolume->SetValue(SConfig::GetInstance().m_SYSCONF->GetData<u8>("BT.SPKV"));
WiimoteMotor->SetValue(SConfig::GetInstance().m_SYSCONF->GetData<bool>("BT.MOT"));
WiimoteReconnectOnLoad->SetValue(SConfig::GetInstance().m_WiimoteReconnectOnLoad);
WiiSensBarPos->Bind(wxEVT_COMMAND_CHOICE_SELECTED, &WiimoteConfigDiag::OnSensorBarPos, this);
WiiSensBarSens->Bind(wxEVT_COMMAND_SLIDER_UPDATED, &WiimoteConfigDiag::OnSensorBarSensitivity, this);
WiimoteSpkVolume->Bind(wxEVT_COMMAND_SLIDER_UPDATED, &WiimoteConfigDiag::OnSpeakerVolume, this);
WiimoteMotor->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, &WiimoteConfigDiag::OnMotor, this);
WiimoteReconnectOnLoad->Bind(wxEVT_COMMAND_CHECKBOX_CLICKED, &WiimoteConfigDiag::OnReconnectOnLoad, this);
// "General Settings" layout
@ -158,7 +172,6 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
wxGridSizer* const general_wiimote_sizer = new wxGridSizer(1, 5, 5);
general_wiimote_sizer->Add(WiimoteMotor);
general_wiimote_sizer->Add(WiimoteReconnectOnLoad);
general_sizer->Add(choice_sizer);
general_sizer->Add(general_wiimote_sizer);
@ -166,6 +179,7 @@ WiimoteConfigDiag::WiimoteConfigDiag(wxWindow* const parent, InputPlugin& plugin
// Dialog layout
main_sizer->Add(wiimote_group, 0, wxEXPAND | wxALL, 5);
main_sizer->Add(bb_group, 0, wxEXPAND | wxALL, 5);
main_sizer->Add(real_wiimotes_group, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
main_sizer->Add(general_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
main_sizer->Add(CreateButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | wxLEFT | wxRIGHT | wxBOTTOM, 5);
@ -196,17 +210,23 @@ void WiimoteConfigDiag::SelectSource(wxCommandEvent& event)
// Revert if the dialog is canceled.
int index = m_wiimote_index_from_ctrl_id[event.GetId()];
WiimoteReal::ChangeWiimoteSource(index, event.GetInt());
if (g_wiimote_sources[index] != WIIMOTE_SRC_EMU && g_wiimote_sources[index] != WIIMOTE_SRC_HYBRID)
wiimote_configure_bt[index]->Disable();
if(index != WIIMOTE_BALANCE_BOARD)
{
WiimoteReal::ChangeWiimoteSource(index, event.GetInt());
if (g_wiimote_sources[index] != WIIMOTE_SRC_EMU && g_wiimote_sources[index] != WIIMOTE_SRC_HYBRID)
wiimote_configure_bt[index]->Disable();
else
wiimote_configure_bt[index]->Enable();
}
else
wiimote_configure_bt[index]->Enable();
{
WiimoteReal::ChangeWiimoteSource(index, event.GetInt() ? WIIMOTE_SRC_REAL : WIIMOTE_SRC_NONE);
}
}
void WiimoteConfigDiag::RevertSource()
{
for (int i = 0; i < 4; ++i)
for (int i = 0; i < MAX_BBMOTES; ++i)
g_wiimote_sources[i] = m_orig_wiimote_sources[i];
}
@ -225,6 +245,10 @@ void WiimoteConfigDiag::Save(wxCommandEvent& event)
sec.Set("Source", (int)g_wiimote_sources[i]);
}
std::string secname("BalanceBoard");
IniFile::Section& sec = *inifile.GetOrCreateSection(secname.c_str());
sec.Set("Source", (int)g_wiimote_sources[WIIMOTE_BALANCE_BOARD]);
inifile.Save(ini_filename);

View File

@ -52,11 +52,6 @@ public:
SConfig::GetInstance().m_SYSCONF->SetData("BT.MOT", event.GetInt());
event.Skip();
}
void OnReconnectOnLoad(wxCommandEvent& event)
{
SConfig::GetInstance().m_WiimoteReconnectOnLoad = event.IsChecked();
event.Skip();
}
void OnContinuousScanning(wxCommandEvent& event)
{
SConfig::GetInstance().m_WiimoteContinuousScanning = event.IsChecked();
@ -76,9 +71,9 @@ private:
wxNotebook* m_pad_notebook;
std::map<wxWindowID, unsigned int> m_wiimote_index_from_ctrl_id;
unsigned int m_orig_wiimote_sources[4];
unsigned int m_orig_wiimote_sources[MAX_BBMOTES];
wxButton* wiimote_configure_bt[4];
wxButton* wiimote_configure_bt[MAX_WIIMOTES];
std::map<wxWindowID, unsigned int> m_wiimote_index_from_conf_bt_id;
};

View File

@ -32,42 +32,6 @@ extern char **environ;
namespace X11Utils
{
void SendClientEvent(Display *dpy, const char *message,
int data1, int data2, int data3, int data4)
{
XEvent event;
Window win = (Window)Core::GetWindowHandle();
// Init X event structure for client message
event.xclient.type = ClientMessage;
event.xclient.format = 32;
event.xclient.data.l[0] = XInternAtom(dpy, message, False);
event.xclient.data.l[1] = data1;
event.xclient.data.l[2] = data2;
event.xclient.data.l[3] = data3;
event.xclient.data.l[4] = data4;
// Send the event
if (!XSendEvent(dpy, win, False, False, &event))
ERROR_LOG(VIDEO, "Failed to send message %s to the emulator window.", message);
}
void SendKeyEvent(Display *dpy, int key)
{
XEvent event;
Window win = (Window)Core::GetWindowHandle();
// Init X event structure for key press event
event.xkey.type = KeyPress;
// WARNING: This works for ASCII keys. If in the future other keys are needed
// convert with InputCommon::wxCharCodeWXToX from X11InputBase.cpp.
event.xkey.keycode = XKeysymToKeycode(dpy, key);
// Send the event
if (!XSendEvent(dpy, win, False, False, &event))
ERROR_LOG(VIDEO, "Failed to send key press event to the emulator window.");
}
void SendButtonEvent(Display *dpy, int button, int x, int y, bool pressed)
{
XEvent event;
@ -200,6 +164,9 @@ XRRConfiguration::~XRRConfiguration()
void XRRConfiguration::Update()
{
if(SConfig::GetInstance().m_LocalCoreStartupParameter.strFullscreenResolution == "Auto")
return;
if (!bValid)
return;

View File

@ -43,9 +43,6 @@
namespace X11Utils
{
void SendClientEvent(Display *dpy, const char *message,
int data1, int data2, int data3, int data4);
void SendKeyEvent(Display *dpy, int key);
void SendButtonEvent(Display *dpy, int button, int x, int y, bool pressed);
void SendMotionEvent(Display *dpy, int x, int y);
void EWMH_Fullscreen(Display *dpy, int action);

View File

@ -1,514 +1,206 @@
static const unsigned char dolphin_ico32x32[] = {
0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00,
0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20,
0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73,
0x7A, 0x7A, 0xF4, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01,
0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x0A, 0x4F, 0x69, 0x43,
0x43, 0x50, 0x50, 0x68, 0x6F, 0x74, 0x6F, 0x73, 0x68, 0x6F,
0x70, 0x20, 0x49, 0x43, 0x43, 0x20, 0x70, 0x72, 0x6F, 0x66,
0x69, 0x6C, 0x65, 0x00, 0x00, 0x78, 0xDA, 0x9D, 0x53, 0x67,
0x54, 0x53, 0xE9, 0x16, 0x3D, 0xF7, 0xDE, 0xF4, 0x42, 0x4B,
0x88, 0x80, 0x94, 0x4B, 0x6F, 0x52, 0x15, 0x08, 0x20, 0x52,
0x42, 0x8B, 0x80, 0x14, 0x91, 0x26, 0x2A, 0x21, 0x09, 0x10,
0x4A, 0x88, 0x21, 0xA1, 0xD9, 0x15, 0x51, 0xC1, 0x11, 0x45,
0x45, 0x04, 0x1B, 0xC8, 0xA0, 0x88, 0x03, 0x8E, 0x8E, 0x80,
0x8C, 0x15, 0x51, 0x2C, 0x0C, 0x8A, 0x0A, 0xD8, 0x07, 0xE4,
0x21, 0xA2, 0x8E, 0x83, 0xA3, 0x88, 0x8A, 0xCA, 0xFB, 0xE1,
0x7B, 0xA3, 0x6B, 0xD6, 0xBC, 0xF7, 0xE6, 0xCD, 0xFE, 0xB5,
0xD7, 0x3E, 0xE7, 0xAC, 0xF3, 0x9D, 0xB3, 0xCF, 0x07, 0xC0,
0x08, 0x0C, 0x96, 0x48, 0x33, 0x51, 0x35, 0x80, 0x0C, 0xA9,
0x42, 0x1E, 0x11, 0xE0, 0x83, 0xC7, 0xC4, 0xC6, 0xE1, 0xE4,
0x2E, 0x40, 0x81, 0x0A, 0x24, 0x70, 0x00, 0x10, 0x08, 0xB3,
0x64, 0x21, 0x73, 0xFD, 0x23, 0x01, 0x00, 0xF8, 0x7E, 0x3C,
0x3C, 0x2B, 0x22, 0xC0, 0x07, 0xBE, 0x00, 0x01, 0x78, 0xD3,
0x0B, 0x08, 0x00, 0xC0, 0x4D, 0x9B, 0xC0, 0x30, 0x1C, 0x87,
0xFF, 0x0F, 0xEA, 0x42, 0x99, 0x5C, 0x01, 0x80, 0x84, 0x01,
0xC0, 0x74, 0x91, 0x38, 0x4B, 0x08, 0x80, 0x14, 0x00, 0x40,
0x7A, 0x8E, 0x42, 0xA6, 0x00, 0x40, 0x46, 0x01, 0x80, 0x9D,
0x98, 0x26, 0x53, 0x00, 0xA0, 0x04, 0x00, 0x60, 0xCB, 0x63,
0x62, 0xE3, 0x00, 0x50, 0x2D, 0x00, 0x60, 0x27, 0x7F, 0xE6,
0xD3, 0x00, 0x80, 0x9D, 0xF8, 0x99, 0x7B, 0x01, 0x00, 0x5B,
0x94, 0x21, 0x15, 0x01, 0xA0, 0x91, 0x00, 0x20, 0x13, 0x65,
0x88, 0x44, 0x00, 0x68, 0x3B, 0x00, 0xAC, 0xCF, 0x56, 0x8A,
0x45, 0x00, 0x58, 0x30, 0x00, 0x14, 0x66, 0x4B, 0xC4, 0x39,
0x00, 0xD8, 0x2D, 0x00, 0x30, 0x49, 0x57, 0x66, 0x48, 0x00,
0xB0, 0xB7, 0x00, 0xC0, 0xCE, 0x10, 0x0B, 0xB2, 0x00, 0x08,
0x0C, 0x00, 0x30, 0x51, 0x88, 0x85, 0x29, 0x00, 0x04, 0x7B,
0x00, 0x60, 0xC8, 0x23, 0x23, 0x78, 0x00, 0x84, 0x99, 0x00,
0x14, 0x46, 0xF2, 0x57, 0x3C, 0xF1, 0x2B, 0xAE, 0x10, 0xE7,
0x2A, 0x00, 0x00, 0x78, 0x99, 0xB2, 0x3C, 0xB9, 0x24, 0x39,
0x45, 0x81, 0x5B, 0x08, 0x2D, 0x71, 0x07, 0x57, 0x57, 0x2E,
0x1E, 0x28, 0xCE, 0x49, 0x17, 0x2B, 0x14, 0x36, 0x61, 0x02,
0x61, 0x9A, 0x40, 0x2E, 0xC2, 0x79, 0x99, 0x19, 0x32, 0x81,
0x34, 0x0F, 0xE0, 0xF3, 0xCC, 0x00, 0x00, 0xA0, 0x91, 0x15,
0x11, 0xE0, 0x83, 0xF3, 0xFD, 0x78, 0xCE, 0x0E, 0xAE, 0xCE,
0xCE, 0x36, 0x8E, 0xB6, 0x0E, 0x5F, 0x2D, 0xEA, 0xBF, 0x06,
0xFF, 0x22, 0x62, 0x62, 0xE3, 0xFE, 0xE5, 0xCF, 0xAB, 0x70,
0x40, 0x00, 0x00, 0xE1, 0x74, 0x7E, 0xD1, 0xFE, 0x2C, 0x2F,
0xB3, 0x1A, 0x80, 0x3B, 0x06, 0x80, 0x6D, 0xFE, 0xA2, 0x25,
0xEE, 0x04, 0x68, 0x5E, 0x0B, 0xA0, 0x75, 0xF7, 0x8B, 0x66,
0xB2, 0x0F, 0x40, 0xB5, 0x00, 0xA0, 0xE9, 0xDA, 0x57, 0xF3,
0x70, 0xF8, 0x7E, 0x3C, 0x3C, 0x45, 0xA1, 0x90, 0xB9, 0xD9,
0xD9, 0xE5, 0xE4, 0xE4, 0xD8, 0x4A, 0xC4, 0x42, 0x5B, 0x61,
0xCA, 0x57, 0x7D, 0xFE, 0x67, 0xC2, 0x5F, 0xC0, 0x57, 0xFD,
0x6C, 0xF9, 0x7E, 0x3C, 0xFC, 0xF7, 0xF5, 0xE0, 0xBE, 0xE2,
0x24, 0x81, 0x32, 0x5D, 0x81, 0x47, 0x04, 0xF8, 0xE0, 0xC2,
0xCC, 0xF4, 0x4C, 0xA5, 0x1C, 0xCF, 0x92, 0x09, 0x84, 0x62,
0xDC, 0xE6, 0x8F, 0x47, 0xFC, 0xB7, 0x0B, 0xFF, 0xFC, 0x1D,
0xD3, 0x22, 0xC4, 0x49, 0x62, 0xB9, 0x58, 0x2A, 0x14, 0xE3,
0x51, 0x12, 0x71, 0x8E, 0x44, 0x9A, 0x8C, 0xF3, 0x32, 0xA5,
0x22, 0x89, 0x42, 0x92, 0x29, 0xC5, 0x25, 0xD2, 0xFF, 0x64,
0xE2, 0xDF, 0x2C, 0xFB, 0x03, 0x3E, 0xDF, 0x35, 0x00, 0xB0,
0x6A, 0x3E, 0x01, 0x7B, 0x91, 0x2D, 0xA8, 0x5D, 0x63, 0x03,
0xF6, 0x4B, 0x27, 0x10, 0x58, 0x74, 0xC0, 0xE2, 0xF7, 0x00,
0x00, 0xF2, 0xBB, 0x6F, 0xC1, 0xD4, 0x28, 0x08, 0x03, 0x80,
0x68, 0x83, 0xE1, 0xCF, 0x77, 0xFF, 0xEF, 0x3F, 0xFD, 0x47,
0xA0, 0x25, 0x00, 0x80, 0x66, 0x49, 0x92, 0x71, 0x00, 0x00,
0x5E, 0x44, 0x24, 0x2E, 0x54, 0xCA, 0xB3, 0x3F, 0xC7, 0x08,
0x00, 0x00, 0x44, 0xA0, 0x81, 0x2A, 0xB0, 0x41, 0x1B, 0xF4,
0xC1, 0x18, 0x2C, 0xC0, 0x06, 0x1C, 0xC1, 0x05, 0xDC, 0xC1,
0x0B, 0xFC, 0x60, 0x36, 0x84, 0x42, 0x24, 0xC4, 0xC2, 0x42,
0x10, 0x42, 0x0A, 0x64, 0x80, 0x1C, 0x72, 0x60, 0x29, 0xAC,
0x82, 0x42, 0x28, 0x86, 0xCD, 0xB0, 0x1D, 0x2A, 0x60, 0x2F,
0xD4, 0x40, 0x1D, 0x34, 0xC0, 0x51, 0x68, 0x86, 0x93, 0x70,
0x0E, 0x2E, 0xC2, 0x55, 0xB8, 0x0E, 0x3D, 0x70, 0x0F, 0xFA,
0x61, 0x08, 0x9E, 0xC1, 0x28, 0xBC, 0x81, 0x09, 0x04, 0x41,
0xC8, 0x08, 0x13, 0x61, 0x21, 0xDA, 0x88, 0x01, 0x62, 0x8A,
0x58, 0x23, 0x8E, 0x08, 0x17, 0x99, 0x85, 0xF8, 0x21, 0xC1,
0x48, 0x04, 0x12, 0x8B, 0x24, 0x20, 0xC9, 0x88, 0x14, 0x51,
0x22, 0x4B, 0x91, 0x35, 0x48, 0x31, 0x52, 0x8A, 0x54, 0x20,
0x55, 0x48, 0x1D, 0xF2, 0x3D, 0x72, 0x02, 0x39, 0x87, 0x5C,
0x46, 0xBA, 0x91, 0x3B, 0xC8, 0x00, 0x32, 0x82, 0xFC, 0x86,
0xBC, 0x47, 0x31, 0x94, 0x81, 0xB2, 0x51, 0x3D, 0xD4, 0x0C,
0xB5, 0x43, 0xB9, 0xA8, 0x37, 0x1A, 0x84, 0x46, 0xA2, 0x0B,
0xD0, 0x64, 0x74, 0x31, 0x9A, 0x8F, 0x16, 0xA0, 0x9B, 0xD0,
0x72, 0xB4, 0x1A, 0x3D, 0x8C, 0x36, 0xA1, 0xE7, 0xD0, 0xAB,
0x68, 0x0F, 0xDA, 0x8F, 0x3E, 0x43, 0xC7, 0x30, 0xC0, 0xE8,
0x18, 0x07, 0x33, 0xC4, 0x6C, 0x30, 0x2E, 0xC6, 0xC3, 0x42,
0xB1, 0x38, 0x2C, 0x09, 0x93, 0x63, 0xCB, 0xB1, 0x22, 0xAC,
0x0C, 0xAB, 0xC6, 0x1A, 0xB0, 0x56, 0xAC, 0x03, 0xBB, 0x89,
0xF5, 0x63, 0xCF, 0xB1, 0x77, 0x04, 0x12, 0x81, 0x45, 0xC0,
0x09, 0x36, 0x04, 0x77, 0x42, 0x20, 0x61, 0x1E, 0x41, 0x48,
0x58, 0x4C, 0x58, 0x4E, 0xD8, 0x48, 0xA8, 0x20, 0x1C, 0x24,
0x34, 0x11, 0xDA, 0x09, 0x37, 0x09, 0x03, 0x84, 0x51, 0xC2,
0x27, 0x22, 0x93, 0xA8, 0x4B, 0xB4, 0x26, 0xBA, 0x11, 0xF9,
0xC4, 0x18, 0x62, 0x32, 0x31, 0x87, 0x58, 0x48, 0x2C, 0x23,
0xD6, 0x12, 0x8F, 0x13, 0x2F, 0x10, 0x7B, 0x88, 0x43, 0xC4,
0x37, 0x24, 0x12, 0x89, 0x43, 0x32, 0x27, 0xB9, 0x90, 0x02,
0x49, 0xB1, 0xA4, 0x54, 0xD2, 0x12, 0xD2, 0x46, 0xD2, 0x6E,
0x52, 0x23, 0xE9, 0x2C, 0xA9, 0x9B, 0x34, 0x48, 0x1A, 0x23,
0x93, 0xC9, 0xDA, 0x64, 0x6B, 0xB2, 0x07, 0x39, 0x94, 0x2C,
0x20, 0x2B, 0xC8, 0x85, 0xE4, 0x9D, 0xE4, 0xC3, 0xE4, 0x33,
0xE4, 0x1B, 0xE4, 0x21, 0xF2, 0x5B, 0x0A, 0x9D, 0x62, 0x40,
0x71, 0xA4, 0xF8, 0x53, 0xE2, 0x28, 0x52, 0xCA, 0x6A, 0x4A,
0x19, 0xE5, 0x10, 0xE5, 0x34, 0xE5, 0x06, 0x65, 0x98, 0x32,
0x41, 0x55, 0xA3, 0x9A, 0x52, 0xDD, 0xA8, 0xA1, 0x54, 0x11,
0x35, 0x8F, 0x5A, 0x42, 0xAD, 0xA1, 0xB6, 0x52, 0xAF, 0x51,
0x87, 0xA8, 0x13, 0x34, 0x75, 0x9A, 0x39, 0xCD, 0x83, 0x16,
0x49, 0x4B, 0xA5, 0xAD, 0xA2, 0x95, 0xD3, 0x1A, 0x68, 0x17,
0x68, 0xF7, 0x69, 0xAF, 0xE8, 0x74, 0xBA, 0x11, 0xDD, 0x95,
0x1E, 0x4E, 0x97, 0xD0, 0x57, 0xD2, 0xCB, 0xE9, 0x47, 0xE8,
0x97, 0xE8, 0x03, 0xF4, 0x77, 0x0C, 0x0D, 0x86, 0x15, 0x83,
0xC7, 0x88, 0x67, 0x28, 0x19, 0x9B, 0x18, 0x07, 0x18, 0x67,
0x19, 0x77, 0x18, 0xAF, 0x98, 0x4C, 0xA6, 0x19, 0xD3, 0x8B,
0x19, 0xC7, 0x54, 0x30, 0x37, 0x31, 0xEB, 0x98, 0xE7, 0x99,
0x0F, 0x99, 0x6F, 0x55, 0x58, 0x2A, 0xB6, 0x2A, 0x7C, 0x15,
0x91, 0xCA, 0x0A, 0x95, 0x4A, 0x95, 0x26, 0x95, 0x1B, 0x2A,
0x2F, 0x54, 0xA9, 0xAA, 0xA6, 0xAA, 0xDE, 0xAA, 0x0B, 0x55,
0xF3, 0x55, 0xCB, 0x54, 0x8F, 0xA9, 0x5E, 0x53, 0x7D, 0xAE,
0x46, 0x55, 0x33, 0x53, 0xE3, 0xA9, 0x09, 0xD4, 0x96, 0xAB,
0x55, 0xAA, 0x9D, 0x50, 0xEB, 0x53, 0x1B, 0x53, 0x67, 0xA9,
0x3B, 0xA8, 0x87, 0xAA, 0x67, 0xA8, 0x6F, 0x54, 0x3F, 0xA4,
0x7E, 0x59, 0xFD, 0x89, 0x06, 0x59, 0xC3, 0x4C, 0xC3, 0x4F,
0x43, 0xA4, 0x51, 0xA0, 0xB1, 0x5F, 0xE3, 0xBC, 0xC6, 0x20,
0x0B, 0x63, 0x19, 0xB3, 0x78, 0x2C, 0x21, 0x6B, 0x0D, 0xAB,
0x86, 0x75, 0x81, 0x35, 0xC4, 0x26, 0xB1, 0xCD, 0xD9, 0x7C,
0x76, 0x2A, 0xBB, 0x98, 0xFD, 0x1D, 0xBB, 0x8B, 0x3D, 0xAA,
0xA9, 0xA1, 0x39, 0x43, 0x33, 0x4A, 0x33, 0x57, 0xB3, 0x52,
0xF3, 0x94, 0x66, 0x3F, 0x07, 0xE3, 0x98, 0x71, 0xF8, 0x9C,
0x74, 0x4E, 0x09, 0xE7, 0x28, 0xA7, 0x97, 0xF3, 0x7E, 0x8A,
0xDE, 0x14, 0xEF, 0x29, 0xE2, 0x29, 0x1B, 0xA6, 0x34, 0x4C,
0xB9, 0x31, 0x65, 0x5C, 0x6B, 0xAA, 0x96, 0x97, 0x96, 0x58,
0xAB, 0x48, 0xAB, 0x51, 0xAB, 0x47, 0xEB, 0xBD, 0x36, 0xAE,
0xED, 0xA7, 0x9D, 0xA6, 0xBD, 0x45, 0xBB, 0x59, 0xFB, 0x81,
0x0E, 0x41, 0xC7, 0x4A, 0x27, 0x5C, 0x27, 0x47, 0x67, 0x8F,
0xCE, 0x05, 0x9D, 0xE7, 0x53, 0xD9, 0x53, 0xDD, 0xA7, 0x0A,
0xA7, 0x16, 0x4D, 0x3D, 0x3A, 0xF5, 0xAE, 0x2E, 0xAA, 0x6B,
0xA5, 0x1B, 0xA1, 0xBB, 0x44, 0x77, 0xBF, 0x6E, 0xA7, 0xEE,
0x98, 0x9E, 0xBE, 0x5E, 0x80, 0x9E, 0x4C, 0x6F, 0xA7, 0xDE,
0x79, 0xBD, 0xE7, 0xFA, 0x1C, 0x7D, 0x2F, 0xFD, 0x54, 0xFD,
0x6D, 0xFA, 0xA7, 0xF5, 0x47, 0x0C, 0x58, 0x06, 0xB3, 0x0C,
0x24, 0x06, 0xDB, 0x0C, 0xCE, 0x18, 0x3C, 0xC5, 0x35, 0x71,
0x6F, 0x3C, 0x1D, 0x2F, 0xC7, 0xDB, 0xF1, 0x51, 0x43, 0x5D,
0xC3, 0x40, 0x43, 0xA5, 0x61, 0x95, 0x61, 0x97, 0xE1, 0x84,
0x91, 0xB9, 0xD1, 0x3C, 0xA3, 0xD5, 0x46, 0x8D, 0x46, 0x0F,
0x8C, 0x69, 0xC6, 0x5C, 0xE3, 0x24, 0xE3, 0x6D, 0xC6, 0x6D,
0xC6, 0xA3, 0x26, 0x06, 0x26, 0x21, 0x26, 0x4B, 0x4D, 0xEA,
0x4D, 0xEE, 0x9A, 0x52, 0x4D, 0xB9, 0xA6, 0x29, 0xA6, 0x3B,
0x4C, 0x3B, 0x4C, 0xC7, 0xCD, 0xCC, 0xCD, 0xA2, 0xCD, 0xD6,
0x99, 0x35, 0x9B, 0x3D, 0x31, 0xD7, 0x32, 0xE7, 0x9B, 0xE7,
0x9B, 0xD7, 0x9B, 0xDF, 0xB7, 0x60, 0x5A, 0x78, 0x5A, 0x2C,
0xB6, 0xA8, 0xB6, 0xB8, 0x65, 0x49, 0xB2, 0xE4, 0x5A, 0xA6,
0x59, 0xEE, 0xB6, 0xBC, 0x6E, 0x85, 0x5A, 0x39, 0x59, 0xA5,
0x58, 0x55, 0x5A, 0x5D, 0xB3, 0x46, 0xAD, 0x9D, 0xAD, 0x25,
0xD6, 0xBB, 0xAD, 0xBB, 0xA7, 0x11, 0xA7, 0xB9, 0x4E, 0x93,
0x4E, 0xAB, 0x9E, 0xD6, 0x67, 0xC3, 0xB0, 0xF1, 0xB6, 0xC9,
0xB6, 0xA9, 0xB7, 0x19, 0xB0, 0xE5, 0xD8, 0x06, 0xDB, 0xAE,
0xB6, 0x6D, 0xB6, 0x7D, 0x61, 0x67, 0x62, 0x17, 0x67, 0xB7,
0xC5, 0xAE, 0xC3, 0xEE, 0x93, 0xBD, 0x93, 0x7D, 0xBA, 0x7D,
0x8D, 0xFD, 0x3D, 0x07, 0x0D, 0x87, 0xD9, 0x0E, 0xAB, 0x1D,
0x5A, 0x1D, 0x7E, 0x73, 0xB4, 0x72, 0x14, 0x3A, 0x56, 0x3A,
0xDE, 0x9A, 0xCE, 0x9C, 0xEE, 0x3F, 0x7D, 0xC5, 0xF4, 0x96,
0xE9, 0x2F, 0x67, 0x58, 0xCF, 0x10, 0xCF, 0xD8, 0x33, 0xE3,
0xB6, 0x13, 0xCB, 0x29, 0xC4, 0x69, 0x9D, 0x53, 0x9B, 0xD3,
0x47, 0x67, 0x17, 0x67, 0xB9, 0x73, 0x83, 0xF3, 0x88, 0x8B,
0x89, 0x4B, 0x82, 0xCB, 0x2E, 0x97, 0x3E, 0x2E, 0x9B, 0x1B,
0xC6, 0xDD, 0xC8, 0xBD, 0xE4, 0x4A, 0x74, 0xF5, 0x71, 0x5D,
0xE1, 0x7A, 0xD2, 0xF5, 0x9D, 0x9B, 0xB3, 0x9B, 0xC2, 0xED,
0xA8, 0xDB, 0xAF, 0xEE, 0x36, 0xEE, 0x69, 0xEE, 0x87, 0xDC,
0x9F, 0xCC, 0x34, 0x9F, 0x29, 0x9E, 0x59, 0x33, 0x73, 0xD0,
0xC3, 0xC8, 0x43, 0xE0, 0x51, 0xE5, 0xD1, 0x3F, 0x0B, 0x9F,
0x95, 0x30, 0x6B, 0xDF, 0xAC, 0x7E, 0x4F, 0x43, 0x4F, 0x81,
0x67, 0xB5, 0xE7, 0x23, 0x2F, 0x63, 0x2F, 0x91, 0x57, 0xAD,
0xD7, 0xB0, 0xB7, 0xA5, 0x77, 0xAA, 0xF7, 0x61, 0xEF, 0x17,
0x3E, 0xF6, 0x3E, 0x72, 0x9F, 0xE3, 0x3E, 0xE3, 0x3C, 0x37,
0xDE, 0x32, 0xDE, 0x59, 0x5F, 0xCC, 0x37, 0xC0, 0xB7, 0xC8,
0xB7, 0xCB, 0x4F, 0xC3, 0x6F, 0x9E, 0x5F, 0x85, 0xDF, 0x43,
0x7F, 0x23, 0xFF, 0x64, 0xFF, 0x7A, 0xFF, 0xD1, 0x00, 0xA7,
0x80, 0x25, 0x01, 0x67, 0x03, 0x89, 0x81, 0x41, 0x81, 0x5B,
0x02, 0xFB, 0xF8, 0x7A, 0x7C, 0x21, 0xBF, 0x8E, 0x3F, 0x3A,
0xDB, 0x65, 0xF6, 0xB2, 0xD9, 0xED, 0x41, 0x8C, 0xA0, 0xB9,
0x41, 0x15, 0x41, 0x8F, 0x82, 0xAD, 0x82, 0xE5, 0xC1, 0xAD,
0x21, 0x68, 0xC8, 0xEC, 0x90, 0xAD, 0x21, 0xF7, 0xE7, 0x98,
0xCE, 0x91, 0xCE, 0x69, 0x0E, 0x85, 0x50, 0x7E, 0xE8, 0xD6,
0xD0, 0x07, 0x61, 0xE6, 0x61, 0x8B, 0xC3, 0x7E, 0x0C, 0x27,
0x85, 0x87, 0x85, 0x57, 0x86, 0x3F, 0x8E, 0x70, 0x88, 0x58,
0x1A, 0xD1, 0x31, 0x97, 0x35, 0x77, 0xD1, 0xDC, 0x43, 0x73,
0xDF, 0x44, 0xFA, 0x44, 0x96, 0x44, 0xDE, 0x9B, 0x67, 0x31,
0x4F, 0x39, 0xAF, 0x2D, 0x4A, 0x35, 0x2A, 0x3E, 0xAA, 0x2E,
0x6A, 0x3C, 0xDA, 0x37, 0xBA, 0x34, 0xBA, 0x3F, 0xC6, 0x2E,
0x66, 0x59, 0xCC, 0xD5, 0x58, 0x9D, 0x58, 0x49, 0x6C, 0x4B,
0x1C, 0x39, 0x2E, 0x2A, 0xAE, 0x36, 0x6E, 0x6C, 0xBE, 0xDF,
0xFC, 0xED, 0xF3, 0x87, 0xE2, 0x9D, 0xE2, 0x0B, 0xE3, 0x7B,
0x17, 0x98, 0x2F, 0xC8, 0x5D, 0x70, 0x79, 0xA1, 0xCE, 0xC2,
0xF4, 0x85, 0xA7, 0x16, 0xA9, 0x2E, 0x12, 0x2C, 0x3A, 0x96,
0x40, 0x4C, 0x88, 0x4E, 0x38, 0x94, 0xF0, 0x41, 0x10, 0x2A,
0xA8, 0x16, 0x8C, 0x25, 0xF2, 0x13, 0x77, 0x25, 0x8E, 0x0A,
0x79, 0xC2, 0x1D, 0xC2, 0x67, 0x22, 0x2F, 0xD1, 0x36, 0xD1,
0x88, 0xD8, 0x43, 0x5C, 0x2A, 0x1E, 0x4E, 0xF2, 0x48, 0x2A,
0x4D, 0x7A, 0x92, 0xEC, 0x91, 0xBC, 0x35, 0x79, 0x24, 0xC5,
0x33, 0xA5, 0x2C, 0xE5, 0xB9, 0x84, 0x27, 0xA9, 0x90, 0xBC,
0x4C, 0x0D, 0x4C, 0xDD, 0x9B, 0x3A, 0x9E, 0x16, 0x9A, 0x76,
0x20, 0x6D, 0x32, 0x3D, 0x3A, 0xBD, 0x31, 0x83, 0x92, 0x91,
0x90, 0x71, 0x42, 0xAA, 0x21, 0x4D, 0x93, 0xB6, 0x67, 0xEA,
0x67, 0xE6, 0x66, 0x76, 0xCB, 0xAC, 0x65, 0x85, 0xB2, 0xFE,
0xC5, 0x6E, 0x8B, 0xB7, 0x2F, 0x1E, 0x95, 0x07, 0xC9, 0x6B,
0xB3, 0x90, 0xAC, 0x05, 0x59, 0x2D, 0x0A, 0xB6, 0x42, 0xA6,
0xE8, 0x54, 0x5A, 0x28, 0xD7, 0x2A, 0x07, 0xB2, 0x67, 0x65,
0x57, 0x66, 0xBF, 0xCD, 0x89, 0xCA, 0x39, 0x96, 0xAB, 0x9E,
0x2B, 0xCD, 0xED, 0xCC, 0xB3, 0xCA, 0xDB, 0x90, 0x37, 0x9C,
0xEF, 0x9F, 0xFF, 0xED, 0x12, 0xC2, 0x12, 0xE1, 0x92, 0xB6,
0xA5, 0x86, 0x4B, 0x57, 0x2D, 0x1D, 0x58, 0xE6, 0xBD, 0xAC,
0x6A, 0x39, 0xB2, 0x3C, 0x71, 0x79, 0xDB, 0x0A, 0xE3, 0x15,
0x05, 0x2B, 0x86, 0x56, 0x06, 0xAC, 0x3C, 0xB8, 0x8A, 0xB6,
0x2A, 0x6D, 0xD5, 0x4F, 0xAB, 0xED, 0x57, 0x97, 0xAE, 0x7E,
0xBD, 0x26, 0x7A, 0x4D, 0x6B, 0x81, 0x5E, 0xC1, 0xCA, 0x82,
0xC1, 0xB5, 0x01, 0x6B, 0xEB, 0x0B, 0x55, 0x0A, 0xE5, 0x85,
0x7D, 0xEB, 0xDC, 0xD7, 0xED, 0x5D, 0x4F, 0x58, 0x2F, 0x59,
0xDF, 0xB5, 0x61, 0xFA, 0x86, 0x9D, 0x1B, 0x3E, 0x15, 0x89,
0x8A, 0xAE, 0x14, 0xDB, 0x17, 0x97, 0x15, 0x7F, 0xD8, 0x28,
0xDC, 0x78, 0xE5, 0x1B, 0x87, 0x6F, 0xCA, 0xBF, 0x99, 0xDC,
0x94, 0xB4, 0xA9, 0xAB, 0xC4, 0xB9, 0x64, 0xCF, 0x66, 0xD2,
0x66, 0xE9, 0xE6, 0xDE, 0x2D, 0x9E, 0x5B, 0x0E, 0x96, 0xAA,
0x97, 0xE6, 0x97, 0x0E, 0x6E, 0x0D, 0xD9, 0xDA, 0xB4, 0x0D,
0xDF, 0x56, 0xB4, 0xED, 0xF5, 0xF6, 0x45, 0xDB, 0x2F, 0x97,
0xCD, 0x28, 0xDB, 0xBB, 0x83, 0xB6, 0x43, 0xB9, 0xA3, 0xBF,
0x3C, 0xB8, 0xBC, 0x65, 0xA7, 0xC9, 0xCE, 0xCD, 0x3B, 0x3F,
0x54, 0xA4, 0x54, 0xF4, 0x54, 0xFA, 0x54, 0x36, 0xEE, 0xD2,
0xDD, 0xB5, 0x61, 0xD7, 0xF8, 0x6E, 0xD1, 0xEE, 0x1B, 0x7B,
0xBC, 0xF6, 0x34, 0xEC, 0xD5, 0xDB, 0x5B, 0xBC, 0xF7, 0xFD,
0x3E, 0xC9, 0xBE, 0xDB, 0x55, 0x01, 0x55, 0x4D, 0xD5, 0x66,
0xD5, 0x65, 0xFB, 0x49, 0xFB, 0xB3, 0xF7, 0x3F, 0xAE, 0x89,
0xAA, 0xE9, 0xF8, 0x96, 0xFB, 0x6D, 0x5D, 0xAD, 0x4E, 0x6D,
0x71, 0xED, 0xC7, 0x03, 0xD2, 0x03, 0xFD, 0x07, 0x23, 0x0E,
0xB6, 0xD7, 0xB9, 0xD4, 0xD5, 0x1D, 0xD2, 0x3D, 0x54, 0x52,
0x8F, 0xD6, 0x2B, 0xEB, 0x47, 0x0E, 0xC7, 0x1F, 0xBE, 0xFE,
0x9D, 0xEF, 0x77, 0x2D, 0x0D, 0x36, 0x0D, 0x55, 0x8D, 0x9C,
0xC6, 0xE2, 0x23, 0x70, 0x44, 0x79, 0xE4, 0xE9, 0xF7, 0x09,
0xDF, 0xF7, 0x1E, 0x0D, 0x3A, 0xDA, 0x76, 0x8C, 0x7B, 0xAC,
0xE1, 0x07, 0xD3, 0x1F, 0x76, 0x1D, 0x67, 0x1D, 0x2F, 0x6A,
0x42, 0x9A, 0xF2, 0x9A, 0x46, 0x9B, 0x53, 0x9A, 0xFB, 0x5B,
0x62, 0x5B, 0xBA, 0x4F, 0xCC, 0x3E, 0xD1, 0xD6, 0xEA, 0xDE,
0x7A, 0xFC, 0x47, 0xDB, 0x1F, 0x0F, 0x9C, 0x34, 0x3C, 0x59,
0x79, 0x4A, 0xF3, 0x54, 0xC9, 0x69, 0xDA, 0xE9, 0x82, 0xD3,
0x93, 0x67, 0xF2, 0xCF, 0x8C, 0x9D, 0x95, 0x9D, 0x7D, 0x7E,
0x2E, 0xF9, 0xDC, 0x60, 0xDB, 0xA2, 0xB6, 0x7B, 0xE7, 0x63,
0xCE, 0xDF, 0x6A, 0x0F, 0x6F, 0xEF, 0xBA, 0x10, 0x74, 0xE1,
0xD2, 0x45, 0xFF, 0x8B, 0xE7, 0x3B, 0xBC, 0x3B, 0xCE, 0x5C,
0xF2, 0xB8, 0x74, 0xF2, 0xB2, 0xDB, 0xE5, 0x13, 0x57, 0xB8,
0x57, 0x9A, 0xAF, 0x3A, 0x5F, 0x6D, 0xEA, 0x74, 0xEA, 0x3C,
0xFE, 0x93, 0xD3, 0x4F, 0xC7, 0xBB, 0x9C, 0xBB, 0x9A, 0xAE,
0xB9, 0x5C, 0x6B, 0xB9, 0xEE, 0x7A, 0xBD, 0xB5, 0x7B, 0x66,
0xF7, 0xE9, 0x1B, 0x9E, 0x37, 0xCE, 0xDD, 0xF4, 0xBD, 0x79,
0xF1, 0x16, 0xFF, 0xD6, 0xD5, 0x9E, 0x39, 0x3D, 0xDD, 0xBD,
0xF3, 0x7A, 0x6F, 0xF7, 0xC5, 0xF7, 0xF5, 0xDF, 0x16, 0xDD,
0x7E, 0x72, 0x27, 0xFD, 0xCE, 0xCB, 0xBB, 0xD9, 0x77, 0x27,
0xEE, 0xAD, 0xBC, 0x4F, 0xBC, 0x5F, 0xF4, 0x40, 0xED, 0x41,
0xD9, 0x43, 0xDD, 0x87, 0xD5, 0x3F, 0x5B, 0xFE, 0xDC, 0xD8,
0xEF, 0xDC, 0x7F, 0x6A, 0xC0, 0x77, 0xA0, 0xF3, 0xD1, 0xDC,
0x47, 0xF7, 0x06, 0x85, 0x83, 0xCF, 0xFE, 0x91, 0xF5, 0x8F,
0x0F, 0x43, 0x05, 0x8F, 0x99, 0x8F, 0xCB, 0x86, 0x0D, 0x86,
0xEB, 0x9E, 0x38, 0x3E, 0x39, 0x39, 0xE2, 0x3F, 0x72, 0xFD,
0xE9, 0xFC, 0xA7, 0x43, 0xCF, 0x64, 0xCF, 0x26, 0x9E, 0x17,
0xFE, 0xA2, 0xFE, 0xCB, 0xAE, 0x17, 0x16, 0x2F, 0x7E, 0xF8,
0xD5, 0xEB, 0xD7, 0xCE, 0xD1, 0x98, 0xD1, 0xA1, 0x97, 0xF2,
0x97, 0x93, 0xBF, 0x6D, 0x7C, 0xA5, 0xFD, 0xEA, 0xC0, 0xEB,
0x19, 0xAF, 0xDB, 0xC6, 0xC2, 0xC6, 0x1E, 0xBE, 0xC9, 0x78,
0x33, 0x31, 0x5E, 0xF4, 0x56, 0xFB, 0xED, 0xC1, 0x77, 0xDC,
0x77, 0x1D, 0xEF, 0xA3, 0xDF, 0x0F, 0x4F, 0xE4, 0x7C, 0x20,
0x7F, 0x28, 0xFF, 0x68, 0xF9, 0xB1, 0xF5, 0x53, 0xD0, 0xA7,
0xFB, 0x93, 0x19, 0x93, 0x93, 0xFF, 0x04, 0x03, 0x98, 0xF3,
0xFC, 0x63, 0x33, 0x2D, 0xDB, 0x00, 0x00, 0x00, 0x20, 0x63,
0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x25, 0x00, 0x00, 0x80,
0x83, 0x00, 0x00, 0xF9, 0xFF, 0x00, 0x00, 0x80, 0xE9, 0x00,
0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A,
0x98, 0x00, 0x00, 0x17, 0x6F, 0x92, 0x5F, 0xC5, 0x46, 0x00,
0x00, 0x09, 0x20, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0x9C,
0x97, 0x7F, 0x90, 0x5E, 0x65, 0x75, 0xC7, 0x3F, 0xE7, 0x3C,
0x3F, 0xEE, 0x8F, 0xF7, 0x7D, 0xF7, 0x67, 0xC8, 0x86, 0xD0,
0x95, 0x60, 0x48, 0x03, 0x6A, 0x90, 0x08, 0xE3, 0x80, 0x44,
0x99, 0xA0, 0x16, 0xE5, 0x87, 0x05, 0x6B, 0x07, 0x61, 0xFC,
0xC3, 0x01, 0x9D, 0x01, 0x95, 0x4E, 0xF9, 0xA3, 0xA5, 0x33,
0xB6, 0x76, 0x3A, 0xC2, 0x50, 0x99, 0x71, 0x44, 0x51, 0x92,
0x51, 0x0B, 0x28, 0x30, 0xAD, 0x75, 0x2A, 0x19, 0x61, 0x6C,
0x1D, 0x48, 0x75, 0x87, 0x76, 0xA8, 0xA8, 0x24, 0x1A, 0x24,
0x1A, 0xC2, 0xC6, 0x00, 0xD9, 0x24, 0xCB, 0x66, 0xB3, 0xBB,
0xEF, 0xEE, 0xFB, 0xEB, 0xDE, 0xFB, 0x3C, 0xFD, 0xE3, 0x5D,
0x62, 0x77, 0x5A, 0x65, 0xEB, 0x77, 0xE6, 0xCE, 0xDC, 0xE7,
0xDC, 0x7B, 0x9F, 0xF3, 0x3D, 0xCF, 0x73, 0xEE, 0xF7, 0x9C,
0x47, 0x1E, 0x7D, 0xF4, 0x51, 0x76, 0xEE, 0xD8, 0x71, 0xF1,
0xA5, 0xEF, 0xBD, 0xE2, 0xF1, 0x10, 0x24, 0xB1, 0xCE, 0x11,
0x45, 0x00, 0x20, 0xC6, 0xFE, 0xC5, 0xF2, 0xB8, 0x6F, 0x3C,
0x75, 0x27, 0xA2, 0x88, 0x48, 0xFF, 0x71, 0x84, 0x18, 0x03,
0x11, 0xF9, 0xCD, 0xEB, 0x21, 0xAE, 0xF8, 0x46, 0x80, 0xB2,
0x2C, 0x50, 0xA1, 0x3B, 0xF1, 0xE4, 0xF7, 0xAE, 0xBA, 0xF9,
0x96, 0x5B, 0x9E, 0xB6, 0xCE, 0xE8, 0xA5, 0x7B, 0x0E, 0xBE,
0xBA, 0xAB, 0xB1, 0x61, 0x7A, 0xE8, 0xFA, 0x0F, 0xBC, 0x9B,
0xA2, 0x0C, 0x20, 0x86, 0x28, 0x20, 0x21, 0x10, 0x89, 0xC8,
0xF2, 0x8C, 0x71, 0x99, 0x94, 0x8A, 0xE0, 0xD3, 0x94, 0xB9,
0xB9, 0x79, 0x9A, 0x0B, 0xF3, 0x20, 0x4A, 0x92, 0x24, 0x8C,
0x8E, 0x8E, 0x22, 0x22, 0xF4, 0x8A, 0xA2, 0xEF, 0x30, 0x86,
0x95, 0xA4, 0x63, 0xC4, 0x59, 0xE5, 0x1F, 0x77, 0x3D, 0x51,
0xDB, 0x73, 0x60, 0xFA, 0x7B, 0xCE, 0xE8, 0x35, 0x76, 0xFF,
0xE4, 0xD4, 0x63, 0xED, 0x90, 0x34, 0x6E, 0xBD, 0xE9, 0x3A,
0xD2, 0xC4, 0xD3, 0x2B, 0x2A, 0x40, 0x41, 0x5E, 0x63, 0xFD,
0x5A, 0x78, 0x10, 0x55, 0x50, 0xA0, 0x96, 0xD7, 0xF8, 0xF1,
0x33, 0xFF, 0xC5, 0xA1, 0x83, 0xFB, 0xD1, 0x58, 0x22, 0xAA,
0xF4, 0x8A, 0x92, 0xE3, 0x03, 0x43, 0x5C, 0xF2, 0xAE, 0xF7,
0x30, 0x3C, 0x3C, 0xC2, 0xD2, 0xD2, 0x22, 0x88, 0xF4, 0xE3,
0x0E, 0x11, 0x11, 0x88, 0x12, 0xF1, 0x2A, 0xDC, 0xFA, 0xF1,
0xEB, 0xF9, 0xFE, 0xBF, 0x3F, 0x35, 0xB4, 0x7F, 0x72, 0xEA,
0x31, 0xFB, 0xCA, 0xF1, 0x59, 0xBB, 0xE5, 0xBC, 0xB7, 0x30,
0x7D, 0x62, 0x9E, 0xA5, 0x6E, 0x44, 0x8C, 0x25, 0xA2, 0x20,
0x10, 0x43, 0x58, 0x5E, 0x6A, 0x21, 0x56, 0x15, 0x36, 0xF1,
0x64, 0x69, 0xCE, 0x93, 0x8F, 0xFC, 0x03, 0x23, 0x59, 0xC5,
0xC7, 0x6E, 0xBA, 0x91, 0xB3, 0xCE, 0x7A, 0x23, 0x00, 0x0B,
0x0B, 0xF3, 0xEC, 0xDE, 0xBD, 0x9B, 0x1D, 0x5F, 0xFE, 0x02,
0xEF, 0x78, 0xEF, 0x07, 0x19, 0xDF, 0xB0, 0x91, 0xE6, 0xC2,
0x02, 0xC6, 0x18, 0x42, 0x08, 0x40, 0x44, 0x55, 0x08, 0x45,
0x41, 0x3D, 0x81, 0x2D, 0xE7, 0xBD, 0x85, 0x57, 0x8E, 0x9F,
0xB4, 0xD6, 0xF8, 0x7A, 0xE8, 0x52, 0xE7, 0xC8, 0x4C, 0x9B,
0x66, 0x61, 0x50, 0x13, 0x29, 0x81, 0x10, 0x22, 0xCE, 0x19,
0xAC, 0x4F, 0x89, 0x40, 0xD1, 0x29, 0xA9, 0x0F, 0x26, 0x3C,
0xFD, 0xF8, 0xB7, 0xD9, 0xB6, 0x69, 0x88, 0x3F, 0xFB, 0xF3,
0xDB, 0xF8, 0x9F, 0x18, 0x18, 0x18, 0xE4, 0xDA, 0x6B, 0x3F,
0xC8, 0x39, 0x9B, 0x37, 0xF3, 0xE9, 0x3B, 0x3E, 0xCF, 0xE6,
0x6D, 0x7F, 0x42, 0xBD, 0x31, 0x48, 0x51, 0xB6, 0x91, 0xE5,
0x20, 0x8C, 0x2A, 0x45, 0xBB, 0xC5, 0x50, 0x0A, 0xBD, 0xD8,
0xC0, 0x24, 0xF5, 0x60, 0xD5, 0xD5, 0x98, 0xEF, 0x35, 0x78,
0x69, 0xA6, 0xCB, 0x52, 0x70, 0x88, 0x03, 0x49, 0x6A, 0xA8,
0xB5, 0x34, 0x5F, 0x9D, 0x65, 0xEA, 0x3F, 0xBF, 0x81, 0xA9,
0xAF, 0xE1, 0xDC, 0xCB, 0xAE, 0xE7, 0x27, 0x13, 0x4F, 0xB1,
0x31, 0xEB, 0xF0, 0x89, 0x4F, 0x7C, 0x92, 0xDF, 0x86, 0x73,
0xDF, 0xF4, 0x66, 0xFE, 0xF2, 0x53, 0x37, 0x72, 0xDB, 0xE7,
0x1E, 0x64, 0xEB, 0xD5, 0x1F, 0xA7, 0x6A, 0x17, 0xFD, 0x44,
0x05, 0x62, 0xD9, 0xA3, 0xE8, 0x74, 0x68, 0x26, 0x96, 0x66,
0x39, 0x82, 0xBA, 0x1A, 0x56, 0xAD, 0x67, 0xB1, 0xDB, 0xE0,
0xF0, 0x74, 0x97, 0xB6, 0x06, 0x74, 0x20, 0x67, 0xEE, 0xD0,
0x3E, 0xDA, 0xD3, 0x2F, 0x33, 0x77, 0xE4, 0x30, 0x0F, 0xDD,
0xF9, 0x31, 0x9E, 0x7A, 0xFA, 0xC7, 0x3C, 0xF2, 0x83, 0x1F,
0x90, 0x4F, 0xFF, 0x94, 0xFB, 0x1F, 0xF8, 0x1C, 0xD6, 0x7B,
0x7E, 0x17, 0x2E, 0x7A, 0xC7, 0x36, 0xAE, 0x7A, 0xFB, 0x04,
0x8F, 0xEF, 0x7D, 0x96, 0x33, 0xCE, 0x7E, 0x1B, 0x9D, 0xA5,
0x45, 0xAC, 0x31, 0x14, 0xDD, 0x82, 0xD0, 0x81, 0xA6, 0x96,
0xB4, 0xCA, 0x51, 0xAC, 0x49, 0x50, 0x35, 0x86, 0xA5, 0x22,
0x67, 0x6A, 0x36, 0x30, 0x5B, 0x64, 0xBC, 0x74, 0xE4, 0x28,
0xE7, 0x96, 0x87, 0xB8, 0xF3, 0x86, 0x0B, 0xD9, 0x54, 0x5F,
0x60, 0xBE, 0xB9, 0xC4, 0xAD, 0x9F, 0xBC, 0x99, 0x43, 0x4F,
0xDC, 0xCF, 0x15, 0xEF, 0xBC, 0x80, 0xD1, 0xB5, 0xEB, 0x59,
0x0D, 0xDE, 0x79, 0xD1, 0xDB, 0x99, 0x69, 0x2D, 0x31, 0xDD,
0x35, 0xCC, 0xB4, 0x61, 0xBA, 0x15, 0x99, 0x5E, 0x8C, 0x4C,
0x37, 0x23, 0x47, 0x4F, 0x0A, 0xAD, 0x22, 0x45, 0xAD, 0x60,
0xAD, 0x85, 0x6E, 0x35, 0xC8, 0xD1, 0x79, 0x25, 0xC9, 0x32,
0x16, 0x7B, 0x2D, 0xB0, 0x05, 0x97, 0x5F, 0xF9, 0x01, 0x2E,
0xDE, 0xF6, 0x2E, 0x0E, 0xBF, 0xF4, 0x32, 0x59, 0x96, 0x73,
0xD9, 0x85, 0x1B, 0x09, 0xDD, 0x05, 0x56, 0x8B, 0xD9, 0x93,
0x73, 0x1C, 0x79, 0x65, 0x8A, 0xB8, 0x41, 0x31, 0x65, 0x42,
0x59, 0x16, 0x48, 0x95, 0xA2, 0xD1, 0xD3, 0x6C, 0x16, 0x2C,
0xF5, 0x12, 0x44, 0x4A, 0x14, 0x2A, 0x8A, 0x90, 0x33, 0xD7,
0xAB, 0x71, 0xB2, 0x15, 0x89, 0x6B, 0x37, 0xF1, 0xCF, 0x87,
0xC7, 0xD8, 0x71, 0xDF, 0x4E, 0x06, 0x06, 0x87, 0xD8, 0xB2,
0x65, 0x0B, 0x00, 0xF7, 0xDE, 0xFB, 0x25, 0xCE, 0x3F, 0xFF,
0x3C, 0xAA, 0xAA, 0x5A, 0x15, 0x81, 0x8B, 0x2E, 0xB9, 0x84,
0xF7, 0x8F, 0xB5, 0x99, 0x3A, 0x72, 0x8C, 0xD9, 0xE0, 0x98,
0xAF, 0x2C, 0x4D, 0x12, 0xE6, 0x0A, 0xC7, 0xCC, 0x52, 0xA4,
0x53, 0x08, 0x22, 0x01, 0x2B, 0x52, 0x12, 0xC5, 0x82, 0x1D,
0x82, 0x24, 0xA5, 0x52, 0x21, 0x0C, 0xAD, 0x67, 0x61, 0x71,
0x6A, 0xC5, 0x84, 0xE3, 0xE3, 0xE3, 0x8C, 0x8F, 0x8F, 0x13,
0x63, 0x5C, 0x15, 0x81, 0x75, 0xA7, 0xAF, 0xE7, 0xAA, 0x4B,
0xDE, 0xC6, 0xEE, 0x89, 0x79, 0xF2, 0xB3, 0x37, 0x53, 0x2D,
0x75, 0x28, 0x3B, 0x25, 0x65, 0xAB, 0x45, 0x37, 0x96, 0x40,
0x1B, 0xA1, 0x85, 0x8A, 0x46, 0xCC, 0x60, 0x8A, 0xAB, 0x37,
0x88, 0x46, 0x30, 0x3E, 0xA1, 0x1E, 0x8F, 0xF2, 0xEE, 0x4B,
0xB7, 0xFE, 0x9F, 0x13, 0xBF, 0x96, 0xD1, 0xAB, 0xC1, 0x73,
0x07, 0x0F, 0x12, 0xD7, 0xAF, 0xC3, 0xF9, 0x84, 0xA4, 0x5E,
0xC3, 0xE5, 0x19, 0xB6, 0x56, 0x23, 0xA9, 0x0F, 0x83, 0xF7,
0x7D, 0x6D, 0x80, 0x88, 0x6D, 0x24, 0xB8, 0xA1, 0x01, 0x92,
0x7A, 0x4E, 0x96, 0x67, 0xB4, 0xCE, 0xB8, 0x90, 0xAF, 0x3E,
0xF0, 0x5D, 0x28, 0xBB, 0xFC, 0x3E, 0x58, 0x9A, 0x9B, 0xE1,
0xA1, 0x9D, 0x5F, 0xE6, 0x5F, 0x8F, 0x66, 0xAC, 0xD9, 0x7C,
0x0E, 0x46, 0x05, 0x75, 0x16, 0x9F, 0xA7, 0x7D, 0x1F, 0xA7,
0xAD, 0x41, 0x73, 0x0F, 0x02, 0x4A, 0x04, 0x5C, 0x44, 0x6C,
0x85, 0xCF, 0x13, 0x94, 0x8A, 0xC6, 0x99, 0x6F, 0x64, 0x57,
0xF1, 0x87, 0xFC, 0xC5, 0xA7, 0xEF, 0xE0, 0x97, 0x3F, 0xDF,
0xCB, 0xD4, 0xE1, 0xC9, 0xFF, 0x17, 0x81, 0xBB, 0xBF, 0xB8,
0x83, 0x1B, 0x27, 0x0A, 0xAA, 0xF7, 0xDC, 0x4C, 0x6E, 0x1D,
0x6A, 0x04, 0xE7, 0x15, 0xE7, 0x2D, 0x62, 0x05, 0x4C, 0x40,
0xFD, 0x72, 0x5D, 0x01, 0xB0, 0xA9, 0x80, 0x54, 0xA0, 0x81,
0x24, 0x73, 0x0C, 0x58, 0x65, 0xE4, 0xB2, 0x0F, 0xF3, 0x2D,
0x7B, 0x31, 0xEF, 0xBF, 0xFB, 0xBB, 0x5C, 0x76, 0xF3, 0x5D,
0x7C, 0x6D, 0xE7, 0x4E, 0x62, 0xB1, 0x8A, 0x15, 0x89, 0x81,
0x12, 0xC7, 0xA0, 0x7A, 0xAC, 0x17, 0x7C, 0x62, 0x70, 0x5E,
0x11, 0x13, 0xA9, 0x42, 0x97, 0x10, 0x7A, 0x54, 0x55, 0x0B,
0xC9, 0x40, 0x54, 0xFA, 0x2B, 0xA0, 0x99, 0x62, 0x32, 0x03,
0x5A, 0xA1, 0x4E, 0x70, 0x4E, 0x91, 0x66, 0x93, 0xE1, 0x73,
0x2E, 0x60, 0xE4, 0x8F, 0x6F, 0x43, 0xAF, 0xFB, 0x2C, 0xB7,
0x3F, 0xD3, 0xE5, 0xF6, 0xBF, 0xB9, 0x83, 0xAA, 0xF7, 0x3A,
0x24, 0x44, 0xB9, 0xF3, 0x6F, 0xFF, 0x8A, 0xAF, 0x5D, 0x39,
0x48, 0xEF, 0x5F, 0xFE, 0x9E, 0x66, 0xB9, 0x80, 0x49, 0x95,
0x48, 0x45, 0x94, 0x80, 0xDA, 0x88, 0xF1, 0x8A, 0xFA, 0x7E,
0xAD, 0xD1, 0x18, 0x22, 0xB1, 0x2A, 0xF0, 0xB9, 0xC7, 0x18,
0x41, 0x63, 0x85, 0xF3, 0x4A, 0xAD, 0x96, 0x52, 0x76, 0xDA,
0x74, 0x4E, 0xCE, 0xE0, 0xA4, 0x62, 0xFD, 0xFB, 0x3E, 0xC2,
0xFD, 0x33, 0x6B, 0x78, 0xF8, 0xE1, 0x47, 0x56, 0xB5, 0x0D,
0xD7, 0xDE, 0xF0, 0x11, 0xBE, 0x72, 0xC3, 0x45, 0x94, 0x4F,
0xDC, 0x4F, 0x17, 0xC1, 0x5A, 0xC1, 0x3B, 0xC1, 0x18, 0xC1,
0x98, 0x88, 0x9A, 0x7E, 0x9F, 0xA1, 0x04, 0x50, 0x2A, 0x44,
0xC0, 0x1A, 0x88, 0xA1, 0xC4, 0x02, 0xCE, 0x09, 0xA9, 0x33,
0x24, 0x4E, 0xA1, 0xD7, 0xC5, 0x17, 0x1D, 0x06, 0x36, 0x5C,
0xC8, 0x89, 0x66, 0x7B, 0xD5, 0xB9, 0xF0, 0x47, 0x1F, 0xBA,
0x8E, 0xAB, 0xD7, 0x09, 0x9D, 0xE3, 0x87, 0x70, 0xDE, 0x62,
0x8D, 0x62, 0x9D, 0xA0, 0xCE, 0x60, 0xAC, 0x20, 0x44, 0x2C,
0x11, 0x62, 0x59, 0x62, 0x24, 0x90, 0xD5, 0x52, 0x92, 0xDC,
0x82, 0x04, 0x08, 0x90, 0x26, 0x0E, 0x6B, 0x94, 0x4E, 0xA7,
0x87, 0x58, 0x43, 0xBE, 0xF0, 0x0A, 0x1B, 0xCE, 0x1C, 0x5A,
0x35, 0x81, 0xD0, 0x5E, 0xE0, 0xE5, 0xF9, 0x2E, 0xF9, 0xE6,
0x61, 0x52, 0x03, 0xD9, 0x40, 0x8D, 0xD0, 0xAD, 0x20, 0x33,
0xF8, 0x01, 0x07, 0x11, 0x34, 0xC6, 0x88, 0x18, 0x30, 0x89,
0xC3, 0x3A, 0x8F, 0xA1, 0x5F, 0x36, 0xBD, 0x35, 0x28, 0x91,
0x50, 0x95, 0xA4, 0xA9, 0x47, 0x55, 0x81, 0x80, 0xAE, 0x52,
0x06, 0x4E, 0x1C, 0x3B, 0xCA, 0x2D, 0x7F, 0x7D, 0x37, 0xFB,
0x37, 0x6C, 0x63, 0xF4, 0xB4, 0x35, 0x84, 0xAA, 0x42, 0x55,
0x49, 0xB3, 0x0C, 0x11, 0xA1, 0xEC, 0xF4, 0x15, 0x55, 0x79,
0xAD, 0xEF, 0x51, 0x45, 0x55, 0x40, 0x85, 0x10, 0x2A, 0xDA,
0x9D, 0x0E, 0x65, 0x55, 0x50, 0x55, 0x25, 0x45, 0xAF, 0x87,
0x12, 0x88, 0x6B, 0x36, 0x30, 0x39, 0x3B, 0xBF, 0x2A, 0x02,
0x3F, 0xFA, 0xC9, 0x4F, 0xD9, 0xD5, 0x5E, 0xC7, 0xDA, 0xF3,
0xB7, 0x53, 0x34, 0x17, 0x31, 0xC6, 0x40, 0x8C, 0x74, 0xDB,
0x6D, 0x8C, 0x77, 0x18, 0xA7, 0x10, 0xC1, 0x02, 0xA8, 0x11,
0x42, 0x08, 0x14, 0x45, 0x05, 0xAA, 0x58, 0xA3, 0x38, 0xE7,
0x88, 0x21, 0xE0, 0xBC, 0x25, 0x84, 0x08, 0xD1, 0x21, 0xA3,
0x23, 0x1C, 0x7C, 0x71, 0xB6, 0xDF, 0xA8, 0xBE, 0x8E, 0x22,
0xCE, 0x2E, 0x75, 0x19, 0x1D, 0x1D, 0xC3, 0x55, 0x01, 0xBC,
0x27, 0x8A, 0xD2, 0xED, 0x74, 0x89, 0x21, 0xA2, 0xCE, 0xA1,
0xDE, 0x12, 0xE3, 0xB2, 0x10, 0x89, 0x80, 0x11, 0x08, 0x45,
0x8F, 0x58, 0x15, 0xA8, 0x51, 0x8C, 0x0A, 0x84, 0x0A, 0xEF,
0x2D, 0x02, 0xA8, 0x04, 0x12, 0x55, 0x8E, 0xB5, 0xA0, 0xAA,
0x8A, 0xD7, 0xD1, 0x82, 0x8A, 0x3D, 0xFB, 0x7E, 0x41, 0x3A,
0x3C, 0x86, 0xB3, 0x10, 0x42, 0x85, 0x55, 0x21, 0x96, 0x15,
0xD6, 0x0A, 0xC6, 0x82, 0x51, 0xB3, 0xBC, 0x05, 0x22, 0xA8,
0x82, 0x33, 0x81, 0x3C, 0x4B, 0xA8, 0xE7, 0x19, 0x59, 0xEA,
0xF0, 0x56, 0xB0, 0x02, 0x86, 0x48, 0x96, 0x58, 0x9C, 0x01,
0x35, 0x81, 0xB5, 0xB9, 0x62, 0xEC, 0xCA, 0x86, 0x64, 0xEF,
0xDE, 0xBD, 0x34, 0x9B, 0xCD, 0x53, 0xE3, 0x93, 0xD3, 0xC7,
0x99, 0x78, 0xE1, 0x55, 0x46, 0x36, 0xBE, 0x19, 0xAD, 0x7A,
0xE4, 0x89, 0xC5, 0x68, 0x20, 0xF1, 0x86, 0x34, 0x71, 0xA4,
0xDE, 0x22, 0x31, 0x10, 0x01, 0x15, 0x15, 0xAC, 0xB7, 0x78,
0x13, 0x49, 0x13, 0x83, 0xB5, 0x91, 0xCC, 0x28, 0x79, 0xEA,
0x70, 0x3E, 0x12, 0xCB, 0x2E, 0x96, 0x0A, 0xE3, 0x02, 0xA1,
0xDD, 0x61, 0x7C, 0x28, 0xF9, 0x5F, 0x01, 0xDF, 0x73, 0xCF,
0x3D, 0x1C, 0x38, 0x70, 0xE0, 0xD4, 0xF8, 0x97, 0xBF, 0x7A,
0x9E, 0x13, 0xB6, 0x41, 0x7D, 0xA8, 0x86, 0x21, 0xE0, 0x14,
0x24, 0x14, 0x64, 0x5E, 0x69, 0x34, 0x32, 0xBC, 0x06, 0x84,
0xAA, 0xFF, 0x17, 0x84, 0x10, 0x70, 0x12, 0xA9, 0xD7, 0x12,
0xBC, 0x89, 0xE4, 0x4E, 0x70, 0x2E, 0xE2, 0x4C, 0x24, 0xB3,
0x86, 0xCC, 0x19, 0x52, 0x2F, 0x8C, 0x0C, 0x35, 0xE8, 0xED,
0xFB, 0x0F, 0xB6, 0x6C, 0x38, 0x63, 0x85, 0xF3, 0xC5, 0xC5,
0x45, 0xA6, 0xA7, 0xA7, 0x19, 0x1B, 0x1B, 0x3B, 0x65, 0x7B,
0xD3, 0x96, 0xAD, 0x5C, 0xF3, 0x06, 0xE1, 0xD7, 0x0F, 0xDD,
0x81, 0x4A, 0x9B, 0xD4, 0x43, 0xE6, 0x0D, 0x59, 0x6A, 0x30,
0x94, 0xB8, 0xD8, 0x45, 0xCB, 0x62, 0x39, 0x07, 0x44, 0x30,
0x22, 0xE4, 0x4E, 0x48, 0xAD, 0xA0, 0xA1, 0xC0, 0x11, 0xC8,
0x9D, 0x52, 0x4B, 0x2D, 0xB9, 0x37, 0x9C, 0x36, 0xD2, 0x60,
0xE6, 0x99, 0xDD, 0x9C, 0xB3, 0xF4, 0x0B, 0xB6, 0x5F, 0x7E,
0xF9, 0x0A, 0x02, 0x93, 0x93, 0x93, 0xD4, 0x6A, 0x35, 0x46,
0x46, 0x46, 0x4E, 0xD9, 0x06, 0x87, 0x47, 0xF9, 0xC2, 0x9D,
0x7F, 0xC7, 0x7D, 0xD7, 0x5F, 0xCC, 0xFC, 0x13, 0x0F, 0x33,
0x76, 0xDA, 0x30, 0x43, 0xF5, 0xAC, 0x1F, 0x8C, 0x8D, 0x64,
0x36, 0x60, 0x35, 0xF6, 0xAB, 0x61, 0x8C, 0x11, 0x9F, 0x38,
0x52, 0x2F, 0x68, 0xD9, 0x25, 0xB1, 0x7D, 0x05, 0x34, 0xB1,
0xAF, 0x52, 0x89, 0x33, 0xF4, 0x4E, 0xCC, 0x30, 0xFA, 0xE2,
0x04, 0xDF, 0xF8, 0xD2, 0x5D, 0x34, 0x06, 0x87, 0x57, 0x10,
0xE8, 0xF6, 0x7A, 0x1C, 0x3F, 0x76, 0x94, 0x3C, 0x4B, 0x57,
0xEE, 0x8B, 0x5A, 0xC6, 0xCF, 0xDA, 0x8C, 0x54, 0x3D, 0x5C,
0x04, 0x2F, 0xB1, 0x2F, 0x46, 0xCE, 0x30, 0x50, 0xCF, 0xF0,
0x56, 0x99, 0x6B, 0x15, 0xD8, 0xAA, 0x0A, 0x0A, 0x50, 0x4F,
0x2D, 0xA5, 0x4D, 0x70, 0x56, 0x29, 0x5B, 0x2D, 0xD4, 0x28,
0x99, 0x75, 0x78, 0xEF, 0x28, 0xDA, 0x15, 0x59, 0x9A, 0x90,
0xE5, 0xB5, 0x15, 0x67, 0xC4, 0x76, 0x73, 0x9E, 0xE7, 0xF7,
0xEC, 0x61, 0x52, 0xD6, 0xF0, 0xF5, 0x47, 0xBE, 0x8D, 0x35,
0xCA, 0x70, 0xE6, 0xA8, 0x25, 0x96, 0x5E, 0x10, 0xBE, 0xF9,
0xD8, 0x93, 0xAC, 0xDD, 0x7E, 0x13, 0xF4, 0x3A, 0xD8, 0x18,
0x31, 0x46, 0x91, 0xE5, 0x46, 0x34, 0x02, 0xB9, 0x15, 0xB5,
0xEB, 0x06, 0x6C, 0x79, 0xF4, 0xE0, 0x34, 0xCE, 0xA4, 0x64,
0x26, 0xA2, 0xD6, 0x50, 0xC6, 0x88, 0xB1, 0x16, 0x63, 0x2D,
0xAA, 0x86, 0xC6, 0xFA, 0x37, 0xF0, 0xDC, 0xC0, 0x46, 0xEE,
0xFA, 0xCC, 0x67, 0x38, 0x6F, 0xEB, 0x05, 0xBC, 0x30, 0x75,
0x84, 0x67, 0xF7, 0xFF, 0x9A, 0xCA, 0x0D, 0xD0, 0x49, 0x47,
0xB9, 0xF2, 0xF6, 0x7B, 0xF9, 0xB7, 0x03, 0xCF, 0x01, 0x60,
0xAA, 0x0E, 0x21, 0x2C, 0x81, 0x1A, 0x06, 0xB7, 0x7F, 0x94,
0xB5, 0x67, 0x6F, 0xA6, 0xDB, 0xEE, 0x91, 0x79, 0x47, 0x08,
0xE0, 0x10, 0xAA, 0x90, 0x70, 0x6C, 0xEA, 0x38, 0xEB, 0xCF,
0xF4, 0xA5, 0xDD, 0xF4, 0x07, 0xC3, 0x57, 0xD7, 0xFF, 0xE9,
0xC9, 0x5D, 0x13, 0xDF, 0x77, 0x43, 0x5B, 0xCF, 0x5E, 0x8F,
0x7A, 0x07, 0xA1, 0x22, 0x86, 0x88, 0x18, 0x03, 0x46, 0x51,
0x51, 0x06, 0xCF, 0x78, 0x2B, 0xDF, 0xF9, 0x59, 0xE4, 0xC1,
0x6F, 0xBD, 0x40, 0x6D, 0x74, 0x98, 0x35, 0x63, 0xDB, 0x71,
0x59, 0x4E, 0x6D, 0x68, 0x84, 0xF6, 0xB1, 0x39, 0xF2, 0xC1,
0x71, 0xD4, 0x1A, 0xC4, 0x9A, 0xBE, 0xEC, 0x1A, 0x21, 0x04,
0x78, 0x79, 0xDF, 0xF3, 0x08, 0x91, 0x10, 0x2A, 0x62, 0x59,
0x11, 0x8B, 0x92, 0x3D, 0x93, 0x53, 0x34, 0x26, 0x7F, 0x38,
0xB7, 0xE9, 0x4F, 0xAF, 0xB8, 0xC6, 0x06, 0x31, 0x13, 0xEB,
0x8A, 0x5F, 0x5D, 0x71, 0xEC, 0xB9, 0xD3, 0x1F, 0xFF, 0xCE,
0xB3, 0x3F, 0x4F, 0x92, 0x91, 0x7A, 0x9F, 0x40, 0xAB, 0x0B,
0xA2, 0xFD, 0xC3, 0xA5, 0x11, 0x88, 0x60, 0x4C, 0x0A, 0x92,
0x73, 0xFC, 0x70, 0x93, 0x17, 0x0F, 0xEE, 0xEB, 0x1F, 0xC5,
0xAD, 0x05, 0x15, 0x62, 0xAF, 0x40, 0x8D, 0x40, 0x9E, 0x40,
0xD9, 0x43, 0x7A, 0x65, 0xBF, 0xBC, 0x9E, 0x2A, 0x1E, 0x91,
0x58, 0x55, 0x74, 0x5B, 0x1D, 0x86, 0x0D, 0xDD, 0xD3, 0xAB,
0x17, 0xAF, 0x0A, 0x62, 0x9F, 0xFE, 0xEF, 0x01, 0x00, 0x46,
0xBB, 0xB1, 0xB5, 0x3F, 0x50, 0x9D, 0x5B, 0x00, 0x00, 0x00,
0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20,
0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, 0xf4, 0x00, 0x00, 0x00,
0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00,
0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4d, 0x45, 0x07, 0xdd, 0x07, 0x07,
0x00, 0x25, 0x16, 0x51, 0xa4, 0x24, 0x4e, 0x00, 0x00, 0x09, 0x13, 0x49,
0x44, 0x41, 0x54, 0x58, 0xc3, 0x9d, 0x97, 0x6b, 0x8c, 0x5d, 0x55, 0x15,
0xc7, 0x7f, 0x6b, 0xed, 0xbd, 0xcf, 0xeb, 0xde, 0x99, 0xb9, 0x33, 0x53,
0x3a, 0xa5, 0x64, 0xa4, 0x50, 0xb0, 0xa0, 0x96, 0x50, 0x20, 0x84, 0x47,
0x95, 0x80, 0x0f, 0x10, 0x50, 0x41, 0x4d, 0x10, 0xe2, 0x07, 0xc3, 0x23,
0xe1, 0x21, 0x46, 0x3e, 0x28, 0x26, 0x2a, 0xc6, 0x08, 0x41, 0x89, 0x46,
0x14, 0xb5, 0x8d, 0x0f, 0x7c, 0x00, 0x31, 0x6a, 0x94, 0x2a, 0x8d, 0x8f,
0x40, 0x35, 0x0d, 0x1a, 0x14, 0x95, 0x56, 0x41, 0x2a, 0xb5, 0x4c, 0x29,
0xd0, 0x69, 0x67, 0x98, 0x4e, 0x67, 0xe6, 0xce, 0xdc, 0xc7, 0x79, 0xec,
0xed, 0x87, 0x3b, 0x54, 0x27, 0x3e, 0x18, 0xfd, 0x27, 0x27, 0x39, 0x7b,
0x9d, 0x73, 0xf6, 0xfe, 0xaf, 0xb5, 0xd7, 0xf9, 0xaf, 0xb5, 0xe5, 0xc1,
0x07, 0x1f, 0x64, 0xf3, 0xa6, 0x4d, 0x67, 0x9f, 0xf7, 0xe6, 0x8b, 0xb7,
0x7a, 0x2f, 0xb1, 0x75, 0x8e, 0x20, 0x02, 0x00, 0x21, 0xf4, 0x2e, 0x16,
0xc7, 0x3d, 0xe3, 0x91, 0x3b, 0x11, 0x45, 0x44, 0x7a, 0x8f, 0x03, 0x84,
0xe0, 0x09, 0xc8, 0x3f, 0x5e, 0xf7, 0x61, 0xc9, 0x37, 0x02, 0x94, 0x65,
0x81, 0x0a, 0xdd, 0xed, 0x8f, 0xfc, 0xf4, 0xd2, 0xeb, 0x6f, 0xb8, 0xe1,
0x31, 0xeb, 0x8c, 0x9e, 0xb7, 0x63, 0xcf, 0x4b, 0x5b, 0xfa, 0xd6, 0x4c,
0x36, 0xae, 0x7c, 0xfb, 0x1b, 0x29, 0x4a, 0x0f, 0x62, 0x08, 0x02, 0xe2,
0x3d, 0x81, 0x80, 0x2c, 0xce, 0x18, 0x16, 0x49, 0xa9, 0x08, 0x51, 0x92,
0x30, 0x33, 0x33, 0x4b, 0x73, 0x6e, 0x16, 0x44, 0x89, 0xe3, 0x98, 0xe1,
0xe1, 0x61, 0x44, 0x84, 0xbc, 0x28, 0x7a, 0x0b, 0x06, 0xbf, 0x94, 0x74,
0x08, 0x38, 0xab, 0x7c, 0x77, 0xcb, 0xc3, 0xb5, 0x1d, 0xbb, 0x27, 0x7f,
0xea, 0x8c, 0x5e, 0x66, 0x77, 0x8d, 0x8d, 0x3f, 0xd4, 0xf6, 0x71, 0xdf,
0xcd, 0xd7, 0x5c, 0x41, 0x12, 0x47, 0xe4, 0x45, 0x05, 0x28, 0xc8, 0xcb,
0xac, 0x5f, 0x76, 0x0f, 0x82, 0x0a, 0x0a, 0xd4, 0xb2, 0x1a, 0xbf, 0x7f,
0xfc, 0xb7, 0xec, 0xdd, 0xb3, 0x0b, 0x0d, 0x25, 0xa2, 0x4a, 0x5e, 0x94,
0x4c, 0xf4, 0x37, 0x38, 0xf7, 0x0d, 0x6f, 0x62, 0x70, 0x70, 0x88, 0x85,
0x85, 0x79, 0x10, 0xe9, 0xf9, 0xed, 0x03, 0x22, 0x10, 0x24, 0x10, 0xa9,
0x70, 0xf3, 0x75, 0x57, 0xf2, 0x8b, 0x5f, 0x3e, 0xda, 0xd8, 0x35, 0x36,
0xfe, 0x90, 0x7d, 0x71, 0x62, 0xda, 0xae, 0x3f, 0xe5, 0x75, 0x4c, 0x1e,
0x9a, 0x65, 0xa1, 0x1b, 0x10, 0x63, 0x09, 0x28, 0x08, 0x04, 0xef, 0x17,
0x43, 0x2d, 0x84, 0xaa, 0xc2, 0xc6, 0x11, 0x69, 0x92, 0xf1, 0xc8, 0x03,
0xdf, 0x60, 0x28, 0xad, 0xb8, 0xf6, 0x9a, 0xab, 0x39, 0xee, 0xb8, 0xe3,
0x01, 0x98, 0x9b, 0x9b, 0x65, 0xdb, 0xb6, 0x6d, 0x6c, 0xfa, 0xd2, 0xe7,
0x39, 0xe7, 0xcd, 0xef, 0x64, 0x74, 0xcd, 0x5a, 0x9a, 0x73, 0x73, 0x18,
0x63, 0xf0, 0xde, 0x03, 0x01, 0x55, 0xc1, 0x17, 0x05, 0xf5, 0x18, 0xd6,
0x9f, 0xf2, 0x3a, 0x5e, 0x9c, 0x38, 0x6c, 0xad, 0x89, 0xea, 0xbe, 0x4b,
0x9d, 0xfd, 0x53, 0x6d, 0x9a, 0x85, 0x41, 0x4d, 0xa0, 0x04, 0xbc, 0x0f,
0x38, 0x67, 0xb0, 0x51, 0x42, 0x00, 0x8a, 0x4e, 0x49, 0x7d, 0x20, 0xe6,
0xb1, 0xad, 0x3f, 0x60, 0xe3, 0x89, 0x0d, 0x3e, 0xf0, 0xc1, 0x5b, 0xf8,
0x67, 0xf4, 0xf7, 0x0f, 0x70, 0xf9, 0xe5, 0xef, 0xe4, 0xa4, 0x75, 0xeb,
0xf8, 0xe8, 0xed, 0x9f, 0x63, 0xdd, 0xc6, 0x77, 0x51, 0xef, 0x1b, 0xa0,
0x28, 0xdb, 0xc8, 0xa2, 0x13, 0x46, 0x95, 0xa2, 0xdd, 0xa2, 0x91, 0x40,
0x1e, 0xfa, 0x30, 0x71, 0xdd, 0x5b, 0x75, 0x35, 0x66, 0xf3, 0x3e, 0x9e,
0x9f, 0xea, 0xb2, 0xe0, 0x1d, 0xe2, 0x40, 0xe2, 0x1a, 0x6a, 0x2d, 0xcd,
0x97, 0xa6, 0x19, 0xff, 0xcd, 0xb7, 0x31, 0xf5, 0x15, 0x9c, 0x7c, 0xc1,
0x95, 0xfc, 0x61, 0xfb, 0xa3, 0xac, 0x4d, 0x3b, 0xdc, 0x78, 0xe3, 0x4d,
0xfc, 0x27, 0x9c, 0xfc, 0x9a, 0xd7, 0xf2, 0xe1, 0xf7, 0x5f, 0xcd, 0x2d,
0x9f, 0xf9, 0x16, 0x1b, 0xde, 0x76, 0x1d, 0x55, 0xbb, 0xe8, 0x25, 0x2a,
0x10, 0xca, 0x9c, 0xa2, 0xd3, 0xa1, 0x19, 0x5b, 0x9a, 0xe5, 0x10, 0xea,
0x6a, 0x58, 0xb5, 0x11, 0xf3, 0xdd, 0x3e, 0xf6, 0x4d, 0x76, 0x69, 0xab,
0x47, 0xfb, 0x33, 0x66, 0xf6, 0x3e, 0x49, 0x7b, 0xf2, 0x05, 0x66, 0xf6,
0xef, 0xe3, 0xbe, 0x3b, 0xae, 0xe5, 0xd1, 0xc7, 0x7e, 0xcf, 0x03, 0xbf,
0xfa, 0x15, 0xd9, 0xe4, 0x1f, 0xb9, 0xf7, 0x9b, 0x9f, 0xc1, 0x46, 0x11,
0xff, 0x0d, 0x67, 0x9d, 0xb3, 0x91, 0x4b, 0xcf, 0xdc, 0xce, 0xd6, 0x9d,
0x4f, 0x70, 0xcc, 0x09, 0xa7, 0xd1, 0x59, 0x98, 0xc7, 0x1a, 0x43, 0xd1,
0x2d, 0xf0, 0x1d, 0x68, 0x6a, 0x49, 0xab, 0x1c, 0xc6, 0x9a, 0x18, 0x55,
0x63, 0x58, 0x28, 0x32, 0xc6, 0xa7, 0x3d, 0xd3, 0x45, 0xca, 0xf3, 0xfb,
0x0f, 0x70, 0x72, 0xb9, 0x97, 0x3b, 0xae, 0x3a, 0x83, 0x13, 0xeb, 0x73,
0xcc, 0x36, 0x17, 0xb8, 0xf9, 0xa6, 0xeb, 0xd9, 0xfb, 0xf0, 0xbd, 0x5c,
0xfc, 0xfa, 0xd3, 0x19, 0x5e, 0xb9, 0x9a, 0xe5, 0xe0, 0xf5, 0x67, 0x9d,
0xc9, 0x54, 0x6b, 0x81, 0xc9, 0xae, 0x61, 0xaa, 0x0d, 0x93, 0xad, 0xc0,
0xe4, 0x7c, 0x60, 0xb2, 0x19, 0x38, 0x70, 0x58, 0x68, 0x15, 0x09, 0x6a,
0x05, 0x6b, 0x2d, 0x74, 0xab, 0x01, 0x0e, 0xcc, 0x2a, 0x71, 0x9a, 0x32,
0x9f, 0xb7, 0xc0, 0x16, 0x5c, 0x78, 0xc9, 0xdb, 0x39, 0x7b, 0xe3, 0x1b,
0xd8, 0xf7, 0xfc, 0x0b, 0xa4, 0x69, 0xc6, 0x05, 0x67, 0xac, 0xc5, 0x77,
0xe7, 0x58, 0x2e, 0xa6, 0x0f, 0xcf, 0xb0, 0xff, 0xc5, 0x71, 0xc2, 0x1a,
0xc5, 0x94, 0x31, 0x65, 0x59, 0x20, 0x55, 0x82, 0x86, 0x88, 0x66, 0xb3,
0x60, 0x21, 0x8f, 0x11, 0x29, 0x51, 0xa8, 0x28, 0x7c, 0xc6, 0x4c, 0x5e,
0xe3, 0x70, 0x2b, 0x10, 0x56, 0x9e, 0xc8, 0xf7, 0xf7, 0x8d, 0xb0, 0xe9,
0x2b, 0x9b, 0xe9, 0x1f, 0x68, 0xb0, 0x7e, 0xfd, 0x7a, 0x00, 0xee, 0xb9,
0xe7, 0x8b, 0x9c, 0x7a, 0xea, 0x29, 0x54, 0x55, 0xb5, 0x2c, 0x02, 0x67,
0x9d, 0x7b, 0x2e, 0x6f, 0x1d, 0x69, 0x33, 0xbe, 0xff, 0x20, 0xd3, 0xde,
0x31, 0x5b, 0x59, 0x9a, 0xc4, 0xcc, 0x14, 0x8e, 0xa9, 0x85, 0x40, 0xa7,
0x10, 0x44, 0x3c, 0x56, 0xa4, 0x24, 0x88, 0x05, 0xdb, 0x80, 0x38, 0xa1,
0x52, 0xc1, 0x37, 0x56, 0x33, 0x37, 0x3f, 0xbe, 0x64, 0xc2, 0xd1, 0xd1,
0x51, 0x46, 0x47, 0x47, 0x09, 0x21, 0x2c, 0x8b, 0xc0, 0xaa, 0xa3, 0x57,
0x73, 0xe9, 0xb9, 0xa7, 0xb1, 0x6d, 0xfb, 0x2c, 0xd9, 0x09, 0xeb, 0xa8,
0x16, 0x3a, 0x94, 0x9d, 0x92, 0xa2, 0xd5, 0xa2, 0x1b, 0x4a, 0xa0, 0x8d,
0xd0, 0xc2, 0x8a, 0x06, 0xcc, 0x40, 0x82, 0xab, 0xf7, 0x11, 0x4c, 0x89,
0x8d, 0x62, 0xea, 0xe1, 0x00, 0x6f, 0x3c, 0x6f, 0xc3, 0xbf, 0x9d, 0xf8,
0xe5, 0x8c, 0x5e, 0x0e, 0x9e, 0xda, 0xb3, 0x87, 0xb0, 0xfa, 0x22, 0x5c,
0x14, 0x63, 0xc5, 0x20, 0x9a, 0x13, 0x72, 0x21, 0xd4, 0x63, 0x5a, 0x51,
0xab, 0xa7, 0x0d, 0x10, 0xb0, 0x7d, 0x31, 0xae, 0xd1, 0x4f, 0x5c, 0xcf,
0x48, 0xb3, 0x94, 0xd6, 0x31, 0x67, 0xf0, 0xd5, 0x6f, 0xfe, 0x04, 0xca,
0x2e, 0xff, 0x0f, 0x16, 0x66, 0xa6, 0xb8, 0x6f, 0xf3, 0x97, 0xf8, 0xd9,
0x81, 0x94, 0x15, 0xeb, 0x4e, 0xc2, 0xa8, 0xa0, 0xce, 0x12, 0x65, 0x09,
0x71, 0x3d, 0x23, 0x3b, 0x6a, 0x05, 0x9a, 0x45, 0x20, 0xa0, 0x04, 0xc0,
0x05, 0xc4, 0x56, 0x44, 0x59, 0x8c, 0x52, 0xd1, 0x77, 0xec, 0xf1, 0x6c,
0x29, 0x5e, 0xcd, 0x87, 0x3e, 0x7a, 0x3b, 0x7f, 0xfd, 0xf3, 0x4e, 0xc6,
0xf7, 0x8d, 0xfd, 0x4f, 0x04, 0xee, 0xfa, 0xc2, 0x26, 0xae, 0xde, 0x5e,
0x50, 0xbd, 0xe9, 0x7a, 0x32, 0xeb, 0x50, 0x23, 0xb8, 0x48, 0x71, 0x91,
0x45, 0xac, 0x80, 0xf1, 0x68, 0xb4, 0x58, 0x57, 0x00, 0x6c, 0x22, 0x20,
0x15, 0xa8, 0x27, 0x4e, 0x1d, 0xfd, 0x56, 0x19, 0xba, 0xe0, 0x3d, 0x7c,
0xcf, 0x9e, 0xcd, 0x5b, 0xef, 0xfa, 0x09, 0x17, 0x5c, 0x7f, 0x27, 0x5f,
0xdb, 0xbc, 0x99, 0x50, 0x2c, 0x23, 0x22, 0xc1, 0x53, 0xe2, 0x18, 0xd0,
0x08, 0x1b, 0x09, 0x51, 0x6c, 0x70, 0x91, 0x22, 0x26, 0x50, 0xf9, 0x2e,
0xde, 0xe7, 0x54, 0x55, 0x0b, 0x49, 0x41, 0x54, 0x7a, 0x11, 0xd0, 0x54,
0x31, 0xa9, 0x01, 0xad, 0x50, 0x27, 0x38, 0xa7, 0x48, 0xb3, 0xc9, 0xe0,
0x49, 0xa7, 0x33, 0xf4, 0x8e, 0x5b, 0xd0, 0x2b, 0x3e, 0xc5, 0x87, 0x1f,
0xef, 0x72, 0xeb, 0xc7, 0x6f, 0xa7, 0xca, 0x5f, 0x81, 0x84, 0x28, 0x77,
0x7c, 0xe2, 0x23, 0x7c, 0xed, 0x92, 0x01, 0xf2, 0x1f, 0x7e, 0x9a, 0x66,
0x39, 0x87, 0x49, 0x94, 0x40, 0x45, 0x10, 0x8f, 0xda, 0x80, 0x89, 0x14,
0x8d, 0x7a, 0xb5, 0x46, 0x83, 0x0f, 0x84, 0xaa, 0x20, 0xca, 0x22, 0x8c,
0x11, 0x34, 0x54, 0xb8, 0x48, 0xa9, 0xd5, 0x12, 0xca, 0x4e, 0x9b, 0xce,
0xe1, 0x29, 0x9c, 0x54, 0x1c, 0x73, 0xd1, 0x7b, 0xb9, 0x77, 0x6a, 0x05,
0xf7, 0xdf, 0xff, 0xc0, 0xb2, 0xb6, 0xe1, 0xf2, 0xab, 0xde, 0xcb, 0x97,
0xaf, 0x3a, 0x8b, 0xf2, 0xe1, 0x7b, 0xe9, 0x22, 0x58, 0x2b, 0x44, 0x4e,
0x30, 0x46, 0x30, 0x26, 0xa0, 0xa6, 0xd7, 0x67, 0x28, 0x1e, 0x94, 0x0a,
0x11, 0xb0, 0x06, 0x82, 0x2f, 0xb1, 0x80, 0x73, 0x42, 0xe2, 0x0c, 0xb1,
0x53, 0xc8, 0xbb, 0x44, 0x45, 0x87, 0xfe, 0x35, 0x67, 0x70, 0xa8, 0xd9,
0x5e, 0x76, 0x2e, 0xbc, 0xe5, 0xdd, 0x57, 0xf0, 0xb6, 0x55, 0x42, 0x67,
0x62, 0x2f, 0x2e, 0xb2, 0x58, 0xa3, 0x58, 0x27, 0xa8, 0x33, 0x18, 0x2b,
0x08, 0x01, 0x4b, 0x80, 0x50, 0x96, 0x18, 0xf1, 0xa4, 0xb5, 0x84, 0x38,
0xb3, 0x20, 0x1e, 0x3c, 0x24, 0xb1, 0xc3, 0x1a, 0xa5, 0xd3, 0xc9, 0x11,
0x6b, 0xc8, 0xe6, 0x5e, 0x64, 0xcd, 0xb1, 0x8d, 0x65, 0x13, 0xf0, 0xed,
0x39, 0x5e, 0x98, 0xed, 0x92, 0xad, 0x1b, 0x24, 0x31, 0x90, 0xf6, 0xd7,
0xf0, 0xdd, 0x0a, 0x52, 0x83, 0xeb, 0x77, 0x10, 0x40, 0x43, 0x08, 0x88,
0x01, 0x13, 0x3b, 0xac, 0x8b, 0x30, 0xf4, 0xca, 0x66, 0x64, 0x0d, 0x4a,
0xc0, 0x57, 0x25, 0x49, 0x12, 0xa1, 0xaa, 0x80, 0x47, 0x97, 0x29, 0x03,
0x87, 0x0e, 0x1e, 0xe0, 0x86, 0x8f, 0xdd, 0xc5, 0xae, 0x35, 0x1b, 0x19,
0x3e, 0x6a, 0x05, 0xbe, 0xaa, 0x50, 0x55, 0x92, 0x34, 0x45, 0x44, 0xa8,
0x3a, 0x3d, 0x45, 0x55, 0x5e, 0xee, 0x7b, 0x54, 0x51, 0x15, 0x50, 0xc1,
0xfb, 0x8a, 0x76, 0xa7, 0x43, 0x59, 0x15, 0x54, 0x55, 0x49, 0x91, 0xe7,
0x28, 0x9e, 0xb0, 0x62, 0x0d, 0x63, 0xd3, 0xb3, 0xcb, 0x22, 0xf0, 0xbb,
0x3f, 0xfc, 0x91, 0x2d, 0xed, 0x55, 0xac, 0x3c, 0xf5, 0x7c, 0x8a, 0xe6,
0x3c, 0xc6, 0x18, 0x08, 0x81, 0x6e, 0xbb, 0x8d, 0x89, 0x1c, 0xea, 0x14,
0x02, 0x58, 0x00, 0x31, 0x82, 0xf7, 0x9e, 0xa2, 0xa8, 0x40, 0x15, 0x6b,
0x14, 0xe7, 0x1c, 0xc1, 0x7b, 0x5c, 0x64, 0xf1, 0x3e, 0x40, 0x70, 0xc8,
0xf0, 0x10, 0x7b, 0x9e, 0x9d, 0xee, 0x35, 0xaa, 0xaf, 0xa0, 0x88, 0xd3,
0x0b, 0x5d, 0x86, 0x87, 0x47, 0x70, 0x95, 0x87, 0x28, 0x22, 0x88, 0xd2,
0xed, 0x74, 0x09, 0x3e, 0xa0, 0xce, 0x61, 0x22, 0x4b, 0x08, 0x8b, 0x42,
0x24, 0x02, 0x46, 0xc0, 0x17, 0x39, 0xa1, 0x2a, 0x50, 0xa3, 0x18, 0x15,
0xf0, 0x15, 0x51, 0x64, 0x11, 0x40, 0xc5, 0x13, 0xab, 0x72, 0xb0, 0x05,
0x55, 0x55, 0xbc, 0x82, 0x16, 0x54, 0xec, 0x78, 0xf2, 0x2f, 0x24, 0x83,
0x23, 0x38, 0x0b, 0xde, 0x57, 0x58, 0x15, 0x42, 0x59, 0x61, 0xad, 0x60,
0x2c, 0x18, 0x35, 0x8b, 0x5b, 0x20, 0x82, 0x51, 0x70, 0xc6, 0x93, 0xa5,
0x31, 0xf5, 0x2c, 0x25, 0x4d, 0x1c, 0x91, 0x15, 0xac, 0x80, 0x21, 0x90,
0xc6, 0x16, 0x67, 0x40, 0x8d, 0x67, 0x65, 0xa6, 0x18, 0xbb, 0xb4, 0x21,
0xd9, 0xb9, 0x73, 0x27, 0xcd, 0x66, 0xf3, 0xc8, 0xf8, 0xf0, 0xe4, 0x04,
0xdb, 0xff, 0xf6, 0x12, 0x43, 0x6b, 0x5f, 0x8b, 0x56, 0x39, 0x59, 0x6c,
0x31, 0xea, 0x89, 0x23, 0x43, 0x12, 0x3b, 0x92, 0xc8, 0x22, 0xc1, 0x13,
0x00, 0x15, 0x15, 0x6c, 0x64, 0x89, 0x4c, 0x20, 0x89, 0x0d, 0xd6, 0x06,
0x52, 0xa3, 0x64, 0x89, 0xc3, 0x45, 0x81, 0x50, 0x76, 0xb1, 0x54, 0x18,
0xe7, 0xf1, 0xed, 0x0e, 0xa3, 0x8d, 0xf8, 0x5f, 0x1c, 0xbe, 0xfb, 0xee,
0xbb, 0xd9, 0xbd, 0x7b, 0xf7, 0x91, 0xf1, 0x5f, 0x9f, 0x79, 0x9a, 0x43,
0xb6, 0x8f, 0x7a, 0xa3, 0x86, 0xc1, 0xe3, 0x14, 0xc4, 0x17, 0xa4, 0x91,
0xd2, 0xd7, 0x97, 0x12, 0xa9, 0x47, 0xa8, 0x7a, 0x7f, 0x81, 0xf7, 0x1e,
0x27, 0x81, 0x7a, 0x2d, 0x26, 0x32, 0x81, 0xcc, 0x09, 0xce, 0x05, 0x9c,
0x09, 0xa4, 0xd6, 0x90, 0x3a, 0x43, 0x12, 0x09, 0x43, 0x8d, 0x3e, 0xf2,
0x27, 0x7f, 0xcd, 0xfa, 0x35, 0xc7, 0x2c, 0x59, 0x7c, 0x7e, 0x7e, 0x9e,
0xc9, 0xc9, 0x49, 0x46, 0x46, 0x46, 0x8e, 0xd8, 0x5e, 0xb3, 0x7e, 0x03,
0x97, 0xbd, 0x4a, 0x78, 0xee, 0xbe, 0xdb, 0x51, 0x69, 0x93, 0x44, 0x90,
0x46, 0x86, 0x34, 0x31, 0x18, 0x4a, 0x5c, 0xe8, 0xa2, 0x65, 0xb1, 0x98,
0x03, 0x22, 0x18, 0x11, 0x32, 0x27, 0x24, 0x56, 0x50, 0x5f, 0xe0, 0xf0,
0x64, 0x4e, 0xa9, 0x25, 0x96, 0x2c, 0x32, 0x1c, 0x35, 0xd4, 0xc7, 0xd4,
0xe3, 0xdb, 0x38, 0x69, 0xe1, 0x2f, 0x9c, 0x7f, 0xe1, 0x85, 0x4b, 0x08,
0x8c, 0x8d, 0x8d, 0x51, 0xab, 0xd5, 0x18, 0x1a, 0x1a, 0x3a, 0x62, 0x1b,
0x18, 0x1c, 0xe6, 0xf3, 0x77, 0x7c, 0x92, 0xaf, 0x5c, 0x79, 0x36, 0xb3,
0x0f, 0xdf, 0xcf, 0xc8, 0x51, 0x83, 0x34, 0xea, 0x69, 0xcf, 0x19, 0x1b,
0x48, 0xad, 0xc7, 0x6a, 0xe8, 0x55, 0xc3, 0x10, 0x02, 0x51, 0xec, 0x48,
0x22, 0x41, 0xcb, 0x2e, 0xb1, 0xed, 0x29, 0xa0, 0x09, 0x3d, 0x95, 0x8a,
0x9d, 0x21, 0x3f, 0x34, 0xc5, 0xf0, 0xb3, 0xdb, 0xf9, 0xf6, 0x17, 0xef,
0xa4, 0x6f, 0x60, 0x70, 0x09, 0x81, 0x6e, 0x9e, 0x33, 0x71, 0xf0, 0x00,
0x59, 0x9a, 0x2c, 0xdd, 0x17, 0xb5, 0x8c, 0x1e, 0xb7, 0x0e, 0xa9, 0x72,
0x5c, 0x80, 0x48, 0x42, 0x4f, 0x8c, 0x9c, 0xa1, 0xbf, 0x9e, 0x12, 0x59,
0x65, 0xa6, 0x55, 0x60, 0xab, 0xca, 0x2b, 0x40, 0x3d, 0xb1, 0x94, 0x36,
0xc6, 0x59, 0xa5, 0x6c, 0xb5, 0x50, 0xa3, 0xa4, 0xd6, 0x11, 0x45, 0x8e,
0xa2, 0x5d, 0x91, 0x26, 0x31, 0x69, 0x56, 0x5b, 0x72, 0x46, 0x6c, 0x37,
0x67, 0x79, 0x7a, 0xc7, 0x0e, 0xc6, 0x64, 0x05, 0x5f, 0x7f, 0xe0, 0x07,
0x58, 0xa3, 0x0c, 0xa6, 0x8e, 0x5a, 0x6c, 0xc9, 0xbd, 0xf0, 0x9d, 0x87,
0x1e, 0x61, 0xe5, 0xf9, 0xd7, 0x40, 0xde, 0xc1, 0x86, 0x80, 0x31, 0x8a,
0x2c, 0x36, 0xa2, 0x01, 0xc8, 0xac, 0xa8, 0x5d, 0xd5, 0x6f, 0xcb, 0x03,
0x7b, 0x26, 0x71, 0x26, 0x21, 0x35, 0x01, 0xb5, 0x86, 0x32, 0x04, 0x8c,
0xb5, 0x18, 0x6b, 0x51, 0x35, 0xf4, 0xad, 0x7e, 0x15, 0x4f, 0xf5, 0xaf,
0xe5, 0xce, 0xdb, 0x6e, 0xe3, 0x94, 0x0d, 0xa7, 0xf3, 0xb7, 0xf1, 0xfd,
0x3c, 0xb1, 0xeb, 0x39, 0x2a, 0xd7, 0x4f, 0x27, 0x19, 0xe6, 0x92, 0x5b,
0xef, 0xe1, 0xe7, 0xbb, 0x9f, 0x02, 0xc0, 0x54, 0x1d, 0xbc, 0x5f, 0x00,
0x35, 0x0c, 0x9c, 0xff, 0x3e, 0x56, 0x9e, 0xb0, 0x8e, 0x6e, 0x3b, 0x27,
0x8d, 0x1c, 0xde, 0x83, 0x43, 0xa8, 0x7c, 0xcc, 0xc1, 0xf1, 0x09, 0x56,
0x1f, 0x1b, 0x95, 0xb2, 0xf5, 0xc7, 0x3f, 0x3c, 0xef, 0xda, 0xcf, 0x3e,
0xb2, 0xa5, 0x71, 0xe6, 0x85, 0x8d, 0x0d, 0x27, 0xac, 0x46, 0x23, 0x07,
0xbe, 0x22, 0xf8, 0x80, 0x18, 0x03, 0x46, 0x51, 0x51, 0xaa, 0x3c, 0xe7,
0x99, 0x3f, 0xed, 0x64, 0x6e, 0xe2, 0x25, 0x6a, 0xc3, 0x83, 0xac, 0x18,
0x59, 0x8d, 0x4b, 0x33, 0x6a, 0x8d, 0x21, 0x52, 0x67, 0x41, 0x04, 0xb5,
0x06, 0xb1, 0xa6, 0x27, 0xbb, 0x46, 0x10, 0x81, 0xa2, 0xdb, 0x45, 0x08,
0x78, 0x5f, 0x11, 0xca, 0x8a, 0x50, 0x94, 0xec, 0x18, 0x1b, 0x67, 0xe6,
0xb7, 0x3f, 0x9f, 0xf9, 0xfa, 0xad, 0x17, 0x5f, 0x66, 0xbd, 0x98, 0xed,
0xab, 0x8a, 0x67, 0x2e, 0x3e, 0xf8, 0xd4, 0xd1, 0x5b, 0x7f, 0xf4, 0xc4,
0x9f, 0xe3, 0x78, 0xa8, 0xde, 0x23, 0xd0, 0xea, 0x82, 0x68, 0xef, 0x70,
0x69, 0x04, 0x02, 0x18, 0x93, 0x80, 0x64, 0x4c, 0xec, 0x6b, 0xf2, 0xec,
0x9e, 0x27, 0x7b, 0x47, 0x71, 0x6b, 0x41, 0x85, 0x90, 0x17, 0xa8, 0x11,
0xc8, 0x62, 0x28, 0x73, 0x24, 0x2f, 0x7b, 0xe5, 0xf5, 0x48, 0xf1, 0x08,
0x84, 0xaa, 0xa2, 0xdb, 0xea, 0x30, 0x68, 0xe8, 0x1e, 0x5d, 0x3d, 0x7b,
0xa9, 0x17, 0xfb, 0xd8, 0xdf, 0x01, 0x8b, 0xfb, 0xb9, 0x42, 0x10, 0x02,
0xa4, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
0x60, 0x82,
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB