diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index eb948c39..5111a777 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -108,12 +108,12 @@ namespace Shadowsocks.Controller if (item == null) continue; item.Text = GetString(item.Text); } - TranslateMenu(c.Menu); + TranslateMenu(c.MainMenuStrip); } - public static void TranslateMenu(Menu m) + public static void TranslateMenu(MenuStrip m) { if (m == null) return; - foreach (var item in ViewUtils.GetMenuItems(m)) + foreach (var item in ViewUtils.GetToolStripMenuItems(m)) { if (item == null) continue; item.Text = GetString(item.Text); diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index 7fd9250e..ee5ed89e 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -24,7 +24,7 @@ namespace Shadowsocks.Controller { var rd = new byte[32]; RNG.GetBytes(rd); - _cachedPacSecret = HttpServerUtility.UrlTokenEncode(rd); + _cachedPacSecret = HttpServerUtilityUrlToken.Encode(rd); } return _cachedPacSecret; } @@ -51,7 +51,7 @@ namespace Shadowsocks.Controller private static string GetHash(string content) { - return HttpServerUtility.UrlTokenEncode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content))); + return HttpServerUtilityUrlToken.Encode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content))); } public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) diff --git a/shadowsocks-csharp/HttpServerUtilityUrlToken.cs b/shadowsocks-csharp/HttpServerUtilityUrlToken.cs new file mode 100644 index 00000000..617e74e9 --- /dev/null +++ b/shadowsocks-csharp/HttpServerUtilityUrlToken.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Shadowsocks +{ + /// + /// HttpServerUtility URL Token のエンコード及びデコードを行うクラス。 + /// https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpserverutility.urltokenencode + /// https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httpserverutility.urltokendecode + /// + /// + /// HttpServerUtility URL Token 形式は、パディング無し base64url にパディング数を文字として追記した文字列です。 + /// 例えば、0x00AA2 になります。 + /// + public static class HttpServerUtilityUrlToken + { +#if NETSTANDARD2_0 + private static readonly byte[] EmptyBytes = Array.Empty(); +#else + private static readonly byte[] EmptyBytes = new byte[0]; +#endif + + /// + /// 配列を HttpServerUtility URL Token にエンコードします。 + /// + /// エンコード対象の 配列。 + /// HttpServerUtility URL Token エンコード文字列。 の長さが 0 の場合は空文字列を返します。 + /// is null. + public static string Encode(byte[] bytes) + { + if (bytes == null) { throw new ArgumentNullException(nameof(bytes)); } + + return Encode(bytes, 0, bytes.Length); + } + + /// + /// 配列を HttpServerUtility URL Token にエンコードします。 + /// + /// エンコード対象の 配列。 + /// エンコードの開始位置を示すオフセット。 + /// エンコード対象の要素の数。 + /// HttpServerUtility URL Token エンコード文字列。0 の場合は空文字列を返します。 + /// is null. + /// + /// または が負の値です。 + /// または を加算した値が の長さを超えています。 + /// + public static string Encode(byte[] bytes, int offset, int length) + { + if (bytes == null) { throw new ArgumentNullException(nameof(bytes)); } + + var encoded = Encode(bytes, offset, length, padding: false); + if (encoded.Length == 0) { return ""; } + + var paddingLen = unchecked(~encoded.Length + 1) & 0b11; + encoded += paddingLen; + + return encoded; + } + /// + /// 配列を base64url にエンコードします。 + /// + /// エンコード対象の 配列。 + /// エンコードの開始位置を示すオフセット。 + /// エンコード対象の要素の数。 + /// パディングをする場合は true、それ以外は false。既定値は false。 + /// base64url エンコード文字列。 + /// is null. + /// + /// または が負の値です。 + /// または を加算した値が の長さを超えています。 + /// + public static string Encode(byte[] bytes, int offset, int length, bool padding = false) + { + var encoded = Convert.ToBase64String(bytes, offset, length); + + if (!padding) + { + encoded = encoded.TrimEnd('='); + } + + return encoded + .Replace('+', '-') + .Replace('/', '_') + ; + } + + /// + /// HttpServerUtility URL Token 文字列を 配列にデコードします。 + /// + /// HttpServerUtility URL Token にエンコードされた文字列。 + /// デコード後の 配列。 が空文字列の場合は の空配列を返します。 + /// is null. + /// が HttpServerUtility URL Token 文字列ではありません。 + public static byte[] Decode(string encoded) + { + if (encoded == null) { throw new ArgumentNullException(nameof(encoded)); } + + if (!TryDecode(encoded, out var result)) { throw new FormatException("HttpServerUtility URL Token 文字列ではありません。"); } + return result; + } + + /// + /// HttpServerUtility URL Token でエンコードされた文字列をデコードします。 + /// + /// HttpServerUtility URL Token エンコードされた文字列。 + /// デコード後の 配列。 が空文字列の場合は の空配列が設定されます。失敗した場合は null。 + /// デコードに成功した場合は true、それ以外は false + public static bool TryDecode(string encoded, out byte[] result) + { + if (encoded == null) { goto Failure; } + if (encoded.Length == 0) + { + result = EmptyBytes; + return true; + } + + var paddingLen = encoded[encoded.Length - 1] - '0'; + if (paddingLen < 0 || paddingLen > 3) { goto Failure; } + + var base64Str = encoded + .Substring(0, encoded.Length - 1) + .Replace('-', '+') + .Replace('_', '/'); + + if (paddingLen > 0) + { + base64Str += new string('=', paddingLen); + } + + try + { + result = Convert.FromBase64String(base64Str); + return true; + } + catch (FormatException) { goto Failure; } + + Failure: + result = null; + return false; + } + } +} diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs deleted file mode 100755 index b140accf..00000000 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Shadowsocks.Controller; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的常规信息通过下列属性集 -// 控制。更改这些属性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("Shadowsocks")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Shadowsocks")] -[assembly: AssemblyCopyright("clowwindy & community 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 使此程序集中的类型 -// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, -// 则将该类型上的 ComVisible 属性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("f8334709-4309-436a-8bbd-6165dcf4a660")] - -// 程序集的版本信息由下面四个值组成: -// -// 主版本 -// 次版本 -// 内部版本号 -// 修订号 -// -// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, -// 方法是按如下所示使用“*”: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(UpdateChecker.Version)] -// [assembly: AssemblyFileVersion("2.0.0")] diff --git a/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 00000000..0d3d74e9 --- /dev/null +++ b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,17 @@ + + + + + FileSystem + Release + Any CPU + netcoreapp3.1 + bin\Release\netcoreapp3.1\publish\ + win-x86 + false + False + False + + \ No newline at end of file diff --git a/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml.user b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 00000000..1a189e4f --- /dev/null +++ b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/shadowsocks-csharp/Properties/Settings.Designer.cs b/shadowsocks-csharp/Properties/Settings.Designer.cs index efed8372..4cc88b29 100644 --- a/shadowsocks-csharp/Properties/Settings.Designer.cs +++ b/shadowsocks-csharp/Properties/Settings.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -12,7 +12,7 @@ namespace Shadowsocks.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.1.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/shadowsocks-csharp/Util/ViewUtils.cs b/shadowsocks-csharp/Util/ViewUtils.cs index 43f54721..a29d790a 100644 --- a/shadowsocks-csharp/Util/ViewUtils.cs +++ b/shadowsocks-csharp/Util/ViewUtils.cs @@ -22,15 +22,25 @@ namespace Shadowsocks.Util return children.SelectMany(GetChildControls).Concat(children); } - public static IEnumerable GetMenuItems(Menu m) + public static IEnumerable GetToolStripMenuItems(MenuStrip m) { - if (m?.MenuItems == null || m.MenuItems.Count == 0) return Enumerable.Empty(); - var children = new List(); - foreach (var item in m.MenuItems) + if (m?.Items == null || m.Items.Count == 0) return Enumerable.Empty(); + var children = new List(); + foreach (var item in m.Items) { - children.Add((MenuItem)item); + children.Add((ToolStripMenuItem)item); } - return children.SelectMany(GetMenuItems).Concat(children); + return children.SelectMany(GetToolStripMenuItems).Concat(children); + } + public static IEnumerable GetToolStripMenuItems(ToolStripMenuItem m) + { + if (m?.DropDownItems == null || m.DropDownItems.Count == 0) return Enumerable.Empty(); + var children = new List(); + foreach (var item in m.DropDownItems) + { + children.Add((ToolStripMenuItem)item); + } + return children.SelectMany(GetToolStripMenuItems).Concat(children); } // Workaround NotifyIcon's 63 chars limit diff --git a/shadowsocks-csharp/View/LogForm.Designer.cs b/shadowsocks-csharp/View/LogForm.Designer.cs index 4a62262a..365a9bb1 100644 --- a/shadowsocks-csharp/View/LogForm.Designer.cs +++ b/shadowsocks-csharp/View/LogForm.Designer.cs @@ -34,17 +34,17 @@ System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); this.LogMessageTextBox = new System.Windows.Forms.TextBox(); - this.MainMenu = new System.Windows.Forms.MainMenu(this.components); - this.FileMenuItem = new System.Windows.Forms.MenuItem(); - this.OpenLocationMenuItem = new System.Windows.Forms.MenuItem(); - this.ExitMenuItem = new System.Windows.Forms.MenuItem(); - this.ViewMenuItem = new System.Windows.Forms.MenuItem(); - this.ClearLogsMenuItem = new System.Windows.Forms.MenuItem(); - this.ChangeFontMenuItem = new System.Windows.Forms.MenuItem(); - this.WrapTextMenuItem = new System.Windows.Forms.MenuItem(); - this.TopMostMenuItem = new System.Windows.Forms.MenuItem(); - this.MenuItemSeparater = new System.Windows.Forms.MenuItem(); - this.ShowToolbarMenuItem = new System.Windows.Forms.MenuItem(); + this.MainMenu = new System.Windows.Forms.MenuStrip(); + this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClearLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ChangeFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.WrapTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TopMostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolStripMenuItemSeparater = new System.Windows.Forms.ToolStripMenuItem(); + this.ShowToolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); this.ChangeFontButton = new System.Windows.Forms.Button(); this.ClearLogsButton = new System.Windows.Forms.Button(); @@ -79,76 +79,66 @@ // // MainMenu // - this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.FileMenuItem, - this.ViewMenuItem}); + this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.FileToolStripMenuItem, + this.ViewToolStripMenuItem}); // - // FileMenuItem + // FileToolStripMenuItem // - this.FileMenuItem.Index = 0; - this.FileMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.OpenLocationMenuItem, - this.ExitMenuItem}); - this.FileMenuItem.Text = "&File"; + this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.OpenLocationToolStripMenuItem, + this.ExitToolStripMenuItem}); + this.FileToolStripMenuItem.Text = "&File"; // - // OpenLocationMenuItem + // OpenLocationToolStripMenuItem // - this.OpenLocationMenuItem.Index = 0; - this.OpenLocationMenuItem.Text = "&Open Location"; - this.OpenLocationMenuItem.Click += new System.EventHandler(this.OpenLocationMenuItem_Click); + this.OpenLocationToolStripMenuItem.Text = "&Open Location"; + this.OpenLocationToolStripMenuItem.Click += new System.EventHandler(this.OpenLocationToolStripMenuItem_Click); // - // ExitMenuItem + // ExitToolStripMenuItem // - this.ExitMenuItem.Index = 1; - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); + this.ExitToolStripMenuItem.Text = "E&xit"; + this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click); // - // ViewMenuItem + // ViewToolStripMenuItem // - this.ViewMenuItem.Index = 1; - this.ViewMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.ClearLogsMenuItem, - this.ChangeFontMenuItem, - this.WrapTextMenuItem, - this.TopMostMenuItem, - this.MenuItemSeparater, - this.ShowToolbarMenuItem}); - this.ViewMenuItem.Text = "&View"; + this.ViewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.ClearLogsToolStripMenuItem, + this.ChangeFontToolStripMenuItem, + this.WrapTextToolStripMenuItem, + this.TopMostToolStripMenuItem, + this.ToolStripMenuItemSeparater, + this.ShowToolbarToolStripMenuItem}); + this.ViewToolStripMenuItem.Text = "&View"; // - // ClearLogsMenuItem + // ClearLogsToolStripMenuItem // - this.ClearLogsMenuItem.Index = 0; - this.ClearLogsMenuItem.Text = "&Clear Logs"; - this.ClearLogsMenuItem.Click += new System.EventHandler(this.ClearLogsMenuItem_Click); + this.ClearLogsToolStripMenuItem.Text = "&Clear Logs"; + this.ClearLogsToolStripMenuItem.Click += new System.EventHandler(this.ClearLogsToolStripMenuItem_Click); // - // ChangeFontMenuItem + // ChangeFontToolStripMenuItem // - this.ChangeFontMenuItem.Index = 1; - this.ChangeFontMenuItem.Text = "Change &Font"; - this.ChangeFontMenuItem.Click += new System.EventHandler(this.ChangeFontMenuItem_Click); + this.ChangeFontToolStripMenuItem.Text = "Change &Font"; + this.ChangeFontToolStripMenuItem.Click += new System.EventHandler(this.ChangeFontToolStripMenuItem_Click); // - // WrapTextMenuItem + // WrapTextToolStripMenuItem // - this.WrapTextMenuItem.Index = 2; - this.WrapTextMenuItem.Text = "&Wrap Text"; - this.WrapTextMenuItem.Click += new System.EventHandler(this.WrapTextMenuItem_Click); + this.WrapTextToolStripMenuItem.Text = "&Wrap Text"; + this.WrapTextToolStripMenuItem.Click += new System.EventHandler(this.WrapTextToolStripMenuItem_Click); // - // TopMostMenuItem + // TopMostToolStripMenuItem // - this.TopMostMenuItem.Index = 3; - this.TopMostMenuItem.Text = "&Top Most"; - this.TopMostMenuItem.Click += new System.EventHandler(this.TopMostMenuItem_Click); + this.TopMostToolStripMenuItem.Text = "&Top Most"; + this.TopMostToolStripMenuItem.Click += new System.EventHandler(this.TopMostToolStripMenuItem_Click); // - // MenuItemSeparater + // ToolStripMenuItemSeparater // - this.MenuItemSeparater.Index = 4; - this.MenuItemSeparater.Text = "-"; + this.ToolStripMenuItemSeparater.Text = "-"; // - // ShowToolbarMenuItem + // ShowToolbarToolStripMenuItem // - this.ShowToolbarMenuItem.Index = 5; - this.ShowToolbarMenuItem.Text = "&Show Toolbar"; - this.ShowToolbarMenuItem.Click += new System.EventHandler(this.ShowToolbarMenuItem_Click); + this.ShowToolbarToolStripMenuItem.Text = "&Show Toolbar"; + this.ShowToolbarToolStripMenuItem.Click += new System.EventHandler(this.ShowToolbarToolStripMenuItem_Click); // // TopMostCheckBox // @@ -294,7 +284,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.ClientSize = new System.Drawing.Size(384, 161); this.Controls.Add(this.tableLayoutPanel1); - this.Menu = this.MainMenu; + this.MainMenuStrip = this.MainMenu; this.MinimumSize = new System.Drawing.Size(400, 200); this.Name = "LogForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; @@ -319,23 +309,23 @@ #endregion private System.Windows.Forms.TextBox LogMessageTextBox; - private System.Windows.Forms.MainMenu MainMenu; - private System.Windows.Forms.MenuItem FileMenuItem; - private System.Windows.Forms.MenuItem OpenLocationMenuItem; - private System.Windows.Forms.MenuItem ExitMenuItem; + private System.Windows.Forms.MenuStrip MainMenu; + private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem OpenLocationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem; private System.Windows.Forms.CheckBox WrapTextCheckBox; private System.Windows.Forms.Button ClearLogsButton; private System.Windows.Forms.Button ChangeFontButton; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.CheckBox TopMostCheckBox; - private System.Windows.Forms.MenuItem ViewMenuItem; - private System.Windows.Forms.MenuItem ClearLogsMenuItem; - private System.Windows.Forms.MenuItem ChangeFontMenuItem; - private System.Windows.Forms.MenuItem WrapTextMenuItem; - private System.Windows.Forms.MenuItem TopMostMenuItem; + private System.Windows.Forms.ToolStripMenuItem ViewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ClearLogsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ChangeFontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem WrapTextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem TopMostToolStripMenuItem; private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel; - private System.Windows.Forms.MenuItem MenuItemSeparater; - private System.Windows.Forms.MenuItem ShowToolbarMenuItem; + private System.Windows.Forms.ToolStripMenuItem ToolStripMenuItemSeparater; + private System.Windows.Forms.ToolStripMenuItem ShowToolbarToolStripMenuItem; private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.DataVisualization.Charting.Chart trafficChart; } diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index 06b0f678..7fac8a28 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -256,14 +256,14 @@ namespace Shadowsocks.View } topMostTriggerLock = true; - TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; + TopMost = TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; topMostTriggerLock = false; wrapTextTriggerLock = true; - LogMessageTextBox.WordWrap = WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; + LogMessageTextBox.WordWrap = WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; wrapTextTriggerLock = false; - ToolbarFlowLayoutPanel.Visible = ShowToolbarMenuItem.Checked = toolbarTrigger; + ToolbarFlowLayoutPanel.Visible = ShowToolbarToolStripMenuItem.Checked = toolbarTrigger; } private void LogForm_FormClosing(object sender, FormClosingEventArgs e) @@ -288,14 +288,14 @@ namespace Shadowsocks.View controller.SaveLogViewerConfig(config); } - private void OpenLocationMenuItem_Click(object sender, EventArgs e) + private void OpenLocationToolStripMenuItem_Click(object sender, EventArgs e) { string argument = "/select, \"" + filename + "\""; logger.Debug(argument); System.Diagnostics.Process.Start("explorer.exe", argument); } - private void ExitMenuItem_Click(object sender, EventArgs e) + private void ExitToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } @@ -317,7 +317,7 @@ namespace Shadowsocks.View LogMessageTextBox.Clear(); } - private void ClearLogsMenuItem_Click(object sender, EventArgs e) + private void ClearLogsToolStripMenuItem_Click(object sender, EventArgs e) { DoClearLogs(); } @@ -347,7 +347,7 @@ namespace Shadowsocks.View } } - private void ChangeFontMenuItem_Click(object sender, EventArgs e) + private void ChangeFontToolStripMenuItem_Click(object sender, EventArgs e) { DoChangeFont(); } @@ -369,12 +369,12 @@ namespace Shadowsocks.View wrapTextTrigger = !wrapTextTrigger; LogMessageTextBox.WordWrap = wrapTextTrigger; LogMessageTextBox.ScrollToCaret(); - WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; + WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; wrapTextTriggerLock = false; } - private void WrapTextMenuItem_Click(object sender, EventArgs e) + private void WrapTextToolStripMenuItem_Click(object sender, EventArgs e) { if (!wrapTextTriggerLock) { @@ -401,7 +401,7 @@ namespace Shadowsocks.View topMostTrigger = !topMostTrigger; TopMost = topMostTrigger; - TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; + TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; topMostTriggerLock = false; } @@ -414,7 +414,7 @@ namespace Shadowsocks.View } } - private void TopMostMenuItem_Click(object sender, EventArgs e) + private void TopMostToolStripMenuItem_Click(object sender, EventArgs e) { if (!topMostTriggerLock) { @@ -425,11 +425,11 @@ namespace Shadowsocks.View private bool toolbarTrigger = false; - private void ShowToolbarMenuItem_Click(object sender, EventArgs e) + private void ShowToolbarToolStripMenuItem_Click(object sender, EventArgs e) { toolbarTrigger = !toolbarTrigger; ToolbarFlowLayoutPanel.Visible = toolbarTrigger; - ShowToolbarMenuItem.Checked = toolbarTrigger; + ShowToolbarToolStripMenuItem.Checked = toolbarTrigger; } private class TrafficInfo diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index ddcf21f4..14f2f932 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -10,6 +10,7 @@ using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; +using System.Windows.Media.Imaging; using ZXing; using ZXing.Common; using ZXing.QrCode; @@ -33,29 +34,29 @@ namespace Shadowsocks.View private bool _isStartupChecking; private string _urlToOpen; - private ContextMenu contextMenu1; - private MenuItem disableItem; - private MenuItem AutoStartupItem; - private MenuItem ShareOverLANItem; - private MenuItem SeperatorItem; - private MenuItem ConfigItem; - private MenuItem ServersItem; - private MenuItem globalModeItem; - private MenuItem PACModeItem; - private MenuItem localPACItem; - private MenuItem onlinePACItem; - private MenuItem editLocalPACItem; - private MenuItem updateFromGFWListItem; - private MenuItem editGFWUserRuleItem; - private MenuItem editOnlinePACItem; - private MenuItem secureLocalPacUrlToggleItem; - private MenuItem autoCheckUpdatesToggleItem; - private MenuItem checkPreReleaseToggleItem; - private MenuItem proxyItem; - private MenuItem hotKeyItem; - private MenuItem VerboseLoggingToggleItem; - private MenuItem ShowPluginOutputToggleItem; - private MenuItem WriteI18NFileItem; + private ContextMenuStrip contextMenu1; + private ToolStripMenuItem disableItem; + private ToolStripMenuItem AutoStartupItem; + private ToolStripMenuItem ShareOverLANItem; + private ToolStripMenuItem SeperatorItem; + private ToolStripMenuItem ConfigItem; + private ToolStripMenuItem ServersItem; + private ToolStripMenuItem globalModeItem; + private ToolStripMenuItem PACModeItem; + private ToolStripMenuItem localPACItem; + private ToolStripMenuItem onlinePACItem; + private ToolStripMenuItem editLocalPACItem; + private ToolStripMenuItem updateFromGFWListItem; + private ToolStripMenuItem editGFWUserRuleItem; + private ToolStripMenuItem editOnlinePACItem; + private ToolStripMenuItem secureLocalPacUrlToggleItem; + private ToolStripMenuItem autoCheckUpdatesToggleItem; + private ToolStripMenuItem checkPreReleaseToggleItem; + private ToolStripMenuItem proxyItem; + private ToolStripMenuItem hotKeyItem; + private ToolStripMenuItem VerboseLoggingToggleItem; + private ToolStripMenuItem ShowPluginOutputToggleItem; + private ToolStripMenuItem WriteI18NFileItem; private ConfigForm configForm; private ProxyForm proxyForm; @@ -91,7 +92,7 @@ namespace Shadowsocks.View _notifyIcon = new NotifyIcon(); UpdateTrayIconAndNotifyText(); _notifyIcon.Visible = true; - _notifyIcon.ContextMenu = contextMenu1; + _notifyIcon.ContextMenuStrip = contextMenu1; _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; _notifyIcon.MouseClick += notifyIcon1_Click; _notifyIcon.MouseDoubleClick += notifyIcon1_DoubleClick; @@ -272,67 +273,68 @@ namespace Shadowsocks.View #endregion - #region MenuItems and MenuGroups + #region ToolStripMenuItems and MenuGroups - private MenuItem CreateMenuItem(string text, EventHandler click) + private ToolStripMenuItem CreateToolStripMenuItem(string text, EventHandler click) { - return new MenuItem(I18N.GetString(text), click); + return new ToolStripMenuItem(I18N.GetString(text),null, click); } - private MenuItem CreateMenuGroup(string text, MenuItem[] items) + private ToolStripMenuItem CreateMenuGroup(string text, ToolStripMenuItem[] items) { - return new MenuItem(I18N.GetString(text), items); + return new ToolStripMenuItem(I18N.GetString(text), null,items); } private void LoadMenu() { - this.contextMenu1 = new ContextMenu(new MenuItem[] { - CreateMenuGroup("System Proxy", new MenuItem[] { - this.disableItem = CreateMenuItem("Disable", new EventHandler(this.EnableItem_Click)), - this.PACModeItem = CreateMenuItem("PAC", new EventHandler(this.PACModeItem_Click)), - this.globalModeItem = CreateMenuItem("Global", new EventHandler(this.GlobalModeItem_Click)) + this.contextMenu1 = new ContextMenuStrip(); + contextMenu1.Items.AddRange(new ToolStripItem[]{ + CreateMenuGroup("System Proxy", new ToolStripMenuItem[] { + this.disableItem = CreateToolStripMenuItem("Disable", new EventHandler(this.EnableItem_Click)), + this.PACModeItem = CreateToolStripMenuItem("PAC", new EventHandler(this.PACModeItem_Click)), + this.globalModeItem = CreateToolStripMenuItem("Global", new EventHandler(this.GlobalModeItem_Click)) }), - this.ServersItem = CreateMenuGroup("Servers", new MenuItem[] { - this.SeperatorItem = new MenuItem("-"), - this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)), - CreateMenuItem("Statistics Config...", StatisticsConfigItem_Click), - new MenuItem("-"), - CreateMenuItem("Share Server Config...", new EventHandler(this.QRCodeItem_Click)), - CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)), - CreateMenuItem("Import URL from Clipboard...", new EventHandler(this.ImportURLItem_Click)) + this.ServersItem = CreateMenuGroup("Servers", new ToolStripMenuItem[] { + this.SeperatorItem = new ToolStripMenuItem("-"), + this.ConfigItem = CreateToolStripMenuItem("Edit Servers...", new EventHandler(this.Config_Click)), + CreateToolStripMenuItem("Statistics Config...", StatisticsConfigItem_Click), + new ToolStripMenuItem("-"), + CreateToolStripMenuItem("Share Server Config...", new EventHandler(this.QRCodeItem_Click)), + CreateToolStripMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)), + CreateToolStripMenuItem("Import URL from Clipboard...", new EventHandler(this.ImportURLItem_Click)) }), - CreateMenuGroup("PAC ", new MenuItem[] { - this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)), - this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), - new MenuItem("-"), - this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), - this.updateFromGFWListItem = CreateMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), - this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), - this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), - CreateMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)), - this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), + CreateMenuGroup("PAC ", new ToolStripMenuItem[] { + this.localPACItem = CreateToolStripMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)), + this.onlinePACItem = CreateToolStripMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), + new ToolStripMenuItem("-"), + this.editLocalPACItem = CreateToolStripMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), + this.updateFromGFWListItem = CreateToolStripMenuItem("Update Local PAC from GFWList", new EventHandler(this.UpdatePACFromGFWListItem_Click)), + this.editGFWUserRuleItem = CreateToolStripMenuItem("Edit User Rule for GFWList...", new EventHandler(this.EditUserRuleFileForGFWListItem_Click)), + this.secureLocalPacUrlToggleItem = CreateToolStripMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), + CreateToolStripMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)), + this.editOnlinePACItem = CreateToolStripMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), }), - this.proxyItem = CreateMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)), - new MenuItem("-"), - this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), - this.ShareOverLANItem = CreateMenuItem("Allow other Devices to connect", new EventHandler(this.ShareOverLANItem_Click)), - new MenuItem("-"), - this.hotKeyItem = CreateMenuItem("Edit Hotkeys...", new EventHandler(this.hotKeyItem_Click)), - CreateMenuGroup("Help", new MenuItem[] { - CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), - this.VerboseLoggingToggleItem = CreateMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ), - this.ShowPluginOutputToggleItem = CreateMenuItem("Show Plugin Output", new EventHandler(this.ShowPluginOutputToggleItem_Click)), - this.WriteI18NFileItem = CreateMenuItem("Write translation template",new EventHandler(WriteI18NFileItem_Click)), - CreateMenuGroup("Updates...", new MenuItem[] { - CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)), - new MenuItem("-"), - this.autoCheckUpdatesToggleItem = CreateMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), - this.checkPreReleaseToggleItem = CreateMenuItem("Check Pre-release Version", new EventHandler(this.checkPreReleaseToggleItem_Click)), + this.proxyItem = CreateToolStripMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)), + new ToolStripMenuItem("-"), + this.AutoStartupItem = CreateToolStripMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), + this.ShareOverLANItem = CreateToolStripMenuItem("Allow other Devices to connect", new EventHandler(this.ShareOverLANItem_Click)), + new ToolStripMenuItem("-"), + this.hotKeyItem = CreateToolStripMenuItem("Edit Hotkeys...", new EventHandler(this.hotKeyItem_Click)), + CreateMenuGroup("Help", new ToolStripMenuItem[] { + CreateToolStripMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), + this.VerboseLoggingToggleItem = CreateToolStripMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ), + this.ShowPluginOutputToggleItem = CreateToolStripMenuItem("Show Plugin Output", new EventHandler(this.ShowPluginOutputToggleItem_Click)), + this.WriteI18NFileItem = CreateToolStripMenuItem("Write translation template",new EventHandler(WriteI18NFileItem_Click)), + CreateMenuGroup("Updates...", new ToolStripMenuItem[] { + CreateToolStripMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)), + new ToolStripMenuItem("-"), + this.autoCheckUpdatesToggleItem = CreateToolStripMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), + this.checkPreReleaseToggleItem = CreateToolStripMenuItem("Check Pre-release Version", new EventHandler(this.checkPreReleaseToggleItem_Click)), }), - CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), + CreateToolStripMenuItem("About...", new EventHandler(this.AboutItem_Click)), }), - new MenuItem("-"), - CreateMenuItem("Quit", new EventHandler(this.Quit_Click)) + new ToolStripMenuItem("-"), + CreateToolStripMenuItem("Quit", new EventHandler(this.Quit_Click)) }); } @@ -451,7 +453,7 @@ namespace Shadowsocks.View private void UpdateServersMenu() { - var items = ServersItem.MenuItems; + var items = ServersItem.DropDownItems; while (items[0] != SeperatorItem) { items.RemoveAt(0); @@ -459,15 +461,15 @@ namespace Shadowsocks.View int strategyCount = 0; foreach (var strategy in controller.GetStrategies()) { - MenuItem item = new MenuItem(strategy.Name); + ToolStripMenuItem item = new ToolStripMenuItem(strategy.Name); item.Tag = strategy.ID; item.Click += AStrategyItem_Click; - items.Add(strategyCount, item); + items.Add( item); strategyCount++; } // user wants a seperator item between strategy and servers menugroup - items.Add(strategyCount++, new MenuItem("-")); + items.Add(new ToolStripMenuItem("-")); int serverCount = 0; Configuration configuration = controller.GetConfigurationCopy(); @@ -475,15 +477,15 @@ namespace Shadowsocks.View { if (Configuration.ChecksServer(server)) { - MenuItem item = new MenuItem(server.FriendlyName()); + ToolStripMenuItem item = new ToolStripMenuItem(server.FriendlyName()); item.Tag = configuration.configs.FindIndex(s => s == server); item.Click += AServerItem_Click; - items.Add(strategyCount + serverCount, item); + items.Add( item); serverCount++; } } - foreach (MenuItem item in items) + foreach (ToolStripMenuItem item in items) { if (item.Tag != null && (item.Tag.ToString() == configuration.index.ToString() || item.Tag.ToString() == configuration.strategy)) { @@ -694,13 +696,13 @@ namespace Shadowsocks.View private void AServerItem_Click(object sender, EventArgs e) { - MenuItem item = (MenuItem)sender; + ToolStripMenuItem item = (ToolStripMenuItem)sender; controller.SelectServerIndex((int)item.Tag); } private void AStrategyItem_Click(object sender, EventArgs e) { - MenuItem item = (MenuItem)sender; + ToolStripMenuItem item = (ToolStripMenuItem)sender; controller.SelectStrategy((string)item.Tag); } @@ -765,7 +767,7 @@ namespace Shadowsocks.View cropRect, GraphicsUnit.Pixel); } - var source = new BitmapLuminanceSource(target); + var source = new BitmapSourceLuminanceSource(null); var bitmap = new BinaryBitmap(new HybridBinarizer(source)); QRCodeReader reader = new QRCodeReader(); var result = reader.decode(bitmap); @@ -879,14 +881,14 @@ namespace Shadowsocks.View private void UpdateOnlinePACURLItem_Click(object sender, EventArgs e) { string origPacUrl = controller.GetConfigurationCopy().pacUrl; - string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( - I18N.GetString("Please input PAC Url"), - I18N.GetString("Edit Online PAC URL"), - origPacUrl, -1, -1); - if (!pacUrl.IsNullOrEmpty() && pacUrl != origPacUrl) - { - controller.SavePACUrl(pacUrl); - } + //string pacUrl = Microsoft.VisualBasic.Interaction.InputBox( + // I18N.GetString("Please input PAC Url"), + // I18N.GetString("Edit Online PAC URL"), + // origPacUrl, -1, -1); + //if (!pacUrl.IsNullOrEmpty() && pacUrl != origPacUrl) + //{ + // controller.SavePACUrl(pacUrl); + //} } private void SecureLocalPacUrlToggleItem_Click(object sender, EventArgs e) diff --git a/shadowsocks-csharp/app.config b/shadowsocks-csharp/app.config index f1118d57..b6020414 100755 --- a/shadowsocks-csharp/app.config +++ b/shadowsocks-csharp/app.config @@ -5,21 +5,7 @@
- - - - - - - - - - - - - - - + diff --git a/shadowsocks-csharp/packages.config b/shadowsocks-csharp/packages.config deleted file mode 100644 index 911e1d9a..00000000 --- a/shadowsocks-csharp/packages.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index bf562337..3e6bfc28 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -1,340 +1,108 @@ - - - - + + - Debug - AnyCPU - 9.0.21022 - 2.0 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} WinExe - Properties + netcoreapp3.1 Shadowsocks + true + clowwindy & community 2020 + Shadowsocks + Shadowsocks + 4.1.9.2 Shadowsocks - v4.7.2 - 512 - - - shadowsocks.ico - false - - - - - 3.5 - - - - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - - - true - bin\x86\Debug\ - TRACE;DEBUG - full - x86 - prompt - ManagedMinimumRules.ruleset - false - false - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - prompt - ManagedMinimumRules.ruleset - false - true - - - app.manifest + + + - - ..\packages\Caseless.Fody.1.8.3\lib\net452\Caseless.dll - - - ..\packages\Costura.Fody.3.3.3\lib\net40\Costura.dll - - - ..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll - - - - - ..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll - - - ..\packages\NLog.4.6.8\lib\net45\NLog.dll - - - - - - - - - - - - - - - - - - - - ..\packages\ZXing.Net.0.16.5\lib\net47\zxing.dll - - - ..\packages\ZXing.Net.0.16.5\lib\net47\zxing.presentation.dll + + + + + + + + + + + + + + + + + + + + + + + + + + Never + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Windows.Forms.DataVisualization.dll + - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True + + + + + + + + + + + + + + + + + + + + + + True + True Settings.settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - ConfigForm.cs - - - - - - - - - UserControl - - - CalculationControl.cs - - - Form - - - HotkeySettingsForm.cs - - - Form - - - LogForm.cs - - - - Form - - - ProxyForm.cs - - - Form - - - QRCodeForm.cs - - - Form - - - Form - - - StatisticsStrategyConfigurationForm.cs - - - ConfigForm.cs - Designer - - - ResXFileCodeGenerator - Designer - Resources.Designer.cs - - - CalculationControl.cs - - - HotkeySettingsForm.cs - - - LogForm.cs - - - ProxyForm.cs - - - QRCodeForm.cs - - - StatisticsStrategyConfigurationForm.cs - - - - Designer - - - - - + - - - - - + SettingsSingleFileGenerator Settings.Designer.cs - - - - - - - Designer - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - true - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - + \ No newline at end of file diff --git a/shadowsocks-windows.sln b/shadowsocks-windows.sln index d0048437..be5541e0 100644 --- a/shadowsocks-windows.sln +++ b/shadowsocks-windows.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.29709.97 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\ShadowsocksTest.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}" ProjectSection(ProjectDependencies) = postProject @@ -18,13 +18,14 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86 + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.Build.0 = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|Any CPU {45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.ActiveCfg = Debug|x86 {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|x86 {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|x86