From 3b27e7be3673783124b0b3f7e01d43c9fc687b66 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 20 Apr 2020 19:49:27 +0800 Subject: [PATCH] Revert "Merge pull request #695 from yfdyh000/pr8" This reverts commit 78402118effc1ef29d7c2ea312af6d28389cc37b, reversing changes made to 0c2666260230840880c61c0f9024b6992e8983d2. --- v2rayN/v2rayN.sln | 7 +- v2rayN/v2rayN/Base/HttpWebServerB.cs | 2 +- v2rayN/v2rayN/Base/ListViewSort.cs | 42 - v2rayN/v2rayN/Base/WebClientEx.cs | 5 +- v2rayN/v2rayN/Forms/MainForm.Designer.cs | 100 +- v2rayN/v2rayN/Forms/MainForm.cs | 524 ++-- v2rayN/v2rayN/Forms/MainForm.resx | 2229 ++++++++--------- v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx | 487 ++-- .../Forms/OptionSettingForm.Designer.cs | 175 +- v2rayN/v2rayN/Forms/OptionSettingForm.cs | 40 +- v2rayN/v2rayN/Forms/OptionSettingForm.resx | 999 +------- .../Forms/OptionSettingForm.zh-Hans.resx | 31 +- v2rayN/v2rayN/Forms/QRCodeControl.resx | 76 +- v2rayN/v2rayN/Forms/SubSettingForm.cs | 7 +- v2rayN/v2rayN/Global.cs | 51 +- v2rayN/v2rayN/Handler/ConfigHandler.cs | 50 +- v2rayN/v2rayN/Handler/MainFormHandler.cs | 8 +- v2rayN/v2rayN/Handler/SpeedtestHandler.cs | 29 +- v2rayN/v2rayN/Handler/StatisticsHandler.cs | 10 +- v2rayN/v2rayN/Handler/V2rayConfigHandler.cs | 8 +- v2rayN/v2rayN/Handler/V2rayHandler.cs | 21 +- .../HttpProxyHandler/HttpProxyHandle.cs | 50 +- .../v2rayN/HttpProxyHandler/PrivoxyHandler.cs | 6 +- v2rayN/v2rayN/Mode/Config.cs | 294 ++- v2rayN/v2rayN/Mode/ServerStatistics.cs | 35 +- v2rayN/v2rayN/Mode/VmessQRCode.cs | 22 +- .../v2rayN/Properties/Resources.Designer.cs | 2 +- v2rayN/v2rayN/Properties/Resources.resx | 72 +- v2rayN/v2rayN/Resx/ResUI.Designer.cs | 56 +- v2rayN/v2rayN/Resx/ResUI.resx | 20 +- v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx | 26 +- v2rayN/v2rayN/Tool/Utils.cs | 8 +- v2rayN/v2rayN/v2rayN.csproj | 1 - v2rayN/v2rayN/v2rayN.ico | Bin 82726 -> 67646 bytes v2rayN/v2rayUpgrade/MainForm.Designer.cs | 2 + 35 files changed, 2219 insertions(+), 3276 deletions(-) delete mode 100644 v2rayN/v2rayN/Base/ListViewSort.cs diff --git a/v2rayN/v2rayN.sln b/v2rayN/v2rayN.sln index f4dc9d50..64cf71f4 100644 --- a/v2rayN/v2rayN.sln +++ b/v2rayN/v2rayN.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29926.136 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}" EndProject @@ -35,8 +35,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - RESX_ResXSortingComparison = CurrentCulture - SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} RESX_SortFileContentOnSave = True + SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E} EndGlobalSection EndGlobal diff --git a/v2rayN/v2rayN/Base/HttpWebServerB.cs b/v2rayN/v2rayN/Base/HttpWebServerB.cs index 6434b9ea..fcbca1dd 100644 --- a/v2rayN/v2rayN/Base/HttpWebServerB.cs +++ b/v2rayN/v2rayN/Base/HttpWebServerB.cs @@ -41,7 +41,7 @@ namespace v2rayN.Base listener.Start(); Utils.SaveLog("WebserverB running..."); - while (true && listener != null) + while (true) { if (!listener.Pending()) { diff --git a/v2rayN/v2rayN/Base/ListViewSort.cs b/v2rayN/v2rayN/Base/ListViewSort.cs deleted file mode 100644 index 4ea29705..00000000 --- a/v2rayN/v2rayN/Base/ListViewSort.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Windows.Forms; - -namespace v2rayN.Base -{ - - // ref: https://stackoverflow.com/questions/1214289/how-do-i-sort-integers-in-a-listview - class Sorter : System.Collections.IComparer - { - public int Column = 0; - public int Sorting = 0; - public int Compare(object x, object y) // IComparer Member - { - if (!(x is ListViewItem) || !(y is ListViewItem)) - return (0); - - ListViewItem l1 = (ListViewItem)x; - ListViewItem l2 = (ListViewItem)y; - - int doIntSort = Sorting; - if (doIntSort > 0 // Tag will be number - && (ulong.TryParse(l1.SubItems[Column].Tag?.ToString(), out ulong fl1) - && ulong.TryParse(l2.SubItems[Column].Tag?.ToString(), out ulong fl2)) // fallback to text - ) - { - if (doIntSort == 1) - return fl1.CompareTo(fl2); - else - return fl2.CompareTo(fl1); - } - else - { - string str1 = l1.SubItems[Column].Text; - string str2 = l2.SubItems[Column].Text; - - if (doIntSort == -1 || doIntSort == 1) - return str1.CompareTo(str2); - else - return str2.CompareTo(str1); - } - } - } -} diff --git a/v2rayN/v2rayN/Base/WebClientEx.cs b/v2rayN/v2rayN/Base/WebClientEx.cs index e581575c..096826cc 100644 --- a/v2rayN/v2rayN/Base/WebClientEx.cs +++ b/v2rayN/v2rayN/Base/WebClientEx.cs @@ -5,7 +5,10 @@ namespace v2rayN.Base { class WebClientEx : WebClient { - public int Timeout { get; set; } + public int Timeout + { + get; set; + } public WebClientEx(int timeout = 3000) { Timeout = timeout; diff --git a/v2rayN/v2rayN/Forms/MainForm.Designer.cs b/v2rayN/v2rayN/Forms/MainForm.Designer.cs index aff2d35f..4e516b81 100644 --- a/v2rayN/v2rayN/Forms/MainForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/MainForm.Designer.cs @@ -55,7 +55,7 @@ this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem(); this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem(); - this.menuTestMe = new System.Windows.Forms.ToolStripMenuItem(); + this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem(); this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem(); @@ -94,8 +94,6 @@ this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslRouting = new System.Windows.Forms.ToolStripStatusLabel(); - this.toolSslServerLatency = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel(); this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel(); this.panel1 = new System.Windows.Forms.Panel(); @@ -155,21 +153,20 @@ // // lvServers // - this.lvServers.AllowColumnReorder = true; this.lvServers.ContextMenuStrip = this.cmsLv; resources.ApplyResources(this.lvServers, "lvServers"); this.lvServers.FullRowSelect = true; this.lvServers.GridLines = true; + this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; this.lvServers.HideSelection = false; this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] { ((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))}); + this.lvServers.MultiSelect = false; this.lvServers.Name = "lvServers"; this.lvServers.UseCompatibleStateImageBehavior = false; this.lvServers.View = System.Windows.Forms.View.Details; - this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick); - this.lvServers.ColumnReordered += new System.Windows.Forms.ColumnReorderedEventHandler(this.lvServers_ColumnReordered); - this.lvServers.ColumnWidthChanged += new System.Windows.Forms.ColumnWidthChangedEventHandler(this.lvServers_ColumnWidthChanged); this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); + this.lvServers.Click += new System.EventHandler(this.lvServers_Click); this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick); this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown); // @@ -199,7 +196,7 @@ this.menuTcpingServer, this.menuRealPingServer, this.menuSpeedServer, - this.menuTestMe, + this.tsbTestMe, this.toolStripSeparator6, this.menuExport2ClientConfig, this.menuExport2ServerConfig, @@ -338,11 +335,11 @@ resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer"); this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click); // - // menuTestMe + // tsbTestMe // - this.menuTestMe.Name = "menuTestMe"; - resources.ApplyResources(this.menuTestMe, "menuTestMe"); - this.menuTestMe.Click += new System.EventHandler(this.menuTestMe_Click); + this.tsbTestMe.Name = "tsbTestMe"; + resources.ApplyResources(this.tsbTestMe, "tsbTestMe"); + this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click); // // toolStripSeparator6 // @@ -536,7 +533,6 @@ // // ssMain // - this.ssMain.AllowItemReorder = true; this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolSslSocksPortLab, this.toolSslSocksPort, @@ -547,124 +543,65 @@ this.toolSslPacPortLab, this.toolSslPacPort, this.toolSslBlank3, - this.toolSslRouting, - this.toolSslServerLatency, this.toolSslServerSpeed, this.toolSslBlank4}); resources.ApplyResources(this.ssMain, "ssMain"); this.ssMain.Name = "ssMain"; - this.ssMain.ShowItemToolTips = true; - this.ssMain.TabStop = true; this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked); // // toolSslSocksPortLab // - this.toolSslSocksPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; - this.toolSslSocksPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab"); + this.toolSslSocksPortLab.Name = "toolSslSocksPortLab"; // // toolSslSocksPort // - this.toolSslSocksPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolSslSocksPort.Name = "toolSslSocksPort"; - this.toolSslSocksPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort"); // // toolSslBlank1 // - this.toolSslBlank1.AutoToolTip = true; - this.toolSslBlank1.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.toolSslBlank1.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; - this.toolSslBlank1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslBlank1.Name = "toolSslBlank1"; - this.toolSslBlank1.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1"); + this.toolSslBlank1.Name = "toolSslBlank1"; this.toolSslBlank1.Spring = true; // // toolSslHttpPortLab // - this.toolSslHttpPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; - this.toolSslHttpPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab"); + this.toolSslHttpPortLab.Name = "toolSslHttpPortLab"; // // toolSslHttpPort // - this.toolSslHttpPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolSslHttpPort.Name = "toolSslHttpPort"; - this.toolSslHttpPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort"); // // toolSslBlank2 // - this.toolSslBlank2.AutoToolTip = true; - this.toolSslBlank2.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.toolSslBlank2.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; - this.toolSslBlank2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslBlank2.Name = "toolSslBlank2"; - this.toolSslBlank2.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2"); + this.toolSslBlank2.Name = "toolSslBlank2"; this.toolSslBlank2.Spring = true; // // toolSslPacPortLab // - this.toolSslPacPortLab.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslPacPortLab.Name = "toolSslPacPortLab"; - this.toolSslPacPortLab.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab"); + this.toolSslPacPortLab.Name = "toolSslPacPortLab"; // // toolSslPacPort // - this.toolSslPacPort.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolSslPacPort.Name = "toolSslPacPort"; - this.toolSslPacPort.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort"); // // toolSslBlank3 // - this.toolSslBlank3.AutoToolTip = true; - this.toolSslBlank3.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.toolSslBlank3.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; - this.toolSslBlank3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslBlank3.Name = "toolSslBlank3"; - this.toolSslBlank3.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3"); + this.toolSslBlank3.Name = "toolSslBlank3"; this.toolSslBlank3.Spring = true; // - // toolSslRouting - // - this.toolSslRouting.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.toolSslRouting.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; - this.toolSslRouting.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslRouting.IsLink = true; - this.toolSslRouting.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; - this.toolSslRouting.LinkColor = System.Drawing.SystemColors.ControlText; - this.toolSslRouting.Margin = new System.Windows.Forms.Padding(0, 3, 5, 2); - this.toolSslRouting.Name = "toolSslRouting"; - this.toolSslRouting.Overflow = System.Windows.Forms.ToolStripItemOverflow.Never; - resources.ApplyResources(this.toolSslRouting, "toolSslRouting"); - this.toolSslRouting.Click += new System.EventHandler(this.toolSslRouting_Click); - // - // toolSslServerLatency - // - resources.ApplyResources(this.toolSslServerLatency, "toolSslServerLatency"); - this.toolSslServerLatency.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right; - this.toolSslServerLatency.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenInner; - this.toolSslServerLatency.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolSslServerLatency.IsLink = true; - this.toolSslServerLatency.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; - this.toolSslServerLatency.LinkColor = System.Drawing.SystemColors.ControlText; - this.toolSslServerLatency.Margin = new System.Windows.Forms.Padding(0, 3, 5, 2); - this.toolSslServerLatency.Name = "toolSslServerLatency"; - this.toolSslServerLatency.Click += new System.EventHandler(this.toolSslServerLatency_Click); - // // toolSslServerSpeed // + resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolSslServerSpeed.Name = "toolSslServerSpeed"; - resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed"); - this.toolSslServerSpeed.Click += new System.EventHandler(this.toolSslServerSpeed_Click); // // toolSslBlank4 // @@ -882,7 +819,6 @@ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); this.Shown += new System.EventHandler(this.MainForm_Shown); - this.ResizeEnd += new System.EventHandler(this.MainForm_ResizeEnd); this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged); this.Resize += new System.EventHandler(this.MainForm_Resize); this.scMain.Panel1.ResumeLayout(false); @@ -996,11 +932,9 @@ private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite; private System.Windows.Forms.ToolStripMenuItem menuKeepNothing; private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing; - private System.Windows.Forms.ToolStripMenuItem menuTestMe; + private System.Windows.Forms.ToolStripMenuItem tsbTestMe; private System.Windows.Forms.ToolStripButton tsbReload; private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch; - private System.Windows.Forms.ToolStripStatusLabel toolSslServerLatency; - private System.Windows.Forms.ToolStripStatusLabel toolSslRouting; } } diff --git a/v2rayN/v2rayN/Forms/MainForm.cs b/v2rayN/v2rayN/Forms/MainForm.cs index 0f6ecc3d..a6b79333 100644 --- a/v2rayN/v2rayN/Forms/MainForm.cs +++ b/v2rayN/v2rayN/Forms/MainForm.cs @@ -11,15 +11,13 @@ using v2rayN.Tool; using System.Diagnostics; using System.Drawing; using System.Net; -using System.Threading.Tasks; -using System.Linq; namespace v2rayN.Forms { public partial class MainForm : BaseForm { private V2rayHandler v2rayHandler; - private List lvSelecteds = new List(); // 使用前需用 GetServerListSelectedConfigIndex 更新 + private List lvSelecteds = new List(); private StatisticsHandler statistics = null; #region Window 事件 @@ -35,7 +33,14 @@ namespace v2rayN.Forms Application.ApplicationExit += (sender, args) => { - Closes(); + v2rayHandler.V2rayStop(); + + HttpProxyHandle.CloseHttpAgent(config); + PACServerHandle.Stop(); + + ConfigHandler.SaveConfig(ref config); + statistics?.SaveToFile(); + statistics?.Close(); }; } @@ -49,8 +54,6 @@ namespace v2rayN.Forms { statistics = new StatisticsHandler(config, UpdateStatisticsHandler); } - - Microsoft.Win32.SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged); } private void MainForm_VisibleChanged(object sender, EventArgs e) @@ -82,6 +85,7 @@ namespace v2rayN.Forms { if (e.CloseReason == CloseReason.UserClosing) { + StorageUI(); e.Cancel = true; HideForm(); return; @@ -119,9 +123,7 @@ namespace v2rayN.Forms // break; // } //} - #endregion - #region 窗口大小和列宽等取/存 private void RestoreUI() { scMain.Panel2Collapsed = true; @@ -132,21 +134,20 @@ namespace v2rayN.Forms this.Height = config.uiItem.mainSize.Height; } - foreach (ColumnHeader c in lvServers.Columns) + for (int k = 0; k < lvServers.Columns.Count; k++) { - var width = ConfigHandler.GetformMainLvColWidth(ref config, c.Name, c.Width); - c.Width = width; + var width = ConfigHandler.GetformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); + lvServers.Columns[k].Width = width; } } - // Deprecated. private void StorageUI() { config.uiItem.mainSize = new Size(this.Width, this.Height); - foreach (ColumnHeader c in lvServers.Columns) + for (int k = 0; k < lvServers.Columns.Count; k++) { - ConfigHandler.AddformMainLvColWidth(ref config, c.Name, c.Width); + ConfigHandler.AddformMainLvColWidth(ref config, ((EServerColName)k).ToString(), lvServers.Columns[k].Width); } } @@ -169,40 +170,32 @@ namespace v2rayN.Forms /// private void InitServersView() { - lvServers.ListViewItemSorter = new Sorter(); - lvServers.BeginUpdate(); lvServers.Items.Clear(); - lvServers.Columns.Add(EServerColName.def.ToString(), "", 30); - lvServers.Columns.Add(EServerColName.type.ToString(), UIRes.I18N("LvServiceType"), 80); - lvServers.Columns.Add(EServerColName.remarks.ToString(), UIRes.I18N("LvAlias"), 100); - lvServers.Columns.Add(EServerColName.address.ToString(), UIRes.I18N("LvAddress"), 120); - lvServers.Columns.Add(EServerColName.port.ToString(), UIRes.I18N("LvPort"), 50); - lvServers.Columns.Add(EServerColName.security.ToString(), UIRes.I18N("LvEncryptionMethod"), 90); - lvServers.Columns.Add(EServerColName.network.ToString(), UIRes.I18N("LvTransportProtocol"), 70); - lvServers.Columns.Add(EServerColName.subRemarks.ToString(), UIRes.I18N("LvSubscription"), 50); - lvServers.Columns.Add(EServerColName.testResult.ToString(), UIRes.I18N("LvTestResults"), 70); + lvServers.GridLines = true; + lvServers.FullRowSelect = true; + lvServers.View = View.Details; + lvServers.Scrollable = true; + lvServers.MultiSelect = true; + lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable; + + lvServers.Columns.Add("", 30); + lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80); + lvServers.Columns.Add(UIRes.I18N("LvAlias"), 100); + lvServers.Columns.Add(UIRes.I18N("LvAddress"), 120); + lvServers.Columns.Add(UIRes.I18N("LvPort"), 50); + lvServers.Columns.Add(UIRes.I18N("LvEncryptionMethod"), 90); + lvServers.Columns.Add(UIRes.I18N("LvTransportProtocol"), 70); + lvServers.Columns.Add(UIRes.I18N("LvSubscription"), 50); + lvServers.Columns.Add(UIRes.I18N("LvTestResults"), 70, HorizontalAlignment.Right); - lvServers.Columns[EServerColName.port.ToString()].Tag = Global.sortMode.Numeric.ToString(); if (statistics != null && statistics.Enable) { - lvServers.Columns.Add(EServerColName.todayDown.ToString(), UIRes.I18N("LvTodayDownloadDataAmount"), 70); - lvServers.Columns.Add(EServerColName.todayUp.ToString(), UIRes.I18N("LvTodayUploadDataAmount"), 70); - lvServers.Columns.Add(EServerColName.totalDown.ToString(), UIRes.I18N("LvTotalDownloadDataAmount"), 70); - lvServers.Columns.Add(EServerColName.totalUp.ToString(), UIRes.I18N("LvTotalUploadDataAmount"), 70); - - lvServers.Columns[EServerColName.todayDown.ToString()].Tag = Global.sortMode.Numeric.ToString(); - lvServers.Columns[EServerColName.todayUp.ToString()].Tag = Global.sortMode.Numeric.ToString(); - lvServers.Columns[EServerColName.totalDown.ToString()].Tag = Global.sortMode.Numeric.ToString(); - lvServers.Columns[EServerColName.totalUp.ToString()].Tag = Global.sortMode.Numeric.ToString(); - } - - foreach (ColumnHeader c in lvServers.Columns) - { - if (config.uiItem.mainLvColLayout == null) break; - int i = config.uiItem.mainLvColLayout.IndexOf(c.Name); - if (i >= 0) c.DisplayIndex = i; + lvServers.Columns.Add(UIRes.I18N("LvTodayDownloadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTodayUploadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTotalDownloadDataAmount"), 70); + lvServers.Columns.Add(UIRes.I18N("LvTotalUploadDataAmount"), 70); } lvServers.EndUpdate(); } @@ -212,9 +205,9 @@ namespace v2rayN.Forms /// private void RefreshServersView() { + lvServers.BeginUpdate(); lvServers.Items.Clear(); - List lst = new List(); for (int k = 0; k < config.vmess.Count; k++) { string def = string.Empty; @@ -229,23 +222,10 @@ namespace v2rayN.Forms VmessItem item = config.vmess[k]; - void _addSubItem(ListViewItem i, string name, string text, object tag = null) + void _addSubItem(ListViewItem i, string name, string text) { - var n = new ListViewItem.ListViewSubItem() { Text = text }; - n.Name = name; // new don't accept it. - n.Tag = tag; // cell's data store. - i.SubItems.Add(n); + i.SubItems.Add(new ListViewItem.ListViewSubItem() { Name = name, Text = text }); } - ListViewItem lvItem = new ListViewItem(def); - lvItem.Tag = k; // the Tag of line is config's index. - _addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString()); - _addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); - _addSubItem(lvItem, EServerColName.address.ToString(), item.address); - _addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString(), item.port); - _addSubItem(lvItem, EServerColName.security.ToString(), item.security); - _addSubItem(lvItem, EServerColName.network.ToString(), item.network); - _addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); - _addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); bool stats = statistics != null && statistics.Enable; if (stats) { @@ -257,26 +237,38 @@ namespace v2rayN.Forms todayUp = Utils.HumanFy(sItem.todayUp); todayDown = Utils.HumanFy(sItem.todayDown); } - _addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown, sItem?.todayDown); - _addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp, sItem?.todayUp); - _addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown, sItem?.totalDown); - _addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp, sItem?.totalUp); + } + ListViewItem lvItem = new ListViewItem(def); + _addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString()); + _addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks); + _addSubItem(lvItem, EServerColName.address.ToString(), item.address); + _addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString()); + _addSubItem(lvItem, EServerColName.security.ToString(), item.security); + _addSubItem(lvItem, EServerColName.network.ToString(), item.network); + _addSubItem(lvItem, EServerColName.subRemarks.ToString(), item.getSubRemarks(config)); + _addSubItem(lvItem, EServerColName.testResult.ToString(), item.testResult); + if (stats) + { + _addSubItem(lvItem, EServerColName.todayDown.ToString(), todayDown); + _addSubItem(lvItem, EServerColName.todayUp.ToString(), todayUp); + _addSubItem(lvItem, EServerColName.totalDown.ToString(), totalDown); + _addSubItem(lvItem, EServerColName.totalUp.ToString(), totalUp); } - if (config.interlaceColoring && k % 2 == 1) // 隔行着色 + if (k % 2 == 1) // 隔行着色 { - lvItem.BackColor = SystemColors.Control; + lvItem.BackColor = Color.WhiteSmoke; } if (config.index.Equals(k)) { //lvItem.Checked = true; - lvItem.ForeColor = SystemColors.MenuHighlight; + lvItem.ForeColor = Color.DodgerBlue; lvItem.Font = new Font(lvItem.Font, FontStyle.Bold); } - if (lvItem != null) lst.Add(lvItem); + if (lvItem != null) lvServers.Items.Add(lvItem); } - lvServers.Items.AddRange(lst.ToArray()); + lvServers.EndUpdate(); //if (lvServers.Items.Count > 0) //{ @@ -331,24 +323,26 @@ namespace v2rayN.Forms private void lvServers_SelectedIndexChanged(object sender, EventArgs e) { - RefreshQRCodePanel(); + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + //qrCodeControl.showQRCode(index, config); } - private void RefreshQRCodePanel() - { - if (scMain.Panel2Collapsed) return; // saving cpu. - - int index = GetConfigIndexFromServerListSelected(); - if (index < 0) return; - qrCodeControl.showQRCode(index, config); - } - private void RefreshTaryIcon() - { - notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); - } private void DisplayToolStatus() { - ssMain.SuspendLayout(); toolSslSocksPort.Text = toolSslHttpPort.Text = toolSslPacPort.Text = "OFF"; @@ -373,26 +367,7 @@ namespace v2rayN.Forms } } - string routingStatus = ""; - switch (config.routingMode) - { - case 0: - routingStatus = UIRes.I18N("RoutingModeGlobal"); - break; - case 1: - routingStatus = UIRes.I18N("RoutingModeBypassLAN"); - break; - case 2: - routingStatus = UIRes.I18N("RoutingModeBypassCN"); - break; - case 3: - routingStatus = UIRes.I18N("RoutingModeBypassLANCN"); - break; - } - toolSslRouting.Text = routingStatus; - ssMain.ResumeLayout(); - - RefreshTaryIcon(); + notifyMain.Icon = MainFormHandler.Instance.GetNotifyIcon(config, this.Icon); } private void ssMain_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { @@ -404,83 +379,73 @@ namespace v2rayN.Forms #endregion - public static Task autoLatencyRefreshTask; - private void autoLatencyRefresh() - { - if (config.listenerType != ListenerType.noHttpProxy) - { - if (autoLatencyRefreshTask == null || autoLatencyRefreshTask.IsCompleted) - { - autoLatencyRefreshTask = Task.Run(async delegate - { - if (!this.IsHandleCreated) return; // the GUI app is exiting. - await Task.Delay(2000); - this.Invoke((MethodInvoker)(delegate - { - toolSslServerLatencyRefresh(); - })); - }); - } - } - } - #region v2ray 操作 + /// /// 载入V2ray /// - private async void LoadV2ray() + private void LoadV2ray() { - this.Invoke((MethodInvoker)(delegate - { - tsbReload.Enabled = false; + tsbReload.Enabled = false; - if (Global.reloadV2ray) - { - ClearMsg(); - } - })); - await v2rayHandler.LoadV2ray(config); + if (Global.reloadV2ray) + { + ClearMsg(); + } + v2rayHandler.LoadV2ray(config); Global.reloadV2ray = false; - ChangePACButtonStatus(config.listenerType); - //ConfigHandler.SaveConfigToFile(ref config, false); // ChangePACButtonStatus does it. + ConfigHandler.SaveConfig(ref config, false); statistics?.SaveToFile(); - this.Invoke((MethodInvoker)(delegate - { - tsbReload.Enabled = true; + ChangePACButtonStatus(config.listenerType); - autoLatencyRefresh(); - })); + tsbReload.Enabled = true; } /// - /// 关闭相关组件 + /// 关闭V2ray /// - private void Closes() + private void CloseV2ray() { - List tasks = new List - { - Task.Run(() => ConfigHandler.SaveConfigToFile(ref config)), - Task.Run(() => HttpProxyHandle.CloseHttpAgent(config)), - Task.Run(() => v2rayHandler.V2rayStop()), - Task.Run(() => PACServerHandle.Stop()), - Task.Run(() => - { - statistics?.SaveToFile(); - statistics?.Close(); - }) - }; - Task.WaitAll(tasks.ToArray()); + ConfigHandler.SaveConfig(ref config, false); + statistics?.SaveToFile(); + + ChangePACButtonStatus(0); + + v2rayHandler.V2rayStop(); } #endregion #region 功能按钮 + private void lvServers_Click(object sender, EventArgs e) + { + int index = -1; + try + { + if (lvServers.SelectedIndices.Count > 0) + { + index = lvServers.SelectedIndices[0]; + } + } + catch + { + } + if (index < 0) + { + return; + } + qrCodeControl.showQRCode(index, config); + } + private void lvServers_DoubleClick(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); - if (index < 0) return; + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } if (config.vmess[index].configType == (int)EConfigType.Vmess) { @@ -608,9 +573,12 @@ namespace v2rayN.Forms private void menuRemoveServer_Click(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); - if (index < 0) return; + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } if (UI.ShowYesNo(UIRes.I18N("RemoveServer")) == DialogResult.No) { return; @@ -627,22 +595,12 @@ namespace v2rayN.Forms private void menuRemoveDuplicateServer_Click(object sender, EventArgs e) { - VmessItem activeVm = null; - if (config.index >= 0) { - activeVm = config.vmess[config.index]; - } Utils.DedupServerList(config.vmess, out List servers, config.keepOlderDedupl); int oldCount = config.vmess.Count; int newCount = servers.Count; if (servers != null) { config.vmess = servers; - - if (activeVm != null) - { - int index = Utils.ServerVmIndexof(config.vmess, activeVm); - if (index >= 0) config.index = index; // restore to the correct value - } } //刷新 RefreshServers(); @@ -652,9 +610,11 @@ namespace v2rayN.Forms private void menuCopyServer_Click(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); - if (index < 0) return; - + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } if (ConfigHandler.CopyServer(ref config, index) == 0) { //刷新 @@ -664,9 +624,11 @@ namespace v2rayN.Forms private void menuSetDefaultServer_Click(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); - if (index < 0) return; - + int index = GetLvSelectedIndex(); + if (index < 0) + { + return; + } SetDefaultServer(index); } @@ -707,37 +669,37 @@ namespace v2rayN.Forms } private void Speedtest(string actionType) { - if (GetConfigIndexFromServerListSelected() < 0) return; + if (GetLvSelectedIndex() < 0) return; ClearTestResult(); SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, actionType, UpdateSpeedtestHandler); } - private async void menuTestMe_Click(object sender, EventArgs e) + private void tsbTestMe_Click(object sender, EventArgs e) { - string result = await httpProxyTest() + "ms"; + string result = httpProxyTest() + "ms"; AppendText(false, string.Format(UIRes.I18N("TestMeOutput"), result)); } - private async Task httpProxyTest() + private int httpProxyTest() { SpeedtestHandler statistics = new SpeedtestHandler(ref config, ref v2rayHandler, lvSelecteds, "", UpdateSpeedtestHandler); - return await Task.Run(() => statistics.RunAvailabilityCheck()); + return statistics.RunAvailabilityCheck(); } private void menuExport2ClientConfig_Click(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); + int index = GetLvSelectedIndex(); MainFormHandler.Instance.Export2ClientConfig(index, config); } private void menuExport2ServerConfig_Click(object sender, EventArgs e) { - int index = GetConfigIndexFromServerListSelected(); + int index = GetLvSelectedIndex(); MainFormHandler.Instance.Export2ServerConfig(index, config); } private void menuExport2ShareUrl_Click(object sender, EventArgs e) { - GetConfigIndexFromServerListSelected(); + GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); foreach (int v in lvSelecteds) @@ -760,7 +722,7 @@ namespace v2rayN.Forms private void menuExport2SubContent_Click(object sender, EventArgs e) { - GetConfigIndexFromServerListSelected(); + GetLvSelectedIndex(); StringBuilder sb = new StringBuilder(); foreach (int v in lvSelecteds) @@ -782,20 +744,13 @@ namespace v2rayN.Forms private void tsbOptionSetting_Click(object sender, EventArgs e) { - string tab = ""; - if (sender == toolSslRouting) tab = "tabPreDefinedRules"; - - OptionSettingForm fm = new OptionSettingForm(tab); + OptionSettingForm fm = new OptionSettingForm(); if (fm.ShowDialog() == DialogResult.OK) { //刷新 RefreshServers(); - //Application.DoEvents(); - Task.Run(() => - { - LoadV2ray(); - HttpProxyHandle.RestartHttpAgent(config, true); - }); + LoadV2ray(); + HttpProxyHandle.RestartHttpAgent(config, true); } } @@ -828,19 +783,15 @@ namespace v2rayN.Forms //刷新 RefreshServers(); LoadV2ray(); - toolSslServerLatencySet(); } return 0; } /// - /// 获取服务器列表选中行的配置项(config)索引(index) - /// - /// 返回值对应首个选中项,无选中或出错时返回-1 - /// 访问多选请在调用此函数后访问 lvSelecteds + /// 取得ListView选中的行 /// /// - private int GetConfigIndexFromServerListSelected() + private int GetLvSelectedIndex() { int index = -1; lvSelecteds.Clear(); @@ -852,11 +803,9 @@ namespace v2rayN.Forms return index; } - index = Convert.ToInt32(lvServers.SelectedItems[0].Tag); - - foreach (int item in lvServers.SelectedIndices) + index = lvServers.SelectedIndices[0]; + foreach (int i in lvServers.SelectedIndices) { - int i = Convert.ToInt32(lvServers.Items[item].Tag); lvSelecteds.Add(i); } return index; @@ -866,27 +815,6 @@ namespace v2rayN.Forms return index; } } - /// - /// 获取服务器列表表示指定配置项的所有行的索引 - /// 基于列表项的Tag属性 - /// - /// 出错时返回空。 - /// - /// - private List GetServerListItemsByConfigIndex(int configIndex) - { - var l = new List(); - foreach (ListViewItem item in lvServers.Items) - { - string tagStr = item.Tag?.ToString(); - if (int.TryParse(tagStr, out int tagInt) - && tagInt == configIndex) - { - l.Add(item.Index); - } - } - return l; - } private void menuAddCustomServer_Click(object sender, EventArgs e) { @@ -1119,13 +1047,12 @@ namespace v2rayN.Forms #region 后台测速 - private void SetTestResult(int configIndex, string txt) + private void SetTestResult(int k, string txt) { - var l = GetServerListItemsByConfigIndex(configIndex); - if (l.Count > 0) + if (k < lvServers.Items.Count) { - config.vmess[configIndex].testResult = txt; - l.ForEach((listIndex) => lvServers.Items[listIndex].SubItems["testResult"].Text = txt); + config.vmess[k].testResult = txt; + lvServers.Items[k].SubItems["testResult"].Text = txt; } } private void ClearTestResult() @@ -1149,28 +1076,22 @@ namespace v2rayN.Forms { up /= (ulong)(config.statisticsFreshRate / 1000f); down /= (ulong)(config.statisticsFreshRate / 1000f); - this.Invoke((MethodInvoker)(delegate - { - toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); - })); + toolSslServerSpeed.Text = string.Format("{0}/s↑ | {1}/s↓", Utils.HumanFy(up), Utils.HumanFy(down)); + + List datas = new List(); for (int i = 0; i < config.vmess.Count; i++) { - int statsIndex = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); - List l = GetServerListItemsByConfigIndex(i); - - if (statsIndex != -1 && l.Count > 0) + int index = statistics.FindIndex(item_ => item_.itemId == config.vmess[i].getItemId()); + if (index != -1) { - this?.Invoke((MethodInvoker)delegate + lvServers.Invoke((MethodInvoker)delegate { lvServers.BeginUpdate(); - l.ForEach((listIndex) => - { - lvServers.Items[listIndex].SubItems["todayDown"].Text = Utils.HumanFy(statistics[statsIndex].todayDown); - lvServers.Items[listIndex].SubItems["todayUp"].Text = Utils.HumanFy(statistics[statsIndex].todayUp); - lvServers.Items[listIndex].SubItems["totalDown"].Text = Utils.HumanFy(statistics[statsIndex].totalDown); - lvServers.Items[listIndex].SubItems["totalUp"].Text = Utils.HumanFy(statistics[statsIndex].totalUp); - }); + lvServers.Items[i].SubItems["todayDown"].Text = Utils.HumanFy(statistics[index].todayDown); + lvServers.Items[i].SubItems["todayUp"].Text = Utils.HumanFy(statistics[index].todayUp); + lvServers.Items[i].SubItems["totalDown"].Text = Utils.HumanFy(statistics[index].totalDown); + lvServers.Items[i].SubItems["totalUp"].Text = Utils.HumanFy(statistics[index].totalUp); lvServers.EndUpdate(); }); @@ -1209,7 +1130,7 @@ namespace v2rayN.Forms private void MoveServer(EMove eMove) { - int index = GetConfigIndexFromServerListSelected(); + int index = GetLvSelectedIndex(); if (index < 0) { UI.Show(UIRes.I18N("PleaseSelectServer")); @@ -1290,13 +1211,8 @@ namespace v2rayN.Forms item.Checked = ((int)type == k); } - Global.reloadV2ray = false; - ConfigHandler.SaveConfigToFile(ref config); - - this.Invoke((MethodInvoker)(delegate - { - DisplayToolStatus(); - })); + ConfigHandler.SaveConfig(ref config, false); + DisplayToolStatus(); } #endregion @@ -1304,11 +1220,11 @@ namespace v2rayN.Forms #region CheckUpdate - private async void askToDownload(DownloadHandle downloadHandle, string url) + private void askToDownload(DownloadHandle downloadHandle, string url) { if (UI.ShowYesNo(string.Format(UIRes.I18N("DownloadYesNo"), url)) == DialogResult.Yes) { - if (await httpProxyTest() > 0) + if (httpProxyTest() > 0) { int httpPort = config.GetLocalPort(Global.InboundHttp); WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); @@ -1411,7 +1327,7 @@ namespace v2rayN.Forms try { - Closes(); + CloseV2ray(); string fileName = downloadHandle.DownloadFileName; fileName = Utils.GetPath(fileName); @@ -1474,8 +1390,7 @@ namespace v2rayN.Forms }; } AppendText(false, UIRes.I18N("MsgStartUpdatingPAC")); - string url = Utils.IsNullOrEmpty(config.urlGFWList) ? Global.GFWLIST_URL : config.urlGFWList; - pacListHandle.WebDownloadString(url); + pacListHandle.WebDownloadString(config.urlGFWList); } private void tsbCheckClearPACList_Click(object sender, EventArgs e) @@ -1588,7 +1503,7 @@ namespace v2rayN.Forms { if (args.Success) { - //AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); + AppendText(false, $"{hashCode}{UIRes.I18N("MsgGetSubscriptionSuccessfully")}"); string result = Utils.Base64Decode(args.Msg); if (Utils.IsNullOrEmpty(result)) { @@ -1627,7 +1542,6 @@ namespace v2rayN.Forms { bool bShow = tsbQRCodeSwitch.Checked; scMain.Panel2Collapsed = !bShow; - RefreshQRCodePanel(); } #endregion @@ -1649,100 +1563,8 @@ namespace v2rayN.Forms } - #endregion - private void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e) - { - RefreshTaryIcon(); - } - private async void toolSslServerLatencyRefresh() - { - toolSslServerLatencySet(UIRes.I18N("ServerLatencyChecking")); - string result = await httpProxyTest() + "ms"; - toolSslServerLatencySet(result); - } - private void toolSslServerLatencySet(string text = "") - { - toolSslServerLatency.Text = string.Format(UIRes.I18N("toolSslServerLatency"), text); - } - private void toolSslServerLatency_Click(object sender, EventArgs e) - { - toolSslServerLatencyRefresh(); - } - private void toolSslServerSpeed_Click(object sender, EventArgs e) - { - //toolSslServerLatencyRefresh(); - } - - private void toolSslRouting_Click(object sender, EventArgs e) - { - tsbOptionSetting_Click(toolSslRouting, null); - } - - private int lastSortedColIndex = -1; - private bool lastSortedColDirection = false; - private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e) - { - Sorter s = (Sorter)lvServers.ListViewItemSorter; - s.Column = e.Column; - - int doIntSort; - bool isNum = lvServers.Columns[e.Column].Tag?.ToString() == Global.sortMode.Numeric.ToString(); - if (lastSortedColIndex < 0 // 首次 - || (lastSortedColIndex >= 0 && lastSortedColIndex != e.Column) // 排序了其他列 - || (lastSortedColIndex == e.Column && !lastSortedColDirection) // 已排序 - ) - { - lastSortedColDirection = true; - doIntSort = isNum ? 1 : -1; // 正序 - } - else - { - lastSortedColDirection = false; - doIntSort = isNum ? 2 : -2; // 倒序 - } - lastSortedColIndex = e.Column; - - s.Sorting = doIntSort; - - lvServers.Sort(); - reInterlaceColoring(); - } - private void reInterlaceColoring() - { - if (!config.interlaceColoring) return; - for (int k = 0; k < lvServers.Items.Count; k++) - { - if (config.interlaceColoring && k % 2 == 1) - lvServers.Items[k].BackColor = SystemColors.Control; - else - lvServers.Items[k].BackColor = lvServers.BackColor; - } - } - - private void lvServers_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e) - { - ColumnHeader c = lvServers.Columns[e.ColumnIndex]; - ConfigHandler.AddformMainLvColWidth(ref config, c.Name, c.Width); - Task.Run(() => ConfigHandler.SaveConfigToFile(ref config)); - } - - private void MainForm_ResizeEnd(object sender, EventArgs e) - { - config.uiItem.mainSize = new Size(this.Width, this.Height); - Task.Run(() => ConfigHandler.SaveConfigToFile(ref config)); - } - - private async void lvServers_ColumnReordered(object sender, ColumnReorderedEventArgs e) - { - await Task.Delay(500); - var names = (from col in lvServers.Columns.Cast() - orderby col.DisplayIndex - select col.Name).ToList(); - config.uiItem.mainLvColLayout = names; - _ = Task.Run(() => ConfigHandler.SaveConfigToFile(ref config)); - } } } diff --git a/v2rayN/v2rayN/Forms/MainForm.resx b/v2rayN/v2rayN/Forms/MainForm.resx index 2fa0a97a..82105967 100644 --- a/v2rayN/v2rayN/Forms/MainForm.resx +++ b/v2rayN/v2rayN/Forms/MainForm.resx @@ -118,131 +118,193 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Fill + + + 3, 17 + 327, 17 - - - 17, 17 - - - 137, 17 - - - 498, 17 - - - 228, 18 - - - 409, 17 - - - True - - - 108 - - - 6, 12 + + 355, 22 - - 952, 593 + + Add [VMess] server - - 4, 4, 4, 4 + + 355, 22 - - MainForm + + Add [Shadowsocks] server - - v2rayN + + 355, 22 - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + Add [Socks] server - - bgwScan + + 355, 22 - - System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Add a custom configuration server - - cmsLv + + 355, 22 + + + Import bulk URL from clipboard (Ctrl+V) + + + 355, 22 + + + Scan QR code on the screen (Ctrl+S) + + + 352, 6 + + + 355, 22 + + + Remove selected servers (Delete) + + + 355, 22 + + + Remove duplicate servers + + + 355, 22 + + + Clone selected server + + + 355, 22 + + + Set as active server (Enter) + + + 352, 6 + + + 355, 22 + + + Move to top (T) + + + 355, 22 + + + Up (U) + + + 355, 22 + + + Down (D) + + + 355, 22 + + + Move to bottom (B) + + + 355, 22 + + + Select All (Ctrl+A) + + + 352, 6 + + + 355, 22 + + + Test servers ping (Ctrl+P) + + + 355, 22 + + + Test servers with tcping (Ctrl+O) + + + 355, 22 + + + Test servers real delay (Ctrl+R) + + + 355, 22 + + + Test servers download speed (Ctrl+T) + + + 355, 22 + + + Test current service status + + + 352, 6 + + + 355, 22 + + + Export selected server for client configuration + + + 355, 22 + + + Export selected server for server configuration + + + 355, 22 + + + Export share URLs to clipboard (Ctrl+C) + + + 355, 22 + + + Export subscription (base64) share to clipboard + + + Magenta + + + 64, 53 + + + Servers + + + ImageAboveText 356, 556 + + cmsLv + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - NoControl - - - cmsMain - - - 265, 164 - - - System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Fill - - - 0, 66 - - - groupBox1 - - - $this - - - 952, 351 - - - 0 - - - Servers list - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - Bottom - - - 0, 417 - - - groupBox2 - - - $this - - - 952, 176 - - - 3 - - - Informations - - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - Fill @@ -266,515 +328,36 @@ 0, 0 - - lvServers - - - scMain.Panel1 - 686, 331 + 0 + + lvServers + v2rayN.Base.ListViewFlickerFree, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + scMain.Panel1 + 0 - - menuAddCustomServer + + scMain.Panel1 - - 355, 22 + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Add a custom configuration server + + scMain - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddServers - - - 355, 22 - - - Import bulk URL from clipboard (Ctrl+V) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddServers2 - - - 264, 22 - - - Import bulk URL from clipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddShadowsocksServer - - - 355, 22 - - - Add [Shadowsocks] server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddSocksServer - - - 355, 22 - - - Add [Socks] server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuAddVmessServer - - - 355, 22 - - - Add [VMess] server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuCopyPACUrl - - - 264, 22 - - - Copy local PAC URL - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuCopyServer - - - 355, 22 - - - Clone selected server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExit - - - 264, 22 - - - Exit - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ClientConfig - - - 355, 22 - - - Export selected server for client configuration - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ServerConfig - - - 355, 22 - - - Export selected server for server configuration - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2ShareUrl - - - 355, 22 - - - Export share URLs to clipboard (Ctrl+C) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuExport2SubContent - - - 355, 22 - - - Export subscription (base64) share to clipboard - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobal - - - 411, 22 - - - Open Http proxy and set the system proxy (global mode) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuGlobalPAC - - - 411, 22 - - - Open PAC and set the system proxy (PAC mode) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeep - - - 411, 22 - - - Only open Http proxy and clear the proxy settings - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepNothing - - - 411, 22 - - - Only open Http proxy and do nothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepPAC - - - 411, 22 - - - Only open PAC and clear the proxy settings - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuKeepPACNothing - - - 411, 22 - - - Only open PAC and do nothing - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveBottom - - - 355, 22 - - - Move to bottom (B) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveDown - - - 355, 22 - - - Down (D) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveTop - - - 355, 22 - - - Move to top (T) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuMoveUp - - - 355, 22 - - - Up (U) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuNotEnabledHttp - - - 411, 22 - - - Not Enabled Http Proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuPingServer - - - 355, 22 - - - Test servers ping (Ctrl+P) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRealPingServer - - - 355, 22 - - - Test servers real delay (Ctrl+R) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemoveDuplicateServer - - - 355, 22 - - - Remove duplicate servers - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuRemoveServer - - - 355, 22 - - - Remove selected servers (Delete) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuScanScreen - - - 355, 22 - - - Scan QR code on the screen (Ctrl+S) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuScanScreen2 - - - 264, 22 - - - Scan QR code on the screen - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSelectAll - - - 355, 22 - - - Select All (Ctrl+A) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuServers - - - 264, 22 - - - Server - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSetDefaultServer - - - 355, 22 - - - Set as active server (Enter) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSpeedServer - - - 355, 22 - - - Test servers download speed (Ctrl+T) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuSysAgentMode - - - 264, 22 - - - Http proxy - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuTcpingServer - - - 355, 22 - - - Test servers with tcping (Ctrl+O) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuTestMe - - - 355, 22 - - - Test current service status - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - menuUpdateSubscriptions - - - 264, 22 - - - Update subscriptions - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - notifyMain - - - v2rayN - - - System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Top - - - 0, 56 - - - panel1 - - - $this - - - 952, 10 - - - 2 - - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 + + 0 Fill @@ -782,63 +365,39 @@ 0, 0 - - qrCodeControl - - - scMain.Panel2 - 256, 331 2 + + qrCodeControl + v2rayN.Forms.QRCodeControl, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + + scMain.Panel2 + 0 - - Fill - - - 3, 17 - - - scMain - - - scMain.Panel1 - - - scMain - - - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - scMain.Panel2 - - scMain - System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + scMain + 1 100 - - groupBox1 - 946, 331 @@ -848,155 +407,260 @@ 0 + + scMain + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox1 + 0 - - 3, 147 + + 17, 17 + + + 137, 17 + + + NoControl - - ssMain + + 411, 22 - + + Not Enabled Http Proxy + + + 411, 22 + + + Open Http proxy and set the system proxy (global mode) + + + 411, 22 + + + Open PAC and set the system proxy (PAC mode) + + + 411, 22 + + + Only open Http proxy and clear the proxy settings + + + 411, 22 + + + Only open PAC and clear the proxy settings + + + 411, 22 + + + Only open Http proxy and do nothing + + + 411, 22 + + + Only open PAC and do nothing + + + 264, 22 + + + Http proxy + + + 264, 22 + + + Server + + + 264, 22 + + + Import bulk URL from clipboard + + + 264, 22 + + + Scan QR code on the screen + + + 264, 22 + + + Copy local PAC URL + + + 264, 22 + + + Update subscriptions + + + 261, 6 + + + 264, 22 + + + Exit + + + 265, 164 + + + cmsMain + + + System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + v2rayN + + + True + + + 498, 17 + + + Fill + + + 0, 66 + + + 952, 351 + + + 0 + + + Servers list + + + groupBox1 + + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Fill + + + 3, 17 + + + 0 + + + True + + + Vertical + + + 946, 134 + + + 3 + + + txtMsgBox + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox2 - - 946, 26 + + 0 - - 6 + + 228, 18 + + + 微软雅黑, 8pt - - statusStrip1 + + 52, 17 - - System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + SOCKS5: - - 1 + + 0, 17 - - toolSslBlank1 + + 微软雅黑, 8pt - 170, 21 + 195, 17 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank2 - - - 170, 21 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank3 - - - 170, 21 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslBlank4 - - - 0, 21 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslHttpPort - - - 0, 21 - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslHttpPortLab + + 微软雅黑, 8pt - 41, 21 + 39, 17 HTTP: - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 - - toolSslPacPort + + 微软雅黑, 8pt - - 0, 21 + + 195, 17 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslPacPortLab + + 微软雅黑, 8pt - 34, 21 + 33, 17 PAC: - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 - - toolSslRouting + + 微软雅黑, 8pt - - 96, 21 + + 195, 17 - - Routing Mode - - - The Core's routing mode - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + False - - toolSslServerLatency + + 微软雅黑, 8pt - - 80, 21 - - - Latency: - - - MiddleLeft - - - The http proxy's latency time. - - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolSslServerSpeed + + No - 100, 21 + 220, 17 SPEED Disabled @@ -1004,334 +668,117 @@ MiddleRight - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 17 - - toolSslSocksPort + + 3, 151 - - 0, 21 + + 946, 22 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0 - - toolSslSocksPortLab + + statusStrip1 - - 58, 21 + + ssMain - - SOCKS5: + + System.Windows.Forms.StatusStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + groupBox2 - - toolStripSeparator1 + + 1 - - 352, 6 + + Bottom - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 417 - - toolStripSeparator10 + + 952, 176 - - 6, 56 + + 3 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Informations - - toolStripSeparator11 + + groupBox2 - - 6, 56 + + System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - toolStripSeparator12 + + 3 - - 184, 6 + + Top - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 0, 56 - - toolStripSeparator13 + + 952, 10 - - 390, 6 + + 2 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + panel1 - - toolStripSeparator2 + + System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 261, 6 + + $this - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator3 - - - 352, 6 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator4 + + 4 + + 409, 17 + 6, 56 - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 125, 22 - - toolStripSeparator5 - - - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator6 - - - 352, 6 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator7 - - - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator8 - - - 6, 56 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - toolStripSeparator9 - - - 352, 6 - - - System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbAbout - - - 187, 22 - - - v2rayN Project - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckClearPACList - - - 393, 22 - - - Make PAC pass-through to Core route rules - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Magenta - - - tsbCheckUpdate - - - 128, 53 - - - Check for updates - - - ImageAboveText - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateCore - - - 393, 22 - - - Update v2rayCore - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdateN - - - 393, 22 - - - v2rayN (this software) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbCheckUpdatePACList - - - 393, 22 - - - Check for updated PAC (need the HTTP proxy are ON) - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ - GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== - - - - Magenta - - - tsbClose - - - 52, 53 - - - Close - - - ImageAboveText - - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Magenta - - - tsbHelp - - - 48, 53 - - - Help - - - ImageAboveText - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageDef - - - 187, 22 - - - Language-[English] - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbLanguageZhHans - - - 187, 22 - - - 语言-[中文简体] - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Magenta - - - tsbOptionSetting - - - 58, 53 - - + Settings - - ImageAboveText + + 125, 22 - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Updates - + Magenta - - tsbPromotion + + 99, 53 - - 89, 53 + + Subscriptions - - Promotion - - + ImageAboveText - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Magenta - - tsbQRCodeSwitch - 45, 53 @@ -1344,8 +791,23 @@ ImageAboveText - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6, 56 + + + Magenta + + + 58, 53 + + + Settings + + + ImageAboveText + + + 6, 56 @@ -1364,9 +826,6 @@ Magenta - - tsbReload - 97, 53 @@ -1376,71 +835,56 @@ ImageAboveText - - System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6, 56 - + + 393, 22 + + + v2rayN (this software) + + + 393, 22 + + + Update v2rayCore + + + 393, 22 + + + Check for updated PAC (need the HTTP proxy are ON) + + + 390, 6 + + + 393, 22 + + + Simplify PAC (need to set Core route) + + Magenta - - tsbServer + + 128, 53 - - 64, 53 + + Check for updates - - Servers - - + ImageAboveText - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6, 56 - - Magenta + + 187, 22 - - tsbSub - - - 99, 53 - - - Subscriptions - - - ImageAboveText - - - System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSubSetting - - - 125, 22 - - - Settings - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbSubUpdate - - - 125, 22 - - - Updates - - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tsbV2rayWebsite + + v2rayN Project 187, 22 @@ -1448,61 +892,608 @@ V2Ray Website - - System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 184, 6 + + + 187, 22 + + + Language-[English] + + + 187, 22 + + + 语言-[中文简体] + + + Magenta + + + 48, 53 + + + Help + + + ImageAboveText + + + Magenta + + + 89, 53 + + + Promotion + + + ImageAboveText + + + 6, 56 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAySURBVFhH7c6xDQAgCEVBRnVTHU2ZABuMxV3yOvJDAAA/ + GqfZVG6X8mg1dfUAAPBQxAZd0SJruVXHWwAAAABJRU5ErkJggg== + + + + Magenta + + + 52, 53 + + + Close + + + ImageAboveText 0, 0 - - tsMain - - - $this - 952, 56 1 + + tsMain + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + 5 - - Fill - - - 3, 17 - - - 0 - - + True + + + 108 + + + 6, 12 - - txtMsgBox + + 952, 593 - - groupBox2 + + 4, 4, 4, 4 - - Vertical + + v2rayN - - 946, 130 + + menuAddVmessServer - - 3 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + menuAddShadowsocksServer - - 0 + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddSocksServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddCustomServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator1 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRemoveDuplicateServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSetDefaultServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator3 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveTop + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveUp + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveDown + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuMoveBottom + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSelectAll + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator9 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuTcpingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuRealPingServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSpeedServer + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbTestMe + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator6 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ClientConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ServerConfig + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2ShareUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExport2SubContent + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbServer + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + notifyMain + + + System.Windows.Forms.NotifyIcon, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuSysAgentMode + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuNotEnabledHttp + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobal + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuGlobalPAC + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeep + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepPAC + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuKeepPACNothing + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuServers + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuAddServers2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuScanScreen2 + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuCopyPACUrl + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuUpdateSubscriptions + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator2 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + menuExit + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + bgwScan + + + System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslSocksPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslSocksPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank1 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslHttpPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslHttpPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank2 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslPacPortLab + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslPacPort + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank3 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslServerSpeed + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolSslBlank4 + + + System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator4 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSub + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubSetting + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbSubUpdate + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbQRCodeSwitch + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator8 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbOptionSetting + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator5 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbReload + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator7 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdate + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateN + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdateCore + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckUpdatePACList + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator13 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbCheckClearPACList + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator10 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbHelp + + + System.Windows.Forms.ToolStripDropDownButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbAbout + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbV2rayWebsite + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator12 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageDef + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbLanguageZhHans + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbPromotion + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripSeparator11 + + + System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tsbClose + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MainForm + + + v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx index b8045d6f..21164412 100644 --- a/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/MainForm.zh-Hans.resx @@ -118,52 +118,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 301, 534 - - - 196, 164 - - - 服务器列表 - - - 信息 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 - ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu - PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA - BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 - bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp - bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz - dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA - CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp - bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 - bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 - ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 - ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== - - - + 300, 22 - - 添加自定义配置服务器 - - - 300, 22 - - - 从剪贴板导入批量URL (Ctrl+V) - - - 195, 22 - - - 从剪贴板导入批量URL + + 添加[VMess]服务器 300, 22 @@ -177,17 +136,38 @@ 添加[Socks]服务器 - + 300, 22 - - 添加[VMess]服务器 + + 添加自定义配置服务器 - - 195, 22 + + 300, 22 - - 复制本地PAC网址 + + 从剪贴板导入批量URL (Ctrl+V) + + + 300, 22 + + + 扫描屏幕上的二维码 (Ctrl+S) + + + 297, 6 + + + 300, 22 + + + 移除所选服务器(多选) (Delete) + + + 300, 22 + + + 移除重复的服务器 300, 22 @@ -195,11 +175,74 @@ 克隆所选服务器 - - 195, 22 + + 300, 22 - - 退出 + + 设为活动服务器 (Enter) + + + 297, 6 + + + 300, 22 + + + 上移至顶 (T) + + + 300, 22 + + + 上移 (U) + + + 300, 22 + + + 下移 (D) + + + 300, 22 + + + 下移至底 (B) + + + 300, 22 + + + 全选 (Ctrl+A) + + + 297, 6 + + + 300, 22 + + + 测试服务器延迟Ping(多选) (Ctrl+P) + + + 300, 22 + + + 测试服务器延迟Tcping(多选) (Ctrl+O) + + + 300, 22 + + + 测试服务器真连接延迟(多选) (Ctrl+R) + + + 300, 22 + + + 测试服务器速度(多选) (Ctrl+T) + + + 297, 6 300, 22 @@ -225,6 +268,38 @@ 批量导出订阅内容至剪贴板(多选) + + 73, 53 + + + 服务器 + + + 301, 534 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0 + ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu + PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA + BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5 + bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp + bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz + dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA + CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp + bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5 + bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3 + ////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0 + ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw== + + + + 316, 22 + + + 关闭Http代理 + 316, 22 @@ -243,95 +318,29 @@ 仅开启Http代理,并清除系统代理 - - 316, 22 - - - 仅开启Http代理,不改变系统代理 - 316, 22 仅开启PAC,并清除系统代理 + + 316, 22 + + + 仅开启Http代理,不改变系统代理 + 316, 22 仅开启PAC,不改变系统代理 - - 300, 22 - - - 下移至底 (B) - - - 300, 22 - - - 下移 (D) - - - 300, 22 - - - 上移至顶 (T) - - - 300, 22 - - - 上移 (U) - - - 316, 22 - - - 关闭Http代理 - - - 300, 22 - - - 测试服务器延迟Ping(多选) (Ctrl+P) - - - 300, 22 - - - 测试服务器真连接延迟(多选) (Ctrl+R) - - - 300, 22 - - - 移除重复的服务器 - - - 300, 22 - - - 移除所选服务器(多选) (Delete) - - - 300, 22 - - - 扫描屏幕上的二维码 (Ctrl+S) - - + 195, 22 - - 扫描屏幕上的二维码 - - - 300, 22 - - - 全选 (Ctrl+A) + + Http代理 195, 22 @@ -339,32 +348,23 @@ 服务器 - - 300, 22 - - - 设为活动服务器 (Enter) - - - 300, 22 - - - 测试服务器速度(多选) (Ctrl+T) - - + 195, 22 - - Http代理 + + 从剪贴板导入批量URL - - 300, 22 + + 195, 22 - - 测试服务器延迟Tcping(多选) (Ctrl+O) + + 扫描屏幕上的二维码 - - 测试当前服务节点状态 + + 195, 22 + + + 复制本地PAC网址 195, 22 @@ -372,90 +372,44 @@ 更新订阅 - - 路由模式 + + 192, 6 - - Core 路由模式(预定义规则) + + 195, 22 - - 延迟: + + 退出 - - 当前 HTTP 代理的访问延迟。 + + 196, 164 + + + 服务器列表 网速显示未启用 - - 297, 6 + + 信息 - - 220, 6 + + 124, 22 - - 192, 6 + + 订阅设置 - - 297, 6 + + 124, 22 - - 297, 6 + + 更新订阅 - - 297, 6 + + 61, 53 - - v2rayN 项目 - - - 223, 22 - - - 将PAC改为直连Core,按路由规则处理 - - - 85, 53 - - - 检查更新 - - - 223, 22 - - - v2rayCore - - - 223, 22 - - - v2rayN - - - 223, 22 - - - PAC - - - - iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA - 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC - - - - 76, 53 - - - 关闭窗口 - - - 69, 53 - - - 帮助 + + 订阅 76, 53 @@ -463,26 +417,17 @@ 参数设置 - - 68, 53 - - - 推广 - - - 分享 - 148, 22 重启服务 - - 73, 53 + + 148, 22 - - 服务器 + + 测试当前服务状态 @@ -501,31 +446,71 @@ 当前服务 - - 61, 53 + + 223, 22 - - 订阅 + + v2rayN - - 124, 22 + + 223, 22 - - 订阅设置 + + v2rayCore - - 124, 22 + + 223, 22 - - 更新订阅 + + PAC - - 148, 22 + + 220, 6 - - 测试当前服务状态 + + 223, 22 + + + 简化PAC (请设置Core路由) + + + 85, 53 + + + 检查更新 + + + v2rayN 项目 V2Ray 官网 + + 69, 53 + + + 帮助 + + + 68, 53 + + + 推广 + + + + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA + 8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC + + + + 76, 53 + + + 关闭窗口 + + + 分享 + \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs index eca9c7d4..7c009fc6 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs @@ -31,7 +31,7 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm)); this.btnClose = new System.Windows.Forms.Button(); this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabBasic = new System.Windows.Forms.TabPage(); + this.tabPage1 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.label16 = new System.Windows.Forms.Label(); this.cmblistenerType = new System.Windows.Forms.ComboBox(); @@ -53,7 +53,7 @@ this.label5 = new System.Windows.Forms.Label(); this.txtlocalPort = new System.Windows.Forms.TextBox(); this.label2 = new System.Windows.Forms.Label(); - this.tabRouting = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.tabControl2 = new System.Windows.Forms.TabControl(); this.tabPage3 = new System.Windows.Forms.TabPage(); @@ -62,14 +62,14 @@ this.txtUserdirect = new System.Windows.Forms.TextBox(); this.tabPage5 = new System.Windows.Forms.TabPage(); this.txtUserblock = new System.Windows.Forms.TextBox(); - this.tabPreDefinedRules = new System.Windows.Forms.TabPage(); + this.tabPage8 = new System.Windows.Forms.TabPage(); this.cmbroutingMode = new System.Windows.Forms.ComboBox(); this.panel3 = new System.Windows.Forms.Panel(); this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel(); this.btnSetDefRountingRule = new System.Windows.Forms.Button(); this.labRoutingTips = new System.Windows.Forms.Label(); this.cmbdomainStrategy = new System.Windows.Forms.ComboBox(); - this.tabKCP = new System.Windows.Forms.TabPage(); + this.tabPage6 = new System.Windows.Forms.TabPage(); this.chkKcpcongestion = new System.Windows.Forms.CheckBox(); this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox(); this.label10 = new System.Windows.Forms.Label(); @@ -83,7 +83,7 @@ this.label7 = new System.Windows.Forms.Label(); this.txtKcpmtu = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); - this.tabGUI = new System.Windows.Forms.TabPage(); + this.tabPage7 = new System.Windows.Forms.TabPage(); this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox(); this.cbFreshrate = new System.Windows.Forms.ComboBox(); this.lbFreshrate = new System.Windows.Forms.Label(); @@ -92,28 +92,27 @@ this.txturlGFWList = new System.Windows.Forms.TextBox(); this.label13 = new System.Windows.Forms.Label(); this.chkAutoRun = new System.Windows.Forms.CheckBox(); - this.tabUserPAC = new System.Windows.Forms.TabPage(); + this.tabPage9 = new System.Windows.Forms.TabPage(); this.txtuserPacRule = new System.Windows.Forms.TextBox(); this.panel4 = new System.Windows.Forms.Panel(); this.label4 = new System.Windows.Forms.Label(); this.panel2 = new System.Windows.Forms.Panel(); this.btnOK = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); - this.chkInterlaceColoring = new System.Windows.Forms.CheckBox(); this.tabControl1.SuspendLayout(); - this.tabBasic.SuspendLayout(); + this.tabPage1.SuspendLayout(); this.groupBox1.SuspendLayout(); - this.tabRouting.SuspendLayout(); + this.tabPage2.SuspendLayout(); this.groupBox2.SuspendLayout(); this.tabControl2.SuspendLayout(); this.tabPage3.SuspendLayout(); this.tabPage4.SuspendLayout(); this.tabPage5.SuspendLayout(); - this.tabPreDefinedRules.SuspendLayout(); + this.tabPage8.SuspendLayout(); this.panel3.SuspendLayout(); - this.tabKCP.SuspendLayout(); - this.tabGUI.SuspendLayout(); - this.tabUserPAC.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.tabPage7.SuspendLayout(); + this.tabPage9.SuspendLayout(); this.panel4.SuspendLayout(); this.panel2.SuspendLayout(); this.SuspendLayout(); @@ -128,21 +127,21 @@ // // tabControl1 // - this.tabControl1.Controls.Add(this.tabBasic); - this.tabControl1.Controls.Add(this.tabRouting); - this.tabControl1.Controls.Add(this.tabKCP); - this.tabControl1.Controls.Add(this.tabGUI); - this.tabControl1.Controls.Add(this.tabUserPAC); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Controls.Add(this.tabPage6); + this.tabControl1.Controls.Add(this.tabPage7); + this.tabControl1.Controls.Add(this.tabPage9); resources.ApplyResources(this.tabControl1, "tabControl1"); this.tabControl1.Name = "tabControl1"; this.tabControl1.SelectedIndex = 0; // - // tabBasic + // tabPage1 // - this.tabBasic.Controls.Add(this.groupBox1); - resources.ApplyResources(this.tabBasic, "tabBasic"); - this.tabBasic.Name = "tabBasic"; - this.tabBasic.UseVisualStyleBackColor = true; + this.tabPage1.Controls.Add(this.groupBox1); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; // // groupBox1 // @@ -306,12 +305,12 @@ resources.ApplyResources(this.label2, "label2"); this.label2.Name = "label2"; // - // tabRouting + // tabPage2 // - this.tabRouting.Controls.Add(this.groupBox2); - resources.ApplyResources(this.tabRouting, "tabRouting"); - this.tabRouting.Name = "tabRouting"; - this.tabRouting.UseVisualStyleBackColor = true; + this.tabPage2.Controls.Add(this.groupBox2); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; // // groupBox2 // @@ -326,7 +325,7 @@ this.tabControl2.Controls.Add(this.tabPage3); this.tabControl2.Controls.Add(this.tabPage4); this.tabControl2.Controls.Add(this.tabPage5); - this.tabControl2.Controls.Add(this.tabPreDefinedRules); + this.tabControl2.Controls.Add(this.tabPage8); resources.ApplyResources(this.tabControl2, "tabControl2"); this.tabControl2.Name = "tabControl2"; this.tabControl2.SelectedIndex = 0; @@ -367,12 +366,12 @@ resources.ApplyResources(this.txtUserblock, "txtUserblock"); this.txtUserblock.Name = "txtUserblock"; // - // tabPreDefinedRules + // tabPage8 // - this.tabPreDefinedRules.Controls.Add(this.cmbroutingMode); - resources.ApplyResources(this.tabPreDefinedRules, "tabPreDefinedRules"); - this.tabPreDefinedRules.Name = "tabPreDefinedRules"; - this.tabPreDefinedRules.UseVisualStyleBackColor = true; + this.tabPage8.Controls.Add(this.cmbroutingMode); + resources.ApplyResources(this.tabPage8, "tabPage8"); + this.tabPage8.Name = "tabPage8"; + this.tabPage8.UseVisualStyleBackColor = true; // // cmbroutingMode // @@ -426,24 +425,24 @@ resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy"); this.cmbdomainStrategy.Name = "cmbdomainStrategy"; // - // tabKCP + // tabPage6 // - this.tabKCP.Controls.Add(this.chkKcpcongestion); - this.tabKCP.Controls.Add(this.txtKcpwriteBufferSize); - this.tabKCP.Controls.Add(this.label10); - this.tabKCP.Controls.Add(this.txtKcpreadBufferSize); - this.tabKCP.Controls.Add(this.label11); - this.tabKCP.Controls.Add(this.txtKcpdownlinkCapacity); - this.tabKCP.Controls.Add(this.label8); - this.tabKCP.Controls.Add(this.txtKcpuplinkCapacity); - this.tabKCP.Controls.Add(this.label9); - this.tabKCP.Controls.Add(this.txtKcptti); - this.tabKCP.Controls.Add(this.label7); - this.tabKCP.Controls.Add(this.txtKcpmtu); - this.tabKCP.Controls.Add(this.label6); - resources.ApplyResources(this.tabKCP, "tabKCP"); - this.tabKCP.Name = "tabKCP"; - this.tabKCP.UseVisualStyleBackColor = true; + this.tabPage6.Controls.Add(this.chkKcpcongestion); + this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize); + this.tabPage6.Controls.Add(this.label10); + this.tabPage6.Controls.Add(this.txtKcpreadBufferSize); + this.tabPage6.Controls.Add(this.label11); + this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity); + this.tabPage6.Controls.Add(this.label8); + this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity); + this.tabPage6.Controls.Add(this.label9); + this.tabPage6.Controls.Add(this.txtKcptti); + this.tabPage6.Controls.Add(this.label7); + this.tabPage6.Controls.Add(this.txtKcpmtu); + this.tabPage6.Controls.Add(this.label6); + resources.ApplyResources(this.tabPage6, "tabPage6"); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.UseVisualStyleBackColor = true; // // chkKcpcongestion // @@ -511,20 +510,19 @@ resources.ApplyResources(this.label6, "label6"); this.label6.Name = "label6"; // - // tabGUI + // tabPage7 // - this.tabGUI.Controls.Add(this.chkInterlaceColoring); - this.tabGUI.Controls.Add(this.chkKeepOlderDedupl); - this.tabGUI.Controls.Add(this.cbFreshrate); - this.tabGUI.Controls.Add(this.lbFreshrate); - this.tabGUI.Controls.Add(this.chkEnableStatistics); - this.tabGUI.Controls.Add(this.chkAllowLANConn); - this.tabGUI.Controls.Add(this.txturlGFWList); - this.tabGUI.Controls.Add(this.label13); - this.tabGUI.Controls.Add(this.chkAutoRun); - resources.ApplyResources(this.tabGUI, "tabGUI"); - this.tabGUI.Name = "tabGUI"; - this.tabGUI.UseVisualStyleBackColor = true; + this.tabPage7.Controls.Add(this.chkKeepOlderDedupl); + this.tabPage7.Controls.Add(this.cbFreshrate); + this.tabPage7.Controls.Add(this.lbFreshrate); + this.tabPage7.Controls.Add(this.chkEnableStatistics); + this.tabPage7.Controls.Add(this.chkAllowLANConn); + this.tabPage7.Controls.Add(this.txturlGFWList); + this.tabPage7.Controls.Add(this.label13); + this.tabPage7.Controls.Add(this.chkAutoRun); + resources.ApplyResources(this.tabPage7, "tabPage7"); + this.tabPage7.Name = "tabPage7"; + this.tabPage7.UseVisualStyleBackColor = true; // // chkKeepOlderDedupl // @@ -572,13 +570,13 @@ this.chkAutoRun.Name = "chkAutoRun"; this.chkAutoRun.UseVisualStyleBackColor = true; // - // tabUserPAC + // tabPage9 // - this.tabUserPAC.Controls.Add(this.txtuserPacRule); - this.tabUserPAC.Controls.Add(this.panel4); - resources.ApplyResources(this.tabUserPAC, "tabUserPAC"); - this.tabUserPAC.Name = "tabUserPAC"; - this.tabUserPAC.UseVisualStyleBackColor = true; + this.tabPage9.Controls.Add(this.txtuserPacRule); + this.tabPage9.Controls.Add(this.panel4); + resources.ApplyResources(this.tabPage9, "tabPage9"); + this.tabPage9.Name = "tabPage9"; + this.tabPage9.UseVisualStyleBackColor = true; // // txtuserPacRule // @@ -616,12 +614,6 @@ resources.ApplyResources(this.panel1, "panel1"); this.panel1.Name = "panel1"; // - // chkInterlaceColoring - // - resources.ApplyResources(this.chkInterlaceColoring, "chkInterlaceColoring"); - this.chkInterlaceColoring.Name = "chkInterlaceColoring"; - this.chkInterlaceColoring.UseVisualStyleBackColor = true; - // // OptionSettingForm // resources.ApplyResources(this, "$this"); @@ -634,10 +626,10 @@ this.Name = "OptionSettingForm"; this.Load += new System.EventHandler(this.OptionSettingForm_Load); this.tabControl1.ResumeLayout(false); - this.tabBasic.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); - this.tabRouting.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); this.groupBox2.ResumeLayout(false); this.tabControl2.ResumeLayout(false); this.tabPage3.ResumeLayout(false); @@ -646,15 +638,15 @@ this.tabPage4.PerformLayout(); this.tabPage5.ResumeLayout(false); this.tabPage5.PerformLayout(); - this.tabPreDefinedRules.ResumeLayout(false); + this.tabPage8.ResumeLayout(false); this.panel3.ResumeLayout(false); this.panel3.PerformLayout(); - this.tabKCP.ResumeLayout(false); - this.tabKCP.PerformLayout(); - this.tabGUI.ResumeLayout(false); - this.tabGUI.PerformLayout(); - this.tabUserPAC.ResumeLayout(false); - this.tabUserPAC.PerformLayout(); + this.tabPage6.ResumeLayout(false); + this.tabPage6.PerformLayout(); + this.tabPage7.ResumeLayout(false); + this.tabPage7.PerformLayout(); + this.tabPage9.ResumeLayout(false); + this.tabPage9.PerformLayout(); this.panel4.ResumeLayout(false); this.panel2.ResumeLayout(false); this.ResumeLayout(false); @@ -674,8 +666,8 @@ private System.Windows.Forms.CheckBox chkudpEnabled; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabBasic; - private System.Windows.Forms.TabPage tabRouting; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.GroupBox groupBox2; private System.Windows.Forms.ComboBox cmbprotocol; @@ -694,7 +686,7 @@ private System.Windows.Forms.TabPage tabPage5; private System.Windows.Forms.TextBox txtUserdirect; private System.Windows.Forms.TextBox txtUserblock; - private System.Windows.Forms.TabPage tabKCP; + private System.Windows.Forms.TabPage tabPage6; private System.Windows.Forms.TextBox txtKcpmtu; private System.Windows.Forms.Label label6; private System.Windows.Forms.TextBox txtKcptti; @@ -708,7 +700,7 @@ private System.Windows.Forms.TextBox txtKcpuplinkCapacity; private System.Windows.Forms.Label label9; private System.Windows.Forms.CheckBox chkKcpcongestion; - private System.Windows.Forms.TabPage tabGUI; + private System.Windows.Forms.TabPage tabPage7; private System.Windows.Forms.CheckBox chkAutoRun; private System.Windows.Forms.Label label13; private System.Windows.Forms.TextBox txturlGFWList; @@ -726,13 +718,12 @@ private System.Windows.Forms.Label lbFreshrate; private System.Windows.Forms.Label label16; private System.Windows.Forms.ComboBox cmblistenerType; - private System.Windows.Forms.TabPage tabPreDefinedRules; - private System.Windows.Forms.TabPage tabUserPAC; + private System.Windows.Forms.TabPage tabPage8; + private System.Windows.Forms.TabPage tabPage9; private System.Windows.Forms.TextBox txtuserPacRule; private System.Windows.Forms.Panel panel4; private System.Windows.Forms.Label label4; private System.Windows.Forms.CheckBox chkKeepOlderDedupl; private System.Windows.Forms.LinkLabel linkLabelRoutingDoc; - private System.Windows.Forms.CheckBox chkInterlaceColoring; } } \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.cs b/v2rayN/v2rayN/Forms/OptionSettingForm.cs index 6ef6a395..6fa88f50 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.cs +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.cs @@ -9,10 +9,8 @@ namespace v2rayN.Forms { public partial class OptionSettingForm : BaseForm { - private string _tabOpened; - public OptionSettingForm(string tabOpened = "") + public OptionSettingForm() { - _tabOpened = tabOpened; InitializeComponent(); } @@ -27,18 +25,6 @@ namespace v2rayN.Forms InitGUI(); InitUserPAC(); - - var tab = tabControl1.TabPages[_tabOpened]; - var tab2 = tabControl2.TabPages[_tabOpened]; - if (tab != null) - { - tabControl1.SelectedTab = tab; - } - if (tab2 != null) - { - tabControl1.SelectedTab = tabRouting; - tabControl2.SelectedTab = tab2; - } } /// @@ -92,7 +78,8 @@ namespace v2rayN.Forms { //路由 cmbdomainStrategy.Text = config.domainStrategy; - cmbroutingMode.SelectedIndex = config.routingMode; + int.TryParse(config.routingMode, out int routingMode); + cmbroutingMode.SelectedIndex = routingMode; txtUseragent.Text = Utils.List2String(config.useragent, true); txtUserdirect.Text = Utils.List2String(config.userdirect, true); @@ -127,7 +114,9 @@ namespace v2rayN.Forms chkAllowLANConn.Checked = config.allowLANConn; chkEnableStatistics.Checked = config.enableStatistics; chkKeepOlderDedupl.Checked = config.keepOlderDedupl; - chkInterlaceColoring.Checked = config.interlaceColoring; + + + ComboItem[] cbSource = new ComboItem[] { @@ -187,7 +176,7 @@ namespace v2rayN.Forms return; } - if (ConfigHandler.SaveConfigToFile(ref config) == 0) + if (ConfigHandler.SaveConfig(ref config) == 0) { this.DialogResult = DialogResult.OK; } @@ -287,7 +276,7 @@ namespace v2rayN.Forms { //路由 string domainStrategy = cmbdomainStrategy.Text; - int routingMode = cmbroutingMode.SelectedIndex; + string routingMode = cmbroutingMode.SelectedIndex.ToString(); string useragent = txtUseragent.Text.TrimEx(); string userdirect = txtUserdirect.Text.TrimEx(); @@ -356,7 +345,6 @@ namespace v2rayN.Forms config.enableStatistics = chkEnableStatistics.Checked; config.statisticsFreshRate = (int)cbFreshrate.SelectedValue; config.keepOlderDedupl = chkKeepOlderDedupl.Checked; - config.interlaceColoring = chkInterlaceColoring.Checked; //if(lastEnableStatistics != config.enableStatistics) //{ @@ -373,7 +361,7 @@ namespace v2rayN.Forms private int SaveUserPAC() { string userPacRule = txtuserPacRule.Text.TrimEx(); - userPacRule = userPacRule.Replace("\"", "").Replace("'", ""); + userPacRule = userPacRule.Replace("\"", ""); config.userPacRule = Utils.String2List(userPacRule); @@ -458,7 +446,13 @@ namespace v2rayN.Forms class ComboItem { - public int ID { get; set; } - public string Text { get; set; } + public int ID + { + get; set; + } + public string Text + { + get; set; + } } } diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.resx index 7e082631..7f8ef414 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.resx @@ -120,36 +120,24 @@ - - True - 6, 12 662, 675 + + True + 4, 4, 4, 4 - - OptionSettingForm - Settings - - v2rayN.Forms.BaseForm, v2rayN, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - 355, 16 - - btnClose - - - panel2 - 75, 23 @@ -159,21 +147,9 @@ &Cancel - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - 267, 16 - - btnOK - - - panel2 - 75, 23 @@ -183,12 +159,6 @@ &OK - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - Top, Right @@ -198,12 +168,6 @@ 322, 10 - - btnSetDefRountingRule - - - panel3 - 229, 23 @@ -213,45 +177,21 @@ Set default custom routing rules - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - 161, 84 - - cbFreshrate - - - tabGUI - 58, 20 32 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - True 15, 63 - - chkAllowIn2 - - - groupBox1 - 120, 16 @@ -261,27 +201,15 @@ listening port 2 - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 7 - True 15, 38 - - chkAllowLANConn - - - tabGUI - 204, 16 @@ -291,24 +219,12 @@ Allow connections from the LAN - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - True 15, 16 - - chkAutoRun - - - tabGUI - 246, 16 @@ -318,12 +234,6 @@ Automatically start at system startup - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 8 - True @@ -333,12 +243,6 @@ 15, 62 - - chkEnableStatistics - - - tabGUI - 576, 16 @@ -348,54 +252,12 @@ Enable Statistics (Realtime netspeed and traffic records. Require restart the v2rayN client) - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - True - - - NoControl - - - 15, 132 - - - chkInterlaceColoring - - - tabGUI - - - 132, 16 - - - 34 - - - Interlace coloring - - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - True 20, 143 - - chkKcpcongestion - - - tabKCP - 84, 16 @@ -405,12 +267,6 @@ congestion - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - True @@ -420,12 +276,6 @@ 15, 110 - - chkKeepOlderDedupl - - - tabGUI - 198, 16 @@ -435,24 +285,12 @@ Keep older when deduplication - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - True 15, 160 - - chklogEnabled - - - groupBox1 - 126, 16 @@ -462,24 +300,12 @@ Record local logs - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 15 - True 15, 129 - - chkmuxEnabled - - - groupBox1 - 174, 16 @@ -489,12 +315,6 @@ Turn on Mux Multiplexing - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - True @@ -504,12 +324,6 @@ 468, 27 - - chksniffingEnabled - - - groupBox1 - 120, 16 @@ -519,12 +333,6 @@ Turn on Sniffing - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - True @@ -534,12 +342,6 @@ 468, 60 - - chksniffingEnabled2 - - - groupBox1 - 120, 16 @@ -549,27 +351,15 @@ Turn on Sniffing - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 2 - True 369, 27 - - chkudpEnabled - - - groupBox1 - 84, 16 @@ -579,24 +369,12 @@ Enable UDP - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - True 369, 62 - - chkudpEnabled2 - - - groupBox1 - 84, 16 @@ -606,15 +384,9 @@ Enable UDP - - System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 8 - AsIs @@ -627,24 +399,12 @@ 115, 10 - - cmbdomainStrategy - - - panel3 - 165, 20 16 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - Not Enabled Http Proxy @@ -669,24 +429,12 @@ 124, 94 - - cmblistenerType - - - groupBox1 - 464, 20 33 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - debug @@ -705,24 +453,12 @@ 257, 158 - - cmbloglevel - - - groupBox1 - 97, 20 6 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 16 - False @@ -735,24 +471,12 @@ 257, 25 - - cmbprotocol - - - groupBox1 - 97, 20 12 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 12 - socks @@ -762,27 +486,15 @@ 257, 60 - - cmbprotocol2 - - - groupBox1 - 97, 20 17 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 9 - Global @@ -798,84 +510,42 @@ 21, 17 - - cmbroutingMode - - - tabPreDefinedRules - 255, 20 14 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill 3, 3 - - groupBox1 - - - tabBasic - 648, 573 6 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill 3, 3 - - groupBox2 - - - tabRouting - 648, 573 12 - - System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - True 206, 29 - - label1 - - - groupBox1 - 53, 12 @@ -885,24 +555,12 @@ protocol - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 13 - True 236, 104 - - label10 - - - tabKCP - 95, 12 @@ -912,24 +570,12 @@ writeBufferSize - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - True 18, 104 - - label11 - - - tabKCP - 89, 12 @@ -939,24 +585,12 @@ readBufferSize - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - True 30, 176 - - label13 - - - tabGUI - 431, 12 @@ -964,13 +598,7 @@ 27 - Custom GFWList address (use default value if leave blank) - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 7 + Custom GFWList address (please fill in the blank without customization) True @@ -978,12 +606,6 @@ 33, 204 - - label14 - - - groupBox1 - 281, 12 @@ -993,12 +615,6 @@ Custom DNS (multiple, separated by commas (,)) - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - True @@ -1008,12 +624,6 @@ 42, 98 - - label16 - - - groupBox1 - 65, 12 @@ -1023,24 +633,12 @@ Http proxy - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - True 33, 29 - - label2 - - - groupBox1 - 89, 12 @@ -1050,24 +648,12 @@ Listening port - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 19 - True 206, 64 - - label3 - - - groupBox1 - 53, 12 @@ -1077,27 +663,15 @@ protocol - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 10 - NoControl 5, 11 - - label4 - - - panel4 - 598, 16 @@ -1107,24 +681,12 @@ *Set user pac rules, separated by commas (,) - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - True 193, 162 - - label5 - - - groupBox1 - 59, 12 @@ -1134,24 +696,12 @@ Log level - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17 - True 18, 28 - - label6 - - - tabKCP - 23, 12 @@ -1161,24 +711,12 @@ mtu - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 12 - True 236, 28 - - label7 - - - tabKCP - 23, 12 @@ -1188,24 +726,12 @@ tti - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10 - True 236, 66 - - label8 - - - tabKCP - 101, 12 @@ -1215,24 +741,12 @@ downlinkCapacity - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - True 18, 66 - - label9 - - - tabKCP - 89, 12 @@ -1242,21 +756,9 @@ uplinkCapacity - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 8 - 5, 45 - - labRoutingTips - - - panel3 - 598, 16 @@ -1266,12 +768,6 @@ *Set the rules, separated by commas (,); support Domain (pure string / regular / subdomain) and IP - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - True @@ -1281,12 +777,6 @@ 30, 87 - - lbFreshrate - - - tabGUI - 125, 12 @@ -1296,12 +786,6 @@ Statistics freshrate - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - True @@ -1311,12 +795,6 @@ 0, 0, 0, 0 - - linkLabelRoutingDoc - - - panel3 - 95, 12 @@ -1326,249 +804,114 @@ Domain strategy - - System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Top 0, 0 - - panel1 - - - $this - 662, 10 9 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - Bottom 0, 615 - - panel2 - - - $this - 662, 60 11 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - Top 3, 17 - - panel3 - - - groupBox2 - 642, 67 19 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - Top 3, 3 - - panel4 - - - tabUserPAC - 648, 37 20 - - System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 4, 22 - - - tabBasic - - - 3, 3, 3, 3 - - - tabControl1 - - - 654, 579 - - - 0 - - - Core: basic settings - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill 0, 10 - - tabControl1 - - - $this - 662, 605 10 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill 3, 84 - - tabControl2 - - - groupBox2 - 642, 486 12 - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 22 - + + 3, 3, 3, 3 + + + 654, 579 + + 0 - + + Core: basic settings + + 4, 22 - - tabGUI - - + 3, 3, 3, 3 - - tabControl1 - - + 654, 579 - - 3 + + 1 - - v2rayN settings - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - - 4, 22 - - - tabKCP - - - 3, 3, 3, 3 - - - tabControl1 - - - 654, 579 - - - 2 - - - Core: KCP settings - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 + + Core: Routing settings 4, 22 - - tabPage3 - 3, 3, 3, 3 - - tabControl2 - 634, 460 @@ -1578,24 +921,12 @@ 1.Proxy Domain or IP - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - 4, 22 - - tabPage4 - 3, 3, 3, 3 - - tabControl2 - 634, 460 @@ -1605,24 +936,12 @@ 2.Direct Domain or IP - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - 4, 22 - - tabPage5 - 3, 3, 3, 3 - - tabControl2 - 634, 460 @@ -1632,309 +951,165 @@ 3.Block Domain or IP - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 4, 22 - + + 3, 3, 3, 3 + + + 654, 579 + + 2 - + + Core: KCP settings + + 4, 22 - - tabPreDefinedRules - - + 3, 3, 3, 3 - - tabControl2 + + 654, 579 - + + 3 + + + v2rayN settings + + + 4, 22 + + + 3, 3, 3, 3 + + 634, 460 - + 3 - + 4.Pre-defined rules - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - - + 4, 22 - - tabRouting - - + 3, 3, 3, 3 - - tabControl1 - - + 654, 579 - - 1 - - - Core: Routing settings - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - - - 4, 22 - - - tabUserPAC - - - 3, 3, 3, 3 - - - tabControl1 - - - 654, 579 - - + 4 - + User PAC settings - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - 345, 62 - - txtKcpdownlinkCapacity - - - tabKCP - 94, 21 11 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - 111, 24 - - txtKcpmtu - - - tabKCP - 94, 21 5 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 11 - 111, 100 - - txtKcpreadBufferSize - - - tabKCP - 94, 21 13 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 3 - 345, 24 - - txtKcptti - - - tabKCP - 94, 21 7 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 9 - 111, 62 - - txtKcpuplinkCapacity - - - tabKCP - 94, 21 9 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 7 - 345, 100 - - txtKcpwriteBufferSize - - - tabKCP - 94, 21 15 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 - 124, 25 - - txtlocalPort - - - groupBox1 - 78, 21 3 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 18 - 124, 60 - - txtlocalPort2 - - - groupBox1 - 78, 21 14 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - False - - 11 - 33, 228 True - - txtremoteDNS - - - groupBox1 - 555, 100 30 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - 32, 200 + 32, 205 - - txturlGFWList - - - tabGUI + + True - 541, 21 + 541, 100 28 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 6 - Fill @@ -1947,12 +1122,6 @@ True - - txtUseragent - - - tabPage3 - Vertical @@ -1962,12 +1131,6 @@ 0 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill @@ -1980,12 +1143,6 @@ True - - txtUserblock - - - tabPage5 - Vertical @@ -1995,12 +1152,6 @@ 1 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill @@ -2013,12 +1164,6 @@ True - - txtUserdirect - - - tabPage4 - Vertical @@ -2028,12 +1173,6 @@ 1 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - Fill @@ -2046,12 +1185,6 @@ True - - txtuserPacRule - - - tabUserPAC - Vertical @@ -2061,10 +1194,4 @@ 21 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx index b7968de4..1509bce5 100644 --- a/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx +++ b/v2rayN/v2rayN/Forms/OptionSettingForm.zh-Hans.resx @@ -164,9 +164,6 @@ 启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端) - - 隔行着色 - 去重时保留序号较小的项 @@ -252,7 +249,7 @@ 227, 12 - 自定义GFWList地址(留空则使用默认值) + 自定义GFWList地址(不需自定义请填空白) 191, 12 @@ -282,7 +279,7 @@ 协议 - *用户PAC内的自定条目。用逗号(,)或换行隔开的匹配模式(pattern)。英文单引号、双引号将被忽略。 + *设置用户PAC规则,用逗号(,)隔开 53, 12 @@ -315,20 +312,17 @@ 642, 72 - - Core:基础设置 - 3, 89 642, 481 - - v2rayN设置 + + Core:基础设置 - - Core:KCP设置 + + Core:路由设置 634, 455 @@ -348,16 +342,19 @@ 3.阻止的Domain或IP + + Core:KCP设置 + + + v2rayN设置 + 634, 455 - + 4.预定义规则 - - Core:路由设置 - - + 用户PAC设置 diff --git a/v2rayN/v2rayN/Forms/QRCodeControl.resx b/v2rayN/v2rayN/Forms/QRCodeControl.resx index 2f13a849..a6ceff05 100644 --- a/v2rayN/v2rayN/Forms/QRCodeControl.resx +++ b/v2rayN/v2rayN/Forms/QRCodeControl.resx @@ -118,22 +118,34 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bottom + + + 0, 371 + - + True - - - 6, 12 - - QRCodeControl + + 356, 70 - - 356, 441 + + 0 - - System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + txtUrl + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 Fill @@ -141,12 +153,6 @@ 0, 0 - - picQRCode - - - $this - 356, 371 @@ -156,37 +162,31 @@ 24 + + picQRCode + System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + 0 - - Bottom - - - 0, 371 - - + True + + + 6, 12 - - txtUrl + + 356, 441 - - $this + + QRCodeControl - - 356, 70 - - - 0 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 1 + + System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 \ No newline at end of file diff --git a/v2rayN/v2rayN/Forms/SubSettingForm.cs b/v2rayN/v2rayN/Forms/SubSettingForm.cs index f56b279e..c8e7725b 100644 --- a/v2rayN/v2rayN/Forms/SubSettingForm.cs +++ b/v2rayN/v2rayN/Forms/SubSettingForm.cs @@ -8,6 +8,8 @@ namespace v2rayN.Forms { public partial class SubSettingForm : BaseForm { + List lstControls = new List(); + public SubSettingForm() { InitializeComponent(); @@ -28,8 +30,8 @@ namespace v2rayN.Forms /// private void RefreshSubsView() { - panCon.SuspendLayout(); panCon.Controls.Clear(); + lstControls.Clear(); for (int k = config.subItem.Count - 1; k >= 0; k--) { @@ -54,8 +56,9 @@ namespace v2rayN.Forms panCon.Controls.Add(control); panCon.Controls.SetChildIndex(control, 0); + + lstControls.Add(control); } - panCon.ResumeLayout(); } private void Control_OnButtonClicked(object sender, EventArgs e) diff --git a/v2rayN/v2rayN/Global.cs b/v2rayN/v2rayN/Global.cs index 4fbd61e4..58ed9d5a 100644 --- a/v2rayN/v2rayN/Global.cs +++ b/v2rayN/v2rayN/Global.cs @@ -156,15 +156,6 @@ namespace v2rayN /// public const string CustomIconName = "v2rayN.ico"; - /// - /// 表格列的排序方式 - /// - public enum sortMode - { - Numeric, - // More, like natural numbers, string length, visual length, etc. - } - public enum StatisticsFreshRate { quick = 1000, @@ -180,37 +171,61 @@ namespace v2rayN #region 全局变量 /// - /// 是否需要重启服务V2ray。如果为假,LoadV2ray()不做任何事。 + /// 是否需要重启服务V2ray /// - public static bool reloadV2ray { get; set; } + public static bool reloadV2ray + { + get; set; + } /// /// 是否开启全局代理(http) /// - public static bool sysAgent { get; set; } + public static bool sysAgent + { + get; set; + } /// /// socks端口 /// - public static int socksPort { get; set; } + public static int socksPort + { + get; set; + } /// /// http端口 /// - public static int httpPort { get; set; } + public static int httpPort + { + get; set; + } /// /// PAC端口 /// - public static int pacPort { get; set; } + public static int pacPort + { + get; set; + } /// /// /// - public static int statePort { get; set; } + public static int statePort + { + get; set; + } - public static Job processJob { get; set; } - public static System.Threading.Mutex mutexObj { get; set; } + public static Job processJob + { + get; set; + } + public static System.Threading.Mutex mutexObj + { + get; set; + } #endregion diff --git a/v2rayN/v2rayN/Handler/ConfigHandler.cs b/v2rayN/v2rayN/Handler/ConfigHandler.cs index 51301432..c6748e56 100644 --- a/v2rayN/v2rayN/Handler/ConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/ConfigHandler.cs @@ -85,6 +85,10 @@ namespace v2rayN.Handler { config.domainStrategy = "IPIfNonMatch"; } + if (Utils.IsNullOrEmpty(config.routingMode)) + { + config.routingMode = "0"; + } if (config.useragent == null) { config.useragent = new List(); @@ -133,6 +137,10 @@ namespace v2rayN.Handler { config.speedPingTestUrl = Global.SpeedPingTestUrl; } + if (Utils.IsNullOrEmpty(config.urlGFWList)) + { + config.urlGFWList = Global.GFWLIST_URL; + } //if (Utils.IsNullOrEmpty(config.remoteDNS)) //{ // config.remoteDNS = "1.1.1.1"; @@ -219,7 +227,7 @@ namespace v2rayN.Handler } } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -260,7 +268,7 @@ namespace v2rayN.Handler Global.reloadV2ray = true; } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -298,7 +306,7 @@ namespace v2rayN.Handler config.vmess.Insert(index + 1, vmessItem); // 插入到下一项 - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -324,22 +332,32 @@ namespace v2rayN.Handler config.index = index; Global.reloadV2ray = true; - SaveConfigToFile(config); + ToJsonFile(config); return 0; } /// - /// 保存设置文件 + /// 保参数 /// /// - public static int SaveConfigToFile(ref Config config) + /// + public static int SaveConfig(ref Config config, bool reload = true) { - return Utils.ToJsonFile(config, Utils.GetPath(configRes)); + Global.reloadV2ray = reload; + + ToJsonFile(config); + + return 0; } - public static int SaveConfigToFile(Config config) + + /// + /// 存储文件 + /// + /// + private static void ToJsonFile(Config config) { - return Utils.ToJsonFile(config, Utils.GetPath(configRes)); + Utils.ToJsonFile(config, Utils.GetPath(configRes)); } /// @@ -523,7 +541,7 @@ namespace v2rayN.Handler } Global.reloadV2ray = true; - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -562,7 +580,7 @@ namespace v2rayN.Handler Global.reloadV2ray = true; } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -583,7 +601,7 @@ namespace v2rayN.Handler Global.reloadV2ray = true; } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -624,7 +642,7 @@ namespace v2rayN.Handler } } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -663,7 +681,7 @@ namespace v2rayN.Handler } } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -844,7 +862,7 @@ namespace v2rayN.Handler } } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } @@ -868,7 +886,7 @@ namespace v2rayN.Handler } } - SaveConfigToFile(config); + ToJsonFile(config); return 0; } diff --git a/v2rayN/v2rayN/Handler/MainFormHandler.cs b/v2rayN/v2rayN/Handler/MainFormHandler.cs index d99fd3de..83865d92 100644 --- a/v2rayN/v2rayN/Handler/MainFormHandler.cs +++ b/v2rayN/v2rayN/Handler/MainFormHandler.cs @@ -97,11 +97,11 @@ namespace v2rayN.Handler configCopy.index = index; if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0) { - UI.ShowWarning(msg); + UI.Show(msg); } else { - UI.Show(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName)); } } @@ -137,11 +137,11 @@ namespace v2rayN.Handler configCopy.index = index; if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0) { - UI.ShowWarning(msg); + UI.Show(msg); } else { - UI.Show(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); + UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName)); } } diff --git a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs index f14296dc..303034b9 100644 --- a/v2rayN/v2rayN/Handler/SpeedtestHandler.cs +++ b/v2rayN/v2rayN/Handler/SpeedtestHandler.cs @@ -150,19 +150,24 @@ namespace v2rayN.Handler try { int httpPort = _config.GetLocalPort(Global.InboundHttp); - try + + Task t = Task.Run(() => { - WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); - int responseTime = -1; - string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); - bool noError = Utils.IsNullOrEmpty(status); - return noError ? responseTime : -1; - } - catch (Exception ex) - { - Utils.SaveLog(ex.Message, ex); - return -1; - } + try + { + WebProxy webProxy = new WebProxy(Global.Loopback, httpPort); + int responseTime = -1; + string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime); + bool noError = Utils.IsNullOrEmpty(status); + return noError ? responseTime : -1; + } + catch (Exception ex) + { + Utils.SaveLog(ex.Message, ex); + return -1; + } + }); + return t.Result; } catch (Exception ex) { diff --git a/v2rayN/v2rayN/Handler/StatisticsHandler.cs b/v2rayN/v2rayN/Handler/StatisticsHandler.cs index bed9298b..ab4d4a6a 100644 --- a/v2rayN/v2rayN/Handler/StatisticsHandler.cs +++ b/v2rayN/v2rayN/Handler/StatisticsHandler.cs @@ -20,9 +20,15 @@ namespace v2rayN.Handler Action> updateFunc_; - public bool Enable { get; set; } + public bool Enable + { + get; set; + } - public bool UpdateUI { get; set; } + public bool UpdateUI + { + get; set; + } public List Statistic { diff --git a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs index 1296112a..9ea93933 100644 --- a/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayConfigHandler.cs @@ -195,15 +195,15 @@ namespace v2rayN.Handler switch (config.routingMode) { - case 0: + case "0": break; - case 1: + case "1": routingGeo("ip", "private", Global.directTag, ref v2rayConfig); break; - case 2: + case "2": routingGeo("", "cn", Global.directTag, ref v2rayConfig); break; - case 3: + case "3": routingGeo("ip", "private", Global.directTag, ref v2rayConfig); routingGeo("", "cn", Global.directTag, ref v2rayConfig); break; diff --git a/v2rayN/v2rayN/Handler/V2rayHandler.cs b/v2rayN/v2rayN/Handler/V2rayHandler.cs index 6967eec5..e367bef2 100644 --- a/v2rayN/v2rayN/Handler/V2rayHandler.cs +++ b/v2rayN/v2rayN/Handler/V2rayHandler.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; -using System.Threading.Tasks; using v2rayN.Mode; namespace v2rayN.Handler @@ -39,18 +38,21 @@ namespace v2rayN.Handler /// /// 载入V2ray /// - public Task LoadV2ray(Config config) + public void LoadV2ray(Config config) { - return Task.Run(() => + if (Global.reloadV2ray) { - if (!Global.reloadV2ray) return; - string fileName = Utils.GetPath(v2rayConfigRes); - bool bOk = V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) == 0; - ShowMsg(bOk, msg); - if (bOk) + if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0) + { + ShowMsg(false, msg); + } + else + { + ShowMsg(true, msg); V2rayRestart(); - }); + } + } } /// @@ -303,7 +305,6 @@ namespace v2rayN.Handler { try { - if (p.HasExited) return; p.CloseMainWindow(); p.WaitForExit(100); if (!p.HasExited) diff --git a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs index 142eca51..0236c5a8 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/HttpProxyHandle.cs @@ -1,5 +1,4 @@ using System; -using System.Threading.Tasks; using v2rayN.Mode; namespace v2rayN.HttpProxyHandler @@ -149,36 +148,33 @@ namespace v2rayN.HttpProxyHandler /// /// /// - public static Task RestartHttpAgent(Config config, bool forced) + public static void RestartHttpAgent(Config config, bool forced) { - return Task.Run(() => - { - bool isRestart = false; - if (config.listenerType == ListenerType.noHttpProxy) - { - // 关闭http proxy时,直接返回 - return; - } - //强制重启或者socks端口变化 - if (forced) + bool isRestart = false; + if (config.listenerType == ListenerType.noHttpProxy) + { + // 关闭http proxy时,直接返回 + return; + } + //强制重启或者socks端口变化 + if (forced) + { + isRestart = true; + } + else + { + int localPort = config.GetLocalPort(Global.InboundSocks); + if (localPort != Global.socksPort) { isRestart = true; } - else - { - int localPort = config.GetLocalPort(Global.InboundSocks); - if (localPort != Global.socksPort) - { - isRestart = true; - } - } - if (isRestart) - { - CloseHttpAgent(config); - StartHttpAgent(config); - } - Update(config, false); - }); + } + if (isRestart) + { + CloseHttpAgent(config); + StartHttpAgent(config); + } + Update(config, false); } public static string GetPacUrl() diff --git a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs index 771eb8a0..f738a318 100644 --- a/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs +++ b/v2rayN/v2rayN/HttpProxyHandler/PrivoxyHandler.cs @@ -55,7 +55,10 @@ namespace v2rayN.HttpProxyHandler } } - public int RunningPort { get; set; } + public int RunningPort + { + get; set; + } public void Restart(int localPort, Config config) { @@ -138,7 +141,6 @@ namespace v2rayN.HttpProxyHandler { try { - if (p.HasExited) return; // someting, while the GUI app is exiting. p.CloseMainWindow(); p.WaitForExit(100); if (!p.HasExited) diff --git a/v2rayN/v2rayN/Mode/Config.cs b/v2rayN/v2rayN/Mode/Config.cs index 0003fe03..515114df 100644 --- a/v2rayN/v2rayN/Mode/Config.cs +++ b/v2rayN/v2rayN/Mode/Config.cs @@ -15,127 +15,197 @@ namespace v2rayN.Mode /// /// 本地监听 /// - public List inbound { get; set; } + public List inbound + { + get; set; + } /// /// 允许日志 /// - public bool logEnabled { get; set; } + public bool logEnabled + { + get; set; + } /// /// 日志等级 /// - public string loglevel { get; set; } + public string loglevel + { + get; set; + } /// /// 活动配置序号 /// - public int index { get; set; } + public int index + { + get; set; + } /// /// vmess服务器信息 /// - public List vmess { get; set; } + public List vmess + { + get; set; + } /// /// 允许Mux多路复用 /// - public bool muxEnabled { get; set; } + public bool muxEnabled + { + get; set; + } /// /// 域名解析策略 /// - public string domainStrategy { get; set; } + public string domainStrategy + { + get; set; + } /// /// 路由模式 /// - public int routingMode { get; set; } + public string routingMode + { + get; set; + } /// /// 用户自定义需代理的网址或ip /// - public List useragent { get; set; } + public List useragent + { + get; set; + } /// /// 用户自定义直连的网址或ip /// - public List userdirect { get; set; } + public List userdirect + { + get; set; + } /// /// 用户自定义阻止的网址或ip /// - public List userblock { get; set; } + public List userblock + { + get; set; + } /// /// KcpItem /// - public KcpItem kcpItem { get; set; } + public KcpItem kcpItem + { + get; set; + } /// /// 监听状态 /// - public ListenerType listenerType { get; set; } + public ListenerType listenerType + { + get; set; + } /// /// 自定义服务器下载测速url /// - public string speedTestUrl { get; set; } + public string speedTestUrl + { + get; set; + } /// /// 自定义“服务器真连接延迟”测试url /// - public string speedPingTestUrl { get; set; } + public string speedPingTestUrl + { + get; set; + } /// - /// 自定义GFWList url。空白则使用 Global.GFWLIST_URL + /// 自定义GFWList url /// - public string urlGFWList { get; set; } + public string urlGFWList + { + get; set; + } /// /// 允许来自局域网的连接 /// - public bool allowLANConn { get; set; } + public bool allowLANConn + { + get; set; + } /// /// 启用实时网速和流量统计 /// - public bool enableStatistics { get; set; } + public bool enableStatistics + { + get; set; + } /// /// 去重时优先保留较旧(顶部)节点 /// - public bool keepOlderDedupl { get; set; } - - /// - /// 服务器列表隔行着色 - /// - public bool interlaceColoring { get; set; } + public bool keepOlderDedupl + { + get; set; + } /// /// 视图刷新率 /// - public int statisticsFreshRate { get; set; } + public int statisticsFreshRate + { + get; set; + } /// /// 自定义远程DNS /// - public string remoteDNS { get; set; } + public string remoteDNS + { + get; set; + } /// /// 是否允许不安全连接 /// - public string defaultAllowInsecure { get; set; } + public string defaultAllowInsecure + { + get; set; + } /// /// 订阅 /// - public List subItem { get; set; } + public List subItem + { + get; set; + } /// /// UI /// - public UIItem uiItem { get; set; } + public UIItem uiItem + { + get; set; + } - public List userPacRule { get; set; } + public List userPacRule + { + get; set; + } #region 函数 @@ -389,77 +459,125 @@ namespace v2rayN.Mode /// /// 版本(现在=2) /// - public int configVersion { get; set; } + public int configVersion + { + get; set; + } /// /// 远程服务器地址 /// - public string address { get; set; } + public string address + { + get; set; + } /// /// 远程服务器端口 /// - public int port { get; set; } + public int port + { + get; set; + } /// /// 远程服务器ID /// - public string id { get; set; } + public string id + { + get; set; + } /// /// 远程服务器额外ID /// - public int alterId { get; set; } + public int alterId + { + get; set; + } /// /// 本地安全策略 /// - public string security { get; set; } + public string security + { + get; set; + } /// /// tcp,kcp,ws,h2,quic /// - public string network { get; set; } + public string network + { + get; set; + } /// /// 备注或别名 /// - public string remarks { get; set; } + public string remarks + { + get; set; + } /// /// 伪装类型 /// - public string headerType { get; set; } + public string headerType + { + get; set; + } /// /// 伪装的域名 /// - public string requestHost { get; set; } + public string requestHost + { + get; set; + } /// /// ws h2 path /// - public string path { get; set; } + public string path + { + get; set; + } /// /// 底层传输安全 /// - public string streamSecurity { get; set; } + public string streamSecurity + { + get; set; + } /// /// 是否允许不安全连接(用于客户端) /// - public string allowInsecure { get; set; } + public string allowInsecure + { + get; set; + } /// /// config type(1=normal,2=custom) /// - public int configType { get; set; } + public int configType + { + get; set; + } /// /// /// - public string testResult { get; set; } + public string testResult + { + get; set; + } /// /// SubItem id /// - public string subid { get; set; } + public string subid + { + get; set; + } } [Serializable] @@ -468,17 +586,26 @@ namespace v2rayN.Mode /// /// 本地监听端口 /// - public int localPort { get; set; } + public int localPort + { + get; set; + } /// /// 协议,默认为socks /// - public string protocol { get; set; } + public string protocol + { + get; set; + } /// /// 允许udp /// - public bool udpEnabled { get; set; } + public bool udpEnabled + { + get; set; + } /// /// 开启流量探测 @@ -492,31 +619,52 @@ namespace v2rayN.Mode /// /// /// - public int mtu { get; set; } + public int mtu + { + get; set; + } /// /// /// - public int tti { get; set; } + public int tti + { + get; set; + } /// /// /// - public int uplinkCapacity { get; set; } + public int uplinkCapacity + { + get; set; + } /// /// /// - public int downlinkCapacity { get; set; } + public int downlinkCapacity + { + get; set; + } /// /// /// - public bool congestion { get; set; } + public bool congestion + { + get; set; + } /// /// /// - public int readBufferSize { get; set; } + public int readBufferSize + { + get; set; + } /// /// /// - public int writeBufferSize { get; set; } + public int writeBufferSize + { + get; set; + } } @@ -526,15 +674,27 @@ namespace v2rayN.Mode /// /// /// - public string id { get; set; } + public string id + { + get; set; + } + /// /// 备注 /// - public string remarks { get; set; } + public string remarks + { + get; set; + } + /// /// url /// - public string url { get; set; } + public string url + { + get; set; + } + /// /// enable /// @@ -544,8 +704,16 @@ namespace v2rayN.Mode [Serializable] public class UIItem { - public System.Drawing.Size mainSize { get; set; } - public Dictionary mainLvColWidth { get; set; } - public List mainLvColLayout { get; set; } + + + public System.Drawing.Size mainSize + { + get; set; + } + + public Dictionary mainLvColWidth + { + get; set; + } } } diff --git a/v2rayN/v2rayN/Mode/ServerStatistics.cs b/v2rayN/v2rayN/Mode/ServerStatistics.cs index f6c655d2..e4a42a5a 100644 --- a/v2rayN/v2rayN/Mode/ServerStatistics.cs +++ b/v2rayN/v2rayN/Mode/ServerStatistics.cs @@ -6,17 +6,38 @@ namespace v2rayN.Mode [Serializable] public class ServerStatistics { - public List server { get; set; } + public List server + { + get; set; + } } [Serializable] public class ServerStatItem { - public string itemId { get; set; } - public ulong totalUp { get; set; } - public ulong totalDown { get; set; } - public ulong todayUp { get; set; } - public ulong todayDown { get; set; } - public long dateNow { get; set; } + public string itemId + { + get; set; + } + public ulong totalUp + { + get; set; + } + public ulong totalDown + { + get; set; + } + public ulong todayUp + { + get; set; + } + public ulong todayDown + { + get; set; + } + public long dateNow + { + get; set; + } } } diff --git a/v2rayN/v2rayN/Mode/VmessQRCode.cs b/v2rayN/v2rayN/Mode/VmessQRCode.cs index 4c5cb520..0a9cc8ab 100644 --- a/v2rayN/v2rayN/Mode/VmessQRCode.cs +++ b/v2rayN/v2rayN/Mode/VmessQRCode.cs @@ -8,46 +8,46 @@ namespace v2rayN.Mode /// /// 版本 /// - public string v { get; set; } + public string v { get; set; } = string.Empty; /// /// 备注 /// - public string ps { get; set; } + public string ps { get; set; } = string.Empty; /// /// 远程服务器地址 /// - public string add { get; set; } + public string add { get; set; } = string.Empty; /// /// 远程服务器端口 /// - public string port { get; set; } + public string port { get; set; } = string.Empty; /// /// 远程服务器ID /// - public string id { get; set; } + public string id { get; set; } = string.Empty; /// /// 远程服务器额外ID /// - public string aid { get; set; } + public string aid { get; set; } = string.Empty; /// /// 传输协议tcp,kcp,ws /// - public string net { get; set; } + public string net { get; set; } = string.Empty; /// /// 伪装类型 /// - public string type { get; set; } + public string type { get; set; } = string.Empty; /// /// 伪装的域名 /// - public string host { get; set; } + public string host { get; set; } = string.Empty; /// /// path /// - public string path { get; set; } + public string path { get; set; } = string.Empty; /// /// 底层传输安全 /// - public string tls { get; set; } + public string tls { get; set; } = string.Empty; } } diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index 1bffa5a1..f21638d7 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace v2rayN.Properties { // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { diff --git a/v2rayN/v2rayN/Properties/Resources.resx b/v2rayN/v2rayN/Properties/Resources.resx index 7cd3b257..706454a0 100644 --- a/v2rayN/v2rayN/Properties/Resources.resx +++ b/v2rayN/v2rayN/Properties/Resources.resx @@ -118,55 +118,55 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\about.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\option.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 - - - ..\resources\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\resources\sysproxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\resources\sub.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\notify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\checkupdate.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\promotion.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\resources\sysproxy64.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\resources\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 + + + ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\pac.txt.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\abp.js.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\resources\share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.Designer.cs b/v2rayN/v2rayN/Resx/ResUI.Designer.cs index 04d27e9e..b5b956d6 100644 --- a/v2rayN/v2rayN/Resx/ResUI.Designer.cs +++ b/v2rayN/v2rayN/Resx/ResUI.Designer.cs @@ -484,7 +484,7 @@ namespace v2rayN.Resx { } /// - /// 查找类似 Write PAC success 的本地化字符串。 + /// 查找类似 Simplify PAC Success 的本地化字符串。 /// internal static string MsgSimplifyPAC { get { @@ -690,42 +690,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 Bypass CN 的本地化字符串。 - /// - internal static string RoutingModeBypassCN { - get { - return ResourceManager.GetString("RoutingModeBypassCN", resourceCulture); - } - } - - /// - /// 查找类似 Bypass LAN 的本地化字符串。 - /// - internal static string RoutingModeBypassLAN { - get { - return ResourceManager.GetString("RoutingModeBypassLAN", resourceCulture); - } - } - - /// - /// 查找类似 Bypass LAN+CN 的本地化字符串。 - /// - internal static string RoutingModeBypassLANCN { - get { - return ResourceManager.GetString("RoutingModeBypassLANCN", resourceCulture); - } - } - - /// - /// 查找类似 Global 的本地化字符串。 - /// - internal static string RoutingModeGlobal { - get { - return ResourceManager.GetString("RoutingModeGlobal", resourceCulture); - } - } - /// /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 /// @@ -744,15 +708,6 @@ namespace v2rayN.Resx { } } - /// - /// 查找类似 ... 的本地化字符串。 - /// - internal static string ServerLatencyChecking { - get { - return ResourceManager.GetString("ServerLatencyChecking", resourceCulture); - } - } - /// /// 查找类似 SlowFresh 的本地化字符串。 /// @@ -834,14 +789,5 @@ namespace v2rayN.Resx { return ResourceManager.GetString("TestMeOutput", resourceCulture); } } - - /// - /// 查找类似 Latency: {0} 的本地化字符串。 - /// - internal static string toolSslServerLatency { - get { - return ResourceManager.GetString("toolSslServerLatency", resourceCulture); - } - } } } diff --git a/v2rayN/v2rayN/Resx/ResUI.resx b/v2rayN/v2rayN/Resx/ResUI.resx index fc9d5ab3..50d37abe 100644 --- a/v2rayN/v2rayN/Resx/ResUI.resx +++ b/v2rayN/v2rayN/Resx/ResUI.resx @@ -259,7 +259,7 @@ Resolve {0} successfully - Write PAC success + Simplify PAC Success Start getting subscriptions @@ -327,27 +327,12 @@ Are you sure to remove the server? - - Bypass CN - - - Bypass LAN - - - Bypass LAN+CN - - - Global - The client configuration file is saved at: {0} The server configuration file is saved at: {0} - - ... - SlowFresh @@ -376,7 +361,4 @@ The ping of current service: {0} - - Latency: {0} - \ No newline at end of file diff --git a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx index 97d4f0df..4b312497 100644 --- a/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx +++ b/v2rayN/v2rayN/Resx/ResUI.zh-Hans.resx @@ -259,7 +259,7 @@ 解析{0}成功 - 成功写入PAC + 简化PAC成功 开始获取订阅内容 @@ -274,13 +274,13 @@ 订阅内容解码失败(非BASE64码) - 正在解压... + 正在解压...... - 订阅内容已更新 + 更新订阅结束 - 开始更新订阅 + 更新订阅开始 更新V2rayCore成功 @@ -327,27 +327,12 @@ 是否确定移除服务器? - - 绕过大陆 - - - 绕过局域网 - - - 绕过局域网和大陆 - - - 路由: 全局 - 客户端配置文件保存在:{0} 服务端配置文件保存在:{0} - - ... - @@ -376,7 +361,4 @@ 当前服务的真连接延迟: {0} - - 延迟: {0} - \ No newline at end of file diff --git a/v2rayN/v2rayN/Tool/Utils.cs b/v2rayN/v2rayN/Tool/Utils.cs index 7ca0dd12..09c023de 100644 --- a/v2rayN/v2rayN/Tool/Utils.cs +++ b/v2rayN/v2rayN/Tool/Utils.cs @@ -168,7 +168,7 @@ namespace v2rayN } } /// - /// 换行或逗号分隔的字符串,转List + /// 逗号分隔的字符串,转List /// /// /// @@ -176,7 +176,7 @@ namespace v2rayN { try { - str = str.Replace("\r", ",").Replace("\n", ","); // 用户复制的可能是\r、\n或\r\n + str = str.Replace(Environment.NewLine, ""); return new List(str.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)); } catch @@ -318,10 +318,6 @@ namespace v2rayN return $"{string.Format("{0:f1}", result)} {unit}"; } - public static int ServerVmIndexof(List source, Mode.VmessItem findIt) - { - return source.IndexOf(findIt); - } public static void DedupServerList(List source, out List result, bool keepOlder) { List list = new List(); diff --git a/v2rayN/v2rayN/v2rayN.csproj b/v2rayN/v2rayN/v2rayN.csproj index c0ebf9e1..65075779 100644 --- a/v2rayN/v2rayN/v2rayN.csproj +++ b/v2rayN/v2rayN/v2rayN.csproj @@ -97,7 +97,6 @@ - Form diff --git a/v2rayN/v2rayN/v2rayN.ico b/v2rayN/v2rayN/v2rayN.ico index 4b988da4a5680a77d5d64000d0c0c95cf26e2462..2a2f85a92ab846518d590b2ca8aa5fb0a1afe904 100644 GIT binary patch delta 2701 zcmcguYgAO%72caGUSt{u%F+ZTLNqm~5fhR|#YUM?sX>g9MKKl4iZ>9Ws8nb)3>9aF zhz1nvb;MhU_(%-O!-zR(l!(kEN)&@4H8!}aV(E%oND1MI=5PKFo*qOyiy;cUwrL z$sjRvegv~_C2{E-(;zW#(P(Df)`O;1^CJd{o0F%&iOfWnx4jc1f1ffHvS&>kWMq5Q z01ee4EN@3AMjY8247tAv9Axy%*+d!Hx}DwV9}F=28C4k})#W_R^8V0?Qc2nqsuCu> zpP9h&$_Q^=5KCC@Iz1A2M+9^1YDc;ItO?H7hO5d*X>lBJyW3Gpjy0*uDCw1XVa&0Y z@XODJ5ta|Foea%I7FO`qC6wQNZ3>hwixK?x{9rg%E3<eWP6 zP;m*R{pl7}8E5!1KNId2t_98uS@A(P8aUqw|H{w8>(-^J5-nxV9m@)<&Y`qo_9Lni zBb6^Uv%(s}#mQ3%%kOQDg0tn1vf_8$C|4GYfj6zARplwEId2{-u63hSw>n-`VuQKk zb>N$~QJgh!e&@6a&fUinSoeErB49ckOML;VQWmJnG-+q*G^W;_K*^T)q^ekCcUBU# zTAybn$Bv-<{)%UzCOv_8126joZl5#)ccrq@f&O4g4Vez2AuX|_^^T}1;Kt~GFaPWieG!0U6_(ND6- zZI|jH>~>YjlU;T*oGvi4qZhJJ{&0gC+zz@C1%^iA&uo}Mo;Yi0Rm66lgO4}P1QJxG z*w9un0otm@L(`jK%-yyS4gdaVG+eG34_7LqRYf)Ghu#qd{8j{fwC*`}=5i7S)vrka z-Wx$zoCGRBnSoz>6!^RiK)L>J(Ku^R)KL}>0Wgw8F)3- zu7;X3jos)9p)8zf9-^9Rcg@(WJq3L?jc`0?I__CKiS_;!(MS`W5CR!E-TpmtQ%MYT zw}i6Zzac&UEulaJ34NXoSN|G%TTQqrA=>%<-+PQS>X;Kx$uPG+dF3`b6Vdi$<4<6V z6K}N}{eVioI~)5oGQ1B%^^0Mzf~&U0aC`r+kpHQ|Ijr|wD8I?zc0~#bo|8^?v|uE8 zUQf43w7tK@t+Qr2L%uv=q*2HH8W~2DXZ>6NTHlU_zf{HnKmL+4?5oP3(x_v>du+&l z2HBUc1pdbF$k8&aAGIAEF*BUwZWo5q2m%XU*GpG2ci%!Zwb_&5*7{7ivSkkN;vD>9 z?`rzfd5D}YcgFTDH_@G?-(C|4Ug*M3*wZ?4kcCnFKq@`rqkxyLKwh&1dHMn1?$4pY zmH|~cQRvzg4wnv0b*6k96GbBkEO?;{JDyfS<)w9{8L0a?kV=l%pt|}23NCI1wYQf* z_m25+-WiMEmeZ}e7~@R&J|>(-5Loa+7k1v$AQ!B)Z|Oaqe-xHv;?OZ205T=!{d`9m zLZlaQPBIykRN}Y*eJa3Jj0(Ifc=54m2E<8$E*(%OX^Dt+n$Zt~MQ7Gt6f^1`N6@zU z;Yh8;4@0yIez;njDB_YUB|119C z$F*V>cSk$ykB^C@gSG4a7!qXmHSp6``Qd0SawrA|wfYJMZ5j#lzV_uFvzH@FonG*P^7>VgCV%yXr;& literal 82726 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