diff --git a/HexcalMC/Base/BaseFunction.cs b/HexcalMC/Base/BaseFunction.cs new file mode 100644 index 0000000..17af288 --- /dev/null +++ b/HexcalMC/Base/BaseFunction.cs @@ -0,0 +1,2959 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; + + +namespace HexcalMC.Base +{ + //========================================================================================== + //通用功能类 + public class RichTextUnit + { + public static float m_Size = 16; + public static void SetFont(RichTextBox m_RichTextBox, Color m_Color, bool bBold = false, float Size = 16) + { + m_RichTextBox.SelectionColor = m_Color; + if (bBold) + m_RichTextBox.SelectionFont = new System.Drawing.Font("微软雅黑", Size, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + else + m_RichTextBox.SelectionFont = new System.Drawing.Font("微软雅黑", Size, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + } + + public static void SetText(RichTextBox m_RichTextBox, string strText, Color m_Color, bool bBold = false, float Size = 16) + { + m_RichTextBox.Invoke(((EventHandler)delegate + { + RichTextUnit.SetFont(m_RichTextBox, m_Color, bBold, Size); + m_RichTextBox.SelectedText = strText; + })); + } + + public static void SetXmlText(RichTextBox m_RichTextBox, string strText, float Size = 16) + { + m_RichTextBox.Invoke(((EventHandler)delegate + { + int iFirstInx = strText.IndexOf(""); + + #region PARSE THROUGH TEXT DATA + for (int i = 0; i < strText.Length; i++) + { + if (i >= iFirstInx && i <= iSecondInx + 1) + { + RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + } + else + { + switch (strText[i]) + { + case '<': + { + RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + if (strText[i + 1] == '/') + { + m_RichTextBox.SelectedText = strText[i + 1].ToString(); + i++; + } + RichTextUnit.SetFont(m_RichTextBox, Color.DarkRed, false, Size); + } + break; + case '>': + { + RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + RichTextUnit.SetFont(m_RichTextBox, Color.Black, false, Size); + } + break; + case '/': + { + RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + } + break; + case '=': + { + if (strText[i + 1] == '"') + { + RichTextUnit.SetFont(m_RichTextBox, Color.Black, true, Size); + m_RichTextBox.SelectedText = "=" + '"'.ToString(); + i++; + } + } + break; + case '"': + { + RichTextUnit.SetFont(m_RichTextBox, Color.Blue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + if (strText[i - 1] == '=') + RichTextUnit.SetFont(m_RichTextBox, Color.Black, true, Size); + else + RichTextUnit.SetFont(m_RichTextBox, Color.DarkRed, false, Size); + } + break; + case '!': + { + RichTextUnit.SetFont(m_RichTextBox, Color.Green, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + } + break; + case '\r': + { + if (strText[i + 1] == '\n') + { + m_RichTextBox.SelectedText = "\r\n"; + i++; + } + } + break; + default: + m_RichTextBox.SelectedText = strText[i].ToString(); + break; + } + } + } + #endregion + + m_RichTextBox.SelectedText = Environment.NewLine; + })); + } + + public static void SetCNCText(RichTextBox m_RichTextBox, string strText, float Size = 16) + { + m_RichTextBox.Invoke(((EventHandler)delegate + { + #region PARSE THROUGH TEXT DATA + for (int i = 0; i < strText.Length; i++) + { + switch (strText[i]) + { + case '%': + RichTextUnit.SetFont(m_RichTextBox, Color.Red, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + RichTextUnit.SetFont(m_RichTextBox, Color.DeepSkyBlue, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + break; + default: + RichTextUnit.SetFont(m_RichTextBox, Color.White, false, Size); + m_RichTextBox.SelectedText = strText[i].ToString(); + break; + } + } + #endregion + })); + } + } + public class MyBase + { + #region 内存回收 + + [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] + public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize); + + /// + /// 释放内存 + /// + public static void ClearMemory() + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); + } + } + + public static void ClearMemory_PCDMIS() + { + Process[] m_Process = Process.GetProcessesByName("PCDLRN"); + for (int i = 0; i < m_Process.Length; i++) + { + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + SetProcessWorkingSetSize(m_Process[i].Handle, -1, -1); + } + } + } + + #endregion + + public static void KillSoftware(string strSoftwareName) + { + Process[] xc = Process.GetProcesses(); + try + { + foreach (Process xc1 in xc) + { + if (xc1.ProcessName.ToLower() == strSoftwareName.ToLower()) + { + xc1.Kill(); + } + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("Kill " + strSoftwareName + " Failed: " + ex.ToString()); + } + } + + #region 界面控件操作 + + /// + /// 根据指定容器和控件名字,获得控件 + /// + /// 容器 + /// 控件名字 + /// 控件 + public static object GetControlInstance(object obj, string strControlName, Form mainForm) + { + IEnumerator Controls = null; //所有控件 + Control c = null; //当前控件 + Object cResult = null; //查找结果 + if (obj.GetType() == mainForm.GetType()) //窗体 + { + Controls = mainForm.Controls.GetEnumerator(); + } + else //控件 + { + Controls = ((Control)obj).Controls.GetEnumerator(); + } + + while (Controls.MoveNext()) //遍历操作 + { + c = (Control)Controls.Current; //当前控件 + if (c.HasChildren) //当前控件是个容器 + { + cResult = GetControlInstance(c, strControlName, mainForm); //递归查找 + if (cResult == null) //当前容器中没有,跳出,继续查找 + continue; + else //找到控件,返回 + return cResult; + } + else if (c.Name == strControlName) //不是容器,同时找到控件,返回 + { + return c; + } + } + + return null; //控件不存在 + } + + public static object GetChildControl(object obj, string strControlName) + { + Control m_Ctrl = null; //当前控件 + IEnumerator Controls = ((Control)obj).Controls.GetEnumerator(); + + while (Controls.MoveNext()) + { + m_Ctrl = (Control)Controls.Current; //当前控件 + if (m_Ctrl.Name == strControlName) + { + return m_Ctrl; + } + } + + return null; //控件不存在 + } + + public static void AddDebugText(TextBox tb, string str, int length = 200) + { + try + { + TraceWriteLine(str); + string strTime = DateTime.Now.ToString("HH:mm:ss") + "--"; + tb.Text += (strTime + str); + tb.Text += "\r\n"; + tb.Select(tb.TextLength, 0); + tb.ScrollToCaret(); + + if (tb.Lines.Length > length) + { + tb.Clear(); + } + } + finally + { + } + } + + /// + /// 向RichTextBox控件中添加文本信息 + /// + /// RichTextBox控件类 + /// 要显示的文本信息内容 + /// 文本显示的颜色 + public static void AddDebugTextToRTB(RichTextBox RTB, string str, Color m_Color = new Color()) + { + try + { + TraceWriteLine(str); //将文本信息同步到debug.txt文件中 + RTB.BeginInvoke((EventHandler)delegate + { + Color SetColor = Color.Black; + if (m_Color == new Color()) + { + if (str.ToUpper().Contains("ERROR") || str.ToUpper().Contains("错误") || + str.ToUpper().Contains("出错") || str.ToUpper().Contains("EXCEPTION") || + str.ToUpper().Contains("异常") || str.ToUpper().Contains("失败")) + { + SetColor = Color.Red; + } + else if (str.ToUpper().Contains("WARNING") || str.ToUpper().Contains("警告")) + { + SetColor = Color.DarkOrange; + } + } + else + { + SetColor = m_Color; + } + + string strText = str + Environment.NewLine; //DateTime.Now.ToString("HH:mm:ss.fff") + "--" + + RTB.SelectionStart = RTB.TextLength; + if (string.IsNullOrEmpty(str)) + RichTextUnit.SetText(RTB, " " + Environment.NewLine, SetColor, false, 14); + else + RichTextUnit.SetText(RTB, strText, SetColor, false, 14); + + if (RTB.Lines.Length > 2000) + { + RTB.Select(0, RTB.TextLength / 2); + RTB.Cut(); + } + + RTB.ScrollToCaret(); + }); + } + catch + { + } + } + + /// + /// 写debug文件,记录程序过程 + /// + /// 要写入日志的内容 + public static void TraceWriteLine(string str) + { + try + { + Trace.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "--" + str); + Trace.Unindent(); + Trace.Flush(); + } + catch + { + } + } + + + public static string InputBox(string Caption, string Hint, string DefaultTxt, string btn1 = "OK", + string btn2 = "Cancel", char Strstyle = '*', bool bShowData = false) + { + if (Strstyle == '\0') + Strstyle = '*'; + Form InputForm = new Form(); + InputForm.MinimizeBox = false; + InputForm.MaximizeBox = false; + InputForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + InputForm.StartPosition = FormStartPosition.CenterScreen; + InputForm.Width = 230; + InputForm.Height = 170; + InputForm.Text = Caption; + InputForm.Font = new System.Drawing.Font("宋体", 16F, System.Drawing.FontStyle.Regular, + System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + + Label lbl = new Label(); + lbl.Text = Hint; + lbl.Left = 10; + lbl.Top = 20; + lbl.Parent = InputForm; + lbl.AutoSize = true; + TextBox tb = new TextBox(); + tb.Left = 30; + tb.Top = 45; + tb.Width = 165; + tb.Parent = InputForm; + tb.Text = DefaultTxt; + if (bShowData == false) + tb.PasswordChar = Strstyle; + tb.SelectAll(); + Button btnok = new Button(); + btnok.Left = 30; + btnok.Top = 80; + btnok.Height = 30; + btnok.Parent = InputForm; + btnok.Text = btn1; + InputForm.AcceptButton = btnok; //回车响应 + btnok.DialogResult = DialogResult.OK; + + Button btncancal = new Button(); + btncancal.Left = 120; + btncancal.Top = 80; + btncancal.Height = 30; + btncancal.Parent = InputForm; + btncancal.Text = btn2; + btncancal.DialogResult = DialogResult.Cancel; + try + { + if (InputForm.ShowDialog() == DialogResult.OK) + { + return tb.Text; + } + else + { + return null; + } + } + finally + { + InputForm.Dispose(); + } + } + + /// + /// 操作提示框,0 = 取消; 1 = 第一个按钮; 2 = 第二个按钮 + /// + /// 错误信息 + /// 标题 + /// 第一个按钮名字 + /// 第二个按钮名字 + /// 第三个按钮名字 + /// 背景颜色,默认无色,1=红色 + /// + public static int MessageBox(string strError, string Caption, string btnName1 = "YES", string btnName2 = "NO", + string btnName3 = "Cancel", int iColor = 0) + { + Form ErrorForm = new Form(); + ErrorForm.MinimizeBox = false; + ErrorForm.MaximizeBox = false; + ErrorForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + ErrorForm.StartPosition = FormStartPosition.CenterScreen; + ErrorForm.Width = 480; + ErrorForm.Height = 300; + ErrorForm.Text = Caption; + ErrorForm.Font = new System.Drawing.Font("宋体", 16F, System.Drawing.FontStyle.Regular, + System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + + TextBox tb = new TextBox(); + tb.Parent = ErrorForm; + tb.Text = strError; + tb.Multiline = true; + tb.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + tb.Location = new System.Drawing.Point(20, 20); + tb.Size = new System.Drawing.Size(440, 170); + tb.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + tb.Font = new Font("宋体", 20F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel); + if (iColor == 1) + tb.BackColor = Color.Red; + + Button btnYes = new Button(); + btnYes.Location = new System.Drawing.Point(30, 210); + btnYes.Size = new System.Drawing.Size(100, 40); + btnYes.Parent = ErrorForm; + btnYes.Text = btnName1; + + btnYes.DialogResult = DialogResult.Yes; + ErrorForm.AcceptButton = btnYes; //回车响应 + + Button btnNO = new Button(); + btnNO.Location = new System.Drawing.Point(190, 210); + btnNO.Size = new System.Drawing.Size(100, 40); + btnNO.Parent = ErrorForm; + btnNO.Text = btnName2; + btnNO.DialogResult = DialogResult.No; + ErrorForm.AcceptButton = btnNO; //回车响应 + + Button btncancal = new Button(); + btncancal.Location = new System.Drawing.Point(350, 210); + btncancal.Size = new System.Drawing.Size(100, 40); + btncancal.Parent = ErrorForm; + btncancal.Text = btnName3; + btncancal.DialogResult = DialogResult.Cancel; + ErrorForm.AcceptButton = btncancal; //回车响应 + try + { + btnYes.Select(); + switch (ErrorForm.ShowDialog()) + { + case DialogResult.Yes: return 1; + case DialogResult.No: return 2; + default: return 0; + } + } + finally + { + ErrorForm.Dispose(); + } + } + + [DllImport("User32.dll")] + private static extern bool SetCursorPos(int x, int y); + + static public void SetCursorPosXY(int dx, int dy) + { + SetCursorPos(dx, dy); + } + + static public void SetCursorPosXY(Point point) + { + System.Windows.Forms.Cursor.Position = point; + } + + #endregion + + /// + /// CopyFiles 函数 + /// + /// 源路径文件夹路径 + /// 目标文件夹路径 + /// 文件夹名称 + /// + public static int CopyFiles(string strSourceFilePath, string strDesFilePath, string strRemak) + { + try + { + if (!Directory.Exists(strDesFilePath)) + { + Directory.CreateDirectory(strDesFilePath); + } + + DirectoryInfo sDir = new DirectoryInfo(strSourceFilePath); + FileInfo[] fileArray = sDir.GetFiles(); + foreach (FileInfo file in fileArray) + { + file.CopyTo(strDesFilePath + "\\" + file.Name, true); + } + + System.Windows.Forms.MessageBox.Show("传输" + strRemak + "文件夹中的所有文件成功! ", "提示", MessageBoxButtons.OK, + MessageBoxIcon.Information); + return 1; + } + catch (Exception ex) + { + System.Windows.Forms.MessageBox.Show("传输" + strRemak + "文件夹中的文件错误!原因: " + ex.ToString(), "提示", + MessageBoxButtons.OK, MessageBoxIcon.Information); + return 0; + } + } + } + + public class HardwareInfoBase + { + /// 获取指定驱动器的空间总大小(单位为B) ,只需输入代表驱动器的字母即可 + public static long GetHardDiskSpace(string str_HardDiskName) + { + long totalSize = new long(); + str_HardDiskName = str_HardDiskName + ":\\"; + System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives(); + foreach (System.IO.DriveInfo drive in drives) + { + if (drive.Name == str_HardDiskName) + { + totalSize = drive.TotalSize; + break; + } + } + + return totalSize; + } + + /// 获取指定驱动器的剩余空间总大小(单位为B) ,只需输入代表驱动器的字母即可 + public static long GetHardDiskFreeSpace(string str_HardDiskName) + { + long freeSpace = new long(); + str_HardDiskName = str_HardDiskName + ":\\"; + System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives(); + foreach (System.IO.DriveInfo drive in drives) + { + if (drive.Name == str_HardDiskName) + { + freeSpace = drive.TotalFreeSpace; + break; + } + } + + return freeSpace; + } + + /// 获取指定驱动器的剩余空间总大小(单位为K) ,只需输入代表驱动器的字母即可 + public static long GetHardDiskFreeSpace_K(string str_HardDiskName) + { + return GetHardDiskFreeSpace(str_HardDiskName) / 1024; + } + + /// 获取指定驱动器的剩余空间总大小(单位为M) ,只需输入代表驱动器的字母即可 + public static long GetHardDiskFreeSpace_M(string str_HardDiskName) + { + return GetHardDiskFreeSpace_K(str_HardDiskName) / 1024; + } + + /// 获取指定驱动器的剩余空间总大小(单位为G) ,只需输入代表驱动器的字母即可 + public static long GetHardDiskFreeSpace_G(string str_HardDiskName) + { + return GetHardDiskFreeSpace_M(str_HardDiskName) / 1024; + } + } + + //==================================================================================================FileIni + //Ini 文件操作类 + public class FileIni + { + [DllImport("kernel32.dll")] + public static extern IntPtr _lopen(string lpPathName, int iReadWrite); + + [DllImport("kernel32.dll")] + public static extern bool CloseHandle(IntPtr hObject); + + public const int OF_READWRITE = 2; + public const int OF_SHARE_DENY_NONE = 0x40; + public static readonly IntPtr HFILE_ERROR = new IntPtr(-1); + + //判断文件是否被占用 占用=true 未占用 = false + public static bool isFileOccupied(string path) + { + if (!File.Exists(path)) + return true; + IntPtr vHandle = _lopen(path, OF_READWRITE | OF_SHARE_DENY_NONE); + if (vHandle == HFILE_ERROR) + return true; + CloseHandle(vHandle); + return false; + } + + + [DllImport("kernel32")] + private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, + int size, string filePath); + + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); + + [DllImport("kernel32")] + private static extern int GetPrivateProfileInt(string section, string key, int def, string filePath); + + public static bool isFileExists(string path) + { + if (!(File.Exists(path))) + { + MessageBox.Show("文件:" + path + "不存在", "ini文件不存在"); + return false; + } + + return true; + } + + //=====================//=====================//=====================Write data + + #region 写INI参数 + + /// + /// 对ini文件进行写操作 + /// + /// ini文件路径 + /// 配置节 + /// 键名 + /// 要写入的string字符串 + public static void WriteString(string path, string section, string key, string value) + { + // section=配置节,key=键名,value=键值,path=路径 + WritePrivateProfileString(section, key, value, path); + } + + public static void WriteInt(string path, string section, string key, int value = 0) + { + string strRead = ReadString(path, section, key); + string[] strArr = strRead.Split(new char[] { ';' }); + string strNote = ";"; + string strWrite; + if (strArr.Length > 1) //保留原有注释 + { + for (int i = 1; i < strArr.Length; i++) + strNote += strArr[i]; + strWrite = value.ToString() + strNote; + } + else + { + strWrite = value.ToString(); + } + + WritePrivateProfileString(section, key, strWrite, path); + } + + public static void WriteDouble(string path, string section, string key, double value = 0) + { + string strRead = ReadString(path, section, key); + string[] strArr = strRead.Split(new char[] { ';' }); + string strNote = ";"; + string strWrite; + if (strArr.Length > 1) //保留原有注释 + { + for (int i = 1; i < strArr.Length; i++) + strNote += strArr[i]; + strWrite = value.ToString() + strNote; + } + else + { + strWrite = value.ToString(); + } + + WritePrivateProfileString(section, key, strWrite, path); + } + + public static void WriteBool(string path, string section, string key, bool value = false) + { + string strValue = (value ? "1" : "0"); + string strRead = ReadString(path, section, key); + string[] strArr = strRead.Split(new char[] { ';' }); + string strNote = ";"; + string strWrite; + if (strArr.Length > 1) //保留原有注释 + { + for (int i = 1; i < strArr.Length; i++) + strNote += strArr[i]; + strWrite = strValue + strNote; + } + else + { + strWrite = strValue; + } + + WritePrivateProfileString(section, key, strWrite, path); + } + + #endregion + + //=====================//=====================//=====================Read data + + #region 读INI参数 + + /// + /// 从ini配置文件中读取字符串 + /// + /// ini文件路径 + /// 配置节名称 + /// 键名 + /// 要读取的string类型内容 + public static string ReadString(string path, string section, string key) + { + // 每次从ini中读取多少字节 // section=配置节,key=键名,temp=上面,path=路径 + System.Text.StringBuilder temp = new System.Text.StringBuilder(255); + GetPrivateProfileString(section, key, "", temp, 255, path); + String str = temp.ToString(); + string[] strArr = str.Split(new char[] { ';' }); + string strRead = ""; + if (strArr.Length > 0) + { + strRead = strArr[0]; + } + + return strRead; + } + + /// + /// 从ini配置文件中读取Int类型 + /// + /// ini文件路径 + /// 配置节名称 + /// 键名 + /// 读不到时默认返回值:0 + /// 要读取的Int类型数据 + public static int ReadInt(string path, string section, string key, int defValue = 0) + { + return GetPrivateProfileInt(section, key, defValue, path); + } + + public static double ReadDouble(string path, string section, string key, double defValue = 0) + { + System.Text.StringBuilder temp = new System.Text.StringBuilder(255); + GetPrivateProfileString(section, key, defValue.ToString(), temp, 255, path); + String str = temp.ToString(); + string[] strArr = str.Split(new char[] { ';' }); + double ReData; + if (strArr.Length > 0) + { + ReData = Convert.ToDouble(strArr[0]); + } + else + { + ReData = defValue; + } + + return ReData; + } + + public static bool ReadBool(string path, string section, string key, int defValue = 0) + { + int val = GetPrivateProfileInt(section, key, defValue, path); + if (val != 0) + return true; + else + return false; + } + + #endregion + } + + + //==================================================================================================SoundBase + /// + /// 声音播放类 + /// + public class SoundBase + { + //public static WMPLib.WindowsMediaPlayer WMPlayer = new WMPLib.WindowsMediaPlayer(); + ////方法 1 + //public static void OpenWinMediaPlayer(string FileName) + //{ + // if (!System.IO.File.Exists(FileName)) + // { + // MessageBox.Show("File does not exist!"); + // return; + // } + // WMPlayer.URL = FileName; + //} + + //public static void OpenWinMediaPlayer(WMPLib.WindowsMediaPlayer WinMediaPlayer, string FileName) + //{ + // if (!System.IO.File.Exists(FileName)) + // { + // MessageBox.Show("File does not exist!"); + // return; + // } + // WinMediaPlayer.URL = FileName; + //} + + //public static void OpenWinMediaPlayerDialogFile() + //{ + // OpenFileDialog FileDialog = new OpenFileDialog(); + // FileDialog.AddExtension = true; + // FileDialog.CheckFileExists = true; + // FileDialog.CheckPathExists = true; + // //the next sentence must be in single line + // FileDialog.Filter = "WAV文件(*.wav)|*.wav|MP3文件(*.mp3)|*.mp3|VCD文件(*.dat)|*.dat|Audio文件(*.avi)|*.avi|所有文件 (*.*)|*.*"; + // FileDialog.DefaultExt = "*.mp3"; + // if (FileDialog.ShowDialog() == DialogResult.OK) + // { + // WMPlayer.URL = FileDialog.FileName; + // } + //} + + //public static void OpenWinMediaPlayerDialogFile(WMPLib.WindowsMediaPlayer WinMediaPlayer) + //{ + // OpenFileDialog FileDialog = new OpenFileDialog(); + // FileDialog.AddExtension = true; + // FileDialog.CheckFileExists = true; + // FileDialog.CheckPathExists = true; + // //the next sentence must be in single line + // FileDialog.Filter = "WAV文件(*.wav)|*.wav|MP3文件(*.mp3)|*.mp3|VCD文件(*.dat)|*.dat|Audio文件(*.avi)|*.avi|所有文件 (*.*)|*.*"; + // FileDialog.DefaultExt = "*.mp3"; + // if (FileDialog.ShowDialog() == DialogResult.OK) + // { + // WinMediaPlayer.URL = FileDialog.FileName; + // } + //} + + //方法 2 + public static void sndPlayerPlay(string FileName) + { + if (!System.IO.File.Exists(FileName)) + { + MessageBox.Show("File does not exist!"); + return; + } + + System.Media.SoundPlayer sndPlayer = new System.Media.SoundPlayer(FileName); + sndPlayer.Load(); + sndPlayer.Play(); + } + + //方法 3 + public static void SpVoicePlay(string FileName) + { + //if (!System.IO.File.Exists(FileName)) + //{ + // MessageBox.Show("File does not exist!"); + // return; + //} + //SpeechLib.SpVoiceClass pp = new SpeechLib.SpVoiceClass(); + //SpeechLib.SpFileStreamClass spFs = new SpeechLib.SpFileStreamClass(); + //spFs.Open(FileName, SpeechLib.SpeechStreamFileMode.SSFMOpenForRead, true); + //SpeechLib.ISpeechBaseStream Istream = spFs as SpeechLib.ISpeechBaseStream; + //pp.SpeakStream(Istream, SpeechLib.SpeechVoiceSpeakFlags.SVSFIsFilename); + //spFs.Close(); + } + + //方法 4 (蜂鸣器--控制台扬声器) + public static void Beep(int frequency, int duration) + { + //振动的Hz频率; //持续的时间,单位“毫秒”。 + Console.Beep(frequency, duration); + } + } + + + //================================================================================================== + /// + /// 数据格式化或校验检测 + /// + class FormatCheckBase + { + /// + /// 检测是否为十六进制字符串,长度不够在前面添加0 + /// + /// 输入字符串 + /// 长度 + /// 输出字符串 + /// 检测结果 + public static void FormatChecking16(string strInput, int length, out string strOutput, out Boolean Valid) + { + strOutput = ""; + Valid = true; + byte temp; + if ((strInput.Length <= length) & (strInput.Length > 0)) + { + for (int i = 0; i < strInput.Length; i++) + { + try + { + temp = Convert.ToByte(strInput[i].ToString(), 16); + } + catch + { + Valid = false; + strOutput = ""; + break; + } + + strOutput += strInput[i]; + } + + if (Valid & (strInput.Length < length)) + { + for (int j = 0; j < length - strInput.Length; j++) + { + strOutput = "0" + strOutput; + } + } + } + else + { + Valid = false; + strOutput = ""; + } + } + + /// + /// 检测是否为十进制字符串,长度不够在前面添加0 + /// + /// 输入字符串 + /// 长度 + /// 输出字符串 + /// 检测结果 + public static bool FormatChecking10(string strInput, int length, out string strOutput) + { + strOutput = ""; + byte temp; + try + { + if ((strInput.Length <= length) & (strInput.Length > 0)) + { + for (int i = 0; i < strInput.Length; i++) + { + try + { + temp = Convert.ToByte(strInput[i].ToString(), 10); + } + catch + { + strOutput = ""; + return false; + } + + strOutput += strInput[i]; + } + + if (strInput.Length < length) + { + for (int j = 0; j < length - strInput.Length; j++) + { + strOutput = "0" + strOutput; + } + } + } + else + { + strOutput = ""; + return false; + } + } + catch (Exception ex) + { + MessageBox.Show("格式转换错误:" + ex.Message); + return false; + } + + return true; + } + + /// + /// 每隔n个字符插入一个字符 + /// + /// 从右边开始插入 + /// 源字符串 + /// 间隔字符数 + /// 待插入值 + /// 待补充值,最后不足间隔字符数时,用此字符补齐;Supplement=""时,不补任何字符。 + /// 返回新生成字符串 + public static string InsertFormat(bool isRight, string input, int interval, string value, string Supplement) + { + if (!isRight) //从左边开始插入 + { + for (int i = interval; i < input.Length; i += interval + 1) + { + input = input.Insert(i, value); + } + + if (Supplement != "") + { + do + { + if ((input.Length + 1) % (interval + 1) != 0) + { + input = input + Supplement; + } + } while ((input.Length + 1) % (interval + 1) != 0); + } + } + else //从右边开始插入 + { + for (int i = input.Length - interval; i > 0; i -= interval) + { + input = input.Insert(i, value); + } + + if (Supplement != "") + { + do + { + if ((input.Length + 1) % (interval + 1) != 0) + { + input = Supplement + input; + } + } while ((input.Length + 1) % (interval + 1) != 0); + } + } + + return input; + } + + /// + /// BCC校验,返回校验后的字符串 + /// + /// 待校验字符串 + /// 返回结果 + public static string GetBCC(string strCmd) + { + if (strCmd.Length >= 2) + { + byte[] Buffer = Encoding.Default.GetBytes(strCmd); + byte byteBCC = Buffer[0]; + for (int i = 1; i < Buffer.Length; i++) + byteBCC ^= Buffer[i]; + return Convert.ToChar(byteBCC).ToString(); + } + else + { + return null; + } + } + + /// + /// BCC校验,返回校验后的数组 + /// + /// 待校验数组 + /// 返回结果 + public static byte[] GetBCC(byte[] byteData) + { + byte[] byteWrite = new byte[byteData.Length + 1]; + if (byteData.Length >= 2) + { + byteData.CopyTo(byteWrite, 0); + byte byteBCC = byteData[0]; + for (int i = 1; i < byteData.Length; i++) + byteBCC ^= byteData[i]; + byteWrite[byteWrite.Length - 1] = byteBCC; + return byteWrite; + } + else + { + return null; + } + } + + /// + /// CRC16校验函数 + /// + public class CRC16Check + { + private const int CRC_LEN = 0; + + // Table of CRC values for high-order byte + + #region + + static readonly byte[] _auchCRCHi = new byte[] + { + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 + }; + + #endregion + + // Table of CRC values for low-order byte + + #region + + static readonly byte[] _auchCRCLo = new byte[] + { + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, + 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, + 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, + 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, + 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, + 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, + 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, + 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, + 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, + 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, + 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, + 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, + 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, + 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, + 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, + 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, + 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, + 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, + 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, + 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, + 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, + 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 + }; + + #endregion + + /// + /// 计算CRC16校验值 返回一个ushort类型的值,如果要返回Crc高字节和低字节,可重写CalculateCrc16函数为: + /// + /// 待校验数组 + /// 输出高字节 + /// 输出低字节 + /// 输出校验值 + public static ushort CalculateCrc16(byte[] buffer, out byte crcHi, out byte crcLo) + { + crcHi = 0xff; // high crc byte initialized + crcLo = 0xff; // low crc byte initialized + + for (int i = 0; i < buffer.Length - CRC_LEN; i++) + { + int crcIndex = crcHi ^ buffer[i]; // calculate the crc lookup index + + crcHi = (byte)(crcLo ^ _auchCRCHi[crcIndex]); + crcLo = _auchCRCLo[crcIndex]; + } + + return (ushort)(crcHi << 8 | crcLo); + } + } + } + + + //==================================================================================================ConvertBase + /// + /// 数据转换类 + /// + class ConvertBase + { + #region 图像 <--> 数组 + + /// + /// 图像转换为Byte数组 + /// + static public byte[] ImageToByteArray(Image ImageIn) + { + MemoryStream ms = new MemoryStream(); + ImageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png); + return ms.ToArray(); + } + + /// + /// Byte数组转换为图像 + /// + static public Image byteArrayToImage(byte[] byteArrayIn) + { + MemoryStream ms = new MemoryStream(byteArrayIn); + Image returnImage = Image.FromStream(ms); + return returnImage; + } + + #endregion + + #region 字符串 -> 字节数组 + + /// + /// 十六进制(hexadecimal)字符串转换为字节数组 + /// + /// + /// + public static byte[] HexStringToBytes(string str) + { + str = str.Replace(" ", ""); + byte[] buffer = new byte[str.Length / 2]; + for (int i = 0; i < str.Length; i += 2) + { + buffer[i / 2] = (byte)Convert.ToByte(str.Substring(i, 2), 16); + } + + return buffer; + } + + /// + /// 十进制(Decimalism)字符串转换为字节数组 + /// + /// + /// + public static byte[] DecimalStringToBytes(string str) + { + str = str.Replace(" ", ""); + byte[] buffer = new byte[str.Length]; + for (int i = 0; i < str.Length; i++) + { + buffer[i] = (byte)Convert.ToByte(str.Substring(i, 1), 10); + } + + return buffer; + } + + #endregion + + #region DataGridView -> DataTable 和 DataSet + + public static DataTable GetDataTableFromDataGridView(DataGridView dv) + { + DataTable dt = new DataTable(); + DataColumn dc; + for (int i = 0; i < dv.Columns.Count; i++) + { + dc = new DataColumn(); + dc.ColumnName = dv.Columns[i].HeaderText.ToString(); + dt.Columns.Add(dc); + } + + for (int j = 0; j < dv.Rows.Count - 1; j++) + { + DataRow dr = dt.NewRow(); + for (int x = 0; x < dv.Columns.Count; x++) + { + dr[x] = dv.Rows[j].Cells[x].Value; + } + + dt.Rows.Add(dr); + } + + return dt; + } + + public static DataSet GetDataSetFromDataGridView(DataGridView ucgrd) + { + DataSet ds = new DataSet(); + DataTable dt = new DataTable(); + for (int j = 0; j < ucgrd.Columns.Count; j++) + { + dt.Columns.Add(ucgrd.Columns[j].HeaderCell.Value.ToString()); + } + + for (int j = 0; j < ucgrd.Rows.Count; j++) + { + DataRow dr = dt.NewRow(); + for (int i = 0; i < ucgrd.Columns.Count; i++) + { + if (ucgrd.Rows[j].Cells[i].Value != null) + { + dr[i] = ucgrd.Rows[j].Cells[i].Value.ToString(); + } + else + { + dr[i] = ""; + } + } + + dt.Rows.Add(dr); + } + + ds.Tables.Add(dt); + return ds; + } + + #endregion + + #region ListBox.Items, ComboBox.Items -> string[] + + public static string[] GetStringsFromListBox(ListBox mListBox) + { + string[] strings = new string[mListBox.Items.Count]; + for (int i = 0; i < mListBox.Items.Count; i++) + { + strings[i] = mListBox.Items[i].ToString(); + } + + return strings; + } + + public static string[] GetStringsFromListBox(ComboBox mComboBox) + { + string[] strings = new string[mComboBox.Items.Count]; + for (int i = 0; i < mComboBox.Items.Count; i++) + { + strings[i] = mComboBox.Items[i].ToString(); + } + + return strings; + } + + public static void AddStringsToListView(ListView m_ListView, string[] strings) + { + m_ListView.Items.Clear(); + for (int i = 0; i < strings.Length; i++) + { + m_ListView.Items.Add(strings[i]); + } + } + + #endregion + + /// + /// 从SYGOLE获取的数据转换函数 + /// + public class Tool + { + //将十六进制的字符串转化为ushort + public static ushort HexString2Ushort(string s) + { + ushort value = 0; + + for (int i = 0; i < s.Length; i++) + { + if (s[i] != ' ') + { + value = (ushort)(value * 16 + HexStringToHex(s, i)); + } + } + + return value; + } + + //将字节数组形式的mac地址转化为对应的字符串 + public static string MacToString(byte[] mac) + { + string MacString = ""; + + for (int i = 0; i < 6; i++) + { + MacString += ByteToHexString(mac[i]); + if (i < 5) + { + MacString += ":"; + } + } + + return MacString; + } + + //将字符串形式的mac地址转化为对应的字节数组 + public static byte[] StringToMac(string str) + { + string temp = ""; + + for (int i = 0; i < str.Length; i++) + { + if ((str[i] != ' ') && (str[i] != ':')) + { + temp += str[i]; + } + } + + return HexStringToByte(temp, 0, 6); //6字节长度 + } + + //判断字符串是否是十六进制字符串 + public static bool ValidHexString(string str) + { + for (int i = 0; i < str.Length; i++) + { + if (! + (((str[i] >= '0') && (str[i] <= '9')) || + ((str[i] >= 'a') && (str[i] <= 'f')) || + ((str[i] >= 'A') && (str[i] <= 'F'))) + ) + { + return false; + } + } + + return true; + } + + private static string GetStringWithoutSpace(string str, int pos) + { + string temp = ""; + for (int i = pos; i < str.Length; i++) + { + if ((str[i] != ' ') && (str[i] != ':')) + { + temp += str[i]; + } + } + + return temp; + } + + //将单个十六进制字符(4 bits)转化为byte + private static byte HexStringToHex(string str, int pos) + { + byte value = 0; + + if ((str[pos] >= '0') && (str[pos] <= '9')) + { + value = (byte)(str[pos] - '0'); + } + else if ((str[pos] >= 'a') && (str[pos] <= 'f')) + { + value = (byte)(str[pos] - 'a' + 10); + } + else if ((str[pos] >= 'A') && (str[pos] <= 'F')) + { + value = (byte)(str[pos] - 'A' + 10); + } + + return value; + } + + //将字符串的pos位置开始,转化为数组,转化后数组的长度为cnt + public static byte[] HexStringToByte(string str, int pos, int cnt) + { + if ((!ValidHexString(str)) || ((str.Length - pos) >> 1 < cnt)) + { + return null; + } + + byte[] data = new byte[cnt]; + + for (int i = 0; i < cnt; i++) + { + data[i] = (byte)(HexStringToHex(str, 2 * i + pos) * 16 + HexStringToHex(str, 2 * i + pos + 1)); + } + + return data; + } + + public static string bytes2String(byte[] data, int offset, int len) + { + string outString = ""; + + for (int i = offset; i < len + offset; i++) + { + outString += (char)data[i]; + } + + return outString; + } + + //将字符串的pos位置开始,转化为数组,转化后数组的长度为cnt + public static byte[] HexStringToByte(string str, int pos) + { + string tempStr = GetStringWithoutSpace(str, pos); + + return HexStringToByte(tempStr, 0, tempStr.Length >> 1); + } + + public static byte HexStringToSingleByte(string str, int pos) + { + byte temp = 0; + int len = 2; + string tempStr = GetStringWithoutSpace(str, pos); + + if (tempStr.Length == 0) + { + return 0; + } + else if (tempStr.Length < 2) + { + len = tempStr.Length; + } + else + { + len = 2; + } + + for (int i = 0; i < len; i++) + { + temp = (byte)(temp * 16 + HexStringToHex(tempStr, i)); + } + + return temp; + } + + //将字符串的pos位置开始,转化int + public static int HexStringToInt(string s, int pos) + { + string str = ""; + int len = (s.Length - pos) > 8 ? 8 : s.Length - pos; + for (int i = pos; i < len; i++) + { + str += s[i]; + } + + for (int i = len; i < 8; i++) + { + str = "0" + str; + } + + if (!ValidHexString(str)) + { + return 0; + } + + int result = 0; + byte[] data = HexStringToByte(str, 0, 4); + + for (int i = 0; i < 4; i++) + { + result = (result << 8) + data[i]; + } + + return result; + } + + //将字节类型的数据转化为十六进制字符串 + public static string ByteToHexString(byte data) + { + string outString = ""; + + if (data < 16) + { + outString += "0"; + } + + outString += data.ToString("X"); + + return outString; + } + + //将字节类型的数据转化为十六进制字符串 + public static string ByteToHexString(byte[] data, int pos, int length, string space) + { + string outString = ""; + + for (int i = pos; i < pos + length; i++) + { + outString += ByteToHexString(data[i]); + if (i != pos + length - 1) + { + outString += space; + } + } + + return outString; + } + + //将ushort类型的数据转化为十六进制字符串 + public static string ushortToHexString(ushort[] data, int pos, int length) + { + string outString = ""; + + for (int i = pos; i < pos + length; i++) + { + outString += ByteToHexString((byte)(data[i] >> 8)); + outString += ByteToHexString((byte)(data[i] & 0xFF)); + } + + return outString; + } + } + + //========================================================================================== + public class MyConvert + { + //string a = Convert.ToString(5, 2); + //string b = Convert.ToString(11, 8); + //string c = Convert.ToString(11, 16); + //int aa = Convert.ToInt32("101", 2);//二进制转换10进制 + //int bb = Convert.ToInt32("13", 8); //八进制转换10进制 + //int cc = Convert.ToInt32("b", 16); //十六进制转换10进制 + + #region C++转换程序(C#里面有完整的转换函数) + + //十进制转二制 + public static string DtoB(int d) + { + //Console.WriteLine(Convert.ToString(5,2)) + string str = ""; + //判断该数如果小于2,则直接输出 + if (d < 2) + { + str = d.ToString(); + } + else + { + int c; + int s = 0; + int n = d; + while (n >= 2) + { + s++; + n = n / 2; + } + + int[] m = new int[s]; + int i = 0; + do + { + c = d / 2; + m[i++] = d % 2; + d = c; + } while (c >= 2); + + str = d.ToString(); + for (int j = m.Length - 1; j >= 0; j--) + { + str += m[j].ToString(); + } + } + + return str; + } + + //十进制转八进制 + public static string DtoO(int d) + { + string o = ""; + if (d < 8) + { + o = d.ToString(); + } + else + { + int c; + + int s = 0; + int n = d; + int temp = d; + while (n >= 8) + { + s++; + n = n / 8; + } + + int[] m = new int[s]; + int i = 0; + do + { + c = d / 8; + m[i++] = d % 8; + d = c; + } while (c >= 8); + + o = d.ToString(); + for (int j = m.Length - 1; j >= 0; j--) + { + o += m[j]; + } + } + + return o; + } + + //十进制转十六进制 + public static string DtoX(int d) + { + string x = ""; + if (d < 16) + { + x = chang(d); + } + else + { + int c; + int s = 0; + int n = d; + int temp = d; + while (n >= 16) + { + s++; + n = n / 16; + } + + string[] m = new string[s]; + int i = 0; + do + { + c = d / 16; + m[i++] = chang(d % 16); //判断是否大于10,如果大于10,则转换为A~F的格式 + d = c; + } while (c >= 16); + + x = chang(d); + for (int j = m.Length - 1; j >= 0; j--) + { + x += m[j]; + } + } + + return x; + } + + //判断是否为10~15之间的数,如果是则进行转换 + public static string chang(int d) + { + string x = ""; + switch (d) + { + case 10: + x = "A"; + break; + case 11: + x = "B"; + break; + case 12: + x = "C"; + break; + case 13: + x = "D"; + break; + case 14: + x = "E"; + break; + case 15: + x = "F"; + break; + default: + x = d.ToString(); + break; + } + + return x; + } + + public static int XtoD(string instr) + { + int i = Convert.ToInt32("FF", 16); //十六进制转换10进制 + int j = Convert.ToInt32("1100", 2); + int k = Convert.ToInt32("12", 8); + return i; + } + + #endregion + } + } + + + //==================================================================================================TcpBase + /// + /// 网络通讯通用类函数库 + /// + class TcpBase + { + /// + /// 用CMD命令测试网络连接状态 + /// + /// IP地址或网址 + /// Ping结果 连接;超时或其他结果表示未连接 + public static string CmdPing(string strIp) + { + Process p = new Process(); + p.StartInfo.FileName = "cmd.exe"; + p.StartInfo.UseShellExecute = false; + p.StartInfo.RedirectStandardInput = true; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.RedirectStandardError = true; + p.StartInfo.CreateNoWindow = true; + p.Start(); + p.StandardInput.WriteLine("ping -n 1 " + strIp); + p.StandardInput.WriteLine("exit"); + + string strRst = p.StandardOutput.ReadToEnd(); + string pingRst = ""; + if (strRst.Contains("(0% loss)") || strRst.Contains("(0% 丢失)")) + pingRst = "连接"; + else if (strRst.Contains("Request timed out") || strRst.Contains("请求超时")) + pingRst = "超时"; + else if (strRst.Contains("Unknown host") || strRst.Contains("无法解析主机")) + pingRst = "无法解析主机"; + else if (strRst.Contains("请求找不到主机")) + pingRst = "请求找不到主机"; + else if (strRst.Contains("Destination host unreachable.")) + pingRst = "无法到达目的主机"; + else + pingRst = strRst; + p.Close(); + return pingRst; + } + } + + + //==================================================================================================MyMath + /// + /// 数学函数库(算法) + /// + class MyMath + { + public static double GetMax(double[] Datas) + { + double Max = -9999; + try + { + if (Datas.Length == 1) + return Datas[0]; + for (int i = 0; i < Datas.Length; i++) + { + Max = Math.Max(Datas[i], Max); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + return Max; + } + + public static double GetMin(double[] Datas) + { + double Min = 9999; + try + { + if (Datas.Length == 1) + return Datas[0]; + for (int i = 0; i < Datas.Length; i++) + { + Min = Math.Min(Datas[i], Min); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + return Min; + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址,从0开始 + /// 返回整形数据或-1 + public static int GetPlcData(byte[] byteData, int DataAddr) + { + try + { + if (byteData == null) + { + return -1; + } + + if (byteData.Length < 10 + DataAddr * 2) + { + return -1; + } + else + { + int bitH = DataAddr * 2 + 9; + int bitL = DataAddr * 2 + 10; + return byteData[bitH] * 256 + byteData[bitL]; + } + } + catch + { + return -1; + } + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址 + /// PLC读取起始地址 + /// 返回整形数据或-1 + public static int GetPlcData(byte[] byteData, int DataAddr, int startAddr) + { + try + { + if (byteData == null) + { + return -1; + } + + if (startAddr > DataAddr) + { + //MessageBox.Show("错误:要读取的数据小于起始地址"); + return -1; + } + + if (byteData.Length < 9 + (DataAddr - startAddr) * 2) + { + return -1; + } + else + { + int bitH = (DataAddr - startAddr) * 2 + 9; + int bitL = (DataAddr - startAddr) * 2 + 10; + return byteData[bitH] * 256 + byteData[bitL]; + } + } + catch + { + //MessageBox.Show("Catch错误:" + ex.Message); + return -1; + } + } + + /// + /// 获取字节的某一位 + /// + /// 从0开始 + /// + public static bool GetPlcBit(int data, int index) + { + switch (index) + { + case 0: + return (data & 0x0001) > 0; + case 1: + return (data & 0x0002) > 0; + case 2: + return (data & 0x0004) > 0; + case 3: + return (data & 0x0008) > 0; + case 4: + return (data & 0x0010) > 0; + case 5: + return (data & 0x0020) > 0; + case 6: + return (data & 0x0040) > 0; + case 7: + return (data & 0x0080) > 0; + case 8: + return (data & 0x0100) > 0; + case 9: + return (data & 0x0200) > 0; + case 10: + return (data & 0x0400) > 0; + case 11: + return (data & 0x0800) > 0; + case 12: + return (data & 0x1000) > 0; + case 13: + return (data & 0x2000) > 0; + case 14: + return (data & 0x4000) > 0; + case 15: + return (data & 0x8000) > 0; + default: + return false; + } + } + + public static bool GetPlcBitH2Low(int data, int index) + { + switch (index) + { + case 0: + return (data & 0x0100) > 0; + case 1: + return (data & 0x0200) > 0; + case 2: + return (data & 0x0400) > 0; + case 3: + return (data & 0x0800) > 0; + case 4: + return (data & 0x1000) > 0; + case 5: + return (data & 0x2000) > 0; + case 6: + return (data & 0x4000) > 0; + case 7: + return (data & 0x8000) > 0; + + case 8: + return (data & 0x0001) > 0; + case 9: + return (data & 0x0002) > 0; + case 10: + return (data & 0x0004) > 0; + case 11: + return (data & 0x0008) > 0; + case 12: + return (data & 0x0010) > 0; + case 13: + return (data & 0x0020) > 0; + case 14: + return (data & 0x0040) > 0; + case 15: + return (data & 0x0080) > 0; + default: + return false; + } + } + + /// + /// 获取字节的某一位 + /// + /// 从0开始 + /// + public static bool GetPlcBit(byte[] byteData, int DataAddr, int index, int startAddr) + { + int Value = GetPlcData(byteData, DataAddr, startAddr); + bool bResult = GetPlcBit(Value, index); + return bResult; + } + + public static bool GetPlcBitH2Low(byte[] byteData, int DataAddr, int index, int startAddr) + { + int Value = GetPlcData(byteData, DataAddr, startAddr); + bool bResult = GetPlcBitH2Low(Value, index); + return bResult; + } + + + /// + /// 获取单精度浮点数(float)数据 + /// + /// PLC读取总数据 + /// 获取数据的地址 + /// PLC起始地址 + /// 数据正反序 + /// + public static float GetPlcSingle(byte[] byteData, int DataAddr, int startAddr, bool PositiveSequence = true) + { + try + { + if (byteData == null) + { + return -1; + } + + if (startAddr > DataAddr) + { + return -1; + } + + if (byteData.Length < 9 + (DataAddr - startAddr) * 2) + { + return -1; + } + else + { + float Result = -1; + int startBit = (DataAddr - startAddr) * 2 + 9; + + byte[] arrLength = new byte[4]; + arrLength[0] = byteData[startBit + 0]; + arrLength[1] = byteData[startBit + 1]; + arrLength[2] = byteData[startBit + 2]; + arrLength[3] = byteData[startBit + 3]; + + if (PositiveSequence) + { + Result = BitConverter.ToSingle(arrLength, 0); + } + else + { + Result = BitConverter.ToSingle(arrLength.Reverse().ToArray(), 0); + } + + Result = Convert.ToSingle(Math.Round(Result, 3)); + return Result; + } + } + catch + { + return -1; + } + } + + /// + /// 获取字符串(string) + /// + /// PLC读取总数据 + /// 获取数据的地址 + /// PLC起始地址 + /// 读取的地址数量(单位16) + /// 数据正反序 + /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串 + /// + public static string GetPlcString(byte[] byteData, int DataAddr, int startAddr, int DataNum, + bool PositiveSequence = true, int strType = 0) + { + string Result = ""; + try + { + if (byteData == null) + { + return Result; + } + + if (startAddr > DataAddr + DataNum) + { + return Result; + } + + if (byteData.Length < 9 + (DataAddr - startAddr) * 2) + { + return Result; + } + else + { + int startBit = (DataAddr - startAddr) * 2 + 9; + byte[] arrLength = new byte[DataNum * 2]; + for (int i = 0; i < DataNum * 2; i++) + { + arrLength[i] = byteData[startBit + i]; + } + + if (!PositiveSequence) + { + arrLength = (byte[])arrLength.Reverse(); + } + + switch (strType) + { + case 2: + foreach (byte b in arrLength) + { + Result += ConvertBase.MyConvert.DtoB(b); + } + + break; + case 10: + foreach (byte b in arrLength) + { + Result += b.ToString(); + } + + break; + case 16: + foreach (byte b in arrLength) + { + Result += b.ToString("X2"); + } + + break; + + default: + foreach (byte b in arrLength) + { + Result += Convert.ToChar(b).ToString(); + } + + break; + } + + return Result.Trim(); + } + } + catch + { + return Result; + } + } + + + //====================================================================== + /// + /// 字节数组(byte 8位)转化为ushort(16位)数组 + /// + public static ushort[] GetushortsFromValue(byte[] Value) + { + ushort[] rtnValues; + byte[] bytes = Value; + int Length = bytes.Length / 2; + if (bytes.Length % 2 == 0) + { + rtnValues = new ushort[Length]; + for (int i = 0; i < bytes.Length; i += 2) + { + rtnValues[i / 2] = BitConverter.ToUInt16(bytes, i); + } + } + else + { + rtnValues = new ushort[bytes.Length / 2 + 1]; + for (int i = 0; i < bytes.Length - 1; i += 2) + { + rtnValues[i / 2] = BitConverter.ToUInt16(bytes, i); + } + + rtnValues[bytes.Length / 2] = bytes[bytes.Length - 1]; + } + + return rtnValues; + } + + /// + /// 字符串(string)转化为ushort(16位)数组 + /// + public static ushort[] GetushortsFromValue(string Value) + { + byte[] bytes = System.Text.Encoding.Default.GetBytes(Value); + ushort[] ushorts = GetushortsFromValue(bytes); + return ushorts; + } + + /// + /// 单精度小数(float 32位)转化为ushort(16位)数组 + /// + public static ushort[] GetushortsFromValue(float Value) + { + byte[] bytes = BitConverter.GetBytes(Value); + ushort[] ushorts = GetushortsFromValue(bytes); + return ushorts; + } + + /// + /// 双精度小数(double 64位)转化为ushort(16位)数组 + /// + public static ushort[] GetushortsFromValue(double Value) + { + byte[] bytes = BitConverter.GetBytes(Value); + ushort[] ushorts = GetushortsFromValue(bytes); + return ushorts; + } + + + //====================================================================== + /// + /// 字节数组(byte 8位)转化为short(16位)数组 + /// + public static short[] GetshortsFromValue(byte[] Value) + { + short[] rtnValues; + byte[] bytes = Value; + int Length = bytes.Length / 2; + if (bytes.Length % 2 == 0) + { + rtnValues = new short[Length]; + for (int i = 0; i < bytes.Length; i += 2) + { + rtnValues[i / 2] = BitConverter.ToInt16(bytes, i); + } + } + else + { + rtnValues = new short[bytes.Length / 2 + 1]; + for (int i = 0; i < bytes.Length - 1; i += 2) + { + rtnValues[i / 2] = BitConverter.ToInt16(bytes, i); + } + + rtnValues[bytes.Length / 2] = bytes[bytes.Length - 1]; + } + + return rtnValues; + } + + /// + /// 字符串(string)转化为short(16位)数组 + /// + public static short[] GetshortsFromValue(string Value) + { + byte[] bytes = System.Text.Encoding.Default.GetBytes(Value); + short[] shorts = GetshortsFromValue(bytes); + return shorts; + } + + /// + /// 整形(int 32位)转化为short(16位)数组 + /// + public static short[] GetshortsFromValue(int Value) + { + byte[] bytes = BitConverter.GetBytes(Value); + short[] shorts = GetshortsFromValue(bytes); + return shorts; + } + + /// + /// 单精度小数(float 32位)转化为short(16位)数组 + /// + public static short[] GetshortsFromValue(float Value) + { + byte[] bytes = BitConverter.GetBytes(Value); + short[] shorts = GetshortsFromValue(bytes); + return shorts; + } + + /// + /// 双精度小数(double 64位)转化为ushort(16位)数组 + /// + public static short[] GetshortsFromValue(double Value) + { + byte[] bytes = BitConverter.GetBytes(Value); + short[] shorts = GetshortsFromValue(bytes); + return shorts; + } + } + + class CodeDfn + { + public const string BlankSpace = " "; + public const string strEnter = "\r\n"; + } + + class PlcMath + { + #region S7协议数据处理(以字节为基础) + + public static bool GetS7BoolBit(byte data, int index) + { + switch (index) + { + case 0: return (data & 0x01) > 0; + case 1: return (data & 0x02) > 0; + case 2: return (data & 0x04) > 0; + case 3: return (data & 0x08) > 0; + case 4: return (data & 0x10) > 0; + case 5: return (data & 0x20) > 0; + case 6: return (data & 0x40) > 0; + case 7: return (data & 0x80) > 0; + default: return false; + } + } + + public static bool GetS7BoolData(byte[] byteData, int DataAddr, int startAddr, int index) + { + byte data = GetS7ByteData(byteData, DataAddr, startAddr); + return GetS7BoolBit(data, index); + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址 + /// PLC读取起始地址 + /// 返回整形数据或-1 + public static byte GetS7ByteData(byte[] byteData, int DataAddr, int startAddr) + { + try + { + if (byteData == null) + { + return 0; + } + + if (startAddr > DataAddr) + { + MessageBox.Show("错误:获取S7字节数据, 要读取的数据小于起始地址"); + return 0; + } + + if (byteData.Length < (DataAddr - startAddr)) + { + MessageBox.Show("错误:获取S7字节数据, 要读取的偏移地址超出数组长度,偏移=" + (DataAddr - startAddr) + ", 数组长度=" + + byteData.Length); + return 0; + } + else + { + int bit = DataAddr - startAddr; + return byteData[bit]; + } + } + catch + { + //MessageBox.Show("Catch错误:" + ex.Message); + return 0; + } + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址 + /// PLC读取起始地址 + /// 返回整形数据或-1 + public static byte GetS7ByteData(byte[] byteData, int DataAddr) + { + try + { + if (byteData == null) + { + return 0; + } + + if (byteData.Length < byteData.Length) + { + MessageBox.Show("获取S7字节数据,地址超出数组长度!", "警告"); + return 0; + } + + return byteData[DataAddr]; + } + catch (Exception ex) + { + MessageBox.Show("Catch错误:获取S7字节数据" + ex.Message); + return 0; + } + } + + public static int GetS7WordData(byte[] byteData, int DataAddr, int startAddr) + { + try + { + if (byteData == null) + { + return -1; + } + + if (startAddr > DataAddr) + { + //MessageBox.Show("错误:要读取的数据小于起始地址"); + return -1; + } + + if (byteData.Length < (DataAddr - startAddr) * 2) + { + return -1; + } + else + { + //int bitH = (DataAddr - startAddr) * 2; + //int bitL = (DataAddr - startAddr) * 2 + 1; + int bitH = (DataAddr - startAddr); + int bitL = (DataAddr - startAddr) + 1; + return byteData[bitH] * 256 + byteData[bitL]; + } + } + catch + { + //MessageBox.Show("Catch错误:" + ex.Message); + return -1; + } + } + + /// + /// 获取字符串(string) + /// + /// PLC读取总数据 + /// 获取数据的地址 + /// PLC起始地址 + /// 读取的地址数量(单位16) + /// 数据正反序 + /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串 + /// + public static string GetS7StringData(byte[] byteData, int DataAddr, int startAddr, int DataNum, int strType = 0, + bool PositiveSequence = true) + { + string Result = ""; + try + { + if (byteData == null) + { + return Result; + } + + if (startAddr > DataAddr + DataNum) + { + return Result; + } + + if (byteData.Length < (DataAddr - startAddr)) + { + return Result; + } + else + { + int startBit = (DataAddr - startAddr); + byte[] arrLength = new byte[DataNum]; + for (int i = 0; i < DataNum; i++) + { + arrLength[i] = byteData[startBit + i]; + } + + if (!PositiveSequence) + { + arrLength = (byte[])arrLength.Reverse(); + } + + switch (strType) + { + case 2: + foreach (byte b in arrLength) + { + Result += ConvertBase.MyConvert.DtoB(b); + } + + break; + case 10: + foreach (byte b in arrLength) + { + Result += b.ToString(); + } + + break; + case 16: + foreach (byte b in arrLength) + { + Result += b.ToString("X2"); + } + + break; + default: + foreach (byte b in arrLength) + { + if (b >= 32) + Result += Convert.ToChar(b).ToString(); + } + + break; + } + + return Result.Trim(); + } + } + catch + { + return Result; + } + } + + #endregion + + + #region ModbusTCP/FinsTCP协议数据处理(以字为基础) + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址,从0开始 + /// 返回整形数据或-1 + public static int GetPlcData(byte[] byteData, int DataAddr) + { + try + { + if (byteData == null) + { + return -1; + } + + if (byteData.Length < DataAddr * 2) + { + return -1; + } + else + { + int bitH = DataAddr * 2; + int bitL = DataAddr * 2 + 1; + return byteData[bitH] * 256 + byteData[bitL]; + } + } + catch + { + return -1; + } + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址 + /// PLC读取起始地址 + /// 返回整形数据或-1 + public static byte GetPlcByteData(byte[] byteData, int DataAddr, int startAddr) + { + try + { + if (byteData == null) + { + return 0; + } + + if (startAddr > DataAddr) + { + //MessageBox.Show("错误:要读取的数据小于起始地址"); + return 0; + } + + //if (byteData.Length < (DataAddr - startAddr) * 2) + if (byteData.Length < (DataAddr - startAddr)) + { + return 0; + } + else + { + int bit = DataAddr - startAddr; + return byteData[bit]; + } + } + catch + { + //MessageBox.Show("Catch错误:" + ex.Message); + return 0; + } + } + + /// + /// 获取PLC读取地址数据(从起始地址偏移) + /// + /// 数据数组 + /// PLC读取地址 + /// PLC读取起始地址 + /// 返回整形数据或-1 + public static int GetPlcData(byte[] byteData, int DataAddr, int startAddr) + { + try + { + if (byteData == null) + { + return -1; + } + + if (startAddr > DataAddr) + { + //MessageBox.Show("错误:要读取的数据小于起始地址"); + return -1; + } + + if (byteData.Length < (DataAddr - startAddr) * 2) + { + return -1; + } + else + { + int bitH = (DataAddr - startAddr) * 2; + int bitL = (DataAddr - startAddr) * 2 + 1; + return byteData[bitH] * 256 + byteData[bitL]; + } + } + catch + { + //MessageBox.Show("Catch错误:" + ex.Message); + return -1; + } + } + + /// + /// 获取字节的某一位 + /// + /// 从0开始 + /// + public static bool GetPlcBit(int data, int index) + { + switch (index) + { + case 0: + return (data & 0x0001) > 0; + case 1: + return (data & 0x0002) > 0; + case 2: + return (data & 0x0004) > 0; + case 3: + return (data & 0x0008) > 0; + case 4: + return (data & 0x0010) > 0; + case 5: + return (data & 0x0020) > 0; + case 6: + return (data & 0x0040) > 0; + case 7: + return (data & 0x0080) > 0; + case 8: + return (data & 0x0100) > 0; + case 9: + return (data & 0x0200) > 0; + case 10: + return (data & 0x0400) > 0; + case 11: + return (data & 0x0800) > 0; + case 12: + return (data & 0x1000) > 0; + case 13: + return (data & 0x2000) > 0; + case 14: + return (data & 0x4000) > 0; + case 15: + return (data & 0x8000) > 0; + default: + return false; + } + } + + public static bool GetPlcBitH2Low(int data, int index) + { + switch (index) + { + case 0: + return (data & 0x0100) > 0; + case 1: + return (data & 0x0200) > 0; + case 2: + return (data & 0x0400) > 0; + case 3: + return (data & 0x0800) > 0; + case 4: + return (data & 0x1000) > 0; + case 5: + return (data & 0x2000) > 0; + case 6: + return (data & 0x4000) > 0; + case 7: + return (data & 0x8000) > 0; + + case 8: + return (data & 0x0001) > 0; + case 9: + return (data & 0x0002) > 0; + case 10: + return (data & 0x0004) > 0; + case 11: + return (data & 0x0008) > 0; + case 12: + return (data & 0x0010) > 0; + case 13: + return (data & 0x0020) > 0; + case 14: + return (data & 0x0040) > 0; + case 15: + return (data & 0x0080) > 0; + default: + return false; + } + } + + /// + /// 获取字节的某一位 + /// + /// 从0开始 + /// + public static bool GetPlcBit(byte[] byteData, int DataAddr, int index, int startAddr) + { + int Value = GetPlcData(byteData, DataAddr, startAddr); + bool bResult = GetPlcBit(Value, index); + return bResult; + } + + public static bool GetPlcBitH2Low(byte[] byteData, int DataAddr, int index, int startAddr) + { + int Value = GetPlcData(byteData, DataAddr, startAddr); + bool bResult = GetPlcBitH2Low(Value, index); + return bResult; + } + + /// + /// 获取单精度浮点数(float)数据 + /// + /// PLC读取总数据 + /// 获取数据的地址 + /// PLC起始地址 + /// 数据正反序 + /// + public static float GetPlcSingle(byte[] byteData, int DataAddr, int startAddr, bool PositiveSequence) + { + try + { + if (byteData == null) + { + return -1; + } + + if (startAddr > DataAddr) + { + return -1; + } + + if (byteData.Length < (DataAddr - startAddr)) + { + return -1; + } + else + { + float Result = -1; + int startBit = (DataAddr - startAddr); + + byte[] arrLength = new byte[4]; + arrLength[0] = byteData[startBit + 0]; + arrLength[1] = byteData[startBit + 1]; + arrLength[2] = byteData[startBit + 2]; + arrLength[3] = byteData[startBit + 3]; + + if (PositiveSequence) + { + Result = BitConverter.ToSingle(arrLength, 0); + } + else + { + Result = BitConverter.ToSingle(arrLength.Reverse().ToArray(), 0); + } + + Result = Convert.ToSingle(Math.Round(Result, 3)); + return Result; + } + } + catch + { + return -1; + } + } + + /// + /// 获取字符串(string) + /// + /// PLC读取总数据 + /// 获取数据的地址 + /// PLC起始地址 + /// 读取的地址数量(单位16) + /// 数据正反序 + /// 转换为字符串类型,2=二进制,10=十进制,16=十六进制,其他=char字符串 + /// + public static string GetPlcString(byte[] byteData, int DataAddr, int startAddr, int DataNum, int strType = 0, + bool PositiveSequence = true) + { + string Result = ""; + try + { + if (byteData == null) + { + return Result; + } + + if (startAddr > DataAddr + DataNum) + { + return Result; + } + + if (byteData.Length < (DataAddr - startAddr) * 2) + { + return Result; + } + else + { + int startBit = (DataAddr - startAddr) * 2; + byte[] arrLength = new byte[DataNum * 2]; + for (int i = 0; i < DataNum * 2; i++) + { + arrLength[i] = byteData[startBit + i]; + } + + if (!PositiveSequence) + { + arrLength = (byte[])arrLength.Reverse(); + } + + switch (strType) + { + case 2: + foreach (byte b in arrLength) + { + Result += ConvertBase.MyConvert.DtoB(b); + } + + break; + case 10: + foreach (byte b in arrLength) + { + Result += b.ToString(); + } + + break; + case 16: + foreach (byte b in arrLength) + { + Result += b.ToString("X2"); + } + + break; + default: + foreach (byte b in arrLength) + { + if (b >= 32) + Result += Convert.ToChar(b).ToString(); + } + + break; + } + + return Result.Trim(); + } + } + catch + { + return Result; + } + } + + #endregion + } + + public class IPAddressValidator + { + public static bool IsIPAddressValid(string ipAddress) + { + string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + return Regex.IsMatch(ipAddress, pattern); + } + } +} \ No newline at end of file diff --git a/HexcalMC/Base/DebugDfn.cs b/HexcalMC/Base/DebugDfn.cs new file mode 100644 index 0000000..88ea8e1 --- /dev/null +++ b/HexcalMC/Base/DebugDfn.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace HexcalMC.Base +{ + public class DebugDfn + { + public static string strDebugFile = Application.StartupPath + "\\File\\Debug.txt"; + public static string strDebugSavePath = Application.StartupPath + "\\File\\DebugFiles"; + public static string strDebugFileTemp = Application.StartupPath + "\\File\\DebugTemp.txt"; //临时存储,用于菜单查看 + static string strStartTime = ""; //程序启动时间 + static string strEndTime = ""; //程序关闭时间 + + public static RichTextBox textBox_Msg; + + + //================================================================= + public static void StartDebugObj() + { + System.IO.TextWriter log = new System.IO.StreamWriter(DebugDfn.strDebugFile); + TextWriterTraceListener logger = new TextWriterTraceListener(log); + Trace.Listeners.Add(logger); + strStartTime = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"); + } + + public static void SaveDebugFile() + { + AddLog("软件关闭!"); + strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss"); + string CopyFileName = strDebugSavePath + "\\DebugFiles\\" + "Debug(" + strStartTime + " To " + + strEndTime + ")" + ".txt"; + if (File.Exists(strDebugFile)) + File.Copy(strDebugFile, CopyFileName, true); + } + + //================================================================= + + #region 信息显示 + + public static void AddLog(string str) + { + MyBase.TraceWriteLine(str); + } + + public static void AddLogText(string str, Color m_Color = new Color()) + { + MyBase.TraceWriteLine(str); + try + { + textBox_Msg.BeginInvoke((EventHandler)delegate + { + Color SetColor = Color.White; + if (m_Color == new Color()) + { + if (str.ToUpper().Contains("ERROR") || str.ToUpper().Contains("错误") || + str.ToUpper().Contains("出错") || str.ToUpper().Contains("EXCEPTION") || + str.ToUpper().Contains("异常") || str.ToUpper().Contains("失败")) + { + SetColor = Color.Red; + } + else if (str.ToUpper().Contains("WARNING") || str.ToUpper().Contains("警告")) + { + SetColor = Color.DarkOrange; + } + } + else + { + SetColor = m_Color; + } + + string strText = DateTime.Now.ToString("HH:mm:ss.ff") + "--" + str + Environment.NewLine; + textBox_Msg.SelectionStart = textBox_Msg.TextLength; + if (string.IsNullOrEmpty(str)) + SetText(textBox_Msg, str, SetColor, false, 16); + else + SetText(textBox_Msg, strText, SetColor, false, 16); + if (textBox_Msg.Lines.Length > 800) + { + textBox_Msg.Select(0, textBox_Msg.TextLength / 2); + textBox_Msg.Cut(); + } + + textBox_Msg.ScrollToCaret(); + }); + } + catch + { + } + } + + public static void SetText(RichTextBox m_RichTextBox, string strText, Color m_Color, bool bBold = false, + float Size = 16) + { + m_RichTextBox.Invoke(((EventHandler)delegate + { + SetFont(m_RichTextBox, m_Color, bBold, Size); + m_RichTextBox.SelectedText = strText; + })); + } + + public static void SetFont(RichTextBox m_RichTextBox, Color m_Color, bool bBold = false, float Size = 16) + { + m_RichTextBox.SelectionColor = m_Color; + if (bBold) + m_RichTextBox.SelectionFont = new System.Drawing.Font("Segoe UI", Size, System.Drawing.FontStyle.Bold, + System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + else + m_RichTextBox.SelectionFont = new System.Drawing.Font("Segoe UI", Size, + System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(134))); + } + + public static void SetErrorColor(Color InColor) + { + if (textBox_Msg != null) + { + textBox_Msg.BeginInvoke((EventHandler)delegate { textBox_Msg.BackColor = InColor; }); + } + } + + #endregion + } +} diff --git a/HexcalMC/Hexcal/TcpIpServer.cs b/HexcalMC/Hexcal/TcpIpServer.cs new file mode 100644 index 0000000..befcb7f --- /dev/null +++ b/HexcalMC/Hexcal/TcpIpServer.cs @@ -0,0 +1,371 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace HexcalMC.Hexcal +{ + public class TcpIpServer + { + /// + /// 使用模式,默认=1,接收任意数据显示;2=前两个字节为数据长度 + /// + public int UseMode = 1; + + string strServerIP = "127.0.0.1"; //服务器的IP地址 + string strServerPort = "8080"; //端口号 + public enum EnumTcpIpServer : int + { + StartListen = 1, + ClientConnect = 2, + SocketException = 8, + ConnectException = 9, + Exception = -1 + } + + #region 510,增加时钟,判断是否有断掉的连接。 + + System.Windows.Forms.Timer ServerTimer = new System.Windows.Forms.Timer(); + + private void ServerTimerLoop(object sender, EventArgs e) + { + ServerTimer.Interval = 20000; //监听timer的间隔 + if (DictSocket != null) + { + if (DictSocket.Count != 0) + { + DictSocket.Values.ToArray(); + for (int i = DictSocket.Values.ToArray().Length - 1; i >= 0; i--) + { + if (DictSocket.Values.ToArray()[i].Poll(10, SelectMode.SelectRead)) //10毫秒,检查套接字状态, SelectMode 参数指定要监视的套接字的类别。 + { + // DictSocket.Remove(DictSocket.Keys.ToArray()[i]); + + RaisedStatus(EnumTcpIpServer.ConnectException, + "连接已断开:" + DictSocket.Keys.ToArray()[i]); //刷新界面显示,触发一个连接异常状态枚举,并将消息传递为异常的状态 + RemoveSocketClient(DictSocket.Keys.ToArray()[i]); + } + } + } + } + } + + #endregion + + + Thread m_WatchThread = null; // 负责监听客户端连接请求的线程; + Socket m_WatchSocket = null; + Dictionary DictThread = new Dictionary(); + Dictionary DictSocket = new Dictionary(); + bool bStartListen = false; + + public string[] SocketNames + { + get { return (string[])DictSocket.Keys.ToArray(); } + } + + //========================================================================= + public TcpIpServer(string ServerIP, string ServerPort) + { + strServerIP = ServerIP; + strServerPort = ServerPort; + } + + public bool StartListen() + { + try + { + ServerTimer.Tick += new EventHandler(ServerTimerLoop); //510,增加时钟,判断是否有断掉的连接。 + ServerTimer.Start(); + + m_WatchSocket = + new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建负责监听的套接字,注意其中的参数; + IPAddress m_IpAddr = IPAddress.Parse(strServerIP); //获得文本框中的IP对象; + IPEndPoint m_EndPoint = new IPEndPoint(m_IpAddr, int.Parse(strServerPort)); //创建包含ip和端口号的网络节点对象; + try + { + m_WatchSocket.Bind(m_EndPoint); // 将负责监听的套接字绑定到唯一的ip和端口上; + } + catch (SocketException se) + { + MessageBox.Show("异常:" + se.Message); + return false; + } + + bStartListen = true; + m_WatchSocket.Listen(10); // 设置监听队列的长度 + m_WatchThread = new Thread(WatchThread); // 创建负责监听的线程 + m_WatchThread.IsBackground = true; + m_WatchThread.Start(); + RaisedStatus(EnumTcpIpServer.StartListen, "服务器启动监听成功!IP=" + strServerIP + ", Port=" + strServerPort); + return true; + } + catch (Exception ex) + { + MessageBox.Show("启动服务器监听失败:" + ex.Message); + return false; + } + } + + public void StopListen() + { + try + { + bStartListen = false; + m_WatchSocket.Close(); + m_WatchSocket.Dispose(); + m_WatchSocket = null; + + DictThread.Clear(); + DictSocket.Clear(); + } + catch + { + } + } + + public bool ConnectStatus + { + get + { + if (m_WatchSocket == null) + return false; + return m_WatchSocket.Connected && m_WatchThread != null; + } + } + + public bool WatchStatus + { + get { return bStartListen; } + } + + //监听线程 + void WatchThread() + { + try + { + while (bStartListen) // 持续不断的监听客户端的连接请求; + { + // 开始监听客户端连接请求,Accept方法会阻断当前的线程; + Socket sokClient = m_WatchSocket.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的套接字; + + + #region 510,在新建连接时,判断以前的连接是否正常存在。 + + if (DictSocket != null) + { + if (DictSocket.Count != 0) + { + DictSocket.Values.ToArray(); + for (int i = DictSocket.Values.ToArray().Length - 1; i >= 0; i--) + { + if (DictSocket.Values.ToArray()[i].Poll(10, SelectMode.SelectRead)) + { + //DictSocket.Remove(DictSocket.Keys.ToArray()[i]); + RemoveSocketClient(DictSocket.Keys.ToArray()[i]); + } + } + } + } + + #endregion + + + DictSocket.Add(sokClient.RemoteEndPoint.ToString(), sokClient); // 将与客户端连接的套接字对象添加到集合中; + RaisedStatus(EnumTcpIpServer.ClientConnect, + "客户端连接成功!RemoteEndPoint=" + sokClient.RemoteEndPoint.ToString()); + + Thread thread = new Thread(ReceiveThread); + thread.IsBackground = true; + thread.Start(sokClient); + + DictThread.Add(sokClient.RemoteEndPoint.ToString(), thread); // 将新建的线程 添加 到线程的集合中去。 + } + } + catch + { + } + } + + //接收线程 + void ReceiveThread(object sokObj) + { + Socket sokClient = sokObj as Socket; + while (bStartListen) + { + // 定义一个2M的缓存区; + byte[] arrMsgRec = new byte[sokClient.Available]; + // 将接受到的数据存入到输入 arrMsgRec中; + int length = -1; + try + { + length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; + } + catch (SocketException se) + { + RaisedStatus(EnumTcpIpServer.SocketException, "异常:SocketException=" + se.Message); + RemoveSocketClient(sokClient.RemoteEndPoint.ToString()); + return; + } + catch (Exception ex) + { + RaisedStatus(EnumTcpIpServer.ConnectException, "异常:Exception=" + ex.Message); + RemoveSocketClient(sokClient.RemoteEndPoint.ToString()); + return; + } + + try + { + if (UseMode == 1) + { + if (length > 0) + { + // TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510 + string strData = System.Text.Encoding.Default.GetString(arrMsgRec); // 将接受到的字节数据转化成字符串; + //strData = strData.Substring(0, length); + //RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "<0>")); + RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", ".")); + } + } + else if (UseMode == 2) + { + if (length > 0 && arrMsgRec.Length > 2) + { + // TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510 + string strData = + System.Text.Encoding.Default.GetString(arrMsgRec, 2, + arrMsgRec.Length - 2); // 将接受到的字节数据转化成字符串; + + RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData); + } + } + } + catch (Exception ex) + { + RaisedStatus(EnumTcpIpServer.Exception, "获取Socket数据异常:ex=" + ex.Message); + } + } + } + + //删除客户端对象 + void RemoveSocketClient(string strRemoteEndPoint) + { + // 从通信套接字集合中 删除被中断连接的通信套接字; + DictSocket.Remove(strRemoteEndPoint); + + // 从通信线程集合中 删除被中断连接的通信线程对象; + DictThread.Remove(strRemoteEndPoint); + } + + //发送消息 + public void SendMessage(string strSocketKey, string strMsg) + { + byte[] arrMsg = System.Text.Encoding.Default.GetBytes(strMsg); + DictSocket[strSocketKey].Send(arrMsg); + } + + public void SendMessage(string strSocketKey, byte[] arrMsg) + { + DictSocket[strSocketKey].Send(arrMsg); + } + + /// 发送数据函数(字符串, 自动添加长度(byte格式)) + public string SendMessage2(string strSocketKey, string strMsg) + { + try + { + if (DictSocket[strSocketKey].Connected) + { + byte[] arrLength = new byte[2]; + arrLength = BitConverter.GetBytes(Convert.ToInt16(strMsg.Length)); + byte[] WriteBuffer = Encoding.Default.GetBytes(strMsg); + WriteBuffer = arrLength.Concat(WriteBuffer).ToArray(); + + DictSocket[strSocketKey].Send(WriteBuffer); + return ""; + } + + return "NotConnect"; + } + catch (Exception ex) + { + return "error:" + ex.Message; + } + } + + public void SendMessageToAllClients(string strMsg) + { + byte[] arrMsg = System.Text.Encoding.Default.GetBytes(strMsg); + foreach (Socket soc in DictSocket.Values) + { + soc.Send(arrMsg); + } + } + + public void SendMessageToAllClients(byte[] arrMsg) + { + foreach (Socket soc in DictSocket.Values) + { + soc.Send(arrMsg); + } + } + + public delegate void EventHandler_RaisedStatus(EnumTcpIpServer Type, string Msg); + + public event EventHandler_RaisedStatus OnRaisedStatus; + + // 异步或同步触发自定义事件,并在目标控件是 Windows Forms 控件的情况下添加到目标控件的消息队列中。它主要的目的是使得自定义事件处理程序在UI线程上执行,以避免线程上的卡顿或UI更新问题。 + private void RaisedStatus(EnumTcpIpServer ReturnType, string Msg) + { + try + { + if (OnRaisedStatus != null) + { + if (OnRaisedStatus.Target is System.Windows.Forms.Control) + { + Control targetForm = OnRaisedStatus.Target as System.Windows.Forms.Control; + targetForm.BeginInvoke(OnRaisedStatus, new object[] { ReturnType, Msg }); + } + else + { + OnRaisedStatus(ReturnType, Msg); + } + } + } + catch (Exception) + { + } + } + + public delegate void EventHandler_RaisedMessage(string ClientIP, string Msg); + + public event EventHandler_RaisedMessage OnRaisedMessage; + + private void RaisedMessage(string ClientIP, string Msg) + { + try + { + if (OnRaisedMessage != null) + { + if (OnRaisedMessage.Target is System.Windows.Forms.Control) + { + Control targetForm = OnRaisedMessage.Target as System.Windows.Forms.Control; + targetForm.BeginInvoke(OnRaisedMessage, new object[] { ClientIP, Msg }); + } + else + { + OnRaisedMessage(ClientIP, Msg); + } + } + } + catch (Exception) + { + } + } + } +} diff --git a/HexcalMC/HexcalMC.csproj b/HexcalMC/HexcalMC.csproj index a8f9058..881d56e 100644 --- a/HexcalMC/HexcalMC.csproj +++ b/HexcalMC/HexcalMC.csproj @@ -1,5 +1,5 @@  - + Debug x86 @@ -10,12 +10,13 @@ Properties HexcalMC ACS_Motion - v2.0 + v4.6.2 512 SAK SAK SAK SAK + x86 @@ -26,6 +27,7 @@ DEBUG;TRACE prompt 4 + false x86 @@ -35,6 +37,7 @@ TRACE prompt 4 + false true @@ -44,6 +47,7 @@ x64 prompt MinimumRecommendedRules.ruleset + false bin\x64\Release\ @@ -53,15 +57,35 @@ x64 prompt MinimumRecommendedRules.ruleset + false bin\Debug\ACS.SPiiPlusNET.dll + + packages\ScottPlot.4.1.68\lib\net462\ScottPlot.dll + + + packages\ScottPlot.WinForms.4.1.68\lib\net461\ScottPlot.WinForms.dll + + + packages\System.Drawing.Common.4.7.2\lib\net461\System.Drawing.Common.dll + + + + packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + + + packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll + @@ -69,8 +93,12 @@ + + + + Form @@ -103,6 +131,8 @@ Resources.resx True + + SettingsSingleFileGenerator Settings.Designer.cs @@ -140,6 +170,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACt5tMNidzBKYTbviZ92LoOedi5AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAzO/jAbfp2C6J3MGShNu+h3zYujF52LkGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACS3sYvgtq+anrYuquB2r22ftm7z4DZvKuL3MJWzvDkBM7w5AEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAbtSzA3nXuWh82Lqnedi5rI7dxGaB2r3Hfdi734DZvbuf4sx4jt3DNn7Z + uxIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB01bYieNe4nXrYudR52LmsmODJIoPavqJ72Lrpedi5/H3Y + u9Z92LqEfdi6TYjbwCaX4MgIl+DIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIfbwHp+2bvQedi55XnYuawAAAAAf9m8XXzY + urR52Ln/edi5/3nYuf982LrZgtm9mJfgyCCX4MgGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIbbvweG278aftm733vYufh52Lnledi5rAAA + AACN3MITiNvAZ3rYueh52Ln/edi5/3nYuft62Ln0ftm744Tavo6N3cNDld/HCgAAAAAAAAAAAAAAAAAA + AAAAAAAA2cuMB9fIhRXTwnUw08J1MNPCdTDTwnUw08J1MNPCdTDTwnUwssiKQI/PonCC0aXzgdCl/oLQ + pOmGz6O608J1MLzLkDWp0J5tktKoyYDQpf+A0KX/gNCl/4DQpf+B0aX8hNGn1IrSqKeRz59yoLhlKKC4 + ZQUAAAAAAAAAAAAAAADXyIYT18mHNNXFfW7Tw3h308J2etPCdXvTwnV708J1e9LBc3vFv3GNnrxvwZK/ + dvuRv3b/lMB58ZvBfdLTwnV708J1e8bFgJSuy5LDk8J+/5HAeP+Rv3b/kb92/5G/dv+Rv3b/kr5085e7 + bMylsFBarKg5CwAAAAAAAAAAAAAAANbGfyrXx4Js3tGbw9fIhezUxHr608J1/9PCdf/TwnX/0L5s/8qy + Tv+7lwv/upYI/7qWCP+8mxb/w6Y1/9PCdf/TwnX/08J1/9HAcP/Coyv/vJkQ/7qWCP+6lgj/upYI/7qW + CP+6lgj/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08N4KtTDeG7YyojW5dmwWeHUo3TZyom71MR6/dPC + df/Jsk7/wKIn/7qWCP+6lgj/upYI/72bFv/DpjX/08J1/9PCdf/TwnX/0sFz/824X/+/nyD/upYK/7qW + CP+6lgj/upYI/7qWCP+6lgjtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq08J2cdXFfe3g1KJu4NSiTtrL + jljay42RzMN84sKtQ/e8mhX/upYI/7qWCP+7lwn/vZsW/8OmNf/Twnb/08J2/9PCdf/SwXX/0b9u/8Sp + OP++nBn/upYI/7uXCf+7lwn/u5cJ/7qWCO26lgieupYIFAAAAAAAAAAAAAAAANPCdSrTwnVz08J2/9rL + jaXd0JlL2Nu2DdjVqC67yY3Ls7FS8rGeIf+3mRH/upYJ/7qWCP+9mxb/w6Y1/9PCdv/Twnb/08J2/9PC + df/TwnX/yrNS/8KkLP+6lgr/u5cJ/7uXCf+7lwn/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08J1KtPC + dXPTwnb/1sZ/99/SnYje374cuunaHonbwdiE0an6j8KB/6qnOf+5lwv/upYI/72bFv/DpjX/08J2/9PC + dv/Twnb/08J2/9PCdv/SwHH/yK9I/7yaE/+7lwn/u5cJ/7uXCf+6lgjtupYInrqWCBQAAAAAAAAAAAAA + AADTwnUq08J1c9PCdv/Twnb+18iGw8/Sn4mZ4MmNftm773vWtv591LD/gNCk/5O9dP+nqT3/t6Al/8Om + Nf/Twnb/08J2/9PCdv/Twnb/08J2/9LBdP/OuWD/xqs+/7qWCP+6lgj/u5cJ/7qWCO26lgieupYIFAAA + AAAAAAAAAAAAANPCdSrTwnVz08J2/9PCdf/UxHvnyMmLzovZudB72Ln5edi5/3nYuf952Ln/gs6g/4/B + fv+fuGb7s7Ra9NTDeP7Twnb/08J1/9PCdv/Twnb/08J1/9G+bf/Mtlj/vZsV/7qXCv+6lgj/upYI7bqW + CJ66lggUAAAAAAAAAAAAAAAA08J1KtPCdXPTwnb/08J1/9G/bv/Dv3L/iM2d/nvWtv952Ln/eti6/3rY + uv952Ln/eta3/4XRp/WdxYjf1cV73NPDd+zTwnX408J1/9PCdf/TwnX/08J1/9C+a//Coyv/u5gO/7qW + CP+6lgjtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq08J1c9PCdv/TwnX/y7RT/7ynN/+ir07/ftKr/3nY + uf962Lr/eti6/3rYuv962Lr/edi55XnYuazWxoEp1MR8idPDeM/TwnX908J1/9PCdf/TwnX/0sBy/865 + YP++nRr/u5cJ/7qWCO26lgieupYIFAAAAAAAAAAAAAAAANPCdSrTwnVz08J1/8+7Zf/EqTn/upoS/7Wb + Fv+Lxov/ftOs/3nYuf962Lr/eti6/3rYuv952Lnledi5rNbGgQjUxHwa1MR7O9XFfm3VxX3f08J399PC + df/SwXX/0sBx/8WpOf++nRr/upYI7bqWCJ66lggUAAAAAAAAAAAAAAAA08J1KtPCdHPTwnT/yLBK/8Ch + Jf+6lgn/upYJ/52zWv+HypT/edi4/3rYuv962Lr/eti6/3nYueV52LmsAAAAAAAAAADWxoEN1cV+KNTE + fHPUw3qp08J41dPCdvfTwnX/y7RV/8KkLf+6lwvtupYInrqWCBQAAAAAAAAAAAAAAADTwnUq0sF0c9G/ + b//CpC3/vJoT/7qWCP+6lgj/sKAo/5K+dv981bL/edi5/3nYuf962Lr/edi55XnYuawAAAAAAAAAAAAA + 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 + f//wAH///AB///+Af///wH///+B////4f/8= + + + \ No newline at end of file diff --git a/HexcalMC/Motion/Motion.Designer.cs b/HexcalMC/Motion/Motion.Designer.cs new file mode 100644 index 0000000..e8bea21 --- /dev/null +++ b/HexcalMC/Motion/Motion.Designer.cs @@ -0,0 +1,2305 @@ +namespace HexcalMC +{ + partial class Motion + { + /// + /// 필수 디자이너 변수입니다. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 사용 중인 모든 리소스를 정리합니다. + /// + /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form 디자이너에서 생성한 코드 + + /// + /// 디자이너 지원에 필요한 메서드입니다. + /// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Motion)); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.txtPort = new System.Windows.Forms.TextBox(); + this.txtIP = new System.Windows.Forms.TextBox(); + this.btnClose = new System.Windows.Forms.Button(); + this.btnOpen = new System.Windows.Forms.Button(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.rdoTCP = new System.Windows.Forms.RadioButton(); + this.rdoSimu = new System.Windows.Forms.RadioButton(); + this.tmrMonitor = new System.Windows.Forms.Timer(this.components); + this.grpMotionTest = new System.Windows.Forms.GroupBox(); + this.btnHallAll = new System.Windows.Forms.Button(); + this.btnHalt = new System.Windows.Forms.Button(); + this.grpMst = new System.Windows.Forms.GroupBox(); + this.label16 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.lblEnable = new System.Windows.Forms.Label(); + this.lblInPos = new System.Windows.Forms.Label(); + this.lblAcc = new System.Windows.Forms.Label(); + this.lblMoving = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.grpPositions = new System.Windows.Forms.GroupBox(); + this.btnSetZero = new System.Windows.Forms.Button(); + this.txtFVEL = new System.Windows.Forms.TextBox(); + this.txtPE = new System.Windows.Forms.TextBox(); + this.txtFPOS = new System.Windows.Forms.TextBox(); + this.label43 = new System.Windows.Forms.Label(); + this.txtRPOS = new System.Windows.Forms.TextBox(); + this.label12 = new System.Windows.Forms.Label(); + this.label11 = new System.Windows.Forms.Label(); + this.label10 = new System.Windows.Forms.Label(); + this.btnDisableAll = new System.Windows.Forms.Button(); + this.btnDisable = new System.Windows.Forms.Button(); + this.cboAxisNo = new System.Windows.Forms.ComboBox(); + this.btnEnable = new System.Windows.Forms.Button(); + this.grpJog = new System.Windows.Forms.GroupBox(); + this.btnJogPos = new System.Windows.Forms.Button(); + this.btnJogNeg = new System.Windows.Forms.Button(); + this.txtJogVel = new System.Windows.Forms.TextBox(); + this.chkUseVel = new System.Windows.Forms.CheckBox(); + this.grpProfile = new System.Windows.Forms.GroupBox(); + this.txtJerk = new System.Windows.Forms.TextBox(); + this.txtKdec = new System.Windows.Forms.TextBox(); + this.txtDec = new System.Windows.Forms.TextBox(); + this.txtAcc = new System.Windows.Forms.TextBox(); + this.txtVel = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.grpPTP = new System.Windows.Forms.GroupBox(); + this.btnPTP_R_Pos = new System.Windows.Forms.Button(); + this.btnPTP_R_Neg = new System.Windows.Forms.Button(); + this.btnPTP = new System.Windows.Forms.Button(); + this.txtPTP_Pos = new System.Windows.Forms.TextBox(); + this.label8 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.grpSafety = new System.Windows.Forms.GroupBox(); + this.lblEMG = new System.Windows.Forms.Label(); + this.lblRL7 = new System.Windows.Forms.Label(); + this.lblRL3 = new System.Windows.Forms.Label(); + this.lblLL7 = new System.Windows.Forms.Label(); + this.lblLL3 = new System.Windows.Forms.Label(); + this.lblRL6 = new System.Windows.Forms.Label(); + this.lblRL2 = new System.Windows.Forms.Label(); + this.lblLL6 = new System.Windows.Forms.Label(); + this.lblRL5 = new System.Windows.Forms.Label(); + this.lblLL2 = new System.Windows.Forms.Label(); + this.lblLL5 = new System.Windows.Forms.Label(); + this.lblRL1 = new System.Windows.Forms.Label(); + this.lblRL4 = new System.Windows.Forms.Label(); + this.lblLL1 = new System.Windows.Forms.Label(); + this.lblLL4 = new System.Windows.Forms.Label(); + this.lblRL0 = new System.Windows.Forms.Label(); + this.lblLL0 = new System.Windows.Forms.Label(); + this.label18 = new System.Windows.Forms.Label(); + this.label36 = new System.Windows.Forms.Label(); + this.label27 = new System.Windows.Forms.Label(); + this.label35 = new System.Windows.Forms.Label(); + this.label26 = new System.Windows.Forms.Label(); + this.label34 = new System.Windows.Forms.Label(); + this.label25 = new System.Windows.Forms.Label(); + this.label33 = new System.Windows.Forms.Label(); + this.label24 = new System.Windows.Forms.Label(); + this.label20 = new System.Windows.Forms.Label(); + this.label19 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.lblPRG_Status = new System.Windows.Forms.Label(); + this.lblPRG_Status_LED = new System.Windows.Forms.Label(); + this.btnStopBuffer = new System.Windows.Forms.Button(); + this.btnRunBuffer = new System.Windows.Forms.Button(); + this.txtLabelName = new System.Windows.Forms.TextBox(); + this.cboBufferNo = new System.Windows.Forms.ComboBox(); + this.label22 = new System.Windows.Forms.Label(); + this.label32 = new System.Windows.Forms.Label(); + this.label21 = new System.Windows.Forms.Label(); + this.label28 = new System.Windows.Forms.Label(); + this.grpIO = new System.Windows.Forms.GroupBox(); + this.btnSW7 = new System.Windows.Forms.Button(); + this.btnSW6 = new System.Windows.Forms.Button(); + this.btnSW5 = new System.Windows.Forms.Button(); + this.btnSW4 = new System.Windows.Forms.Button(); + this.btnSW3 = new System.Windows.Forms.Button(); + this.btnSW2 = new System.Windows.Forms.Button(); + this.btnSW0 = new System.Windows.Forms.Button(); + this.btnSW1 = new System.Windows.Forms.Button(); + this.label29 = new System.Windows.Forms.Label(); + this.label23 = new System.Windows.Forms.Label(); + this.label42 = new System.Windows.Forms.Label(); + this.lblOUT7 = new System.Windows.Forms.Label(); + this.lblIN7 = new System.Windows.Forms.Label(); + this.label41 = new System.Windows.Forms.Label(); + this.lblOUT3 = new System.Windows.Forms.Label(); + this.lblIN3 = new System.Windows.Forms.Label(); + this.label40 = new System.Windows.Forms.Label(); + this.label39 = new System.Windows.Forms.Label(); + this.label38 = new System.Windows.Forms.Label(); + this.lblOUT6 = new System.Windows.Forms.Label(); + this.lblIN6 = new System.Windows.Forms.Label(); + this.label37 = new System.Windows.Forms.Label(); + this.lblOUT2 = new System.Windows.Forms.Label(); + this.lblIN2 = new System.Windows.Forms.Label(); + this.lblOUT5 = new System.Windows.Forms.Label(); + this.lblIN5 = new System.Windows.Forms.Label(); + this.label31 = new System.Windows.Forms.Label(); + this.label30 = new System.Windows.Forms.Label(); + this.lblOUT1 = new System.Windows.Forms.Label(); + this.lblIN1 = new System.Windows.Forms.Label(); + this.lblOUT0 = new System.Windows.Forms.Label(); + this.lblOUT4 = new System.Windows.Forms.Label(); + this.lblIN0 = new System.Windows.Forms.Label(); + this.lblIN4 = new System.Windows.Forms.Label(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.lstLog = new System.Windows.Forms.ListBox(); + this.btnEventProgramEnd = new System.Windows.Forms.Button(); + this.btnEventMotionEnd = new System.Windows.Forms.Button(); + this.rtxtTerminal = new System.Windows.Forms.RichTextBox(); + this.groupBox4 = new System.Windows.Forms.GroupBox(); + this.btnSend = new System.Windows.Forms.Button(); + this.txtCommand = new System.Windows.Forms.TextBox(); + this.groupBox5 = new System.Windows.Forms.GroupBox(); + this.groupBox9 = new System.Windows.Forms.GroupBox(); + this.label56 = new System.Windows.Forms.Label(); + this.label55 = new System.Windows.Forms.Label(); + this.label54 = new System.Windows.Forms.Label(); + this.label53 = new System.Windows.Forms.Label(); + this.label52 = new System.Windows.Forms.Label(); + this.label51 = new System.Windows.Forms.Label(); + this.label50 = new System.Windows.Forms.Label(); + this.label49 = new System.Windows.Forms.Label(); + this.label47 = new System.Windows.Forms.Label(); + this.groupBox8 = new System.Windows.Forms.GroupBox(); + this.button8 = new System.Windows.Forms.Button(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.textBox3 = new System.Windows.Forms.TextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label46 = new System.Windows.Forms.Label(); + this.label45 = new System.Windows.Forms.Label(); + this.label44 = new System.Windows.Forms.Label(); + this.groupBox7 = new System.Windows.Forms.GroupBox(); + this.button7 = new System.Windows.Forms.Button(); + this.button6 = new System.Windows.Forms.Button(); + this.button5 = new System.Windows.Forms.Button(); + this.button4 = new System.Windows.Forms.Button(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.groupBox10 = new System.Windows.Forms.GroupBox(); + this.label48 = new System.Windows.Forms.Label(); + this.textBox4 = new System.Windows.Forms.TextBox(); + this.button10 = new System.Windows.Forms.Button(); + this.button9 = new System.Windows.Forms.Button(); + this.checkBox4 = new System.Windows.Forms.CheckBox(); + this.checkBox3 = new System.Windows.Forms.CheckBox(); + this.checkBox2 = new System.Windows.Forms.CheckBox(); + this.groupBox1.SuspendLayout(); + this.grpMotionTest.SuspendLayout(); + this.grpMst.SuspendLayout(); + this.grpPositions.SuspendLayout(); + this.grpJog.SuspendLayout(); + this.grpProfile.SuspendLayout(); + this.grpPTP.SuspendLayout(); + this.grpSafety.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.grpIO.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.groupBox4.SuspendLayout(); + this.groupBox5.SuspendLayout(); + this.groupBox9.SuspendLayout(); + this.groupBox8.SuspendLayout(); + this.groupBox7.SuspendLayout(); + this.groupBox6.SuspendLayout(); + this.groupBox10.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.txtPort); + this.groupBox1.Controls.Add(this.txtIP); + this.groupBox1.Controls.Add(this.btnClose); + this.groupBox1.Controls.Add(this.btnOpen); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.rdoTCP); + this.groupBox1.Controls.Add(this.rdoSimu); + this.groupBox1.Location = new System.Drawing.Point(12, 12); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(273, 94); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "通讯设置"; + // + // txtPort + // + this.txtPort.Location = new System.Drawing.Point(171, 40); + this.txtPort.Name = "txtPort"; + this.txtPort.Size = new System.Drawing.Size(91, 21); + this.txtPort.TabIndex = 15; + this.txtPort.Text = "701"; + // + // txtIP + // + this.txtIP.Location = new System.Drawing.Point(171, 17); + this.txtIP.Name = "txtIP"; + this.txtIP.Size = new System.Drawing.Size(91, 21); + this.txtIP.TabIndex = 16; + this.txtIP.Text = "10.0.0.100"; + // + // btnClose + // + this.btnClose.Location = new System.Drawing.Point(181, 65); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(81, 23); + this.btnClose.TabIndex = 14; + this.btnClose.Text = "断开"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // btnOpen + // + this.btnOpen.Location = new System.Drawing.Point(94, 65); + this.btnOpen.Name = "btnOpen"; + this.btnOpen.Size = new System.Drawing.Size(81, 23); + this.btnOpen.TabIndex = 13; + this.btnOpen.Text = "连接"; + this.btnOpen.UseVisualStyleBackColor = true; + this.btnOpen.Click += new System.EventHandler(this.btnOpen_Click); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(102, 44); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(29, 12); + this.label2.TabIndex = 11; + this.label2.Text = "端口"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(102, 21); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(71, 12); + this.label1.TabIndex = 12; + this.label1.Text = "目标设备 IP"; + // + // rdoTCP + // + this.rdoTCP.AutoSize = true; + this.rdoTCP.Location = new System.Drawing.Point(6, 19); + this.rdoTCP.Name = "rdoTCP"; + this.rdoTCP.Size = new System.Drawing.Size(41, 16); + this.rdoTCP.TabIndex = 10; + this.rdoTCP.TabStop = true; + this.rdoTCP.Text = "TCP"; + this.rdoTCP.UseVisualStyleBackColor = true; + this.rdoTCP.CheckedChanged += new System.EventHandler(this.rdoTCP_CheckedChanged); + // + // rdoSimu + // + this.rdoSimu.AutoSize = true; + this.rdoSimu.Location = new System.Drawing.Point(6, 42); + this.rdoSimu.Name = "rdoSimu"; + this.rdoSimu.Size = new System.Drawing.Size(59, 16); + this.rdoSimu.TabIndex = 9; + this.rdoSimu.TabStop = true; + this.rdoSimu.Text = "模拟器"; + this.rdoSimu.UseVisualStyleBackColor = true; + this.rdoSimu.CheckedChanged += new System.EventHandler(this.rdoSimu_CheckedChanged); + // + // tmrMonitor + // + this.tmrMonitor.Interval = 50; + this.tmrMonitor.Tick += new System.EventHandler(this.tmrMonitor_Tick); + // + // grpMotionTest + // + this.grpMotionTest.Controls.Add(this.btnHallAll); + this.grpMotionTest.Controls.Add(this.btnHalt); + this.grpMotionTest.Controls.Add(this.grpMst); + this.grpMotionTest.Controls.Add(this.grpPositions); + this.grpMotionTest.Controls.Add(this.btnDisableAll); + this.grpMotionTest.Controls.Add(this.btnDisable); + this.grpMotionTest.Controls.Add(this.cboAxisNo); + this.grpMotionTest.Controls.Add(this.btnEnable); + this.grpMotionTest.Controls.Add(this.grpJog); + this.grpMotionTest.Controls.Add(this.grpProfile); + this.grpMotionTest.Controls.Add(this.grpPTP); + this.grpMotionTest.Controls.Add(this.label9); + this.grpMotionTest.Location = new System.Drawing.Point(12, 112); + this.grpMotionTest.Name = "grpMotionTest"; + this.grpMotionTest.Size = new System.Drawing.Size(570, 375); + this.grpMotionTest.TabIndex = 1; + this.grpMotionTest.TabStop = false; + this.grpMotionTest.Text = "运动测试"; + // + // btnHallAll + // + this.btnHallAll.Location = new System.Drawing.Point(439, 257); + this.btnHallAll.Name = "btnHallAll"; + this.btnHallAll.Size = new System.Drawing.Size(120, 47); + this.btnHallAll.TabIndex = 10; + this.btnHallAll.Text = "停止全部"; + this.btnHallAll.UseVisualStyleBackColor = true; + this.btnHallAll.Click += new System.EventHandler(this.btnHallAll_Click); + // + // btnHalt + // + this.btnHalt.Location = new System.Drawing.Point(439, 206); + this.btnHalt.Name = "btnHalt"; + this.btnHalt.Size = new System.Drawing.Size(120, 47); + this.btnHalt.TabIndex = 10; + this.btnHalt.Text = "停止"; + this.btnHalt.UseVisualStyleBackColor = true; + this.btnHalt.Click += new System.EventHandler(this.btnHalt_Click); + // + // grpMst + // + this.grpMst.Controls.Add(this.label16); + this.grpMst.Controls.Add(this.label15); + this.grpMst.Controls.Add(this.label14); + this.grpMst.Controls.Add(this.lblEnable); + this.grpMst.Controls.Add(this.lblInPos); + this.grpMst.Controls.Add(this.lblAcc); + this.grpMst.Controls.Add(this.lblMoving); + this.grpMst.Controls.Add(this.label13); + this.grpMst.Location = new System.Drawing.Point(279, 198); + this.grpMst.Name = "grpMst"; + this.grpMst.Size = new System.Drawing.Size(154, 107); + this.grpMst.TabIndex = 9; + this.grpMst.TabStop = false; + this.grpMst.Text = "电机状态 (MST)"; + // + // label16 + // + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(9, 82); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(29, 12); + this.label16.TabIndex = 5; + this.label16.Text = "使能"; + // + // label15 + // + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(9, 61); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(29, 12); + this.label15.TabIndex = 5; + this.label15.Text = "就位"; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(9, 40); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(41, 12); + this.label14.TabIndex = 5; + this.label14.Text = "加速中"; + // + // lblEnable + // + this.lblEnable.Image = ((System.Drawing.Image)(resources.GetObject("lblEnable.Image"))); + this.lblEnable.Location = new System.Drawing.Point(120, 80); + this.lblEnable.Name = "lblEnable"; + this.lblEnable.Size = new System.Drawing.Size(19, 17); + this.lblEnable.TabIndex = 5; + // + // lblInPos + // + this.lblInPos.Image = ((System.Drawing.Image)(resources.GetObject("lblInPos.Image"))); + this.lblInPos.Location = new System.Drawing.Point(120, 59); + this.lblInPos.Name = "lblInPos"; + this.lblInPos.Size = new System.Drawing.Size(19, 17); + this.lblInPos.TabIndex = 5; + // + // lblAcc + // + this.lblAcc.Image = ((System.Drawing.Image)(resources.GetObject("lblAcc.Image"))); + this.lblAcc.Location = new System.Drawing.Point(120, 38); + this.lblAcc.Name = "lblAcc"; + this.lblAcc.Size = new System.Drawing.Size(19, 17); + this.lblAcc.TabIndex = 5; + // + // lblMoving + // + this.lblMoving.Image = ((System.Drawing.Image)(resources.GetObject("lblMoving.Image"))); + this.lblMoving.Location = new System.Drawing.Point(120, 17); + this.lblMoving.Name = "lblMoving"; + this.lblMoving.Size = new System.Drawing.Size(19, 17); + this.lblMoving.TabIndex = 5; + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(9, 19); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(41, 12); + this.label13.TabIndex = 5; + this.label13.Text = "运动中"; + // + // grpPositions + // + this.grpPositions.Controls.Add(this.btnSetZero); + this.grpPositions.Controls.Add(this.txtFVEL); + this.grpPositions.Controls.Add(this.txtPE); + this.grpPositions.Controls.Add(this.txtFPOS); + this.grpPositions.Controls.Add(this.label43); + this.grpPositions.Controls.Add(this.txtRPOS); + this.grpPositions.Controls.Add(this.label12); + this.grpPositions.Controls.Add(this.label11); + this.grpPositions.Controls.Add(this.label10); + this.grpPositions.Location = new System.Drawing.Point(279, 51); + this.grpPositions.Name = "grpPositions"; + this.grpPositions.Size = new System.Drawing.Size(280, 141); + this.grpPositions.TabIndex = 8; + this.grpPositions.TabStop = false; + this.grpPositions.Text = "位置"; + // + // btnSetZero + // + this.btnSetZero.Location = new System.Drawing.Point(88, 111); + this.btnSetZero.Name = "btnSetZero"; + this.btnSetZero.Size = new System.Drawing.Size(186, 23); + this.btnSetZero.TabIndex = 7; + this.btnSetZero.Text = "设置零位"; + this.btnSetZero.UseVisualStyleBackColor = true; + this.btnSetZero.Click += new System.EventHandler(this.btnSetZero_Click); + // + // txtFVEL + // + this.txtFVEL.Location = new System.Drawing.Point(165, 64); + this.txtFVEL.Name = "txtFVEL"; + this.txtFVEL.ReadOnly = true; + this.txtFVEL.Size = new System.Drawing.Size(107, 21); + this.txtFVEL.TabIndex = 6; + this.txtFVEL.Text = "0.000"; + this.txtFVEL.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // txtPE + // + this.txtPE.Location = new System.Drawing.Point(165, 86); + this.txtPE.Name = "txtPE"; + this.txtPE.ReadOnly = true; + this.txtPE.Size = new System.Drawing.Size(107, 21); + this.txtPE.TabIndex = 6; + this.txtPE.Text = "0.000"; + this.txtPE.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // txtFPOS + // + this.txtFPOS.Location = new System.Drawing.Point(165, 42); + this.txtFPOS.Name = "txtFPOS"; + this.txtFPOS.ReadOnly = true; + this.txtFPOS.Size = new System.Drawing.Size(107, 21); + this.txtFPOS.TabIndex = 6; + this.txtFPOS.Text = "0.000"; + this.txtFPOS.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label43 + // + this.label43.AutoSize = true; + this.label43.Location = new System.Drawing.Point(6, 68); + this.label43.Name = "label43"; + this.label43.Size = new System.Drawing.Size(95, 12); + this.label43.TabIndex = 5; + this.label43.Text = "实际速度 (FVEL)"; + // + // txtRPOS + // + this.txtRPOS.Location = new System.Drawing.Point(165, 19); + this.txtRPOS.Name = "txtRPOS"; + this.txtRPOS.ReadOnly = true; + this.txtRPOS.Size = new System.Drawing.Size(107, 21); + this.txtRPOS.TabIndex = 6; + this.txtRPOS.Text = "0.000"; + this.txtRPOS.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(6, 90); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(83, 12); + this.label12.TabIndex = 5; + this.label12.Text = "位置误差 (PE)"; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(6, 46); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(95, 12); + this.label11.TabIndex = 5; + this.label11.Text = "反馈位置 (FPOS)"; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(6, 23); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(95, 12); + this.label10.TabIndex = 5; + this.label10.Text = "参考位置 (RPOS)"; + // + // btnDisableAll + // + this.btnDisableAll.Location = new System.Drawing.Point(484, 19); + this.btnDisableAll.Name = "btnDisableAll"; + this.btnDisableAll.Size = new System.Drawing.Size(75, 23); + this.btnDisableAll.TabIndex = 7; + this.btnDisableAll.Text = "取消全部"; + this.btnDisableAll.UseVisualStyleBackColor = true; + this.btnDisableAll.Click += new System.EventHandler(this.btnDisableAll_Click); + // + // btnDisable + // + this.btnDisable.Location = new System.Drawing.Point(403, 19); + this.btnDisable.Name = "btnDisable"; + this.btnDisable.Size = new System.Drawing.Size(75, 23); + this.btnDisable.TabIndex = 7; + this.btnDisable.Text = "单轴取消"; + this.btnDisable.UseVisualStyleBackColor = true; + this.btnDisable.Click += new System.EventHandler(this.btnDisable_Click); + // + // cboAxisNo + // + this.cboAxisNo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboAxisNo.FormattingEnabled = true; + this.cboAxisNo.Location = new System.Drawing.Point(115, 20); + this.cboAxisNo.Name = "cboAxisNo"; + this.cboAxisNo.Size = new System.Drawing.Size(60, 20); + this.cboAxisNo.TabIndex = 0; + this.cboAxisNo.SelectedIndexChanged += new System.EventHandler(this.cboAxisNo_SelectedIndexChanged); + // + // btnEnable + // + this.btnEnable.Location = new System.Drawing.Point(322, 18); + this.btnEnable.Name = "btnEnable"; + this.btnEnable.Size = new System.Drawing.Size(75, 23); + this.btnEnable.TabIndex = 7; + this.btnEnable.Text = "单轴使能"; + this.btnEnable.UseVisualStyleBackColor = true; + this.btnEnable.Click += new System.EventHandler(this.btnEnable_Click); + // + // grpJog + // + this.grpJog.Controls.Add(this.btnJogPos); + this.grpJog.Controls.Add(this.btnJogNeg); + this.grpJog.Controls.Add(this.txtJogVel); + this.grpJog.Controls.Add(this.chkUseVel); + this.grpJog.Location = new System.Drawing.Point(8, 311); + this.grpJog.Name = "grpJog"; + this.grpJog.Size = new System.Drawing.Size(425, 53); + this.grpJog.TabIndex = 0; + this.grpJog.TabStop = false; + this.grpJog.Text = "Jog"; + // + // btnJogPos + // + this.btnJogPos.Location = new System.Drawing.Point(316, 17); + this.btnJogPos.Name = "btnJogPos"; + this.btnJogPos.Size = new System.Drawing.Size(94, 23); + this.btnJogPos.TabIndex = 8; + this.btnJogPos.Text = "正向 >>"; + this.btnJogPos.UseVisualStyleBackColor = true; + this.btnJogPos.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnJogPos_MouseDown); + this.btnJogPos.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnJog_MouseUp); + // + // btnJogNeg + // + this.btnJogNeg.Location = new System.Drawing.Point(214, 17); + this.btnJogNeg.Name = "btnJogNeg"; + this.btnJogNeg.Size = new System.Drawing.Size(94, 23); + this.btnJogNeg.TabIndex = 8; + this.btnJogNeg.Text = "<< 负向"; + this.btnJogNeg.UseVisualStyleBackColor = true; + this.btnJogNeg.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnJogNeg_MouseDown); + this.btnJogNeg.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnJog_MouseUp); + // + // txtJogVel + // + this.txtJogVel.Location = new System.Drawing.Point(114, 19); + this.txtJogVel.Name = "txtJogVel"; + this.txtJogVel.Size = new System.Drawing.Size(94, 21); + this.txtJogVel.TabIndex = 1; + this.txtJogVel.Text = "0"; + this.txtJogVel.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // chkUseVel + // + this.chkUseVel.AutoSize = true; + this.chkUseVel.Location = new System.Drawing.Point(13, 21); + this.chkUseVel.Name = "chkUseVel"; + this.chkUseVel.Size = new System.Drawing.Size(72, 16); + this.chkUseVel.TabIndex = 0; + this.chkUseVel.Text = "使用速度"; + this.chkUseVel.UseVisualStyleBackColor = true; + // + // grpProfile + // + this.grpProfile.Controls.Add(this.txtJerk); + this.grpProfile.Controls.Add(this.txtKdec); + this.grpProfile.Controls.Add(this.txtDec); + this.grpProfile.Controls.Add(this.txtAcc); + this.grpProfile.Controls.Add(this.txtVel); + this.grpProfile.Controls.Add(this.label7); + this.grpProfile.Controls.Add(this.label6); + this.grpProfile.Controls.Add(this.label5); + this.grpProfile.Controls.Add(this.label4); + this.grpProfile.Controls.Add(this.label3); + this.grpProfile.Location = new System.Drawing.Point(8, 51); + this.grpProfile.Name = "grpProfile"; + this.grpProfile.Size = new System.Drawing.Size(265, 141); + this.grpProfile.TabIndex = 0; + this.grpProfile.TabStop = false; + this.grpProfile.Text = "运动配置"; + // + // txtJerk + // + this.txtJerk.Location = new System.Drawing.Point(153, 111); + this.txtJerk.Name = "txtJerk"; + this.txtJerk.Size = new System.Drawing.Size(101, 21); + this.txtJerk.TabIndex = 4; + this.txtJerk.Text = "0"; + this.txtJerk.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.txtJerk.Enter += new System.EventHandler(this.TextBoxes_Enter); + this.txtJerk.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress); + this.txtJerk.Leave += new System.EventHandler(this.TextBoxes_Leave); + // + // txtKdec + // + this.txtKdec.Location = new System.Drawing.Point(153, 88); + this.txtKdec.Name = "txtKdec"; + this.txtKdec.Size = new System.Drawing.Size(101, 21); + this.txtKdec.TabIndex = 3; + this.txtKdec.Text = "0"; + this.txtKdec.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.txtKdec.Enter += new System.EventHandler(this.TextBoxes_Enter); + this.txtKdec.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress); + this.txtKdec.Leave += new System.EventHandler(this.TextBoxes_Leave); + // + // txtDec + // + this.txtDec.Location = new System.Drawing.Point(153, 65); + this.txtDec.Name = "txtDec"; + this.txtDec.Size = new System.Drawing.Size(101, 21); + this.txtDec.TabIndex = 2; + this.txtDec.Text = "0"; + this.txtDec.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.txtDec.Enter += new System.EventHandler(this.TextBoxes_Enter); + this.txtDec.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress); + this.txtDec.Leave += new System.EventHandler(this.TextBoxes_Leave); + // + // txtAcc + // + this.txtAcc.Location = new System.Drawing.Point(153, 42); + this.txtAcc.Name = "txtAcc"; + this.txtAcc.Size = new System.Drawing.Size(101, 21); + this.txtAcc.TabIndex = 1; + this.txtAcc.Text = "0"; + this.txtAcc.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.txtAcc.Enter += new System.EventHandler(this.TextBoxes_Enter); + this.txtAcc.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress); + this.txtAcc.Leave += new System.EventHandler(this.TextBoxes_Leave); + // + // txtVel + // + this.txtVel.Location = new System.Drawing.Point(153, 19); + this.txtVel.Name = "txtVel"; + this.txtVel.Size = new System.Drawing.Size(101, 21); + this.txtVel.TabIndex = 0; + this.txtVel.Text = "0"; + this.txtVel.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + this.txtVel.Enter += new System.EventHandler(this.TextBoxes_Enter); + this.txtVel.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TextBoxes_KeyPress); + this.txtVel.Leave += new System.EventHandler(this.TextBoxes_Leave); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(6, 115); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(71, 12); + this.label7.TabIndex = 5; + this.label7.Text = "抖动 (JERK)"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(6, 92); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(95, 12); + this.label6.TabIndex = 5; + this.label6.Text = "杀死减速 (KDEC)"; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(6, 69); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(65, 12); + this.label5.TabIndex = 5; + this.label5.Text = "减速 (DEC)"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(6, 46); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(77, 12); + this.label4.TabIndex = 5; + this.label4.Text = "加速度 (ACC)"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(6, 23); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(65, 12); + this.label3.TabIndex = 5; + this.label3.Text = "速度 (VEL)"; + // + // grpPTP + // + this.grpPTP.Controls.Add(this.btnPTP_R_Pos); + this.grpPTP.Controls.Add(this.btnPTP_R_Neg); + this.grpPTP.Controls.Add(this.btnPTP); + this.grpPTP.Controls.Add(this.txtPTP_Pos); + this.grpPTP.Controls.Add(this.label8); + this.grpPTP.Location = new System.Drawing.Point(8, 198); + this.grpPTP.Name = "grpPTP"; + this.grpPTP.Size = new System.Drawing.Size(265, 107); + this.grpPTP.TabIndex = 0; + this.grpPTP.TabStop = false; + this.grpPTP.Text = "点到点 (PTP)"; + // + // btnPTP_R_Pos + // + this.btnPTP_R_Pos.Location = new System.Drawing.Point(135, 76); + this.btnPTP_R_Pos.Name = "btnPTP_R_Pos"; + this.btnPTP_R_Pos.Size = new System.Drawing.Size(119, 23); + this.btnPTP_R_Pos.TabIndex = 7; + this.btnPTP_R_Pos.Text = "相对位置 (+)"; + this.btnPTP_R_Pos.UseVisualStyleBackColor = true; + this.btnPTP_R_Pos.Click += new System.EventHandler(this.btnPTP_R_Pos_Click); + // + // btnPTP_R_Neg + // + this.btnPTP_R_Neg.Location = new System.Drawing.Point(8, 76); + this.btnPTP_R_Neg.Name = "btnPTP_R_Neg"; + this.btnPTP_R_Neg.Size = new System.Drawing.Size(119, 23); + this.btnPTP_R_Neg.TabIndex = 7; + this.btnPTP_R_Neg.Text = "相对位置 (-)"; + this.btnPTP_R_Neg.UseVisualStyleBackColor = true; + this.btnPTP_R_Neg.Click += new System.EventHandler(this.btnPTP_R_Neg_Click); + // + // btnPTP + // + this.btnPTP.Location = new System.Drawing.Point(8, 47); + this.btnPTP.Name = "btnPTP"; + this.btnPTP.Size = new System.Drawing.Size(246, 23); + this.btnPTP.TabIndex = 7; + this.btnPTP.Text = "移动到绝对位置"; + this.btnPTP.UseVisualStyleBackColor = true; + this.btnPTP.Click += new System.EventHandler(this.btnPTP_Click); + // + // txtPTP_Pos + // + this.txtPTP_Pos.Location = new System.Drawing.Point(153, 21); + this.txtPTP_Pos.Name = "txtPTP_Pos"; + this.txtPTP_Pos.Size = new System.Drawing.Size(101, 21); + this.txtPTP_Pos.TabIndex = 6; + this.txtPTP_Pos.Text = "0"; + this.txtPTP_Pos.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(8, 24); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(65, 12); + this.label8.TabIndex = 5; + this.label8.Text = "位置 &&距离"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(13, 24); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(29, 12); + this.label9.TabIndex = 5; + this.label9.Text = "轴号"; + // + // grpSafety + // + this.grpSafety.Controls.Add(this.lblEMG); + this.grpSafety.Controls.Add(this.lblRL7); + this.grpSafety.Controls.Add(this.lblRL3); + this.grpSafety.Controls.Add(this.lblLL7); + this.grpSafety.Controls.Add(this.lblLL3); + this.grpSafety.Controls.Add(this.lblRL6); + this.grpSafety.Controls.Add(this.lblRL2); + this.grpSafety.Controls.Add(this.lblLL6); + this.grpSafety.Controls.Add(this.lblRL5); + this.grpSafety.Controls.Add(this.lblLL2); + this.grpSafety.Controls.Add(this.lblLL5); + this.grpSafety.Controls.Add(this.lblRL1); + this.grpSafety.Controls.Add(this.lblRL4); + this.grpSafety.Controls.Add(this.lblLL1); + this.grpSafety.Controls.Add(this.lblLL4); + this.grpSafety.Controls.Add(this.lblRL0); + this.grpSafety.Controls.Add(this.lblLL0); + this.grpSafety.Controls.Add(this.label18); + this.grpSafety.Controls.Add(this.label36); + this.grpSafety.Controls.Add(this.label27); + this.grpSafety.Controls.Add(this.label35); + this.grpSafety.Controls.Add(this.label26); + this.grpSafety.Controls.Add(this.label34); + this.grpSafety.Controls.Add(this.label25); + this.grpSafety.Controls.Add(this.label33); + this.grpSafety.Controls.Add(this.label24); + this.grpSafety.Controls.Add(this.label20); + this.grpSafety.Controls.Add(this.label19); + this.grpSafety.Controls.Add(this.label17); + this.grpSafety.Location = new System.Drawing.Point(291, 12); + this.grpSafety.Name = "grpSafety"; + this.grpSafety.Size = new System.Drawing.Size(292, 94); + this.grpSafety.TabIndex = 2; + this.grpSafety.TabStop = false; + this.grpSafety.Text = "安全限位"; + // + // lblEMG + // + this.lblEMG.Image = ((System.Drawing.Image)(resources.GetObject("lblEMG.Image"))); + this.lblEMG.Location = new System.Drawing.Point(260, 46); + this.lblEMG.Name = "lblEMG"; + this.lblEMG.Size = new System.Drawing.Size(19, 17); + this.lblEMG.TabIndex = 5; + // + // lblRL7 + // + this.lblRL7.Image = ((System.Drawing.Image)(resources.GetObject("lblRL7.Image"))); + this.lblRL7.Location = new System.Drawing.Point(230, 67); + this.lblRL7.Name = "lblRL7"; + this.lblRL7.Size = new System.Drawing.Size(19, 17); + this.lblRL7.TabIndex = 5; + this.lblRL7.Tag = "17"; + // + // lblRL3 + // + this.lblRL3.Image = ((System.Drawing.Image)(resources.GetObject("lblRL3.Image"))); + this.lblRL3.Location = new System.Drawing.Point(142, 67); + this.lblRL3.Name = "lblRL3"; + this.lblRL3.Size = new System.Drawing.Size(19, 17); + this.lblRL3.TabIndex = 5; + this.lblRL3.Tag = "13"; + // + // lblLL7 + // + this.lblLL7.Image = ((System.Drawing.Image)(resources.GetObject("lblLL7.Image"))); + this.lblLL7.Location = new System.Drawing.Point(230, 46); + this.lblLL7.Name = "lblLL7"; + this.lblLL7.Size = new System.Drawing.Size(19, 17); + this.lblLL7.TabIndex = 5; + this.lblLL7.Tag = "7"; + // + // lblLL3 + // + this.lblLL3.Image = ((System.Drawing.Image)(resources.GetObject("lblLL3.Image"))); + this.lblLL3.Location = new System.Drawing.Point(142, 46); + this.lblLL3.Name = "lblLL3"; + this.lblLL3.Size = new System.Drawing.Size(19, 17); + this.lblLL3.TabIndex = 5; + this.lblLL3.Tag = "3"; + // + // lblRL6 + // + this.lblRL6.Image = ((System.Drawing.Image)(resources.GetObject("lblRL6.Image"))); + this.lblRL6.Location = new System.Drawing.Point(208, 67); + this.lblRL6.Name = "lblRL6"; + this.lblRL6.Size = new System.Drawing.Size(19, 17); + this.lblRL6.TabIndex = 5; + this.lblRL6.Tag = "16"; + // + // lblRL2 + // + this.lblRL2.Image = ((System.Drawing.Image)(resources.GetObject("lblRL2.Image"))); + this.lblRL2.Location = new System.Drawing.Point(120, 67); + this.lblRL2.Name = "lblRL2"; + this.lblRL2.Size = new System.Drawing.Size(19, 17); + this.lblRL2.TabIndex = 5; + this.lblRL2.Tag = "12"; + // + // lblLL6 + // + this.lblLL6.Image = ((System.Drawing.Image)(resources.GetObject("lblLL6.Image"))); + this.lblLL6.Location = new System.Drawing.Point(208, 46); + this.lblLL6.Name = "lblLL6"; + this.lblLL6.Size = new System.Drawing.Size(19, 17); + this.lblLL6.TabIndex = 5; + this.lblLL6.Tag = "6"; + // + // lblRL5 + // + this.lblRL5.Image = ((System.Drawing.Image)(resources.GetObject("lblRL5.Image"))); + this.lblRL5.Location = new System.Drawing.Point(186, 67); + this.lblRL5.Name = "lblRL5"; + this.lblRL5.Size = new System.Drawing.Size(19, 17); + this.lblRL5.TabIndex = 5; + this.lblRL5.Tag = "15"; + // + // lblLL2 + // + this.lblLL2.Image = ((System.Drawing.Image)(resources.GetObject("lblLL2.Image"))); + this.lblLL2.Location = new System.Drawing.Point(120, 46); + this.lblLL2.Name = "lblLL2"; + this.lblLL2.Size = new System.Drawing.Size(19, 17); + this.lblLL2.TabIndex = 5; + this.lblLL2.Tag = "2"; + // + // lblLL5 + // + this.lblLL5.Image = ((System.Drawing.Image)(resources.GetObject("lblLL5.Image"))); + this.lblLL5.Location = new System.Drawing.Point(186, 46); + this.lblLL5.Name = "lblLL5"; + this.lblLL5.Size = new System.Drawing.Size(19, 17); + this.lblLL5.TabIndex = 5; + this.lblLL5.Tag = "5"; + // + // lblRL1 + // + this.lblRL1.Image = ((System.Drawing.Image)(resources.GetObject("lblRL1.Image"))); + this.lblRL1.Location = new System.Drawing.Point(98, 67); + this.lblRL1.Name = "lblRL1"; + this.lblRL1.Size = new System.Drawing.Size(19, 17); + this.lblRL1.TabIndex = 5; + this.lblRL1.Tag = "11"; + // + // lblRL4 + // + this.lblRL4.Image = ((System.Drawing.Image)(resources.GetObject("lblRL4.Image"))); + this.lblRL4.Location = new System.Drawing.Point(164, 67); + this.lblRL4.Name = "lblRL4"; + this.lblRL4.Size = new System.Drawing.Size(19, 17); + this.lblRL4.TabIndex = 5; + this.lblRL4.Tag = "14"; + // + // lblLL1 + // + this.lblLL1.Image = ((System.Drawing.Image)(resources.GetObject("lblLL1.Image"))); + this.lblLL1.Location = new System.Drawing.Point(98, 46); + this.lblLL1.Name = "lblLL1"; + this.lblLL1.Size = new System.Drawing.Size(19, 17); + this.lblLL1.TabIndex = 5; + this.lblLL1.Tag = "1"; + // + // lblLL4 + // + this.lblLL4.Image = ((System.Drawing.Image)(resources.GetObject("lblLL4.Image"))); + this.lblLL4.Location = new System.Drawing.Point(164, 46); + this.lblLL4.Name = "lblLL4"; + this.lblLL4.Size = new System.Drawing.Size(19, 17); + this.lblLL4.TabIndex = 5; + this.lblLL4.Tag = "4"; + // + // lblRL0 + // + this.lblRL0.Image = ((System.Drawing.Image)(resources.GetObject("lblRL0.Image"))); + this.lblRL0.Location = new System.Drawing.Point(76, 67); + this.lblRL0.Name = "lblRL0"; + this.lblRL0.Size = new System.Drawing.Size(19, 17); + this.lblRL0.TabIndex = 5; + this.lblRL0.Tag = "10"; + // + // lblLL0 + // + this.lblLL0.Image = ((System.Drawing.Image)(resources.GetObject("lblLL0.Image"))); + this.lblLL0.Location = new System.Drawing.Point(76, 46); + this.lblLL0.Name = "lblLL0"; + this.lblLL0.Size = new System.Drawing.Size(19, 17); + this.lblLL0.TabIndex = 5; + this.lblLL0.Tag = "0"; + // + // label18 + // + this.label18.AutoSize = true; + this.label18.Location = new System.Drawing.Point(7, 72); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(41, 12); + this.label18.TabIndex = 5; + this.label18.Text = "右限位"; + // + // label36 + // + this.label36.AutoSize = true; + this.label36.Location = new System.Drawing.Point(234, 24); + this.label36.Name = "label36"; + this.label36.Size = new System.Drawing.Size(11, 12); + this.label36.TabIndex = 5; + this.label36.Text = "7"; + // + // label27 + // + this.label27.Location = new System.Drawing.Point(248, 15); + this.label27.Name = "label27"; + this.label27.Size = new System.Drawing.Size(43, 26); + this.label27.TabIndex = 5; + this.label27.Text = "急停"; + this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // label35 + // + this.label35.AutoSize = true; + this.label35.Location = new System.Drawing.Point(212, 24); + this.label35.Name = "label35"; + this.label35.Size = new System.Drawing.Size(11, 12); + this.label35.TabIndex = 5; + this.label35.Text = "6"; + // + // label26 + // + this.label26.AutoSize = true; + this.label26.Location = new System.Drawing.Point(146, 24); + this.label26.Name = "label26"; + this.label26.Size = new System.Drawing.Size(11, 12); + this.label26.TabIndex = 5; + this.label26.Text = "3"; + // + // label34 + // + this.label34.AutoSize = true; + this.label34.Location = new System.Drawing.Point(190, 24); + this.label34.Name = "label34"; + this.label34.Size = new System.Drawing.Size(11, 12); + this.label34.TabIndex = 5; + this.label34.Text = "5"; + // + // label25 + // + this.label25.AutoSize = true; + this.label25.Location = new System.Drawing.Point(124, 24); + this.label25.Name = "label25"; + this.label25.Size = new System.Drawing.Size(11, 12); + this.label25.TabIndex = 5; + this.label25.Text = "2"; + // + // label33 + // + this.label33.AutoSize = true; + this.label33.Location = new System.Drawing.Point(168, 24); + this.label33.Name = "label33"; + this.label33.Size = new System.Drawing.Size(11, 12); + this.label33.TabIndex = 5; + this.label33.Text = "4"; + // + // label24 + // + this.label24.AutoSize = true; + this.label24.Location = new System.Drawing.Point(102, 24); + this.label24.Name = "label24"; + this.label24.Size = new System.Drawing.Size(11, 12); + this.label24.TabIndex = 5; + this.label24.Text = "1"; + // + // label20 + // + this.label20.AutoSize = true; + this.label20.Location = new System.Drawing.Point(80, 24); + this.label20.Name = "label20"; + this.label20.Size = new System.Drawing.Size(11, 12); + this.label20.TabIndex = 5; + this.label20.Text = "0"; + // + // label19 + // + this.label19.AutoSize = true; + this.label19.Location = new System.Drawing.Point(6, 24); + this.label19.Name = "label19"; + this.label19.Size = new System.Drawing.Size(29, 12); + this.label19.TabIndex = 5; + this.label19.Text = "轴号"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(7, 48); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(41, 12); + this.label17.TabIndex = 5; + this.label17.Text = "左限位"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.lblPRG_Status); + this.groupBox2.Controls.Add(this.lblPRG_Status_LED); + this.groupBox2.Controls.Add(this.btnStopBuffer); + this.groupBox2.Controls.Add(this.btnRunBuffer); + this.groupBox2.Controls.Add(this.txtLabelName); + this.groupBox2.Controls.Add(this.cboBufferNo); + this.groupBox2.Controls.Add(this.label22); + this.groupBox2.Controls.Add(this.label32); + this.groupBox2.Controls.Add(this.label21); + this.groupBox2.Location = new System.Drawing.Point(589, 6); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(314, 100); + this.groupBox2.TabIndex = 3; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Buffer 程序"; + // + // lblPRG_Status + // + this.lblPRG_Status.AutoSize = true; + this.lblPRG_Status.Location = new System.Drawing.Point(100, 53); + this.lblPRG_Status.Name = "lblPRG_Status"; + this.lblPRG_Status.Size = new System.Drawing.Size(29, 12); + this.lblPRG_Status.TabIndex = 11; + this.lblPRG_Status.Text = "停止"; + // + // lblPRG_Status_LED + // + this.lblPRG_Status_LED.Image = ((System.Drawing.Image)(resources.GetObject("lblPRG_Status_LED.Image"))); + this.lblPRG_Status_LED.Location = new System.Drawing.Point(75, 51); + this.lblPRG_Status_LED.Name = "lblPRG_Status_LED"; + this.lblPRG_Status_LED.Size = new System.Drawing.Size(19, 17); + this.lblPRG_Status_LED.TabIndex = 10; + this.lblPRG_Status_LED.Tag = "17"; + // + // btnStopBuffer + // + this.btnStopBuffer.Location = new System.Drawing.Point(240, 67); + this.btnStopBuffer.Name = "btnStopBuffer"; + this.btnStopBuffer.Size = new System.Drawing.Size(66, 23); + this.btnStopBuffer.TabIndex = 8; + this.btnStopBuffer.Text = "停止"; + this.btnStopBuffer.UseVisualStyleBackColor = true; + this.btnStopBuffer.Click += new System.EventHandler(this.btnStopBuffer_Click); + // + // btnRunBuffer + // + this.btnRunBuffer.Location = new System.Drawing.Point(166, 67); + this.btnRunBuffer.Name = "btnRunBuffer"; + this.btnRunBuffer.Size = new System.Drawing.Size(66, 23); + this.btnRunBuffer.TabIndex = 8; + this.btnRunBuffer.Text = "启动"; + this.btnRunBuffer.UseVisualStyleBackColor = true; + this.btnRunBuffer.Click += new System.EventHandler(this.btnRunBuffer_Click); + // + // txtLabelName + // + this.txtLabelName.Location = new System.Drawing.Point(206, 20); + this.txtLabelName.Name = "txtLabelName"; + this.txtLabelName.Size = new System.Drawing.Size(100, 21); + this.txtLabelName.TabIndex = 7; + // + // cboBufferNo + // + this.cboBufferNo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboBufferNo.FormattingEnabled = true; + this.cboBufferNo.Location = new System.Drawing.Point(77, 22); + this.cboBufferNo.Name = "cboBufferNo"; + this.cboBufferNo.Size = new System.Drawing.Size(72, 20); + this.cboBufferNo.TabIndex = 6; + // + // label22 + // + this.label22.AutoSize = true; + this.label22.Location = new System.Drawing.Point(164, 25); + this.label22.Name = "label22"; + this.label22.Size = new System.Drawing.Size(35, 12); + this.label22.TabIndex = 5; + this.label22.Text = "Label"; + // + // label32 + // + this.label32.AutoSize = true; + this.label32.Location = new System.Drawing.Point(10, 53); + this.label32.Name = "label32"; + this.label32.Size = new System.Drawing.Size(29, 12); + this.label32.TabIndex = 5; + this.label32.Text = "状态"; + // + // label21 + // + this.label21.AutoSize = true; + this.label21.Location = new System.Drawing.Point(10, 26); + this.label21.Name = "label21"; + this.label21.Size = new System.Drawing.Size(65, 12); + this.label21.TabIndex = 5; + this.label21.Text = "Buffer No."; + // + // label28 + // + this.label28.AutoSize = true; + this.label28.Location = new System.Drawing.Point(5, 28); + this.label28.Name = "label28"; + this.label28.Size = new System.Drawing.Size(47, 12); + this.label28.TabIndex = 5; + this.label28.Text = "Bit No."; + // + // grpIO + // + this.grpIO.Controls.Add(this.btnSW7); + this.grpIO.Controls.Add(this.btnSW6); + this.grpIO.Controls.Add(this.btnSW5); + this.grpIO.Controls.Add(this.btnSW4); + this.grpIO.Controls.Add(this.btnSW3); + this.grpIO.Controls.Add(this.btnSW2); + this.grpIO.Controls.Add(this.btnSW0); + this.grpIO.Controls.Add(this.btnSW1); + this.grpIO.Controls.Add(this.label29); + this.grpIO.Controls.Add(this.label23); + this.grpIO.Controls.Add(this.label42); + this.grpIO.Controls.Add(this.lblOUT7); + this.grpIO.Controls.Add(this.lblIN7); + this.grpIO.Controls.Add(this.label41); + this.grpIO.Controls.Add(this.lblOUT3); + this.grpIO.Controls.Add(this.lblIN3); + this.grpIO.Controls.Add(this.label40); + this.grpIO.Controls.Add(this.label39); + this.grpIO.Controls.Add(this.label38); + this.grpIO.Controls.Add(this.lblOUT6); + this.grpIO.Controls.Add(this.lblIN6); + this.grpIO.Controls.Add(this.label37); + this.grpIO.Controls.Add(this.lblOUT2); + this.grpIO.Controls.Add(this.lblIN2); + this.grpIO.Controls.Add(this.lblOUT5); + this.grpIO.Controls.Add(this.lblIN5); + this.grpIO.Controls.Add(this.label31); + this.grpIO.Controls.Add(this.label30); + this.grpIO.Controls.Add(this.label28); + this.grpIO.Controls.Add(this.lblOUT1); + this.grpIO.Controls.Add(this.lblIN1); + this.grpIO.Controls.Add(this.lblOUT0); + this.grpIO.Controls.Add(this.lblOUT4); + this.grpIO.Controls.Add(this.lblIN0); + this.grpIO.Controls.Add(this.lblIN4); + this.grpIO.Location = new System.Drawing.Point(589, 112); + this.grpIO.Name = "grpIO"; + this.grpIO.Size = new System.Drawing.Size(314, 132); + this.grpIO.TabIndex = 4; + this.grpIO.TabStop = false; + this.grpIO.Text = "通用 I/O"; + // + // btnSW7 + // + this.btnSW7.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW7.Location = new System.Drawing.Point(274, 97); + this.btnSW7.Name = "btnSW7"; + this.btnSW7.Size = new System.Drawing.Size(33, 25); + this.btnSW7.TabIndex = 7; + this.btnSW7.Text = "OFF"; + this.btnSW7.UseVisualStyleBackColor = true; + this.btnSW7.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW6 + // + this.btnSW6.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW6.Location = new System.Drawing.Point(242, 97); + this.btnSW6.Name = "btnSW6"; + this.btnSW6.Size = new System.Drawing.Size(33, 25); + this.btnSW6.TabIndex = 6; + this.btnSW6.Text = "OFF"; + this.btnSW6.UseVisualStyleBackColor = true; + this.btnSW6.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW5 + // + this.btnSW5.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW5.Location = new System.Drawing.Point(210, 97); + this.btnSW5.Name = "btnSW5"; + this.btnSW5.Size = new System.Drawing.Size(33, 25); + this.btnSW5.TabIndex = 5; + this.btnSW5.Text = "OFF"; + this.btnSW5.UseVisualStyleBackColor = true; + this.btnSW5.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW4 + // + this.btnSW4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW4.Location = new System.Drawing.Point(178, 97); + this.btnSW4.Name = "btnSW4"; + this.btnSW4.Size = new System.Drawing.Size(33, 25); + this.btnSW4.TabIndex = 4; + this.btnSW4.Text = "OFF"; + this.btnSW4.UseVisualStyleBackColor = true; + this.btnSW4.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW3 + // + this.btnSW3.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW3.Location = new System.Drawing.Point(146, 97); + this.btnSW3.Name = "btnSW3"; + this.btnSW3.Size = new System.Drawing.Size(33, 25); + this.btnSW3.TabIndex = 3; + this.btnSW3.Text = "OFF"; + this.btnSW3.UseVisualStyleBackColor = true; + this.btnSW3.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW2 + // + this.btnSW2.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW2.Location = new System.Drawing.Point(114, 97); + this.btnSW2.Name = "btnSW2"; + this.btnSW2.Size = new System.Drawing.Size(33, 25); + this.btnSW2.TabIndex = 2; + this.btnSW2.Text = "OFF"; + this.btnSW2.UseVisualStyleBackColor = true; + this.btnSW2.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW0 + // + this.btnSW0.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW0.Location = new System.Drawing.Point(50, 97); + this.btnSW0.Name = "btnSW0"; + this.btnSW0.Size = new System.Drawing.Size(33, 25); + this.btnSW0.TabIndex = 0; + this.btnSW0.Text = "OFF"; + this.btnSW0.UseVisualStyleBackColor = true; + this.btnSW0.Click += new System.EventHandler(this.btnSW_Click); + // + // btnSW1 + // + this.btnSW1.Font = new System.Drawing.Font("Microsoft Sans Serif", 7F); + this.btnSW1.Location = new System.Drawing.Point(82, 97); + this.btnSW1.Name = "btnSW1"; + this.btnSW1.Size = new System.Drawing.Size(33, 25); + this.btnSW1.TabIndex = 1; + this.btnSW1.Text = "OFF"; + this.btnSW1.UseVisualStyleBackColor = true; + this.btnSW1.Click += new System.EventHandler(this.btnSW_Click); + // + // label29 + // + this.label29.AutoSize = true; + this.label29.Location = new System.Drawing.Point(5, 74); + this.label29.Name = "label29"; + this.label29.Size = new System.Drawing.Size(29, 12); + this.label29.TabIndex = 5; + this.label29.Text = "输出"; + // + // label23 + // + this.label23.AutoSize = true; + this.label23.Location = new System.Drawing.Point(5, 51); + this.label23.Name = "label23"; + this.label23.Size = new System.Drawing.Size(29, 12); + this.label23.TabIndex = 5; + this.label23.Text = "输入"; + // + // label42 + // + this.label42.AutoSize = true; + this.label42.Location = new System.Drawing.Point(285, 28); + this.label42.Name = "label42"; + this.label42.Size = new System.Drawing.Size(11, 12); + this.label42.TabIndex = 5; + this.label42.Text = "7"; + // + // lblOUT7 + // + this.lblOUT7.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT7.Image"))); + this.lblOUT7.Location = new System.Drawing.Point(281, 72); + this.lblOUT7.Name = "lblOUT7"; + this.lblOUT7.Size = new System.Drawing.Size(19, 17); + this.lblOUT7.TabIndex = 5; + this.lblOUT7.Tag = "7"; + // + // lblIN7 + // + this.lblIN7.Image = ((System.Drawing.Image)(resources.GetObject("lblIN7.Image"))); + this.lblIN7.Location = new System.Drawing.Point(281, 49); + this.lblIN7.Name = "lblIN7"; + this.lblIN7.Size = new System.Drawing.Size(19, 17); + this.lblIN7.TabIndex = 5; + this.lblIN7.Tag = "7"; + // + // label41 + // + this.label41.AutoSize = true; + this.label41.Location = new System.Drawing.Point(253, 28); + this.label41.Name = "label41"; + this.label41.Size = new System.Drawing.Size(11, 12); + this.label41.TabIndex = 5; + this.label41.Text = "6"; + // + // lblOUT3 + // + this.lblOUT3.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT3.Image"))); + this.lblOUT3.Location = new System.Drawing.Point(153, 72); + this.lblOUT3.Name = "lblOUT3"; + this.lblOUT3.Size = new System.Drawing.Size(19, 17); + this.lblOUT3.TabIndex = 5; + this.lblOUT3.Tag = "3"; + // + // lblIN3 + // + this.lblIN3.Image = ((System.Drawing.Image)(resources.GetObject("lblIN3.Image"))); + this.lblIN3.Location = new System.Drawing.Point(153, 49); + this.lblIN3.Name = "lblIN3"; + this.lblIN3.Size = new System.Drawing.Size(19, 17); + this.lblIN3.TabIndex = 5; + this.lblIN3.Tag = "3"; + // + // label40 + // + this.label40.AutoSize = true; + this.label40.Location = new System.Drawing.Point(221, 28); + this.label40.Name = "label40"; + this.label40.Size = new System.Drawing.Size(11, 12); + this.label40.TabIndex = 5; + this.label40.Text = "5"; + // + // label39 + // + this.label39.AutoSize = true; + this.label39.Location = new System.Drawing.Point(189, 28); + this.label39.Name = "label39"; + this.label39.Size = new System.Drawing.Size(11, 12); + this.label39.TabIndex = 5; + this.label39.Text = "4"; + // + // label38 + // + this.label38.AutoSize = true; + this.label38.Location = new System.Drawing.Point(157, 28); + this.label38.Name = "label38"; + this.label38.Size = new System.Drawing.Size(11, 12); + this.label38.TabIndex = 5; + this.label38.Text = "3"; + // + // lblOUT6 + // + this.lblOUT6.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT6.Image"))); + this.lblOUT6.Location = new System.Drawing.Point(249, 72); + this.lblOUT6.Name = "lblOUT6"; + this.lblOUT6.Size = new System.Drawing.Size(19, 17); + this.lblOUT6.TabIndex = 5; + this.lblOUT6.Tag = "6"; + // + // lblIN6 + // + this.lblIN6.Image = ((System.Drawing.Image)(resources.GetObject("lblIN6.Image"))); + this.lblIN6.Location = new System.Drawing.Point(249, 49); + this.lblIN6.Name = "lblIN6"; + this.lblIN6.Size = new System.Drawing.Size(19, 17); + this.lblIN6.TabIndex = 5; + this.lblIN6.Tag = "6"; + // + // label37 + // + this.label37.AutoSize = true; + this.label37.Location = new System.Drawing.Point(125, 28); + this.label37.Name = "label37"; + this.label37.Size = new System.Drawing.Size(11, 12); + this.label37.TabIndex = 5; + this.label37.Text = "2"; + // + // lblOUT2 + // + this.lblOUT2.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT2.Image"))); + this.lblOUT2.Location = new System.Drawing.Point(121, 72); + this.lblOUT2.Name = "lblOUT2"; + this.lblOUT2.Size = new System.Drawing.Size(19, 17); + this.lblOUT2.TabIndex = 5; + this.lblOUT2.Tag = "2"; + // + // lblIN2 + // + this.lblIN2.Image = ((System.Drawing.Image)(resources.GetObject("lblIN2.Image"))); + this.lblIN2.Location = new System.Drawing.Point(121, 49); + this.lblIN2.Name = "lblIN2"; + this.lblIN2.Size = new System.Drawing.Size(19, 17); + this.lblIN2.TabIndex = 5; + this.lblIN2.Tag = "2"; + // + // lblOUT5 + // + this.lblOUT5.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT5.Image"))); + this.lblOUT5.Location = new System.Drawing.Point(217, 72); + this.lblOUT5.Name = "lblOUT5"; + this.lblOUT5.Size = new System.Drawing.Size(19, 17); + this.lblOUT5.TabIndex = 5; + this.lblOUT5.Tag = "5"; + // + // lblIN5 + // + this.lblIN5.Image = ((System.Drawing.Image)(resources.GetObject("lblIN5.Image"))); + this.lblIN5.Location = new System.Drawing.Point(217, 49); + this.lblIN5.Name = "lblIN5"; + this.lblIN5.Size = new System.Drawing.Size(19, 17); + this.lblIN5.TabIndex = 5; + this.lblIN5.Tag = "5"; + // + // label31 + // + this.label31.AutoSize = true; + this.label31.Location = new System.Drawing.Point(93, 28); + this.label31.Name = "label31"; + this.label31.Size = new System.Drawing.Size(11, 12); + this.label31.TabIndex = 5; + this.label31.Text = "1"; + // + // label30 + // + this.label30.AutoSize = true; + this.label30.Location = new System.Drawing.Point(61, 28); + this.label30.Name = "label30"; + this.label30.Size = new System.Drawing.Size(11, 12); + this.label30.TabIndex = 5; + this.label30.Text = "0"; + // + // lblOUT1 + // + this.lblOUT1.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT1.Image"))); + this.lblOUT1.Location = new System.Drawing.Point(89, 72); + this.lblOUT1.Name = "lblOUT1"; + this.lblOUT1.Size = new System.Drawing.Size(19, 17); + this.lblOUT1.TabIndex = 5; + this.lblOUT1.Tag = "1"; + // + // lblIN1 + // + this.lblIN1.Image = ((System.Drawing.Image)(resources.GetObject("lblIN1.Image"))); + this.lblIN1.Location = new System.Drawing.Point(89, 49); + this.lblIN1.Name = "lblIN1"; + this.lblIN1.Size = new System.Drawing.Size(19, 17); + this.lblIN1.TabIndex = 5; + this.lblIN1.Tag = "1"; + // + // lblOUT0 + // + this.lblOUT0.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT0.Image"))); + this.lblOUT0.Location = new System.Drawing.Point(57, 72); + this.lblOUT0.Name = "lblOUT0"; + this.lblOUT0.Size = new System.Drawing.Size(19, 17); + this.lblOUT0.TabIndex = 5; + this.lblOUT0.Tag = "0"; + // + // lblOUT4 + // + this.lblOUT4.Image = ((System.Drawing.Image)(resources.GetObject("lblOUT4.Image"))); + this.lblOUT4.Location = new System.Drawing.Point(185, 72); + this.lblOUT4.Name = "lblOUT4"; + this.lblOUT4.Size = new System.Drawing.Size(19, 17); + this.lblOUT4.TabIndex = 5; + this.lblOUT4.Tag = "4"; + // + // lblIN0 + // + this.lblIN0.Image = ((System.Drawing.Image)(resources.GetObject("lblIN0.Image"))); + this.lblIN0.Location = new System.Drawing.Point(57, 49); + this.lblIN0.Name = "lblIN0"; + this.lblIN0.Size = new System.Drawing.Size(19, 17); + this.lblIN0.TabIndex = 5; + this.lblIN0.Tag = "0"; + // + // lblIN4 + // + this.lblIN4.Image = ((System.Drawing.Image)(resources.GetObject("lblIN4.Image"))); + this.lblIN4.Location = new System.Drawing.Point(185, 49); + this.lblIN4.Name = "lblIN4"; + this.lblIN4.Size = new System.Drawing.Size(19, 17); + this.lblIN4.TabIndex = 5; + this.lblIN4.Tag = "4"; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.lstLog); + this.groupBox3.Controls.Add(this.btnEventProgramEnd); + this.groupBox3.Controls.Add(this.btnEventMotionEnd); + this.groupBox3.Location = new System.Drawing.Point(589, 250); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Size = new System.Drawing.Size(314, 235); + this.groupBox3.TabIndex = 5; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "事件回调"; + // + // lstLog + // + this.lstLog.FormattingEnabled = true; + this.lstLog.ItemHeight = 12; + this.lstLog.Location = new System.Drawing.Point(7, 50); + this.lstLog.Name = "lstLog"; + this.lstLog.Size = new System.Drawing.Size(299, 172); + this.lstLog.TabIndex = 1; + // + // btnEventProgramEnd + // + this.btnEventProgramEnd.Location = new System.Drawing.Point(159, 17); + this.btnEventProgramEnd.Name = "btnEventProgramEnd"; + this.btnEventProgramEnd.Size = new System.Drawing.Size(148, 23); + this.btnEventProgramEnd.TabIndex = 0; + this.btnEventProgramEnd.Text = "程序结束"; + this.btnEventProgramEnd.UseVisualStyleBackColor = true; + this.btnEventProgramEnd.Click += new System.EventHandler(this.btnEventProgramEnd_Click); + // + // btnEventMotionEnd + // + this.btnEventMotionEnd.Location = new System.Drawing.Point(7, 17); + this.btnEventMotionEnd.Name = "btnEventMotionEnd"; + this.btnEventMotionEnd.Size = new System.Drawing.Size(148, 23); + this.btnEventMotionEnd.TabIndex = 0; + this.btnEventMotionEnd.Text = "运动结束"; + this.btnEventMotionEnd.UseVisualStyleBackColor = true; + this.btnEventMotionEnd.Click += new System.EventHandler(this.btnEventMotionEnd_Click); + // + // rtxtTerminal + // + this.rtxtTerminal.Location = new System.Drawing.Point(9, 47); + this.rtxtTerminal.Name = "rtxtTerminal"; + this.rtxtTerminal.Size = new System.Drawing.Size(875, 162); + this.rtxtTerminal.TabIndex = 6; + this.rtxtTerminal.Text = ""; + // + // groupBox4 + // + this.groupBox4.Controls.Add(this.btnSend); + this.groupBox4.Controls.Add(this.txtCommand); + this.groupBox4.Controls.Add(this.rtxtTerminal); + this.groupBox4.Location = new System.Drawing.Point(11, 493); + this.groupBox4.Name = "groupBox4"; + this.groupBox4.Size = new System.Drawing.Size(892, 220); + this.groupBox4.TabIndex = 7; + this.groupBox4.TabStop = false; + this.groupBox4.Text = "命令行通讯"; + // + // btnSend + // + this.btnSend.Location = new System.Drawing.Point(784, 20); + this.btnSend.Name = "btnSend"; + this.btnSend.Size = new System.Drawing.Size(100, 23); + this.btnSend.TabIndex = 8; + this.btnSend.Text = "发送"; + this.btnSend.UseVisualStyleBackColor = true; + this.btnSend.Click += new System.EventHandler(this.btnSend_Click); + // + // txtCommand + // + this.txtCommand.Location = new System.Drawing.Point(9, 20); + this.txtCommand.Name = "txtCommand"; + this.txtCommand.Size = new System.Drawing.Size(769, 21); + this.txtCommand.TabIndex = 7; + this.txtCommand.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtCommand_KeyPress); + // + // groupBox5 + // + this.groupBox5.Controls.Add(this.groupBox9); + this.groupBox5.Controls.Add(this.groupBox8); + this.groupBox5.Controls.Add(this.groupBox7); + this.groupBox5.Controls.Add(this.groupBox6); + this.groupBox5.Location = new System.Drawing.Point(919, 12); + this.groupBox5.Name = "groupBox5"; + this.groupBox5.Size = new System.Drawing.Size(298, 592); + this.groupBox5.TabIndex = 8; + this.groupBox5.TabStop = false; + this.groupBox5.Text = "XYZ轴运动"; + // + // groupBox9 + // + this.groupBox9.Controls.Add(this.label56); + this.groupBox9.Controls.Add(this.label55); + this.groupBox9.Controls.Add(this.label54); + this.groupBox9.Controls.Add(this.label53); + this.groupBox9.Controls.Add(this.label52); + this.groupBox9.Controls.Add(this.label51); + this.groupBox9.Controls.Add(this.label50); + this.groupBox9.Controls.Add(this.label49); + this.groupBox9.Controls.Add(this.label47); + this.groupBox9.Location = new System.Drawing.Point(6, 447); + this.groupBox9.Name = "groupBox9"; + this.groupBox9.Size = new System.Drawing.Size(279, 139); + this.groupBox9.TabIndex = 3; + this.groupBox9.TabStop = false; + this.groupBox9.Text = "当前实际位置/规划位置(mm)"; + // + // label56 + // + this.label56.AutoSize = true; + this.label56.Location = new System.Drawing.Point(197, 95); + this.label56.Name = "label56"; + this.label56.Size = new System.Drawing.Size(11, 12); + this.label56.TabIndex = 8; + this.label56.Text = "0"; + // + // label55 + // + this.label55.AutoSize = true; + this.label55.Location = new System.Drawing.Point(197, 65); + this.label55.Name = "label55"; + this.label55.Size = new System.Drawing.Size(11, 12); + this.label55.TabIndex = 7; + this.label55.Text = "0"; + // + // label54 + // + this.label54.AutoSize = true; + this.label54.Location = new System.Drawing.Point(197, 34); + this.label54.Name = "label54"; + this.label54.Size = new System.Drawing.Size(11, 12); + this.label54.TabIndex = 6; + this.label54.Text = "0"; + // + // label53 + // + this.label53.AutoSize = true; + this.label53.Location = new System.Drawing.Point(127, 95); + this.label53.Name = "label53"; + this.label53.Size = new System.Drawing.Size(11, 12); + this.label53.TabIndex = 5; + this.label53.Text = "0"; + // + // label52 + // + this.label52.AutoSize = true; + this.label52.Location = new System.Drawing.Point(127, 65); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(11, 12); + this.label52.TabIndex = 4; + this.label52.Text = "0"; + // + // label51 + // + this.label51.AutoSize = true; + this.label51.Location = new System.Drawing.Point(127, 34); + this.label51.Name = "label51"; + this.label51.Size = new System.Drawing.Size(11, 12); + this.label51.TabIndex = 3; + this.label51.Text = "0"; + // + // label50 + // + this.label50.AutoSize = true; + this.label50.Location = new System.Drawing.Point(50, 95); + this.label50.Name = "label50"; + this.label50.Size = new System.Drawing.Size(17, 12); + this.label50.TabIndex = 2; + this.label50.Text = "Z:"; + // + // label49 + // + this.label49.AutoSize = true; + this.label49.Location = new System.Drawing.Point(50, 65); + this.label49.Name = "label49"; + this.label49.Size = new System.Drawing.Size(17, 12); + this.label49.TabIndex = 1; + this.label49.Text = "Y:"; + // + // label47 + // + this.label47.AutoSize = true; + this.label47.Location = new System.Drawing.Point(50, 34); + this.label47.Name = "label47"; + this.label47.Size = new System.Drawing.Size(17, 12); + this.label47.TabIndex = 0; + this.label47.Text = "X:"; + // + // groupBox8 + // + this.groupBox8.Controls.Add(this.button8); + this.groupBox8.Controls.Add(this.checkBox1); + this.groupBox8.Controls.Add(this.textBox3); + this.groupBox8.Controls.Add(this.textBox2); + this.groupBox8.Controls.Add(this.textBox1); + this.groupBox8.Controls.Add(this.label46); + this.groupBox8.Controls.Add(this.label45); + this.groupBox8.Controls.Add(this.label44); + this.groupBox8.Location = new System.Drawing.Point(6, 268); + this.groupBox8.Name = "groupBox8"; + this.groupBox8.Size = new System.Drawing.Size(283, 163); + this.groupBox8.TabIndex = 2; + this.groupBox8.TabStop = false; + this.groupBox8.Text = "定位"; + // + // button8 + // + this.button8.Location = new System.Drawing.Point(129, 122); + this.button8.Name = "button8"; + this.button8.Size = new System.Drawing.Size(120, 37); + this.button8.TabIndex = 7; + this.button8.Text = "移动到目标位置"; + this.button8.UseVisualStyleBackColor = true; + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(39, 133); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(48, 16); + this.checkBox1.TabIndex = 6; + this.checkBox1.Text = "等待"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // textBox3 + // + this.textBox3.Location = new System.Drawing.Point(149, 54); + this.textBox3.Name = "textBox3"; + this.textBox3.Size = new System.Drawing.Size(100, 21); + this.textBox3.TabIndex = 5; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(149, 87); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 21); + this.textBox2.TabIndex = 4; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(149, 21); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 21); + this.textBox1.TabIndex = 3; + // + // label46 + // + this.label46.AutoSize = true; + this.label46.Location = new System.Drawing.Point(39, 90); + this.label46.Name = "label46"; + this.label46.Size = new System.Drawing.Size(59, 12); + this.label46.TabIndex = 2; + this.label46.Text = "Z位置(mm)"; + // + // label45 + // + this.label45.AutoSize = true; + this.label45.Location = new System.Drawing.Point(39, 57); + this.label45.Name = "label45"; + this.label45.Size = new System.Drawing.Size(59, 12); + this.label45.TabIndex = 1; + this.label45.Text = "Y位置(mm)"; + // + // label44 + // + this.label44.AutoSize = true; + this.label44.Location = new System.Drawing.Point(39, 24); + this.label44.Name = "label44"; + this.label44.Size = new System.Drawing.Size(59, 12); + this.label44.TabIndex = 0; + this.label44.Text = "X位置(mm)"; + // + // groupBox7 + // + this.groupBox7.Controls.Add(this.button7); + this.groupBox7.Controls.Add(this.button6); + this.groupBox7.Controls.Add(this.button5); + this.groupBox7.Controls.Add(this.button4); + this.groupBox7.Location = new System.Drawing.Point(6, 100); + this.groupBox7.Name = "groupBox7"; + this.groupBox7.Size = new System.Drawing.Size(283, 160); + this.groupBox7.TabIndex = 1; + this.groupBox7.TabStop = false; + this.groupBox7.Text = "Jog"; + // + // button7 + // + this.button7.Location = new System.Drawing.Point(104, 107); + this.button7.Name = "button7"; + this.button7.Size = new System.Drawing.Size(75, 35); + this.button7.TabIndex = 3; + this.button7.Text = "Y后退"; + this.button7.UseVisualStyleBackColor = true; + // + // button6 + // + this.button6.Location = new System.Drawing.Point(198, 61); + this.button6.Name = "button6"; + this.button6.Size = new System.Drawing.Size(75, 35); + this.button6.TabIndex = 2; + this.button6.Text = "X右移"; + this.button6.UseVisualStyleBackColor = true; + // + // button5 + // + this.button5.Location = new System.Drawing.Point(10, 61); + this.button5.Name = "button5"; + this.button5.Size = new System.Drawing.Size(75, 35); + this.button5.TabIndex = 1; + this.button5.Text = "X左移"; + this.button5.UseVisualStyleBackColor = true; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(104, 12); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(75, 35); + this.button4.TabIndex = 0; + this.button4.Text = "Y前进"; + this.button4.UseVisualStyleBackColor = true; + // + // groupBox6 + // + this.groupBox6.Controls.Add(this.button3); + this.groupBox6.Controls.Add(this.button2); + this.groupBox6.Controls.Add(this.button1); + this.groupBox6.Location = new System.Drawing.Point(6, 24); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(283, 70); + this.groupBox6.TabIndex = 0; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "动作"; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(198, 24); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 30); + this.button3.TabIndex = 2; + this.button3.Text = "回原点"; + this.button3.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(104, 24); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 30); + this.button2.TabIndex = 1; + this.button2.Text = "停止"; + this.button2.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(10, 24); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 30); + this.button1.TabIndex = 0; + this.button1.Text = "开始"; + this.button1.UseVisualStyleBackColor = true; + // + // groupBox10 + // + this.groupBox10.Controls.Add(this.label48); + this.groupBox10.Controls.Add(this.textBox4); + this.groupBox10.Controls.Add(this.button10); + this.groupBox10.Controls.Add(this.button9); + this.groupBox10.Controls.Add(this.checkBox4); + this.groupBox10.Controls.Add(this.checkBox3); + this.groupBox10.Controls.Add(this.checkBox2); + this.groupBox10.Location = new System.Drawing.Point(919, 610); + this.groupBox10.Name = "groupBox10"; + this.groupBox10.Size = new System.Drawing.Size(295, 103); + this.groupBox10.TabIndex = 9; + this.groupBox10.TabStop = false; + this.groupBox10.Text = "XYZ循环"; + // + // label48 + // + this.label48.AutoSize = true; + this.label48.Location = new System.Drawing.Point(220, 65); + this.label48.Name = "label48"; + this.label48.Size = new System.Drawing.Size(17, 12); + this.label48.TabIndex = 7; + this.label48.Text = "次"; + // + // textBox4 + // + this.textBox4.Location = new System.Drawing.Point(179, 61); + this.textBox4.Name = "textBox4"; + this.textBox4.Size = new System.Drawing.Size(35, 21); + this.textBox4.TabIndex = 5; + // + // button10 + // + this.button10.Location = new System.Drawing.Point(94, 60); + this.button10.Name = "button10"; + this.button10.Size = new System.Drawing.Size(60, 23); + this.button10.TabIndex = 4; + this.button10.Text = "停止"; + this.button10.UseVisualStyleBackColor = true; + // + // button9 + // + this.button9.Location = new System.Drawing.Point(13, 60); + this.button9.Name = "button9"; + this.button9.Size = new System.Drawing.Size(60, 23); + this.button9.TabIndex = 3; + this.button9.Text = "运行"; + this.button9.UseVisualStyleBackColor = true; + // + // checkBox4 + // + this.checkBox4.AutoSize = true; + this.checkBox4.Location = new System.Drawing.Point(184, 21); + this.checkBox4.Name = "checkBox4"; + this.checkBox4.Size = new System.Drawing.Size(30, 16); + this.checkBox4.TabIndex = 2; + this.checkBox4.Text = "Z"; + this.checkBox4.UseVisualStyleBackColor = true; + // + // checkBox3 + // + this.checkBox3.AutoSize = true; + this.checkBox3.Location = new System.Drawing.Point(100, 21); + this.checkBox3.Name = "checkBox3"; + this.checkBox3.Size = new System.Drawing.Size(30, 16); + this.checkBox3.TabIndex = 1; + this.checkBox3.Text = "Y"; + this.checkBox3.UseVisualStyleBackColor = true; + // + // checkBox2 + // + this.checkBox2.AutoSize = true; + this.checkBox2.Location = new System.Drawing.Point(16, 21); + this.checkBox2.Name = "checkBox2"; + this.checkBox2.Size = new System.Drawing.Size(30, 16); + this.checkBox2.TabIndex = 0; + this.checkBox2.Text = "X"; + this.checkBox2.UseVisualStyleBackColor = true; + // + // MainForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(1226, 725); + this.Controls.Add(this.groupBox10); + this.Controls.Add(this.groupBox5); + this.Controls.Add(this.groupBox4); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.grpIO); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.grpSafety); + this.Controls.Add(this.grpMotionTest); + this.Controls.Add(this.groupBox1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "HexcalMC运动补偿"; + this.Load += new System.EventHandler(this.Form1_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.grpMotionTest.ResumeLayout(false); + this.grpMotionTest.PerformLayout(); + this.grpMst.ResumeLayout(false); + this.grpMst.PerformLayout(); + this.grpPositions.ResumeLayout(false); + this.grpPositions.PerformLayout(); + this.grpJog.ResumeLayout(false); + this.grpJog.PerformLayout(); + this.grpProfile.ResumeLayout(false); + this.grpProfile.PerformLayout(); + this.grpPTP.ResumeLayout(false); + this.grpPTP.PerformLayout(); + this.grpSafety.ResumeLayout(false); + this.grpSafety.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.grpIO.ResumeLayout(false); + this.grpIO.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.groupBox4.ResumeLayout(false); + this.groupBox4.PerformLayout(); + this.groupBox5.ResumeLayout(false); + this.groupBox9.ResumeLayout(false); + this.groupBox9.PerformLayout(); + this.groupBox8.ResumeLayout(false); + this.groupBox8.PerformLayout(); + this.groupBox7.ResumeLayout(false); + this.groupBox6.ResumeLayout(false); + this.groupBox10.ResumeLayout(false); + this.groupBox10.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Timer tmrMonitor; + private System.Windows.Forms.GroupBox grpMotionTest; + private System.Windows.Forms.ComboBox cboAxisNo; + private System.Windows.Forms.GroupBox grpJog; + private System.Windows.Forms.Button btnJogPos; + private System.Windows.Forms.Button btnJogNeg; + private System.Windows.Forms.TextBox txtJogVel; + private System.Windows.Forms.CheckBox chkUseVel; + private System.Windows.Forms.GroupBox grpProfile; + private System.Windows.Forms.Button btnDisable; + private System.Windows.Forms.Button btnEnable; + private System.Windows.Forms.TextBox txtJerk; + private System.Windows.Forms.TextBox txtKdec; + private System.Windows.Forms.TextBox txtDec; + private System.Windows.Forms.TextBox txtAcc; + private System.Windows.Forms.TextBox txtVel; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.GroupBox grpPTP; + private System.Windows.Forms.Button btnPTP_R_Neg; + private System.Windows.Forms.Button btnPTP; + private System.Windows.Forms.TextBox txtPTP_Pos; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.TextBox txtPort; + private System.Windows.Forms.TextBox txtIP; + private System.Windows.Forms.Button btnClose; + private System.Windows.Forms.Button btnOpen; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.RadioButton rdoTCP; + private System.Windows.Forms.RadioButton rdoSimu; + private System.Windows.Forms.Button btnHalt; + private System.Windows.Forms.GroupBox grpMst; + private System.Windows.Forms.Label label16; + private System.Windows.Forms.Label label15; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.GroupBox grpPositions; + private System.Windows.Forms.Button btnSetZero; + private System.Windows.Forms.TextBox txtPE; + private System.Windows.Forms.TextBox txtFPOS; + private System.Windows.Forms.TextBox txtRPOS; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.Button btnDisableAll; + private System.Windows.Forms.Button btnPTP_R_Pos; + private System.Windows.Forms.Button btnHallAll; + private System.Windows.Forms.Label lblMoving; + private System.Windows.Forms.Label lblEnable; + private System.Windows.Forms.Label lblInPos; + private System.Windows.Forms.Label lblAcc; + private System.Windows.Forms.GroupBox grpSafety; + private System.Windows.Forms.Label lblEMG; + private System.Windows.Forms.Label lblRL7; + private System.Windows.Forms.Label lblRL3; + private System.Windows.Forms.Label lblLL7; + private System.Windows.Forms.Label lblLL3; + private System.Windows.Forms.Label lblRL6; + private System.Windows.Forms.Label lblRL2; + private System.Windows.Forms.Label lblLL6; + private System.Windows.Forms.Label lblRL5; + private System.Windows.Forms.Label lblLL2; + private System.Windows.Forms.Label lblLL5; + private System.Windows.Forms.Label lblRL1; + private System.Windows.Forms.Label lblRL4; + private System.Windows.Forms.Label lblLL1; + private System.Windows.Forms.Label lblLL4; + private System.Windows.Forms.Label lblRL0; + private System.Windows.Forms.Label lblLL0; + private System.Windows.Forms.Label label18; + private System.Windows.Forms.Label label36; + private System.Windows.Forms.Label label27; + private System.Windows.Forms.Label label35; + private System.Windows.Forms.Label label26; + private System.Windows.Forms.Label label34; + private System.Windows.Forms.Label label25; + private System.Windows.Forms.Label label33; + private System.Windows.Forms.Label label24; + private System.Windows.Forms.Label label20; + private System.Windows.Forms.Label label19; + private System.Windows.Forms.Label label17; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.ComboBox cboBufferNo; + private System.Windows.Forms.Label label21; + private System.Windows.Forms.Button btnStopBuffer; + private System.Windows.Forms.Button btnRunBuffer; + private System.Windows.Forms.TextBox txtLabelName; + private System.Windows.Forms.Label label22; + private System.Windows.Forms.Label label28; + private System.Windows.Forms.Label lblPRG_Status; + private System.Windows.Forms.Label lblPRG_Status_LED; + private System.Windows.Forms.GroupBox grpIO; + private System.Windows.Forms.Button btnSW7; + private System.Windows.Forms.Button btnSW6; + private System.Windows.Forms.Button btnSW5; + private System.Windows.Forms.Button btnSW4; + private System.Windows.Forms.Button btnSW3; + private System.Windows.Forms.Button btnSW2; + private System.Windows.Forms.Button btnSW0; + private System.Windows.Forms.Button btnSW1; + private System.Windows.Forms.Label label29; + private System.Windows.Forms.Label label23; + private System.Windows.Forms.Label label42; + private System.Windows.Forms.Label lblOUT7; + private System.Windows.Forms.Label lblIN7; + private System.Windows.Forms.Label label41; + private System.Windows.Forms.Label lblOUT3; + private System.Windows.Forms.Label lblIN3; + private System.Windows.Forms.Label label40; + private System.Windows.Forms.Label label39; + private System.Windows.Forms.Label label38; + private System.Windows.Forms.Label lblOUT6; + private System.Windows.Forms.Label lblIN6; + private System.Windows.Forms.Label label37; + private System.Windows.Forms.Label lblOUT2; + private System.Windows.Forms.Label lblIN2; + private System.Windows.Forms.Label lblOUT5; + private System.Windows.Forms.Label lblIN5; + private System.Windows.Forms.Label label31; + private System.Windows.Forms.Label label30; + private System.Windows.Forms.Label lblOUT1; + private System.Windows.Forms.Label lblIN1; + private System.Windows.Forms.Label lblOUT0; + private System.Windows.Forms.Label lblOUT4; + private System.Windows.Forms.Label lblIN0; + private System.Windows.Forms.Label lblIN4; + private System.Windows.Forms.Label label32; + private System.Windows.Forms.TextBox txtFVEL; + private System.Windows.Forms.Label label43; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.Button btnEventProgramEnd; + private System.Windows.Forms.Button btnEventMotionEnd; + private System.Windows.Forms.ListBox lstLog; + private System.Windows.Forms.RichTextBox rtxtTerminal; + private System.Windows.Forms.GroupBox groupBox4; + private System.Windows.Forms.Button btnSend; + private System.Windows.Forms.TextBox txtCommand; + private System.Windows.Forms.GroupBox groupBox5; + private System.Windows.Forms.GroupBox groupBox9; + private System.Windows.Forms.GroupBox groupBox8; + private System.Windows.Forms.Button button8; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.TextBox textBox3; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label46; + private System.Windows.Forms.Label label45; + private System.Windows.Forms.Label label44; + private System.Windows.Forms.GroupBox groupBox7; + private System.Windows.Forms.Button button7; + private System.Windows.Forms.Button button6; + private System.Windows.Forms.Button button5; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.GroupBox groupBox6; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.GroupBox groupBox10; + private System.Windows.Forms.Label label48; + private System.Windows.Forms.TextBox textBox4; + private System.Windows.Forms.Button button10; + private System.Windows.Forms.Button button9; + private System.Windows.Forms.CheckBox checkBox4; + private System.Windows.Forms.CheckBox checkBox3; + private System.Windows.Forms.CheckBox checkBox2; + private System.Windows.Forms.Label label56; + private System.Windows.Forms.Label label55; + private System.Windows.Forms.Label label54; + private System.Windows.Forms.Label label53; + private System.Windows.Forms.Label label52; + private System.Windows.Forms.Label label51; + private System.Windows.Forms.Label label50; + private System.Windows.Forms.Label label49; + private System.Windows.Forms.Label label47; + } +} + diff --git a/HexcalMC/Motion/Motion.cs b/HexcalMC/Motion/Motion.cs new file mode 100644 index 0000000..82721b6 --- /dev/null +++ b/HexcalMC/Motion/Motion.cs @@ -0,0 +1,971 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Threading; +using System.IO; +using ACS.SPiiPlusNET; // ACS .NET Library +using System.Runtime.InteropServices; + +namespace HexcalMC +{ + public partial class Motion : Form + { + private Api _ACS; + + private const int MAX_AXIS_COUNT = 32; + private const int MAX_BUFFER_CNT = 64; + + private const int MAX_UI_LIMIT_CNT = 8; + private const int MAX_UI_IO_CNT = 8; + + private int m_nTotalAxis = 0; + private int m_nTotalBuffer = 0; + private Axis[] m_arrAxisList = null; + + private bool m_bConnected = false; + + // For update values + private MotorStates m_nMotorState; //运动状态 + private ProgramStates m_nProgramState; //程序状态 + private object m_objReadVar = null; + private Array m_arrReadVector = null; + private double m_lfRPos, m_lfFPos, m_lfPE, m_lfFVEL; //参考位置,反馈位置 位置误差 反馈速度 double类型 + private int m_nValues, m_nOutputState; + + + private Label[] m_lblLeftLimit; //左限位 + private Label[] m_lblRightLimit; //右限位 + private Label[] m_lblInput; + private Label[] m_lblOutput; + private Button[] m_btnOutput; + + public Motion() + { + InitializeComponent(); + + _ACS = new Api(); //初始化 ACS运动控制类 + + // Register Event 注册时间 + _ACS.PHYSICALMOTIONEND += _ACS_PHYSICALMOTIONEND; + _ACS.PROGRAMEND += _ACS_PROGRAMEND; + } + + #region Initialize + + private void Form1_Load(object sender, EventArgs e) + { + rdoTCP.Checked = true; + btnOpen.Enabled = true; + btnClose.Enabled = false; + + m_lblLeftLimit = new Label[MAX_UI_LIMIT_CNT]; //左限位 + m_lblLeftLimit[0] = lblLL0; + m_lblLeftLimit[1] = lblLL1; + m_lblLeftLimit[2] = lblLL2; + m_lblLeftLimit[3] = lblLL3; + m_lblLeftLimit[4] = lblLL4; + m_lblLeftLimit[5] = lblLL5; + m_lblLeftLimit[6] = lblLL6; + m_lblLeftLimit[7] = lblLL7; + + m_lblRightLimit = new Label[MAX_UI_LIMIT_CNT]; //有限位 + m_lblRightLimit[0] = lblRL0; + m_lblRightLimit[1] = lblRL1; + m_lblRightLimit[2] = lblRL2; + m_lblRightLimit[3] = lblRL3; + m_lblRightLimit[4] = lblRL4; + m_lblRightLimit[5] = lblRL5; + m_lblRightLimit[6] = lblRL6; + m_lblRightLimit[7] = lblRL7; + + m_lblInput = new Label[MAX_UI_IO_CNT]; + m_lblInput[0] = lblIN0; + m_lblInput[1] = lblIN1; + m_lblInput[2] = lblIN2; + m_lblInput[3] = lblIN3; + m_lblInput[4] = lblIN4; + m_lblInput[5] = lblIN5; + m_lblInput[6] = lblIN6; + m_lblInput[7] = lblIN7; + + m_lblOutput = new Label[MAX_UI_IO_CNT]; + m_lblOutput[0] = lblOUT0; + m_lblOutput[1] = lblOUT1; + m_lblOutput[2] = lblOUT2; + m_lblOutput[3] = lblOUT3; + m_lblOutput[4] = lblOUT4; + m_lblOutput[5] = lblOUT5; + m_lblOutput[6] = lblOUT6; + m_lblOutput[7] = lblOUT7; + + m_btnOutput = new Button[MAX_UI_IO_CNT]; + m_btnOutput[0] = btnSW0; + m_btnOutput[1] = btnSW1; + m_btnOutput[2] = btnSW2; + m_btnOutput[3] = btnSW3; + m_btnOutput[4] = btnSW4; + m_btnOutput[5] = btnSW5; + m_btnOutput[6] = btnSW6; + m_btnOutput[7] = btnSW7; + + //m_nFault = new int[MAX_AXIS_COUNT]; + //Array.Clear(m_nFault, 0, MAX_AXIS_COUNT); + m_nOutputState = 0; + + // Clear connection list from SPiiPlus UserMode-Driver (UMD) + //TernminateUMD_Connection(); + + #region 副屏显示功能 + // Screen[] screens = Screen.AllScreens; + // Screen secondaryScreen = screens.Length > 1 ? screens[1] : screens[0]; // 如果有多个屏幕,选择第二个屏幕作为副屏幕 + // + // // 创建一个新的窗体实例 + // Form secondaryForm = new Form(); + // + // // 设置窗体的位置和大小以适应副屏幕 + // secondaryForm.StartPosition = FormStartPosition.Manual; + // secondaryForm.Location = secondaryScreen.Bounds.Location; + // secondaryForm.Size = secondaryScreen.Bounds.Size; + // + // // 可选:设置副屏窗体的标题、样式等其他属性 + // secondaryForm.Text = "副屏窗体"; + // // ... 其他属性设置 + // + // // 显示副屏窗体 + // secondaryForm.Show(); + + + #endregion + + } + + private void rdoTCP_CheckedChanged(object sender, EventArgs e) + { + txtIP.Enabled = true; + txtPort.Enabled = true; + } + + private void rdoSimu_CheckedChanged(object sender, EventArgs e) + { + txtIP.Enabled = false; + txtPort.Enabled = false; + } + + #endregion + + #region Communication - Open / Close + + private void btnOpen_Click(object sender, EventArgs e) + { + string strTemp; + int i; + //double lfTemp = 0.0f; + + try + { + if (rdoTCP.Checked) + { + // TCP/IP (Ethernet) + _ACS.OpenCommEthernetTCP( + txtIP.Text, // IP Address (Default : 10.0.0.100) + Convert.ToInt32(txtPort.Text.Trim())); // TCP/IP Port nubmer (default : 701) + } + else if (rdoSimu.Checked) + { + // Simmulation mode + _ACS.OpenCommSimulator(); + } + + m_bConnected = true; + + // Get Total number of axes + // Using Transaction function : return string text from controller, we need to convert to integer value + strTemp = _ACS.Transaction("?SYSINFO(13)"); + m_nTotalAxis = Convert.ToInt32(strTemp.Trim()); + + // Using Sysinfo function + //_ACS.GetSysInfo(_ACS.ACSC_SYS_NAXES_KEY, out lfTemp); + + // When we are using multi axes command (ex) ToPointM, HaltM, ...), we need to allocate the array size more 1. + // Because of the last delimeter (-1) + m_arrAxisList = new Axis[m_nTotalAxis + 1]; + for (i = 0; i < m_nTotalAxis; i++) + { + cboAxisNo.Items.Add(i.ToString()); + m_arrAxisList[i] = (Axis)i; + } + + // Insert '-1' at the last + m_arrAxisList[m_nTotalAxis] = Axis.ACSC_NONE; + cboAxisNo.SelectedIndex = 0; + + // Update current motion paramter to UI. + UpdateProfile(); + + strTemp = _ACS.Transaction("?SYSINFO(10)"); + m_nTotalBuffer = Convert.ToInt32(strTemp.Trim()); + for (i = 0; i < m_nTotalBuffer; i++) + { + cboBufferNo.Items.Add(i.ToString()); + } + + cboBufferNo.SelectedIndex = 0; + + btnOpen.Enabled = false; + btnClose.Enabled = true; + + // Set updating timer + tmrMonitor.Interval = 50; + tmrMonitor.Start(); + } + + catch (COMException comex) + { + MessageBox.Show("Connection fail", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine("Connection fail" + comex.Message); + + m_bConnected = false; + return; + } + + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + if (m_bConnected) _ACS.CloseComm(); + + tmrMonitor.Stop(); + + btnOpen.Enabled = true; + btnClose.Enabled = false; + } + + + /// + /// Terminate connections from SPiiPlus User Mode Driver + /// 终止来自 SPiiPlus 用户模式驱动程序的连接 + /// - Maximum connections up to 10 in UMD + /// + private void TernminateUMD_Connection() + { + try + { + string terminateExceptionConnName = "ACS.Framework.exe"; + + ACSC_CONNECTION_DESC[] connectionList = _ACS.GetConnectionsList(); + for (int index = 0; index < connectionList.Length; index++) + { + if (terminateExceptionConnName.CompareTo((string)connectionList[index].Application) != 0) + _ACS.TerminateConnection(connectionList[index]); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + } + + #endregion + + #region Update UI data from Controller + + /// + /// Update Motion Profile from Controller + /// + private void UpdateProfile() + { + if (m_bConnected) + { + txtVel.Text = _ACS.GetVelocity((Axis)cboAxisNo.SelectedIndex).ToString(); + txtAcc.Text = _ACS.GetAcceleration((Axis)cboAxisNo.SelectedIndex).ToString(); + txtDec.Text = _ACS.GetDeceleration((Axis)cboAxisNo.SelectedIndex).ToString(); + txtKdec.Text = _ACS.GetKillDeceleration((Axis)cboAxisNo.SelectedIndex).ToString(); + txtJerk.Text = _ACS.GetJerk((Axis)cboAxisNo.SelectedIndex).ToString(); + } + } + + private void cboAxisNo_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateProfile(); + } + + private void tmrMonitor_Tick(object sender, EventArgs e) + { + // Get selected axis number + int iAxisNo = cboAxisNo.SelectedIndex; + // Get selected buffer number + int iBufferNo = cboBufferNo.SelectedIndex; + + if (m_bConnected) + { + try + { + // Instruction 1. Using library functions - acsc_GetFPosition, acsc_GetRPosition, .... + // Instruction 2. Read ACS variable - Already defined almost things (FPOS, RPOS, ...) + // Motion parameters and state is array (Max length is total number of axes) + // + // * Library function can read only 1 axis information, so if you want to read several axes, you have to call the function many times. + // (This may cause communication delay.) + // Recommand (if you want to read many axes) : read/write variable using ReadVariable, ReadVariableScalar, ReadVariableVector, ReadVariableMatrix + + // + // Get Motor State + // ACSPL+ Variable : MST (integer) + m_nMotorState = _ACS.GetMotorState((Axis)iAxisNo); + + // Returned value is integer, you need to use bitmaks + if ((m_nMotorState & MotorStates.ACSC_MST_MOVE) != 0) lblMoving.Image = Properties.Resources.On; + else lblMoving.Image = Properties.Resources.Off; // 运动中 + if ((m_nMotorState & MotorStates.ACSC_MST_INPOS) != 0) lblInPos.Image = Properties.Resources.On; + else lblInPos.Image = Properties.Resources.Off; // 就位 + if ((m_nMotorState & MotorStates.ACSC_MST_ACC) != 0) lblAcc.Image = Properties.Resources.On; + else lblAcc.Image = Properties.Resources.Off; // 加速 + if ((m_nMotorState & MotorStates.ACSC_MST_ENABLE) != 0) lblEnable.Image = Properties.Resources.On; + else lblEnable.Image = Properties.Resources.Off; // 使能 + + // Reference position + // ACSPL+ Variable : RPOS (real) + m_lfRPos = _ACS.GetRPosition((Axis)iAxisNo); // 参考位置 + + // Feedback position (Encoder value) + // ACSPL+ Variable : FPO (real) + m_lfFPos = _ACS.GetFPosition((Axis)iAxisNo); //反馈位置 + + // PE (Position Error) + // There is no function in library. We need to use ReadVariable function + m_lfPE = (double)_ACS.ReadVariable("PE", ProgramBuffer.ACSC_NONE, iAxisNo, iAxisNo); //位置误差 + + // Feedback Velocity + m_lfFVEL = (double)_ACS.ReadVariable("FVEL", ProgramBuffer.ACSC_NONE, iAxisNo, iAxisNo); //实际速度 + + txtRPOS.Text = String.Format("{0:0.0000}", m_lfRPos); + txtFPOS.Text = String.Format("{0:0.0000}", m_lfFPos); + txtPE.Text = String.Format("{0:0.0000}", m_lfPE); + txtFVEL.Text = String.Format("{0:0.0000}", m_lfFVEL); + + // Program State 运动状态 + // State : Compiled, Running, Suspended, Autoroutine is running (ON syntax) + // + // ACSPL+ Variable : PST (integer) + m_nProgramState = _ACS.GetProgramState((ProgramBuffer)iBufferNo); + if ((m_nProgramState & ProgramStates.ACSC_PST_RUN) != 0) + { + lblPRG_Status_LED.Image = Properties.Resources.On; + lblPRG_Status.Text = "Running"; + } + else + { + lblPRG_Status_LED.Image = Properties.Resources.Off; + lblPRG_Status.Text = "Stop"; + } + + // Read left/right hardware limits state + // ACSPL+ Variable : FAULT (integer) + m_objReadVar = + _ACS.ReadVariableAsVector("FAULT", ProgramBuffer.ACSC_NONE, 0, m_nTotalAxis - 1, -1, -1); + if (m_objReadVar != null) + { + m_arrReadVector = m_objReadVar as Array; + if (m_arrReadVector != null) + { + for (int i = 0; i < m_nTotalAxis; i++) + { + UpdateLimitState(i, (int)m_arrReadVector.GetValue(i)); + } + } + } + + // Read digital input/output (Port means all of bits) + // If you want to read only 1 bit (not an integer), use "GetInput" function + m_nValues = _ACS.GetInputPort(0); // _ACS.ReadVariableAsVector("IN", -1, 0, 0, -1, -1); + UpdateIOState(m_nValues, true); + + m_nOutputState = _ACS.GetOutputPort(0); // _ACS.ReadVariableAsVector("OUT", -1, 0, 0, -1, -1); + UpdateIOState(m_nOutputState, false); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + } + + // Update limit state + private void UpdateLimitState(int axisNo, int fault) + { + if (axisNo < MAX_UI_LIMIT_CNT) + { + if ((fault & (int)SafetyControlMasks.ACSC_SAFETY_LL) != 0) + m_lblLeftLimit[axisNo].Image = Properties.Resources.Error; + else m_lblLeftLimit[axisNo].Image = Properties.Resources.Off; + if ((fault & (int)SafetyControlMasks.ACSC_SAFETY_RL) != 0) + m_lblRightLimit[axisNo].Image = Properties.Resources.Error; + else m_lblRightLimit[axisNo].Image = Properties.Resources.Off; + } + } + + // Update general I/O stae + private void UpdateIOState(int value, bool isInput) + { + int bitUpCnt = 0x01; + + for (int i = 0; i < MAX_UI_IO_CNT; i++) + { + if (isInput) + { + // Input state + if ((value & bitUpCnt) != 0) m_lblInput[i].Image = Properties.Resources.On; + else m_lblInput[i].Image = Properties.Resources.Off; + } + else + { + // Output state + if ((value & bitUpCnt) != 0) + { + m_btnOutput[i].Text = "OFF"; + m_lblOutput[i].Image = Properties.Resources.On; + } + else + { + m_btnOutput[i].Text = "ON"; + m_lblOutput[i].Image = Properties.Resources.Off; + } + } + + // 0x01 => 0x02 => 0x04 => 0x08 ... increase bit number + bitUpCnt = (0x01) << (i + 1); + } + } + + #endregion + + #region Motor Enable / Disable + + private void btnEnable_Click(object sender, EventArgs e) + { + // Enable selected axis + _ACS.Enable((Axis)cboAxisNo.SelectedIndex); + + // If you want to enable several axes, + // + // Ex) Eanble three axes (0, 1, 6) + // + // int[] AxisList = new int[] { 0, 1, 6, -1 }; !!!! Important !! Must insert '-1' at the last + // _ACS.EnableM(AxisList); + } + + private void btnDisable_Click(object sender, EventArgs e) + { + // Disable selected axis + _ACS.Disable((Axis)cboAxisNo.SelectedIndex); + // Disable multi axes : DisableM(int[] axisList) + } + + private void btnDisableAll_Click(object sender, EventArgs e) + { + // Disable all of axes + _ACS.DisableAll(); + } + + #endregion + + private void btnSetZero_Click(object sender, EventArgs e) + { + // Change current poisition as you want + // SetFPosition(Axis number, new position) + _ACS.SetFPosition((Axis)cboAxisNo.SelectedIndex, 0); + } + + #region Move to absolute position + + private void btnPTP_Click(object sender, EventArgs e) + { + double lfTargetPos = 0.0f; + try + { + if (txtPTP_Pos.Text.Length > 0) + { + lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text); + _ACS.ToPoint( + 0, // '0' - Absolute position + (Axis)cboAxisNo.SelectedIndex, // Axis number + lfTargetPos // Target position + ); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + #endregion + + #region Move to relative position (from current position) + + private void btnPTP_R_Neg_Click(object sender, EventArgs e) + { + double lfTargetPos = 0.0f; + try + { + if (txtPTP_Pos.Text.Length > 0) + { + lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text); + if (lfTargetPos > 0) + lfTargetPos = lfTargetPos * (-1); // Target position (from current position, step move) + + _ACS.ToPoint( + MotionFlags.ACSC_AMF_RELATIVE, // Flat + (Axis)cboAxisNo.SelectedIndex, // Axis number + lfTargetPos // Move distance + ); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + private void btnPTP_R_Pos_Click(object sender, EventArgs e) + { + double lfTargetPos = 0.0f; + try + { + if (txtPTP_Pos.Text.Length > 0) + { + lfTargetPos = Convert.ToDouble(txtPTP_Pos.Text); + if (lfTargetPos < 0) lfTargetPos = lfTargetPos * (-1); + + _ACS.ToPoint(MotionFlags.ACSC_AMF_RELATIVE, (Axis)cboAxisNo.SelectedIndex, lfTargetPos); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + #endregion + + #region Stop motion using deceleration (halt command) + + private void btnHalt_Click(object sender, EventArgs e) + { + try + { + _ACS.Halt((Axis)cboAxisNo.SelectedIndex); //使用 halt 命令减速 + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + private void btnHallAll_Click(object sender, EventArgs e) + { + try + { + // There is no halt all command, so you need to user HaltM function + // + // ex) You want to stop 0, 2, 5 axis + // int[] m_arrAxisList = new int[] { 0, 2, 5, -1 }; + // + if (m_arrAxisList != null) _ACS.HaltM(m_arrAxisList); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + #endregion + + #region JOG Command + + // Move negative direction + private void btnJogNeg_MouseDown(object sender, MouseEventArgs e) + { + double lfVelocity = 0.0f; + + try + { + if (chkUseVel.Checked) + { + lfVelocity = Convert.ToDouble(txtJogVel.Text.Trim()); + if (lfVelocity > 0) lfVelocity = lfVelocity * (-1); // Negative direction : Using - (minus) velocity + + _ACS.Jog( + MotionFlags.ACSC_AMF_VELOCITY, // Velocity flag 速度标志 + (Axis)cboAxisNo.SelectedIndex, // Axis number + lfVelocity // Velocity + ); + } + else + { + _ACS.Jog(0, (Axis)cboAxisNo.SelectedIndex, (double)GlobalDirection.ACSC_NEGATIVE_DIRECTION); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + // 정방향 이동 동작 + private void btnJogPos_MouseDown(object sender, MouseEventArgs e) + { + double lfVelocity = 0.0f; + + try + { + if (chkUseVel.Checked) + { + lfVelocity = Convert.ToDouble(txtJogVel.Text.Trim()); + if (lfVelocity < 0) lfVelocity = lfVelocity * (-1); + + _ACS.Jog(MotionFlags.ACSC_AMF_VELOCITY, (Axis)cboAxisNo.SelectedIndex, lfVelocity); + } + else + { + _ACS.Jog(0, (Axis)cboAxisNo.SelectedIndex, (double)GlobalDirection.ACSC_POSITIVE_DIRECTION); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + // Stop JOG motion + private void btnJog_MouseUp(object sender, MouseEventArgs e) + { + _ACS.Halt((Axis)cboAxisNo.SelectedIndex); + } + + #endregion + + #region Run/Stop Buffer Program + + private void btnRunBuffer_Click(object sender, EventArgs e) + { + string temp; + + try + { + if (txtLabelName.Text.Length > 0) + { + temp = txtLabelName.Text.ToUpper(); + // Allow _ (Under bar) or A ~ Z characters + if (temp[0] != 0x5F && (temp[0] < 0x41 || temp[0] > 0x5A)) + { + MessageBox.Show("Wrong 'Label' name inputed.", "ERROR", MessageBoxButtons.OK, + MessageBoxIcon.Information); + return; + } + + // Run buffer program from label position + _ACS.RunBuffer((ProgramBuffer)cboBufferNo.SelectedIndex, txtLabelName.Text.Trim()); + } + else + { + // Run buffer program from first line + _ACS.RunBuffer((ProgramBuffer)cboBufferNo.SelectedIndex, null); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + System.Diagnostics.Debug.WriteLine(ex.Message); + } + } + + private void btnStopBuffer_Click(object sender, EventArgs e) + { + // Stop program + _ACS.StopBuffer((ProgramBuffer)cboBufferNo.SelectedIndex); + } + + #endregion + + #region Change motion profile + + private void TextBoxes_KeyPress(object sender, KeyPressEventArgs e) + { + try + { + double lfTemp = 0.0f; + TextBox textBox = sender as TextBox; + if (textBox != null) + { + // Allow numbers (0 ~ 9), . (DOT), Backspace + if ((e.KeyChar >= 0x30 && e.KeyChar <= 0x39) || e.KeyChar == 0x2E || e.KeyChar == 0x08 || + e.KeyChar == (char)Keys.Return || e.KeyChar == (char)Keys.Enter) + { + if ((e.KeyChar == 0x2E) && (textBox.Text.Contains(Convert.ToString(0x2E)))) + e.KeyChar = (char)0x00; + if (e.KeyChar == (char)Keys.Return || e.KeyChar == (char)Keys.Enter) + { + e.Handled = true; + + lfTemp = Convert.ToDouble(textBox.Text.Trim()); + switch (textBox.TabIndex) + { + // Immediately change value (On the fly) : SetVelocityImm() + // Affect next motion : SetVelocity() + + case 0: + _ACS.SetVelocityImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 1: + _ACS.SetAccelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 2: + _ACS.SetDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 3: + _ACS.SetKillDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 4: + _ACS.SetJerkImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + } + + textBox.SelectAll(); + } + } + else e.KeyChar = (char)0x00; + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine("TextBoxes_KeyPress() Error\n" + ex.ToString()); + } + } + + private void TextBoxes_Enter(object sender, EventArgs e) + { + try + { + TextBox textBox = sender as TextBox; + if (textBox != null) textBox.SelectAll(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine("TextBoxes_Enter() Error\n" + ex.ToString()); + } + } + + private void TextBoxes_Leave(object sender, EventArgs e) + { + try + { + double lfTemp = 0.0f; + + TextBox textBox = sender as TextBox; + if (textBox == null) return; + + lfTemp = Convert.ToDouble(textBox.Text.Trim()); + switch (textBox.TabIndex) + { + case 0: + _ACS.SetVelocityImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 1: + _ACS.SetAccelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 2: + _ACS.SetDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 3: + _ACS.SetKillDecelerationImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + case 4: + _ACS.SetJerkImm((Axis)cboAxisNo.SelectedIndex, lfTemp); + break; + } + + textBox.SelectAll(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine("TextBoxes_Leave() Error\n" + ex.ToString()); + } + } + + #endregion + + #region On and Off General Output + + private void btnSW_Click(object sender, EventArgs e) + { + int nBitNo = 0x01; + + try + { + Button btn = sender as Button; + if (btn == null) return; + + nBitNo = btn.TabIndex; + nBitNo = (0x01) << nBitNo; //左移几位 + + if ((m_nOutputState & nBitNo) != 0) + { + // Set only 1 bit + _ACS.SetOutput( + 0, // Port number + btn.TabIndex, // Bit number + 0 // 0 = OFF, 1 = ON + ); + + // If your I/O device is EtherCAT type, you cannot use this function + // You can use WriteVariable function and Command function + // + // Ex) If EtherCAT mapped variable is 'EC_DOUT' + // Want to ON bit '3' + // _ACS.Command("EC_DOUT.3=1"); + } + else + { + _ACS.SetOutput(0, btn.TabIndex, 1); + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine("btnSW_Click() Error\n" + ex.ToString()); + } + } + + #endregion + + #region Event + + private void btnEventMotionEnd_Click(object sender, EventArgs e) + { + //_ACS.PHYSICALMOTIONEND +=_ACS_PHYSICALMOTIONEND; + _ACS.EnableEvent(Interrupts.ACSC_INTR_PHYSICAL_MOTION_END); + lstLog.Items.Add("PHYSICAL_MOTION_END event enabled"); + } + + void _ACS_PHYSICALMOTIONEND(AxisMasks axis) + { + int bit = 0x01; + int axisNo = 0; + // Param value is bit number + // Bit Number = Axis Number + for (int i = 0; i < 64; i++) + { + if ((int)axis == bit) + { + axisNo = i; + break; + } + + bit = bit << 1; + } + + // Add log to ListBox + this.Invoke((MethodInvoker)delegate + { + lstLog.Items.Add(String.Format(" - Axis {0}, Stoppped", axisNo)); + lstLog.SelectedIndex = lstLog.Items.Count - 1; + }); + } + + private void btnEventProgramEnd_Click(object sender, EventArgs e) + { + //_ACS.PROGRAMEND += _ACS_PROGRAMEND; + _ACS.EnableEvent(Interrupts.ACSC_INTR_PROGRAM_END); + lstLog.Items.Add("PROGRAM_END event enabled"); + } + + void _ACS_PROGRAMEND(BufferMasks buffer) + { + int bit = 0x01; + int bufferNo = 0; + // Param value is bit number + // Bit Number = Axis Number + for (int i = 0; i < 32; i++) + { + if ((int)buffer == bit) + { + bufferNo = i; + break; + } + + bit = bit << 1; + } + + // Add log to ListBox + this.Invoke((MethodInvoker)delegate + { + lstLog.Items.Add(String.Format(" - Buffer {0}, Stoppped", bufferNo)); + lstLog.SelectedIndex = lstLog.Items.Count - 1; + }); + } + + #endregion + + #region Communication Termial - Using Transaction function + + private void txtCommand_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar == (char)Keys.Enter) + btnSend.PerformClick(); + } + + private void btnSend_Click(object sender, EventArgs e) + { + string temp = string.Empty; + if (m_bConnected) + { + try + { + AppendTextToTextBox("> " + txtCommand.Text.Trim()); + temp = _ACS.Transaction(txtCommand.Text.Trim()); + } + catch (ACS.SPiiPlusNET.ACSException ex) + { + temp = String.Format("?{0}", ex.ErrorCode); + } + finally + { + if (temp.Length > 0) + { + AppendTextToTextBox(temp); + AppendTextToTextBox(":"); + } + } + + txtCommand.Focus(); + txtCommand.SelectAll(); + } + } + + private void AppendTextToTextBox(string text) + { + rtxtTerminal.AppendText(text); + rtxtTerminal.AppendText(Environment.NewLine); + rtxtTerminal.ScrollToCaret(); + } + + #endregion + } +} \ No newline at end of file diff --git a/HexcalMC/Motion/Motion.resx b/HexcalMC/Motion/Motion.resx new file mode 100644 index 0000000..8a60b22 --- /dev/null +++ b/HexcalMC/Motion/Motion.resx @@ -0,0 +1,1561 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + + Qk02BQAAAAAAADYEAAAoAAAAEAAAABAAAAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAt7e3/7i4 + uP+8vLz/vb29/7+/v//BwcH/wsLC/8PDw//FxcX/xsbG/8fHx//IyMj/ycnJ/8rKyv/Ly8v/zMzM/83N + zf/Ozs7/z8/P/9DQ0P/R0dH/0tLS/9PT0//U1NT/1dXV/9bW1v/X19f/2NjY/9nZ2f/a2tr/29vb/9zc + 3P/d3d3/3t7e/9/f3//g4OD/4eHh/+Tk5P/39/f/+Pj4//n5+f//////AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/ygo + KCgmFwICAAIXJigoKCgoKCgXAgcPDw8PBwIXKCgoKCgPBw8PDw8PDw8PAgcoKCgfBxcXFw8PDw8PDw8C + FygoBxcXFxcXFxcPDw8PDwImHw8XFxcXFxcXFw8PDw8HFwcXFxcXFxcXFxcXDw8PDwIHHx8fHx8fFxcX + FxcPDw8ABx8fHx8fHx8XFxcXDw8PAg8fHx8fHx8fHxcXFw8PDwIfFx8lJSUfHx8XFxcXDwcXKA8lJSUl + Hx8fFxcXFw8CJigfFyUlJR8fHxcXFxcHFygoKBcXJR8fHx8XFxcHDygoKCgoHw8XHx8fFw8HHygoKCgo + KCgoHw8HBwcfKCgoKCg= + + + + 25 + + + + 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 + AP2YeQD+mXsA/Zl7AP2afAD+mXsA/Zl7AP2afAD/5r9C/+a/Qv/kvUD95r9C/+a/Qv/vxkb9q4gE/4lr + AP+RcgD9hmQA/+nbt///9er/elYA/cCsXP//+vH9/////9/NnP+ScwD9lXUA/5t9AP+ZewD9m30A/5t9 + AP+ZewD95r9C/+a/Qv/kvUD95r9C/+nBQf/JqT/9zbh2/9G6cP/KsmH9z7x5///////9+/X/w6ZK/cCl + SP///v39/Pjw///+/P/////9sZo7/5Z3AP+ZewD9m30A/5t9AP+ZewD95L1A/eS9QP3lvkH+5L1A/eS7 + Nv3025v+knUA/ebSn/3/8NH+/////f7///3////9+eS8/vnmwP33687+/////f7///3////+xbJq/ZJy + AP2afAD+mXsA/Zl7AP2XeQD+5r9C/+a/Qv/kvUD95r9C/+S7Nv/33Z390Lt4/3tYAP/ItWz9//////// + ////////8tyt/fXiuf/z3Kz9/fz3///////////9wq9k/5R0AP+ZewD9m30A/5Z4AP+mhgn95r9C/+a/ + Qv/kvUD95r9C/+S7Nv/v1Y79//Te/5R1AP//+O79+u3V//z06f//////+OO6/fXiuf/z37X99eK8//// + ///////9wq9k/5R0AP+ZewD9lngA/51+Af/xyUz95r9C/+a/Qv/kvUD95r9C/+S7Nv/v1Y799eK6///5 + 7v/779z9+u/b//vv2//269P/xKlT/f/02v/45cD99N6v//z06P/////9wq9k/5R0AP+UdwD9nX4B//DI + S//mv0L95L1A/eS9QP3lvkH+5L1A/eO6NP3v1Iz+9eTC/f////368uL++OzX/frv3f388eL9gF4A/pl7 + AP3l0p7+//DU/fXgtf3////+wq9k/Y1uAP2dfgH+8chL/ea/Qv3lvkH+5r9C/+a/Qv/kvUD95r9C/+S7 + Nv/tz4H9/v7//////////v/9+evU//zx3v/88uP/i2oA/Zl6AP+MbAD9rI8l/+3asv/////9vq5o/5Z1 + AP/wyEv96MBD/+a/Qv/kvUD95L1A/eS9QP3lvkH+5L1A/eK4MP3047P+/////f39/v3+///+/PXr/fnu + 2f388uP9i2oA/pl7AP2YegD+iGwA/dKqHf311oP+yrhz/enAPP3mv0L+5L1A/eS9QP3lvkH+5r9C/+a/ + Qv/kvUD95r9C/+W+P//lvT399uvI///////+///9/v////ru2v/88uP/i2oA/Zp8AP+OcQD937k8/+zE + R//jujf96b87/+fAQ//kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvD3947Yn/+fD + Tv/8+vH9///////9+v/8797/imkA/Y5xAP/huz797MRH/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD95L1A/+S9QP/lvkH+5L1A/eS9QP3lvkH+5L1A/eO7Of3hsyD+7dF5/f////3++fX9gF8A/uG7 + Pv3qwkX+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+9MpGVua/Qv/kvUD/5r9C/+a/ + Qv/kvUD95r9C/+a/Qv/kvUD95Lo1/+O3KP/v3af/1K0n/evER//kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAAAADtxEOi5r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a+ + QP/luzb/58BD/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD9AAAAAAAA + AAAAAAAA/9hKHejAQdTlvkH/5L1A/+S9QP3lvkH+5L1A/eS9QP3kvUD95b5B/uS9QP3lvkH+5L1A/eS9 + QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9QP3lvkH+AAAAAAAAAAAAAAAAAAAAAAAAAAD6z0dM58BC+Oa/ + Qv/kvUD+5r9C/+a/Qv/mv0L/5L1A/ea/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/ + Qv/kvUD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPPKRn7kvUD/5r9C/+a/Qv/mv0L/5L1A/ea/ + Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD95r9C/+a/Qv/kvUD/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADwx0QD5L1AoOS9QPzkvUD+5b5B/uS9QP3lvkH+5L1A/eS9QP3lvkH+5L1A/eS9 + QP3lvkH+5L1A/eS9QP/lvkHpAAA/AAAADwAAAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAADgAAAA+AAAAP4AAAD/AAAAKAAAACAA + AABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAOa/Qtjmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/XsjX/lHUA/5p9AP+bfQD/m30A/5t9 + AP+bfQDBm30AKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xuAP+afQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30AtaaGAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9OuMf+MbgD/mn0A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5x+AIIAAAAAAAAAAAAAAAAAAAAAAAAAAOa/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7GSf/TrjH/jG4A/5p9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqegABOAAAAAAAA + AAAAAAAA5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/uxkn/064x/4xu + AP+afQD/lXYA/5NzAP+YegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQDWooMAHwAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/7sZJ/9Ou + Mf+MbgD/mn0A/5R1AP+5o03/39Gk/5t9AP+QbwD/mnwA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30AeOa/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+7G + Sf/TrjH/jG4A/5p9AP+ZewD/kXIA///58f+dgAX//////9G9gf+MawD/lHQA/5t8AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/uxkn/064x/4xuAP+afQD/m30A/45tAP/dzJn///bq/39bAP/j06j////7///79f+6o0z/iGcA/5d4 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/7sZI/9KtL/+LbQD/mnwA/5p8AP+XeAD/nYAI///////47tr/i2kA/5N0AP////7//PHf///+ + 9//269b/pIcX/4xrAP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+nCRP/Oqi3/h2sA/5FyAP+RcgD/kXIA/4VjAP/u4sT///Tl//fq0/+CYAD/hmQA/8Gr + XP//9+r/+e3X//zx3v////3/4dCi/5l7AP+ZegD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/6b87/8y0bP/p16n////y///02v//8NH///no///////////////////u + zP//8tb/+ua+////////////////////////////3NKn/5FwAP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL//+3J/4ZnAP+pjCD/9eO///nluv/+//////////// + ///+/v7/892u//Xiuf/04LT/9+nM///////////////////////VyJT/kXAA/5t9AP+bfQD/m30A/5t9 + AP+bfQD/mXsA/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mv/55Lj/38uU/4hoAP+DYgD/3c6f//// + //////////////7+/v/z3a7/9eK5//Xiuf/z3Kv//fz5/////////////////9XIlP+RcAD/m30A/5t9 + AP+bfQD/m30A/5h6AP+dfwL/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5Loy//Perv//89v/o4YT/45v + AP///Pf/+e3Y//348//+/////v////Pdrv/14rn/9eK5//Thtv/1473/////////////////1ciU/5Fw + AP+bfQD/m30A/5t9AP+YegD/lHcA/+7GSf/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/kujL/896u//jm + wv/o0pz/1sOK///26P/67tr/+e3W//rw3f///v3//unE//fkvP/14rn/9eK5//Per//79ur///////// + ///VyJT/kXAA/5t9AP+bfQD/mHoA/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6 + Mv/z3q7/9eK6//jpyf///v3/+e3Y//rv2//679v//PHe//HkyP+hhA//+ejG//7szP/14rr/9OG3//Tf + sv///////////9XIlP+RcAD/m30A/5h6AP+UdwD/7cVI/+nBRP/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5Loy//Perv/z3a///v38///////57NX/+u7a//rv2//88d//+O7a/4hmAP+LawD/xa1b///x + 1v/76cX/9N+y//ju2f//////1ciU/5FwAP+YegD/lHcA/+3FSP/pwUT/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/kujL/89yp//fs0/////////////v48P/57db/+u/b//zx3//47tr/jWwA/5p8 + AP+ScwD/knMA/9rEh///89n/9N2x///////VyZX/jm4A/5R3AP/txUj/6cFE/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+S6Mf/x2qP//////////////////v////ju2v/67tr//PHf//ju + 2v+NbAD/m30A/5t9AP+ZewD/jm4A/5h7CP/14bP///fr/9PLnv+KagD/7cVI/+nBRP/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/47cr//v27f///////////////////////fv5//ns + 1P/88d//+O7a/41sAP+bfQD/m30A/5t9AP+McAD/xqEg/+m9Mf/tzG3/1MWN/+S6NP/pwUT/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/5sJM//v26P////////////// + ////////+vDi//zw3f/47tr/jWwA/5t9AP+bfQD/jHAA/8uoK//wyEv/5r9B/+W8Ov/ovjj/58BD/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvTz/4bMg/+vM + bP/////////////////+/v//++7X//ju2v+NbAD/m30A/4xwAP/NqCv/8MhL/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5Ls2/+C0If/y25v////////////++O7/+OzX/41sAP+McAD/zagr//DIS//mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r5B/+O5L//juC//9uvI///////47tz/fl8A/82oK//wyEv/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQlvmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+W+Pv/itif/6cdV//Hr3P+/mA7/8MhL/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAPTL + RgXmv0K05r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvDv/5bow/+vD + Rv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv8AAAAAAAAAAAAAAADtxUQs5r9C4ua/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAA6cFDXea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/QpDmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHI + RRDmv0LD5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADrw0M65r9C7ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5r9CZea/QuHmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/QtgAAAD/AAAAPwAA + AB8AAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOAAAAD4AAAA/gAAAP8AAAD/wAAA//AAACgA + AAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAADmv0Ko5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+fAQ//zyk3/ro8S/5d6AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9APqbfQC6m30AOwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9 + AP+ZewD/mXsA/5t9AMWZewAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7 + AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD/mXsAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQBhAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7 + AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD/mXsA4pt9ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3nwEP/88lM/aeH + Cv2UdgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/5t9AP+ZewC2mXsACQAAAAAAAAAAAAAAAAAAAADmv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fA + Q//zyUz/pocK/5R2AP+bfQD/m30A/5l6AP+YeQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AIUAAAAAAAAAAAAA + AADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/l3gA/aSIGP2uljH/jGsA/Zh5AP2bfQD/mXsA/Zl7 + AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/pt9 + AP+ZewD4mXsAUgAAAADmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/eS9QP3nwEP/88lM/aeHCv2UdgD/mXsA/Zl7AP2bfAD/jG0A/ePUq/3dzJz/5NWs/ZFx + AP2ScgD/mXsA/Zl7AP2bfQD/mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD/mXsA/5l7AIDmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+fAQ//zyUz/pocK/5R2AP+bfQD/m30A/5t9AP+TcwD/wKpZ//vw + 4P+CYAD////////////Fr2T/i2oA/5V2AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95b5B/fPJTP2mhwr/knUA/Zl7AP2bfQD/mXsA/Zh6 + AP2PbgD////5/fLlyv2GZAD/wKlY/f/89f3//PP//PLj/a+WNP2KaQD/lngA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP7mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/nwEP/88lM/6eHCv+TdgD/m30A/5t9 + AP+bfQD/m30A/49vAP/SwIX///31//Djx/+ObQD/imoA//ju3P/98uH//PLg////+//r3r7/mn4D/49u + AP+aewD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9 + AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/efAQ//zyUz9pogK/ZJ1 + AP2bfQD/mXsA/Zl7AP2bfQD/lngA/Zl7AP3//////PHh/fDjx/2ObgD/lHUA/amQJv3///7/+O3Z/fjt + 2f3+9OX//////dbFjf+PbwD9kXEA/Zt8AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zl7AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5b5A/fLI + Sv+lhgj9kXQA/ph6AP2afAD/mHoA/Zh6AP2afAD/imkA/ejbt/3/9eX/+/Hg/fDjx/2NbQD/mHoA/Ytp + AP3m2LL//fPk/fjt2f3679r/+O3Z/f/47P///PT9v6hW/YpqAP+VdQD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mnwA/pp8AP7mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/6sNF/amLEf+OcQD9lHUA/ZR1AP2UdQD/lHUA/ZR1AP2PcAD/rZMu/f/++f357dn//PHg/e3g + wf2FYgD/kXEA/Y5uAP2QcQD///ry/fnu2v357dn/+e3Z/fnt2f/679v9//vz/fnu2/+pkCb9lXYA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/lvj7/7Mhe/72nYP//9N3///zn///y1v//8dX///HV///x1f//7cn///////// + ////////////////////7s3///LW///y1v//7Mr/+/Xo//////////////////////////////////// + ////////jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP+bfQD/m30A/5t9AP/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/7MdZ/eDNn/9+XQD9xq5i/f/x1f376MT/8+C3/fLe + sf347tf//////f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314bj/8t6w/f////3//////f39/f// + ///9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zl7 + AP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JR/f/25P+ojiL9i2sA/ZV2 + AP3cx47///LX/fTgtP3//////f7+/f39/f3//////f7//f78+P3z3q//8+C3/fPgt/314rn/8t6x/fjr + 0f3//////f39/f/////9/f39/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9 + AP+ZewD9mXsA/Zl7AP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//np + zf/14r3/i2wA/5l6AP+NbgD/nX4F//nz5/////////////////////////////77+P/z3q//9eK5//Xi + uf/14rn/9eK5//Pcq//+/f3////////////////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9 + AP+bfQD/m30A/5t9AP+bfQD/mnwA/5Z4AP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3lvj3/58JQ/ffmyP/+7Mz9v6VR/ZFyAP2YeQD/nH4D/f/78v389On//v///f7+//3//////f7//f78 + +P3z3q//8+C3/fPgt/314rn/8+C3/fPftP315cL//////f/////9/f39/f39/f/////6+PT9i2kA/Zt9 + AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/d65PP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/04bn9/+3R/ZByAP2IaAD/7eHC/fzy4v357tj/+ezV/fz4 + 8P3+/////v///f78+P3z3q//8+C3/fPgt/314rn/8+C3/fPgt/3z3a7/+/fu/f/////9/f39/f39/f// + ///6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+ZewD9mXsA/Zp8AP+OcAD927Y5/evDRv3mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//fmyP/14rn//OrH/8+3cP+pjyT///76//rv + 2//679v/+u/a//nt1v/47tr//fz7///////24bT/9eK5//Xiuf/14rn/9eK5//Xiuf/04bf/9OG1//// + ///////////////////6+PT/jWsA/5t9AP+bfQD/m30A/5t9AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/ + Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/z4Lf98+C3/fnk + vf327dz/+u/c/fjt2f3679v/+O3Z/fjt2f367tr/++7Z/fHnzv3p1KL//u3N/fThuf314rn/8+C3/fPg + t/314rn/8t2w/frx3v/+///9/f39/f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zt9AP+YegD9jnAA/du2 + Of/rw0b95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffm + yP/z4Lf98t2w/frx3v3/////+ezU/fjt2f3679v/+O3Z/fjt2f3679v/+/Hg/e7gwv1/XAD/vaRO/f/u + 0v386sf/9OG4/fPgt/314rn/8+C3/fPdrf/+///9/f7//f/////6+PT9i2kA/Zt9AP+ZewD9mXsA/Zp8 + AP+OcAD927Y5/e3FSP/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/lvT3/58JQ//fmyP/14bf/9N+1////////////+vLl//ru2P/679v/+u/b//rv2//679v//fPi//Dj + x/+ObQD/k3QA/45vAP/TvXn///LX//nnwf/14rn/9eK5//TgtP/36cz////////////6+PT/jWsA/5t9 + AP+bfQD/mnwA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3lvj3/58JQ/ffmyP/y3a79/Pft/f7///3//////////fnr1P3679v/+O3Z/fjt + 2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zh6AP2PcAD/nH4G/ebSov3/8NP/9eK7/fXiuf/z3Kz9/fz5/f// + ///6+PT9i2kA/Zt9AP+YegD9jnAA/du2Of/rw0b95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58JQ/fblxf/15cD9/////f39/f3//////v///fz3 + 7f357df/+O3Z/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lngA/YtrAP2uky3/+ObD/f/t + zf/z4Lb99eO9/f/////6+fT9i2kA/Zp8AP+OcAD927Y5/e3FSP/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/lvT3/58JQ//Xhuv/+/fz///////// + //////////////7////47tj/+u/a//rv2//679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5t9 + AP+WdwD/imsA/8GoVv/458z/9eG3//758P/7+vn/jGoA/41wAP/ctjn/7cVI/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvj3/58BL/fnw + 3//////9/f39/f39/f3//////f39/f7+//39+vb/9+vV/fjt2f3679v/+/Hg/fDjx/2ObgD/mXsA/Zl7 + AP2bfQD/mXsA/Zl7AP2bfQD/lHYA/ZR0AP/mvjz98NeY/fjnzf/6/v/9gF4A/du2Of/rw0b95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3lvT3/5sJR/f/////+///9/f39/f39/f3//////f39/f39/f3+////+vHf/fjs2P3679v/+/Hg/fDj + x/2ObgD/mXsA/Zl7AP2bfQD/mXsA/Zl7AP2WeAD/m30A/e7HSv/mvj/95Low/ejCTP/s4L/9zqcf/e3F + SP/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0H/5Lk0/+3Ug/////////////////////////////////////////3+//ns + 1P/679v//fPi//Djx/+ObQD/m30A/5t9AP+bfQD/m30A/5V4AP+egAP/8MZJ/+jBRP/mv0L/5r9C/+W9 + Pf/luzP/6cJF/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS6M//htin98+Ow/f////3//////f39/f39 + /f3//////v///fr05/367tj/+/Hg/fDjx/2ObgD/mXsA/Zl7AP2bfQD/lHYA/Z6AAv3xyUz/5r9C/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mvkD/47cr/+a+ + P//5893////////////////////////////57dX//fPi//Djx/+ObQD/m30A/5t9AP+VeAD/noAC//HI + S//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/eS8O/3itCL/6sli/f3+//3//////f7//f7///389/D/++/c/fDjx/2ObgD/mXsA/ZR2 + AP2ggQT/8clM/ea/Qv3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/47o2/eGzIP3w2ZD//////f////3//////PLg/fDj + xv2ObgD/lHYA/Z6AAv3xyUz/5r5B/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L25r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qf/juTH/47cu//Xo + u////////////+/gwf+IaQD/noAC//HIS//nwEP/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0Ja5L1A/+S9 + QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5Lw9/eG1KP3lwEb///zz/fDs5P2TcQD/8clM/ea/Qv3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9 + QP0AAAAA5L1AI+S9QNLmv0L/5L1A/+S9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3lvTz/47Ym/ePGZ/3nvz7/5r5B/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAADmv0JO5r9C+ea/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a+PP/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAOS9QIDmv0L/5L1A/+S9 + QP7mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADmv0IK5L1As+S9QP/mv0L/5L1A/ea/Qv/kvUD95L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOa/Qi3mv0Li5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5L1AXea/Qv/kvUD/5L1A/uS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADkvUCQ5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA5r9CE+a/QsLmv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/ + Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv/mv0L/5r9C/+a/Qv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmv0I65L1A6uS9QP/mv0L/5L1A/eS9 + QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/Qv/kvUD95L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/eS9QP0AAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOS9 + QGvmv0L/5L1A/+S9QP/mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/ea/ + Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95L1A/ea/Qv/kvUD95b5B/uW+ + Qf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA5L1Ah+S9QOPmv0L/5L1A/eS9QP3mv0L/5L1A/eS9QP3mv0L/5L1A/eS9 + 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 + MZeYvYdTAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/HexcalMC/Program.cs b/HexcalMC/Program.cs index 238c9ed..b76ae87 100644 --- a/HexcalMC/Program.cs +++ b/HexcalMC/Program.cs @@ -2,6 +2,30 @@ using System.Collections.Generic; using System.Windows.Forms; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// +//开发说明 +// V0.1 2023/04/10 +//--------------------------------------- +//1、初版构建 +//2、调用流程: 开启TCP服务端、连接到平台轴启用—》hexcal软件连接,开启校准通讯流程—》移动至到位后反馈—》hexcal逻辑处理—》hexcal校准完成关系—》软件关闭 +// +// +// +// +// +// +// +// +// +// +// +// +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + namespace HexcalMC { static class Program diff --git a/HexcalMC/Properties/Settings.Designer.cs b/HexcalMC/Properties/Settings.Designer.cs index a545888..1e91ef9 100644 --- a/HexcalMC/Properties/Settings.Designer.cs +++ b/HexcalMC/Properties/Settings.Designer.cs @@ -1,30 +1,26 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.18408 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ -namespace HexcalMC.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } +namespace HexcalMC.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } } diff --git a/HexcalMC/Resources/Hexagon.ico b/HexcalMC/Resources/Hexagon.ico new file mode 100644 index 0000000..7acfd2f Binary files /dev/null and b/HexcalMC/Resources/Hexagon.ico differ diff --git a/HexcalMC/Resources/about.png b/HexcalMC/Resources/about.png new file mode 100644 index 0000000..4d781c5 Binary files /dev/null and b/HexcalMC/Resources/about.png differ diff --git a/HexcalMC/Resources/help.png b/HexcalMC/Resources/help.png new file mode 100644 index 0000000..e5c7f86 Binary files /dev/null and b/HexcalMC/Resources/help.png differ diff --git a/HexcalMC/Resources/motion.png b/HexcalMC/Resources/motion.png new file mode 100644 index 0000000..224a51f Binary files /dev/null and b/HexcalMC/Resources/motion.png differ diff --git a/HexcalMC/Resources/xx.png b/HexcalMC/Resources/xx.png new file mode 100644 index 0000000..2347279 Binary files /dev/null and b/HexcalMC/Resources/xx.png differ diff --git a/HexcalMC/app.config b/HexcalMC/app.config new file mode 100644 index 0000000..725d418 --- /dev/null +++ b/HexcalMC/app.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/HexcalMC/packages.config b/HexcalMC/packages.config new file mode 100644 index 0000000..ced538a --- /dev/null +++ b/HexcalMC/packages.config @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file