MultiHawk - remove more stuff

This commit is contained in:
adelikat 2015-03-09 20:51:33 +00:00
parent 5860199bfe
commit e4c2eddc1f
37 changed files with 12 additions and 5707 deletions

View File

@ -59,73 +59,18 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="config\ControllerConfig.cs">
<Compile Include="movie\PlayMovie.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\ControllerConfig.Designer.cs">
<DependentUpon>ControllerConfig.cs</DependentUpon>
</Compile>
<Compile Include="config\ControllerConfig\AnalogBindControl.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="config\ControllerConfig\AnalogBindControl.Designer.cs">
<DependentUpon>AnalogBindControl.cs</DependentUpon>
</Compile>
<Compile Include="config\ControllerConfig\AnalogBindPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="config\ControllerConfig\ControllerConfigPanel.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="config\ControllerConfig\ControllerConfigPanel.Designer.cs">
<DependentUpon>ControllerConfigPanel.cs</DependentUpon>
</Compile>
<Compile Include="config\HotkeyConfig.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\HotkeyConfig.Designer.cs">
<DependentUpon>HotkeyConfig.cs</DependentUpon>
</Compile>
<Compile Include="config\InputCompositeWidget.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Include="config\InputCompositeWidget.Designer.cs">
<DependentUpon>InputCompositeWidget.cs</DependentUpon>
</Compile>
<Compile Include="config\InputWidget.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="config\movie\EditCommentsForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\movie\EditCommentsForm.Designer.cs">
<DependentUpon>EditCommentsForm.cs</DependentUpon>
</Compile>
<Compile Include="config\movie\EditSubtitlesForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\movie\EditSubtitlesForm.Designer.cs">
<DependentUpon>EditSubtitlesForm.cs</DependentUpon>
</Compile>
<Compile Include="config\movie\MovieDetails.cs" />
<Compile Include="config\movie\PlayMovie.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\movie\PlayMovie.Designer.cs">
<Compile Include="movie\PlayMovie.Designer.cs">
<DependentUpon>PlayMovie.cs</DependentUpon>
</Compile>
<Compile Include="config\movie\RecordMovie.cs">
<Compile Include="movie\RecordMovie.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\movie\RecordMovie.Designer.cs">
<Compile Include="movie\RecordMovie.Designer.cs">
<DependentUpon>RecordMovie.cs</DependentUpon>
</Compile>
<Compile Include="config\movie\SubtitleMaker.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="config\movie\SubtitleMaker.Designer.cs">
<DependentUpon>SubtitleMaker.cs</DependentUpon>
</Compile>
<Compile Include="DisplayManager\DisplayManager.cs" />
<Compile Include="DisplayManager\DisplaySurface.cs" />
<Compile Include="DisplayManager\FilterManager.cs" />
@ -160,36 +105,12 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="EmulatorWindowList.cs" />
<Compile Include="Extensions\ToolExtensions.cs" />
<EmbeddedResource Include="config\ControllerConfig.resx">
<DependentUpon>ControllerConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\ControllerConfig\AnalogBindControl.resx">
<DependentUpon>AnalogBindControl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\ControllerConfig\ControllerConfigPanel.resx">
<DependentUpon>ControllerConfigPanel.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\HotkeyConfig.resx">
<DependentUpon>HotkeyConfig.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\InputCompositeWidget.resx">
<DependentUpon>InputCompositeWidget.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\movie\EditCommentsForm.resx">
<DependentUpon>EditCommentsForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\movie\EditSubtitlesForm.resx">
<DependentUpon>EditSubtitlesForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\movie\PlayMovie.resx">
<EmbeddedResource Include="movie\PlayMovie.resx">
<DependentUpon>PlayMovie.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\movie\RecordMovie.resx">
<EmbeddedResource Include="movie\RecordMovie.resx">
<DependentUpon>RecordMovie.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="config\movie\SubtitleMaker.resx">
<DependentUpon>SubtitleMaker.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="EmulatorWindow.resx">
<DependentUpon>EmulatorWindow.cs</DependentUpon>
</EmbeddedResource>

View File

@ -152,31 +152,6 @@ namespace BizHawk.Client.MultiHawk.WinFormExtensions
#endregion
}
//public static class FormExtensions
//{
// /// <summary>
// /// Handles EmuHawk specific issues before showing a modal dialog
// /// </summary>
// public static DialogResult ShowHawkDialog(this Form form)
// {
// GlobalWin.Sound.StopSound();
// var result = form.ShowDialog();
// GlobalWin.Sound.StartSound();
// return result;
// }
// /// <summary>
// /// Handles EmuHawk specific issues before showing a modal dialog
// /// </summary>
// public static DialogResult ShowHawkDialog(this CommonDialog form)
// {
// GlobalWin.Sound.StopSound();
// var result = form.ShowDialog();
// GlobalWin.Sound.StartSound();
// return result;
// }
//}
public static class ListViewExtensions
{
[StructLayout(LayoutKind.Sequential)]

View File

@ -1,75 +1,12 @@
using System.Drawing;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Emulation.Cores.Atari.Atari7800;
using BizHawk.Emulation.Cores.Nintendo.GBA;
using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES;
using BizHawk.Emulation.Cores.Nintendo.SNES;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.SNES9X;
using BizHawk.Emulation.Cores.Sega.Saturn;
using BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
using BizHawk.Emulation.Cores.Sony.PSP;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk.CoreExtensions
{
public static class CoreExtensions
{
//public static Bitmap Icon(this IEmulator core)
//{
// var attributes = Global.Emulator.Attributes();
// if (!attributes.Ported)
// {
// return Properties.Resources.CorpHawkSmall;
// }
// if (Global.Emulator is QuickNES)
// {
// return Properties.Resources.QuickNes;
// }
// else if (Global.Emulator is LibsnesCore)
// {
// return Properties.Resources.bsnes;
// }
// else if (Global.Emulator is Yabause)
// {
// return Properties.Resources.yabause;
// }
// else if (Global.Emulator is Atari7800)
// {
// return Properties.Resources.emu7800;
// }
// else if (Global.Emulator is GBA)
// {
// return Properties.Resources.meteor;
// }
// else if (Global.Emulator is GPGX)
// {
// return Properties.Resources.genplus;
// }
// else if (Global.Emulator is PSP)
// {
// return Properties.Resources.ppsspp;
// }
// else if (Global.Emulator is Gameboy)
// {
// return Properties.Resources.gambatte;
// }
// else if (Global.Emulator is Snes9x)
// {
// return Properties.Resources.snes9x;
// }
// else
// {
// return null;
// }
//}
public static string DisplayName(this IEmulator core)
{
var attributes = Global.Emulator.Attributes();

View File

@ -384,8 +384,8 @@ namespace BizHawk.Client.MultiHawk
}
// modals that need to capture input for binding purposes get input, of course
if (ActiveForm is HotkeyConfig
|| ActiveForm is ControllerConfig
if (ActiveForm is BizHawk.Client.EmuHawk.HotkeyConfig
|| ActiveForm is BizHawk.Client.EmuHawk.ControllerConfig
//|| ActiveForm is TAStudio
//|| ActiveForm is VirtualpadTool
)
@ -1238,7 +1238,7 @@ namespace BizHawk.Client.MultiHawk
private void hotkeyConfigToolStripMenuItem_Click(object sender, EventArgs e)
{
if (new HotkeyConfig().ShowDialog() == DialogResult.OK)
if (new BizHawk.Client.EmuHawk.HotkeyConfig().ShowDialog() == DialogResult.OK)
{
InitControls();
_inputManager.SyncControls();
@ -1247,7 +1247,7 @@ namespace BizHawk.Client.MultiHawk
private void controllerConfigToolStripMenuItem_Click(object sender, EventArgs e)
{
var controller = new ControllerConfig(EmulatorWindows.Master.Emulator.ControllerDefinition);
var controller = new BizHawk.Client.EmuHawk.ControllerConfig(EmulatorWindows.Master.Emulator.ControllerDefinition);
if (controller.ShowDialog() == DialogResult.OK)
{
InitControls();

View File

@ -1,296 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class ControllerConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ControllerConfig));
this.tabControl1 = new System.Windows.Forms.TabControl();
this.NormalControlsTab = new System.Windows.Forms.TabPage();
this.AutofireControlsTab = new System.Windows.Forms.TabPage();
this.AnalogControlsTab = new System.Windows.Forms.TabPage();
this.checkBoxAutoTab = new System.Windows.Forms.CheckBox();
this.checkBoxUDLR = new System.Windows.Forms.CheckBox();
this.buttonOK = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.loadDefaultsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label38 = new System.Windows.Forms.Label();
this.btnMisc = new BizHawk.Client.EmuHawk.MenuButton();
this.tabControl1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// tabControl1
//
this.tabControl1.Controls.Add(this.NormalControlsTab);
this.tabControl1.Controls.Add(this.AutofireControlsTab);
this.tabControl1.Controls.Add(this.AnalogControlsTab);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(3, 3);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(562, 521);
this.tabControl1.TabIndex = 1;
//
// NormalControlsTab
//
this.NormalControlsTab.Location = new System.Drawing.Point(4, 22);
this.NormalControlsTab.Name = "NormalControlsTab";
this.NormalControlsTab.Padding = new System.Windows.Forms.Padding(3);
this.NormalControlsTab.Size = new System.Drawing.Size(554, 495);
this.NormalControlsTab.TabIndex = 0;
this.NormalControlsTab.Text = "Normal Controls";
this.NormalControlsTab.UseVisualStyleBackColor = true;
//
// AutofireControlsTab
//
this.AutofireControlsTab.Location = new System.Drawing.Point(4, 22);
this.AutofireControlsTab.Name = "AutofireControlsTab";
this.AutofireControlsTab.Padding = new System.Windows.Forms.Padding(3);
this.AutofireControlsTab.Size = new System.Drawing.Size(554, 478);
this.AutofireControlsTab.TabIndex = 1;
this.AutofireControlsTab.Text = "Autofire Controls";
this.AutofireControlsTab.UseVisualStyleBackColor = true;
//
// AnalogControlsTab
//
this.AnalogControlsTab.Location = new System.Drawing.Point(4, 22);
this.AnalogControlsTab.Name = "AnalogControlsTab";
this.AnalogControlsTab.Size = new System.Drawing.Size(554, 478);
this.AnalogControlsTab.TabIndex = 2;
this.AnalogControlsTab.Text = "Analog Controls";
this.AnalogControlsTab.UseVisualStyleBackColor = true;
//
// checkBoxAutoTab
//
this.checkBoxAutoTab.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.checkBoxAutoTab.AutoSize = true;
this.checkBoxAutoTab.Location = new System.Drawing.Point(394, 548);
this.checkBoxAutoTab.Name = "checkBoxAutoTab";
this.checkBoxAutoTab.Size = new System.Drawing.Size(70, 17);
this.checkBoxAutoTab.TabIndex = 3;
this.checkBoxAutoTab.Text = "Auto Tab";
this.checkBoxAutoTab.UseVisualStyleBackColor = true;
this.checkBoxAutoTab.CheckedChanged += new System.EventHandler(this.CheckBoxAutoTab_CheckedChanged);
//
// checkBoxUDLR
//
this.checkBoxUDLR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.checkBoxUDLR.AutoSize = true;
this.checkBoxUDLR.Location = new System.Drawing.Point(470, 548);
this.checkBoxUDLR.Name = "checkBoxUDLR";
this.checkBoxUDLR.Size = new System.Drawing.Size(101, 17);
this.checkBoxUDLR.TabIndex = 4;
this.checkBoxUDLR.Text = "Allow U+D/L+R";
this.checkBoxUDLR.UseVisualStyleBackColor = true;
//
// buttonOK
//
this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOK.Location = new System.Drawing.Point(764, 542);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(75, 23);
this.buttonOK.TabIndex = 5;
this.buttonOK.Text = "&Save";
this.buttonOK.UseVisualStyleBackColor = true;
this.buttonOK.Click += new System.EventHandler(this.ButtonOk_Click);
//
// buttonCancel
//
this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.buttonCancel.Location = new System.Drawing.Point(845, 542);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(75, 23);
this.buttonCancel.TabIndex = 6;
this.buttonCancel.Text = "&Cancel";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click);
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 340F));
this.tableLayoutPanel1.Controls.Add(this.tabControl1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.pictureBox1, 1, 0);
this.tableLayoutPanel1.Location = new System.Drawing.Point(12, 12);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(908, 527);
this.tableLayoutPanel1.TabIndex = 7;
//
// pictureBox1
//
this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(571, 23);
this.pictureBox1.Margin = new System.Windows.Forms.Padding(3, 23, 3, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(334, 501);
this.pictureBox1.TabIndex = 2;
this.pictureBox1.TabStop = false;
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.testToolStripMenuItem,
this.loadDefaultsToolStripMenuItem,
this.clearToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(147, 70);
//
// testToolStripMenuItem
//
this.testToolStripMenuItem.Name = "testToolStripMenuItem";
this.testToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.testToolStripMenuItem.Text = "Save Defaults";
this.testToolStripMenuItem.Click += new System.EventHandler(this.ButtonSaveDefaults_Click);
//
// loadDefaultsToolStripMenuItem
//
this.loadDefaultsToolStripMenuItem.Name = "loadDefaultsToolStripMenuItem";
this.loadDefaultsToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.loadDefaultsToolStripMenuItem.Text = "Load Defaults";
this.loadDefaultsToolStripMenuItem.Click += new System.EventHandler(this.ButtonLoadDefaults_Click);
//
// clearToolStripMenuItem
//
this.clearToolStripMenuItem.Name = "clearToolStripMenuItem";
this.clearToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.clearToolStripMenuItem.Text = "Clear";
this.clearToolStripMenuItem.Click += new System.EventHandler(this.ClearBtn_Click);
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(11, 550);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(30, 13);
this.label3.TabIndex = 112;
this.label3.Text = "Tips:";
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(206, 550);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(168, 13);
this.label2.TabIndex = 111;
this.label2.Text = "* Disable Auto Tab to multiply bind";
//
// label38
//
this.label38.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label38.AutoSize = true;
this.label38.Location = new System.Drawing.Point(47, 550);
this.label38.Name = "label38";
this.label38.Size = new System.Drawing.Size(153, 13);
this.label38.TabIndex = 110;
this.label38.Text = "* Escape clears a key mapping";
//
// btnMisc
//
this.btnMisc.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnMisc.Location = new System.Drawing.Point(683, 542);
this.btnMisc.Menu = this.contextMenuStrip1;
this.btnMisc.Name = "btnMisc";
this.btnMisc.Size = new System.Drawing.Size(75, 23);
this.btnMisc.TabIndex = 11;
this.btnMisc.Text = "Misc...";
this.btnMisc.UseVisualStyleBackColor = true;
//
// ControllerConfig
//
this.AcceptButton = this.buttonOK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.buttonCancel;
this.ClientSize = new System.Drawing.Size(932, 572);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label38);
this.Controls.Add(this.btnMisc);
this.Controls.Add(this.checkBoxUDLR);
this.Controls.Add(this.tableLayoutPanel1);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.checkBoxAutoTab);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "ControllerConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Controller Config";
this.Load += new System.EventHandler(this.NewControllerConfig_Load);
this.tabControl1.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage NormalControlsTab;
private System.Windows.Forms.TabPage AutofireControlsTab;
private System.Windows.Forms.CheckBox checkBoxAutoTab;
private System.Windows.Forms.CheckBox checkBoxUDLR;
private System.Windows.Forms.Button buttonOK;
private System.Windows.Forms.Button buttonCancel;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.TabPage AnalogControlsTab;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolTip toolTip1;
private BizHawk.Client.EmuHawk.MenuButton btnMisc;
private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem loadDefaultsToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label38;
}
}

View File

@ -1,446 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
using BizHawk.Emulation.Common;
using BizHawk.Client.MultiHawk.WinFormExtensions;
namespace BizHawk.Client.MultiHawk
{
public partial class ControllerConfig : Form
{
private const int MAXPLAYERS = 8;
private static readonly Dictionary<string, Bitmap> ControllerImages = new Dictionary<string, Bitmap>();
private readonly ControllerDefinition _theDefinition;
static ControllerConfig()
{
// TODO
//ControllerImages.Add("NES Controller", Properties.Resources.NES_Controller);
//ControllerImages.Add("SNES Controller", Properties.Resources.SNES_Controller);
//ControllerImages.Add("Nintento 64 Controller", Properties.Resources.N64);
//ControllerImages.Add("Gameboy Controller", Properties.Resources.GBController);
//ControllerImages.Add("GBA Controller", Properties.Resources.GBA_Controller);
//ControllerImages.Add("Dual Gameboy Controller", Properties.Resources.GBController);
//ControllerImages.Add("SMS Controller", Properties.Resources.SMSController);
//ControllerImages.Add("Genesis 3-Button Controller", Properties.Resources.GENController);
//ControllerImages.Add("GPGX Genesis Controller", Properties.Resources.GENController);
//ControllerImages.Add("Saturn Controller", Properties.Resources.SaturnController);
//ControllerImages.Add("Intellivision Controller", Properties.Resources.IntVController);
//ControllerImages.Add("ColecoVision Basic Controller", Properties.Resources.colecovisioncontroller);
//ControllerImages.Add("Atari 2600 Basic Controller", Properties.Resources.atari_controller);
//ControllerImages.Add("Atari 7800 ProLine Joystick Controller", Properties.Resources.A78Joystick);
//ControllerImages.Add("PC Engine Controller", Properties.Resources.PCEngineController);
//ControllerImages.Add("Commodore 64 Controller", Properties.Resources.C64Joystick);
//ControllerImages.Add("TI83 Controller", Properties.Resources.TI83_Controller);
//ControllerImages.Add("WonderSwan Controller", Properties.Resources.WonderSwanColor);
//ControllerImages.Add("Lynx Controller", Properties.Resources.Lynx);
//ControllerImages.Add("PSX Gamepad Controller", Properties.Resources.PSX_Original_Controller);
//ControllerImages.Add("PSX DualShock Controller", Properties.Resources.psx_dualshock);
}
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, true);
}
protected override void OnDeactivate(EventArgs e)
{
base.OnDeactivate(e);
Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, false);
}
private ControllerConfig()
{
InitializeComponent();
Closing += (o, e) =>
{
buttonOK.Focus(); // A very dirty hack to avoid https://code.google.com/p/bizhawk/issues/detail?id=161
};
}
private delegate Control PanelCreator<T>(Dictionary<string, T> settings, List<string> buttons, Size size);
private Control CreateNormalPanel(Dictionary<string, string> settings, List<string> buttons, Size size)
{
var cp = new ControllerConfigPanel { Dock = DockStyle.Fill, AutoScroll = true };
cp.Tooltip = toolTip1;
cp.LoadSettings(settings, checkBoxAutoTab.Checked, buttons, size.Width, size.Height);
return cp;
}
private static Control CreateAnalogPanel(Dictionary<string, Config.AnalogBind> settings, List<string> buttons, Size size)
{
return new AnalogBindPanel(settings, buttons) { Dock = DockStyle.Fill, AutoScroll = true };
}
private static void LoadToPanel<T>(Control dest, string controllerName, IList<string> controllerButtons, IDictionary<string, Dictionary<string, T>> settingsblock, T defaultvalue, PanelCreator<T> createpanel)
{
Dictionary<string, T> settings;
if (!settingsblock.TryGetValue(controllerName, out settings))
{
settings = new Dictionary<string, T>();
settingsblock[controllerName] = settings;
}
// check to make sure that the settings object has all of the appropriate boolbuttons
foreach (var button in controllerButtons)
{
if (!settings.Keys.Contains(button))
{
settings[button] = defaultvalue;
}
}
if (controllerButtons.Count == 0)
{
return;
}
// split the list of all settings into buckets by player number
var buckets = new List<string>[MAXPLAYERS + 1];
for (var i = 0; i < buckets.Length; i++)
{
buckets[i] = new List<string>();
}
// by iterating through only the controller's active buttons, we're silently
// discarding anything that's not on the controller right now. due to the way
// saving works, those entries will still be preserved in the config file, tho
foreach (var button in controllerButtons)
{
int i;
for (i = 1; i <= MAXPLAYERS; i++)
{
if (button.StartsWith("P" + i))
{
break;
}
}
if (i > MAXPLAYERS) // couldn't find
{
i = 0;
}
buckets[i].Add(button);
}
if (buckets[0].Count == controllerButtons.Count)
{
// everything went into bucket 0, so make no tabs at all
dest.Controls.Add(createpanel(settings, controllerButtons.ToList(), dest.Size));
}
else
{
// create multiple player tabs
var tt = new TabControl { Dock = DockStyle.Fill };
dest.Controls.Add(tt);
int pageidx = 0;
for (int i = 1; i <= MAXPLAYERS; i++)
{
if (buckets[i].Count > 0)
{
string tabname = Global.Emulator.SystemId == "WSWAN" ? i == 1 ? "Normal" : "Rotated" : "Player " + i; // hack
tt.TabPages.Add(tabname);
tt.TabPages[pageidx].Controls.Add(createpanel(settings, buckets[i], tt.Size));
pageidx++;
}
}
if (buckets[0].Count > 0)
{
string tabname = Global.Emulator.SystemId == "C64" ? "Keyboard" : "Console"; // hack
tt.TabPages.Add(tabname);
tt.TabPages[pageidx].Controls.Add(createpanel(settings, buckets[0], tt.Size));
}
}
}
public ControllerConfig(ControllerDefinition def)
: this()
{
_theDefinition = def;
SuspendLayout();
LoadPanels(Global.Config);
checkBoxUDLR.Checked = Global.Config.AllowUD_LR;
checkBoxAutoTab.Checked = Global.Config.InputConfigAutoTab;
SetControllerPicture(def.Name);
var analog = tabControl1.TabPages[0];
ResumeLayout();
}
private void LoadPanels(
IDictionary<string, Dictionary<string, string>> normal,
IDictionary<string, Dictionary<string, string>> autofire,
IDictionary<string, Dictionary<string, Config.AnalogBind>> analog)
{
LoadToPanel(NormalControlsTab, _theDefinition.Name, _theDefinition.BoolButtons, normal, string.Empty, CreateNormalPanel);
LoadToPanel(AutofireControlsTab, _theDefinition.Name, _theDefinition.BoolButtons, autofire, string.Empty, CreateNormalPanel);
LoadToPanel(AnalogControlsTab, _theDefinition.Name, _theDefinition.FloatControls, analog, new Config.AnalogBind(string.Empty, 1.0f, 0.1f), CreateAnalogPanel);
if (AnalogControlsTab.Controls.Count == 0)
{
tabControl1.TabPages.Remove(AnalogControlsTab);
}
}
private void LoadPanels(ControlDefaults cd)
{
LoadPanels(cd.AllTrollers, cd.AllTrollersAutoFire, cd.AllTrollersAnalog);
}
private void LoadPanels(Config c)
{
LoadPanels(c.AllTrollers, c.AllTrollersAutoFire, c.AllTrollersAnalog);
}
private void SetControllerPicture(string controlName)
{
Bitmap bmp;
if (!ControllerImages.TryGetValue(controlName, out bmp))
{
bmp = Properties.Resources.Help;
}
pictureBox1.Image = bmp;
pictureBox1.Size = bmp.Size;
tableLayoutPanel1.ColumnStyles[1].Width = bmp.Width;
// TODO
// Uberhack
//if (controlName == "Commodore 64 Controller")
//{
// var pictureBox2 = new PictureBox
// {
// Image = Properties.Resources.C64Keyboard,
// Size = Properties.Resources.C64Keyboard.Size
// };
// tableLayoutPanel1.ColumnStyles[1].Width = Properties.Resources.C64Keyboard.Width;
// pictureBox1.Height /= 2;
// pictureBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
// pictureBox1.Dock = DockStyle.Top;
// pictureBox2.Location = new Point(pictureBox1.Location.X, pictureBox1.Location.Y + pictureBox1.Size.Height + 10);
// tableLayoutPanel1.Controls.Add(pictureBox2, 1, 0);
// pictureBox2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
//}
}
// lazy methods, but they're not called often and actually
// tracking all of the ControllerConfigPanels wouldn't be simpler
private static void SetAutoTab(Control c, bool value)
{
if (c is ControllerConfigPanel)
{
(c as ControllerConfigPanel).SetAutoTab(value);
}
else if (c is AnalogBindPanel)
{
// TODO
}
else if (c.HasChildren)
{
foreach (Control cc in c.Controls)
{
SetAutoTab(cc, value);
}
}
}
private void Save()
{
ActOnControlCollection<ControllerConfigPanel>(NormalControlsTab, c => c.Save(Global.Config.AllTrollers[_theDefinition.Name]));
ActOnControlCollection<ControllerConfigPanel>(AutofireControlsTab, c => c.Save(Global.Config.AllTrollersAutoFire[_theDefinition.Name]));
ActOnControlCollection<AnalogBindPanel>(AnalogControlsTab, c => c.Save(Global.Config.AllTrollersAnalog[_theDefinition.Name]));
}
private void SaveToDefaults(ControlDefaults cd)
{
ActOnControlCollection<ControllerConfigPanel>(NormalControlsTab, c => c.Save(cd.AllTrollers[_theDefinition.Name]));
ActOnControlCollection<ControllerConfigPanel>(AutofireControlsTab, c => c.Save(cd.AllTrollersAutoFire[_theDefinition.Name]));
ActOnControlCollection<AnalogBindPanel>(AnalogControlsTab, c => c.Save(cd.AllTrollersAnalog[_theDefinition.Name]));
}
private static void ActOnControlCollection<T>(Control c, Action<T> proc)
where T : Control
{
if (c is T)
{
proc(c as T);
}
else if (c.HasChildren)
{
foreach (Control cc in c.Controls)
{
ActOnControlCollection(cc, proc);
}
}
}
private void CheckBoxAutoTab_CheckedChanged(object sender, EventArgs e)
{
SetAutoTab(this, checkBoxAutoTab.Checked);
}
private void ButtonOk_Click(object sender, EventArgs e)
{
Global.Config.AllowUD_LR = checkBoxUDLR.Checked;
Global.Config.InputConfigAutoTab = checkBoxAutoTab.Checked;
Save();
GlobalWin.MainForm.AddMessage("Controller settings saved");
DialogResult = DialogResult.OK;
Close();
}
private void ButtonCancel_Click(object sender, EventArgs e)
{
GlobalWin.MainForm.AddMessage("Controller config aborted");
Close();
}
private void NewControllerConfig_Load(object sender, EventArgs e)
{
Text = _theDefinition.Name + " Configuration";
}
private static TabControl GetTabControl(IEnumerable controls)
{
if (controls != null)
{
return controls
.OfType<TabControl>()
.Select(c => c)
.FirstOrDefault();
}
return null;
}
private void ButtonLoadDefaults_Click(object sender, EventArgs e)
{
tabControl1.SuspendLayout();
var wasTabbedMain = tabControl1.SelectedTab.Name;
var tb1 = GetTabControl(NormalControlsTab.Controls);
var tb2 = GetTabControl(AutofireControlsTab.Controls);
var tb3 = GetTabControl(AnalogControlsTab.Controls);
int? wasTabbedPage1 = null;
int? wasTabbedPage2 = null;
int? wasTabbedPage3 = null;
if (tb1 != null && tb1.SelectedTab != null) { wasTabbedPage1 = tb1.SelectedIndex; }
if (tb2 != null && tb2.SelectedTab != null) { wasTabbedPage2 = tb2.SelectedIndex; }
if (tb3 != null && tb3.SelectedTab != null) { wasTabbedPage3 = tb3.SelectedIndex; }
NormalControlsTab.Controls.Clear();
AutofireControlsTab.Controls.Clear();
AnalogControlsTab.Controls.Clear();
// load panels directly from the default config.
// this means that the changes are NOT committed. so "Cancel" works right and you
// still have to hit OK at the end.
var cd = ConfigService.Load<ControlDefaults>(Config.ControlDefaultPath);
LoadPanels(cd);
tabControl1.SelectTab(wasTabbedMain);
if (wasTabbedPage1.HasValue)
{
var newTb1 = GetTabControl(NormalControlsTab.Controls);
if (newTb1 != null)
{
newTb1.SelectTab(wasTabbedPage1.Value);
}
}
if (wasTabbedPage2.HasValue)
{
var newTb2 = GetTabControl(AutofireControlsTab.Controls);
if (newTb2 != null)
{
newTb2.SelectTab(wasTabbedPage2.Value);
}
}
if (wasTabbedPage3.HasValue)
{
var newTb3 = GetTabControl(AnalogControlsTab.Controls);
if (newTb3 != null)
{
newTb3.SelectTab(wasTabbedPage3.Value);
}
}
tabControl1.ResumeLayout();
}
private void ButtonSaveDefaults_Click(object sender, EventArgs e)
{
// this doesn't work anymore, as it stomps out any defaults for buttons that aren't currently active on the console
// there are various ways to fix it, each with its own semantic problems
var result = MessageBox.Show(this, "OK to overwrite defaults for current control scheme?", "Save Defaults", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
var cd = ConfigService.Load<ControlDefaults>(Config.ControlDefaultPath);
cd.AllTrollers[_theDefinition.Name] = new Dictionary<string, string>();
cd.AllTrollersAutoFire[_theDefinition.Name] = new Dictionary<string, string>();
cd.AllTrollersAnalog[_theDefinition.Name] = new Dictionary<string, Config.AnalogBind>();
SaveToDefaults(cd);
ConfigService.Save(Config.ControlDefaultPath, cd);
}
}
private void ClearWidgetAndChildren(Control c)
{
if (c is InputCompositeWidget)
{
(c as InputCompositeWidget).Clear();
}
if (c is InputWidget)
{
(c as InputWidget).ClearAll();
}
if (c is AnalogBindControl)
{
(c as AnalogBindControl).Unbind_Click(null, null);
}
if (c.Controls().Any())
{
foreach (Control child in c.Controls())
{
ClearWidgetAndChildren(child);
}
}
}
private void ClearBtn_Click(object sender, EventArgs e)
{
foreach (var c in this.Controls())
{
ClearWidgetAndChildren(c);
}
}
}
}

View File

@ -1,630 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>172, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAwAMDAQAAAABABoBgAAxgAAACAgEAAAAAQA6AIAAC4HAAAYGBAAAAAEAOgBAAAWCgAAEBAQAAAA
BAAoAQAA/gsAADAwAAAAAAgAqA4AACYNAAAgIAAAAAAIAKgIAADOGwAAGBgAAAAACADIBgAAdiQAABAQ
AAAAAAgAaAUAAD4rAAAwMAAAAAAgAKglAACmMAAAICAAAAAAIACoEAAATlYAABgYAAAAACAAiAkAAPZm
AAAQEAAAAAAgAGgEAAB+cAAAKAAAADAAAABgAAAAAQAEAAAAAACABAAAAAAAAAAAAAAQAAAAEAAAAAAA
AAAAAIAAAIAAAACAgACAAAAAgACAAICAAACAgIAAwMDAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP//
/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAHR3AAAAAAAAAAAAAAAAAAAAAAAAAAAAdHdEcAAAAAAAAAAAAAAAAA
AAAAAAAAAHd0d3QAAAAAAAAAAAAAAAAAAAAAAAAAAEd8d3UAAAAAAAAAAAAAAAAAAAAAAAAAB3yHfHZw
AAAAAAAAAAAAAAAAAAAAAAAAd3fIyHVwAAAAAAAAAAAAAAAAAAAAAAAAfHh3jIxwAAAAAAAAAAAAAAAA
AAAAAAAHd8jIyHdgAAAAAAAAAAAAAAAAAAAAAAAHd4yHfIdAAAAAAAAAAAAAAAAAAAAAAAAHyMjIyMhQ
AAAAAAAAAAAAAAAAAAAAAAB3d3eMh4dgAAAAAAAAAAAAAAAAAAAAAAB8jIyIfIdQAAAAAAAAAAAAAAAA
AAAAAAB3h4jIiMh3AAAAAAAAAAAAAAAAAAAAAAB8jIeHeIjHAAAAAAAAAAAAAAAAAAAAAAeIiHh4eMiE
AAAAAAAAAAAAB0dHcAAAAAd8h4eIiIiHcAAAAAAAAAB0d3d3RwAAAAeIeIiIiIh3RwAAAAAAAHR3d8h3
dAAAAAfIh4iIiHiIx0cAAAAAdHh3eIeHhwAAAAeHiIiIiIiId3R3dHR0eHd4h4eHhAAAAAd4eIiIiIiH
x3d2d3eId4iIiIiIhwAAAAd4eIiI+IiIh3d3eHh3iIiIiIeHwAAAAAfIjHeIiIiIyIeHh4iIiIiIiIiI
cAAAAAeIQ0R3h3iIiMiIiIiIiIiIiIiEAAAAAAfIR3d3d0iIiIh4iIeIiIiIiHhAAAAAAAB4d3d3SHiI
h4fTiIi3iIiIeIwAAAAAAAB3h4d3eIeIiHiJiIuIiIh4jHAAAAAAAAAHyId3h3h4iIh4iIiIiIiHeAAA
AAAAAAAAB8iMiMjIiIiIh4h3aMjHAAAAAAAAAAAAAAdYyIeIiIiMjId6d4eAAAAAAAAAAAAAAAAHdsjH
eIeH6MiId3AAAAAAAAAAAAAAAIiIh4V8jIh4eIfHcAAAAAAAAAAAAACIiIh3AAAHd3h3fHcAAAAAAAAA
AAAAAAiIjHgAAAAAAHx8eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A
H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP////
AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA
AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/
AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC
AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdwAAAAAAAAAAAAAAAA
AAd0dAAAAAAAAAAAAAAAAAB3x3cAAAAAAAAAAAAAAAAAd3fHcAAAAAAAAAAAAAAAB3yMh3AAAAAAAAAA
AAAAAAfIeMdwAAAAAAAAAAAAAAAHjIyHQAAAAAAAAAAAAAAAfId4yHAAAAAAAAAAAAAAAHjIyIdQAAAA
AAAAAAAAAAB3iId4YAAAAAAAAAdwAAAAjIiIiIUAAAAAAHd3dAAAB4iIiHh8cAAAAHd3x4dwAAd4iIiI
h3Z3d3R3yIh4cAAHh4iIiIfHd3d4iIiIh3AAB3jHiIiIiHeHiIiIiIwAAAh3dXh4iMiIiIiIiIhwAAAA
yGd0d4iIeIi4iIiMAAAAAIeHd4iIh32IiIiIcAAAAAAAd4jIyIiIiHeHyAAAAAAAAAB3h4iIh8h3dwAA
AAAAAAAIh8fIh4eIaAAAAAAAAACIiHAAB8jIyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
////////////////////n////g////wP///8B///+Af///gH///4B///8Af///AH///wB//n8AP/A+AB
/AHgAAAB4AAAAeAAAAPgAAAH8AAAD/AAAB/8AAA//wAA//4AA//weA//////////////////////////
//8oAAAAGAAAADAAAAABAAQAAAAAACABAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA
AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAAAAAAAAAAAAB3dAAAAAAAAAAAAA
d8dwAAAAAAAAAAAAfId3AAAAAAAAAAAHeMjHAAAAAAAAAAAHyHh3AAAAAAAAAAAHh3eEAAAAAAAAAAAI
yIiHAAAAAHd2cAAIiIiIQAAAd3d4UACHiIiId3d3eHiIcACHh4iIyHeHiIiIcAAIR3d4iIiIiIiMAAAH
d3eIh3iIiIhwAAAAeMh4iIiHiMAAAAAAAHfIiMh4aAAAAAAAiIgHyIfIAAAAAAAIgAAAAIAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD8f/8A+H//APB/
/wDwP/8A4D//AOA//wDgP/8A4D/BAOAfAQDAAAEAwAABAOAAAwDgAAcA8AAfAPwAPwDwgP8A5/f/AP//
/wD///8A////ACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA
AAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAd1AAAAAAAAB8cAAAAAAAB4eAAAAAAAAHyMgAAAAAAAiIhwAAAHcACI
iHcAd3hwAIz4jIeIiIAAd3eIiIiIAACHeIiIiHAAAACMeMh4AAAAiAAIgAAAAAAAAAAAAAAAAAAAAAAA
AAD//wAA//8AAP//AADj/wAA4/8AAMP/AADB/wAAwfkAAMDBAADAAQAAwAMAAMAHAADwDwAAzn8AAP//
AAD//wAAKAAAADAAAABgAAAAAQAIAAAAAAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAAA9OzsAZD8/AGg8
PABtPj4AQkNDAEZIRwBWQkIAV0REAF5AQABbRkYAVklJAFxPTwBTU1MAXFJSAF5ZWQBkQEAAYUREAGZF
RQBqQkEAYEtLAGNPTwBwQUEAfUZGAHJKSgB2SUkAfU9PAGBRUQBgVFQAZlZWAGZYWABqWVkAclZWAHpU
VAB9W1oAbmJiAGtoaABtaWkAcWdnAHdnZwB8Y2MAe2pqAHJxcQB+dHQAd3l5AHl6egCGT08AiU9PAIFP
UACGU1MAjVFRAIlWVgCMV1cAg1xbAIxaWQCQUlIAlVJSAJFXVgCXVVUAmVVVAJZaWQCSXV0AlV9eAJpZ
WgCeW1sAml5eAKBZWgCgXFwAql9fAIRmZQCIZWQAhWtrAI5ragCTYmEAnGBhAJ9kYwCaZmYAk25uAJ1s
awCFdHQAiXd3AIt+fgCWd3cAmHR0AJV5eQCbfHwAo2JhAKZhYQChZWUApGVkAKplZACsZGQAqmhnAKZr
agCnbGsAqmloAKlubQCsbW0AtGZnALhsbACxb3AAv29wAKVxcACrc3IAr35+ALN0cwC5c3MAvXBxALR4
dgC1fHsAunt6AMNtbgDGb3AAw3FyAMZwcQDGdXUAyHR1AMp3eADBeXkAxnt7AMB/fgDLensANLBSAEWf
TgBBtFwAPMdnADHkdgDciiIAvoF/AISrdwDln0sA35lhAN2XfADgmmEA8LdlAO61cAArWPIALWT+AEh5
+gDOf4AAfoCAAHiA1ABZv9wAZrnUAGK+2ABxnv4Ad6P/ADPX/QBw0OcAW+D7AIKEgwCPgoIAjI2NAJuC
ggCUiIgAmYqKAJGSkgCjhIQAqoKCAKKLiwC+hIMAsoqKALaSgQCum5sAsZubALqqlQCdgr4Ar6ytALGh
oAC6pKQAwoSDAMyBggDGiIYAyYiHAMWMigDMjIoA0ISFANKHiADUjIwA2Y6NAMCUjQDIk44A0JCPANaP
kADHlZQAzpSSAMScmwDUkpIA2ZSVANWYlgDampcA2ZeYANWcnADam5sA4p2cAMChjwDeoJ4A5aCFAOaj
jQDlpJoA2p6hAMOkowDOoaEAy62tANegoADdoqEA2aGpANGsrwDdq6kAwbG4ANGysQDdtLQA2ri3AOGk
owDjqKYA66ylAOGnqADjq6oA6a2rAOOwrwDssK4A5K+wAOaztADttLIA57i2AO24tgDmurgA6rq6APC1
swDyuLYA9Ly5APi+uwD1wL0A+cC9AKKMwACkk8QAqprMALSayACptsEAlaDkAOy/wACRxtQAgOv9AJnr
9wDEwsoA5sbGAOzCwgDuyMcA7MzMAPPEwgDxy8oA9dPTAPja2gAAAAAAAAAAAP///wAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAADLytDi9tOemQAAAAAAUy9EecLEsa1uPTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPj11Mme
VakAAAAAAAAAAAAATS84M0akAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAP///////wAA//h/////AAD/4D////8AAP/AP////wAA/8A/////AAD/gB////8AAP8A
H////wAA/wAf////AAD+AB////8AAP4AH////wAA/gAf////AAD8AB////8AAPwAH////wAA/AAP////
AAD8AA////8AAPgAD//+BwAA+AAH//ADAAD4AAP/wAMAAPgAAP8AAwAA+AAAAAADAAD4AAAAAAMAAPgA
AAAABwAA+AAAAAAHAAD4AAAAAA8AAPgAAAAAHwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAA/wAA/4AAAAP/
AAD/4AAAB/8AAP/4AAAf/wAA/8AAAH//AAD8A+AD//8AAPgP/A///wAA////////AAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAE
AAAAAAAAAAAAAAABAAAAAQAAAAAAAFFNTQBRUlIAU1RUAGJHRwBiT08Aa0lIAGJTUwBrVlYAYllZAGZc
XABpWloAb1xbAHNTUwB7V1YAc1hXAHFbWwBkZWUAaWFhAG5kZABpamkAcGFhAHlubgB2cHAAf3V1AH55
eQB8fX0AgUpKAI1PTwCLWFcAhlhYAI9ZWQCKXFsAm1ZWAJJZWQCWWVgAmlpbAJtcWwCiXFwAl2BfAIBg
YACAZ2YAgG9vAI9oaACWZWQAmGBhAJ5kZACcaWoAmm9vAIV0dACNcHAAiXZ2AIB8fACac3IAm3V0AJ51
dQCZfHwAnHx8AKNmZgCnZmYAqmJiAK5jYwCvb24AtWVmALBtbgC5bW0AvmxtAKx+fQCxcnIAtHBwALZz
dACydXQAtnd2ALlwcAC5dnYAt3p5ALh5eAC8fHsAun18ALx+fQDGb3AAxnBxAMdzdADAd3YAyHJzAMlz
dADJdXYAynd4AMd/fwDMe3wAzXx9AHunbwBhvHIAYsN4ANuLOwC2hn4A4Zt5APC3ZABte9sAX47+AHWM
5QAl0foAY+P8AIeDgwCFhoYAioSEAJOIiACWi4sAmpKRAKGCgQCmhYUAqYGBAKuDhACniooApYyMAKiO
jQCyhYMAvoWEALeNjQCrj5AAr5eXALSVlAC9lJMAmbCEAK6RugDBgYAAwoSCAMWDhADChoQAxYeFAM6A
gQDFiIYAxoqIAMqIiQDMi4oAy4yKAMiPjQDPj44A0ISFANKJigDUi4wA04+NANWNjgDKkY8A0JCOANud
iQDWj5AAzJSTAM2XlgDGm5oA1pGSANOUkgDVl5EA1pOUANiVlgDYmJUA2ZeYANKenADbmpsA3pmYANuc
mgDbn5wA1aacAN6gngDqqZoA3Z+gAMyjowDCra0AxqysAMqpqQDboaAA3qKiAN6logDbp6UA3aWkANer
qgDWsbMA0rW0ANe0tADfs7IA4aSiAOGlpQDkp6UA46imAOWopgDsraIA6qimAOGoqADhrqwA6a2rAOqv
rADpsK4A7LGuAOGzswDlsbEA7bKxAO+1sgDotrYA5rm3AO+4twDot7sA6bq5AOu9uwDrv70A8bazAPG2
tADxuLUA9Lm2APC9uwD2vboA9L+9APi+uwD4v7wA8sC+APXAvgD5wL0AkILJAKqXzACsu8cAqr/LALLV
3QDawMIA48XFAOvDwQDswMAA7cTDAO/ExQDgxsgA8cbEAPTGxADwyskA9MvJAPLNzQD21dYA+NjZAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAMEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqHCEcBQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAayU9PSYbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQlBSQiJpAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAM0pSUlJQPRcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnUlJSUlJGFQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAFJSUlJSUkoQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzUlJSWVJZfxAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5XWYqKioqGDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASoqMkpqa
mqAsAAAAAAAAAAAAAAAAAABoNAAAAAAAAACMjJyuvLy2toYHAAAAAAAAAAAAABcOIDouBgAAAAAAc4yc
tsHKysPAriIKAAAAAAAAABYgRk1LTX+DEAAAAABukqXB4ejo4dHPQCIEChcXEwggTXV/k66unKMpAAAA
AG6Srsro6ero0dN/Rk1NRk2Dg4STrsbh4cHAt2sAAAAAbpKuOXPe6ajW15KGg4OGk528yuHo5eHPz882
AAAAAAB4jCkDAxSoMabXt5yjt8ro3ePo5dbT09HTdAAAAAAAAABGcBFoGgFwdtfDwHxi2dpmZcrX09HP
z0MAAAAAAAAAAHh/qWwaOa6cz9PNZGPYsdzbzc3DwLk2AAAAAAAAAAAAAAAvhpKakoyg19HNyKS5wHtb
orZ/cwAAAAAAAAAAAAAAAAAANkaKWVm5zb1gYV6cXVxfNgAAAAAAAAAAAAAAAAAAALGvlTIuP1K5tqCR
l4xfLwAAAAAAAAAAAAAAAAAAsbPBenkAAAAAcCVYjE0scwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////////////////+f///+D////A////wH
///4B///+Af///gH///wB///8Af///AH/+fwA/8D4AH8AeAAAAHgAAAB4AAAA+AAAAfwAAAP8AAAH/wA
AD//AAD//gAD//B4D////////////////////////////ygAAAAYAAAAMAAAAAEACAAAAAAAQAIAAAAA
AAAAAAAAAAEAAAABAAAAAAAAWlJSAHBJSQB1SEgAe1dXAHdYWAB5WlkAel1dAGBiYgB1bGwAfWtrAHh2
dgB9fn4Ag01NAIRXVwCIV1cAhV9eAItbWgCgX14ApV1dAJhgXwCNYGAAnWtqAJhtbQCCdnYAh3x8AI15
eACeensAqGBgAKhoZwCga2oArGpqALNqagCzb28AtG1tALltbQCxb3AApnVzAKlzcwCqdHMApnp6AKd+
fgCpensAq3x7ALZ3dgC8dHQAvH59AMZvcADGcHEAxXN0AMhycwDJdncAynh5AMx5egDNfn8Ajo1wAOek
VgDGgH8A4p53AEZ2+gB8u4AAd8PaAIuEhACOh4cAjo6OAJ+DggCejo4Ao4SEAKSIiACsi4sAqo2MAK6P
jgC+gYAAvoaGAL+KiACskJAAtJeXALWenQC5np4At6iOAKmyjgC9nroAwYSDAMaGhADOhoYAxomHAMiK
iQDJjYwA0oeIANOOjwDUjY0A2ZiPANaPkADGkZEAx5eXAMySkADGnZwA1ZOSANeTlADWl5YA2JSVANGZ
mADan50A3J6dAOCcmwDVoJ8A7K2fAMOtrQDXo6IA3aCgAN+kpADVq6oA3ay3AMu0tADPtrYA3L+/AOCi
oQDhpqUA5KelAOinpgDlq6gA46usAOOvrQDqrqwA7LGuAOayswDjtrQA5re1AOqysQDts7EA57y6AO+8
ugDrvL0A8LOwAPC1sgDwtrQA87q3APS6twD2vboA8b69APi/vAD2wb4A+cC9AJmTzwDHqMMAu8PMAIHf
8QDByNAA7cLCAO3FwwDvxsQA5cjIAOzOzgDwxcQA9cbEAPPP0AD10tIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BQMJAAAAAAAAAAAAAAAAAAAAAAAAAAAPHBMNAAAAAAAAAAAAAAAAAAAAAAAAABojLy8TAAAAAAAAAAAA
AAAAAAAAAAAAAB0wMDAiPgAAAAAAAAAAAAAAAAAAAAAAQjAwMDAtGAAAAAAAAAAAAAAAAAAAAAAAFzIy
NTU5CgAAAAAAAAAAAAAAAAAAAAAAIjZYWFxcBwAAAAAAAAAAAAAAAAAAAAAANlxtdW11JQAAAAAAAAAA
PgcRDgkAAAAAXG1/lISAZgMAAAAAABkVLC5SVhcAAABNY3WWnJuLfB8UBAcQHkhWaX91dSsAAABNY2BM
mJeCiVJSVl9laX+WloSJgEIAAAAAXAEIC0tGjnR0dJaRk5qNjIyJQwAAAAAAJkNADBtdjIaPO1GSPYuJ
hnVEAAAAAAAAAClISWRcd4xwkGp8UE90VwAAAAAAAAAAAAAAKSQ1NYZ7OjhbPDdGAAAAAAAAAAAAAHNv
YGsAKyJoXFYmRwAAAAAAAAAAAAAAcnIAAAAAAAAATgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
/wD///8A////APx//wD4f/8A8H//APA//wDgP/8A4D//AOA//wDgP8EA4B8BAMAAAQDAAAEA4AADAOAA
BwDwAB8A/AA/APCA/wDn9/8A////AP///wD///8AKAAAABAAAAAgAAAAAQAIAAAAAAAAAQAAAAAAAAAA
AAAAAQAAAAEAAAAAAABjZGQAdmRjAHtpaQB/eHgAgU9PAKBaWgCFbm0AlWtqAKptbgCwZ2cAsGhoAKxw
cACteHkAvnJyAMZvcADGcHEAy3l5AMx9fgCFmXQAwIB/ANeUfQDhoX8AlIqJAJWMjACYiIgAoIaGAK2K
igCxh4cAvoGAALKKigC4iYgAuJWVAL2cnACss50AuqKhAL+mpgDLgoIAxImHAMeNjADLkI8AxpWTANCS
kQDYlZUA1J6dANqZmgDdnp4A1J+oAMaiogDOr68AzLKyANi5uADhpaIA4qypAOWtqADrrqsA4bKwAOay
sgDtuLYA57++AOy4uADxtLIA8be0APa9ugDswL4A9sG+ALCcxwC5ncIA06zBALnH0QC2ytQA7sPDAPLS
0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAZBgUAAAAAAAAAAAAAAAAACw8KAAAAAAAAAAAAAAAAGhAQDgAAAAAAAAAAAAAAAAkRESUYAAAA
AAAAAAAAAAAlKy4uBwAAAAAAAAcDAAAAKzlHPCYCAAAYCB0oKgAAAC0wSDs0FB0nLDlAOiwAAAANAQQb
Pi9DRkVBPzUAAAAAJB4cKz5EQjMiNSkAAAAAAAAAHwwRNxYVEyQAAAAAAAAxMgAAACEgAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAA4/8AAOP/AADD/wAAwf8AAMH5
AADAwQAAwAEAAMADAADABwAA8A8AAM5/AAD//wAA//8AACgAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAkAAAAJAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAUAAAAOAEBAVUAAABUAAAANQAAABAAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAkFBSUvGRl5TCkpwlYuLtxDJCTQFw0NmQAA
AEkAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAwMKE8rK6V6RET2klJR/5ZS
U/+OT0//ZDc38B0QEJoAAAAyAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYDAwYVzAwoopP
T/ygXVz/oFtb/55ZWf+bWFf/k1NT/1UvL9wGAwNcAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AARNKipxhk5O+adkY/+uZWX/tWdo/7VmZ/+qYWH/nltb/3hERPcfERGCAAAAFgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADEZGS1zQ0LXqGdm/7ptbf/Fb3D/x3Bx/8hwcf/BbW7/q2Vl/4hPT/82HR2gAAAAIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAB1gxMYyYXl3/vXFx/8Zwcf/HcHH/x3Bx/8dwcf/HcHH/uG1t/5NY
V/9EJia2AAAAKQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPB8fNH1MS+K4cnH/x3Fy/8dwcf/HcHH/x3Bx/8dw
cf/HcHH/wHBx/51gX/9PLCzGAAAAMwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAMAAAAAAAAAAAAAAAAAAAAALhAQFIZXVs/RjIz/1Y2O/9qYmP/eoaL/46qr/+aysv/ot7f/6rm5/+m4
uf/otbX/5q+v/+uvrf/jqab/wYeF/28/P/QhEhKvAAAAXwAAACgAAAANAAAABQAAAAMAAAACAAAAAwAA
AAUAAAAKAAAAFQAAADAdDg9oSSkptHZHRu2dYmL+t3Z1/758e/+6enn/tnh3/7d5eP+8fn3/w4SD/7Z6
ef9eODfbBgICTgAAAAgAAAAAAAAAAAAAAAAAAAAAPhwcJJVjYuPXkZH/2JOU/92fn//iqqr/57O0/+u8
vP/uwsL/78XG/+/Exf/twMD/67i4/+60sv/wtrP/zZKQ/5taWv9xQED2MRsaxAgEBIcAAABaAAAAQQAA
ADcAAAA2AAAAOwAAAEUEAgJZHA4OfUcnJ7l5SkntqGxr/8CAfv/DgoH/vH59/7p+ff/DiIb/zZGP/9GT
kf/UlJP/1peV/9eZl/+GVlbuGQsLVwAAAAcAAAAAAAAAAAAAAAAAAAAARiIiLZ9rauvZk5P/2peY/+Ck
pP/lsLD/6ru7/+/Fxf/yzMz/9NDQ//PPz//xycr/7sDA//K5tv/1u7j/36Kg/6dmZf+mZWX/j1ZW/WM6
OutDJSXQNBwcvDAaGrQ0HBy1PiIivUwsLMtkPDzfh1VU9a1xcP/EhIP/xIWE/7+Cgf/Ch4b/zZST/9mk
ov/grq3/4a6t/96lo//eoJ7/36Kg/+Cjof+IWVjnGwwMQwAAAAIAAAAAAAAAAAAAAAAAAAAARyQkL6Br
auzZk5P/25qb/+GnqP/ntLT/7cDA//LLy//209T/+NjY//fX1//00ND/8cbG//W9u//4vrz/46ak/7d0
c/+vb27/s3Jy/7d2df+ucXD/pWpp/6Npaf+nbWz/sHVz/7p9fP/EhYT/yImI/8WIhv/DiIb/ypGP/9eg
n//hr63/57q5/+rCwP/rwsD/6bq4/+evrf/nq6n/6q6r/9qgnv9wRkbDBwAAHgAAAAAAAAAAAAAAAAAA
AAAAAAAASCQkLZ1nZuvYkpP/25uc/+Opqv/qtrf/7cHB//TOzv/52Nj/+tzc//na2v/xz9D/8MfH//fA
vv/6wb7/6a6r/8OBgP/DgoD/vX58/7h7ev+8fn3/woOC/8aHhv/HiYj/xoqJ/8aLif/Ijoz/zZST/9eg
nv/hrav/6Lm3/+zCwf/uyMf/78nH/+/Dwf/uvLr/7ba0/+60sf/vtLL/8ri1/7J+fflMKSltAAAABAAA
AAAAAAAAAAAAAAAAAAAAAAAAQyEhI5JcXOPWj5D/3Juc/8qVlf+BZmb/bl5e/4l4eP/AqKj/8tPT//LO
zv+5p6b/w6qq//fBv//7wr//8LWy/86Ojf/Ojoz/0ZGP/9GSkP/OkY//zpOR/9GamP/VoJ//2qel/+Gv
rf/nt7X/6727/+3Dwf/wycf/8czL//LLyf/yxsT/8cC+//G7uf/yubf/87m3//S7uP/4vrv/1J6c/3JH
RrAdCgsWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANRcXEYJNTcvPiIn/15aW/2VNTf85Ojr/Q0VF/0JF
RP9dXFz/n5GR/+S/v/+bh4f/hXp6/+25uP/7wr//9bu4/9qcmv/Zmpj/252b/96gnf/ipKH/5q+s/+u+
vP/vycf/8srI/+3Hxv/wysj/9c7M//TNy//0ysj/9MbE//TBv//1vrz/9r26//e9u//4vrv/+L+8//vB
vv/hqqf/g1ZVzDwcHC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAW4+Ppq/env/05OT/2ZX
V/9rbm7/fX9//3l6ev99f3//cHJy/5F9ff+ff3//XFhY/9eop//8wr//+L+8/+Wppv/ipaP/5qil/96i
pP/Kmaz/1qi1//LGxP/tyMf/qb3J/23E3P9kw9//vMTN//jDwP/3wb//+MC9//i/vf/5v73/+b+8//i/
vP/3vrv/+L68/92mo/+IWlnRRSMjOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcv
L0mbX1/y15GS/6GAgP9XV1b/iYuL/4CBgf98fX3/cnR0/1dPT/++j4//km9w/9Sfnv/6wL3/+cC9/+6z
sP/ssK3/0Z+u/4OH1P9YffD/QGPs/7KYyv/Ct7z/Ytrz/3Ts//8s2f//cbvU//m+u//4v7z/+L67//e9
uv/1vLn/9Lq3//O5tv/zuLX/0puZ/4RVVctGIyM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADIXFwdrPDySq2ts/diZmf/ApKT/sKur/4CBgP95enr/iYiI/49zdP/do6P/36Ch/96e
nv/zuLX/+sK///W7uP/1ubT/qZC//2qY+/9tnf//MGT6/56FxP/esK//nMbS/57n8/9+z+T/ybG3//a6
t//zubb/8re0//C1s//utLH/7rKw/+qvrP++iIb9dklJtkMgISoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHIyMSazw8kZ5hYvXNjI3/2aSk/7OMjP+bd3f/sIKC/9KV
lv/cnJz/2peY/9aRkf/koqL/+sG+//nAvf/5v7z/4amw/6qZx/+aouP/qpvP/+mxtv/2urj/6rGv/+S6
u//ptrX/466n/+Ovqf/ssK7/6q6s/+isqv/oq6n/2J2b/6JubfFoPT2NOxoaFwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBoaCFowMFd7SEjAomZm9sWC
gv/XkZL/25SV/9iSk//Wj5D/1IyN/9KHiP/UiIj/8bOx//rCv//3vbv/9ru4//O3s//xuLX/7q6e/+ej
hf/npIn/7bCp/+Otp/+KsX3/ULdm/1WjWv+7oYz/5KWk/9uenP+4gH79glJRzVYuLlQgCAkGAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA8HBwQVy4uS3FBQaCPV1fjsG5v/cmAgf/ShYb/0YKD/85+f//LeXr/2I2M//e8uf/1vLn/7rOx/+2y
sP/lpJX/5qFY/+6xXP/djS3/35h9/86gl/9SwW7/Nd90/0WxXP+vlH//wYSE/49cW+VlOTmBQR4eHAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGk7OhqIWFd8oG5u8J5qav+eX2D/tmts/8Z0df/KdHX/yXJz/92T
k//3vLn/7LGu/+Snpf/dm5L/4Z1q/+61dP/fmmX/15WM/9eYlv/Bm43/r6uR/6uNgP+WYWDtbkBAnUwn
JzQVAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiFJSBnhC
QgpqNDQJWSUlB08dHQdfKisKfENDFJJWViinbGtRvYOCjtOcm8/pt7X157y6/7eOjfhxRUW7aTk5m4RK
StehWlr6uGdo/8Zwcf/dkpH/8bSx/+OnpP/YmZj/1ZWT/9ealP/Vl5X/0JCP/8eIhv+zdnb/lFtc6nA/
QKRSKio/JQwNBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADTn6AB2qioDMuUlCHBhYU8voCAWcCBgXTEhoaLzZGQqdeensngrKvn47Sz/NOop/+yiIfyi2Bgs2k+
PlZXKysPAAAAAUYlJRxcMTFYcj4+pYpMTeWmXF3+xnl5/9+Zl//dnJr/z46M/8KCgf+vc3L/ll9e831L
S8hlOTl/TigoMy0REQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABzQUIDnmprDriGhifHlpZMzp6eeNCgoZ7On5+2yJqaybuPj9WnfHzVj2RkunVJ
SYNbLy8/PRQUCgAAAAAAAAAAAAAAAAAAAAAAAAAAKRUVBU0pKSphNDRtd0BAsotNTd2ZW1vrkVlY4HtJ
Sb5lOTmCUysrQTsbGxEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWCwsA2Y4OA5xQkImdkhIRHhKSll0R0dibUBAWWI2
NkNUKCgoOhISDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMhkZB0km
Jh5LJiYsRSEhITATFAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AAD/+H////8AAP/gH////wAA/8Af////
AAD/gA////8AAP+AD////wAA/wAP////AAD/AA////8AAP4AB////wAA/gAH////AAD8AAf///8AAPwA
B////wAA/AAH////AAD8AAf///8AAPgAB////wAA+AAH//4HAAD4AAP/8AEAAPgAAf/AAQAA8AAA/wAA
AADwAAAAAAAAAPAAAAAAAAAA8AAAAAAAAADwAAAAAAEAAPAAAAAAAQAA8AAAAAADAADwAAAAAAcAAPAA
AAAADwAA+AAAAAAfAAD4AAAAAD8AAPwAAAAAfwAA/gAAAAD/AAD/gAAAA/8AAP/gAAAH/wAAgAAAAB//
AAAAAAAAf/8AAAAD4AP//wAAgB/8H///AAD///////8AAP///////wAA////////AAD///////8AAP//
/////wAA////////AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAYAAAAZAAAAGQAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAARCQkYOh8fb0ooKK80HByiCQUFTAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAIhERFmA2Np2ITUz3lVNT/4dLS/5IKCi9AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAANjODiBllhY+61kZP+vY2P/pV5e/3xHRvEhEhJfAAAAAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAASSgoN41VVeS6bW3/xW9w/8dwcf+9bG3/klZW/jogIIEAAAAGAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1RkWcs2xs/8dxcv/HcHH/x3Bx/8Zwcf+iYWH/SSkpmAAA
AAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUC0tMZtgX+fGcnP/x3Bx/8dwcf/HcHH/x3Fy/61q
av9UMTGqAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxRER1tm9v/8hxcv/HcHH/x3Bx/8dw
cf/HcnP/tnRz/185OboAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAACIxXV7TEdHT/yHJz/8l1
dv/Kd3j/ynd4/8p4eP/Bf37/bURDywAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNKysjo2Zm4Mt4
ef/NfH3/z4GC/9GFhf/RhYb/0YWF/82Mi/9+UVHeCAICOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAJAAAACwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAGc+
Pkm1c3P30IGC/9OJiv/XkZL/2ZaW/9mWl//YlJX/2JmY/5hnZfMeEBBrAAAABwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAA0FAgItHhAQWzAbG4IqFxeHDQcHWwAAABkAAAAAAAAAAAAA
AAAAAAAAek1MdMN/f//VjI3/2piZ/9+io//hqKn/4qmp/+Clpf/jpqT/wImH/04xMLwAAAA6AAAABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABEbDg5GRygokW5CQs+MVlbxnGJh/JdfXvxnPz7hHA8PbgAA
AAwAAAAAAAAAAAAAAACMW1qbz4qK/9qXl//gpqb/5rKz/+q6u//rvLz/6La2/+qxr//epKL/j1lZ+DUc
HLACAQFPAAAAHQAAAA8AAAAPAAAAEwAAACIbDg5MVDExnYZUU+SpbWz+uXl4/7x+fP/AgoD/xoeF/72A
f/9fOzu1AAAAHAAAAAAAAAAAAAAABJhkZK/VkZH/3Z+g/+axsf/twMD/8svL//LNzf/vxcX/8Lq4/+6z
sf+1dHP/j1VU+144N9g7IiKqMhwclDcfH5RGKSmiYTw7v4tZWOiydXT+woOC/8aKiP/Ol5X/2aWj/9ui
of/cnpz/2pyb/35TUrgAAAAVAAAAAAAAAAAAAAAFmmVkstaTk//hpaX/7Lm6//TLy//419f/+NnZ//TP
z//1wb//9Lq3/8aGhP+1dHP/s3Rz/6xwb/+pb27+rnNy/7Z7ev/BhIL/yY2L/8+WlP/apqT/5be2/+vB
v//rvrz/6bKw/+uvrf/Um5n/bUVEgAAAAAMAAAAAAAAAAAAAAAOTXV2q1ZGR/9CYmP+dfX7/o4yM/9e8
vP/z0tL/zLOz/+u8u//5v7z/1peV/8uLif/Ki4r/yoyL/86Ukv/TnJv/2qSi/+Gtq//nuLb/7cPB//DJ
x//xxsT/8b+9//G6t//zubf/77az/6d1dM89Hx8lAAAAAAAAAAAAAAAAAAAAAIJOTojNiIn/jGlp/01O
Tv9UVlb/dnNz/7uhof+Pfn7/xJ+e//zCv//lqKb/3J2b/+Chnv/hpaT/7Ly5/+vHxv/MxMn/0MjN//LK
yf/1x8X/9sLA//a/vP/3vrv/+L+8//S7uP+5hoXhYTo5RwAAAAAAAAAAAAAAAAAAAAAAAAAAaTs7RrVz
dPKmfn7/cXJx/4SGhv97fX3/b2Zm/516ev+7kJD/+sG+//C2s//lqqr/rpbA/3aB2/+ql83/tMHK/2jc
9P9OzOz/2r3B//q/vP/3vrv/9ry6//a8uf/ss7D/tYGA32c+Pk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAvEhIHg01Njbp9fvrCn5//nI+P/4R7ev+fgID/2Jyd/9ybnP/ytrT/+b+8/+ewtf+Mld3/ZI36/5eI
zv/Ttrn/sNLc/6/Czv/stLT/8re0/++0sf/tsq//2qCe/6Rxb8phODg+AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABCIB8MeUZGbqRpata8gYH8x4mJ/9eTk//YkpP/04qL/+Cbmv/5wL3/9726/+Sw
t//Zrrn/56qY/+2smf/lr6n/nLWJ/4Gtdf/Pppn/3qGf/7yEg/KJWViYTyoqIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQh0dGXJAQGOXXl7NtnR1/8V7fP/MfH3/znt8/+il
o//0urj/7LCu/+Whg//rq13/35VX/9Kek/9yvXz/ZbNv/6iCdfqYY2O/aj4+TCUJCgcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACcamsBjFRVB4FERAh9PT0JjU1ND6VnZx+/hINF0JqZiNOjoty0iIf2hFBQw5lX
V8+wY2P4xXR0/+aioP/oq6j/2pqT/92fif/Vlor/yYqJ/7N8efiVZmPGdERFYkEfHxIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAALiFhgXFkJEdx5CQSMqSknbNlZWbz5uaws2cnOXBlJPnqH18r4dc
XFFULy8OSCUlFm07O0+FSUmeoV1d3sF9fPrGhoX/snZ295xkZNiFUlKbbD4+T0UdHxIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc0JDA5FgYRKdbm46onR0Zp9ycnuWampzhFlZVmY6
OikvDAwHAAAAAAAAAAAAAAAAAAAAAB0ODgRULCwhbjo7UXhERGVrPDxHTCYmGxAAAQMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//////////////////////D////gf///wH///4A///+AP///AD///wA///8AP//+AD
///gA//D4AH+AeAA+ADgAAAAwAAAAMAAAADAAAAB4AAAA+AAAAfgAAAP8AAAH/wAAD8AAAD/AAAD/wB4
D//H////////////////////KAAAABgAAAAwAAAAAQAgAAAAAABgCQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABMAAAAtAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAgIO1cwMM1qOjrsHhAQmwAA
ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAATCgogfUhI6ahgYP6lXV3+f0hI9wIBAT0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsGBgFPLy6kuW1t/sZv
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
</value>
</data>
</root>

View File

@ -1,172 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class AnalogBindControl
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.textBox1 = new System.Windows.Forms.TextBox();
this.labelButtonName = new System.Windows.Forms.Label();
this.trackBarSensitivity = new System.Windows.Forms.TrackBar();
this.labelSensitivity = new System.Windows.Forms.Label();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.buttonBind = new System.Windows.Forms.Button();
this.trackBarDeadzone = new System.Windows.Forms.TrackBar();
this.labelDeadzone = new System.Windows.Forms.Label();
this.buttonFlip = new System.Windows.Forms.Button();
this.buttonUnbind = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.trackBarSensitivity)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarDeadzone)).BeginInit();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(3, 3);
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;
//
// labelButtonName
//
this.labelButtonName.AutoSize = true;
this.labelButtonName.Location = new System.Drawing.Point(109, 6);
this.labelButtonName.Name = "labelButtonName";
this.labelButtonName.Size = new System.Drawing.Size(54, 13);
this.labelButtonName.TabIndex = 1;
this.labelButtonName.Text = "Bindname";
//
// trackBarSensitivity
//
this.trackBarSensitivity.LargeChange = 20;
this.trackBarSensitivity.Location = new System.Drawing.Point(267, 21);
this.trackBarSensitivity.Maximum = 20;
this.trackBarSensitivity.Minimum = -20;
this.trackBarSensitivity.Name = "trackBarSensitivity";
this.trackBarSensitivity.Size = new System.Drawing.Size(104, 45);
this.trackBarSensitivity.SmallChange = 10;
this.trackBarSensitivity.TabIndex = 2;
this.trackBarSensitivity.TickFrequency = 10;
this.trackBarSensitivity.ValueChanged += new System.EventHandler(this.trackBarSensitivity_ValueChanged);
//
// labelSensitivity
//
this.labelSensitivity.AutoSize = true;
this.labelSensitivity.Location = new System.Drawing.Point(166, 25);
this.labelSensitivity.Name = "labelSensitivity";
this.labelSensitivity.Size = new System.Drawing.Size(95, 13);
this.labelSensitivity.TabIndex = 3;
this.labelSensitivity.Text = "Sensitivity: 5 billion";
//
// timer1
//
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// buttonBind
//
this.buttonBind.Location = new System.Drawing.Point(3, 29);
this.buttonBind.Name = "buttonBind";
this.buttonBind.Size = new System.Drawing.Size(75, 23);
this.buttonBind.TabIndex = 4;
this.buttonBind.Text = "Bind!";
this.buttonBind.UseVisualStyleBackColor = true;
this.buttonBind.Click += new System.EventHandler(this.buttonBind_Click);
//
// trackBarDeadzone
//
this.trackBarDeadzone.Location = new System.Drawing.Point(267, 51);
this.trackBarDeadzone.Name = "trackBarDeadzone";
this.trackBarDeadzone.Size = new System.Drawing.Size(104, 45);
this.trackBarDeadzone.TabIndex = 5;
this.trackBarDeadzone.TickFrequency = 2;
this.trackBarDeadzone.ValueChanged += new System.EventHandler(this.trackBarDeadzone_ValueChanged);
//
// labelDeadzone
//
this.labelDeadzone.AutoSize = true;
this.labelDeadzone.Location = new System.Drawing.Point(166, 60);
this.labelDeadzone.Name = "labelDeadzone";
this.labelDeadzone.Size = new System.Drawing.Size(97, 13);
this.labelDeadzone.TabIndex = 6;
this.labelDeadzone.Text = "Deadzone: 5 billion";
//
// buttonFlip
//
this.buttonFlip.Location = new System.Drawing.Point(88, 29);
this.buttonFlip.Name = "buttonFlip";
this.buttonFlip.Size = new System.Drawing.Size(75, 23);
this.buttonFlip.TabIndex = 7;
this.buttonFlip.Text = "Flip Axis";
this.buttonFlip.UseVisualStyleBackColor = true;
this.buttonFlip.Click += new System.EventHandler(this.buttonFlip_Click);
//
// buttonUnbind
//
this.buttonUnbind.Location = new System.Drawing.Point(3, 58);
this.buttonUnbind.Name = "buttonUnbind";
this.buttonUnbind.Size = new System.Drawing.Size(75, 23);
this.buttonUnbind.TabIndex = 8;
this.buttonUnbind.Text = "Unbind!";
this.buttonUnbind.UseVisualStyleBackColor = true;
this.buttonUnbind.Click += new System.EventHandler(this.Unbind_Click);
//
// AnalogBindControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.buttonUnbind);
this.Controls.Add(this.buttonFlip);
this.Controls.Add(this.labelDeadzone);
this.Controls.Add(this.trackBarDeadzone);
this.Controls.Add(this.buttonBind);
this.Controls.Add(this.labelSensitivity);
this.Controls.Add(this.trackBarSensitivity);
this.Controls.Add(this.labelButtonName);
this.Controls.Add(this.textBox1);
this.Name = "AnalogBindControl";
this.Size = new System.Drawing.Size(378, 99);
((System.ComponentModel.ISupportInitialize)(this.trackBarSensitivity)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.trackBarDeadzone)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label labelButtonName;
private System.Windows.Forms.TrackBar trackBarSensitivity;
private System.Windows.Forms.Label labelSensitivity;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Button buttonBind;
private System.Windows.Forms.TrackBar trackBarDeadzone;
private System.Windows.Forms.Label labelDeadzone;
private System.Windows.Forms.Button buttonFlip;
private System.Windows.Forms.Button buttonUnbind;
}
}

View File

@ -1,93 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
public partial class AnalogBindControl : UserControl
{
private AnalogBindControl()
{
InitializeComponent();
}
public string ButtonName;
public Config.AnalogBind Bind;
bool listening = false;
public AnalogBindControl(string ButtonName, Config.AnalogBind Bind)
: this()
{
this.Bind = Bind;
this.ButtonName = ButtonName;
labelButtonName.Text = ButtonName;
trackBarSensitivity.Value = (int)(Bind.Mult * 10.0f);
trackBarDeadzone.Value = (int)(Bind.Deadzone * 20.0f);
trackBarSensitivity_ValueChanged(null, null);
trackBarDeadzone_ValueChanged(null, null);
textBox1.Text = Bind.Value;
}
private void timer1_Tick(object sender, EventArgs e)
{
string bindval = Input.Instance.GetNextFloatEvent();
if (bindval != null)
{
timer1.Stop();
listening = false;
Bind.Value = bindval;
textBox1.Text = Bind.Value;
buttonBind.Text = "Bind!";
Input.Instance.StopListeningForFloatEvents();
}
}
private void buttonBind_Click(object sender, EventArgs e)
{
if (listening)
{
timer1.Stop();
listening = false;
buttonBind.Text = "Bind!";
Input.Instance.StopListeningForFloatEvents();
}
else
{
Input.Instance.StartListeningForFloatEvents();
listening = true;
buttonBind.Text = "Cancel!";
timer1.Start();
}
}
private void trackBarSensitivity_ValueChanged(object sender, EventArgs e)
{
Bind.Mult = trackBarSensitivity.Value / 10.0f;
labelSensitivity.Text = String.Format("Sensitivity: {0}", (Bind.Mult*100)) + "%";
}
private void trackBarDeadzone_ValueChanged(object sender, EventArgs e)
{
Bind.Deadzone = trackBarDeadzone.Value / 20.0f;
labelDeadzone.Text = String.Format("Deadzone: {0}", (Bind.Deadzone*100)) + "%";
}
private void buttonFlip_Click(object sender, EventArgs e)
{
trackBarSensitivity.Value *= -1;
}
public void Unbind_Click(object sender, EventArgs e)
{
Bind.Value = "";
textBox1.Text = "";
}
}
}

View File

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

View File

@ -1,53 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
class AnalogBindPanel : UserControl
{
Dictionary<string, Config.AnalogBind> RealConfigObject;
public AnalogBindPanel(Dictionary<string, Config.AnalogBind> RealConfigObject, List<string> RealConfigButtons = null)
:base()
{
this.RealConfigObject = RealConfigObject;
LoadSettings(RealConfigButtons ?? (IEnumerable<string>)RealConfigObject.Keys);
}
void LoadSettings(IEnumerable<string> ButtonList)
{
SuspendLayout();
int x = 4;
int y = 4;
foreach (string ButtonName in ButtonList)
{
var ctrl = new AnalogBindControl(ButtonName, RealConfigObject[ButtonName]);
ctrl.Location = new Point(x, y);
y += ctrl.Height + 4;
Controls.Add(ctrl);
}
ResumeLayout();
}
/// <summary>
/// save to config
/// </summary>
/// <param name="SaveConfigObject">if non-null, save to possibly different config object than originally initialized from</param>
public void Save(Dictionary<string, Config.AnalogBind> SaveConfigObject = null)
{
var saveto = SaveConfigObject ?? RealConfigObject;
foreach (Control c in Controls)
{
var abc = (AnalogBindControl)c;
saveto[abc.ButtonName] = abc.Bind;
}
}
}
}

View File

@ -1,69 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class ControllerConfigPanel
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.contextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// contextMenuStrip1
//
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.clearToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(153, 48);
//
// clearToolStripMenuItem
//
this.clearToolStripMenuItem.Name = "clearToolStripMenuItem";
this.clearToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.clearToolStripMenuItem.Text = "&Clear";
this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click);
//
// ControllerConfigPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ContextMenuStrip = this.contextMenuStrip1;
this.Name = "ControllerConfigPanel";
this.Size = new System.Drawing.Size(203, 292);
this.Load += new System.EventHandler(this.ControllerConfigPanel_Load);
this.contextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem;
}
}

View File

@ -1,153 +0,0 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
// this is a little messy right now because of remnants of the old config system
public partial class ControllerConfigPanel : UserControl
{
// the dictionary that results are saved to
Dictionary<string, string> RealConfigObject;
// if nonnull, the list of keys to use. used to have the config panel operate on a smaller list than the whole dictionary;
// for instance, to show only a single player
List<string> RealConfigButtons;
public List<string> buttons = new List<string>();
public int InputMarginLeft = UIHelper.ScaleX(0);
public int LabelPadding = UIHelper.ScaleX(5);
public int MarginTop = UIHelper.ScaleY(0);
public int Spacing = UIHelper.ScaleY(24);
public int InputSize = UIHelper.ScaleX(170);
public int ColumnWidth = UIHelper.ScaleX(280);
public int LabelWidth = UIHelper.ScaleX(60);
public ToolTip Tooltip;
protected List<InputCompositeWidget> Inputs = new List<InputCompositeWidget>();
protected List<Label> Labels = new List<Label>();
private Size _panelSize = new Size(0, 0);
public ControllerConfigPanel()
{
InitializeComponent();
}
private void ControllerConfigPanel_Load(object sender, EventArgs e)
{
}
public void ClearAll()
{
Inputs.ForEach(x => x.Clear());
}
/// <summary>
/// save to config
/// </summary>
/// <param name="SaveConfigObject">if non-null, save to possibly different config object than originally initialized from</param>
public void Save(Dictionary<string, string>SaveConfigObject = null)
{
var saveto = SaveConfigObject ?? RealConfigObject;
for (int button = 0; button < buttons.Count; button++)
saveto[buttons[button]] = Inputs[button].Bindings;
}
public bool Autotab = false;
public void LoadSettings(Dictionary<string, string> configobj, bool autotab, List<string> configbuttons = null, int? width = null, int? height = null)
{
Autotab = autotab;
if (width.HasValue && height.HasValue)
{
_panelSize = new Size(width.Value, height.Value);
}
else
{
_panelSize = Size;
}
RealConfigObject = configobj;
RealConfigButtons = configbuttons;
SetButtonList();
Startup();
SetWidgetStrings();
}
protected void SetButtonList()
{
buttons.Clear();
IEnumerable<string> bl = RealConfigButtons ?? (IEnumerable<string>)RealConfigObject.Keys;
foreach (string s in bl)
buttons.Add(s);
}
protected void SetWidgetStrings()
{
for (int button = 0; button < buttons.Count; button++)
{
string s;
if (!RealConfigObject.TryGetValue(buttons[button], out s))
s = "";
Inputs[button].Bindings = s;
}
}
protected void Startup()
{
int x = InputMarginLeft;
int y = MarginTop - Spacing;
for (int i = 0; i < buttons.Count; i++)
{
y += Spacing;
if (y > (_panelSize.Height - UIHelper.ScaleY(62)))
{
y = MarginTop;
x += ColumnWidth;
}
InputCompositeWidget iw = new InputCompositeWidget
{
Location = new Point(x, y),
Size = new Size(InputSize, UIHelper.ScaleY(23)),
TabIndex = i,
AutoTab = this.Autotab
};
iw.SetupTooltip(Tooltip, null);
iw.BringToFront();
Controls.Add(iw);
Inputs.Add(iw);
Label label = new Label
{
Location = new Point(x + InputSize + LabelPadding, y + UIHelper.ScaleY(3)),
Size = new Size(UIHelper.ScaleX(100), UIHelper.ScaleY(15)),
Text = buttons[i].Replace('_', ' ').Trim(),
};
//Tooltip.SetToolTip(label, null); //??? not supported yet
Controls.Add(label);
Labels.Add(label);
}
}
public void SetAutoTab(bool value)
{
Inputs.ForEach(x => x.AutoTab = value);
}
private void clearToolStripMenuItem_Click(object sender, EventArgs e)
{
ClearAll();
}
}
}

View File

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

View File

@ -1,213 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class HotkeyConfig
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HotkeyConfig));
this.label38 = new System.Windows.Forms.Label();
this.AutoTabCheckBox = new System.Windows.Forms.CheckBox();
this.HotkeyTabControl = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.IDB_CANCEL = new System.Windows.Forms.Button();
this.IDB_SAVE = new System.Windows.Forms.Button();
this.RestoreDefaults = new System.Windows.Forms.Button();
this.SearchBox = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.HotkeyTabControl.SuspendLayout();
this.SuspendLayout();
//
// label38
//
this.label38.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label38.AutoSize = true;
this.label38.Location = new System.Drawing.Point(39, 441);
this.label38.Name = "label38";
this.label38.Size = new System.Drawing.Size(153, 13);
this.label38.TabIndex = 4;
this.label38.Text = "* Escape clears a key mapping";
//
// AutoTabCheckBox
//
this.AutoTabCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.AutoTabCheckBox.AutoSize = true;
this.AutoTabCheckBox.Location = new System.Drawing.Point(453, 440);
this.AutoTabCheckBox.Name = "AutoTabCheckBox";
this.AutoTabCheckBox.Size = new System.Drawing.Size(70, 17);
this.AutoTabCheckBox.TabIndex = 101;
this.AutoTabCheckBox.Text = "Auto Tab";
this.AutoTabCheckBox.UseVisualStyleBackColor = true;
this.AutoTabCheckBox.CheckedChanged += new System.EventHandler(this.AutoTabCheckBox_CheckedChanged);
//
// HotkeyTabControl
//
this.HotkeyTabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.HotkeyTabControl.Controls.Add(this.tabPage1);
this.HotkeyTabControl.Location = new System.Drawing.Point(12, 28);
this.HotkeyTabControl.Name = "HotkeyTabControl";
this.HotkeyTabControl.SelectedIndex = 0;
this.HotkeyTabControl.Size = new System.Drawing.Size(729, 396);
this.HotkeyTabControl.TabIndex = 102;
this.HotkeyTabControl.SelectedIndexChanged += new System.EventHandler(this.HotkeyTabControl_SelectedIndexChanged);
//
// tabPage1
//
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(721, 370);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "For designer";
this.tabPage1.UseVisualStyleBackColor = true;
//
// IDB_CANCEL
//
this.IDB_CANCEL.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.IDB_CANCEL.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.IDB_CANCEL.Location = new System.Drawing.Point(681, 436);
this.IDB_CANCEL.Name = "IDB_CANCEL";
this.IDB_CANCEL.Size = new System.Drawing.Size(60, 22);
this.IDB_CANCEL.TabIndex = 103;
this.IDB_CANCEL.TabStop = false;
this.IDB_CANCEL.Text = "&Cancel";
this.IDB_CANCEL.UseVisualStyleBackColor = true;
this.IDB_CANCEL.Click += new System.EventHandler(this.IDB_CANCEL_Click);
//
// IDB_SAVE
//
this.IDB_SAVE.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.IDB_SAVE.Location = new System.Drawing.Point(615, 436);
this.IDB_SAVE.Name = "IDB_SAVE";
this.IDB_SAVE.Size = new System.Drawing.Size(60, 22);
this.IDB_SAVE.TabIndex = 104;
this.IDB_SAVE.TabStop = false;
this.IDB_SAVE.Text = "&Save";
this.IDB_SAVE.UseVisualStyleBackColor = true;
this.IDB_SAVE.Click += new System.EventHandler(this.IDB_SAVE_Click);
//
// RestoreDefaults
//
this.RestoreDefaults.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.RestoreDefaults.Location = new System.Drawing.Point(529, 436);
this.RestoreDefaults.Name = "RestoreDefaults";
this.RestoreDefaults.Size = new System.Drawing.Size(60, 22);
this.RestoreDefaults.TabIndex = 105;
this.RestoreDefaults.TabStop = false;
this.RestoreDefaults.Text = "&Defaults";
this.toolTip1.SetToolTip(this.RestoreDefaults, "Reses _all_ bindings to default.");
this.RestoreDefaults.UseVisualStyleBackColor = true;
this.RestoreDefaults.Click += new System.EventHandler(this.RestoreDefaults_Click);
//
// SearchBox
//
this.SearchBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.SearchBox.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.SearchBox.Location = new System.Drawing.Point(592, 9);
this.SearchBox.Name = "SearchBox";
this.SearchBox.Size = new System.Drawing.Size(149, 20);
this.SearchBox.TabIndex = 106;
this.SearchBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SearchBox_KeyDown);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(556, 12);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(30, 13);
this.label1.TabIndex = 107;
this.label1.Text = "Find:";
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(194, 441);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(168, 13);
this.label2.TabIndex = 108;
this.label2.Text = "* Disable Auto Tab to multiply bind";
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(9, 441);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(30, 13);
this.label3.TabIndex = 109;
this.label3.Text = "Tips:";
//
// HotkeyConfig
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.IDB_CANCEL;
this.ClientSize = new System.Drawing.Size(753, 463);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.SearchBox);
this.Controls.Add(this.RestoreDefaults);
this.Controls.Add(this.IDB_SAVE);
this.Controls.Add(this.IDB_CANCEL);
this.Controls.Add(this.HotkeyTabControl);
this.Controls.Add(this.AutoTabCheckBox);
this.Controls.Add(this.label38);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "HotkeyConfig";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Configure Hotkeys";
this.Load += new System.EventHandler(this.NewHotkeyWindow_Load);
this.HotkeyTabControl.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label38;
private System.Windows.Forms.CheckBox AutoTabCheckBox;
private System.Windows.Forms.TabControl HotkeyTabControl;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.Button IDB_CANCEL;
private System.Windows.Forms.Button IDB_SAVE;
private System.Windows.Forms.Button RestoreDefaults;
private System.Windows.Forms.TextBox SearchBox;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ToolTip toolTip1;
}
}

View File

@ -1,217 +0,0 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
public partial class HotkeyConfig : Form
{
public HotkeyConfig()
{
InitializeComponent();
Closing += (o, e) =>
{
IDB_SAVE.Focus(); // A very dirty hack to avoid https://code.google.com/p/bizhawk/issues/detail?id=161
};
tabPage1.Focus();
}
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, true);
}
protected override void OnDeactivate(EventArgs e)
{
base.OnDeactivate(e);
Input.Instance.ControlInputFocus(this, Input.InputFocus.Mouse, false);
}
private void NewHotkeyWindow_Load(object sender, EventArgs e)
{
var source = new AutoCompleteStringCollection();
source.AddRange(Global.Config.HotkeyBindings.Select(x => x.DisplayName).ToArray());
SearchBox.AutoCompleteCustomSource = source;
SearchBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoTabCheckBox.Checked = Global.Config.HotkeyConfigAutoTab;
DoTabs();
DoFocus();
}
private void IDB_CANCEL_Click(object sender, EventArgs e)
{
GlobalWin.MainForm.AddMessage("Hotkey config aborted");
Close();
}
private void IDB_SAVE_Click(object sender, EventArgs e)
{
Save();
GlobalWin.MainForm.AddMessage("Hotkey settings saved");
DialogResult = DialogResult.OK;
Close();
}
private void RestoreDefaults_Click(object sender, EventArgs e)
{
Defaults();
}
private void AutoTabCheckBox_CheckedChanged(object sender, EventArgs e)
{
SetAutoTab();
}
private void Save()
{
Global.Config.HotkeyConfigAutoTab = AutoTabCheckBox.Checked;
foreach (var w in InputWidgets)
{
var b = Global.Config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == w.WidgetName);
b.Bindings = w.Bindings;
}
}
private IEnumerable<InputCompositeWidget> InputWidgets
{
get
{
var widgets = new List<InputCompositeWidget>();
for (var x = 0; x < HotkeyTabControl.TabPages.Count; x++)
{
for (var y = 0; y < HotkeyTabControl.TabPages[x].Controls.Count; y++)
{
if (HotkeyTabControl.TabPages[x].Controls[y] is InputCompositeWidget)
{
widgets.Add(HotkeyTabControl.TabPages[x].Controls[y] as InputCompositeWidget);
}
}
}
return widgets;
}
}
private void DoTabs()
{
HotkeyTabControl.TabPages.Clear();
//Buckets
var Tabs = Global.Config.HotkeyBindings.Select(x => x.TabGroup).Distinct().ToList();
foreach (var tab in Tabs)
{
var _y = UIHelper.ScaleY(14);
var _x = UIHelper.ScaleX(6);
var tb = new TabPage {Name = tab, Text = tab};
var bindings = Global.Config.HotkeyBindings.Where(x => x.TabGroup == tab).OrderBy(x => x.Ordinal).ThenBy(x => x.DisplayName).ToList();
int iwOffsetX = UIHelper.ScaleX(110);
int iwOffsetY = UIHelper.ScaleY(-4);
int iwWidth = UIHelper.ScaleX(120);
foreach (var b in bindings)
{
var l = new Label
{
Text = b.DisplayName,
Location = new Point(_x, _y),
Size = new Size(iwOffsetX - UIHelper.ScaleX(2), UIHelper.ScaleY(15)),
};
var w = new InputCompositeWidget
{
Location = new Point(_x + iwOffsetX, _y + iwOffsetY),
AutoTab = AutoTabCheckBox.Checked,
Width = iwWidth,
WidgetName = b.DisplayName,
};
w.SetupTooltip(toolTip1, b.ToolTip);
toolTip1.SetToolTip(l, b.ToolTip);
w.Bindings = b.Bindings;
tb.Controls.Add(l);
tb.Controls.Add(w);
_y += UIHelper.ScaleY(24);
if (_y > HotkeyTabControl.Height - UIHelper.ScaleY(35))
{
_x += iwOffsetX + iwWidth + UIHelper.ScaleX(10);
_y = UIHelper.ScaleY(14);
}
}
HotkeyTabControl.TabPages.Add(tb);
}
}
private void Defaults()
{
foreach (var w in InputWidgets)
{
var b = Global.Config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == w.WidgetName);
if (b != null) w.Bindings = b.DefaultBinding;
}
}
private void SetAutoTab()
{
foreach (var w in InputWidgets)
{
w.AutoTab = AutoTabCheckBox.Checked;
}
}
private void HotkeyTabControl_SelectedIndexChanged(object sender, EventArgs e)
{
DoFocus();
}
private void DoFocus()
{
if (HotkeyTabControl.SelectedTab != null)
{
foreach (var c in HotkeyTabControl.SelectedTab.Controls.OfType<InputWidget>())
{
c.Focus();
return;
}
}
}
private void SearchBox_KeyDown(object sender, KeyEventArgs e)
{
//Tab or Enter
if (!e.Control && !e.Alt && !e.Shift &&
(e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab))
{
var b = Global.Config.HotkeyBindings.FirstOrDefault(x => x.DisplayName == SearchBox.Text);
//Found
if (b != null)
{
var w = InputWidgets.FirstOrDefault(x => x.WidgetName == b.DisplayName);
if (w != null)
{
HotkeyTabControl.SelectTab((w.Parent as TabPage));
w.Focus();
}
}
e.Handled = true;
}
}
}
}

View File

@ -1,872 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAsAMDAQAAAABABoBgAAtgAAACAgEAAAAAQA6AIAAB4HAAAQEBAAAAAEACgBAAAGCgAAMDAAAAAA
CACoDgAALgsAACAgAAAAAAgAqAgAANYZAAAQEAAAAAAIAGgFAAB+IgAAQEAAAAAAIAAoQgAA5icAADAw
AAAAACAAqCUAAA5qAAAgIAAAAAAgAKgQAAC2jwAAGBgAAAAAIACICQAAXqAAABAQAAAAACAAaAQAAOap
AAAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA
AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHd3d3d3gIk5uTm5
OAh3d3d3d4AAAAAAd3eHeHd3c5t5d5iXmTd3h3h3h3cAAAAAeIeIh4iIeXiIiIiIh5iIeIeIeHcAAAAA
d4+IiIiIiYiIiIiIiJuIiI+IiIcAAAAAePiPj/j4ibj4/4/4+JiPj4+Pj4cAAAAAeI+PiPj4iYj4j4j4
iJiPj4+PiIcAAAAAePiI+IiPiYiIiPiPiLeIiIiI+IcAAAAAf4eId/iIiYiHeIiIiJiId3j4iIcAAAAA
eIhneIiIibiId4iIiJuHeHeIiPcAAAAAf4h3d4iIiYiHeIiIiJiHeHeIiIcAAAAAf3h3eHh4i4h3d4eI
iLiHd3eHiIgAAAAAf4d3d4eIiYh3d3h3iJh3d3h4eIcAAAAAf4h4eIeIibiHh4h4iJiIh4eHiPcAAAAA
h4+PiIiIg5l5uXmJuZuZuPj4+HgAAAAAAHd3d4eHeHuXm5uTl7l7mXd4dwAAAAAAAAAAeHh4h4eIeXiI
iHiHibAAAAAAAAAAAAAIeIiIiIiIm4iIiIiIh5AAAAAAAAAAAAAIePj4+P+IeYj4/4/495AAAAAAAAAA
AAAIiIj4+I+Pm4+PiPiPiJAAAAAAAAAAAAAIf4iIiIj4iYiHiI+I85AAAAAAAAAAAAAIiIh3d4iIefh3
iIiIiJAAAAAAAAAAAAAIiIh3d3iIuYh3eIiIiJAAAAAAAAAAAAAIiId3Z3iIifh3iIiIiJAAAAAAAAAA
AAAIiId3d3iIk/d3d4iIi5AAAAAAAAAAAAAIiId4eHd4ifd3eHd3iJAAAAAAAAAAAAAIj3h3h4ePiYiH
h4eIibAAAAAAAAAAAAAAeI+Pj4+IebmHd3d5iYAAAAAAAAAAAAAAB3d3d3d3AIm5m5m5uAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAP///////wAA+ABAAgAfAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAA
AAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAP
AADwAAAAAA8AAPwAAAAAPwAA/8AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+A
AAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP/AAAAH/wAA/+ADAA//
AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
/////wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH
d3d3d5OXk5N3d3d3cAAAB4iIiImIiIiImIiIiHAAAIiPiPiDj4/4+Jj4+I94AACIiPj4+Yj4j4i4j4+I
iAAAiIiHiIuIeIiIn3eIj4gAAIiHeIiJiHeIiJh4eIiIAACIh3eIh4d4iIi4d3h4iAAAiId4d4mId3eI
mHd4eIgAAAf4iIj3uYt3uTh4iIiAAAAAAHeHd3eZmJibmYAAAAAAAACIiIiIi4iIiPewAAAAAAAAeI+P
+ImPj/j3cAAAAAAAAIiIiI+J+IiI+JAAAAAAAACIh4eIiYd4iIiwAAAAAAAAf4d3eIuHeIiIkAAAAAAA
AIiHd3iJh3h4iIAAAAAAAACIh3h3+Yh4d4eQAAAAAAAAB4iIiIebeYm5AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////
////////4AAAB+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPgAAAH/AAAf/wAAH/8AAB//AAAf/wA
AH/8AAB//AAAf/wAAH/+AAD//////////////////////////////////////ygAAAAQAAAAIAAAAAEA
BAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDA
wAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiIh7iI
iAAIiIeIiJiIgAiIiIiIiIiACHeHh4iYeIAIiIe3eLeIgAAHiHmJh4AAAAiI94+IAAAACHeHh4gAAAAI
h3eIeAAAAACI8ImLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAA//8AAP//AADAAwAAgAEAAIAB
AACAAQAAgAEAAOAHAADgDwAA4A8AAOAPAADxDwAA//8AAP//AAD//wAAKAAAADAAAABgAAAAAQAIAAAA
AAAACQAAAAAAAAAAAAAAAQAAAAEAAAAAAABsaGUAb2toAHBsaQBybmwAdXFuAHZzcAB5dXIAenZ0AH14
dgB+enkAf3x5AIB7egCBfXoAgn58AISAfgAqW7oAPGa5AHp8gwB3f48AK2HMADtt1gA8btcAMGnbADxv
2AA8cNgAEljhABFY5wAcXuUAElrrABNb7AABUPYABFP0AABR+AALWfgAFV73ABxg6AAYYPcAHWP3ABxk
9wAYYfgAJmPgACdk4QAhYuQAKWXhACFn9gAkaPMAI2n3AClr8gAobfkALnH4ADl18gA6d/QAOnjzADR1
+ABVecAAU3jEAFV+zwBHdNMAQnXZAEd32gBMfN8ATn/hAG+KvwBdgsUAX4bUAGOGygBmicwAb47NAGaN
2wBvk9UAaZDeAHqX1gB0mNsAeJveAFGC5ABUhecAV4fqAFqL7QBGgfYATon5AFaI8ABTiPYAWIryAFKJ
+ABtlOIAcZfmAHqe4AB1m+kAeZ/tAGCQ8QBxm/EAfKDjAH+j5gBzofYAeqLyAH2l+ACDgYIAhoKAAIiE
ggCKhoQAi4iFAIyJhgCOiogAj4yJAIyLjACOjIwAkIuJAJCMigCRjowAk5COAJSQjgCWkpAAmJORAJiU
kgCalpQAm5iWAJyYlgCQlJ4AlZacAJmYmQCempgAn5yaAJybngCgm5oAoJyaAKKdnACkn50ApKCeAImS
qQCTm6kAhJS3AIibuwCjn6AAoqKiAKaioACnpKIAoqCkAKWlpQCoo6EAqKSiAKqlpACqqKYArKimAKOm
qwClpqkAoqWsAKmpqgCtqqgArqyqAKiprQCwrKoAsa6tALKwrgC1sa8ArrC0ALSxsAC1tLUAuLSyALm1
tAC8ubcAvbq5AL+8uwC/vbwAwL27AMG+vQDDwb8AgJ3bAJChxACaq8oAmKjMAIOh3wCcrdAAn7HUAKGy
0QCltdQAp7jXAKO12ACqu9oAqLndAK6/3QCHpeMAjKnnAIGl6QCGqu4AkK3rAJSx7wCDqfIAlbP0AJK0
9ACsveEAscHgALLD5wC2x+YAqMT3AKzG9QDDwcAAxMLAAMbEwwDGxcQAycbFAMvIxwDFxcgAzMrJAM7M
ygDPzcwA0M7NANLQzwDNztIAzM/XANLR0ADU0tEA1tTTANPT1QDW1dQA2NbUANnY1gDa2dgA3NrZAN7c
2wDe3dwA4t/eAOLg3gDP2e4A4+LhAOTi4gDm5OMA6OblAOzq6gDw7u4A8/PyAPTz8gAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI5iYmJiYmJiYmJhlgBbLSUoKCUoKCUoJVIAlmFh
YmJiYmJiYmKOAAAAAAAAAAAAbw5zc3Nzc3JzcnJvChQhLBkYFhYWFhYWFyEaEnNzc3Nzc3Fxb28ObwAA
AAAAAAAAB42NjY2NjY2Nh4d/gSE7lpaWlpaWjpGHh0AhP42NjY2NjY2Nh39/BwAAAAAAAAAADpjG1tjY
2NjW2NakgyFExtbX19fY2NjWyoQhQ8bW2NjY2NTW1qaNCgAAAAAAAAAAYqTa2tra19rX2traqCFI19ra
2tfa2tra2qkhRtra2trX19vX2tqfDgAAAAAAAAAAY8na2tra2tva2traqR+n2tra29va2tra2q4hSdra
2tra29va2trGYgAAAAAAAAAAY87YzM7Yzs7Y2NjYrB+r2M6kydjY2NjY2K4hStjMpMnW2NjY2NjJYgAA
AAAAAAAAZ9bJb23MDn/JyczMrCG1zHNiBYfJycnMzLAhV8xzBwcOpMnJycnMYwAAAAAAAAAAZ9qkjgEF
ApikpKTJsSG2xqScDmempqakxrIhXMZvbaQObaSmpqbWZgAAAAAAAAAAb96fmAVtB5yfn5+fsiG5oX8E
Do6fn5+fn7IhXaBnY59mYZ+fn5/XbQAAAAAAAAAAb+OOjg4EY5aXjo6aviG6mmEJc4eOjo6OmL8ht5hm
DnMEbY6OjpfbbQAAAAAAAAAAcuWNf20Kc39/f3+NwCG8lnkOB3F/f39/jcEhuI5tCQlmf39/f3/kbQAA
AAAAAAAAYubOjY2Hh4eHh43W3yFS0Y6NjYeHjX+Nxl4hwtCJh4eHh4eHjc7kDgAAAAAAAAAAf23Y2tra
2trSzM7MZxAhMTMzMzMzMzMzMiEhLjIxM7za2tra2tZtfwAAAAAAAAAAAAB6enlmBGJycm9ycm04KRwc
GiEhJCQkKywsKykpHiERdnp6enoAAAAAAAAAAAAAAAAAAAAAYo2HjYeHh4eHiXp7OCFCkZGRkZGHjoeH
gisoAAAAAAAAAAAAAAAAAAAAAAAAAACWc5jJ0tbWztbO0syYOiGcytbW1tbW1tHMnDkhAAAAAAAAAAAA
AAAAAAAAAAAAAACOh8nX2tfa2tra2trOPCHG2trZ2dnZ2tra1kEhAAAAAAAAAAAAAAAAAAAAAAAAAACY
h8za2tra2tra2trYPSHW2tra2tra2tra2kUhAAAAAAAAAAAAAAAAAAAAAAAAAACYjtbY1oehpH/Y2NjW
Ph/W1od6eszY2NjY2EchAAAAAAAAAAAAAAAAAAAAAAAAAACamNLMoQJtcgGhzMzOSx/WyQZ5jcbMzMzM
zlUhAAAAAAAAAAAAAAAAAAAAAAAAAACanNamhwoKCgd6xqbJSyHYoQZjcqHGpsamyVYhAAAAAAAAAAAA
AAAAAAAAAAAAAACcodafY20HBG0On5/GTR/YmgVyepyfn5+fpFghAAAAAAAAAAAAAAAAAAAAAAAAAACc
xtaOB29iBXoEjZakTSHajQUHDo2Wl5aXn1khAAAAAAAAAAAAAAAAAAAAAAAAAACaxth/c39zc39zf3+g
WiHah3Nycn9/f39/ml8hAAAAAAAAAAAAAAAAAAAAAAAAAAChmOaYc3l5eXlzf3/buyHCn3pzf3N5eXl/
1k8jAAAAAAAAAAAAAAAAAAAAAAAAAAAADsbj4eHh4eHh2+PYEx4iUlFRUVFSTVFRNiFgAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAHNmZ2dnZ2dnZ2dnAABPKCUoKCUlKCgoLmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AAPgAQAIAHwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAA
AAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAADwAA8AAAAAAP
AAD8AAAAAD8AAP/AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+A
AAAH/wAA/4AAAAf/AAD/gAAAB/8AAP+AAAAH/wAA/4AAAAf/AAD/wAAAB/8AAP/gAwAP/wAA////////
AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP//
/////wAA////////AAAoAAAAIAAAAEAAAAABAAgAAAAAAAAEAAAAAAAAAAAAAAABAAAAAQAAAAAAAG5q
ZwB2cnAAeHRyAHt3dAB9eXcAf3t4AIF9ewCCfnwAhIB+AEJqugAOWe8AEVrtAAVT8AAAUfcABFT2AAlW
8gAIVvQAClj1AA9d9wAAUfgAC1n4ABNd9AAVYPgAI2LjACdk4QAnZeQAKGTiACBi6QAiZOwAJGbuACdp
8AApa/MAJGv5AC5w9QAxc/cAOXbzADl29QBFcc0ATHbMAFR4wQBQeMwARnXTAEd11ABUfdMAZoG4AGSA
vAB9krgAVYDcAGqJxQBihMoAbozIAGGI2wBOhPMAT4b2AFGG9QBWifIAWY33AGaN4QBpkeUAa5n2AIaC
gACIhIIAioaEAIyHhQCMiIUAjoqIAJCMigCSjowAl5ORAJiUkgCalpQAm5iWAJyZlwCempkAn5yaAKCc
mgChnpwApaGgAKakogClpKcAqKOiAKikogCppqQArKemAKqopQCsqKcArqqoALCsqgCxrq0AsrCuAKmu
twCysbEAtbKxALa1tQC4tLIAuLW0ALq4twC8ubcAubi4AL26uQC+vLsAvLy8AMC9uwDAvbwAwsC+AIeh
1ACKptsAjqfbAI+o3ACVqdIAkardAJ+y2wCrtssAu77HALK8zwCgs9wAs77RALC+2ACEp+8An7XlAL7B
ygC1wNMAtsDUAL7I3QDCwcAAxcLBAMbEwgDFxMQAycbFAMrIxgDBxc4AzMnIAM7MywDPzcwA0M7MANLQ
zwDEx9EA09HQANTS0ADW1NMA2NbVANvY1wDa2dkA3NrZAN7c2wDf3t0A7OvqAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEFBQUFBPz4uEBsbGxsY
GBAoP0FBQUE/PwgAAAAAAABNWWBgYGBgTxgzYGZgZmBgLwtVYGBgYGBTRwAAAAAAWVmOjo6Ojo6FHW6O
jo6Ojo5xEIeOjo6Ojo5VWQAAAABaZo6OjpGOjo0dcI6OkZGRjnoTjY6OkY6OjmJaAAAAAGCAhUmAS4yM
hx10YERPhYuLehONR0RPjYuMZmAAAAAAYIVmBQRLaGaBIXRmRz5pZmZ1E4E+YgZgZmaBYAAAAABgjVlE
A1NZWWghdEcIT1lZWXMTaQhLBFNZWYdgAAAAAGCOT0k/TU1NgCF4TT9ETU1NdROARD9ETU1TjV4AAAAA
AEuOhYWFgICMCiE7NDQ0NDojFjwwa4eFhY1JAAAAAAAAAAAARD9HR0dHLiYmDxgmKikpKScMMgAAAAAA
AAAAAAAAAABNWWiAgYCAaE8PW4CAgICAZjE4AAAAAAAAAAAAAAAAAE2Ajo6Ojo6OgA+LjpGOjo6OajUA
AAAAAAAAAAAAAAAAT4WOaYdgjo6JD42AYICOjo5vNQAAAAAAAAAAAAAAAABPjYUIRwFmhYMPjURNZoWF
hW81AAAAAAAAAAAAAAAAAFWNYAgECElmeQ+FPj9ZZmZgbzUAAAAAAAAAAAAAAAAAVY5LQQhHP1NmD4U/
CUlTU1NvNQAAAAAAAAAAAAAAAABPk1NLTUlLTZEPfE1LS0tJU3c5AAAAAAAAAAAAAAAAAABJaWiAaICA
TykXJCQkJCQkEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD/////////////////////////////////////4AAAB+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPgAAAH/AAAf/wAAH/8AAB//AAAf/wAAH/8AAB//AAAf/wAAH/+AAD/////////////////////////
/////////////ygAAAAQAAAAIAAAAAEACAAAAAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAgX17ADtu
1wB4ibEAfo6xAGGFzwBujM4Ad5PMAGWK1gBpj9wAc5PXAHqX0wB2ltkAe5veAF+K4gBVhekAYIriAGaP
5ABvleMAapbvAHOc7wBvmvAAdJ71AHeg9QB5ovcAjouIAJKOjACXkpAAmJWSAJ2YlwCempgAop+dAKah
nwCBkrsApqOhAKilowCqp6UAr6uqAK+sqwCwrKsAsa6tALKwrgC0sK4Arq2xALOxsQC0sbAAt7W0ALi0
swC5trUAuri2ALy5twC+u7oAv728AMC+vACMnMIAgZrPAImeyQCbqMYApa3BAK61wwClscoAqrXOAK+4
ygC1uMIAtLzQALO/2ACjtuAAxcLBAMbEwwDJxsUAycjIAMzKyQDPzcwA0c/OAMXK0wDV09IA1tTSANzZ
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLS0+FBMTFT0tLS0AAAAk
RUVFBjxGRjsIRUVDJAAALUNDTA1AMkxKEi5GTCYAADIeGS4MOhouPwkcHC4tAAA0Mi0tNwoDIQsPAy4y
NAAAAAAcJic2Agc4OAVCAAAAAAAAJ0xGTRBJRk1BAAAAAAAAADIfAS4QJyRDPQAAAAAAAAA1HRwdECsb
HzkAAAAAAAAAAEZGSQAXFhYXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAP//AAD//wAA//8AAMADAACAAQAAgAEAAIABAACAAQAA4AcAAOAPAADgDwAA4A8AAPEP
AAD//wAA//8AAP//AAAoAAAAQAAAAIAAAAABACAAAAAAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUfgDAFH4AwBR
+AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1pZgxsaGVKbGhle2xo
ZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlfmxoZVtuaWUWAEv/AQBR
+C0AUfh1AFH4lgBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiYAFH4ggBR
+EEAUPwHcGphFmxoZVtsaGV+bGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxoZYBsaGWAbGhlgGxo
ZYBsaGV7bGhlSm1pZgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1p
ZhRsaGWWb2to8Xh0cv98eHX/fHh1/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3p1
c/9xbWv4bGlmtxxY0HkAUfnaAFD5/gBP+f8AT/r/AE/6/wBP+v8AT/r/AE/6/wBP+v8AT/r/AFD6/wBQ
+v8AUPr/AFD6/wBQ+f8AUfnrDFTllmZnbblybmr4enZz/3x4df98eHX/fHh1/3x4df98eHX/fHh1/3x4
df98eHX/fHh1/3x4df98eHX/eHRx/29raPFsaGWWbWlmFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG1pZgFsaGV6cm5r+4+Lif+fm5n/oJya/6Cbmf+fmpn/n5qZ/56amP+emZf/npmX/52Z
l/+dmJf/nZiX/52Ylv+cl5b/k46L/2Jviv4LVOX7AFH5/yRl5f9OedD/UnvO/1F6zv9Res3/UXnN/1B5
zf9Qec3/UHnM/1B4zP9QeMz/T3jL/053y/8wadz/BFP2/wNR8f5Qa6L/l5KO/6Cbmv+gnJr/oJuZ/5+a
mf+fmpn/npqY/56Zl/+emZf/nZmX/52Yl/+dmJb/nZiW/5uWlf+Mh4X/cW1r/GxoZXltaWcBAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGUVbWlmzYmFg/+qpaT/qaSj/6ijov+ppKP/qKSj/6ij
ov+noqH/p6Kh/6ahoP+moZ//paCf/6Sgnv+jnp3/op2c/6Sem/9Rd8T/AE/5/yFk6P+PnbX/q6qn/6uq
p/+rqqf/q6mn/6qppv+pqKX/qail/6inpP+npqP/p6aj/6alov+ko6D/l56n/ztx1/8AUPn/NGvc/6Ki
p/+ppKP/qaSj/6mko/+opKP/qKOi/6eiof+noqH/pqGg/6ahn/+loJ//pJ+e/6OenP+inpz/op2c/4WB
f/9taWbLbGllFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlK3BsaeialpT/sKyr/7Wx
sP/DwL//ycbF/8nGxf/JxsX/ycbE/8jFxP/IxcT/yMXE/8jEw//IxMP/xMHA/7Swr/+mo6P/Q3PV/wBO
+/9Tftb/tLOx/729vP/Ixsb/ycjI/8nIyP/JyMf/yMfH/8jHx//Ix8f/yMbG/8fGxv/GxcX/vby8/6+t
q/9ujML/A1P2/yBk6P+hpLD/ura0/8bDwv/JxsX/ycbF/8nGxf/JxsT/yMXE/8jFxP/IxcT/yMTD/8fE
w//Avbz/r6uq/6mko/+UkI7/b2to6GxoZSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxo
ZTVxbWrsn5ya/7u3tv/S0M7/3dva/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c
2//X1NP/trS1/0R01/8ATvv/XITX/8nGw//b2dj/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c
2//e3Nv/3tzb/93b2v/Lycb/eJPG/wVU9f8gZOn/r7S//9jV0//e3Nv/3tzb/97c2//e3Nv/3tzb/97c
2//e3Nv/3tzb/97c2//e3Nv/3dva/9DOzP+zr67/mZWT/3BsaexsaGU1AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABsaGU1cW1q66Ognv/IxcT/3NrZ/93b2v/d29r/3dva/93b2v/d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3tzb/8fGx/9Hd9r/AE36/2GJ3P/Z1dH/3tzb/93b2v/d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3NnV/4Kcz/8FVPX/Imbr/77Dz//f3Nr/3dva/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/c2tn/w8C+/52Zl/9wbGrrbGhlNQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2dkNXFtauunpKL/zsvK/93b2v/d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2//My8z/Snrd/wBN+v9kjN//3NnU/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93a1/+HotT/BVT1/yNo
7P/Cx9P/39za/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/8nG
xf+hnZz/cW1q62xoZTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVxbWvrrKmn/9HP
zv/c2dj/3NrZ/93b2v/c2tn/3NnY/9za2f/e29r/3drZ/9zZ2P/c2dj/3NnY/9zZ2P/d2tn/zs3O/0x8
4P8ATfr/Z4/i/93Z1f/c2tj/3drZ/9vY1//b2Nf/3drZ/9za2P/c2dj/3NnY/9zZ2P/c2dj/3NnY/9zZ
2P/d2db/iqTX/wZU9v8lae7/w8nU/93a2P/c2tn/29jX/9rY1//c2tn/3dvZ/9za2P/c2dj/3NnY/9zZ
2P/c2dj/3NnY/9vZ2P/Mysn/paKg/3FtautsaGQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABrZ2Q1cm5r67Ctq//V0tH/1tTS/8XDwf+loqD/wb68/9fV0//Gw8H/pKGf/727uf/V09L/1dLR/9XS
0f/V0tH/1tPR/87Nzv9Of+P/AE36/2qS5f/b19P/0tDO/7Ctq/+XlJH/mZaT/7GvrP/Rzsz/1dPR/9XS
0f/V0tH/1dLR/9XS0f/V0tH/2dXR/42n2v8GVfb/Jmrv/8PJ1P/X1dL/v727/5qWlP+XlJH/oJ2b/7m2
tP/Rz83/1dPR/9XS0f/V0tH/1dLR/9XS0f/V09H/z83M/6qnpf9xbWrra2dkNQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAa2dkNXJua+u1srD/2NXU/87My/+7ubf/dXFu/5WRj//DwcD/m5mX/3Bs
af+urKr/zcvK/8zJyP/Mycj/zMnI/83Lyf/Ozc7/UYLl/wBM+f9tlej/2NXQ/8jGxP+UkY//iYaE/4WC
f/9zb23/qqem/83Lyv/Mycj/zMnI/8zJyP/Mycj/y8nI/9PPzP+Pqt3/BlX2/ydr8P/DyNT/z83L/6Si
oP9va2j/iISC/4F9e/90cW7/n5ya/8rIx//Mysn/zMnI/8zJyP/Lycj/zcvK/9LQz/+uq6n/cm5r62tn
ZDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVybmzruba1/9rY1//HxMP/wL28/4eE
gf9wbGn/enZ0/3Jua/98eHX/u7m3/8TCwf/EwcD/xMHA/8TBwP/Gw8H/zs3O/1OE6P8ATPn/cJjr/9XS
zf/DwL//v727/766uf+joJ7/b2to/5iVk//Gw8L/xMHA/8TBwP/EwcD/xMHA/8TBwP/Oysf/kq3g/wdW
9/8obfL/wsfT/8jEwv+gnZv/dXFu/7GurP+7ubf/h4OB/3ZycP+2s7L/xcLB/8TBwP/EwcD/xMHA/8fE
w//V09H/s7Cu/3Jua+trZ2Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrZ2Q1c29s6767
uf/d29r/wL27/726uP+YlJL/cm5r/5KOjP9zb2z/jYmH/7u4t/+8urj/vLm4/7y5uP+8ubf/vru5/87N
zv9Wh+r/AEz5/3Sc7v/Tz8v/vLm3/62qqP+IhIL/c29s/3l1c/+opaP/vbq4/7y5uP+8ubj/vLm4/7y5
uP+8ubf/ycbC/5aw4/8HVvf/Km7z/8LH0//Avbr/m5iW/3Rwbf+sqaf/v7y6/5mWlP9wbWr/pKGf/726
uf+8ubj/vLm4/7y5t//Avbv/2NbU/7e1s/9ybmvra2dkNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAa2dkNXNvbOvDwL7/4d7d/7m1s/+0sa//paGf/3Zyb/+IhIL/dHBt/5uYlf+1srD/tLGv/7Sx
r/+0sa//tLCu/7azsf/Ozc7/WYnt/wBM+f93n/L/0c3I/7GurP+Ig4H/cW1q/4+Mif+opKL/tLGv/7Sx
r/+0sa//tLGv/7Sxr/+0sa//s7Cu/8TAvP+ZtOb/B1b4/ytw9f/Cx9P/uLSx/5eTkf9zb23/pqKg/7Wx
r/+Niof/cW1q/6Kenf+1sa//tLGv/7Sxr/+0sK7/ubWz/9vZ1/+8ubf/cm9s62tnZDUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZDVzb2zrx8XD/+Ti4P+xraz/rKem/6ijov98eHb/bmto/3Zy
b/+jn57/rKin/6ynpv+sp6b/rKem/6ynpv+uqqj/zs3O/1uM8P8ATPn/eqL1/87Jxf+opKP/gn58/3Nv
bf+QjIr/kY6M/6Whn/+sqKf/rKem/6ynpv+sp6b/rKem/6unpv+/urf/nLfp/whX+P8scfb/wcbS/7Cr
qf+Sjoz/cGxp/4yIhv+NiIf/c29s/356eP+no6L/rKin/6ynpv+sp6b/q6em/7GtrP/e29v/wL68/3Nv
bOtrZ2Q1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmMzdHBt68zKyf/o5ub/rain/6Oe
nf+kn57/i4eF/3Zyb/+FgX7/op2c/6Sfnv+kn57/pJ+e/6Sfnv+kn57/p6Kh/9DP0P9dj/L/AEv4/3yk
9//OycX/o56d/5eSkf99eXb/dnJv/3t2dP+ZlZP/pZ+e/6Sfnv+kn57/pJ+e/6Sfnv+jnp3/vbi0/6G7
7f8IV/j/LXL4/8PI1f+po6H/k46M/3h0cv94dHH/eXVy/4N/ff+blpX/pJ+e/6Sfnv+kn57/pJ+e/6Oe
nf+tqKf/4+Df/8XCwf9zb2zra2dkMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2dkH3Bs
ad/CwL//+Pf2/8G9vP+gm5n/npmX/5yXlf+ZlJL/m5aU/56Zl/+emZf/npmX/56Zl/+emZf/n5qY/7Ov
rf/n5eT/bJr3/wBM+P9bkPr/29ze/6yno/+gmpf/nZiU/5uVkv+clpP/n5mW/6Cal/+gmpf/oJqX/6Ca
l/+gmpf/paCd/9PQzP+Hrvb/AFH4/z19+v/e4ur/t7Kt/6Calv+clpP/m5WS/5qVk/+dmJb/npmX/56Z
l/+emZf/npmX/56Zl/+gm5n/wLy7//Dv7v+8urj/b2to32tnZB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG1pZgprZ2SokY6M/+zs6//19PT/1NHQ/8fEw//HxMP/x8XD/8fEw//HxMP/x8TD/8fE
wv/HxML/x8TC/87Lyf/q6ej/8/Hu/3mWzP8BUPH/D176/4av+v++yN//rbPE/6qwwf+qsMH/qrDB/6qv
wP+qr8D/qq/A/6mvwP+pr8D/qrDB/7nB1f+du/P/Jmz5/wBO+P9JgvH/w9f6/7XG5/+Vpcb/maXA/7G1
wf/Gw8H/yMXD/8fEw//HxMP/x8TC/8fEwv/HxML/0tDP//Hw8P/m5eT/j4uJ/2tnZKhtaWYKAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlO21qZ9qQjYv/w8LB/9LR0f/S0dD/0tHQ/9LR
0P/S0dH/0tHQ/9HQz//JyMb/xcTC/8XEwv/GxMP/xsTC/6KfnP9tb3T/KVy//wFR9/8GVfr/GGL6/xpj
+P8aYvj/GmL4/xpi+P8bY/f/GmP3/xpi+P8aYvj/GmL4/xpi+P8ZYvn/Clj5/wBQ+f8AUPn/B1X2/xJe
+f8TX/r/EV34/xNe+P8wdPn/iq/2/8zQ1//S0M//0dDP/9HQz//R0M//0c/P/9HPzv/Bv73/j4yJ/21p
ZtptaGU7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9raAFsaGU+a2dkqG9s
adt1cW7kdXFv43Vxb+N1cW7mdHBt+3h0cf+KhoT/k46N/5OPjf+Tjoz/k46M/5KNi/+Oiof/kIuI/4aJ
lP9KdMj/Gl3n/wtW8P8KVfH/Clbx/wlV8P8CUfT/AFD4/wBQ+P8HVPT/Clby/wpW8v8KVvL/C1bx/w9Z
7/8RWu7/EVru/xFZ7v8QWO7/EFju/xBY7v8MV/D/AVD3/wVT9v86ZLj7cnFx5nVxbuN1cW7jdXFu43Vx
buN0cG7kb2to22tnZKdtaGU7bmpnAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG1pZgpqZmMZaGRhHGhkYRxnY2AZa2dkVG5qZ+6MiIb/paCf/6ahoP+loJ//paCe/6Sf
nv+jn53/o56d/6Oenf+jnpv/n5uc/5KVo/+Djqv/fYyt/36Nrf9zhq7/G1zd/wBQ+v8kZeb/dY6+/4OV
t/+Bk7f/gZO2/4GTtf+NmK7/kJqs/5CZq/+PmKv/j5iq/46Xqv+Ol6n/g5Ku/0Z10P8EU/X/A1Hz7SJX
xU9yZlEZaGRhHGhkYRxoZGEcaGRhHGtmYxltaWYKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxoZXB4dHH/pqGg/62o
p/+tqaj/sa2s/7Swr/+0sK//tLCu/7Ovrf+zr63/s66t/7KurP+yrqz/sKuo/6umo/+oop3/k5in/xNb
7P8HVfX/eJLE/7Cuq/+ysK//tbSy/7a1s/+2tbP/tbSz/7Szsv+0s7L/s7Kx/7Kysf+ysbD/rays/6mo
pv+Yn6v/Jmbj/wBQ+f4AUfltAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABrZ2R/gX16/6+rqv+4tLP/zcrJ/9jW1f/Z19b/2dfW/9nX1v/Z19b/2dfW/9nX1v/Z19b/2dfW/9nW
1f/S0M//vLe1/4iVtf8MV/L/Elvx/5+ovP/DwsD/1dPS/9nX1v/Z2Nf/2dfX/9nX1//Z19f/2dfW/9nX
1v/Z19b/2dfW/9fV1P/Jx8f/ra6x/0J12f8AUPn/AFH4fwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAa2dkf4SAfv+2srH/zcrI/97b2v/d29r/3dva/93b2v/d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3tzb/9jU0f+QoMH/C1fy/xNc8f+ttMb/2tjV/97c2//d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3tva/8PExf9GeNv/AE/5/wBR+IAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZH+Fgn//vLm4/9TS0f/d29r/3dva/93b
2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d2tf/mqrL/wxX8v8UXPL/tr7P/97b
2f/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2v/Pz9D/Snzf/wBP
+f8AUfiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrZ2R/h4OB/8K/
vv/W09L/3dva/93b2v/b2dj/2NbV/9vZ1//d29r/2dfW/9nX1v/d29r/3dva/93b2v/d29r/3drY/56u
z/8MWPP/FF3z/7vC1P/e29n/29nY/9jW1f/Y1tX/2NbV/9nX1v/c2tn/3dva/93b2v/d29r/3dva/93b
2v/e29r/0dHS/01+4v8AT/n/AFH4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAa2Zjf4mGg//HxcT/1tTT/9nX1f/a2Nb/wL68/5CNiv+uq6n/0tDO/5uYlv+YlZL/0c7N/9nX
1v/Z19X/2dfV/9vX1P+hsdL/DVj0/xVe9P+9xdf/3NnW/8LAvv+Sj4z/jYqH/4yJhv+cmZf/09HP/9nX
1v/Z19X/2dfV/9nX1f/Z19X/2tfV/9HR0v9PgOT/AE/5/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmY3+Lh4X/zsvK/9XS0f/Rz87/0dDO/6GenP9qZmP/iISC/7u4
t/92cm//cW1q/7e1s//S0M//0M7N/9DOzf/U0c7/o7PV/w1Z9P8WX/T/wMfZ/9XS0P+xr63/cm5r/42K
h/+dmpj/p6Sj/8zKyf/Rz87/0M7N/9DOzf/Qzs3/0M7N/9HPzv/Q0NH/UYPn/wBP+f8AUfiAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmN/jYmH/9TR0P/T0c//yMbF/8XC
wf+LiIb/c29s/3x4df+fnJr/dHBt/3NvbP+fnJr/ycbF/8jFxP/HxcT/zsrH/6W21/8OWfX/F2D1/8LK
2//Nysj/q6mn/3Rxbv+gnZv/t7W0/767uv/HxcT/yMXE/8jFxP/IxcT/yMXE/8jFxP/IxsT/zs7P/1SG
6f8AT/n/AFH4gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAamZjf4+L
if/Z19X/0s/O/8G+vf+4tbP/enZz/4eEgf99enf/gn98/3p2dP+BfXv/iYaD/767uf/Avrz/wL28/8jE
wf+ouNr/Dlr1/xhh9v/Fzd7/xsPA/6ajof9xbWr/dnJv/3l1cv+WkpD/v7y7/8C+vP/Avbz/wL28/8C9
vP/Avbz/wb68/83Nzv9WiOz/AE/4/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGpmY3+RjYv/393c/9HOzf+6trX/paKg/3NvbP+Vko//g399/25qZ/+Hg4H/joqI/3h0
cf+wrKr/uba0/7i1s//Cvrv/qrrc/w9a9v8ZYff/yM/g/7+8uP+hnZv/c29s/5SRj/+no6H/rqqo/7i1
s/+5tbP/ubWz/7m1s/+5tbP/uLWz/7m2tP/My8z/WYvv/wBP+P8AUfiAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqZmN/k4+N/+Xj4v/Qzcv/sq6t/5KOjP9wbGr/npuZ/4uH
hf9qZmP/joqI/5iUk/9xbWv/nZmX/7GtrP+wrKv/vLe0/6293/8PW/b/GmL4/8rS4/+4tLH/m5eV/3Bs
av+AfHr/iYWD/5WRj/+vq6n/sa2r/7Gsq/+xrKv/sayr/7Csq/+xraz/y8rL/1yO8f8AT/j/AFH4gAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaWVif5WSj//r6un/zsvK/6ij
ov+Tjo3/hoKA/6Oenf+YlJL/hH99/5mVk/+gm5r/hoJ//5iUkv+ppKP/p6Kh/7axrv+vwOH/EFz3/xtj
+f/O1Ob/sq2q/5yYlv+FgX7/gn58/4J9e/+OiYf/pqGg/6ijov+oo6L/qKOi/6ijov+oo6L/qaSi/8rJ
yv9gkfT/AE/4/wBR+IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpm
Y36Oioj/8O/u/9bT0v+jnp3/n5qZ/6Cbmf+gm5r/oJua/6Cbmf+gm5r/oJua/6Cbmf+gm5n/oJua/5+a
mf+8t7X/xNDp/xVf+P8VYPn/xtTv/7izsP+fmpn/oJuZ/6Cbmf+gm5n/oJuZ/6Cbmv+gm5r/oJua/6Cb
mv+gm5r/oJuZ/6ahn//T1Nf/VYz3/wBP+P8AUfh7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABrZ2Reend0+d/f3f/19fT/xMHA/6mko/+noqD/p6Kg/6eioP+noqD/p6Kg/6ei
oP+noqD/p6Kg/6eioP+0sK//4uDe/9/l8f8na/D/AVL5/3yn+v/Y2Nv/trGs/6uloP+rpaD/q6Wg/6ul
oP+rpaD/q6Wg/6uloP+rpaD/q6Wg/66oo//Lx8X/uczx/x9o+P8AUPj2AFH4VQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlHG1pZsWXlJL/4+Pi//Hx8P/n5eX/5eTj/+Xk
4//l5OP/5ePj/+Xj4//k4+L/5OPi/+Tj4v/k4+L/7Ovq/+7t7P+1s7L/PGSy/ABQ9v0PW/n/WpD6/3Ka
7f9sk+b/bJPm/2yT5v9sk+b/bJPm/2uT5v9rk+b/a5Pm/2uT5v9vluj/bJn1/yhu+f8AUfj/AFH4wgBR
+BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGU7bWlmyn56
ePyVk5H/m5mX/5uYlv+bmJb/m5iX/5uYlv+bmJb/mpiW/5qYlv+al5X/mpeV/5qWlf+JhoP/cW1p6lxk
eYoDUvSeAFD49ABP+P8ATvn/AE/5/wBP+f8AT/n/AE/5/wBP+f8AT/n/AE/5/wBP+f8AT/n/AE/5/wBO
+P8AUPj8AFH4ygBR+DsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGxoZSNrZ2NnaWVigGllYoBpZWJ/aWVif2llYn9pZWJ/aWVif2llYn9pZWJ/aWVif2ll
Yn9pZWKAamZjd2xoZT56bFYGAFD8DQBR+FIAUfiKAFH4mQBR+JkAUfiZAFH4mQBR+JkAUfiZAFH4mQBR
+JkAUfiZAFH4mQBR+JkAUfiUAFH4bgBR+CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFH4AgBR+AMAUfgDAFH4AwBR
+AMAUfgDAFH4AwBR+AMAUfgDAFH4AwBR+AMAUfgDAFH4AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////8AD/////AAAAAAAAD/4AAAAAAAAH/AA
AAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAA
AA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAAAAAAD/AA
AAAAAAAP+AAAAAAAAB/4AAAAAAAAH/4AAAAAAAB///AAAAAAP///8AAAAAA////wAAAAAD////AAAAAA
P///8AAAAAA////wAAAAAD////AAAAAAP///8AAAAAA////wAAAAAD////AAAAAAP///8AAAAAA////w
AAAAAD////AAAAAAP///8AAAAAA////wAAAAAD////gAAAAAf////AAAAAD///////+AA///////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////KAAAADAAAABgAAAAAQAgAAAAAACAJQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAbGhlBGllYg1nY2AOZ2NgDmdjYA5nY2AOZ2NgDmdjYA5nY2AOZ2NgDmll
Yg1saGUEAAAAAABR+AQAUfgVAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgYAFH4BwAA
AABsaGUEaWViDWdjYA5nY2AOZ2NgDmdjYA5nY2AOZ2NgDmdjYA5nY2AOaWViDWxoZQQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsaGUibWlmlHJta8xzb2zPc29sz3NvbM9zb2zPc29sz3Nv
bM9zb2zPc29sz3FtaspuaWSMNl2uOgBQ+o8AT/rSAE/62gBP+toAT/raAE/62gBP+toAT/raAE/62gBP
+toAT/rWAFD6oyNZxkpuaWSMcW1qynNvbM9zb2zPc29sz3NvbM9zb2zPc29sz3NvbM9zb2zPcm1rzG1p
ZpRsaGUiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxoZRBuamewg399/5eTkf+ZlJL/mJOR/5eT
kf+XkpD/l5KQ/5aSkP+WkZD/lpGP/5SPjf98e3/8H1nM6wRU9/0vauD/P3HY/z5w1/8+cNf/PnDX/z1v
1v89b9b/PW/W/z1v1f8zatr/Clbz/hJW3fJ2e4r9l5KQ/5mUkv+Yk5H/l5OR/5eSkP+XkpD/lpKQ/5aR
kP+WkY//lI+N/4F9e/9uamewbGhlDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmYz97d3TzpqGg/6un
pv+uqaj/r6qp/66qqP+tqaf/rain/6ynpv+rp6b/qaWj/6ahnf+Ajq3/CVXw/0F02/+jp67/rq6s/6+u
rv+urq3/ra2s/62sq/+srKv/q6uq/6qpqP+io6X/Vn7K/wRU9f9siMH/rqik/66qqP+vqqn/rqqo/62p
p/+tqKf/rKem/6unpv+ppKP/paCf/5+amP95dXLya2dkPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpm
Y1qFgX/9s6+u/8fDwv/V0tH/1tTT/9bT0v/W09L/1tPS/9bT0v/V09L/1NHQ/8S/vP99kb3/BVP1/26O
z//IxcH/1NPS/9bU1P/W1NP/1tTT/9bU0//W1NP/1dTT/9TT0v/IxcL/gZfB/wdW9P9kiM7/yMTA/9XS
0f/W1NP/1tPS/9bT0v/W09L/1tPS/9XT0v/U0dD/w8C//6unpv+Cfnv9a2djWgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGpmY12IhIH9wr69/9vZ2P/e3Nv/3dva/93b2v/d3Nv/3dzb/93c2//d3Nv/3tzb/9zZ
1v+Knsr/BFP1/3mX2P/d2tb/3tzb/93b2v/d29r/3dva/93b2v/d29r/3dva/97c2//e29j/kKbQ/wdW
8/9uk9n/3drW/97c2//d29r/3dva/93b2//d3Nv/3dzb/93c2//e3Nv/29nY/7y4t/+EgH79amZjXQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpmY12Kh4T9ysfG/93b2v/e3Nv/3tzb/93b2v/e3Nv/3tzb/93b
2v/d29r/3dva/97b2P+RpdH/BVP1/36d3v/g3Nj/3tzb/97c2//e3Nv/3dva/93b2v/d29r/3dva/93b
2v/g3Nn/l63W/whW9P9zmN7/39zY/97c2//e3Nv/3tzb/93b2v/d29r/3dva/93b2v/d29r/3drZ/8TB
wP+Hg4H9amZjXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGllYl2Nioj9zszL/9jW1f/Lycf/z8zL/9nX
1f/Mycj/zcrJ/9nW1f/Y1tX/2dbV/9vX1P+UqdX/BVT2/4Gg4f/d2dT/zMrI/7y5uP/EwcD/1tPS/9nW
1f/Y1tX/2NbV/9jW1f/c2NT/mq/Y/wlX9f91muD/3NjU/8zJyP+8ubj/wb+9/9HPzf/Z19X/2NbV/9jW
1f/Z1tX/2dbV/8nGxf+Kh4T9amZjXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGllYl2RjYv909DP/8/N
y/+al5T/ko+N/7+9u/+IhIL/op+d/87My//Ny8r/zcvK/9LPy/+WrNj/BlT2/4Sj4//U0cz/pKGf/4qG
hP+AfHr/pqSi/87My//Ny8r/zcvK/83Lyv/Szsv/m7Ha/wpY9v93m+L/1NDM/5yZl/98eXb/h4OB/4mG
g/+9u7n/zszL/83Lyv/Ny8r/z83L/83Kyf+Niof9aWViXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGll
Yl2UkI7919XT/8fEw/+npKL/dHBt/357eP90cG7/r6yq/8TBwP/DwL//wsC+/8nGwv+Zrtr/BlX3/4em
5v/MyMT/vbq5/66qqf9/fHn/kI2K/8PBv//DwL//w8C//8LAvv/IxMH/nbLb/wtZ9v94neP/y8fD/5OQ
jv+PjIn/ure2/4OAff+TkI3/w8C//8PAv//CwL7/xsPC/9HPzf+QjYv9aWViXQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGhkYV2XlJH93NnY/726uP+vq6r/fnp3/4eDgf9/fHn/s7Cu/7i1s/+4tbP/uLWz/8G9
uf+csd3/B1b3/4qp6f/Fwbz/n5uZ/3l1c/+GgoD/qqel/7m1tP+4tbP/uLWz/7i1s/+/u7f/n7Td/wta
9/96nuX/w7+6/4+Lif+MiYb/uba0/4yIhv+Gg4D/t7Sy/7i1s/+4tbP/vbq4/9bT0v+UkI79aWViXQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhkYV2al5X94N7d/7Ovrv+sqKb/hYF//3Ftav+Lh4X/ramo/62p
qP+tqaj/rain/7izsP+ftOD/CFb4/42s7P+8t7P/i4aE/3l1c/+VkZD/pKCf/66pqP+tqaj/ramo/62p
p/+1sK3/obbf/w1b+P97oOb/urWx/4mFg/9/e3n/lJCP/3h0cf+RjYv/rqmo/62pqP+tqaf/s6+u/9rX
1v+Xk5H9aGRhXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjYFicmZf95+bl/66qqP+inZz/k46M/396
eP+WkY//o56c/6KdnP+inZz/oZyb/7Suq/+mu+b/CFf5/46u8P+6tK//mZSS/4N+fP9/enj/lZCO/6Oe
nP+inZz/op2c/6Kdm/+wqqb/pbrk/wxb+f+Bpez/trCs/5CLiP9/enj/gHx5/4yHhf+fmpn/op2c/6Kd
nP+hnJv/rqmo/+Hf3v+ZlZP9aGRhWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdjYDmIhYPv6ejo/9bT
0/+xraz/r6qp/6+qqf+vq6n/r6qp/6+rqf+vqqn/sq6s/9jV0v+/zev/DVnz/1CK+v/Cydf/rqys/6mm
p/+ppqb/qaan/6mmp/+ppqf/qaam/6uoqf/Aw8r/b5z1/wVV9/+auvb/yszS/6Giqv+mpKb/r6qn/7Cr
qf+vq6n/r6qo/6+qqP+xrav/1NHQ/+Ph4P+Gg4HvZ2NgOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtm
YwpuamebmpeV/c7NzP/Qz87/zs3M/8/Ozf/Qzs3/z87M/8rIx//IxsT/ysjH/8zKyf+VlJb/MV+5/wVV
9/8ucfr/Pnjy/zt28P88du//PXfu/z127v87de//O3Xv/zx38P8zdPj/CFb6/wFQ+P8obPf/Nnb6/y1t
8f89eO//iqzt/8vN0//Pzcv/zs3L/87My//Pzs3/zMrJ/5iVk/1uameba2dkCgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABrZ2QWa2djd3RwbbJ5dnO3eXZztnh0cc95dXP+j4uJ/5mVk/+YlJL/mJOS/5aR
j/+TjYr/i4yU/1V4w/8pY97/H1/j/yBf4/8SWOf/AE74/wdU9P8eYef/IWHm/yBh5f8kY+P/LWff/y1n
3/8qZd//KWXf/yll3/8WXOr/BlX2/z5nuut5dXO5eXZzt3l1c7d5dXO3c29ssmtnZHZrZ2QWAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFMSANGQT0EAAAAAWtnZH2FgX7/qKOi/6ml
o/+qpqX/q6al/6qlpP+ppaP/qaSi/6ijof+hoKP/mpuj/5qaoP9Rd8P/A1P2/12Dzf+epK7/oKWv/6Cl
sP+ipq3/pqeq/6Wnqf+kpqn/pKWo/6Gipf+LmK3/J2bj/wBP+NcIT+IggjQAAkdCPgRHQj4EU09LAwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG5q
aJyXk5H/trKx/8jFw//Rz83/0s/O/9LPzv/Rz87/0c/O/9HOzf/Rzs3/y8jG/7Wwrv9JddP/EFry/52n
vf/IxsP/0dDO/9LRz//S0M//0tDP/9LQz//R0M//0c/O/8zLyv+5uLX/VH7Q/wBQ+fAAUfgvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAG9saZyem5n/ysfG/93b2v/e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/8/N
zP9Kedr/Elvy/7K6zP/e29n/3tzb/97c2//e3Nv/3tzb/97c2//e3Nv/3tzb/97c2//W09H/YYjW/wBQ
+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyjoJ7/0tDP/93b2v/d29r/3dva/93b2v/d29r/3dva/93b
2v/d29r/3tza/9fV1P9PfuD/E1zz/7vD1f/f3Nr/3dva/93b2v/d29r/3dva/93b2v/d29r/3dva/93b
2v/c2db/aI7d/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyppqT/1dLR/9rY1//T0M//p6Si/7+8
u//Avbv/pqOh/9PQz//a2Nf/2tjW/9bU0/9SgeL/FF30/73F2P/V0tD/qaak/56bmP+in53/zMrI/9vY
1//a19b/2tfW/9rX1v/a19T/apHg/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZyuq6r/1dPS/9DO
zf+7uLf/cm9s/5OQjv+XlJL/cW1q/7i1tP/Qzs3/z83M/9DOzf9UhOX/FV71/77G2P/Gw8H/f3x5/5aT
kP+opqT/xcPC/8/NzP/Pzcz/z83M/8/NzP/T0M3/bZTj/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFt
apy0sa//1tPS/8bDwv+in53/eXZz/4SAfv+Cf3z/eHRy/5+bmf/FwsH/xMHA/8rIx/9Xhuj/F2D2/77G
2P+9ubf/fnp3/4qHhP+dmpj/v7y7/8TBwP/EwcD/xMHA/8TBwP/Mycb/cJfl/wBQ+PEAUfgwAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHFtapy6t7X/1tTS/7q3tf+MiIb/iIWC/4B8ev94dHH/i4eF/4iEgv+4tbP/ura0/8bD
wv9Zier/GGH3/7/G2P+0sK3/fHh2/42Jh/+empj/trOx/7q3tf+6t7X/ure1/7m2tP/Gwr//c5ro/wBQ
+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFtapzAvbv/19TT/6yop/9+enf/lJCO/4aCgP98eHX/mZST/315
dv+opKP/r6qp/8C9vP9ci+3/GWL5/7/G2P+rpqP/e3d1/4B8ev+Lh4X/qKSj/6+rqv+vq6r/r6uq/66q
qf+/urf/dp3r/wBQ+PEAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBsaZzDwb//2dfW/6Oenf+WkY//n5qY/5uW
lf+Yk5H/oJua/5aRkP+hnJv/o56c/8C8uv9jkfH/GWL6/8HJ3f+nop//lpGP/5KOjP+Uj47/oZya/6Sf
nv+kn53/pJ+d/6KdnP+8t7T/eKDw/wBQ+PAAUfgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtnZIWurKr/8O/u/7y4
t/+ppaP/qaSi/6mko/+ppKP/qaSi/6mko/+opKL/sa2r/+Lf3P+Ape//B1b4/5e18v/Bvbz/qqWi/6qk
ov+qpKL/qaSh/6mkof+ppKH/qKOg/6+qp//GytX/SYP3/wBP+NwAUfggAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGll
YjR8eXbcwb++/9va2v/U09L/1NPS/9TT0v/U0tH/1NLR/9TS0f/U0dD/2dfW/9DOy/93g572CFLo7hlj
+v9Sh/T/UoPp/1CB6P9Qgej/UIHo/1CB6P9Qgej/UIHo/1SF7P89e/f/BlX4/ABQ+IkAUfgDAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABqZmNCcW1qsX57eM+BfnzPgX58z4F+fM+BfnvPgX57z4F+e8+BfnvPgH16z3Vx
b8FsZ2NqDlTkSABP+LAATvjYAE752gBO+doATvnaAE752gBO+doATvnaAE752gBO+doATvjQAFD4ggBR
+BIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2NgCF5aVw5cV1QOXFdUDlxXVA5cWFQOXFhUDlxY
VA5cWFUOXVlVD2VgXQtwamQBAAAAAABR+AkAUfgaAFH4HQBR+B0AUfgdAFH4HQBR+B0AUfgdAFH4HQBR
+B0AUfgTAFH4AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////
AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAPgA
QAIAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAH
AADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAPAA
AAAADwAA/AAAAAA/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/
AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAP/AAD/gAAAA/8AAP+AAAAD/wAA/8AAAAf/AAD/4AEAD/8AAP//
/////wAA////////AAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpZWIhbGhlR21p
ZkltaWZJbWlmSW1pZkltaWZJbGhkPlZifxIATvwyAE38VQBN/FcATfxWAE38VgBN/FcATfxWAE79Okpf
jxZsZ2M+bWlmSW1pZkltaWZJbWlmSW1pZkltaWZHamZjIQAAAAAAAAAAAAAAAAAAAAAAAAAAbGhlL3x4
ds6MiIb6jYmH+o2IhvqMiIX6jIeF+oyHhfqHgn/zPWOwxQ9Z8ectaOH9Lmjf/C5o3/wuZ978LWfe/Cxn
3v0SW+7tM2C+zYiEgvOOiYf6jYiG+oyIhfqMh4X6jIeF+oqFg/p7dnTObGhlLgAAAAAAAAAAAAAAAAAA
AABybmx7m5eV/7WxsP+7t7b/ura1/7m1tP+5tbT/t7Ox/6Wjp/8uZtv/Y4fP/7S1t/+3uLv/tre6/7W2
uf+0tbn/srK0/3CMw/8lZOP/oqWx/7u3tf+6t7b/ura0/7m1tP+4tLP/sKyr/5WRj/9ybmt7AAAAAAAA
AAAAAAAAAAAAAHZyb42uqqn/2NbV/93b2v/d29r/3dva/93b2v/d29n/w8TL/y5q5f+Opdb/3tvX/93b
2v/d29r/3dva/93b2v/e29j/na7Q/ydo6P+7wtH/3tvZ/93b2v/d29r/3dva/93b2v/X1NP/qaWj/3Vx
bo0AAAAAAAAAAAAAAAAAAAAAd3Nxjbi1s//c2tj/29nY/9za2f/b2Nf/3NrZ/93b2f/MztT/Mm7p/5at
3v/e29f/19XU/9vZ2P/c2tn/3NrZ/9/c2f+mt9n/K2vs/8PJ2f/b2Nb/2NXU/9za2f/c2tn/3NrZ/9za
2f+zsK//dnJvjQAAAAAAAAAAAAAAAAAAAAB5dnONvru6/8fFw/+loqD/tbKw/6mmpP/Qzsz/0c7N/8fJ
z/81cez/lq3f/7+7tv+ZlpP/q6im/9DOzP/Qzs3/09DM/6S12P8tbu//vMPS/6Shnf+Wk5H/qqim/87M
y//Qzs3/0tDO/7i2tP94dHGNAAAAAAAAAAAAAAAAAAAAAHt4dY3DwL7/wL28/4eDgf99eXf/nZqY/8G+
vf/Avbv/v8HH/zl07/+VrN3/uray/5GOi/+RjYv/v7y7/8C9vP/Dv7v/obLU/zBx8f+zusn/kY2J/6ek
ov+JhoP/sq+t/8G+vP/EwsD/vbu5/3p2dI0AAAAAAAAAAAAAAAAAAAAAfnp3jcjFw/+3tLL/kIyK/3p2
dP+koJ7/sK2r/7Crqf+4ub//PHjz/5Wr3P+emZT/f3t5/6Ccm/+wrKv/sKyq/7Ktqv+fr9D/M3T0/6ux
wP+JhIH/lJGO/4SAfv+moqH/sKyr/7azsf/DwL7/fHl2jQAAAAAAAAAAAAAAAAAAAAB8eXaEzszL/7i0
s/+cl5X/kIyK/6Oenf+loJ//pqGf/8DAxv9BfPf/jKjj/6ulnv+Ri4b/mpSQ/6ehnf+noZ3/raah/5qu
2P82d/j/tbrH/5eRjP+PiYX/mJSR/6Wgnv+kn57/t7Ox/8nGxf97d3SEAAAAAAAAAAAAAAAAAAAAAG1p
ZkSloqDpysjH/8G+vf/Bv77/wb69/7+8uv/Bvr3/xsPC/0xzwv8ucPT/YYvk/12F2v9fhtn/XYTZ/1yE
2f9gieD/NHT2/xhh+P9fj/H/VIDc/4Kf2P+9vsL/wL27/8C9vP/IxsT/op+d6W1pZkQAAAAAAAAAAAAA
AAAAAAAAYl5bA21pZkR/fHl9hYJ/gH57eMqUkI7/oZ2b/6Ccmv+cl5X/kJCW/2J+vf9Gcs7/PW3S/wtV
8P8pZ+T/R3bV/0d11P9OeM//UHnN/013zf9Idc//IGPp/0Frw8iGgn1/hYF/gH57eH1taWZDY15bAwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPTkEfHh1sKqmpf/Bvrz/xsPC/8bDwf/GwsH/x8K//8O+
uv+WnrP/IWLn/5Wkw//GxMH/x8XE/8fFw//HxcL/xsTB/8C9uf9kh8z/AFD5rgBM/gQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw4MwWDf3y2wL28/93b2v/f3dz/393c/9/d
3P/e3Nv/4N3a/6q20f8nZur/uMHU/+He3P/g3t3/393c/97c2//e3Nv/39zY/4Ke1/8CUva2AE37BQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTAsBYaDgLbIxcT/29nX/8G+
vf/HxcP/vLq4/9XT0f/d2tf/sLzX/ypq7f+9xdn/w8C9/7Kvrv/Jx8X/29nY/9rY1//e2tb/h6Pd/wJS
97YATPoFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtKCQFioeEtsvJ
x//Jx8b/iYaD/5GNi/9/e3n/t7Wz/9DNyv+suNP/LW3w/7jA1P+XlJD/lJGP/7u4t//Ny8r/zMrJ/9DN
yf+Ho93/A1P3tgBM+gUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUg
HAWPi4m2z8zL/7Kvrf+FgX//fnt4/4F9ev+cmZf/v7u4/6izzv8wcPT/s7vP/4+Lh/+Lh4X/r6yq/726
uP+8ubf/wb25/4ej3f8EVPi2AEv5BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAHRgTBZOQjbbSz87/oJua/4+KiP+JhYP/kY2L/5GNi/+tqKX/pK/K/zNz9/+wt8r/j4qH/4eD
gP+fm5n/rKim/6ynpv+yrKj/iaTd/wVV+bYASvkFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAOCAMDiYaEqtfV1P+2s7H/qqWk/6qmpP+qpqT/qaWj/7Ktqv++xtj/MHH1/5yx
3P+opaX/oZ6f/6Ogov+koaP/pKGi/7GusP9ymur/AFL5pwBK+AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxbWpOoZ+d4ry6ufu4trX6uLa1+ri2tPq4tbT6u7m3+qin
qOwpX83EImn58T127P06c+n8OnPp/Dpz6fw6c+n8O3Xv/RVf+OMAT/hMAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5ZVgJlYV4tb2xpSXJua0lybmtJcm5rSXJu
a0lxbWpJamRfNi5YshIAS/k/AEv6VwBM+1YAS/tWAEv7VgBL+1cAS/pVAE34LwBU+AIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////////////4AAAB8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAP4AAA/+AAAP/gAAD/4AAA/+AAAP/gAAD/4AAA//AAAf/wAAH//////////////
//////////////////8oAAAAGAAAADAAAAABACAAAAAAAGAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI13TAgtW
8AgNV/AIDVfwCAtW8QgaWt4CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH15
dwF5dHKbhoKA7oeDgO+GgoDvhoJ/74SAf+1UapuqEFnu3h5g6PMeYOfzHV/n8x1f5/MPWO7kTWmlsIWB
ge2Hg4DvhoKA74aCf++FgX7ueHRxm4B7eQEAAAAAAAAAAH15diOVkY/9vbm4/8G+vf/Bvbz/wLy7/7i0
s/9DctP/h5zF/8HAwP/BwMD/wL+//7++vv+Tobr/NW3e/7y5t//Cvr3/wb28/8C8u/+5tbT/kIyK/YB8
eSMAAAAAAAAAAIB8eSumoqD+3dva/9za2f7c2tn+3dva/9za2f5KeuD+rLrY/9za2f7d29r/3NrZ/tza
2f69xNP+OXPo/9za2f7c2tn+3dva/9za2f7c2tn+oZ6c/4SAfSsAAAAAAAAAAISAfiuvrKr+wsC+/8K/
vv6wrav+0tDP/9PRz/5OgOX+rLrZ/6ypp/6vrKr/0tDP/tLQz/69xNP+PHbr/8TBwP6fnJr+vLm3/9LQ
z/7S0M/+qqem/4mFgysAAAAAAAAAAIiEgiu4tbP/trOx/3p2dP+UkY//vbq4/7+8uv9ShOn/p7XT/6Kf
nf+QjIr/vbq4/726uP+1vMv/P3nu/6mmpP+loZ//iYaD/726uP+9urj/s7Cu/42JhysAAAAAAAAAAIeE
gSrBvr3+qKSj/4F9e/6cmJb+qKOi/6ynpv5XiO7+o7DP/4mEgv6UkI7/p6Oi/qejov6vtsT+Qnzx/56a
mP6FgX/+jYiG/6ejov6opKP+vLm3/42KhyoAAAAAAAAAAJGNiw2enJrnzcvK/8PAv//DwL//vLm3/8fF
w/9jhcr/UYbw/3KOy/9wjMr/cIzK/3GNyv9aiuv/M3P2/3KT2P+GnMr/w8C//8PAvv/Lycj/nJmX55aS
kAwAAAAAAAAAAAAAAACVkpAfjYqHXoSBfoKIhIL+n5uZ/5+amf6emZj+cIe5/1x9wv4ZXOX/SXjV/mCD
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
</value>
</data>
</root>

View File

@ -1,101 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class InputCompositeWidget
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
DropdownMenu.Dispose();
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(InputCompositeWidget));
this.btnSpecial = new System.Windows.Forms.Button();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.widget = new BizHawk.Client.MultiHawk.InputWidget();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// btnSpecial
//
this.btnSpecial.Image = ((System.Drawing.Image)(resources.GetObject("btnSpecial.Image")));
this.btnSpecial.Location = new System.Drawing.Point(472, 0);
this.btnSpecial.Margin = new System.Windows.Forms.Padding(2, 0, 0, 0);
this.btnSpecial.Name = "btnSpecial";
this.btnSpecial.Size = new System.Drawing.Size(20, 20);
this.btnSpecial.TabIndex = 2;
this.btnSpecial.UseVisualStyleBackColor = true;
this.btnSpecial.Click += new System.EventHandler(this.btnSpecial_Click);
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.widget, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.btnSpecial, 1, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(492, 20);
this.tableLayoutPanel1.TabIndex = 8;
//
// widget
//
this.widget.AutoTab = true;
this.widget.Dock = System.Windows.Forms.DockStyle.Fill;
this.widget.Location = new System.Drawing.Point(0, 0);
this.widget.Margin = new System.Windows.Forms.Padding(0);
this.widget.Name = "widget";
this.widget.Size = new System.Drawing.Size(470, 20);
this.widget.TabIndex = 1;
this.widget.Text = "button1";
this.widget.WidgetName = null;
//
// InputCompositeWidget
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.tableLayoutPanel1);
this.Name = "InputCompositeWidget";
this.Size = new System.Drawing.Size(492, 20);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button btnSpecial;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private InputWidget widget;
}
}

View File

@ -1,100 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace BizHawk.Client.MultiHawk
{
public partial class InputCompositeWidget : UserControl
{
public InputCompositeWidget()
{
InitializeComponent();
DropdownMenu = new ContextMenuStrip();
DropdownMenu.ItemClicked += new ToolStripItemClickedEventHandler(DropdownMenu_ItemClicked);
DropdownMenu.PreviewKeyDown += new PreviewKeyDownEventHandler(DropdownMenu_PreviewKeyDown);
foreach (var spec in InputWidget.SpecialBindings)
{
var tsi = new ToolStripMenuItem(spec.BindingName);
tsi.ToolTipText = spec.TooltipText;
DropdownMenu.Items.Add(tsi);
}
btnSpecial.ContextMenuStrip = DropdownMenu;
widget.CompositeWidget = this;
}
static readonly string WidgetTooltipText = "* Escape clears a key mapping\r\n* Disable Auto Tab to multiply bind";
ToolTip _tooltip;
string _bindingTooltipText;
public void SetupTooltip(ToolTip tip, string bindingText)
{
_tooltip = tip;
_tooltip.SetToolTip(btnSpecial, "Click here for special tricky bindings");
_bindingTooltipText = bindingText;
RefreshTooltip();
}
public void RefreshTooltip()
{
string widgetText = "Current Binding: " + widget.Text;
if (_bindingTooltipText != null)
widgetText = widgetText + "\r\n---\r\n" + _bindingTooltipText;
widgetText = widgetText + "\r\n---\r\n" + WidgetTooltipText;
_tooltip.SetToolTip(widget, widgetText);
}
void DropdownMenu_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
//suppress handling of ALT keys, so that we can receive them as binding modifiers
if (e.KeyCode == Keys.Menu)
e.IsInputKey = true;
}
public void TabNext()
{
Parent.SelectNextControl(btnSpecial, true, true, true, true);
}
ContextMenuStrip DropdownMenu;
public bool AutoTab { get { return widget.AutoTab; } set { widget.AutoTab = value; } }
public string WidgetName { get { return widget.WidgetName; } set { widget.WidgetName = value; } }
public string Bindings { get { return widget.Bindings; } set { widget.Bindings = value; } }
public void Clear()
{
widget.ClearAll();
}
private void btnSpecial_Click(object sender, EventArgs e)
{
DropdownMenu.Show(Control.MousePosition);
}
void DropdownMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
Input.ModifierKey mods = new Input.ModifierKey();
if ((Control.ModifierKeys & Keys.Shift) != 0)
mods |= Input.ModifierKey.Shift;
if ((Control.ModifierKeys & Keys.Control) != 0)
mods |= Input.ModifierKey.Control;
if ((Control.ModifierKeys & Keys.Alt) != 0)
mods |= Input.ModifierKey.Alt;
Input.LogicalButton lb = new Input.LogicalButton(e.ClickedItem.Text,mods);
widget.SetBinding(lb.ToString());
}
}
}

View File

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

View File

@ -1,271 +0,0 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace BizHawk.Client.MultiHawk
{
public sealed class InputWidget : TextBox
{
// TODO: when binding, make sure that the new key combo is not in one of the other bindings
private readonly Timer _timer = new Timer();
private readonly List<string> _bindings = new List<string>();
private string _wasPressed = string.Empty;
public InputCompositeWidget CompositeWidget;
public class SpecialBindingInfo
{
public string BindingName;
public string TooltipText;
}
/// <summary>
/// These bindings get ignored by the widget and can only be entered by SetBinding() via the contextmenu from the InputCompositeWidget
/// </summary>
public static readonly SpecialBindingInfo[] SpecialBindings = {
new SpecialBindingInfo { BindingName = "Escape", TooltipText = "Binds the Escape key" },
new SpecialBindingInfo { BindingName = "WMouse L", TooltipText = "Binds the left mouse button"},
new SpecialBindingInfo { BindingName = "WMouse M", TooltipText = "Binds the middle mouse button"},
new SpecialBindingInfo { BindingName = "WMouse R", TooltipText = "Binds the right mouse button"},
new SpecialBindingInfo { BindingName = "WMouse 1", TooltipText = "Binds the mouse auxiliary button 1" },
new SpecialBindingInfo { BindingName = "WMouse 2", TooltipText = "Binds the mouse auxiliary button 2" },
};
public InputWidget()
{
ContextMenu = new ContextMenu();
_timer.Tick += Timer_Tick;
ClearBindings();
AutoTab = true;
Cursor = Cursors.Arrow;
}
public bool AutoTab { get; set; }
public string WidgetName { get; set; }
public string Bindings
{
get
{
return Text;
}
set
{
ClearBindings();
var newBindings = value.Trim().Split(',');
_bindings.AddRange(newBindings);
UpdateLabel();
}
}
[DllImport("user32")]
private static extern bool HideCaret(IntPtr hWnd);
protected override void OnMouseClick(MouseEventArgs e)
{
HideCaret(Handle);
base.OnMouseClick(e);
}
public void ClearAll()
{
ClearBindings();
Clear();
}
private void ClearBindings()
{
_bindings.Clear();
}
protected override void OnEnter(EventArgs e)
{
_timer.Start();
_wasPressed = Input.Instance.GetNextBindEvent();
BackColor = Color.FromArgb(unchecked((int)0xFFC0FFFF)); // Color.LightCyan is too light on Windows 8, this is a bit darker
}
protected override void OnLeave(EventArgs e)
{
_timer.Stop();
UpdateLabel();
BackColor = SystemColors.Window;
base.OnLeave(e);
}
private void Timer_Tick(object sender, EventArgs e)
{
ReadKeys();
}
public void EraseMappings()
{
ClearBindings();
Text = string.Empty;
}
/// <summary>
/// sets a binding manually. This may not be implemented quite right.
/// </summary>
public void SetBinding(string bindingStr)
{
_bindings.Add(bindingStr);
UpdateLabel();
Increment();
}
/// <summary>
/// Poll input events and apply processing related to accepting that as a binding
/// </summary>
private void ReadKeys()
{
Input.Instance.Update();
var bindingStr = Input.Instance.GetNextBindEvent();
if (!string.IsNullOrEmpty(_wasPressed) && bindingStr == _wasPressed)
{
return;
}
if (bindingStr != null)
{
//has special meaning for the binding UI system (clear it).
//you can set it through the special bindings dropdown menu
if (bindingStr == "Escape")
{
EraseMappings();
Increment();
return;
}
//seriously, we refuse to allow you to bind this to anything else.
if (bindingStr == "Alt+F4")
{
return;
}
//ignore special bindings
foreach(var spec in SpecialBindings)
if(spec.BindingName == bindingStr)
return;
if (!IsDuplicate(bindingStr))
{
if (AutoTab)
{
ClearBindings();
}
_bindings.Add(bindingStr);
}
_wasPressed = bindingStr;
UpdateLabel();
Increment();
}
}
private bool IsDuplicate(string binding)
{
return _bindings.FirstOrDefault(x => x == binding) != null;
}
protected override void OnKeyUp(KeyEventArgs e)
{
if (e.KeyCode == Keys.F4 && e.Modifiers == Keys.Alt)
{
base.OnKeyUp(e);
}
_wasPressed = string.Empty;
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.F4 && e.Modifiers == Keys.Alt)
{
base.OnKeyDown(e);
return;
}
e.Handled = true;
}
// Advances to the next widget depending on the autotab setting
public void Increment()
{
if (AutoTab)
{
CompositeWidget.TabNext();
}
}
public void Decrement()
{
if (AutoTab)
{
Parent.SelectNextControl(this, false, true, true, true);
}
}
public void UpdateLabel()
{
Text = string.Join(",", _bindings.Where(str => !string.IsNullOrWhiteSpace(str)));
CompositeWidget.RefreshTooltip();
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
e.Handled = true;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0201: // WM_LBUTTONDOWN
Focus();
return;
case 0x0203: // WM_LBUTTONDBLCLK
case 0x0204: // WM_RBUTTONDOWN
case 0x0205: // WM_RBUTTONUP
case 0x0206: // WM_RBUTTONDBLCLK
return;
}
base.WndProc(ref m);
}
protected override void OnMouseWheel(MouseEventArgs e)
{
if (e.Delta > 0)
{
Decrement();
}
else
{
Increment();
}
base.OnMouseWheel(e);
}
protected override void OnGotFocus(EventArgs e)
{
HideCaret(Handle);
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
return !(keyData.ToString() == "F4" || keyData.ToString().Contains("Alt"));
}
}
}

View File

@ -1,128 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class EditCommentsForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditCommentsForm));
this.Cancel = new System.Windows.Forms.Button();
this.OK = new System.Windows.Forms.Button();
this.CommentGrid = new System.Windows.Forms.DataGridView();
this.Comment = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.SaveBtn = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.CommentGrid)).BeginInit();
this.SuspendLayout();
//
// Cancel
//
this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel.Location = new System.Drawing.Point(399, 267);
this.Cancel.Name = "Cancel";
this.Cancel.Size = new System.Drawing.Size(60, 23);
this.Cancel.TabIndex = 0;
this.Cancel.Text = "&Cancel";
this.Cancel.UseVisualStyleBackColor = true;
this.Cancel.Click += new System.EventHandler(this.Cancel_Click);
//
// OK
//
this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.OK.Location = new System.Drawing.Point(333, 267);
this.OK.Name = "OK";
this.OK.Size = new System.Drawing.Size(60, 23);
this.OK.TabIndex = 1;
this.OK.Text = "&Ok";
this.OK.UseVisualStyleBackColor = true;
this.OK.Click += new System.EventHandler(this.OK_Click);
//
// CommentGrid
//
this.CommentGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.CommentGrid.BackgroundColor = System.Drawing.SystemColors.ControlLight;
this.CommentGrid.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
this.CommentGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.CommentGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Comment});
this.CommentGrid.Location = new System.Drawing.Point(12, 12);
this.CommentGrid.Name = "CommentGrid";
this.CommentGrid.Size = new System.Drawing.Size(447, 249);
this.CommentGrid.TabIndex = 2;
this.CommentGrid.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.OnColumnHeaderMouseClick);
//
// Comment
//
this.Comment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.Comment.HeaderText = "Comment";
this.Comment.MaxInputLength = 512;
this.Comment.MinimumWidth = 100;
this.Comment.Name = "Comment";
//
// SaveBtn
//
this.SaveBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.SaveBtn.Location = new System.Drawing.Point(12, 267);
this.SaveBtn.Name = "SaveBtn";
this.SaveBtn.Size = new System.Drawing.Size(75, 23);
this.SaveBtn.TabIndex = 3;
this.SaveBtn.Text = "&Save";
this.SaveBtn.UseVisualStyleBackColor = true;
this.SaveBtn.Click += new System.EventHandler(this.SaveBtn_Click);
//
// EditCommentsForm
//
this.AcceptButton = this.OK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel;
this.ClientSize = new System.Drawing.Size(471, 302);
this.Controls.Add(this.SaveBtn);
this.Controls.Add(this.CommentGrid);
this.Controls.Add(this.OK);
this.Controls.Add(this.Cancel);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(188, 121);
this.Name = "EditCommentsForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Edit Comments";
this.Load += new System.EventHandler(this.EditCommentsForm_Load);
((System.ComponentModel.ISupportInitialize)(this.CommentGrid)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button Cancel;
private System.Windows.Forms.Button OK;
private System.Windows.Forms.DataGridView CommentGrid;
private System.Windows.Forms.DataGridViewTextBoxColumn Comment;
private System.Windows.Forms.Button SaveBtn;
}
}

View File

@ -1,113 +0,0 @@
using System;
using System.ComponentModel;
using System.Linq;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
public partial class EditCommentsForm : Form
{
private IMovie _selectedMovie;
private string _lastHeaderClicked;
private bool _sortReverse;
public EditCommentsForm()
{
InitializeComponent();
_lastHeaderClicked = string.Empty;
_sortReverse = false;
}
public bool ForceReadWrite { get; set; }
private void EditCommentsForm_Load(object sender, EventArgs e)
{
if (!ForceReadWrite && Global.MovieSession.ReadOnly)
{
CommentGrid.Columns[0].ReadOnly = true;
Text = "View Comments";
}
if (CommentGrid.Rows.Count > 8)
{
var x = Height + ((CommentGrid.Rows.Count - 8) * 21);
Height = x < 600 ? x : 600;
}
}
private void Save()
{
_selectedMovie.Comments.Clear();
for (int i = 0; i < CommentGrid.Rows.Count - 1; i++)
{
var c = CommentGrid.Rows[i].Cells[0];
_selectedMovie.Comments.Add(c.Value.ToString());
}
_selectedMovie.Save();
}
public void GetMovie(IMovie m)
{
_selectedMovie = m;
if (!m.Comments.Any())
{
return;
}
for (int i = 0; i < m.Comments.Count; i++)
{
CommentGrid.Rows.Add();
var c = CommentGrid.Rows[i].Cells[0];
c.Value = m.Comments[i];
}
}
private void Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void OK_Click(object sender, EventArgs e)
{
Save();
Close();
}
private void SaveBtn_Click(object sender, EventArgs e)
{
Save();
}
private void OnColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
SortColumn(CommentGrid.Columns[e.ColumnIndex]);
}
private void SortColumn(DataGridViewColumn e)
{
ListSortDirection _direction;
DataGridViewColumn _column = e;
if (_lastHeaderClicked != _column.Name)
{
_sortReverse = false;
}
if (!_sortReverse)
{
_direction = ListSortDirection.Ascending;
}
else
{
_direction = ListSortDirection.Descending;
}
CommentGrid.Sort(_column, _direction);
_lastHeaderClicked = _column.Name;
_sortReverse = !_sortReverse;
CommentGrid.Refresh();
}
}
}

View File

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

View File

@ -1,185 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class EditSubtitlesForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditSubtitlesForm));
this.Cancel = new System.Windows.Forms.Button();
this.OK = new System.Windows.Forms.Button();
this.SubGrid = new System.Windows.Forms.DataGridView();
this.Frame = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.X = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Y = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Length = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.DispColor = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Message = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Export = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.SubGrid)).BeginInit();
this.SuspendLayout();
//
// Cancel
//
this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel.Location = new System.Drawing.Point(485, 216);
this.Cancel.Name = "Cancel";
this.Cancel.Size = new System.Drawing.Size(75, 23);
this.Cancel.TabIndex = 0;
this.Cancel.Text = "&Cancel";
this.Cancel.UseVisualStyleBackColor = true;
this.Cancel.Click += new System.EventHandler(this.Cancel_Click);
//
// OK
//
this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.OK.Location = new System.Drawing.Point(404, 216);
this.OK.Name = "OK";
this.OK.Size = new System.Drawing.Size(75, 23);
this.OK.TabIndex = 1;
this.OK.Text = "&Ok";
this.OK.UseVisualStyleBackColor = true;
this.OK.Click += new System.EventHandler(this.OK_Click);
//
// SubGrid
//
this.SubGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.SubGrid.BackgroundColor = System.Drawing.SystemColors.ControlLight;
this.SubGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.SubGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Frame,
this.X,
this.Y,
this.Length,
this.DispColor,
this.Message});
this.SubGrid.Location = new System.Drawing.Point(12, 12);
this.SubGrid.Name = "SubGrid";
this.SubGrid.Size = new System.Drawing.Size(548, 198);
this.SubGrid.TabIndex = 2;
this.SubGrid.DefaultValuesNeeded += new System.Windows.Forms.DataGridViewRowEventHandler(this.SubGrid_DefaultValuesNeeded);
this.SubGrid.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.SubGrid_MouseDoubleClick);
//
// Frame
//
this.Frame.HeaderText = "Frame";
this.Frame.MaxInputLength = 7;
this.Frame.Name = "Frame";
this.Frame.ToolTipText = "The first frame the subtitle will be displayed (integer)";
this.Frame.Width = 75;
//
// X
//
this.X.HeaderText = "X";
this.X.MaxInputLength = 3;
this.X.Name = "X";
this.X.ToolTipText = "Screen coordinate (absolute)";
this.X.Width = 30;
//
// Y
//
this.Y.HeaderText = "Y";
this.Y.MaxInputLength = 3;
this.Y.Name = "Y";
this.Y.ToolTipText = "Screen coordinate (absolute)";
this.Y.Width = 30;
//
// Length
//
this.Length.HeaderText = "Length";
this.Length.MaxInputLength = 5;
this.Length.Name = "Length";
this.Length.ToolTipText = "How long subtitle will be displayed";
this.Length.Width = 50;
//
// DispColor
//
this.DispColor.HeaderText = "Color";
this.DispColor.MaxInputLength = 8;
this.DispColor.Name = "DispColor";
this.DispColor.ToolTipText = "Color of subtitle text";
this.DispColor.Width = 60;
//
// Message
//
this.Message.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
this.Message.HeaderText = "Message";
this.Message.MaxInputLength = 255;
this.Message.MinimumWidth = 25;
this.Message.Name = "Message";
this.Message.ToolTipText = "What will be displayed";
//
// Export
//
this.Export.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.Export.Location = new System.Drawing.Point(12, 216);
this.Export.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.Export.Name = "Export";
this.Export.Size = new System.Drawing.Size(94, 23);
this.Export.TabIndex = 3;
this.Export.Text = "&Export to SubRip";
this.Export.UseVisualStyleBackColor = true;
this.Export.Click += new System.EventHandler(this.Export_Click);
//
// EditSubtitlesForm
//
this.AcceptButton = this.OK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel;
this.ClientSize = new System.Drawing.Size(572, 251);
this.Controls.Add(this.Export);
this.Controls.Add(this.SubGrid);
this.Controls.Add(this.OK);
this.Controls.Add(this.Cancel);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(188, 121);
this.Name = "EditSubtitlesForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Edit Subtitles";
this.Load += new System.EventHandler(this.EditSubtitlesForm_Load);
((System.ComponentModel.ISupportInitialize)(this.SubGrid)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Button Cancel;
private System.Windows.Forms.Button OK;
private System.Windows.Forms.DataGridView SubGrid;
private System.Windows.Forms.Button Export;
private System.Windows.Forms.DataGridViewTextBoxColumn Frame;
private System.Windows.Forms.DataGridViewTextBoxColumn X;
private System.Windows.Forms.DataGridViewTextBoxColumn Y;
private System.Windows.Forms.DataGridViewTextBoxColumn Length;
private System.Windows.Forms.DataGridViewTextBoxColumn DispColor;
private System.Windows.Forms.DataGridViewTextBoxColumn Message;
}
}

View File

@ -1,230 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Globalization;
using BizHawk.Client.Common;
using System.IO;
using System.Text;
namespace BizHawk.Client.MultiHawk
{
public partial class EditSubtitlesForm : Form
{
public bool ReadOnly;
private IMovie _selectedMovie;
public EditSubtitlesForm()
{
InitializeComponent();
}
private void EditSubtitlesForm_Load(object sender, EventArgs e)
{
if (ReadOnly)
{
//Set all columns to read only
for (int x = 0; x < SubGrid.Columns.Count; x++)
SubGrid.Columns[x].ReadOnly = true;
Text = "View Subtitles";
}
if (SubGrid.Rows.Count > 8)
{
var x = Height + ((SubGrid.Rows.Count - 8) * 21);
Height = x < 600 ? x : 600;
}
}
private void Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void ShowError(int row, int column)
{
var c = SubGrid.Rows[row].Cells[column];
var error = "Unable to parse value: " + c.Value;
var caption = "Parse Error Row " + row + " Column " + column;
MessageBox.Show(error, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
private void OK_Click(object sender, EventArgs e)
{
if (!ReadOnly)
{
_selectedMovie.Subtitles.Clear();
for (int i = 0; i < SubGrid.Rows.Count - 1; i++)
{
var s = new Subtitle();
var c = SubGrid.Rows[i].Cells[0];
try { s.Frame = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 0); return; }
c = SubGrid.Rows[i].Cells[1];
try { s.X = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 1); return; }
c = SubGrid.Rows[i].Cells[2];
try { s.Y = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 2); return; }
c = SubGrid.Rows[i].Cells[3];
try { s.Duration = int.Parse(c.Value.ToString()); }
catch { ShowError(i, 3); return; }
c = SubGrid.Rows[i].Cells[4];
try { s.Color = uint.Parse(c.Value.ToString(), NumberStyles.HexNumber); }
catch { ShowError(i, 4); return; }
try { c = SubGrid.Rows[i].Cells[5]; }
catch { ShowError(i, 5); return; }
s.Message = c.Value.ToString();
_selectedMovie.Subtitles.Add(s);
}
_selectedMovie.Save();
}
Close();
}
public void GetMovie(IMovie m)
{
_selectedMovie = m;
var subs = new SubtitleList();
subs.AddRange(m.Subtitles);
for (int x = 0; x < subs.Count; x++)
{
var s = subs[x];
SubGrid.Rows.Add();
var c = SubGrid.Rows[x].Cells[0];
c.Value = s.Frame;
c = SubGrid.Rows[x].Cells[1];
c.Value = s.X;
c = SubGrid.Rows[x].Cells[2];
c.Value = s.Y;
c = SubGrid.Rows[x].Cells[3];
c.Value = s.Duration;
c = SubGrid.Rows[x].Cells[4];
c.Value = String.Format("{0:X8}", s.Color);
c.Style.BackColor = Color.FromArgb((int)s.Color);
c = SubGrid.Rows[x].Cells[5];
c.Value = s.Message;
}
}
private void ChangeRow(Subtitle s, int index)
{
if (index >= SubGrid.Rows.Count) return;
var c = SubGrid.Rows[index].Cells[0];
c.Value = s.Frame;
c = SubGrid.Rows[index].Cells[1];
c.Value = s.X;
c = SubGrid.Rows[index].Cells[2];
c.Value = s.Y;
c = SubGrid.Rows[index].Cells[3];
c.Value = s.Duration;
c = SubGrid.Rows[index].Cells[4];
c.Value = String.Format("{0:X8}", s.Color);
c.Style.BackColor = Color.FromArgb((int)s.Color);
c = SubGrid.Rows[index].Cells[5];
c.Value = s.Message;
}
private Subtitle GetRow(int index)
{
if (index >= SubGrid.Rows.Count) return new Subtitle();
var s = new Subtitle();
var c = SubGrid.Rows[index].Cells[0];
//Empty catch because it should default to subtitle default value
try { s.Frame = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[1];
try { s.X = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[2];
try { s.Y = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[3];
try { s.Duration = int.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[4];
try { s.Color = uint.Parse(c.Value.ToString()); }
catch { }
c = SubGrid.Rows[index].Cells[5];
try { s.Message = c.Value.ToString(); }
catch { }
_selectedMovie.Subtitles.Add(s);
return s;
}
private void SubGrid_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (ReadOnly) return;
var c = SubGrid.SelectedRows;
if (c.Count == 0) return;
var s = new SubtitleMaker {Sub = GetRow(c[0].Index)};
if (s.ShowDialog() == DialogResult.OK)
{
ChangeRow(s.Sub, SubGrid.SelectedRows[0].Index);
}
}
private void Export_Click(object sender, EventArgs e)
{
// Get file to save as
var form = new SaveFileDialog();
form.AddExtension = true;
form.Filter = "SubRip Files (*.srt)|*.srt|All files (*.*)|*.*";
var result = form.ShowDialog();
var fileName = form.FileName;
form.Dispose();
if (result != System.Windows.Forms.DialogResult.OK)
return;
// Fetch fps
var system = _selectedMovie.HeaderEntries[HeaderKeys.PLATFORM];
var pal = _selectedMovie.HeaderEntries.ContainsKey(HeaderKeys.PAL)
&& _selectedMovie.HeaderEntries[HeaderKeys.PAL] == "1";
var pfr = new PlatformFrameRates();
double fps = 1;
try
{
fps = pfr[system, pal];
}
catch
{
MessageBox.Show(
"Could not determine movie fps, export failed.",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error
);
return;
}
// Create string and write to file
var str = _selectedMovie.Subtitles.ToSubRip(fps);
File.WriteAllText(fileName, str);
// Display success
MessageBox.Show(
string.Format("Subtitles succesfully exported to {0}.", fileName),
"Success"
);
}
private void SubGrid_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e)
{
e.Row.Cells["Frame"].Value = 0;
e.Row.Cells["X"].Value = 0;
e.Row.Cells["Y"].Value = 0;
e.Row.Cells["Length"].Value = 0;
e.Row.Cells["DispColor"].Value = "FFFFFFFF";
}
}
}

View File

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

View File

@ -1,22 +0,0 @@
using System;
using System.Drawing;
namespace BizHawk.Client.MultiHawk
{
/// <summary>
/// Used for the sorting of the moviedetails in PlayMovie.cs
/// </summary>
public class MovieDetails
{
public string Keys { get; set; }
public string Values { get; set; }
public Color BackgroundColor { get; set; }
public MovieDetails()
{
Keys = string.Empty;
Values = string.Empty;
BackgroundColor = Color.White;
}
}
}

View File

@ -1,259 +0,0 @@
namespace BizHawk.Client.MultiHawk
{
partial class SubtitleMaker
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubtitleMaker));
this.OK = new System.Windows.Forms.Button();
this.Cancel = new System.Windows.Forms.Button();
this.Message = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.YNumeric = new System.Windows.Forms.NumericUpDown();
this.XNumeric = new System.Windows.Forms.NumericUpDown();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.DurationNumeric = new System.Windows.Forms.NumericUpDown();
this.label4 = new System.Windows.Forms.Label();
this.ColorPanel = new System.Windows.Forms.Panel();
this.label5 = new System.Windows.Forms.Label();
this.colorDialog1 = new System.Windows.Forms.ColorDialog();
this.FrameNumeric = new System.Windows.Forms.NumericUpDown();
this.label6 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.YNumeric)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.XNumeric)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.DurationNumeric)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.FrameNumeric)).BeginInit();
this.SuspendLayout();
//
// OK
//
this.OK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.OK.Location = new System.Drawing.Point(267, 164);
this.OK.Name = "OK";
this.OK.Size = new System.Drawing.Size(75, 23);
this.OK.TabIndex = 0;
this.OK.Text = "&Save";
this.OK.UseVisualStyleBackColor = true;
this.OK.Click += new System.EventHandler(this.OK_Click);
//
// Cancel
//
this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.Cancel.Location = new System.Drawing.Point(348, 164);
this.Cancel.Name = "Cancel";
this.Cancel.Size = new System.Drawing.Size(75, 23);
this.Cancel.TabIndex = 1;
this.Cancel.Text = "&Cancel";
this.Cancel.UseVisualStyleBackColor = true;
this.Cancel.Click += new System.EventHandler(this.Cancel_Click);
//
// Message
//
this.Message.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.Message.Location = new System.Drawing.Point(12, 69);
this.Message.MaxLength = 512;
this.Message.Name = "Message";
this.Message.Size = new System.Drawing.Size(416, 20);
this.Message.TabIndex = 15;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 50);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(50, 13);
this.label1.TabIndex = 3;
this.label1.Text = "Message";
//
// YNumeric
//
this.YNumeric.Location = new System.Drawing.Point(15, 130);
this.YNumeric.Maximum = new decimal(new int[] {
240,
0,
0,
0});
this.YNumeric.Name = "YNumeric";
this.YNumeric.Size = new System.Drawing.Size(56, 20);
this.YNumeric.TabIndex = 25;
//
// XNumeric
//
this.XNumeric.Location = new System.Drawing.Point(15, 106);
this.XNumeric.Maximum = new decimal(new int[] {
320,
0,
0,
0});
this.XNumeric.Name = "XNumeric";
this.XNumeric.Size = new System.Drawing.Size(56, 20);
this.XNumeric.TabIndex = 20;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(77, 108);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(53, 13);
this.label2.TabIndex = 6;
this.label2.Text = "X position";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(75, 133);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(53, 13);
this.label3.TabIndex = 7;
this.label3.Text = "Y position";
//
// DurationNumeric
//
this.DurationNumeric.Location = new System.Drawing.Point(153, 108);
this.DurationNumeric.Maximum = new decimal(new int[] {
9999,
0,
0,
0});
this.DurationNumeric.Name = "DurationNumeric";
this.DurationNumeric.Size = new System.Drawing.Size(56, 20);
this.DurationNumeric.TabIndex = 30;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(215, 108);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(47, 13);
this.label4.TabIndex = 9;
this.label4.Text = "Duration";
//
// ColorPanel
//
this.ColorPanel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.ColorPanel.Location = new System.Drawing.Point(153, 131);
this.ColorPanel.Name = "ColorPanel";
this.ColorPanel.Size = new System.Drawing.Size(56, 19);
this.ColorPanel.TabIndex = 35;
this.ColorPanel.TabStop = true;
this.ColorPanel.Click += new System.EventHandler(this.ColorPanel_DoubleClick);
this.ColorPanel.DoubleClick += new System.EventHandler(this.ColorPanel_DoubleClick);
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(215, 133);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(31, 13);
this.label5.TabIndex = 11;
this.label5.Text = "Color";
//
// FrameNumeric
//
this.FrameNumeric.Location = new System.Drawing.Point(78, 19);
this.FrameNumeric.Maximum = new decimal(new int[] {
999999,
0,
0,
0});
this.FrameNumeric.Name = "FrameNumeric";
this.FrameNumeric.Size = new System.Drawing.Size(70, 20);
this.FrameNumeric.TabIndex = 10;
this.FrameNumeric.ThousandsSeparator = true;
this.FrameNumeric.Value = new decimal(new int[] {
1,
0,
0,
0});
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(12, 21);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(36, 13);
this.label6.TabIndex = 13;
this.label6.Text = "Frame";
//
// SubtitleMaker
//
this.AcceptButton = this.OK;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel;
this.ClientSize = new System.Drawing.Size(435, 199);
this.Controls.Add(this.label6);
this.Controls.Add(this.FrameNumeric);
this.Controls.Add(this.label5);
this.Controls.Add(this.ColorPanel);
this.Controls.Add(this.label4);
this.Controls.Add(this.DurationNumeric);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.XNumeric);
this.Controls.Add(this.YNumeric);
this.Controls.Add(this.label1);
this.Controls.Add(this.Message);
this.Controls.Add(this.Cancel);
this.Controls.Add(this.OK);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(272, 225);
this.Name = "SubtitleMaker";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Subtitle Maker";
this.Load += new System.EventHandler(this.SubtitleMaker_Load);
((System.ComponentModel.ISupportInitialize)(this.YNumeric)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.XNumeric)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.DurationNumeric)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.FrameNumeric)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button OK;
private System.Windows.Forms.Button Cancel;
private System.Windows.Forms.TextBox Message;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.NumericUpDown YNumeric;
private System.Windows.Forms.NumericUpDown XNumeric;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.NumericUpDown DurationNumeric;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Panel ColorPanel;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.ColorDialog colorDialog1;
private System.Windows.Forms.NumericUpDown FrameNumeric;
private System.Windows.Forms.Label label6;
}
}

View File

@ -1,60 +0,0 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using BizHawk.Client.Common;
namespace BizHawk.Client.MultiHawk
{
public partial class SubtitleMaker : Form
{
public Subtitle Sub = new Subtitle();
public SubtitleMaker()
{
InitializeComponent();
}
public void DisableFrame()
{
FrameNumeric.Enabled = false;
}
private void Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void OK_Click(object sender, EventArgs e)
{
Sub.Frame = (int)FrameNumeric.Value;
Sub.Message = Message.Text;
Sub.X = (int)XNumeric.Value;
Sub.Y = (int)YNumeric.Value;
Sub.Duration = (int)DurationNumeric.Value;
Sub.Color = (uint)colorDialog1.Color.ToArgb();
DialogResult = DialogResult.OK;
Close();
}
private void SubtitleMaker_Load(object sender, EventArgs e)
{
FrameNumeric.Value = Sub.Frame;
Message.Text = Sub.Message;
XNumeric.Value = Sub.X;
YNumeric.Value = Sub.Y;
DurationNumeric.Value = Sub.Duration;
colorDialog1.Color = Color.FromArgb((int)Sub.Color);
ColorPanel.BackColor = colorDialog1.Color;
Message.Focus();
}
private void ColorPanel_DoubleClick(object sender, EventArgs e)
{
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
ColorPanel.BackColor = colorDialog1.Color;
}
}
}
}

View File

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

View File

@ -9,7 +9,7 @@ using System.Windows.Forms;
using BizHawk.Client.Common;
using BizHawk.Common;
using BizHawk.Client.EmuHawk;
namespace BizHawk.Client.MultiHawk
{
public partial class PlayMovie : Form