ntminer 4 年之前
父节点
当前提交
3186f0a9ff
共有 100 个文件被更改,包括 1009 次插入3398 次删除
  1. 11 2
      .gitignore
  2. 15 0
      NTMiner.sln
  3. 4 4
      README.md
  4. 2 1
      src/AppModels/AppRoot.partials.CoinGroupViewModels.cs
  5. 1 1
      src/AppModels/AppRoot.partials.CoinKernelViewModels.cs
  6. 1 1
      src/AppModels/AppRoot.partials.CoinViewModels.cs
  7. 1 1
      src/AppModels/AppRoot.partials.FileWriterViewModels.cs
  8. 1 1
      src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs
  9. 1 1
      src/AppModels/AppRoot.partials.GroupViewModels.cs
  10. 1 1
      src/AppModels/AppRoot.partials.KernelInputViewModels.cs
  11. 1 1
      src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs
  12. 1 1
      src/AppModels/AppRoot.partials.KernelOutputViewModels.cs
  13. 1 1
      src/AppModels/AppRoot.partials.KernelViewModels.cs
  14. 1 1
      src/AppModels/AppRoot.partials.PackageViewModels.cs
  15. 1 1
      src/AppModels/AppRoot.partials.PoolKernelViewModels.cs
  16. 1 1
      src/AppModels/AppRoot.partials.PoolViewModels.cs
  17. 1 1
      src/AppModels/AppRoot.partials.SysDicItemViewModels.cs
  18. 1 1
      src/AppModels/AppRoot.partials.SysDicViewModels.cs
  19. 1 1
      src/AppModels/AppStatic.cs
  20. 2 2
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MineWorkViewModels.cs
  21. 2 2
      src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerGroupViewModels.cs
  22. 2 1
      src/AppModels/MinerStudio/MinerStudioRoot.partials.NTMinerWalletViewModels.cs
  23. 2 1
      src/AppModels/MinerStudio/MinerStudioRoot.partials.OverClockDataViewModels.cs
  24. 2 2
      src/AppModels/MinerStudio/Vms/ActionCountViewModel.cs
  25. 6 2
      src/AppModels/Vms/CoinViewModel.cs
  26. 1 1
      src/AppModels/Vms/KernelViewModel.cs
  27. 2 1
      src/AppModels/Vms/MinerProfileViewModel.cs
  28. 14 3
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml
  29. 1 1
      src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs
  30. 1 1
      src/AppViews0/Views/Ucs/KernelOutputKeywordEdit.xaml
  31. 1 1
      src/AppViews0/Views/Ucs/ServerMessages.xaml
  32. 2 2
      src/AppViews0/Views/Ucs/SpeedTable.xaml
  33. 1 1
      src/AppViews0/Views/Ucs/StateBar.xaml.cs
  34. 8 22
      src/BlankWindow/GlowWindow.xaml.cs
  35. 43 96
      src/BlankWindow/Themes/Generic.xaml
  36. 4 4
      src/CalcConfigUpdater/CalcConfigUpdater.csproj
  37. 7 0
      src/CalcConfigUpdater/ConfigData.cs
  38. 24 2
      src/CalcConfigUpdater/Program.cs
  39. 1 0
      src/CalcConfigUpdater/packages.config
  40. 0 3
      src/MinerClient/Daemon/DevConsole.exe.config
  41. 0 123
      src/MinerClient/Daemon/OpenHardwareMonitorLib.xml
  42. 二进制
      src/MinerClient/Daemon/WinDivert.dll
  43. 二进制
      src/MinerClient/Daemon/WinDivert64.sys
  44. 0 63
      src/MinerClient/NoDevFee/System.Net.Http.WebRequest.xml
  45. 0 2308
      src/MinerClient/NoDevFee/System.Net.Http.xml
  46. 1 1
      src/MinerClientSelfHost/MinerClientController.cs
  47. 2 1
      src/NTMinerClient/Cleaner.cs
  48. 4 4
      src/NTMinerClient/Core/Impl/ClientDataSet.cs
  49. 5 5
      src/NTMinerClient/Core/Impl/SysDicItemSet.cs
  50. 1 3
      src/NTMinerClient/Core/Kernels/IKernelOutputSet.cs
  51. 1 1
      src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs
  52. 1 533
      src/NTMinerClient/Core/Kernels/Impl/KernelOutputSet.cs
  53. 5 5
      src/NTMinerClient/Core/Kernels/Impl/KernelOutputTranslaterSet.cs
  54. 2 2
      src/NTMinerClient/Core/Kernels/Impl/PoolKernelSet.cs
  55. 2 1
      src/NTMinerClient/Core/Kernels/KernelExtensions.cs
  56. 2 1
      src/NTMinerClient/Core/Kernels/KernelSetExtension.cs
  57. 1 1
      src/NTMinerClient/Core/Profiles/IGpuProfileSet.cs
  58. 1 1
      src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs
  59. 12 6
      src/NTMinerClient/Gpus/Impl/GpusSpeed.cs
  60. 3 1
      src/NTMinerClient/Gpus/Impl/NVIDIAGpuSet.cs
  61. 4 1
      src/NTMinerClient/INTMinerContext.cs
  62. 538 0
      src/NTMinerClient/Mine/KernelOutputPicker.cs
  63. 1 1
      src/NTMinerClient/Mine/MineContext.cs
  64. 32 26
      src/NTMinerClient/Mine/MineContextFactory.cs
  65. 2 1
      src/NTMinerClient/NTMinerClient.csproj
  66. 2 2
      src/NTMinerClient/NTMinerContext.cs
  67. 0 19
      src/NTMinerDataSchemas/Core/CoinData.cs
  68. 2 0
      src/NTMinerDataSchemas/NTMinerDataSchemas.csproj
  69. 1 1
      src/NTMinerDataSchemas/ServerNode/ActionCountData.cs
  70. 0 10
      src/NTMinerDataSchemas/ServerNode/CpuData.cs
  71. 1 1
      src/NTMinerDataSchemas/ServerNode/IActionCount.cs
  72. 7 0
      src/NTMinerDataSchemas/ServerNode/IMqRoutingCountData.cs
  73. 11 0
      src/NTMinerDataSchemas/ServerNode/MqRoutingCountData.cs
  74. 1 1
      src/NTMinerDataSchemas/ServerNode/WebApiServerState.cs
  75. 1 1
      src/NTMinerDataSchemas/ServerNode/WsServerNodeState.cs
  76. 3 13
      src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs
  77. 10 4
      src/NTMinerServer/Core/Messages.cs
  78. 2 2
      src/NTMinerServer/Core/Mq/Senders/Impl/WsServerNodeMqSender.cs
  79. 5 0
      src/NTMinerServer/IMq.cs
  80. 0 2
      src/NTMinerServer/MqKeyword.cs
  81. 8 0
      src/NTMinerServer/MqRedis.cs
  82. 28 0
      src/NTMinerServer/MqRoutingCountRoot.cs
  83. 1 0
      src/NTMinerServer/NTMinerServer.csproj
  84. 3 0
      src/NTMinerWpf/Controls/BindingProxy.cs
  85. 2 2
      src/NTMinerWpf/Views/LocalIpConfig.xaml
  86. 20 16
      src/NTMinerlib/GZipUtil.cs
  87. 9 0
      src/NTMinerlib/IdGenerator/DefaultIdGenerator.cs
  88. 5 0
      src/NTMinerlib/IdGenerator/IIdGenerator.cs
  89. 2 0
      src/NTMinerlib/NTMinerlib.csproj
  90. 3 0
      src/NTMinerlib/Serialization/BinarySerializer.cs
  91. 5 0
      src/NTMinerlib/VirtualRoot.cs
  92. 1 7
      src/ServerCommon/Core/IHostConfig.cs
  93. 1 8
      src/ServerCommon/Core/Impl/HostConfigData.cs
  94. 16 1
      src/ServerCommon/IpSet/Impl/RemoteIpSet.cs
  95. 3 1
      src/ServerCommon/IpSet/RemoteIpEntry.cs
  96. 11 1
      src/UnitTests/GuidTests.cs
  97. 0 2
      src/UnitTests/JsonSerializerTests.cs
  98. 4 4
      src/UnitTests/UnitTests.csproj
  99. 44 0
      src/WebApiServer/ActionCountRoot.cs
  100. 4 41
      src/WebApiServer/AppRoot.cs

+ 11 - 2
.gitignore

@@ -289,6 +289,17 @@ AppViews1.dll
 /src/MinerClient/Daemon/LiteDB.dll
 /src/MinerClient/NoDevFee/LiteDB.xml
 /src/MinerClient/NoDevFee/LiteDB.dll
+/src/MinerClient/NoDevFee/NTMinerNoDevFee.exe.config
+/src/MinerClient/NoDevFee/log4net.xml
+/src/MinerClient/Daemon/websocket-sharp.xml
+/src/MinerClient/Daemon/System.Net.Http.Primitives.xml
+/src/MinerClient/Daemon/System.Net.Http.Extensions.xml
+/src/MinerClient/Daemon/NTMinerRpcClient.dll.config
+/src/MinerClient/Daemon/NTMinerDaemon.exe.config
+/src/MinerClient/NoDevFee/System.Net.Http.Primitives.xml
+/src/MinerClient/NoDevFee/System.Net.Http.Formatting.xml
+/src/MinerClient/NoDevFee/System.Net.Http.Extensions.xml
+/src/MinerClient/NoDevFee/Newtonsoft.Json.xml
 /src/MinerStudio/NTMinerServices/System.Web.Http.xml
 /src/MinerStudio/NTMinerServices/System.Web.Http.SelfHost.xml
 /src/MinerStudio/NTMinerServices/System.Web.Http.SelfHost.dll
@@ -310,5 +321,3 @@ AppViews1.dll
 /src/MinerStudio/NTMinerServices/LiteDB.xml
 /src/MinerStudio/NTMinerServices/LiteDB.dll
 /src/MinerStudio/NTMinerServices/Aliyun.OSS.dll
-/src/MinerClient/NoDevFee/NTMinerNoDevFee.exe.config
-/src/MinerClient/NoDevFee/log4net.xml

+ 15 - 0
NTMiner.sln

@@ -119,6 +119,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UserServer", "src\UserServe
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "websocket-sharp", "src\websocket-sharp\websocket-sharp.csproj", "{B357BAC7-529E-4D81-A0D2-71041B19C8DE}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebSite", "src\WebSite\WebSite.csproj", "{AA37861C-5470-4885-B536-E6CA39D5F574}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -477,6 +479,18 @@ Global
 		{B357BAC7-529E-4D81-A0D2-71041B19C8DE}.Release|x64.Build.0 = Release|Any CPU
 		{B357BAC7-529E-4D81-A0D2-71041B19C8DE}.Release|x86.ActiveCfg = Release|Any CPU
 		{B357BAC7-529E-4D81-A0D2-71041B19C8DE}.Release|x86.Build.0 = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|x64.Build.0 = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Debug|x86.Build.0 = Debug|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|x64.ActiveCfg = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|x64.Build.0 = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|x86.ActiveCfg = Release|Any CPU
+		{AA37861C-5470-4885-B536-E6CA39D5F574}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -514,6 +528,7 @@ Global
 		{3A26E27F-79C5-44D5-B25F-307A6EFE0636} = {43C57D59-9DC7-45AE-9D09-5D3D413E41EC}
 		{103F58A8-D0E9-405D-8FF0-DD600FCA2282} = {3A26E27F-79C5-44D5-B25F-307A6EFE0636}
 		{7141D542-E321-406D-A242-B857255F79F6} = {2C8C5FC2-8B81-4228-8EBD-6B491216FBC1}
+		{AA37861C-5470-4885-B536-E6CA39D5F574} = {43C57D59-9DC7-45AE-9D09-5D3D413E41EC}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {A5D14B0A-73FF-46E8-87F3-7E83FFC1DBDD}

+ 4 - 4
README.md

@@ -1,10 +1,10 @@
-点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=DnJHI8wM): 519357356
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=UbEWSFc2): 697539304
 
 1. 开源矿工内置的所有内核均为原版,开源矿工永远不会额外增加矿工支出;
 2. 开源矿工永远开源;
 3. 开源矿工永远不会去破解国人开发的内核;
 
-## [下载地址1](https://zhuanlan.zhihu.com/p/345948143)
+## [下载地址1](https://github.com/ntminer/NtMiner/releases)
 ### 从源码编译:Visual Studio 2019
 
 ## 开源软件
@@ -15,7 +15,7 @@
 
 ## 使用说明
 ### 注意:显卡币普遍对显存有要求,90%的家用和办公电脑的显卡达不到大部分币种挖矿的最低要求。
-[在线下载](https://github.com/ntminer/NtMiner/wikis)或者拷贝到矿机上打开即可开始挖矿了。下图是软件主界面,这是一台具有8张p106显卡的矿机:
+在线下载或者拷贝到矿机上打开即可开始挖矿了。下图是软件主界面,这是一台具有8张p106显卡的矿机:
 ![视图](https://minerjson.oss-cn-beijing.aliyuncs.com/website/img/index-pic.png "NTMiner视图")
 从图上可以看到,这台矿机挖了31分钟了,它在挖ETH,连接的鱼池的矿池,使用鱼池的挖矿账户名挖矿,也可以选择鱼池pps矿池使用ETH钱包地址挖矿,这个挖矿账户名或钱包地址也是用户唯一需要填写的东西,其它的都不用填默认即可开挖。从图上可以看到这台矿机一天能挖0.015个ETH,约等于20块钱,去除电费(0.56元每度)后盈利10块钱。
 
@@ -34,7 +34,7 @@
 
 类似开源矿工这些同类挖矿辅助工具降低了挖矿门槛帮助矿工管理矿机,获得一点收入是合理的,但是不能偷。
 
-点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=DnJHI8wM): 519357356
+点击加入 [NTMiner官方QQ群](https://jq.qq.com/?_wv=1027&k=UbEWSFc2): 697539304
 
 # 授权协议
 The LGPL license。

+ 2 - 1
src/AppModels/AppRoot.partials.CoinGroupViewModels.cs

@@ -1,6 +1,7 @@
 using NTMiner.Vms;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace NTMiner {
     public static partial class AppRoot {
@@ -50,7 +51,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.CoinGroupSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.CoinGroupSet.AsEnumerable().ToArray()) {
                     CoinGroupViewModel groupVm = new CoinGroupViewModel(item);
                     _dicById.Add(item.GetId(), groupVm);
                     if (!_listByGroupId.ContainsKey(item.GroupId)) {

+ 1 - 1
src/AppModels/AppRoot.partials.CoinKernelViewModels.cs

@@ -72,7 +72,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new CoinKernelViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.CoinViewModels.cs

@@ -101,7 +101,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.CoinSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.CoinSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new CoinViewModel(item));
                 }
                 foreach (var coinVm in _dicById.Values) {

+ 1 - 1
src/AppModels/AppRoot.partials.FileWriterViewModels.cs

@@ -49,7 +49,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.FileWriterSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.FileWriterSet.AsEnumerable().ToArray()) {
                     FileWriterViewModel groupVm = new FileWriterViewModel(item);
                     _dicById.Add(item.GetId(), groupVm);
                 }

+ 1 - 1
src/AppModels/AppRoot.partials.FragmentWriterViewModels.cs

@@ -49,7 +49,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.FragmentWriterSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.FragmentWriterSet.AsEnumerable().ToArray()) {
                     FragmentWriterViewModel groupVm = new FragmentWriterViewModel(item);
                     _dicById.Add(item.GetId(), groupVm);
                 }

+ 1 - 1
src/AppModels/AppRoot.partials.GroupViewModels.cs

@@ -56,7 +56,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.GroupSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.GroupSet.AsEnumerable().ToArray()) {
                     GroupViewModel groupVm = new GroupViewModel(item);
                     _dicById.Add(item.GetId(), groupVm);
                 }

+ 1 - 1
src/AppModels/AppRoot.partials.KernelInputViewModels.cs

@@ -60,7 +60,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.KernelInputSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.KernelInputSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new KernelInputViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.KernelOutputTranslaterViewModels.cs

@@ -64,7 +64,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.KernelOutputTranslaterSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.KernelOutputTranslaterSet.AsEnumerable().ToArray()) {
                     if (!_dicByKernelOutputId.ContainsKey(item.KernelOutputId)) {
                         _dicByKernelOutputId.Add(item.KernelOutputId, new List<KernelOutputTranslaterViewModel>());
                     }

+ 1 - 1
src/AppModels/AppRoot.partials.KernelOutputViewModels.cs

@@ -49,7 +49,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.KernelOutputSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.KernelOutputSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new KernelOutputViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.KernelViewModels.cs

@@ -69,7 +69,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.KernelSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.KernelSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new KernelViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.PackageViewModels.cs

@@ -51,7 +51,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.PackageSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.PackageSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new PackageViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.PoolKernelViewModels.cs

@@ -52,7 +52,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (IPoolKernel item in NTMinerContext.Instance.ServerContext.PoolKernelSet.AsEnumerable()) {
+                foreach (IPoolKernel item in NTMinerContext.Instance.ServerContext.PoolKernelSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new PoolKernelViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.PoolViewModels.cs

@@ -53,7 +53,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.PoolSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.PoolSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new PoolViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.SysDicItemViewModels.cs

@@ -59,7 +59,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.SysDicItemSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.SysDicItemSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new SysDicItemViewModel(item));
                 }
             }

+ 1 - 1
src/AppModels/AppRoot.partials.SysDicViewModels.cs

@@ -60,7 +60,7 @@ namespace NTMiner {
             }
 
             private void Init() {
-                foreach (var item in NTMinerContext.Instance.ServerContext.SysDicSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.SysDicSet.AsEnumerable().ToArray()) {
                     SysDicViewModel sysDicVm = new SysDicViewModel(item);
                     _dicById.Add(item.GetId(), sysDicVm);
                     _dicByCode.Add(item.Code, sysDicVm);

+ 1 - 1
src/AppModels/AppStatic.cs

@@ -844,7 +844,7 @@ namespace NTMiner {
         });
 
         public static ICommand DownloadMinerStudio { get; private set; } = new DelegateCommand(() => {
-            string url = "https://zhuanlan.zhihu.com/p/345948143";
+            string url = "https://github.com/ntminer/NtMiner/releases";
             url = NTMinerContext.Instance.ServerContext.SysDicItemSet.TryGetDicItemValue(NTKeyword.ThisSystemSysDicCode, "DownloadMinerStudio", url);
             VirtualRoot.Execute(new UnTopmostCommand());
             Process.Start(url);

+ 2 - 2
src/AppModels/MinerStudio/MinerStudioRoot.partials.MineWorkViewModels.cs

@@ -17,14 +17,14 @@ namespace NTMiner.MinerStudio {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                foreach (var item in NTMinerContext.MinerStudioContext.MineWorkSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.MinerStudioContext.MineWorkSet.AsEnumerable().ToArray()) {
                     if (!_dicById.ContainsKey(item.Id)) {
                         _dicById.Add(item.Id, new MineWorkViewModel(item));
                     }
                 }
                 AppRoot.BuildEventPath<MineWorkSetInitedEvent>("作业集初始化后初始化Vm内存", LogEnum.DevConsole, path: message => {
                     _dicById.Clear();
-                    foreach (var item in NTMinerContext.MinerStudioContext.MineWorkSet.AsEnumerable()) {
+                    foreach (var item in NTMinerContext.MinerStudioContext.MineWorkSet.AsEnumerable().ToArray()) {
                         if (!_dicById.ContainsKey(item.Id)) {
                             _dicById.Add(item.Id, new MineWorkViewModel(item));
                         }

+ 2 - 2
src/AppModels/MinerStudio/MinerStudioRoot.partials.MinerGroupViewModels.cs

@@ -17,14 +17,14 @@ namespace NTMiner.MinerStudio {
                 if (WpfUtil.IsInDesignMode) {
                     return;
                 }
-                foreach (var item in NTMinerContext.MinerStudioContext.MinerGroupSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.MinerStudioContext.MinerGroupSet.AsEnumerable().ToArray()) {
                     if (!_dicById.ContainsKey(item.Id)) {
                         _dicById.Add(item.Id, new MinerGroupViewModel(item));
                     }
                 }
                 AppRoot.BuildEventPath<MinerGroupSetInitedEvent>("矿工组集初始化后初始化Vm内存", LogEnum.DevConsole, path: message => {
                     _dicById.Clear();
-                    foreach (var item in NTMinerContext.MinerStudioContext.MinerGroupSet.AsEnumerable()) {
+                    foreach (var item in NTMinerContext.MinerStudioContext.MinerGroupSet.AsEnumerable().ToArray()) {
                         if (!_dicById.ContainsKey(item.Id)) {
                             _dicById.Add(item.Id, new MinerGroupViewModel(item));
                         }

+ 2 - 1
src/AppModels/MinerStudio/MinerStudioRoot.partials.NTMinerWalletViewModels.cs

@@ -2,6 +2,7 @@
 using NTMiner.Vms;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Windows.Input;
 
 namespace NTMiner.MinerStudio {
@@ -50,7 +51,7 @@ namespace NTMiner.MinerStudio {
 
             private void Init(bool refresh) {
                 _dicById.Clear();
-                foreach (var item in NTMinerContext.MinerStudioContext.NTMinerWalletSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.MinerStudioContext.NTMinerWalletSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new NTMinerWalletViewModel(item));
                 }
                 if (refresh) {

+ 2 - 1
src/AppModels/MinerStudio/MinerStudioRoot.partials.OverClockDataViewModels.cs

@@ -2,6 +2,7 @@
 using NTMiner.Vms;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace NTMiner.MinerStudio {
     public static partial class MinerStudioRoot {
@@ -44,7 +45,7 @@ namespace NTMiner.MinerStudio {
 
             private void Init(bool refresh) {
                 _dicById.Clear();
-                foreach (var item in NTMinerContext.Instance.OverClockDataSet.AsEnumerable()) {
+                foreach (var item in NTMinerContext.Instance.OverClockDataSet.AsEnumerable().ToArray()) {
                     _dicById.Add(item.GetId(), new OverClockDataViewModel(item));
                 }
                 if (refresh) {

+ 2 - 2
src/AppModels/MinerStudio/Vms/ActionCountViewModel.cs

@@ -4,7 +4,7 @@ using NTMiner.Vms;
 namespace NTMiner.MinerStudio.Vms {
     public class ActionCountViewModel : ViewModelBase, IActionCount {
         private string _actionName;
-        private int _count;
+        private long _count;
 
         public ActionCountViewModel(IActionCount data) {
             _actionName = data.ActionName;
@@ -21,7 +21,7 @@ namespace NTMiner.MinerStudio.Vms {
             }
         }
 
-        public int Count {
+        public long Count {
             get => _count;
             set {
                 if (_count != value) {

+ 6 - 2
src/AppModels/Vms/CoinViewModel.cs

@@ -7,6 +7,7 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
+using System.Threading.Tasks;
 using System.Windows.Forms;
 using System.Windows.Input;
 
@@ -118,7 +119,10 @@ namespace NTMiner.Vms {
         }
 
         private void ApplyOverClock() {
-            VirtualRoot.Execute(new CoinOverClockCommand(this.Id));
+            Task.Factory.StartNew(() => {
+                // 比较耗时,防止界面卡
+                VirtualRoot.Execute(new CoinOverClockCommand(this.Id));
+            });
         }
 
         private void FillOverClock(OverClockDataViewModel data) {
@@ -322,7 +326,7 @@ namespace NTMiner.Vms {
                 if (this.Id == PleaseSelect.Id || NTMinerContext.Instance.GpuSet.GpuType == GpuType.Empty) {
                     return true;
                 }
-                foreach (var coinKernel in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == this.Id)) {
+                foreach (var coinKernel in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == this.Id).ToArray()) {
                     if (coinKernel.SupportedGpu.IsSupportedGpu(NTMinerContext.Instance.GpuSet.GpuType)) {
                         return true;
                     }

+ 1 - 1
src/AppModels/Vms/KernelViewModel.cs

@@ -367,7 +367,7 @@ namespace NTMiner.Vms {
         public List<CoinViewModel> SupportedCoinVms {
             get {
                 List<CoinViewModel> list = new List<CoinViewModel>();
-                foreach (var item in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().Where(a => a.KernelId == this.Id)) {
+                foreach (var item in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().Where(a => a.KernelId == this.Id).ToArray()) {
                     if (AppRoot.CoinVms.TryGetCoinVm(item.CoinId, out CoinViewModel coin)) {
                         list.Add(coin);
                     }

+ 2 - 1
src/AppModels/Vms/MinerProfileViewModel.cs

@@ -1,6 +1,7 @@
 using NTMiner.Core;
 using NTMiner.Core.Kernels;
 using NTMiner.Core.Profile;
+using NTMiner.Mine;
 using NTMiner.MinerStudio.Vms;
 using NTMiner.Ws;
 using System;
@@ -136,7 +137,7 @@ namespace NTMiner.Vms {
                     }
                 }
                 #endregion
-                NTMinerContext.Instance.CurrentMineContext = NTMinerContext.Instance.CreateMineContext();
+                NTMinerContext.Instance.CurrentMineContext = MineContextFactory.CreateMineContext();
                 if (NTMinerContext.Instance.CurrentMineContext != null) {
                     this.ArgsAssembly = NTMinerContext.Instance.CurrentMineContext.CommandLine;
                 }

+ 14 - 3
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml

@@ -86,9 +86,20 @@
 			<DataGrid.Resources>
 				<controls:BindingProxy x:Key="proxy" Data="{Binding}" />
 			</DataGrid.Resources>
-			<DataGrid.Columns>
-				<DataGridTextColumn IsReadOnly="True" Width="140" Header="节点地址" Binding="{Binding Address}">
-                </DataGridTextColumn>
+            <DataGrid.Columns>
+                <DataGridTemplateColumn IsReadOnly="True" Width="140">
+                    <DataGridTemplateColumn.Header>
+                        <WrapPanel>
+                            <TextBlock Text="节点地址"></TextBlock>
+                            <TextBlock Margin="4 0 0 0" Text="{Binding Data.WebApiServerStateVm.WsServerNodeVms.Count,Source={StaticResource proxy}}"></TextBlock>
+                        </WrapPanel>
+                    </DataGridTemplateColumn.Header>
+                    <DataGridTemplateColumn.CellTemplate>
+                        <DataTemplate>
+                            <TextBox IsReadOnly="True" BorderThickness="0" Text="{Binding Address,Mode=OneWay}"></TextBox>
+                        </DataTemplate>
+                    </DataGridTemplateColumn.CellTemplate>
+                </DataGridTemplateColumn>
                 <DataGridTextColumn IsReadOnly="True" Width="100" Binding="{Binding MinerClientWsSessionCount}">
                     <DataGridTextColumn.Header>
                         <StackPanel>

+ 1 - 1
src/AppViews0/MinerStudio/Views/Ucs/WsServerNodePage.xaml.cs

@@ -11,7 +11,7 @@ namespace NTMiner.MinerStudio.Views.Ucs {
                 Title = "外网群控websocket服务器节点",
                 IconName = "Icon_Server",
                 Width = 1590,
-                Height = 400,
+                Height = 500,
                 IsMaskTheParent = false,
                 IsChildWindow = true,
                 CloseVisible = Visibility.Visible,

+ 1 - 1
src/AppViews0/Views/Ucs/KernelOutputKeywordEdit.xaml

@@ -56,7 +56,7 @@
             </TextBox>
         </WrapPanel>
         <StackPanel Margin="60 0 0 0">
-            <TextBlock Foreground="Red">1,基于关键字从内核输出中时提取出包含关键字的行;</TextBlock>
+            <TextBlock Foreground="Red">1,基于关键字从内核输出中时提取出包含关键字的行;</TextBlock>
             <TextBlock Foreground="Red">2,“大意”是翻译,因为内核输出往往是英文;</TextBlock>
         </StackPanel>
         <controls:KbButton

+ 1 - 1
src/AppViews0/Views/Ucs/ServerMessages.xaml

@@ -214,7 +214,7 @@
                     </DataGridTemplateColumn.HeaderTemplate>
                     <DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
-                            <TextBlock Text="{Binding Content}" TextWrapping="Wrap" ToolTip="{Binding Content}" Foreground="{Binding IconFill}"></TextBlock>
+                            <TextBox Text="{Binding Content,Mode=OneWay}" Height="Auto" IsReadOnly="True" BorderThickness="0" TextWrapping="Wrap" ToolTip="{Binding Content}" Foreground="{Binding IconFill}"></TextBox>
                         </DataTemplate>
                     </DataGridTemplateColumn.CellTemplate>
                 </DataGridTemplateColumn>

+ 2 - 2
src/AppViews0/Views/Ucs/SpeedTable.xaml

@@ -157,7 +157,7 @@
                     MinWidth="30" Width="30" IsReadOnly="True"
                     Visibility="{Binding Data.GpuSpeedVms.MinerProfile.CoinVm.CoinKernel.Kernel.KernelOutputVm.IsRejectOneGpuShare,Source={StaticResource proxy},Converter={StaticResource BoolToVisibilityConverter}}">
                     <DataGridTemplateColumn.Header>
-                        <TextBlock Text="拒绝" ToolTip="矿池拒绝的份额数" FontSize="10"></TextBlock>
+                        <TextBlock Text="拒绝" ToolTip="矿池拒绝的份额数,拒绝无法消减到0因为拒绝和网络有关,但通常不应超过2%" FontSize="10"></TextBlock>
                     </DataGridTemplateColumn.Header>
                     <DataGridTemplateColumn.CellTemplate>
                         <DataTemplate>
@@ -547,7 +547,7 @@
                     <DataGridTemplateColumn.HeaderTemplate>
                         <DataTemplate>
                             <StackPanel>
-                                <TextBlock Text="时功耗" FontSize="10"></TextBlock>
+                                <TextBlock Text="时功耗" FontSize="10"></TextBlock>
                                 <TextBlock Text="{Binding Data.GpuSpeedVms.GpuAllVm.PowerUsageWText, Source={StaticResource proxy}}" FontSize="11"></TextBlock>
                             </StackPanel>
                         </DataTemplate>

+ 1 - 1
src/AppViews0/Views/Ucs/StateBar.xaml.cs

@@ -23,7 +23,7 @@ namespace NTMiner.Views.Ucs {
                     Vm.OnPropertyChanged(nameof(Vm.AutoAdminLogonToolTip));
                     VirtualRoot.Execute(new RefreshIsRemoteDesktopEnabledCommand());
                 };
-                window.BuildEventPath<PoolDelayPickedEvent>("从内核输出中提取了矿池延时展示到界面", LogEnum.DevConsole,
+                window.BuildEventPath<PoolDelayPickedEvent>("从内核输出中提取了矿池延时展示到界面", LogEnum.DevConsole,
                     path: message => {
                         if (message.IsDual) {
                             Vm.DualPoolDelayText = message.PoolDelayText;

+ 8 - 22
src/BlankWindow/GlowWindow.xaml.cs

@@ -32,18 +32,14 @@ namespace NTMiner {
 
             this.Owner = owner;
 
-            if (this.Owner.Owner != null) {
-                this.Owner.Owner.StateChanged += Owner_StateChanged;
-                this.Owner.Closing += (sender, e) => {
-                    this.Owner.Owner.StateChanged -= Owner_StateChanged;
-                };
-            }
-            else {
-                this.Owner.StateChanged += Owner_StateChanged;
-                this.Closing += (sender, e) => {
-                    this.Owner.StateChanged -= Owner_StateChanged;
-                };
-            }
+            this.Owner.StateChanged += (sender, args) => {
+                if (this.Owner.WindowState == WindowState.Normal) {
+                    this.Show();
+                }
+                else {
+                    this.Hide();
+                }
+            };
 
             var b = new Binding("GlowBrush") {
                 Source = owner
@@ -158,16 +154,6 @@ namespace NTMiner {
             };
         }
 
-        private void Owner_StateChanged(object sender, EventArgs e) {
-            Window window = (Window)sender;
-            if (window.WindowState != WindowState.Minimized) {
-                this.Show();
-            }
-            else {
-                this.Hide();
-            }
-        }
-
         protected override void OnSourceInitialized(EventArgs e) {
             base.OnSourceInitialized(e);
 

+ 43 - 96
src/BlankWindow/Themes/Generic.xaml

@@ -6,8 +6,7 @@
                     xmlns:system="clr-namespace:System;assembly=mscorlib">
 
 
-    <ControlTemplate x:Key="WindowTemplate"
-                     TargetType="{x:Type local:BlankWindow}">
+    <ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type local:BlankWindow}">
         <Border Background="{TemplateBinding Background}"
                 BorderBrush="{TemplateBinding BorderBrush}"
                 BorderThickness="{TemplateBinding BorderThickness}">
@@ -34,12 +33,9 @@
     </ControlTemplate>
 
     <Style TargetType="{x:Type local:BlankWindow}">
-        <Setter Property="Template"
-                Value="{StaticResource WindowTemplate}" />
-        <Setter Property="UseLayoutRounding"
-                Value="True" />
-        <Setter Property="GlowBrush"
-                Value="Black" />
+        <Setter Property="Template" Value="{StaticResource WindowTemplate}" />
+        <Setter Property="UseLayoutRounding" Value="True" />
+        <Setter Property="GlowBrush" Value="Black" />
         <Setter Property="behaviours:StylizedBehaviors.Behaviors">
             <Setter.Value>
                 <behaviours:StylizedBehaviorCollection>
@@ -53,9 +49,7 @@
 
     <system:Double x:Key="GlowOpacity">0.3</system:Double>
     <system:Double x:Key="ShadowOpacity">0.3</system:Double>
-    <BlurEffect x:Key="GlowBlurEffect"
-                Radius="3"
-                options:Freeze="True" />
+    <BlurEffect x:Key="GlowBlurEffect" Radius="3" options:Freeze="True" />
 
     <ControlTemplate x:Key="TopGlowTemplate">
         <Border x:Name="GlowBorder"
@@ -65,22 +59,15 @@
                 Opacity="{StaticResource GlowOpacity}"
                 Background="{TemplateBinding Background}">
             <Border.OpacityMask>
-                <LinearGradientBrush options:Freeze="True"
-                                     StartPoint="0.5,0"
-                                     EndPoint="0.5,1">
-                    <GradientStop Color="Transparent"
-                                  Offset="0" />
-                    <GradientStop Color="Black"
-                                  Offset="1" />
+                <LinearGradientBrush options:Freeze="True" StartPoint="0.5,0" EndPoint="0.5,1">
+                    <GradientStop Color="Transparent" Offset="0" />
+                    <GradientStop Color="Black" Offset="1" />
                 </LinearGradientBrush>
             </Border.OpacityMask>
         </Border>
         <ControlTemplate.Triggers>
-            <Trigger Property="BorderThickness"
-                     Value="0">
-                <Setter TargetName="GlowBorder"
-                        Property="Opacity"
-                        Value="{StaticResource ShadowOpacity}" />
+            <Trigger Property="BorderThickness" Value="0">
+                <Setter TargetName="GlowBorder" Property="Opacity" Value="{StaticResource ShadowOpacity}" />
             </Trigger>
         </ControlTemplate.Triggers>
     </ControlTemplate>
@@ -93,22 +80,15 @@
                 Opacity="{StaticResource GlowOpacity}"
                 Background="{TemplateBinding Background}">
             <Border.OpacityMask>
-                <LinearGradientBrush options:Freeze="True"
-                                     StartPoint="0.5,0"
-                                     EndPoint="0.5,1">
-                    <GradientStop Color="Black"
-                                  Offset="0" />
-                    <GradientStop Color="Transparent"
-                                  Offset="1" />
+                <LinearGradientBrush options:Freeze="True" StartPoint="0.5,0" EndPoint="0.5,1">
+                    <GradientStop Color="Black" Offset="0" />
+                    <GradientStop Color="Transparent" Offset="1" />
                 </LinearGradientBrush>
             </Border.OpacityMask>
         </Border>
         <ControlTemplate.Triggers>
-            <Trigger Property="BorderThickness"
-                     Value="0">
-                <Setter TargetName="GlowBorder"
-                        Property="Opacity"
-                        Value="{StaticResource ShadowOpacity}" />
+            <Trigger Property="BorderThickness" Value="0">
+                <Setter TargetName="GlowBorder" Property="Opacity" Value="{StaticResource ShadowOpacity}" />
             </Trigger>
         </ControlTemplate.Triggers>
     </ControlTemplate>
@@ -121,22 +101,15 @@
                 Opacity="{StaticResource GlowOpacity}"
                 Background="{TemplateBinding Background}">
             <Border.OpacityMask>
-                <LinearGradientBrush options:Freeze="True"
-                                     StartPoint="0,0.5"
-                                     EndPoint="1,0.5">
-                    <GradientStop Color="Transparent"
-                                  Offset="0" />
-                    <GradientStop Color="Black"
-                                  Offset="1" />
+                <LinearGradientBrush options:Freeze="True" StartPoint="0,0.5" EndPoint="1,0.5">
+                    <GradientStop Color="Transparent" Offset="0" />
+                    <GradientStop Color="Black" Offset="1" />
                 </LinearGradientBrush>
             </Border.OpacityMask>
         </Border>
         <ControlTemplate.Triggers>
-            <Trigger Property="BorderThickness"
-                     Value="0">
-                <Setter TargetName="GlowBorder"
-                        Property="Opacity"
-                        Value="{StaticResource ShadowOpacity}" />
+            <Trigger Property="BorderThickness" Value="0">
+                <Setter TargetName="GlowBorder" Property="Opacity" Value="{StaticResource ShadowOpacity}" />
             </Trigger>
         </ControlTemplate.Triggers>
     </ControlTemplate>
@@ -149,30 +122,21 @@
                 Opacity="{StaticResource GlowOpacity}"
                 Background="{TemplateBinding Background}">
             <Border.OpacityMask>
-                <LinearGradientBrush options:Freeze="True"
-                                     StartPoint="0,0.5"
-                                     EndPoint="1,0.5">
-                    <GradientStop Color="Black"
-                                  Offset="0" />
-                    <GradientStop Color="Transparent"
-                                  Offset="1" />
+                <LinearGradientBrush options:Freeze="True" StartPoint="0,0.5" EndPoint="1,0.5">
+                    <GradientStop Color="Black" Offset="0" />
+                    <GradientStop Color="Transparent" Offset="1" />
                 </LinearGradientBrush>
             </Border.OpacityMask>
         </Border>
         <ControlTemplate.Triggers>
-            <Trigger Property="BorderThickness"
-                     Value="0">
-                <Setter TargetName="GlowBorder"
-                        Property="Opacity"
-                        Value="{StaticResource ShadowOpacity}" />
+            <Trigger Property="BorderThickness" Value="0">
+                <Setter TargetName="GlowBorder" Property="Opacity" Value="{StaticResource ShadowOpacity}" />
             </Trigger>
         </ControlTemplate.Triggers>
     </ControlTemplate>
 
-    <ControlTemplate x:Key="GlowTemplate"
-                     TargetType="{x:Type local:Glow}">
-        <Grid Margin="{TemplateBinding Padding}"
-              Background="Transparent">
+    <ControlTemplate x:Key="GlowTemplate" TargetType="{x:Type local:Glow}">
+        <Grid Margin="{TemplateBinding Padding}" Background="Transparent">
             <Border Background="{TemplateBinding Background}" />
             <Border x:Name="glowSource"
                     Margin="-1,0"
@@ -184,47 +148,30 @@
             </Border>
         </Grid>
         <ControlTemplate.Triggers>
-            <Trigger Property="Orientation"
-                     Value="Horizontal">
-                <Setter TargetName="glowSource"
-                        Property="Margin"
-                        Value="0,-1" />
+            <Trigger Property="Orientation" Value="Horizontal">
+                <Setter TargetName="glowSource" Property="Margin" Value="0,-1" />
             </Trigger>
         </ControlTemplate.Triggers>
     </ControlTemplate>
 
     <Style TargetType="{x:Type local:Glow}">
-        <Setter Property="UseLayoutRounding"
-                Value="True" />
-        <Setter Property="Background"
-                Value="{Binding RelativeSource={RelativeSource Self}, Path=GlowBrush}" />
-        <Setter Property="Padding"
-                Value="0" />
-        <Setter Property="VerticalAlignment"
-                Value="Stretch" />
-        <Setter Property="HorizontalAlignment"
-                Value="Stretch" />
-        <Setter Property="VerticalContentAlignment"
-                Value="Stretch" />
-        <Setter Property="HorizontalContentAlignment"
-                Value="Stretch" />
-        <Setter Property="Template"
-                Value="{StaticResource TopGlowTemplate}" />
+        <Setter Property="UseLayoutRounding" Value="True" />
+        <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=GlowBrush}" />
+        <Setter Property="Padding" Value="0" />
+        <Setter Property="VerticalAlignment" Value="Stretch" />
+        <Setter Property="HorizontalAlignment" Value="Stretch" />
+        <Setter Property="VerticalContentAlignment" Value="Stretch" />
+        <Setter Property="HorizontalContentAlignment" Value="Stretch" />
+        <Setter Property="Template" Value="{StaticResource TopGlowTemplate}" />
         <Style.Triggers>
-            <Trigger Property="Direction"
-                     Value="Bottom">
-                <Setter Property="Template"
-                        Value="{StaticResource BottomGlowTemplate}" />
+            <Trigger Property="Direction" Value="Bottom">
+                <Setter Property="Template" Value="{StaticResource BottomGlowTemplate}" />
             </Trigger>
-            <Trigger Property="Direction"
-                     Value="Left">
-                <Setter Property="Template"
-                        Value="{StaticResource LeftGlowTemplate}" />
+            <Trigger Property="Direction" Value="Left">
+                <Setter Property="Template" Value="{StaticResource LeftGlowTemplate}" />
             </Trigger>
-            <Trigger Property="Direction"
-                     Value="Right">
-                <Setter Property="Template"
-                        Value="{StaticResource RightGlowTemplate}" />
+            <Trigger Property="Direction" Value="Right">
+                <Setter Property="Template" Value="{StaticResource RightGlowTemplate}" />
             </Trigger>
         </Style.Triggers>
     </Style>

+ 4 - 4
src/CalcConfigUpdater/CalcConfigUpdater.csproj

@@ -42,6 +42,9 @@
     <Reference Include="Costura, Version=4.1.0.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
       <HintPath>..\..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll</HintPath>
     </Reference>
+    <Reference Include="LiteDB, Version=4.1.4.0, Culture=neutral, PublicKeyToken=4ee40123013c9f27, processorArchitecture=MSIL">
+      <HintPath>..\..\packages\LiteDB.4.1.4\lib\net40\LiteDB.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
@@ -53,6 +56,7 @@
     <Reference Include="System.Net.Http.WebRequest" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ConfigData.cs" />
     <Compile Include="IncomeItem.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -91,10 +95,6 @@
       <Project>{c7108d8f-eb73-4ae3-916f-be817ede37af}</Project>
       <Name>NTMinerRpcClient</Name>
     </ProjectReference>
-    <ProjectReference Include="..\ServerCommon\ServerCommon.csproj">
-      <Project>{e12eefdc-66e9-4b7d-a036-fc1d4962eb04}</Project>
-      <Name>ServerCommon</Name>
-    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

+ 7 - 0
src/CalcConfigUpdater/ConfigData.cs

@@ -0,0 +1,7 @@
+namespace NTMiner {
+    public class ConfigData {
+        public ConfigData() { }
+        public string RpcLoginName { get; set; }
+        public string RpcPassword { get; set; }
+    }
+}

+ 24 - 2
src/CalcConfigUpdater/Program.cs

@@ -1,4 +1,5 @@
-using NTMiner.Core;
+using LiteDB;
+using NTMiner.Core;
 using NTMiner.Core.MinerServer;
 using System;
 using System.Collections.Generic;
@@ -11,6 +12,27 @@ using System.Threading.Tasks;
 
 namespace NTMiner {
     public class Program {
+        private static ConfigData _config;
+        private static readonly object _locker = new object();
+        public static ConfigData Config {
+            get {
+                if (_config == null) {
+                    lock (_locker) {
+                        if (_config == null) {
+                            using (LiteDatabase db = new LiteDatabase($"filename={Path.Combine(HomePath.AppDomainBaseDirectory, NTKeyword.LocalDbFileName)}")) {
+                                var col = db.GetCollection<ConfigData>();
+                                _config = col.FindOne(Query.All());
+                            }
+                            if (_config == null) {
+                                throw new NTMinerException("未配置ConfigData");
+                            }
+                        }
+                    }
+                }
+                return _config;
+            }
+        }
+
         static void Main() {
             VirtualRoot.SetOut(new ConsoleOut());
             NTMinerConsole.MainUiOk();
@@ -60,7 +82,7 @@ namespace NTMiner {
                         FillCny(incomeItems, usdCny);
                         NeatenSpeedUnit(incomeItems);
                         if (incomeItems != null && incomeItems.Count != 0) {
-                            RpcRoot.Login(new RpcUser(ServerRoot.HostConfig.RpcLoginName, HashUtil.Sha1(ServerRoot.HostConfig.RpcPassword)));
+                            RpcRoot.Login(new RpcUser(Config.RpcLoginName, HashUtil.Sha1(Config.RpcPassword)));
                             RpcRoot.SetIsOuterNet(false);
                             RpcRoot.OfficialServer.CalcConfigService.GetCalcConfigsAsync(data => {
                                 NTMinerConsole.UserInfo($"NTMiner有{data.Count.ToString()}个币种");

+ 1 - 0
src/CalcConfigUpdater/packages.config

@@ -2,6 +2,7 @@
 <packages>
   <package id="Costura.Fody" version="4.1.0" targetFramework="net452" />
   <package id="Fody" version="6.3.0" targetFramework="net452" developmentDependency="true" />
+  <package id="LiteDB" version="4.1.4" targetFramework="net452" />
   <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net452" />
   <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net452" />
   <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net452" />

+ 0 - 3
src/MinerClient/Daemon/DevConsole.exe.config

@@ -1,3 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup></configuration>

+ 0 - 123
src/MinerClient/Daemon/OpenHardwareMonitorLib.xml

@@ -1,123 +0,0 @@
-<?xml version="1.0"?>
-<doc>
-    <assembly>
-        <name>OpenHardwareMonitorLib</name>
-    </assembly>
-    <members>
-        <member name="M:OpenHardwareMonitor.Hardware.HDD.SmartAttribute.#ctor(System.Byte,System.String)">
-            <summary>
-            Initializes a new instance of the <see cref="T:OpenHardwareMonitor.Hardware.HDD.SmartAttribute"/> class.
-            </summary>
-            <param name="identifier">The SMART identifier of the attribute.</param>
-            <param name="name">The name of the attribute.</param>
-        </member>
-        <member name="M:OpenHardwareMonitor.Hardware.HDD.SmartAttribute.#ctor(System.Byte,System.String,OpenHardwareMonitor.Hardware.HDD.SmartAttribute.RawValueConversion)">
-            <summary>
-            Initializes a new instance of the <see cref="T:OpenHardwareMonitor.Hardware.HDD.SmartAttribute"/> class.
-            </summary>
-            <param name="identifier">The SMART identifier of the attribute.</param>
-            <param name="name">The name of the attribute.</param>
-            <param name="rawValueConversion">A delegate for converting the raw byte 
-            array into a value (or null to use the attribute value).</param>
-        </member>
-        <member name="M:OpenHardwareMonitor.Hardware.HDD.SmartAttribute.#ctor(System.Byte,System.String,OpenHardwareMonitor.Hardware.HDD.SmartAttribute.RawValueConversion,System.Nullable{OpenHardwareMonitor.Hardware.SensorType},System.Int32,System.String,System.Boolean,OpenHardwareMonitor.Hardware.ParameterDescription[])">
-            <summary>
-            Initializes a new instance of the <see cref="T:OpenHardwareMonitor.Hardware.HDD.SmartAttribute"/> class.
-            </summary>
-            <param name="identifier">The SMART identifier of the attribute.</param>
-            <param name="name">The name of the attribute.</param>
-            <param name="rawValueConversion">A delegate for converting the raw byte 
-            array into a value (or null to use the attribute value).</param>
-            <param name="sensorType">Type of the sensor or null if no sensor is to 
-            be created.</param>
-            <param name="sensorChannel">If there exists more than one attribute with 
-            the same sensor channel and type, then a sensor is created only for the  
-            first attribute.</param>
-            <param name="sensorName">The name to be used for the sensor, or null if 
-            no sensor is created.</param>
-            <param name="defaultHiddenSensor">True to hide the sensor initially.</param>
-            <param name="parameterDescriptions">Description for the parameters of the sensor 
-            (or null).</param>
-        </member>
-        <member name="P:OpenHardwareMonitor.Hardware.HDD.SmartAttribute.Identifier">
-            <summary>
-            Gets the SMART identifier.
-            </summary>
-        </member>
-        <member name="T:OpenHardwareMonitor.Hardware.HDD.SmartNames">
-            <summary>
-            Localization class for SMART attribute names.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterCommand.SmartCmd">
-            <summary>
-            SMART data requested.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterCommand.IdCmd">
-            <summary>
-            Identify data is requested.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartReadData">
-            <summary>
-            Read SMART data.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartReadThresholds">
-            <summary>
-            Read SMART thresholds.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartAutosave">
-            <summary>
-            Autosave SMART data.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartSaveAttr">
-            <summary>
-            Save SMART attributes.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartImmediateOffline">
-            <summary>
-            Set SMART to offline immediately.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartReadLog">
-            <summary>
-            Read SMART log.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartWriteLog">
-            <summary>
-            Write SMART log.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartWriteThresholds">
-            <summary>
-            Write SMART thresholds.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartEnableOperations">
-            <summary>
-            Enable SMART.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartDisableOperations">
-            <summary>
-            Disable SMART.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartStatus">
-            <summary>
-            Get SMART status.
-            </summary>
-        </member>
-        <member name="F:OpenHardwareMonitor.Hardware.HDD.WindowsSmart.RegisterFeature.SmartAutoOffline">
-            <summary>
-            Set SMART to offline automatically.
-            </summary>
-        </member>
-    </members>
-</doc>

二进制
src/MinerClient/Daemon/WinDivert.dll


二进制
src/MinerClient/Daemon/WinDivert64.sys


+ 0 - 63
src/MinerClient/NoDevFee/System.Net.Http.WebRequest.xml

@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<doc>
-  <assembly>
-    <name>System.Net.Http.WebRequest</name>
-  </assembly>
-  <members>
-    <member name="T:System.Net.Http.RtcRequestFactory">
-      <summary>Represents the class that is used to create special <see cref="T:System.Net.Http.HttpRequestMessage" /> for use with the Real-Time-Communications (RTC) background notification infrastructure.</summary>
-    </member>
-    <member name="M:System.Net.Http.RtcRequestFactory.Create(System.Net.Http.HttpMethod,System.Uri)">
-      <summary>Creates a special <see cref="T:System.Net.Http.HttpRequestMessage" /> for use with the Real-Time-Communications (RTC) background notification infrastructure.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpRequestMessage" />.An HTTP request message for use with the RTC background notification infrastructure.</returns>
-      <param name="method">The HTTP method.</param>
-      <param name="uri">The Uri the request is sent to.</param>
-    </member>
-    <member name="T:System.Net.Http.WebRequestHandler">
-      <summary>Provides desktop-specific features not available to Windows Store apps or other environments. </summary>
-    </member>
-    <member name="M:System.Net.Http.WebRequestHandler.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.WebRequestHandler" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.AllowPipelining">
-      <summary> Gets or sets a value that indicates whether to pipeline the request to the Internet resource.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the request should be pipelined; otherwise, false. The default is true. </returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.AuthenticationLevel">
-      <summary>Gets or sets a value indicating the level of authentication and impersonation used for this request.</summary>
-      <returns>Returns <see cref="T:System.Net.Security.AuthenticationLevel" />.A bitwise combination of the <see cref="T:System.Net.Security.AuthenticationLevel" /> values.  The default value is <see cref="F:System.Net.Security.AuthenticationLevel.MutualAuthRequested" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.CachePolicy">
-      <summary>Gets or sets the cache policy for this request.</summary>
-      <returns>Returns <see cref="T:System.Net.Cache.RequestCachePolicy" />.A <see cref="T:System.Net.Cache.RequestCachePolicy" /> object that defines a cache policy. The default is <see cref="P:System.Net.WebRequest.DefaultCachePolicy" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.ClientCertificates">
-      <summary>Gets or sets the collection of security certificates that are associated with this request.</summary>
-      <returns>Returns <see cref="T:System.Security.Cryptography.X509Certificates.X509CertificateCollection" />.The collection of security certificates associated with this request.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.ContinueTimeout">
-      <summary>Gets or sets the amount of time, in milliseconds, the application will wait for 100-continue from the server before uploading data.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The amount of time, in milliseconds, the application will wait for 100-continue from the server before uploading data. The default value is 350 milliseconds.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.ImpersonationLevel">
-      <summary>Gets or sets the impersonation level for the current request.</summary>
-      <returns>Returns <see cref="T:System.Security.Principal.TokenImpersonationLevel" />.The impersonation level for the request. The default is <see cref="F:System.Security.Principal.TokenImpersonationLevel.Delegation" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.MaxResponseHeadersLength">
-      <summary>Gets or sets the maximum allowed length of the response headers.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The length, in kilobytes (1024 bytes), of the response headers.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.ReadWriteTimeout">
-      <summary>Gets or sets a time-out in milliseconds when writing a request to or reading a response from a server.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The number of milliseconds before the writing or reading times out. The default value is 300,000 milliseconds (5 minutes). </returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.ServerCertificateValidationCallback">
-      <summary>Gets or sets a callback method to validate the server certificate.</summary>
-      <returns>Returns <see cref="T:System.Net.Security.RemoteCertificateValidationCallback" />.A callback method to validate the server certificate.</returns>
-    </member>
-    <member name="P:System.Net.Http.WebRequestHandler.UnsafeAuthenticatedConnectionSharing">
-      <summary>Gets or sets a value that indicates whether to allow high-speed NTLM-authenticated connection sharing.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true to keep the authenticated connection open; otherwise, false.</returns>
-    </member>
-  </members>
-</doc>

+ 0 - 2308
src/MinerClient/NoDevFee/System.Net.Http.xml

@@ -1,2308 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<doc>
-  <assembly>
-    <name>System.Net.Http</name>
-  </assembly>
-  <members>
-    <member name="T:System.Net.Http.ByteArrayContent">
-      <summary>Provides HTTP content based on a byte array.</summary>
-    </member>
-    <member name="M:System.Net.Http.ByteArrayContent.#ctor(System.Byte[])">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.ByteArrayContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.ByteArrayContent" />.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> parameter is null. </exception>
-    </member>
-    <member name="M:System.Net.Http.ByteArrayContent.#ctor(System.Byte[],System.Int32,System.Int32)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.ByteArrayContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.ByteArrayContent" />.</param>
-      <param name="offset">The offset, in bytes, in the <paramref name="content" />  parameter used to initialize the <see cref="T:System.Net.Http.ByteArrayContent" />.</param>
-      <param name="count">The number of bytes in the <paramref name="content" /> starting from the <paramref name="offset" /> parameter used to initialize the <see cref="T:System.Net.Http.ByteArrayContent" />.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> parameter is null. </exception>
-      <exception cref="T:System.ArgumentOutOfRangeException">The <paramref name="offset" /> parameter is less than zero.-or-The <paramref name="offset" /> parameter is greater than the length of content specified by the <paramref name="content" /> parameter.-or-The <paramref name="count " /> parameter is less than zero.-or-The <paramref name="count" /> parameter is greater than the length of content specified by the <paramref name="content" /> parameter - minus the <paramref name="offset" /> parameter.</exception>
-    </member>
-    <member name="M:System.Net.Http.ByteArrayContent.CreateContentReadStreamAsync">
-      <summary>Creates an HTTP content stream as an asynchronous operation for reading whose backing store is memory from the <see cref="T:System.Net.Http.ByteArrayContent" />.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.ByteArrayContent.SerializeToStreamAsync(System.IO.Stream,System.Net.TransportContext)">
-      <summary>Serialize and write the byte array provided in the constructor to an HTTP content stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />. The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-      <param name="context">Information about the transport, like channel binding token. This parameter may be null.</param>
-    </member>
-    <member name="M:System.Net.Http.ByteArrayContent.TryComputeLength(System.Int64@)">
-      <summary>Determines whether a byte array has a valid length in bytes.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="length" /> is a valid length; otherwise, false.</returns>
-      <param name="length">The length in bytes of the byte array.</param>
-    </member>
-    <member name="T:System.Net.Http.ClientCertificateOption">
-      <summary>Specifies how client certificates are provided.</summary>
-    </member>
-    <member name="F:System.Net.Http.ClientCertificateOption.Manual">
-      <summary>The application manually provides the client certificates to the <see cref="T:System.Net.Http.WebRequestHandler" />. This value is the default. </summary>
-    </member>
-    <member name="F:System.Net.Http.ClientCertificateOption.Automatic">
-      <summary>The <see cref="T:System.Net.Http.HttpClientHandler" /> will attempt to provide  all available client certificates  automatically.</summary>
-    </member>
-    <member name="T:System.Net.Http.DelegatingHandler">
-      <summary>A base type for HTTP handlers that delegate the processing of HTTP response messages to another handler, called the inner handler.</summary>
-    </member>
-    <member name="M:System.Net.Http.DelegatingHandler.#ctor">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.DelegatingHandler" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.DelegatingHandler.#ctor(System.Net.Http.HttpMessageHandler)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.DelegatingHandler" /> class with a specific inner handler.</summary>
-      <param name="innerHandler">The inner handler which is responsible for processing the HTTP response messages.</param>
-    </member>
-    <member name="M:System.Net.Http.DelegatingHandler.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.DelegatingHandler" />, and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources. </param>
-    </member>
-    <member name="P:System.Net.Http.DelegatingHandler.InnerHandler">
-      <summary>Gets or sets the inner handler which processes the HTTP response messages.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMessageHandler" />.The inner handler for HTTP response messages.</returns>
-    </member>
-    <member name="M:System.Net.Http.DelegatingHandler.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Sends an HTTP request to the inner handler to send to the server as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />. The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send to the server.</param>
-      <param name="cancellationToken">A cancellation token to cancel operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-    </member>
-    <member name="T:System.Net.Http.FormUrlEncodedContent">
-      <summary>A container for name/value tuples encoded using application/x-www-form-urlencoded MIME type.</summary>
-    </member>
-    <member name="M:System.Net.Http.FormUrlEncodedContent.#ctor(System.Collections.Generic.IEnumerable{System.Collections.Generic.KeyValuePair{System.String,System.String}})">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.FormUrlEncodedContent" /> class with a specific collection of name/value pairs.</summary>
-      <param name="nameValueCollection">A collection of name/value pairs.</param>
-    </member>
-    <member name="T:System.Net.Http.HttpClient">
-      <summary>Provides a base class for sending HTTP requests and receiving HTTP responses from a resource identified by a URI. </summary>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpClient" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.#ctor(System.Net.Http.HttpMessageHandler)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpClient" /> class with a specific handler.</summary>
-      <param name="handler">The HTTP handler stack to use for sending requests. </param>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.#ctor(System.Net.Http.HttpMessageHandler,System.Boolean)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpClient" /> class with a specific handler.</summary>
-      <param name="handler">The <see cref="T:System.Net.Http.HttpMessageHandler" /> responsible for processing the HTTP response messages.</param>
-      <param name="disposeHandler">true if the inner handler should be disposed of by Dispose(),false if you intend to reuse the inner handler.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpClient.BaseAddress">
-      <summary>Gets or sets the base address of Uniform Resource Identifier (URI) of the Internet resource used when sending requests.</summary>
-      <returns>Returns <see cref="T:System.Uri" />.The base address of Uniform Resource Identifier (URI) of the Internet resource used when sending requests.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.CancelPendingRequests">
-      <summary>Cancel all pending requests on this instance.</summary>
-    </member>
-    <member name="P:System.Net.Http.HttpClient.DefaultRequestHeaders">
-      <summary>Gets the headers which should be sent with each request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpRequestHeaders" />.The headers which should be sent with each request.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.DeleteAsync(System.String)">
-      <summary>Send a DELETE request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.DeleteAsync(System.String,System.Threading.CancellationToken)">
-      <summary>Send a DELETE request to the specified Uri with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.DeleteAsync(System.Uri)">
-      <summary>Send a DELETE request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.DeleteAsync(System.Uri,System.Threading.CancellationToken)">
-      <summary>Send a DELETE request to the specified Uri with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpClient" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.String)">
-      <summary>Send a GET request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.String,System.Net.Http.HttpCompletionOption)">
-      <summary>Send a GET request to the specified Uri with an HTTP completion option as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="completionOption">An HTTP completion option value that indicates when the operation should be considered completed.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.String,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken)">
-      <summary>Send a GET request to the specified Uri with an HTTP completion option and a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="completionOption">An HTTP  completion option value that indicates when the operation should be considered completed.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.String,System.Threading.CancellationToken)">
-      <summary>Send a GET request to the specified Uri with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.Uri)">
-      <summary>Send a GET request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.Uri,System.Net.Http.HttpCompletionOption)">
-      <summary>Send a GET request to the specified Uri with an HTTP completion option as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="completionOption">An HTTP  completion option value that indicates when the operation should be considered completed.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.Uri,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken)">
-      <summary>Send a GET request to the specified Uri with an HTTP completion option and a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="completionOption">An HTTP  completion option value that indicates when the operation should be considered completed.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetAsync(System.Uri,System.Threading.CancellationToken)">
-      <summary>Send a GET request to the specified Uri with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetByteArrayAsync(System.String)">
-      <summary>Send a GET request to the specified Uri and return the response body as a byte array in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetByteArrayAsync(System.Uri)">
-      <summary>Send a GET request to the specified Uri and return the response body as a byte array in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetStreamAsync(System.String)">
-      <summary>Send a GET request to the specified Uri and return the response body as a stream in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetStreamAsync(System.Uri)">
-      <summary>Send a GET request to the specified Uri and return the response body as a stream in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetStringAsync(System.String)">
-      <summary>Send a GET request to the specified Uri and return the response body as a string in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.GetStringAsync(System.Uri)">
-      <summary>Send a GET request to the specified Uri and return the response body as a string in an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="P:System.Net.Http.HttpClient.MaxResponseContentBufferSize">
-      <summary>Gets or sets the maximum number of bytes to buffer when reading the response content.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The maximum number of bytes to buffer when reading the response content. The default value for this property is 64K.</returns>
-      <exception cref="T:System.ArgumentOutOfRangeException">The size specified is less than or equal to zero.</exception>
-      <exception cref="T:System.InvalidOperationException">An operation has already been started on the current instance. </exception>
-      <exception cref="T:System.ObjectDisposedException">The current instance has been disposed. </exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PostAsync(System.String,System.Net.Http.HttpContent)">
-      <summary>Send a POST request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PostAsync(System.String,System.Net.Http.HttpContent,System.Threading.CancellationToken)">
-      <summary>Send a POST request with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PostAsync(System.Uri,System.Net.Http.HttpContent)">
-      <summary>Send a POST request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PostAsync(System.Uri,System.Net.Http.HttpContent,System.Threading.CancellationToken)">
-      <summary>Send a POST request with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PutAsync(System.String,System.Net.Http.HttpContent)">
-      <summary>Send a PUT request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PutAsync(System.String,System.Net.Http.HttpContent,System.Threading.CancellationToken)">
-      <summary>Send a PUT request with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PutAsync(System.Uri,System.Net.Http.HttpContent)">
-      <summary>Send a PUT request to the specified Uri as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.PutAsync(System.Uri,System.Net.Http.HttpContent,System.Threading.CancellationToken)">
-      <summary>Send a PUT request with a cancellation token as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="requestUri">The Uri the request is sent to.</param>
-      <param name="content">The HTTP request content sent to the server.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="requestUri" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage)">
-      <summary>Send an HTTP request as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-      <exception cref="T:System.InvalidOperationException">The request message was already sent by the <see cref="T:System.Net.Http.HttpClient" /> instance.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption)">
-      <summary>Send an HTTP request as an asynchronous operation. </summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <param name="completionOption">When the operation should complete (as soon as a response is available or after reading the whole response content).</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-      <exception cref="T:System.InvalidOperationException">The request message was already sent by the <see cref="T:System.Net.Http.HttpClient" /> instance.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage,System.Net.Http.HttpCompletionOption,System.Threading.CancellationToken)">
-      <summary>Send an HTTP request as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <param name="completionOption">When the operation should complete (as soon as a response is available or after reading the whole response content).</param>
-      <param name="cancellationToken">The cancellation token to cancel operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-      <exception cref="T:System.InvalidOperationException">The request message was already sent by the <see cref="T:System.Net.Http.HttpClient" /> instance.</exception>
-    </member>
-    <member name="M:System.Net.Http.HttpClient.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Send an HTTP request as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <param name="cancellationToken">The cancellation token to cancel operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-      <exception cref="T:System.InvalidOperationException">The request message was already sent by the <see cref="T:System.Net.Http.HttpClient" /> instance.</exception>
-    </member>
-    <member name="P:System.Net.Http.HttpClient.Timeout">
-      <summary>Gets or sets the number of milliseconds to wait before the request times out.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The number of milliseconds to wait before the request times out.</returns>
-      <exception cref="T:System.ArgumentOutOfRangeException">The timeout specified is less than or equal to zero and is not <see cref="F:System.Threading.Timeout.Infinite" />.</exception>
-      <exception cref="T:System.InvalidOperationException">An operation has already been started on the current instance. </exception>
-      <exception cref="T:System.ObjectDisposedException">The current instance has been disposed.</exception>
-    </member>
-    <member name="T:System.Net.Http.HttpClientHandler">
-      <summary>The default message handler used by <see cref="T:System.Net.Http.HttpClient" />.  </summary>
-    </member>
-    <member name="M:System.Net.Http.HttpClientHandler.#ctor">
-      <summary>Creates an instance of a <see cref="T:System.Net.Http.HttpClientHandler" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.AllowAutoRedirect">
-      <summary>Gets or sets a value that indicates whether the handler should follow redirection responses.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the if the handler should follow redirection responses; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.AutomaticDecompression">
-      <summary>Gets or sets the type of decompression method used by the handler for automatic decompression of the HTTP content response.</summary>
-      <returns>Returns <see cref="T:System.Net.DecompressionMethods" />.The automatic decompression method used by the handler. The default value is <see cref="F:System.Net.DecompressionMethods.None" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.ClientCertificateOptions">
-      <summary>Gets or sets the collection of security certificates that are associated with this handler.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.ClientCertificateOption" />.The collection of security certificates associated with this handler.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.CookieContainer">
-      <summary>Gets or sets the cookie container used to store server cookies by the handler.</summary>
-      <returns>Returns <see cref="T:System.Net.CookieContainer" />.The cookie container used to store server cookies by the handler.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.Credentials">
-      <summary>Gets or sets authentication information used by this handler.</summary>
-      <returns>Returns <see cref="T:System.Net.ICredentials" />.The authentication credentials associated with the handler. The default is null.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpClientHandler.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpClientHandler" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.MaxAutomaticRedirections">
-      <summary>Gets or sets the maximum number of redirects that the handler follows.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The maximum number of redirection responses that the handler follows. The default value is 50.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.MaxRequestContentBufferSize">
-      <summary>Gets or sets the maximum request content buffer size used by the handler.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The maximum request content buffer size in bytes. The default value is 65,536 bytes.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.PreAuthenticate">
-      <summary>Gets or sets a value that indicates whether the handler sends an Authorization header with the request.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true for the handler to send an HTTP Authorization header with requests after authentication has taken place; otherwise, false. The default is false.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.Proxy">
-      <summary>Gets or sets proxy information used by the handler.</summary>
-      <returns>Returns <see cref="T:System.Net.IWebProxy" />.The proxy information used by the handler. The default value is null.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpClientHandler.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Creates an instance of  <see cref="T:System.Net.Http.HttpResponseMessage" /> based on the information provided in the <see cref="T:System.Net.Http.HttpRequestMessage" /> as an operation that will not block.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message.</param>
-      <param name="cancellationToken">A cancellation token to cancel the operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.SupportsAutomaticDecompression">
-      <summary>Gets a value that indicates whether the handler supports automatic response content decompression.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the if the handler supports automatic response content decompression; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.SupportsProxy">
-      <summary>Gets a value that indicates whether the handler supports proxy settings.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the if the handler supports proxy settings; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.SupportsRedirectConfiguration">
-      <summary>Gets a value that indicates whether the handler supports configuration settings for the <see cref="P:System.Net.Http.HttpClientHandler.AllowAutoRedirect" /> and <see cref="P:System.Net.Http.HttpClientHandler.MaxAutomaticRedirections" /> properties.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the if the handler supports configuration settings for the <see cref="P:System.Net.Http.HttpClientHandler.AllowAutoRedirect" /> and <see cref="P:System.Net.Http.HttpClientHandler.MaxAutomaticRedirections" /> properties; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.UseCookies">
-      <summary>Gets or sets a value that indicates whether the handler uses the  <see cref="P:System.Net.Http.HttpClientHandler.CookieContainer" /> property  to store server cookies and uses these cookies when sending requests.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the if the handler supports uses the  <see cref="P:System.Net.Http.HttpClientHandler.CookieContainer" /> property  to store server cookies and uses these cookies when sending requests; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.UseDefaultCredentials">
-      <summary>Gets or sets a value that controls whether default credentials are sent with requests by the handler.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the default credentials are used; otherwise false. The default value is false.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpClientHandler.UseProxy">
-      <summary>Gets or sets a value that indicates whether the handler uses a proxy for requests. </summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the handler should use a proxy for requests; otherwise false. The default value is true.</returns>
-    </member>
-    <member name="T:System.Net.Http.HttpCompletionOption">
-      <summary>Indicates if <see cref="T:System.Net.Http.HttpClient" /> operations should be considered completed either as soon as a response is available, or after reading the entire response message including the content. </summary>
-    </member>
-    <member name="F:System.Net.Http.HttpCompletionOption.ResponseContentRead">
-      <summary>The operation should complete after reading the entire response including the content.</summary>
-    </member>
-    <member name="F:System.Net.Http.HttpCompletionOption.ResponseHeadersRead">
-      <summary>The operation should complete as soon as a response is available and headers are read. The content is not read yet. </summary>
-    </member>
-    <member name="T:System.Net.Http.HttpContent">
-      <summary>A base class representing an HTTP entity body and content headers.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpContent" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream)">
-      <summary>Write the HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.CopyToAsync(System.IO.Stream,System.Net.TransportContext)">
-      <summary>Write the HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-      <param name="context">Information about the transport (channel binding token, for example). This parameter may be null.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.CreateContentReadStreamAsync">
-      <summary>Write the HTTP content to a memory stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.Dispose">
-      <summary>Releases the unmanaged resources and disposes of the managed resources used by the <see cref="T:System.Net.Http.HttpContent" />.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpContent" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpContent.Headers">
-      <summary>Gets the HTTP content headers as defined in RFC 2616.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpContentHeaders" />.The content headers as defined in RFC 2616.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.LoadIntoBufferAsync">
-      <summary>Serialize the HTTP content to a memory buffer as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.LoadIntoBufferAsync(System.Int64)">
-      <summary>Serialize the HTTP content to a memory buffer as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="maxBufferSize">The maximum size, in bytes, of the buffer to use.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.ReadAsByteArrayAsync">
-      <summary>Write the HTTP content to a byte array as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.ReadAsStreamAsync">
-      <summary>Write the HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.ReadAsStringAsync">
-      <summary>Write the HTTP content to a string as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.SerializeToStreamAsync(System.IO.Stream,System.Net.TransportContext)">
-      <summary>Serialize the HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-      <param name="context">Information about the transport (channel binding token, for example). This parameter may be null.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpContent.TryComputeLength(System.Int64@)">
-      <summary>Determines whether the HTTP content has a valid length in bytes.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="length" /> is a valid length; otherwise, false.</returns>
-      <param name="length">The length in bytes of the HHTP content.</param>
-    </member>
-    <member name="T:System.Net.Http.HttpMessageHandler">
-      <summary>A base type for HTTP message handlers.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageHandler.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpMessageHandler" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageHandler.Dispose">
-      <summary>Releases the unmanaged resources and disposes of the managed resources used by the <see cref="T:System.Net.Http.HttpMessageHandler" />.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageHandler.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpMessageHandler" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageHandler.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Send an HTTP request as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <param name="cancellationToken">The cancellation token to cancel operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-    </member>
-    <member name="T:System.Net.Http.HttpMessageInvoker">
-      <summary>The base type for <see cref="T:System.Net.Http.HttpClient" /> and other message originators.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageInvoker.#ctor(System.Net.Http.HttpMessageHandler)">
-      <summary>Initializes an instance of a <see cref="T:System.Net.Http.HttpMessageInvoker" /> class with a specific <see cref="T:System.Net.Http.HttpMessageHandler" />.</summary>
-      <param name="handler">The <see cref="T:System.Net.Http.HttpMessageHandler" /> responsible for processing the HTTP response messages.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageInvoker.#ctor(System.Net.Http.HttpMessageHandler,System.Boolean)">
-      <summary>Initializes an instance of a <see cref="T:System.Net.Http.HttpMessageInvoker" /> class with a specific <see cref="T:System.Net.Http.HttpMessageHandler" />.</summary>
-      <param name="handler">The <see cref="T:System.Net.Http.HttpMessageHandler" /> responsible for processing the HTTP response messages.</param>
-      <param name="disposeHandler">true if the inner handler should be disposed of by Dispose(),false if you intend to reuse the inner handler.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageInvoker.Dispose">
-      <summary>Releases the unmanaged resources and disposes of the managed resources used by the <see cref="T:System.Net.Http.HttpMessageInvoker" />.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageInvoker.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpMessageInvoker" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMessageInvoker.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Send an HTTP request as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send.</param>
-      <param name="cancellationToken">The cancellation token to cancel operation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-    </member>
-    <member name="T:System.Net.Http.HttpMethod">
-      <summary>A helper class for retrieving and comparing standard HTTP methods.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpMethod" /> class with a specific HTTP method.</summary>
-      <param name="method">The HTTP method.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Delete">
-      <summary>Represents an HTTP DELETE protocol method.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.Equals(System.Net.Http.HttpMethod)">
-      <summary>Determines whether the specified <see cref="T:System.Net.Http.HttpMethod" /> is equal to the current <see cref="T:System.Object" />.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified object is equal to the current object; otherwise, false.</returns>
-      <param name="other">The HTTP method to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Object" />.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified object is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Get">
-      <summary>Represents an HTTP GET protocol method.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.GetHashCode">
-      <summary>Serves as a hash function for this type.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current <see cref="T:System.Object" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Head">
-      <summary>Represents an HTTP HEAD protocol method. The HEAD method is identical to GET except that the server only returns message-headers in the response, without a message-body.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Method">
-      <summary>An HTTP method. </summary>
-      <returns>Returns <see cref="T:System.String" />.An HTTP method represented as a <see cref="T:System.String" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.op_Equality(System.Net.Http.HttpMethod,System.Net.Http.HttpMethod)">
-      <summary>The equality operator for comparing two <see cref="T:System.Net.Http.HttpMethod" /> objects.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <paramref name="left" /> and <paramref name="right" /> parameters are equal; otherwise, false.</returns>
-      <param name="left">The left <see cref="T:System.Net.Http.HttpMethod" /> to an equality operator.</param>
-      <param name="right">The right  <see cref="T:System.Net.Http.HttpMethod" /> to an equality operator.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.op_Inequality(System.Net.Http.HttpMethod,System.Net.Http.HttpMethod)">
-      <summary>The inequality operator for comparing two <see cref="T:System.Net.Http.HttpMethod" /> objects.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <paramref name="left" /> and <paramref name="right" /> parameters are inequal; otherwise, false.</returns>
-      <param name="left">The left <see cref="T:System.Net.Http.HttpMethod" /> to an inequality operator.</param>
-      <param name="right">The right  <see cref="T:System.Net.Http.HttpMethod" /> to an inequality operator.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Options">
-      <summary>Represents an HTTP OPTIONS protocol method.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Post">
-      <summary>Represents an HTTP POST protocol method that is used to post a new entity as an addition to a URI.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Put">
-      <summary>Represents an HTTP PUT protocol method that is used to replace an entity identified by a URI.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpMethod.ToString">
-      <summary>Returns a string that represents the current object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string representing the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpMethod.Trace">
-      <summary>Represents an HTTP TRACE protocol method.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.</returns>
-    </member>
-    <member name="T:System.Net.Http.HttpRequestException">
-      <summary>A base class for exceptions thrown by the <see cref="T:System.Net.Http.HttpClient" /> and <see cref="T:System.Net.Http.HttpMessageHandler" /> classes.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestException.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestException" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestException.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestException" /> class with a specific message that describes the current exception.</summary>
-      <param name="message">A message that describes the current exception.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestException.#ctor(System.String,System.Exception)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestException" /> class with a specific message that describes the current exception and an inner exception.</summary>
-      <param name="message">A message that describes the current exception.</param>
-      <param name="inner">The inner exception.</param>
-    </member>
-    <member name="T:System.Net.Http.HttpRequestMessage">
-      <summary>Represents a HTTP request message.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestMessage" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.#ctor(System.Net.Http.HttpMethod,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestMessage" /> class with an HTTP method and a request <see cref="T:System.Uri" />.</summary>
-      <param name="method">The HTTP method.</param>
-      <param name="requestUri">A string that represents the request  <see cref="T:System.Uri" />.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.#ctor(System.Net.Http.HttpMethod,System.Uri)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpRequestMessage" /> class with an HTTP method and a request <see cref="T:System.Uri" />.</summary>
-      <param name="method">The HTTP method.</param>
-      <param name="requestUri">The <see cref="T:System.Uri" /> to request.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.Content">
-      <summary>Gets or sets the contents of the HTTP message. </summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpContent" />.The content of a message</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.Dispose">
-      <summary>Releases the unmanaged resources and disposes of the managed resources used by the <see cref="T:System.Net.Http.HttpRequestMessage" />.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpRequestMessage" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.Headers">
-      <summary>Gets the collection of HTTP request headers.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpRequestHeaders" />.The collection of HTTP request headers.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.Method">
-      <summary>Gets or sets the HTTP method used by the HTTP request message.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpMethod" />.The HTTP method used by the request message. The default is the GET method.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.Properties">
-      <summary>Gets a set of properties for the HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.IDictionary`2" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.RequestUri">
-      <summary>Gets or sets the <see cref="T:System.Uri" /> used for the HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Uri" />.The <see cref="T:System.Uri" /> used for the HTTP request.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpRequestMessage.ToString">
-      <summary>Returns a string that represents the current object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string representation of the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpRequestMessage.Version">
-      <summary>Gets or sets the HTTP message version.</summary>
-      <returns>Returns <see cref="T:System.Version" />.The HTTP message version. The default is 1.1.</returns>
-    </member>
-    <member name="T:System.Net.Http.HttpResponseMessage">
-      <summary>Represents a HTTP response message.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpResponseMessage" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.#ctor(System.Net.HttpStatusCode)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpResponseMessage" /> class with a specific <see cref="P:System.Net.Http.HttpResponseMessage.StatusCode" />.</summary>
-      <param name="statusCode">The status code of the HTTP response.</param>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.Content">
-      <summary>Gets or sets the content of a HTTP response message. </summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpContent" />.The content of the HTTP response message.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.Dispose">
-      <summary>Releases the unmanaged resources and disposes of unmanaged resources used by the <see cref="T:System.Net.Http.HttpResponseMessage" />.</summary>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.HttpResponseMessage" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode">
-      <summary>Throws an exception if the <see cref="P:System.Net.Http.HttpResponseMessage.IsSuccessStatusCode" /> property for the HTTP response is false.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpResponseMessage" />.The HTTP response message if the call is successful.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.Headers">
-      <summary>Gets the collection of HTTP response headers. </summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpResponseHeaders" />.The collection of HTTP response headers.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.IsSuccessStatusCode">
-      <summary>Gets a value that indicates if the HTTP response was successful.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.A value that indicates if the HTTP response was successful. true if <see cref="P:System.Net.Http.HttpResponseMessage.StatusCode" /> was in the range 200-299; otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.ReasonPhrase">
-      <summary>Gets or sets the reason phrase which typically is sent by servers together with the status code. </summary>
-      <returns>Returns <see cref="T:System.String" />.The reason phrase sent by the server.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.RequestMessage">
-      <summary>Gets or sets the request message which led to this response message.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpRequestMessage" />.The request message which led to this response message.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.StatusCode">
-      <summary>Gets or sets the status code of the HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.HttpStatusCode" />.The status code of the HTTP response.</returns>
-    </member>
-    <member name="M:System.Net.Http.HttpResponseMessage.ToString">
-      <summary>Returns a string that represents the current object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string representation of the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.HttpResponseMessage.Version">
-      <summary>Gets or sets the HTTP message version. </summary>
-      <returns>Returns <see cref="T:System.Version" />.The HTTP message version. The default is 1.1. </returns>
-    </member>
-    <member name="T:System.Net.Http.MessageProcessingHandler">
-      <summary>A base type for handlers which only do some small processing of request and/or response messages.</summary>
-    </member>
-    <member name="M:System.Net.Http.MessageProcessingHandler.#ctor">
-      <summary>Creates an instance of a <see cref="T:System.Net.Http.MessageProcessingHandler" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.MessageProcessingHandler.#ctor(System.Net.Http.HttpMessageHandler)">
-      <summary>Creates an instance of a <see cref="T:System.Net.Http.MessageProcessingHandler" /> class with a specific inner handler.</summary>
-      <param name="innerHandler">The inner handler which is responsible for processing the HTTP response messages.</param>
-    </member>
-    <member name="M:System.Net.Http.MessageProcessingHandler.ProcessRequest(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Processes an HTTP request message.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpRequestMessage" />.The HTTP request message that was processed.</returns>
-      <param name="request">The HTTP request message to process.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-    </member>
-    <member name="M:System.Net.Http.MessageProcessingHandler.ProcessResponse(System.Net.Http.HttpResponseMessage,System.Threading.CancellationToken)">
-      <summary>Processes an HTTP response message.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.HttpResponseMessage" />.The HTTP response message that was processed.</returns>
-      <param name="response">The HTTP response message to process.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-    </member>
-    <member name="M:System.Net.Http.MessageProcessingHandler.SendAsync(System.Net.Http.HttpRequestMessage,System.Threading.CancellationToken)">
-      <summary>Sends an HTTP request to the inner handler to send to the server as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-      <param name="request">The HTTP request message to send to the server.</param>
-      <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="request" /> was null.</exception>
-    </member>
-    <member name="T:System.Net.Http.MultipartContent">
-      <summary>Provides a collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized using the multipart/* content type specification.</summary>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.#ctor">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.MultipartContent" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.#ctor(System.String)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.MultipartContent" /> class.</summary>
-      <param name="subtype">The subtype of the multipart content.</param>
-      <exception cref="T:System.ArgumentException">The <paramref name="subtype" /> was null or contains only white space characters.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.#ctor(System.String,System.String)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.MultipartContent" /> class.</summary>
-      <param name="subtype">The subtype of the multipart content.</param>
-      <param name="boundary">The boundary string for the multipart content.</param>
-      <exception cref="T:System.ArgumentException">The <paramref name="subtype" /> was null or an empty string.The <paramref name="boundary" /> was null or contains only white space characters.-or-The <paramref name="boundary" /> ends with a space character.</exception>
-      <exception cref="T:System.OutOfRangeException">The length of the <paramref name="boundary" /> was greater than 70.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.Add(System.Net.Http.HttpContent)">
-      <summary>Add multipart HTTP content to a collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized using the multipart/* content type specification.</summary>
-      <param name="content">The HTTP content to add to the collection.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.MultipartContent" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.GetEnumerator">
-      <summary>Returns an enumerator that iterates through the collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized using the multipart/* content type specification..</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.IEnumerator`1" />.An object that can be used to iterate through the collection.</returns>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.SerializeToStreamAsync(System.IO.Stream,System.Net.TransportContext)">
-      <summary>Serialize the multipart HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-      <param name="context">Information about the transport (channel binding token, for example). This parameter may be null.</param>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.System#Collections#IEnumerable#GetEnumerator">
-      <summary>The explicit implementation of the <see cref="M:System.Net.Http.MultipartContent.GetEnumerator" /> method.</summary>
-      <returns>Returns <see cref="T:System.Collections.IEnumerator" />.An object that can be used to iterate through the collection.</returns>
-    </member>
-    <member name="M:System.Net.Http.MultipartContent.TryComputeLength(System.Int64@)">
-      <summary>Determines whether the HTTP multipart content has a valid length in bytes.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="length" /> is a valid length; otherwise, false.</returns>
-      <param name="length">The length in bytes of the HHTP content.</param>
-    </member>
-    <member name="T:System.Net.Http.MultipartFormDataContent">
-      <summary>Provides a container for content encoded using multipart/form-data MIME type.</summary>
-    </member>
-    <member name="M:System.Net.Http.MultipartFormDataContent.#ctor">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.MultipartFormDataContent" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.MultipartFormDataContent.#ctor(System.String)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.MultipartFormDataContent" /> class.</summary>
-      <param name="boundary">The boundary string for the multipart form data content.</param>
-      <exception cref="T:System.ArgumentException">The <paramref name="boundary" /> was null or contains only white space characters.-or-The <paramref name="boundary" /> ends with a space character.</exception>
-      <exception cref="T:System.OutOfRangeException">The length of the <paramref name="boundary" /> was greater than 70.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartFormDataContent.Add(System.Net.Http.HttpContent)">
-      <summary>Add HTTP content to a collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized to multipart/form-data MIME type.</summary>
-      <param name="content">The HTTP content to add to the collection.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartFormDataContent.Add(System.Net.Http.HttpContent,System.String)">
-      <summary>Add HTTP content to a collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized to multipart/form-data MIME type.</summary>
-      <param name="content">The HTTP content to add to the collection.</param>
-      <param name="name">The name for the HTTP content to add.</param>
-      <exception cref="T:System.ArgumentException">The <paramref name="name" /> was null or contains only white space characters.</exception>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> was null.</exception>
-    </member>
-    <member name="M:System.Net.Http.MultipartFormDataContent.Add(System.Net.Http.HttpContent,System.String,System.String)">
-      <summary>Add HTTP content to a collection of <see cref="T:System.Net.Http.HttpContent" /> objects that get serialized to multipart/form-data MIME type.</summary>
-      <param name="content">The HTTP content to add to the collection.</param>
-      <param name="name">The name for the HTTP content to add.</param>
-      <param name="fileName">The file name for the HTTP content to add to the collection.</param>
-      <exception cref="T:System.ArgumentException">The <paramref name="name" /> was null or contains only white space characters.-or-The <paramref name="fileName" /> was null or contains only white space characters.</exception>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> was null.</exception>
-    </member>
-    <member name="T:System.Net.Http.StreamContent">
-      <summary>Provides HTTP content based on a stream.</summary>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.#ctor(System.IO.Stream)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.StreamContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StreamContent" />.</param>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.#ctor(System.IO.Stream,System.Int32)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.StreamContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StreamContent" />.</param>
-      <param name="bufferSize">The size, in bytes, of the buffer for the <see cref="T:System.Net.Http.StreamContent" />.</param>
-      <exception cref="T:System.ArgumentNullException">The <paramref name="content" /> was null.</exception>
-      <exception cref="T:System.OutOfRangeException">The <paramref name="bufferSize" /> was less than or equal to zero. </exception>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.CreateContentReadStreamAsync">
-      <summary>Write the HTTP stream content to a memory stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task`1" />.The task object representing the asynchronous operation.</returns>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.Dispose(System.Boolean)">
-      <summary>Releases the unmanaged resources used by the <see cref="T:System.Net.Http.StreamContent" /> and optionally disposes of the managed resources.</summary>
-      <param name="disposing">true to release both managed and unmanaged resources; false to releases only unmanaged resources.</param>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.SerializeToStreamAsync(System.IO.Stream,System.Net.TransportContext)">
-      <summary>Serialize the HTTP content to a stream as an asynchronous operation.</summary>
-      <returns>Returns <see cref="T:System.Threading.Tasks.Task" />.The task object representing the asynchronous operation.</returns>
-      <param name="stream">The target stream.</param>
-      <param name="context">Information about the transport (channel binding token, for example). This parameter may be null.</param>
-    </member>
-    <member name="M:System.Net.Http.StreamContent.TryComputeLength(System.Int64@)">
-      <summary>Determines whether the stream content has a valid length in bytes.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="length" /> is a valid length; otherwise, false.</returns>
-      <param name="length">The length in bytes of the stream content.</param>
-    </member>
-    <member name="T:System.Net.Http.StringContent">
-      <summary>Provides HTTP content based on a string.</summary>
-    </member>
-    <member name="M:System.Net.Http.StringContent.#ctor(System.String)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.StringContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StringContent" />.</param>
-    </member>
-    <member name="M:System.Net.Http.StringContent.#ctor(System.String,System.Text.Encoding)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.StringContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StringContent" />.</param>
-      <param name="encoding">The encoding to use for the content.</param>
-    </member>
-    <member name="M:System.Net.Http.StringContent.#ctor(System.String,System.Text.Encoding,System.String)">
-      <summary>Creates a new instance of the <see cref="T:System.Net.Http.StringContent" /> class.</summary>
-      <param name="content">The content used to initialize the <see cref="T:System.Net.Http.StringContent" />.</param>
-      <param name="encoding">The encoding to use for the content.</param>
-      <param name="mediaType">The media type to use for the content.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.AuthenticationHeaderValue">
-      <summary>Represents authentication information in Authorization, ProxyAuthorization, WWW-Authenticate, and Proxy-Authenticate header values.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> class.</summary>
-      <param name="scheme">The scheme to use for authorization.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> class.</summary>
-      <param name="scheme">The scheme to use for authorization.</param>
-      <param name="parameter">The credentials containing the authentication information of the user agent for the resource being requested.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object. </param>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an  <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.AuthenticationHeaderValue.Parameter">
-      <summary>Gets the credentials containing the authentication information of the user agent for the resource being requested.</summary>
-      <returns>Returns <see cref="T:System.String" />.The credentials containing the authentication information.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" />.An <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents authentication header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid authentication header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.AuthenticationHeaderValue.Scheme">
-      <summary>Gets the scheme to use for authorization.</summary>
-      <returns>Returns <see cref="T:System.String" />.The scheme to use for authorization.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.AuthenticationHeaderValue.TryParse(System.String,System.Net.Http.Headers.AuthenticationHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.CacheControlHeaderValue">
-      <summary>Represents the value of the Cache-Control header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.Extensions">
-      <summary>Cache-extension tokens, each with an optional assigned value.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.A collection of cache-extension tokens each with an optional assigned value.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for a  <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.MaxAge">
-      <summary>The maximum age, specified in seconds, that the HTTP client is willing to accept a response. </summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The time in seconds. </returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.MaxStale">
-      <summary>Whether an HTTP client is willing to accept a response that has exceeded its expiration time.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the HTTP client is willing to accept a response that has exceed the expiration time; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.MaxStaleLimit">
-      <summary>The maximum time, in seconds, an HTTP client is willing to accept a response that has exceeded its expiration time.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The time in seconds.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.MinFresh">
-      <summary>The freshness lifetime, in seconds, that an HTTP client is willing to accept a response.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The time in seconds.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.MustRevalidate">
-      <summary>Whether the origin server require revalidation of a cache entry on any subsequent use when the cache entry becomes stale.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the origin server requires revalidation of a cache entry on any subsequent use when the entry becomes stale; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.NoCache">
-      <summary>Whether an HTTP client is willing to accept a cached response.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the HTTP client is willing to accept a cached response; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.NoCacheHeaders">
-      <summary>A collection of fieldnames in the "no-cache" directive in a cache-control header field on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.A collection of fieldnames.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.NoStore">
-      <summary>Whether a cache must not store any part of either the HTTP request mressage or any response.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if a cache must not store any part of either the HTTP request mressage or any response; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.NoTransform">
-      <summary>Whether a cache or proxy must not change any aspect of the entity-body.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if a cache or proxy must not change any aspect of the entity-body; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.OnlyIfCached">
-      <summary>Whether a cache should either respond using a cached entry that is consistent with the other constraints of the HTTP request, or respond with a 504 (Gateway Timeout) status.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if a cache should either respond using a cached entry that is consistent with the other constraints of the HTTP request, or respond with a 504 (Gateway Timeout) status; otherwise, false.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" />.A <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents cache-control header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid cache-control header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.Private">
-      <summary>Whether all or part of the HTTP response message is intended for a single user and must not be cached by a shared cache.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the HTTP response message is intended for a single user and must not be cached by a shared cache; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.PrivateHeaders">
-      <summary>A collection fieldnames in the "private" directive in a cache-control header field on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.A collection of fieldnames.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.ProxyRevalidate">
-      <summary>Whether the origin server require revalidation of a cache entry on any subsequent use when the cache entry becomes stale for shared user agent caches.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the origin server requires revalidation of a cache entry on any subsequent use when the entry becomes stale for shared user agent caches; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.Public">
-      <summary>Whether an HTTP response may be cached by any cache, even if it would normally be non-cacheable or cacheable only within a non- shared cache.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the HTTP response may be cached by any cache, even if it would normally be non-cacheable or cacheable only within a non- shared cache; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.CacheControlHeaderValue.SharedMaxAge">
-      <summary>The shared maximum age, specified in seconds, in an HTTP response that overrides the "max-age" directive in a cache-control header or an Expires header for a shared cache.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The time in seconds.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.CacheControlHeaderValue.TryParse(System.String,System.Net.Http.Headers.CacheControlHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.ContentDispositionHeaderValue">
-      <summary>Represents the value of the Content-Disposition header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.#ctor(System.Net.Http.Headers.ContentDispositionHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> class.</summary>
-      <param name="source">A <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />. </param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> class.</summary>
-      <param name="dispositionType">A string that contains a <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.CreationDate">
-      <summary>The date at which   the file was created.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The file creation date.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.DispositionType">
-      <summary>The disposition type for a content body part.</summary>
-      <returns>Returns <see cref="T:System.String" />.The disposition type. </returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />  object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.FileName">
-      <summary>A suggestion for how to construct a filename for   storing the message payload to be used if the entity is   detached and stored in a separate file.</summary>
-      <returns>Returns <see cref="T:System.String" />.A suggested filename.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.FileNameStar">
-      <summary>A suggestion for how to construct filenames for   storing message payloads to be used if the entities are    detached and stored in a separate files.</summary>
-      <returns>Returns <see cref="T:System.String" />.A suggested filename of the form filename*.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an  <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.ModificationDate">
-      <summary>The date at   which the file was last modified. </summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The file modification date.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.Name">
-      <summary>The name for a content body part.</summary>
-      <returns>Returns <see cref="T:System.String" />.The name for the content body part.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.Parameters">
-      <summary>A set of parameters included the Content-Disposition header.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.A collection of parameters. </returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />  instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />.An <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />  instance.</returns>
-      <param name="input">A string that represents content disposition header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid content disposition header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.ReadDate">
-      <summary>The date the file was last read.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The last read date.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentDispositionHeaderValue.Size">
-      <summary>The approximate size, in bytes, of the file. </summary>
-      <returns>Returns <see cref="T:System.Int64" />.The approximate size, in bytes.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />  instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentDispositionHeaderValue.TryParse(System.String,System.Net.Http.Headers.ContentDispositionHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.ContentRangeHeaderValue">
-      <summary>Represents the value of the Content-Range header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.#ctor(System.Int64)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> class.</summary>
-      <param name="length">The starting or ending point of the range, in bytes.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.#ctor(System.Int64,System.Int64)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> class.</summary>
-      <param name="from">The position, in bytes, at which to start sending data.</param>
-      <param name="to">The position, in bytes, at which to stop sending data.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.#ctor(System.Int64,System.Int64,System.Int64)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> class.</summary>
-      <param name="from">The position, in bytes, at which to start sending data.</param>
-      <param name="to">The position, in bytes, at which to stop sending data.</param>
-      <param name="length">The starting or ending point of the range, in bytes.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified Object is equal to the current <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.From">
-      <summary>Gets the position at which to start sending data.</summary>
-      <returns>Returns <see cref="T:System.Int64" />.The position, in bytes, at which to start sending data.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.HasLength">
-      <summary>Gets whether the Content-Range header has a length specified.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Content-Range has a length specified; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.HasRange">
-      <summary>Gets whether the Content-Range has a range specified. </summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Content-Range has a range specified; otherwise, false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.Length">
-      <summary>Gets the length of the full entity-body.</summary>
-      <returns>Returns <see cref="T:System.Int64" />.The length of the full entity-body.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" />.An <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents content range header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid content range header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.To">
-      <summary>Gets the position at which to stop sending data.</summary>
-      <returns>Returns <see cref="T:System.Int64" />.The position at which to stop sending data.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ContentRangeHeaderValue.TryParse(System.String,System.Net.Http.Headers.ContentRangeHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ContentRangeHeaderValue.Unit">
-      <summary>The range units used.</summary>
-      <returns>Returns <see cref="T:System.String" />.A <see cref="T:System.String" /> that contains range units. </returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.EntityTagHeaderValue">
-      <summary>Represents an entity-tag header value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> class.</summary>
-      <param name="tag">A string that contains an <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.#ctor(System.String,System.Boolean)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> class.</summary>
-      <param name="tag">A string that contains an  <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.</param>
-      <param name="isWeak">A value that indicates if this entity-tag header is a weak validator. If the entity-tag header is weak validator, then <paramref name="isWeak" /> should be set to true. If the entity-tag header is a strong validator, then <paramref name="isWeak" /> should be set to false.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.EntityTagHeaderValue.Any">
-      <summary>Gets the entity-tag header value.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.EntityTagHeaderValue.IsWeak">
-      <summary>Gets whether the entity-tag is prefaced by a weakness indicator.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the entity-tag is prefaced by a weakness indicator; otherwise, false.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.An <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents entity tag header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid entity tag header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.EntityTagHeaderValue.Tag">
-      <summary>Gets the opaque quoted string. </summary>
-      <returns>Returns <see cref="T:System.String" />.An opaque quoted string.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.EntityTagHeaderValue.TryParse(System.String,System.Net.Http.Headers.EntityTagHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.HttpContentHeaders">
-      <summary>Represents the collection of Content Headers as defined in RFC 2616.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.Allow">
-      <summary>Gets the value of the Allow content header on an HTTP response. </summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.The value of the Allow header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentDisposition">
-      <summary>Gets the value of the Content-Disposition content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ContentDispositionHeaderValue" />.The value of the Content-Disposition content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentEncoding">
-      <summary>Gets the value of the Content-Encoding content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.The value of the Content-Encoding content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentLanguage">
-      <summary>Gets the value of the Content-Language content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.The value of the Content-Language content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentLength">
-      <summary>Gets or sets the value of the Content-Length content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Int64" />.The value of the Content-Length content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentLocation">
-      <summary>Gets or sets the value of the Content-Location content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Uri" />.The value of the Content-Location content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentMD5">
-      <summary>Gets or sets the value of the Content-MD5 content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Byte" />.The value of the Content-MD5 content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentRange">
-      <summary>Gets or sets the value of the Content-Range content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ContentRangeHeaderValue" />.The value of the Content-Range content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.ContentType">
-      <summary>Gets or sets the value of the Content-Type content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" />.The value of the Content-Type content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.Expires">
-      <summary>Gets or sets the value of the Expires content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the Expires content header on an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpContentHeaders.LastModified">
-      <summary>Gets or sets the value of the Last-Modified content header on an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the Last-Modified content header on an HTTP response.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.HttpHeaders">
-      <summary>A collection of headers and their values as defined in RFC 2616.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.Add(System.String,System.Collections.Generic.IEnumerable{System.String})">
-      <summary>Adds the specified header and its values into the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <param name="name">The header to add to the collection.</param>
-      <param name="values">A list of header values to add to the collection.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.Add(System.String,System.String)">
-      <summary>Adds the specified header and its value into the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <param name="name">The header to add to the collection.</param>
-      <param name="value">The content of the header.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.Clear">
-      <summary>Removes all headers from the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.Contains(System.String)">
-      <summary>Returns if  a specific header exists in the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true is the specified header exists in the collection; otherwise false.</returns>
-      <param name="name">The specific header.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.GetEnumerator">
-      <summary>Returns an enumerator that can iterate through the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.IEnumerator`1" />.An enumerator for the <see cref="T:System.Net.Http.Headers.HttpHeaders" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.GetValues(System.String)">
-      <summary>Returns all header values for a specified header stored in the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.IEnumerable`1" />.An array of header strings.</returns>
-      <param name="name">The specified header to return values for.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.Remove(System.String)">
-      <summary>Removes the specified header from the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.</returns>
-      <param name="name">The name of the header to remove from the collection. </param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.System#Collections#IEnumerable#GetEnumerator">
-      <summary>Gets an enumerator that can iterate through a <see cref="T:System.Net.Http.Headers.HttpHeaders" />.</summary>
-      <returns>Returns <see cref="T:System.Collections.IEnumerator" />.An instance of an implementation of an <see cref="T:System.Collections.IEnumerator" /> that can iterate through a <see cref="T:System.Net.Http.Headers.HttpHeaders" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.HttpHeaders" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.TryAddWithoutValidation(System.String,System.Collections.Generic.IEnumerable{System.String})">
-      <summary>Returns a value that indicates whether the specified header and its values were added to the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection without validating the provided information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified header <paramref name="name" /> and <paramref name="values" /> could be added to the collection; otherwise false.</returns>
-      <param name="name">The header to add to the collection.</param>
-      <param name="values">The values of the header.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.TryAddWithoutValidation(System.String,System.String)">
-      <summary>Returns a value that indicates whether the specified header and its value were added to the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection without validating the provided information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified header <paramref name="name" /> and <paramref name="value" /> could be added to the collection; otherwise false.</returns>
-      <param name="name">The header to add to the collection.</param>
-      <param name="value">The content of the header.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaders.TryGetValues(System.String,System.Collections.Generic.IEnumerable{System.String}@)">
-      <summary>Return if a specified header and specified values are stored in the <see cref="T:System.Net.Http.Headers.HttpHeaders" /> collection.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true is the specified header <paramref name="name" /> and values are stored in the collection; otherwise false.</returns>
-      <param name="name">The specified header.</param>
-      <param name="values">The specified header values.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.HttpHeaderValueCollection`1">
-      <summary>Represents a collection of header values.</summary>
-      <typeparam name="T"></typeparam>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.Add(`0)"></member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.Clear"></member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.Contains(`0)">
-      <returns>Returns <see cref="T:System.Boolean" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.CopyTo(`0[],System.Int32)"></member>
-    <member name="P:System.Net.Http.Headers.HttpHeaderValueCollection`1.Count">
-      <returns>Returns <see cref="T:System.Int32" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.GetEnumerator">
-      <returns>Returns <see cref="T:System.Collections.Generic.IEnumerator`1" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpHeaderValueCollection`1.IsReadOnly">
-      <returns>Returns <see cref="T:System.Boolean" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.ParseAdd(System.String)"></member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.Remove(`0)">
-      <returns>Returns <see cref="T:System.Boolean" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.System#Collections#IEnumerable#GetEnumerator">
-      <returns>Returns <see cref="T:System.Collections.IEnumerator" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.ToString">
-      <summary>Returns a string that represents the current XXX object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.HttpHeaderValueCollection`1.TryParseAdd(System.String)">
-      <summary>Determines whether a string is valid XXX information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.</returns>
-      <param name="input">The string to validate.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.HttpRequestHeaders">
-      <summary>Represents the collection of Request Headers as defined in RFC 2616.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Accept">
-      <summary>Gets the value of the Accept header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Accept header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.AcceptCharset">
-      <summary>Gets the value of the Accept-Charset header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Accept-Charset header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.AcceptEncoding">
-      <summary>Gets the value of the Accept-Encoding header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Accept-Encoding header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.AcceptLanguage">
-      <summary>Gets the value of the Accept-Language header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Accept-Language header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Authorization">
-      <summary>Gets or sets the value of the Authorization header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" />.The value of the Authorization header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.CacheControl">
-      <summary>Gets or sets the value of the Cache-Control header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" />.The value of the Cache-Control header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Connection">
-      <summary>Gets the value of the Connection header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Connection header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.ConnectionClose">
-      <summary>Gets or sets a value that indicates if the Connection header for an HTTP request contains Close.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Connection header contains Close, otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Date">
-      <summary>Gets or sets the value of the Date header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the Date header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Expect">
-      <summary>Gets the value of the Expect header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Expect header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.ExpectContinue">
-      <summary>Gets or sets a value that indicates if the Expect header for an HTTP request contains Continue.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Expect header contains Continue, otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.From">
-      <summary>Gets or sets the value of the From header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.String" />.The value of the From header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Host">
-      <summary>Gets or sets the value of the Host header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.String" />.The value of the Host header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.IfMatch">
-      <summary>Gets the value of the If-Match header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the If-Match header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.IfModifiedSince">
-      <summary>Gets or sets the value of the If-Modified-Since header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the If-Modified-Since header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.IfNoneMatch">
-      <summary>Gets the value of the If-None-Match header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.Gets the value of the If-None-Match header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.IfRange">
-      <summary>Gets or sets the value of the If-Range header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" />.The value of the If-Range header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.IfUnmodifiedSince">
-      <summary>Gets or sets the value of the If-Unmodified-Since header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the If-Unmodified-Since header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.MaxForwards">
-      <summary>Gets or sets the value of the Max-Forwards header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The value of the Max-Forwards header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Pragma">
-      <summary>Gets the value of the Pragma header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Pragma header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.ProxyAuthorization">
-      <summary>Gets or sets the value of the Proxy-Authorization header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" />.The value of the Proxy-Authorization header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Range">
-      <summary>Gets or sets the value of the Range header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RangeHeaderValue" />.The value of the Range header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Referrer">
-      <summary>Gets or sets the value of the Referer header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Uri" />.The value of the Referer header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.TE">
-      <summary>Gets the value of the TE header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the TE header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Trailer">
-      <summary>Gets the value of the Trailer header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Trailer header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.TransferEncoding">
-      <summary>Gets the value of the Transfer-Encoding header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Transfer-Encoding header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.TransferEncodingChunked">
-      <summary>Gets or sets a value that indicates if the Transfer-Encoding header for an HTTP request contains chunked.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Transfer-Encoding header contains chunked, otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Upgrade">
-      <summary>Gets the value of the Upgrade header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Upgrade header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.UserAgent">
-      <summary>Gets the value of the User-Agent header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the User-Agent header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Via">
-      <summary>Gets the value of the Via header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Via header for an HTTP request.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpRequestHeaders.Warning">
-      <summary>Gets the value of the Warning header for an HTTP request.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Warning header for an HTTP request.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.HttpResponseHeaders">
-      <summary>Represents the collection of Response Headers as defined in RFC 2616.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.AcceptRanges">
-      <summary>Gets the value of the Accept-Ranges header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Accept-Ranges header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Age">
-      <summary>Gets or sets the value of the Age header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.TimeSpan" />.The value of the Age header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.CacheControl">
-      <summary>Gets or sets the value of the Cache-Control header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.CacheControlHeaderValue" />.The value of the Cache-Control header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Connection">
-      <summary>Gets the value of the Connection header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Connection header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.ConnectionClose">
-      <summary>Gets or sets a value that indicates if the Connection header for an HTTP response contains Close.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Connection header contains Close, otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Date">
-      <summary>Gets or sets the value of the Date header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The value of the Date header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.ETag">
-      <summary>Gets or sets the value of the ETag header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.The value of the ETag header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Location">
-      <summary>Gets or sets the value of the Location header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Uri" />.The value of the Location header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Pragma">
-      <summary>Gets the value of the Pragma header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Pragma header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.ProxyAuthenticate">
-      <summary>Gets the value of the Proxy-Authenticate header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Proxy-Authenticate header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.RetryAfter">
-      <summary>Gets or sets the value of the Retry-After header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" />.The value of the Retry-After header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Server">
-      <summary>Gets the value of the Server header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Server header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Trailer">
-      <summary>Gets the value of the Trailer header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Trailer header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.TransferEncoding">
-      <summary>Gets the value of the Transfer-Encoding header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Transfer-Encoding header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.TransferEncodingChunked">
-      <summary>Gets or sets a value that indicates if the Transfer-Encoding header for an HTTP response contains chunked.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the Transfer-Encoding header contains chunked, otherwise false.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Upgrade">
-      <summary>Gets the value of the Upgrade header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Upgrade header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Vary">
-      <summary>Gets the value of the Vary header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Vary header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Via">
-      <summary>Gets the value of the Via header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Via header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.Warning">
-      <summary>Gets the value of the Warning header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the Warning header for an HTTP response.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.HttpResponseHeaders.WwwAuthenticate">
-      <summary>Gets the value of the WWW-Authenticate header for an HTTP response.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.HttpHeaderValueCollection`1" />.The value of the WWW-Authenticate header for an HTTP response.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.MediaTypeHeaderValue">
-      <summary>Represents a media-type as defined in the RFC 2616.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.#ctor(System.Net.Http.Headers.MediaTypeHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.MediaTypeHeaderValue.CharSet">
-      <summary>Gets or sets the character set.</summary>
-      <returns>Returns <see cref="T:System.String" />.The character set.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.MediaTypeHeaderValue.MediaType">
-      <summary>Gets or sets the media-type header value.</summary>
-      <returns>Returns <see cref="T:System.String" />.The media-type header value.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.MediaTypeHeaderValue.Parameters">
-      <summary>Gets or sets the media-type header value parameters.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.The media-type header value parameters.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" />.An <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents media type header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid media type header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeHeaderValue.TryParse(System.String,System.Net.Http.Headers.MediaTypeHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.MediaTypeHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue">
-      <summary>Represents a content-type header value with an additional quality.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.#ctor(System.String,System.Double)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" />.An <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents media type with quality header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid media type with quality header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Quality">
-      <returns>Returns <see cref="T:System.Double" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.TryParse(System.String,System.Net.Http.Headers.MediaTypeWithQualityHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.MediaTypeWithQualityHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.NameValueHeaderValue">
-      <summary>Represents a name/value pair.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.#ctor(System.Net.Http.Headers.NameValueHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> class.</summary>
-      <param name="name">The header name.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> class.</summary>
-      <param name="name">The header name.</param>
-      <param name="value">The header value.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.NameValueHeaderValue.Name">
-      <summary>Gets the header name.</summary>
-      <returns>Returns <see cref="T:System.String" />.The header name.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" />.An <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents name value header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid name value header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueHeaderValue.TryParse(System.String,System.Net.Http.Headers.NameValueHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.NameValueHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.NameValueHeaderValue.Value">
-      <summary>Gets the header value.</summary>
-      <returns>Returns <see cref="T:System.String" />.The header value.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue">
-      <summary>Represents a name/value pair with parameters.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.#ctor(System.Net.Http.Headers.NameValueWithParametersHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.NameValueWithParametersHeaderValue.Parameters">
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" />.An <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents name value with parameter header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid name value with parameter header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.NameValueWithParametersHeaderValue.TryParse(System.String,System.Net.Http.Headers.NameValueWithParametersHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.NameValueWithParametersHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.ProductHeaderValue">
-      <summary>Represents a product token in header value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ProductHeaderValue.Name">
-      <summary>Gets the name of the product token.</summary>
-      <returns>Returns <see cref="T:System.String" />.The name of the product token.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ProductHeaderValue" />.An <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents product header value information.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductHeaderValue.TryParse(System.String,System.Net.Http.Headers.ProductHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.ProductHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ProductHeaderValue.Version">
-      <summary>Gets the version of the product token.</summary>
-      <returns>Returns <see cref="T:System.String" />.The version of the product token. </returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.ProductInfoHeaderValue">
-      <summary>Represents a value which can either be a product or a comment.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.#ctor(System.Net.Http.Headers.ProductHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.ProductInfoHeaderValue.Comment">
-      <returns>Returns <see cref="T:System.String" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" />.An <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents product info header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid product info header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.ProductInfoHeaderValue.Product">
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ProductHeaderValue" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ProductInfoHeaderValue.TryParse(System.String,System.Net.Http.Headers.ProductInfoHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.ProductInfoHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.RangeConditionHeaderValue">
-      <summary>Represents a header value which can either be a date/time or an entity-tag value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.#ctor(System.DateTimeOffset)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.#ctor(System.Net.Http.Headers.EntityTagHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeConditionHeaderValue.Date">
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeConditionHeaderValue.EntityTag">
-      <returns>Returns <see cref="T:System.Net.Http.Headers.EntityTagHeaderValue" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" />.An <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents range condition header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid range Condition header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeConditionHeaderValue.TryParse(System.String,System.Net.Http.Headers.RangeConditionHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.RangeConditionHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.RangeHeaderValue">
-      <summary>Represents the value of the Range header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.#ctor">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.#ctor(System.Nullable{System.Int64},System.Nullable{System.Int64})">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RangeHeaderValue" />.An <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents range header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid range header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeHeaderValue.Ranges">
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeHeaderValue.TryParse(System.String,System.Net.Http.Headers.RangeHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">he string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.RangeHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeHeaderValue.Unit">
-      <returns>Returns <see cref="T:System.String" />.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.RangeItemHeaderValue">
-      <summary>Represents a byte-range header value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeItemHeaderValue.#ctor(System.Nullable{System.Int64},System.Nullable{System.Int64})">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RangeItemHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeItemHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.RangeItemHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeItemHeaderValue.From">
-      <returns>Returns <see cref="T:System.Int64" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeItemHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.RangeItemHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeItemHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.RangeItemHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.RangeItemHeaderValue.To">
-      <returns>Returns <see cref="T:System.Int64" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RangeItemHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.RangeItemHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.RetryConditionHeaderValue">
-      <summary>Represents a header value which can either be a date/time or a timespan value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.#ctor(System.DateTimeOffset)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.#ctor(System.TimeSpan)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> class.</summary>
-    </member>
-    <member name="P:System.Net.Http.Headers.RetryConditionHeaderValue.Date">
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.RetryConditionHeaderValue.Delta">
-      <returns>Returns <see cref="T:System.TimeSpan" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" />.An <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents retry condition header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid retry condition header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.RetryConditionHeaderValue.TryParse(System.String,System.Net.Http.Headers.RetryConditionHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.RetryConditionHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.StringWithQualityHeaderValue">
-      <summary>Represents a string header value with an optional quality.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.#ctor(System.String,System.Double)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified Object is equal to the current <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" />.An <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents quality header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid string with quality header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.StringWithQualityHeaderValue.Quality">
-      <returns>Returns <see cref="T:System.Double" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.StringWithQualityHeaderValue.TryParse(System.String,System.Net.Http.Headers.StringWithQualityHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.StringWithQualityHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.StringWithQualityHeaderValue.Value">
-      <returns>Returns <see cref="T:System.String" />.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.TransferCodingHeaderValue">
-      <summary>Represents a transfer-coding header value.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.#ctor(System.Net.Http.Headers.TransferCodingHeaderValue)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified Object is equal to the current <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.TransferCodingHeaderValue.Parameters">
-      <summary>Gets the transfer-coding parameters.</summary>
-      <returns>Returns <see cref="T:System.Collections.Generic.ICollection`1" />.The transfer-coding parameters.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" />.An <see cref="T:System.Net.Http.Headers.AuthenticationHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents transfer-coding header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid transfer-coding header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingHeaderValue.TryParse(System.String,System.Net.Http.Headers.TransferCodingHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.TransferCodingHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.TransferCodingHeaderValue.Value">
-      <summary>Gets the transfer-coding value.</summary>
-      <returns>Returns <see cref="T:System.String" />.The transfer-coding value.</returns>
-    </member>
-    <member name="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue">
-      <summary>Represents a transfer-coding header value with optional quality.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.#ctor(System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.#ctor(System.String,System.Double)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> class.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" />.An <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents transfer-coding value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid transfer-coding with quality header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.Quality">
-      <returns>Returns <see cref="T:System.Double" />.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue.TryParse(System.String,System.Net.Http.Headers.TransferCodingWithQualityHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.TransferCodingWithQualityHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.ViaHeaderValue">
-      <summary>Represents the value of a Via header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.#ctor(System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> class.</summary>
-      <param name="protocolVersion">The protocol version of the received protocol.</param>
-      <param name="receivedBy">The host and port that the request or response was received by.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.#ctor(System.String,System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> class.</summary>
-      <param name="protocolVersion">The protocol version of the received protocol.</param>
-      <param name="receivedBy">The host and port that the request or response was received by.</param>
-      <param name="protocolName">The protocol name of the received protocol.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.#ctor(System.String,System.String,System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> class.</summary>
-      <param name="protocolVersion">The protocol version of the received protocol.</param>
-      <param name="receivedBy">The host and port that the request or response was received by.</param>
-      <param name="protocolName">The protocol name of the received protocol.</param>
-      <param name="comment">The comment field used to identify the software of the recipient proxy or gateway.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.ViaHeaderValue.Comment">
-      <summary>Gets the comment field used to identify the software of the recipient proxy or gateway.</summary>
-      <returns>Returns <see cref="T:System.String" />.The comment field used to identify the software of the recipient proxy or gateway.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.ViaHeaderValue" />object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.Returns a hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Net.Http.Headers.ViaHeaderValue" />.An <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents via header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid via header value information.</exception>
-    </member>
-    <member name="P:System.Net.Http.Headers.ViaHeaderValue.ProtocolName">
-      <summary>Gets the protocol name of the received protocol.</summary>
-      <returns>Returns <see cref="T:System.String" />.The protocol name.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ViaHeaderValue.ProtocolVersion">
-      <summary>Gets the protocol version of the received protocol.</summary>
-      <returns>Returns <see cref="T:System.String" />.The protocol version.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.ViaHeaderValue.ReceivedBy">
-      <summary>Gets the host and port that the request or response was received by.</summary>
-      <returns>Returns <see cref="T:System.String" />.The host and port that the request or response was received by.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.A copy of the current instance.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.ViaHeaderValue.TryParse(System.String,System.Net.Http.Headers.ViaHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.ViaHeaderValue" /> version of the string.</param>
-    </member>
-    <member name="T:System.Net.Http.Headers.WarningHeaderValue">
-      <summary>Represents a warning value used by the Warning header.</summary>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.#ctor(System.Int32,System.String,System.String)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> class.</summary>
-      <param name="code">The specific warning code.</param>
-      <param name="agent">The host that attached the warning.</param>
-      <param name="text">A quoted-string containing the warning text.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.#ctor(System.Int32,System.String,System.String,System.DateTimeOffset)">
-      <summary>Initializes a new instance of the <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> class.</summary>
-      <param name="code">The specific warning code.</param>
-      <param name="agent">The host that attached the warning.</param>
-      <param name="text">A quoted-string containing the warning text.</param>
-      <param name="date">The date/time stamp of the warning.</param>
-    </member>
-    <member name="P:System.Net.Http.Headers.WarningHeaderValue.Agent">
-      <summary>Gets the host that attached the warning.</summary>
-      <returns>Returns <see cref="T:System.String" />.The host that attached the warning.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.WarningHeaderValue.Code">
-      <summary>Gets the specific warning code.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.The specific warning code.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.WarningHeaderValue.Date">
-      <summary>Gets the date/time stamp of the warning.</summary>
-      <returns>Returns <see cref="T:System.DateTimeOffset" />.The date/time stamp of the warning.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.Equals(System.Object)">
-      <summary>Determines whether the specified <see cref="T:System.Object" /> is equal to the current <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if the specified <see cref="T:System.Object" /> is equal to the current object; otherwise, false.</returns>
-      <param name="obj">The object to compare with the current object.</param>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.GetHashCode">
-      <summary>Serves as a hash function for an <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.Int32" />.A hash code for the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.Parse(System.String)">
-      <summary>Converts a string to an <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> instance.</summary>
-      <returns>Returns an <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> instance.</returns>
-      <param name="input">A string that represents authentication header value information.</param>
-      <exception cref="T:System.ArgumentNullException">
-        <paramref name="input" /> is a null reference.</exception>
-      <exception cref="T:System.FormatException">
-        <paramref name="input" /> is not valid authentication header value information.</exception>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.System#ICloneable#Clone">
-      <summary>Creates a new object that is a copy of the current <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> instance.</summary>
-      <returns>Returns <see cref="T:System.Object" />.Returns a copy of the current instance.</returns>
-    </member>
-    <member name="P:System.Net.Http.Headers.WarningHeaderValue.Text">
-      <summary>Gets a quoted-string containing the warning text.</summary>
-      <returns>Returns <see cref="T:System.String" />.A quoted-string containing the warning text.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.ToString">
-      <summary>Returns a string that represents the current <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> object.</summary>
-      <returns>Returns <see cref="T:System.String" />.A string that represents the current object.</returns>
-    </member>
-    <member name="M:System.Net.Http.Headers.WarningHeaderValue.TryParse(System.String,System.Net.Http.Headers.WarningHeaderValue@)">
-      <summary>Determines whether a string is valid <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> information.</summary>
-      <returns>Returns <see cref="T:System.Boolean" />.true if <paramref name="input" /> is valid <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> information; otherwise, false.</returns>
-      <param name="input">The string to validate.</param>
-      <param name="parsedValue">The <see cref="T:System.Net.Http.Headers.WarningHeaderValue" /> version of the string.</param>
-    </member>
-  </members>
-</doc>

+ 1 - 1
src/MinerClientSelfHost/MinerClientController.cs

@@ -137,7 +137,7 @@ namespace NTMiner {
         [HttpPost]
         public void OverClock() {
             VirtualRoot.ThisLocalInfo(nameof(MinerClientController), $"通过群控刷新超频", toConsole: true);
-            NTMinerContext.Instance.GpuProfileSet.Refresh();
+            NTMinerContext.Instance.GpuProfileSet.RemoteOverClock();
         }
 
         [HttpPost]

+ 2 - 1
src/NTMinerClient/Cleaner.cs

@@ -2,6 +2,7 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
 
 namespace NTMiner {
     public class Cleaner {
@@ -50,7 +51,7 @@ namespace NTMiner {
         /// </summary>
         private void ClearPackages() {
             HashSet<string> packageFileNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
-            foreach (var kernel in NTMinerContext.Instance.ServerContext.KernelSet.AsEnumerable()) {
+            foreach (var kernel in NTMinerContext.Instance.ServerContext.KernelSet.AsEnumerable().ToArray()) {
                 if (!string.IsNullOrEmpty(kernel.Package)) {
                     packageFileNames.Add(kernel.Package);
                 }

+ 4 - 4
src/NTMinerClient/Core/Impl/ClientDataSet.cs

@@ -32,7 +32,7 @@ namespace NTMiner.Core.Impl {
             }
             var clientData = ClientData.Create(minerIp, out MinerData minerData);
             if (!_dicByObjectId.ContainsKey(clientData.Id)) {
-                _dicByObjectId.Add(clientData.Id, clientData);
+                _dicByObjectId.TryAdd(clientData.Id, clientData);
             }
             // 因为ClientId是服务端随机生成的,所以需要等待获取挖矿端的ClientId
             DoUpdateSave(minerData);
@@ -106,12 +106,12 @@ namespace NTMiner.Core.Impl {
                     else {
                         if (speedData.ClientId != clientData.ClientId) {
                             if (_dicByClientId.TryGetValue(clientData.ClientId, out ClientData value)) {
-                                _dicByClientId.Remove(clientData.ClientId);
+                                _dicByClientId.TryRemove(clientData.ClientId, out _);
                             }
                             if (!_dicByClientId.ContainsKey(speedData.ClientId)) {
-                                _dicByClientId.Add(speedData.ClientId, clientData);
+                                _dicByClientId.TryAdd(speedData.ClientId, clientData);
                                 if (!_dicByObjectId.ContainsKey(clientData.Id)) {
-                                    _dicByObjectId.Add(clientData.Id, clientData);
+                                    _dicByObjectId.TryAdd(clientData.Id, clientData);
                                 }
                             }
                         }

+ 5 - 5
src/NTMinerClient/Core/Impl/SysDicItemSet.cs

@@ -122,11 +122,6 @@ namespace NTMiner.Core.Impl {
             }
         }
 
-        public IEnumerable<ISysDicItem> AsEnumerable() {
-            InitOnece();
-            return _dicById.Values;
-        }
-
         public bool ContainsKey(Guid dicItemId) {
             InitOnece();
             return _dicById.ContainsKey(dicItemId);
@@ -191,5 +186,10 @@ namespace NTMiner.Core.Impl {
             }
             return _dicByDicId[sysDic.GetId()].Values.ToList();
         }
+
+        public IEnumerable<ISysDicItem> AsEnumerable() {
+            InitOnece();
+            return _dicById.Values;
+        }
     }
 }

+ 1 - 3
src/NTMinerClient/Core/Kernels/IKernelOutputSet.cs

@@ -1,12 +1,10 @@
-using NTMiner.Mine;
-using System;
+using System;
 using System.Collections.Generic;
 
 namespace NTMiner.Core.Kernels {
     public interface IKernelOutputSet {
         bool Contains(Guid id);
         bool TryGetKernelOutput(Guid id, out IKernelOutput kernelOutput);
-        void Pick(ref string input, IMineContext mineContext);
         IEnumerable<IKernelOutput> AsEnumerable();
     }
 }

+ 1 - 1
src/NTMinerClient/Core/Kernels/Impl/CoinKernelSet.cs

@@ -85,7 +85,7 @@ namespace NTMiner.Core.Kernels.Impl {
                         List<Guid> toRemoves = new List<Guid>();
                         IPool[] pools = context.PoolSet.AsEnumerable().Where(a => a.CoinId == coin.GetId()).ToArray();
                         foreach (IPool pool in pools) {
-                            foreach (PoolKernelData poolKernel in context.PoolKernelSet.AsEnumerable().Where(a => a.PoolId == pool.GetId() && a.KernelId == entity.KernelId)) {
+                            foreach (PoolKernelData poolKernel in context.PoolKernelSet.AsEnumerable().Where(a => a.PoolId == pool.GetId() && a.KernelId == entity.KernelId).ToArray()) {
                                 toRemoves.Add(poolKernel.Id);
                             }
                         }

+ 1 - 533
src/NTMinerClient/Core/Kernels/Impl/KernelOutputSet.cs

@@ -1,9 +1,6 @@
-using NTMiner.Gpus;
-using NTMiner.Mine;
-using System;
+using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Text.RegularExpressions;
 
 namespace NTMiner.Core.Kernels.Impl {
     public class KernelOutputSet : SetBase, IKernelOutputSet {
@@ -103,534 +100,5 @@ namespace NTMiner.Core.Kernels.Impl {
             InitOnece();
             return _dicById.Values;
         }
-
-        private string _preline;
-        public void Pick(ref string line, IMineContext mineContext) {
-            try {
-                InitOnece();
-                if (string.IsNullOrEmpty(line)) {
-                    return;
-                }
-                // 注意:硬编码逻辑。使用Claymore挖非ETH币种时它也打印ETH,所以这里需要纠正它
-                if ("Claymore".Equals(mineContext.Kernel.Code, StringComparison.OrdinalIgnoreCase)) {
-                    if (mineContext.MainCoin.Code != "ETH" && line.Contains("ETH")) {
-                        line = line.Replace("ETH", mineContext.MainCoin.Code);
-                    }
-                }
-                ICoin coin = mineContext.MainCoin;
-                bool isDual = false;
-                Guid poolId = mineContext.MainCoinPool.GetId();
-                // 如果是双挖上下文且当前输入行中没有主币关键字则视为双挖币
-                if ((mineContext is IDualMineContext dualMineContext) && !line.Contains(mineContext.MainCoin.Code)) {
-                    isDual = true;
-                    coin = dualMineContext.DualCoin;
-                    poolId = dualMineContext.DualCoinPool.GetId();
-                }
-                INTMinerContext context = NTMinerContext.Instance;
-                // 这些方法输出的是事件消息
-                #region 总
-                PickTotalSpeed(context, line, mineContext.KernelOutput, isDual);
-                PickTotalShare(context, line, mineContext.KernelOutput, coin, isDual);
-                PickAcceptShare(context, line, mineContext.KernelOutput, coin, isDual);
-                PickRejectShare(context, line, mineContext.KernelOutput, coin, isDual);
-                PickRejectPercent(context, line, mineContext.KernelOutput, coin, isDual);
-                #endregion
-
-                #region 一个
-                if (!isDual) {
-                    // 决定不支持双挖的单卡份额统计
-                    PicFoundOneShare(context, mineContext, line, _preline, mineContext.KernelOutput);
-                    PicGotOneIncorrectShare(context, mineContext, line, _preline, mineContext.KernelOutput);
-                }
-                PickAcceptOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
-                PickRejectOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
-                #endregion
-
-                #region 单卡
-                PickGpuSpeed(context, mineContext, line, mineContext.KernelOutput, isDual);
-                PicGpuAcceptShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                PicGpuRejectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                PicGpuIncorrectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                #endregion
-                PickPoolDelay(line, mineContext.KernelOutput, isDual, poolId);
-                // 如果是像BMiner那样的主币和双挖币的输出在同一行那样的模式则一行输出既要视为主币又要视为双挖币
-                if (isDual && mineContext.KernelOutput.IsDualInSameLine) {
-                    coin = mineContext.MainCoin;
-                    isDual = false;
-                    #region 总
-                    PickTotalSpeed(context, line, mineContext.KernelOutput, isDual);
-                    PickTotalShare(context, line, mineContext.KernelOutput, coin, isDual);
-                    PickAcceptShare(context, line, mineContext.KernelOutput, coin, isDual);
-                    PickRejectShare(context, line, mineContext.KernelOutput, coin, isDual);
-                    PickRejectPercent(context, line, mineContext.KernelOutput, coin, isDual);
-                    #endregion
-
-                    #region 一个
-                    PickAcceptOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
-                    PickRejectOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
-                    #endregion
-
-                    #region 单卡
-                    PickGpuSpeed(context, mineContext, line, mineContext.KernelOutput, isDual);
-                    PicGpuAcceptShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                    PicGpuRejectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                    PicGpuIncorrectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
-                    #endregion
-                    PickPoolDelay(line, mineContext.KernelOutput, isDual, poolId);
-                }
-                _preline = line;
-            }
-            catch (Exception e) {
-                Logger.ErrorDebugLine(e);
-            }
-        }
-
-        #region private static methods
-        #region 总
-        #region PickTotalSpeed
-        private static void PickTotalSpeed(INTMinerContext context, string line, IKernelOutput kernelOutput, bool isDual) {
-            string totalSpeedPattern = kernelOutput.TotalSpeedPattern;
-            if (isDual) {
-                totalSpeedPattern = kernelOutput.DualTotalSpeedPattern;
-            }
-            if (string.IsNullOrEmpty(totalSpeedPattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(totalSpeedPattern);
-            Match match = regex.Match(line);
-            if (match.Success) {
-                string totalSpeedText = match.Groups[NTKeyword.TotalSpeedGroupName].Value;
-                string totalSpeedUnit = match.Groups[NTKeyword.TotalSpeedUnitGroupName].Value;
-                if (string.IsNullOrEmpty(totalSpeedUnit)) {
-                    if (isDual) {
-                        totalSpeedUnit = kernelOutput.DualSpeedUnit;
-                    }
-                    else {
-                        totalSpeedUnit = kernelOutput.SpeedUnit;
-                    }
-                }
-                if (double.TryParse(totalSpeedText, out double totalSpeed)) {
-                    totalSpeed = totalSpeed.FromUnitSpeed(totalSpeedUnit);
-                    var now = DateTime.Now;
-                    IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed;
-                    gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, totalSpeed, isDual, now);
-                    string gpuSpeedPattern = kernelOutput.GpuSpeedPattern;
-                    if (isDual) {
-                        gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern;
-                    }
-                    // 如果没有单卡算力正则则平分总算力作为单卡算力正则
-                    if ((string.IsNullOrEmpty(gpuSpeedPattern) || context.GpuSet.Count == 1) && context.GpuSet.Count != 0) {
-                        double gpuSpeed = totalSpeed / context.GpuSet.Count;
-                        foreach (var item in gpuSpeeds.AsEnumerable()) {
-                            if (item.Gpu.Index != NTMinerContext.GpuAllId) {
-                                gpuSpeeds.SetCurrentSpeed(item.Gpu.Index, gpuSpeed, isDual, now);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        #endregion
-
-        #region PickTotalShare
-        private static void PickTotalShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string totalSharePattern = kernelOutput.TotalSharePattern;
-            if (isDual) {
-                totalSharePattern = kernelOutput.DualTotalSharePattern;
-            }
-            if (string.IsNullOrEmpty(totalSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(totalSharePattern);
-            var match = regex.Match(line);
-            if (match.Success) {
-                string totalShareText = match.Groups[NTKeyword.TotalShareGroupName].Value;
-                if (int.TryParse(totalShareText, out int totalShare)) {
-                    ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
-                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: totalShare - share.RejectShareCount, rejectShareCount: null, now: DateTime.Now);
-                }
-            }
-        }
-        #endregion
-
-        #region PickAcceptShare
-        private static void PickAcceptShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string acceptSharePattern = kernelOutput.AcceptSharePattern;
-            if (isDual) {
-                acceptSharePattern = kernelOutput.DualAcceptSharePattern;
-            }
-            if (string.IsNullOrEmpty(acceptSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(acceptSharePattern);
-            var match = regex.Match(line);
-            if (match.Success) {
-                string acceptShareText = match.Groups[NTKeyword.AcceptShareGroupName].Value;
-                if (int.TryParse(acceptShareText, out int acceptShare)) {
-                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: acceptShare, rejectShareCount: null, now: DateTime.Now);
-                }
-            }
-        }
-        #endregion
-
-        #region PickRejectShare
-        private static void PickRejectShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string rejectSharePattern = kernelOutput.RejectSharePattern;
-            if (isDual) {
-                rejectSharePattern = kernelOutput.DualRejectSharePattern;
-            }
-            if (string.IsNullOrEmpty(rejectSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(rejectSharePattern);
-            var match = regex.Match(line);
-            if (match.Success) {
-                string rejectShareText = match.Groups[NTKeyword.RejectShareGroupName].Value;
-
-                if (int.TryParse(rejectShareText, out int rejectShare)) {
-                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: rejectShare, now: DateTime.Now);
-                }
-            }
-        }
-        #endregion
-
-        #region PickRejectPercent
-        private static void PickRejectPercent(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string rejectPercentPattern = kernelOutput.RejectPercentPattern;
-            if (isDual) {
-                rejectPercentPattern = kernelOutput.DualRejectPercentPattern;
-            }
-            if (string.IsNullOrEmpty(rejectPercentPattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(rejectPercentPattern);
-            var match = regex.Match(line);
-            string rejectPercentText = match.Groups[NTKeyword.RejectPercentGroupName].Value;
-            if (double.TryParse(rejectPercentText, out double rejectPercent)) {
-                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
-                context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: (int)(share.TotalShareCount * rejectPercent), now: DateTime.Now);
-            }
-        }
-        #endregion
-        #endregion
-
-        #region 一个
-        #region PicFoundOneShare
-        private static void PicFoundOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput) {
-            string foundOneShare = kernelOutput.FoundOneShare;
-            if (string.IsNullOrEmpty(foundOneShare)) {
-                return;
-            }
-            if (foundOneShare.Contains("\n")) {
-                line = preline + "\n" + line;
-            }
-            Regex regex = VirtualRoot.GetRegex(foundOneShare);
-            var match = regex.Match(line);
-            if (match.Success) {
-                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                if (!string.IsNullOrEmpty(gpuText)) {
-                    if (int.TryParse(gpuText, out int gpuIndex)) {
-                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                            gpuIndex = mineContext.UseDevices[gpuIndex];
-                        }
-                        context.GpusSpeed.IncreaseFoundShare(gpuIndex);
-                    }
-                }
-            }
-        }
-        #endregion
-
-        #region PicGotOneIncorrectShare
-        private static void PicGotOneIncorrectShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput) {
-            string pattern = kernelOutput.GpuGotOneIncorrectShare;
-            if (string.IsNullOrEmpty(pattern)) {
-                return;
-            }
-            if (pattern.Contains("\n")) {
-                line = preline + "\n" + line;
-            }
-            Regex regex = VirtualRoot.GetRegex(pattern);
-            var match = regex.Match(line);
-            if (match.Success) {
-                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                if (!string.IsNullOrEmpty(gpuText)) {
-                    if (int.TryParse(gpuText, out int gpuIndex)) {
-                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                            gpuIndex = mineContext.UseDevices[gpuIndex];
-                        }
-                        context.GpusSpeed.IncreaseIncorrectShare(gpuIndex);
-                    }
-                }
-            }
-        }
-        #endregion
-
-        #region PickAcceptOneShare
-        private static void PickAcceptOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string acceptOneShare = kernelOutput.AcceptOneShare;
-            if (isDual) {
-                acceptOneShare = kernelOutput.DualAcceptOneShare;
-            }
-            if (string.IsNullOrEmpty(acceptOneShare)) {
-                return;
-            }
-            if (acceptOneShare.Contains("\n")) {
-                line = preline + "\n" + line;
-            }
-            Regex regex = VirtualRoot.GetRegex(acceptOneShare);
-            var match = regex.Match(line);
-            if (match.Success) {
-                if (!isDual) {
-                    // 决定不支持双挖的单卡份额统计
-                    string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                    if (!string.IsNullOrEmpty(gpuText)) {
-                        if (int.TryParse(gpuText, out int gpuIndex)) {
-                            if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                                gpuIndex = mineContext.UseDevices[gpuIndex];
-                            }
-                            if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
-                                context.GpusSpeed.IncreaseFoundShare(gpuIndex);
-                            }
-                            context.GpusSpeed.IncreaseAcceptShare(gpuIndex);
-                        }
-                    }
-                }
-                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
-                context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: share.AcceptShareCount + 1, rejectShareCount: null, now: DateTime.Now);
-            }
-        }
-        #endregion
-
-        #region PickRejectOneShare
-        private static void PickRejectOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
-            string rejectOneShare = kernelOutput.RejectOneShare;
-            if (isDual) {
-                rejectOneShare = kernelOutput.DualRejectOneShare;
-            }
-            if (string.IsNullOrEmpty(rejectOneShare)) {
-                return;
-            }
-            if (rejectOneShare.Contains("\n")) {
-                line = preline + "\n" + line;
-            }
-            Regex regex = VirtualRoot.GetRegex(rejectOneShare);
-            var match = regex.Match(line);
-            if (match.Success) {
-                if (!isDual) {
-                    // 决定不支持双挖的单卡份额统计
-                    string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                    if (!string.IsNullOrEmpty(gpuText)) {
-                        if (int.TryParse(gpuText, out int gpuIndex)) {
-                            if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                                gpuIndex = mineContext.UseDevices[gpuIndex];
-                            }
-                            if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
-                                context.GpusSpeed.IncreaseFoundShare(gpuIndex);
-                            }
-                            context.GpusSpeed.IncreaseRejectShare(gpuIndex);
-                        }
-                    }
-                    else if (!string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
-                        // 哪个GPU最近找到了一个share就是那个GPU拒绝了一个share
-                        var gpuSpeeds = context.GpusSpeed.AsEnumerable();
-                        IGpuSpeed gpuSpeed = null;
-                        foreach (var item in gpuSpeeds) {
-                            if (gpuSpeed == null) {
-                                gpuSpeed = item;
-                            }
-                            else if (item.FoundShareOn > gpuSpeed.FoundShareOn) {
-                                gpuSpeed = item;
-                            }
-                        }
-                        if (gpuSpeed != null) {
-                            var gpuIndex = gpuSpeed.Gpu.Index;
-                            context.GpusSpeed.IncreaseRejectShare(gpuIndex);
-                        }
-                    }
-                }
-                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
-                context.CoinShareSet.UpdateShare(coin.GetId(), null, share.RejectShareCount + 1, DateTime.Now);
-            }
-        }
-        #endregion
-        #endregion
-
-        #region 单卡
-        #region PickGpuSpeed
-        private static void PickGpuSpeed(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
-            string gpuSpeedPattern = kernelOutput.GpuSpeedPattern;
-            if (isDual) {
-                gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern;
-            }
-            if (string.IsNullOrEmpty(gpuSpeedPattern)) {
-                return;
-            }
-            var now = DateTime.Now;
-            bool hasGpuId = gpuSpeedPattern.Contains($"?<{NTKeyword.GpuIndexGroupName}>");
-            Regex regex = VirtualRoot.GetRegex(gpuSpeedPattern);
-            MatchCollection matches = regex.Matches(line);
-            if (matches.Count > 0) {
-                IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed;
-                for (int i = 0; i < matches.Count; i++) {
-                    Match match = matches[i];
-                    string gpuSpeedText = match.Groups[NTKeyword.GpuSpeedGroupName].Value;
-                    string gpuSpeedUnit = match.Groups[NTKeyword.GpuSpeedUnitGroupName].Value;
-                    if (string.IsNullOrEmpty(gpuSpeedUnit)) {
-                        if (isDual) {
-                            gpuSpeedUnit = kernelOutput.DualSpeedUnit;
-                        }
-                        else {
-                            gpuSpeedUnit = kernelOutput.SpeedUnit;
-                        }
-                    }
-                    int gpuIndex = i;
-                    if (hasGpuId) {
-                        string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                        if (!int.TryParse(gpuText, out gpuIndex)) {
-                            gpuIndex = i;
-                        }
-                        else {
-                            gpuIndex -= kernelOutput.GpuBaseIndex;
-                            if (gpuIndex < 0) {
-                                continue;
-                            }
-                        }
-                    }
-                    if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                        gpuIndex = mineContext.UseDevices[gpuIndex];
-                    }
-                    if (double.TryParse(gpuSpeedText, out double gpuSpeed)) {
-                        double gpuSpeedL = gpuSpeed.FromUnitSpeed(gpuSpeedUnit);
-                        gpuSpeeds.SetCurrentSpeed(gpuIndex, gpuSpeedL, isDual, now);
-                    }
-                }
-                string totalSpeedPattern = kernelOutput.TotalSpeedPattern;
-                if (isDual) {
-                    totalSpeedPattern = kernelOutput.DualTotalSpeedPattern;
-                }
-                // 求和分算力,因为有些内核在只有一张卡时不输出总算力
-                double speed = isDual ? gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.DualCoinSpeed.Value)
-                                     : gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.MainCoinSpeed.Value);
-                if (speed > (isDual ? gpuSpeeds.CurrentSpeed(NTMinerContext.GpuAllId).DualCoinSpeed : gpuSpeeds.CurrentSpeed(NTMinerContext.GpuAllId).MainCoinSpeed).Value) {
-                    gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, speed, isDual, now);
-                }
-            }
-        }
-        #endregion
-
-        #region PicGpuAcceptShare
-        private static void PicGpuAcceptShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
-            string gpuAcceptSharePattern = kernelOutput.GpuAcceptShare;
-            if (isDual) {
-                return;
-            }
-            if (string.IsNullOrEmpty(gpuAcceptSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(gpuAcceptSharePattern);
-            Match match = regex.Match(line);
-            if (match.Success) {
-                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                string acceptShareText = match.Groups[NTKeyword.AcceptShareGroupName].Value;
-                if (!string.IsNullOrEmpty(gpuText)) {
-                    if (int.TryParse(gpuText, out int gpuIndex)) {
-                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                            gpuIndex = mineContext.UseDevices[gpuIndex];
-                        }
-                        if (!string.IsNullOrEmpty(acceptShareText)) {
-                            if (int.TryParse(acceptShareText, out int acceptShare)) {
-                                context.GpusSpeed.SetAcceptShare(gpuIndex, acceptShare);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        #endregion
-
-        #region PicGpuRejectShare
-        private static void PicGpuRejectShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
-            string gpuRejectSharePattern = kernelOutput.GpuRejectShare;
-            if (isDual) {
-                return;
-            }
-            if (string.IsNullOrEmpty(gpuRejectSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(gpuRejectSharePattern);
-            Match match = regex.Match(line);
-            if (match.Success) {
-                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                string rejectShareText = match.Groups[NTKeyword.RejectShareGroupName].Value;
-                if (!string.IsNullOrEmpty(gpuText)) {
-                    if (int.TryParse(gpuText, out int gpuIndex)) {
-                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                            gpuIndex = mineContext.UseDevices[gpuIndex];
-                        }
-                        if (!string.IsNullOrEmpty(rejectShareText)) {
-                            if (int.TryParse(rejectShareText, out int rejectShare)) {
-                                context.GpusSpeed.SetRejectShare(gpuIndex, rejectShare);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        #endregion
-
-        #region PicGpuIncorrectShare
-        private static void PicGpuIncorrectShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
-            string gpuIncorrectSharePattern = kernelOutput.GpuIncorrectShare;
-            if (isDual) {
-                return;
-            }
-            if (string.IsNullOrEmpty(gpuIncorrectSharePattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(gpuIncorrectSharePattern);
-            Match match = regex.Match(line);
-            if (match.Success) {
-                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
-                string incorrectShareText = match.Groups[NTKeyword.IncorrectShareGroupName].Value;
-                if (!string.IsNullOrEmpty(gpuText)) {
-                    if (int.TryParse(gpuText, out int gpuIndex)) {
-                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
-                            gpuIndex = mineContext.UseDevices[gpuIndex];
-                        }
-                        if (!string.IsNullOrEmpty(incorrectShareText)) {
-                            if (int.TryParse(incorrectShareText, out int incorrectShare)) {
-                                context.GpusSpeed.SetIncorrectShare(gpuIndex, incorrectShare);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        #endregion
-        #endregion
-
-        #region PickPoolDelay
-        private static void PickPoolDelay(string line, IKernelOutput kernelOutput, bool isDual, Guid poolId) {
-            string poolDelayPattern = kernelOutput.PoolDelayPattern;
-            if (isDual) {
-                poolDelayPattern = kernelOutput.DualPoolDelayPattern;
-            }
-            if (string.IsNullOrEmpty(poolDelayPattern)) {
-                return;
-            }
-            Regex regex = VirtualRoot.GetRegex(poolDelayPattern);
-            Match match = regex.Match(line);
-            if (match.Success) {
-                string poolDelayText = match.Groups[NTKeyword.PoolDelayGroupName].Value;
-                VirtualRoot.RaiseEvent(new PoolDelayPickedEvent(poolId, isDual, poolDelayText));
-            }
-        }
-        #endregion
-
-        private static bool IsMapGpuIndex(INTMinerContext context, IMineContext mineContext, IKernelOutput kernelOutput) {
-            return kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)
-                && mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != context.GpuSet.Count;
-        }
-        #endregion
     }
 }

+ 5 - 5
src/NTMinerClient/Core/Kernels/Impl/KernelOutputTranslaterSet.cs

@@ -125,11 +125,6 @@ namespace NTMiner.Core.Kernels.Impl {
             return r;
         }
 
-        public IEnumerable<IKernelOutputTranslater> AsEnumerable() {
-            InitOnece();
-            return _dicById.Values;
-        }
-
         public void Translate(Guid kernelOutputId, ref string input, bool isPre = false) {
             try {
                 InitOnece();
@@ -155,5 +150,10 @@ namespace NTMiner.Core.Kernels.Impl {
                 Logger.ErrorDebugLine(e);
             }
         }
+
+        public IEnumerable<IKernelOutputTranslater> AsEnumerable() {
+            InitOnece();
+            return _dicById.Values;
+        }
     }
 }

+ 2 - 2
src/NTMinerClient/Core/Kernels/Impl/PoolKernelSet.cs

@@ -62,8 +62,8 @@ namespace NTMiner.Core.Kernels.Impl {
         protected override void Init() {
             var repository = _context.CreateServerRepository<PoolKernelData>();
             List<PoolKernelData> list = repository.GetAll().ToList();
-            foreach (IPool pool in _context.PoolSet.AsEnumerable()) {
-                foreach (ICoinKernel coinKernel in _context.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == pool.CoinId)) {
+            foreach (IPool pool in _context.PoolSet.AsEnumerable().ToArray()) {
+                foreach (ICoinKernel coinKernel in _context.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == pool.CoinId).ToArray()) {
                     PoolKernelData poolKernel = list.FirstOrDefault(a => a.PoolId == pool.GetId() && a.KernelId == coinKernel.KernelId);
                     if (poolKernel != null) {
                         _dicById.Add(poolKernel.GetId(), poolKernel);

+ 2 - 1
src/NTMinerClient/Core/Kernels/KernelExtensions.cs

@@ -81,7 +81,8 @@ namespace NTMiner.Core.Kernels {
             if (NTMinerContext.Instance.GpuSet.GpuType == GpuType.Empty) {
                 return true;
             }
-            foreach (var item in NTMinerContext.Instance.ServerContext.CoinKernelSet.AsEnumerable().Where(a => a.CoinId == coin.GetId() && a.KernelId == kernel.GetId())) {
+            var coinKernelSet = NTMinerContext.Instance.ServerContext.CoinKernelSet;
+            foreach (var item in coinKernelSet.AsEnumerable().Where(a => a.CoinId == coin.GetId() && a.KernelId == kernel.GetId()).ToArray()) {
                 if (item.SupportedGpu.IsSupportedGpu(NTMinerContext.Instance.GpuSet.GpuType)) {
                     return true;
                 }

+ 2 - 1
src/NTMinerClient/Core/Kernels/KernelSetExtension.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace NTMiner.Core.Kernels {
     public static class KernelSetExtension {
@@ -10,7 +11,7 @@ namespace NTMiner.Core.Kernels {
         /// <returns></returns>
         public static HashSet<string> GetAllKernelProcessNames(this IKernelSet kernelSet) {
             HashSet<string> hashSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
-            foreach (var kernel in kernelSet.AsEnumerable()) {
+            foreach (var kernel in kernelSet.AsEnumerable().ToArray()) {
                 hashSet.Add(kernel.GetProcessName());
             }
             return hashSet;

+ 1 - 1
src/NTMinerClient/Core/Profiles/IGpuProfileSet.cs

@@ -6,7 +6,7 @@ namespace NTMiner.Core.Profiles {
         IGpuProfile GetGpuProfile(Guid coinId, int index);
         bool IsOverClockEnabled(Guid coinId);
         bool IsOverClockGpuAll(Guid coinId);
-        void Refresh();
+        void RemoteOverClock();
         void SetIsOverClockEnabled(Guid coinId, bool value);
         void SetIsOverClockGpuAll(Guid coinId, bool value);
     }

+ 1 - 1
src/NTMinerClient/Core/Profiles/Impl/GpuProfileSet.cs

@@ -58,7 +58,7 @@ namespace NTMiner.Core.Profiles.Impl {
             }
         }
 
-        public void Refresh() {
+        public void RemoteOverClock() {
             base.DeferReInit();
             VirtualRoot.RaiseEvent(new GpuProfileSetRefreshedEvent());
             // 之前下面这行代码在GpuProfileViewModels的构造中,但GpuProfileViewModels是在切换到

+ 12 - 6
src/NTMinerClient/Gpus/Impl/GpusSpeed.cs

@@ -120,8 +120,10 @@ namespace NTMiner.Gpus.Impl {
                 return;
             }
             CheckReset();
-            gpuSpeed.SetMainCoinAcceptShare(acceptShare);
-            VirtualRoot.RaiseEvent(new AcceptShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            if (gpuSpeed.MainCoinSpeed.AcceptShare != acceptShare) {
+                gpuSpeed.SetMainCoinAcceptShare(acceptShare);
+                VirtualRoot.RaiseEvent(new AcceptShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            }
         }
 
         public void SetRejectShare(int gpuIndex, int rejectShare) {
@@ -130,8 +132,10 @@ namespace NTMiner.Gpus.Impl {
                 return;
             }
             CheckReset();
-            gpuSpeed.SetMainCoinRejectShare(rejectShare);
-            VirtualRoot.RaiseEvent(new RejectShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            if (gpuSpeed.MainCoinSpeed.RejectShare != rejectShare) {
+                gpuSpeed.SetMainCoinRejectShare(rejectShare);
+                VirtualRoot.RaiseEvent(new RejectShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            }
         }
 
         public void SetIncorrectShare(int gpuIndex, int incorrectShare) {
@@ -140,8 +144,10 @@ namespace NTMiner.Gpus.Impl {
                 return;
             }
             CheckReset();
-            gpuSpeed.SetMainCoinIncorrectShare(incorrectShare);
-            VirtualRoot.RaiseEvent(new IncorrectShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            if (gpuSpeed.MainCoinSpeed.IncorrectShare != incorrectShare) {
+                gpuSpeed.SetMainCoinIncorrectShare(incorrectShare);
+                VirtualRoot.RaiseEvent(new IncorrectShareSetedEvent(Guid.Empty, gpuSpeed: gpuSpeed));
+            }
         }
 
         public void IncreaseRejectShare(int gpuIndex) {

+ 3 - 1
src/NTMinerClient/Gpus/Impl/NVIDIAGpuSet.cs

@@ -81,7 +81,9 @@ namespace NTMiner.Gpus.Impl {
             bool isChanged = gpu.Temperature != coreTemperature || gpu.MemTemperature != memoryTemperature || gpu.PowerUsage != power || gpu.FanSpeed != fanSpeed;
             gpu.Temperature = (int)coreTemperature;
             gpu.MemTemperature = (int)memoryTemperature;
-            gpu.PowerUsage = power;
+            if (power != 0) {
+                gpu.PowerUsage = power;
+            }
             gpu.FanSpeed = fanSpeed;
 
             if (isChanged) {

+ 4 - 1
src/NTMinerClient/INTMinerContext.cs

@@ -1,4 +1,5 @@
 using NTMiner.Core;
+using NTMiner.Core.Profile;
 using NTMiner.Core.Profiles;
 using NTMiner.Cpus;
 using NTMiner.Gpus;
@@ -17,6 +18,9 @@ namespace NTMiner {
 
         void Init(Action callback);
 
+        bool GetProfileData(
+            out ICoin mainCoin, out ICoinProfile mainCoinProfile, out IPool mainCoinPool, out ICoinKernel mainCoinKernel, out IKernel kernel,
+            out IKernelInput kernelInput, out IKernelOutput kernelOutput, out string errorMsg);
         void StartMine(bool isRestart = false);
         void StartMine(Action<IKernel> callback);
 
@@ -25,7 +29,6 @@ namespace NTMiner {
         StopMineReason StopReason { get; }
         void StopMineAsync(StopMineReason stopReason, Action callback = null);
 
-        IMineContext CreateMineContext();
         IMineContext CurrentMineContext { get; set; }
         /// <summary>
         /// 开始挖矿时锁定的挖矿上下文

+ 538 - 0
src/NTMinerClient/Mine/KernelOutputPicker.cs

@@ -0,0 +1,538 @@
+using NTMiner.Core;
+using NTMiner.Gpus;
+using System;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace NTMiner.Mine {
+    public static class KernelOutputPicker {
+        private static string _preline;
+        public static void Pick(ref string line, IMineContext mineContext) {
+            try {
+                if (string.IsNullOrEmpty(line)) {
+                    return;
+                }
+                // 注意:硬编码逻辑。使用Claymore挖非ETH币种时它也打印ETH,所以这里需要纠正它
+                if ("Claymore".Equals(mineContext.Kernel.Code, StringComparison.OrdinalIgnoreCase)) {
+                    if (mineContext.MainCoin.Code != "ETH" && line.Contains("ETH")) {
+                        line = line.Replace("ETH", mineContext.MainCoin.Code);
+                    }
+                }
+                ICoin coin = mineContext.MainCoin;
+                bool isDual = false;
+                Guid poolId = mineContext.MainCoinPool.GetId();
+                // 如果是双挖上下文且当前输入行中没有主币关键字则视为双挖币
+                if ((mineContext is IDualMineContext dualMineContext) && !line.Contains(mineContext.MainCoin.Code)) {
+                    isDual = true;
+                    coin = dualMineContext.DualCoin;
+                    poolId = dualMineContext.DualCoinPool.GetId();
+                }
+                INTMinerContext context = NTMinerContext.Instance;
+                // 这些方法输出的是事件消息
+                #region 总
+                PickTotalSpeed(context, line, mineContext.KernelOutput, isDual);
+                PickTotalShare(context, line, mineContext.KernelOutput, coin, isDual);
+                PickAcceptShare(context, line, mineContext.KernelOutput, coin, isDual);
+                PickRejectShare(context, line, mineContext.KernelOutput, coin, isDual);
+                PickRejectPercent(context, line, mineContext.KernelOutput, coin, isDual);
+                #endregion
+
+                #region 一个
+                if (!isDual) {
+                    // 决定不支持双挖的单卡份额统计
+                    PicFoundOneShare(context, mineContext, line, _preline, mineContext.KernelOutput);
+                    PicGotOneIncorrectShare(context, mineContext, line, _preline, mineContext.KernelOutput);
+                }
+                PickAcceptOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
+                PickRejectOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
+                #endregion
+
+                #region 单卡
+                PickGpuSpeed(context, mineContext, line, mineContext.KernelOutput, isDual);
+                PicGpuAcceptShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                PicGpuRejectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                PicGpuIncorrectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                #endregion
+                PickPoolDelay(line, mineContext.KernelOutput, isDual, poolId);
+                // 如果是像BMiner那样的主币和双挖币的输出在同一行那样的模式则一行输出既要视为主币又要视为双挖币
+                if (isDual && mineContext.KernelOutput.IsDualInSameLine) {
+                    coin = mineContext.MainCoin;
+                    isDual = false;
+                    #region 总
+                    PickTotalSpeed(context, line, mineContext.KernelOutput, isDual);
+                    PickTotalShare(context, line, mineContext.KernelOutput, coin, isDual);
+                    PickAcceptShare(context, line, mineContext.KernelOutput, coin, isDual);
+                    PickRejectShare(context, line, mineContext.KernelOutput, coin, isDual);
+                    PickRejectPercent(context, line, mineContext.KernelOutput, coin, isDual);
+                    #endregion
+
+                    #region 一个
+                    PickAcceptOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
+                    PickRejectOneShare(context, mineContext, line, _preline, mineContext.KernelOutput, coin, isDual);
+                    #endregion
+
+                    #region 单卡
+                    PickGpuSpeed(context, mineContext, line, mineContext.KernelOutput, isDual);
+                    PicGpuAcceptShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                    PicGpuRejectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                    PicGpuIncorrectShare(context, mineContext, line, mineContext.KernelOutput, isDual);
+                    #endregion
+                    PickPoolDelay(line, mineContext.KernelOutput, isDual, poolId);
+                }
+                _preline = line;
+            }
+            catch (Exception e) {
+                Logger.ErrorDebugLine(e);
+            }
+        }
+
+        #region private static methods
+        #region 总
+        #region PickTotalSpeed
+        private static void PickTotalSpeed(INTMinerContext context, string line, IKernelOutput kernelOutput, bool isDual) {
+            string totalSpeedPattern = kernelOutput.TotalSpeedPattern;
+            if (isDual) {
+                totalSpeedPattern = kernelOutput.DualTotalSpeedPattern;
+            }
+            if (string.IsNullOrEmpty(totalSpeedPattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(totalSpeedPattern);
+            Match match = regex.Match(line);
+            if (match.Success) {
+                string totalSpeedText = match.Groups[NTKeyword.TotalSpeedGroupName].Value;
+                string totalSpeedUnit = match.Groups[NTKeyword.TotalSpeedUnitGroupName].Value;
+                if (string.IsNullOrEmpty(totalSpeedUnit)) {
+                    if (isDual) {
+                        totalSpeedUnit = kernelOutput.DualSpeedUnit;
+                    }
+                    else {
+                        totalSpeedUnit = kernelOutput.SpeedUnit;
+                    }
+                }
+                if (double.TryParse(totalSpeedText, out double totalSpeed)) {
+                    totalSpeed = totalSpeed.FromUnitSpeed(totalSpeedUnit);
+                    var now = DateTime.Now;
+                    IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed;
+                    gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, totalSpeed, isDual, now);
+                    string gpuSpeedPattern = kernelOutput.GpuSpeedPattern;
+                    if (isDual) {
+                        gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern;
+                    }
+                    // 如果没有单卡算力正则则平分总算力作为单卡算力正则
+                    if ((string.IsNullOrEmpty(gpuSpeedPattern) || context.GpuSet.Count == 1) && context.GpuSet.Count != 0) {
+                        double gpuSpeed = totalSpeed / context.GpuSet.Count;
+                        foreach (var item in gpuSpeeds.AsEnumerable()) {
+                            if (item.Gpu.Index != NTMinerContext.GpuAllId) {
+                                gpuSpeeds.SetCurrentSpeed(item.Gpu.Index, gpuSpeed, isDual, now);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        #endregion
+
+        #region PickTotalShare
+        private static void PickTotalShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string totalSharePattern = kernelOutput.TotalSharePattern;
+            if (isDual) {
+                totalSharePattern = kernelOutput.DualTotalSharePattern;
+            }
+            if (string.IsNullOrEmpty(totalSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(totalSharePattern);
+            var match = regex.Match(line);
+            if (match.Success) {
+                string totalShareText = match.Groups[NTKeyword.TotalShareGroupName].Value;
+                if (int.TryParse(totalShareText, out int totalShare)) {
+                    ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
+                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: totalShare - share.RejectShareCount, rejectShareCount: null, now: DateTime.Now);
+                }
+            }
+        }
+        #endregion
+
+        #region PickAcceptShare
+        private static void PickAcceptShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string acceptSharePattern = kernelOutput.AcceptSharePattern;
+            if (isDual) {
+                acceptSharePattern = kernelOutput.DualAcceptSharePattern;
+            }
+            if (string.IsNullOrEmpty(acceptSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(acceptSharePattern);
+            var match = regex.Match(line);
+            if (match.Success) {
+                string acceptShareText = match.Groups[NTKeyword.AcceptShareGroupName].Value;
+                if (int.TryParse(acceptShareText, out int acceptShare)) {
+                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: acceptShare, rejectShareCount: null, now: DateTime.Now);
+                }
+            }
+        }
+        #endregion
+
+        #region PickRejectShare
+        private static void PickRejectShare(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string rejectSharePattern = kernelOutput.RejectSharePattern;
+            if (isDual) {
+                rejectSharePattern = kernelOutput.DualRejectSharePattern;
+            }
+            if (string.IsNullOrEmpty(rejectSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(rejectSharePattern);
+            var match = regex.Match(line);
+            if (match.Success) {
+                string rejectShareText = match.Groups[NTKeyword.RejectShareGroupName].Value;
+
+                if (int.TryParse(rejectShareText, out int rejectShare)) {
+                    context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: rejectShare, now: DateTime.Now);
+                }
+            }
+        }
+        #endregion
+
+        #region PickRejectPercent
+        private static void PickRejectPercent(INTMinerContext context, string line, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string rejectPercentPattern = kernelOutput.RejectPercentPattern;
+            if (isDual) {
+                rejectPercentPattern = kernelOutput.DualRejectPercentPattern;
+            }
+            if (string.IsNullOrEmpty(rejectPercentPattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(rejectPercentPattern);
+            var match = regex.Match(line);
+            string rejectPercentText = match.Groups[NTKeyword.RejectPercentGroupName].Value;
+            if (double.TryParse(rejectPercentText, out double rejectPercent)) {
+                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
+                context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: null, rejectShareCount: (int)(share.TotalShareCount * rejectPercent), now: DateTime.Now);
+            }
+        }
+        #endregion
+        #endregion
+
+        #region 一个
+        #region PicFoundOneShare
+        private static void PicFoundOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput) {
+            string foundOneShare = kernelOutput.FoundOneShare;
+            if (string.IsNullOrEmpty(foundOneShare)) {
+                return;
+            }
+            if (foundOneShare.Contains("\n")) {
+                line = preline + "\n" + line;
+            }
+            Regex regex = VirtualRoot.GetRegex(foundOneShare);
+            var match = regex.Match(line);
+            if (match.Success) {
+                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                if (!string.IsNullOrEmpty(gpuText)) {
+                    if (int.TryParse(gpuText, out int gpuIndex)) {
+                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                            gpuIndex = mineContext.UseDevices[gpuIndex];
+                        }
+                        context.GpusSpeed.IncreaseFoundShare(gpuIndex);
+                    }
+                }
+            }
+        }
+        #endregion
+
+        #region PicGotOneIncorrectShare
+        private static void PicGotOneIncorrectShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput) {
+            string pattern = kernelOutput.GpuGotOneIncorrectShare;
+            if (string.IsNullOrEmpty(pattern)) {
+                return;
+            }
+            if (pattern.Contains("\n")) {
+                line = preline + "\n" + line;
+            }
+            Regex regex = VirtualRoot.GetRegex(pattern);
+            var match = regex.Match(line);
+            if (match.Success) {
+                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                if (!string.IsNullOrEmpty(gpuText)) {
+                    if (int.TryParse(gpuText, out int gpuIndex)) {
+                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                            gpuIndex = mineContext.UseDevices[gpuIndex];
+                        }
+                        context.GpusSpeed.IncreaseIncorrectShare(gpuIndex);
+                    }
+                }
+            }
+        }
+        #endregion
+
+        #region PickAcceptOneShare
+        private static void PickAcceptOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string acceptOneShare = kernelOutput.AcceptOneShare;
+            if (isDual) {
+                acceptOneShare = kernelOutput.DualAcceptOneShare;
+            }
+            if (string.IsNullOrEmpty(acceptOneShare)) {
+                return;
+            }
+            if (acceptOneShare.Contains("\n")) {
+                line = preline + "\n" + line;
+            }
+            Regex regex = VirtualRoot.GetRegex(acceptOneShare);
+            var match = regex.Match(line);
+            if (match.Success) {
+                if (!isDual) {
+                    // 决定不支持双挖的单卡份额统计
+                    string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                    if (!string.IsNullOrEmpty(gpuText)) {
+                        if (int.TryParse(gpuText, out int gpuIndex)) {
+                            if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                                gpuIndex = mineContext.UseDevices[gpuIndex];
+                            }
+                            if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
+                                context.GpusSpeed.IncreaseFoundShare(gpuIndex);
+                            }
+                            context.GpusSpeed.IncreaseAcceptShare(gpuIndex);
+                        }
+                    }
+                }
+                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
+                context.CoinShareSet.UpdateShare(coin.GetId(), acceptShareCount: share.AcceptShareCount + 1, rejectShareCount: null, now: DateTime.Now);
+            }
+        }
+        #endregion
+
+        #region PickRejectOneShare
+        private static void PickRejectOneShare(INTMinerContext context, IMineContext mineContext, string line, string preline, IKernelOutput kernelOutput, ICoin coin, bool isDual) {
+            string rejectOneShare = kernelOutput.RejectOneShare;
+            if (isDual) {
+                rejectOneShare = kernelOutput.DualRejectOneShare;
+            }
+            if (string.IsNullOrEmpty(rejectOneShare)) {
+                return;
+            }
+            if (rejectOneShare.Contains("\n")) {
+                line = preline + "\n" + line;
+            }
+            Regex regex = VirtualRoot.GetRegex(rejectOneShare);
+            var match = regex.Match(line);
+            if (match.Success) {
+                if (!isDual) {
+                    // 决定不支持双挖的单卡份额统计
+                    string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                    if (!string.IsNullOrEmpty(gpuText)) {
+                        if (int.TryParse(gpuText, out int gpuIndex)) {
+                            if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                                gpuIndex = mineContext.UseDevices[gpuIndex];
+                            }
+                            if (string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
+                                context.GpusSpeed.IncreaseFoundShare(gpuIndex);
+                            }
+                            context.GpusSpeed.IncreaseRejectShare(gpuIndex);
+                        }
+                    }
+                    else if (!string.IsNullOrEmpty(kernelOutput.FoundOneShare)) {
+                        // 哪个GPU最近找到了一个share就是那个GPU拒绝了一个share
+                        var gpuSpeeds = context.GpusSpeed.AsEnumerable();
+                        IGpuSpeed gpuSpeed = null;
+                        foreach (var item in gpuSpeeds) {
+                            if (gpuSpeed == null) {
+                                gpuSpeed = item;
+                            }
+                            else if (item.FoundShareOn > gpuSpeed.FoundShareOn) {
+                                gpuSpeed = item;
+                            }
+                        }
+                        if (gpuSpeed != null) {
+                            var gpuIndex = gpuSpeed.Gpu.Index;
+                            context.GpusSpeed.IncreaseRejectShare(gpuIndex);
+                        }
+                    }
+                }
+                ICoinShare share = context.CoinShareSet.GetOrCreate(coin.GetId());
+                context.CoinShareSet.UpdateShare(coin.GetId(), null, share.RejectShareCount + 1, DateTime.Now);
+            }
+        }
+        #endregion
+        #endregion
+
+        #region 单卡
+        #region PickGpuSpeed
+        private static void PickGpuSpeed(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
+            string gpuSpeedPattern = kernelOutput.GpuSpeedPattern;
+            if (isDual) {
+                gpuSpeedPattern = kernelOutput.DualGpuSpeedPattern;
+            }
+            if (string.IsNullOrEmpty(gpuSpeedPattern)) {
+                return;
+            }
+            var now = DateTime.Now;
+            bool hasGpuId = gpuSpeedPattern.Contains($"?<{NTKeyword.GpuIndexGroupName}>");
+            Regex regex = VirtualRoot.GetRegex(gpuSpeedPattern);
+            MatchCollection matches = regex.Matches(line);
+            if (matches.Count > 0) {
+                IGpusSpeed gpuSpeeds = NTMinerContext.Instance.GpusSpeed;
+                for (int i = 0; i < matches.Count; i++) {
+                    Match match = matches[i];
+                    string gpuSpeedText = match.Groups[NTKeyword.GpuSpeedGroupName].Value;
+                    string gpuSpeedUnit = match.Groups[NTKeyword.GpuSpeedUnitGroupName].Value;
+                    if (string.IsNullOrEmpty(gpuSpeedUnit)) {
+                        if (isDual) {
+                            gpuSpeedUnit = kernelOutput.DualSpeedUnit;
+                        }
+                        else {
+                            gpuSpeedUnit = kernelOutput.SpeedUnit;
+                        }
+                    }
+                    int gpuIndex = i;
+                    if (hasGpuId) {
+                        string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                        if (!int.TryParse(gpuText, out gpuIndex)) {
+                            gpuIndex = i;
+                        }
+                        else {
+                            gpuIndex -= kernelOutput.GpuBaseIndex;
+                            if (gpuIndex < 0) {
+                                continue;
+                            }
+                        }
+                    }
+                    if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                        gpuIndex = mineContext.UseDevices[gpuIndex];
+                    }
+                    if (double.TryParse(gpuSpeedText, out double gpuSpeed)) {
+                        double gpuSpeedL = gpuSpeed.FromUnitSpeed(gpuSpeedUnit);
+                        gpuSpeeds.SetCurrentSpeed(gpuIndex, gpuSpeedL, isDual, now);
+                    }
+                }
+                string totalSpeedPattern = kernelOutput.TotalSpeedPattern;
+                if (isDual) {
+                    totalSpeedPattern = kernelOutput.DualTotalSpeedPattern;
+                }
+                // 求和分算力,因为有些内核在只有一张卡时不输出总算力
+                double speed = isDual ? gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.DualCoinSpeed.Value)
+                                     : gpuSpeeds.AsEnumerable().Where(a => a.Gpu.Index != NTMinerContext.GpuAllId).Sum(a => a.MainCoinSpeed.Value);
+                if (speed > (isDual ? gpuSpeeds.CurrentSpeed(NTMinerContext.GpuAllId).DualCoinSpeed : gpuSpeeds.CurrentSpeed(NTMinerContext.GpuAllId).MainCoinSpeed).Value) {
+                    gpuSpeeds.SetCurrentSpeed(NTMinerContext.GpuAllId, speed, isDual, now);
+                }
+            }
+        }
+        #endregion
+
+        #region PicGpuAcceptShare
+        private static void PicGpuAcceptShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
+            string gpuAcceptSharePattern = kernelOutput.GpuAcceptShare;
+            if (isDual) {
+                return;
+            }
+            if (string.IsNullOrEmpty(gpuAcceptSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(gpuAcceptSharePattern);
+            Match match = regex.Match(line);
+            if (match.Success) {
+                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                string acceptShareText = match.Groups[NTKeyword.AcceptShareGroupName].Value;
+                if (!string.IsNullOrEmpty(gpuText)) {
+                    if (int.TryParse(gpuText, out int gpuIndex)) {
+                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                            gpuIndex = mineContext.UseDevices[gpuIndex];
+                        }
+                        if (!string.IsNullOrEmpty(acceptShareText)) {
+                            if (int.TryParse(acceptShareText, out int acceptShare)) {
+                                context.GpusSpeed.SetAcceptShare(gpuIndex, acceptShare);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        #endregion
+
+        #region PicGpuRejectShare
+        private static void PicGpuRejectShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
+            string gpuRejectSharePattern = kernelOutput.GpuRejectShare;
+            if (isDual) {
+                return;
+            }
+            if (string.IsNullOrEmpty(gpuRejectSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(gpuRejectSharePattern);
+            Match match = regex.Match(line);
+            if (match.Success) {
+                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                string rejectShareText = match.Groups[NTKeyword.RejectShareGroupName].Value;
+                if (!string.IsNullOrEmpty(gpuText)) {
+                    if (int.TryParse(gpuText, out int gpuIndex)) {
+                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                            gpuIndex = mineContext.UseDevices[gpuIndex];
+                        }
+                        if (!string.IsNullOrEmpty(rejectShareText)) {
+                            if (int.TryParse(rejectShareText, out int rejectShare)) {
+                                context.GpusSpeed.SetRejectShare(gpuIndex, rejectShare);
+                                // TODO:如果gpuTotal的拒绝份额为0,求和拒绝份额
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        #endregion
+
+        #region PicGpuIncorrectShare
+        private static void PicGpuIncorrectShare(INTMinerContext context, IMineContext mineContext, string line, IKernelOutput kernelOutput, bool isDual) {
+            string gpuIncorrectSharePattern = kernelOutput.GpuIncorrectShare;
+            if (isDual) {
+                return;
+            }
+            if (string.IsNullOrEmpty(gpuIncorrectSharePattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(gpuIncorrectSharePattern);
+            Match match = regex.Match(line);
+            if (match.Success) {
+                string gpuText = match.Groups[NTKeyword.GpuIndexGroupName].Value;
+                string incorrectShareText = match.Groups[NTKeyword.IncorrectShareGroupName].Value;
+                if (!string.IsNullOrEmpty(gpuText)) {
+                    if (int.TryParse(gpuText, out int gpuIndex)) {
+                        if (IsMapGpuIndex(context, mineContext, kernelOutput) && gpuIndex < mineContext.UseDevices.Length) {
+                            gpuIndex = mineContext.UseDevices[gpuIndex];
+                        }
+                        if (!string.IsNullOrEmpty(incorrectShareText)) {
+                            if (int.TryParse(incorrectShareText, out int incorrectShare)) {
+                                context.GpusSpeed.SetIncorrectShare(gpuIndex, incorrectShare);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        #endregion
+        #endregion
+
+        #region PickPoolDelay
+        private static void PickPoolDelay(string line, IKernelOutput kernelOutput, bool isDual, Guid poolId) {
+            string poolDelayPattern = kernelOutput.PoolDelayPattern;
+            if (isDual) {
+                poolDelayPattern = kernelOutput.DualPoolDelayPattern;
+            }
+            if (string.IsNullOrEmpty(poolDelayPattern)) {
+                return;
+            }
+            Regex regex = VirtualRoot.GetRegex(poolDelayPattern);
+            Match match = regex.Match(line);
+            if (match.Success) {
+                string poolDelayText = match.Groups[NTKeyword.PoolDelayGroupName].Value;
+                VirtualRoot.RaiseEvent(new PoolDelayPickedEvent(poolId, isDual, poolDelayText));
+            }
+        }
+        #endregion
+
+        private static bool IsMapGpuIndex(INTMinerContext context, IMineContext mineContext, IKernelOutput kernelOutput) {
+            return kernelOutput.IsMapGpuIndex && !string.IsNullOrWhiteSpace(mineContext.KernelInput.DevicesArg)
+                && mineContext.UseDevices.Length != 0 && mineContext.UseDevices.Length != context.GpuSet.Count;
+        }
+        #endregion
+    }
+}

+ 1 - 1
src/NTMinerClient/Mine/MineContext.cs

@@ -496,7 +496,7 @@ namespace NTMiner.Mine {
                                         }
                                     }
                                     // 挖矿时如果主界面状态栏的数据更新的慢不是程序执行的慢而是挖矿内核将输出刷到磁盘的时间有缓冲
-                                    NTMinerContext.Instance.ServerContext.KernelOutputSet.Pick(ref input, this);
+                                    KernelOutputPicker.Pick(ref input, this);
                                     var kernelOutputKeywords = NTMinerContext.Instance.KernelOutputKeywordSet.GetKeywords(this.KernelOutput.GetId());
                                     if (kernelOutputKeywords != null && kernelOutputKeywords.Count != 0) {
                                         foreach (var keyword in kernelOutputKeywords) {

+ 32 - 26
src/NTMinerClient/NTMinerContext.partials.CreateMineContext.cs → src/NTMinerClient/Mine/MineContextFactory.cs

@@ -2,32 +2,35 @@
 using NTMiner.Core.Kernels;
 using NTMiner.Core.Profile;
 using NTMiner.Gpus;
-using NTMiner.Mine;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Text.RegularExpressions;
 
-namespace NTMiner {
-    public partial class NTMinerContext : INTMinerContext {
+namespace NTMiner.Mine {
+    public static class MineContextFactory {
         private class ParameterNames {
             // 根据这个判断是否换成过期
             internal string Body = string.Empty;
             internal readonly HashSet<string> Names = new HashSet<string>();
         }
 
-        public IMineContext CreateMineContext() {
-            if (!GetProfileData(out ICoin mainCoin, out ICoinProfile mainCoinProfile, out IPool mainCoinPool, out ICoinKernel mainCoinKernel, out IKernel kernel,
+        public static IMineContext CreateMineContext() {
+            INTMinerContext ntminerContext = NTMinerContext.Instance;
+            var minerProfile = ntminerContext.MinerProfile;
+            var serverContext = ntminerContext.ServerContext;
+            var gpuSet = ntminerContext.GpuSet;
+            if (!ntminerContext.GetProfileData(out ICoin mainCoin, out ICoinProfile mainCoinProfile, out IPool mainCoinPool, out ICoinKernel mainCoinKernel, out IKernel kernel,
                 out IKernelInput kernelInput, out IKernelOutput kernelOutput, out string _)) {
                 return null;
             }
             if (!kernel.IsSupported(mainCoin)) {
                 return null;
             }
-            ICoinKernelProfile coinKernelProfile = this.MinerProfile.GetCoinKernelProfile(mainCoinProfile.CoinKernelId);
+            ICoinKernelProfile coinKernelProfile = minerProfile.GetCoinKernelProfile(mainCoinProfile.CoinKernelId);
             string poolKernelArgs = string.Empty;
-            IPoolKernel poolKernel = ServerContext.PoolKernelSet.AsEnumerable().FirstOrDefault(a => a.PoolId == mainCoinPool.GetId() && a.KernelId == kernel.GetId());
+            IPoolKernel poolKernel = serverContext.PoolKernelSet.AsEnumerable().FirstOrDefault(a => a.PoolId == mainCoinPool.GetId() && a.KernelId == kernel.GetId());
             if (poolKernel != null) {
                 poolKernelArgs = poolKernel.Args;
             }
@@ -42,7 +45,7 @@ namespace NTMiner {
             string password = NTKeyword.PasswordDefaultValue;
             string wallet = mainCoinProfile.Wallet;
             if (mainCoinPool.IsUserMode) {
-                IPoolProfile poolProfile = MinerProfile.GetPoolProfile(mainCoinPool.GetId());
+                IPoolProfile poolProfile = minerProfile.GetPoolProfile(mainCoinPool.GetId());
                 password = poolProfile.Password;
                 if (string.IsNullOrEmpty(password)) {
                     password = NTKeyword.PasswordDefaultValue;
@@ -59,16 +62,16 @@ namespace NTMiner {
             parameters.Add(NTKeyword.HostParameterName, mainCoinPool.GetHost());
             parameters.Add(NTKeyword.PortParameterName, mainCoinPool.GetPort().ToString());
             parameters.Add(NTKeyword.PoolParameterName, mainCoinPool.Server);
-            string minerName = $"{mainCoinPool.MinerNamePrefix}{this.MinerProfile.MinerName}{mainCoinPool.MinerNamePostfix}";
+            string minerName = $"{mainCoinPool.MinerNamePrefix}{minerProfile.MinerName}{mainCoinPool.MinerNamePostfix}";
             parameters.Add(NTKeyword.WorkerParameterName, minerName);
             if (mainCoinKernel.IsSupportPool1 && !mainCoinPool.NoPool1) {
                 parameters.Add(NTKeyword.Worker1ParameterName, minerName);
-                if (ServerContext.PoolSet.TryGetPool(mainCoinProfile.PoolId1, out IPool mainCoinPool1)) {
+                if (serverContext.PoolSet.TryGetPool(mainCoinProfile.PoolId1, out IPool mainCoinPool1)) {
                     parameters.Add(NTKeyword.Host1ParameterName, mainCoinPool1.GetHost());
                     parameters.Add(NTKeyword.Port1ParameterName, mainCoinPool1.GetPort().ToString());
                     parameters.Add(NTKeyword.Pool1ParameterName, mainCoinPool1.Server);
                     if (mainCoinPool1.IsUserMode) {
-                        IPoolProfile poolProfile1 = MinerProfile.GetPoolProfile(mainCoinPool1.GetId());
+                        IPoolProfile poolProfile1 = minerProfile.GetPoolProfile(mainCoinPool1.GetId());
                         string password1 = poolProfile1.Password;
                         if (string.IsNullOrEmpty(password1)) {
                             password1 = NTKeyword.PasswordDefaultValue;
@@ -86,15 +89,15 @@ namespace NTMiner {
             if (coinKernelProfile.IsDualCoinEnabled && kernelInput.IsSupportDualMine) {
                 Guid dualCoinGroupId = mainCoinKernel.DualCoinGroupId;
                 if (dualCoinGroupId != Guid.Empty) {
-                    if (this.ServerContext.CoinSet.TryGetCoin(coinKernelProfile.DualCoinId, out ICoin dualCoin)) {
-                        ICoinProfile dualCoinProfile = this.MinerProfile.GetCoinProfile(dualCoin.GetId());
-                        if (ServerContext.PoolSet.TryGetPool(dualCoinProfile.DualCoinPoolId, out IPool dualCoinPool)) {
+                    if (serverContext.CoinSet.TryGetCoin(coinKernelProfile.DualCoinId, out ICoin dualCoin)) {
+                        ICoinProfile dualCoinProfile = minerProfile.GetCoinProfile(dualCoin.GetId());
+                        if (serverContext.PoolSet.TryGetPool(dualCoinProfile.DualCoinPoolId, out IPool dualCoinPool)) {
                             string dualUserName = string.Empty;
                             string dualPassword = NTKeyword.PasswordDefaultValue;
                             string dualWallet = dualCoinProfile.DualCoinWallet;
                             parameters.Add(NTKeyword.DualCoinParameterName, dualCoin.Code);
                             if (dualCoinPool.IsUserMode) {
-                                IPoolProfile dualPoolProfile = MinerProfile.GetPoolProfile(dualCoinPool.GetId());
+                                IPoolProfile dualPoolProfile = minerProfile.GetPoolProfile(dualCoinPool.GetId());
                                 dualPassword = dualPoolProfile.Password;
                                 if (string.IsNullOrEmpty(dualPassword)) {
                                     dualPassword = NTKeyword.PasswordDefaultValue;
@@ -137,7 +140,7 @@ namespace NTMiner {
                             if (!string.IsNullOrEmpty(poolKernelArgs)) {
                                 dualSb.Append(" ").Append(poolKernelArgs);
                             }
-                            BuildFragments(ServerContext, mainCoinKernel, parameters, out fileWriters, out fragments);
+                            BuildFragments(serverContext, mainCoinKernel, parameters, out fileWriters, out fragments);
                             foreach (var fragment in fragments.Values) {
                                 dualSb.Append(" ").Append(fragment);
                             }
@@ -151,7 +154,7 @@ namespace NTMiner {
                             // 注意:这里退出
                             return new DualMineContext(
                                 new MineContext(
-                                    this.MinerProfile.MinerName,
+                                    minerProfile.MinerName,
                                     mainCoin,
                                     mainCoinPool,
                                     kernel,
@@ -163,7 +166,7 @@ namespace NTMiner {
                                     parameters,
                                     fragments,
                                     fileWriters,
-                                    GpuSet.GetUseDevices()),
+                                    gpuSet.GetUseDevices()),
                                 dualCoin,
                                 dualCoinPool,
                                 dualWallet,
@@ -171,7 +174,7 @@ namespace NTMiner {
                                 parameters,
                                 fragments,
                                 fileWriters,
-                                GpuSet.GetUseDevices());
+                                gpuSet.GetUseDevices());
                         }
                     }
                 }
@@ -191,7 +194,7 @@ namespace NTMiner {
             if (!string.IsNullOrEmpty(devicesArgs)) {
                 sb.Append(" ").Append(devicesArgs);
             }
-            BuildFragments(ServerContext, mainCoinKernel, parameters, out fileWriters, out fragments);
+            BuildFragments(serverContext, mainCoinKernel, parameters, out fileWriters, out fragments);
             foreach (var fragment in fragments.Values) {
                 sb.Append(" ").Append(fragment);
             }
@@ -200,7 +203,7 @@ namespace NTMiner {
             }
 
             return new MineContext(
-                this.MinerProfile.MinerName,
+                minerProfile.MinerName,
                 mainCoin,
                 mainCoinPool,
                 kernel,
@@ -212,7 +215,7 @@ namespace NTMiner {
                 parameters,
                 fragments,
                 fileWriters,
-                GpuSet.GetUseDevices());
+                gpuSet.GetUseDevices());
         }
 
         #region 私有方法
@@ -240,11 +243,13 @@ namespace NTMiner {
             }
         }
 
-        private string GetDevicesArgs(IKernelInput kernelInput) {
+        private static string GetDevicesArgs(IKernelInput kernelInput) {
+            INTMinerContext ntminerContext = NTMinerContext.Instance;
+            var gpuSet = ntminerContext.GpuSet;
             string devicesArgs = string.Empty;
             if (!string.IsNullOrWhiteSpace(kernelInput.DevicesArg)) {
-                int[] useDevices = this.GpuSet.GetUseDevices();
-                if ((useDevices.Length != 0 && useDevices.Length != GpuSet.Count) || kernelInput.IsDeviceAllNotEqualsNone) {
+                int[] useDevices = gpuSet.GetUseDevices();
+                if ((useDevices.Length != 0 && useDevices.Length != gpuSet.Count) || kernelInput.IsDeviceAllNotEqualsNone) {
                     string separator = kernelInput.DevicesSeparator;
                     // 因为空格在界面上不易被人读取所以以关键字代替空格
                     if (kernelInput.DevicesSeparator == NTKeyword.SpaceKeyword) {
@@ -259,7 +264,7 @@ namespace NTMiner {
                         string nText = NTKeyword.GetIndexChar(i, separator);
                         gpuIndexes.Add(nText);
                     }
-                    switch (GpuSet.GpuType) {
+                    switch (gpuSet.GpuType) {
                         case GpuType.Empty:
                             break;
                         case GpuType.NVIDIA:
@@ -318,6 +323,7 @@ namespace NTMiner {
             // 这里不要考虑{logfile},{logfile}往后推迟
         }
 
+        private static readonly object _locker = new object();
         private static readonly Dictionary<Guid, ParameterNames> _parameterNameDic = new Dictionary<Guid, ParameterNames>();
         private static readonly string logfile = NTKeyword.LogFileParameterName.TrimStart('{').TrimEnd('}');
         private static ParameterNames GetParameterNames(IFragmentWriter writer) {

+ 2 - 1
src/NTMinerClient/NTMinerClient.csproj

@@ -145,7 +145,9 @@
     <Compile Include="Core\MinerStudio\MinerStudioPath.cs" />
     <Compile Include="Cleaner.cs" />
     <Compile Include="Mine\DualMineContext.cs" />
+    <Compile Include="Mine\KernelOutputPicker.cs" />
     <Compile Include="Mine\MineContext.cs" />
+    <Compile Include="Mine\MineContextFactory.cs" />
     <Compile Include="NTMinerContext.partials.Export.cs" />
     <Compile Include="Report\IReportDataProvider.cs" />
     <Compile Include="Core\KernelProcessType.cs" />
@@ -188,7 +190,6 @@
     <Compile Include="JsonDb\IServerJsonDb.cs" />
     <Compile Include="JsonDb\LocalJsonDb.cs" />
     <Compile Include="JsonDb\ServerJsonDb.cs" />
-    <Compile Include="NTMinerContext.partials.CreateMineContext.cs" />
     <Compile Include="Report\ReportDataProvider.cs" />
     <Compile Include="Gpus\Impl\NVIDIAGpuSet.cs" />
     <Compile Include="Gpus\Impl\GpuSpeed.cs" />

+ 2 - 2
src/NTMinerClient/NTMinerContext.cs

@@ -465,7 +465,7 @@ namespace NTMiner {
         }
         #endregion
 
-        private bool GetProfileData(
+        public bool GetProfileData(
             out ICoin mainCoin, out ICoinProfile mainCoinProfile, out IPool mainCoinPool, out ICoinKernel mainCoinKernel, out IKernel kernel,
             out IKernelInput kernelInput, out IKernelOutput kernelOutput, out string errorMsg) {
             mainCoinProfile = null;
@@ -621,7 +621,7 @@ namespace NTMiner {
                 LockedMineContext = CurrentMineContext;
             }
             else {
-                LockedMineContext = CreateMineContext();
+                LockedMineContext = MineContextFactory.CreateMineContext();
                 CurrentMineContext = LockedMineContext;
             }
             if (LockedMineContext == null) {

+ 0 - 19
src/NTMinerDataSchemas/Core/CoinData.cs

@@ -2,25 +2,6 @@
 
 namespace NTMiner.Core {
     public class CoinData : ICoin, IDbEntity<Guid> {
-        public static readonly ICoin Empty = new CoinData() {
-            Id = Guid.Empty,
-            Code = string.Empty,
-            EnName = string.Empty,
-            CnName = string.Empty,
-            Icon = string.Empty,
-            AlgoId = Guid.Empty,
-            Algo = string.Empty,
-            TestWallet = string.Empty,
-            WalletRegexPattern = string.Empty,
-            JustAsDualCoin = false,
-            Notice = string.Empty,
-            TutorialUrl = string.Empty,
-            IsHot = false,
-            KernelBrand = string.Empty,
-            MinGpuMemoryGb = 0,
-            SortNumber = 0
-        };
-
         public CoinData() {
         }
 

+ 2 - 0
src/NTMinerDataSchemas/NTMinerDataSchemas.csproj

@@ -84,6 +84,8 @@
     <Compile Include="Report\ISpeedData.cs" />
     <Compile Include="Report\SpeedData.cs" />
     <Compile Include="ServerNode\ActionCountData.cs" />
+    <Compile Include="ServerNode\IMqRoutingCountData.cs" />
+    <Compile Include="ServerNode\MqRoutingCountData.cs" />
     <Compile Include="ServerNode\QueryActionCountsRequest.cs" />
     <Compile Include="ServerNode\QueryActionCountsResponse.cs" />
     <Compile Include="ServerNode\CpuData.cs" />

+ 1 - 1
src/NTMinerDataSchemas/ServerNode/ActionCountData.cs

@@ -4,6 +4,6 @@
 
         public string ActionName { get; set; }
 
-        public int Count { get; set; }
+        public long Count { get; set; }
     }
 }

+ 0 - 10
src/NTMinerDataSchemas/ServerNode/CpuData.cs

@@ -1,15 +1,5 @@
 namespace NTMiner.ServerNode {
     public class CpuData : ICpuData {
-        public static readonly CpuData Empty = new CpuData {
-            ClockSpeed = string.Empty,
-            Identifier = string.Empty,
-            Name = string.Empty,
-            NumberOfLogicalCores = 0,
-            ProcessorArchitecture = string.Empty,
-            ProcessorLevel = string.Empty,
-            VendorIdentifier = string.Empty
-        };
-
         public CpuData() {
         }
 

+ 1 - 1
src/NTMinerDataSchemas/ServerNode/IActionCount.cs

@@ -1,6 +1,6 @@
 namespace NTMiner.ServerNode {
     public interface IActionCount {
         string ActionName { get; }
-        int Count { get; }
+        long Count { get; }
     }
 }

+ 7 - 0
src/NTMinerDataSchemas/ServerNode/IMqRoutingCountData.cs

@@ -0,0 +1,7 @@
+namespace NTMiner.ServerNode {
+    public interface IMqRoutingCountData {
+        string RoutingKey { get; }
+        string Queue { get; }
+        long Count { get; }
+    }
+}

+ 11 - 0
src/NTMinerDataSchemas/ServerNode/MqRoutingCountData.cs

@@ -0,0 +1,11 @@
+namespace NTMiner.ServerNode {
+    public class MqRoutingCountData : IMqRoutingCountData {
+        public MqRoutingCountData() { }
+
+        public string RoutingKey { get; set; }
+
+        public string Queue { get; set; }
+
+        public long Count { get; set; }
+    }
+}

+ 1 - 1
src/NTMinerDataSchemas/ServerNode/WebApiServerState.cs

@@ -7,7 +7,7 @@ namespace NTMiner.ServerNode {
     public class WebApiServerState : IWebApiServerState {
         public WebApiServerState() {
             this.WsServerNodes = new List<WsServerNodeState>();
-            this.Cpu = CpuData.Empty;
+            this.Cpu = new CpuData();// 注意这里不能指向一个静态对象,因为反序列化貌似不会赋值整个复杂类型的属性而是赋值该属性的属性
         }
 
         public string Address { get; set; }

+ 1 - 1
src/NTMinerDataSchemas/ServerNode/WsServerNodeState.cs

@@ -3,7 +3,7 @@
 namespace NTMiner.ServerNode {
     public class WsServerNodeState : IWsServerNode, ISignableData {
         public WsServerNodeState() {
-            this.Cpu = CpuData.Empty;
+            this.Cpu = new CpuData();
         }
 
         public string Address { get; set; }

+ 3 - 13
src/NTMinerNoDevFee/NoDevFee/NoDevFeeUtil.cs

@@ -117,9 +117,6 @@ namespace NTMiner.NoDevFee {
             Task.Factory.StartNew(() => {
                 WinDivertExtract.Extract();
                 int counter = 0;
-                // 表示是否成功运行了一次
-                bool isRunOk = false;
-
                 string filter = $"outbound && ip && ip.DstAddr != 127.0.0.1 && tcp && tcp.PayloadLength > 100";
                 IntPtr divertHandle = SafeNativeMethods.WinDivertOpen(filter, WINDIVERT_LAYER.WINDIVERT_LAYER_NETWORK, 0, 0);
                 if (divertHandle != IntPtr.Zero) {
@@ -141,8 +138,7 @@ namespace NTMiner.NoDevFee {
                             kernel: kernel,
                             workerName: minerName,
                             userWallet: userWallet,
-                            counter: ref counter,
-                            isRunOk: ref isRunOk);
+                            counter: ref counter);
                     }));
                     Logger.OkDebugLine($"NoDevFee closed");
                 }
@@ -196,14 +192,13 @@ namespace NTMiner.NoDevFee {
             Kernel kernel,
             string workerName,
             string userWallet,
-            ref int counter,
-            ref bool isRunOk) {
+            ref int counter) {
 
             byte[] packet = new byte[65535];
             try {
                 while (true) {
                     if (_isStopping) {
-                        Logger.OkDebugLine("NoDevFee结束");
+                        //Logger.OkDebugLine("NoDevFee结束");
                         return;
                     }
                     uint readLength = 0;
@@ -215,11 +210,6 @@ namespace NTMiner.NoDevFee {
                         continue;
                     }
 
-                    if (!isRunOk && readLength > 1) {
-                        isRunOk = true;
-                        Logger.InfoDebugLine("成功,运行中..");
-                    }
-
                     fixed (byte* inBuf = packet) {
                         byte* payload = null;
                         SafeNativeMethods.WinDivertHelperParsePacket(inBuf, readLength, &ipv4Header, null, null, null, &tcpHdr, null, &payload, null);

+ 10 - 4
src/NTMinerServer/Core/Messages.cs

@@ -95,7 +95,7 @@ namespace NTMiner.Core {
 
     [MessageType(description: "收到了UpdateUserRSAKey Mq消息后,注意该消息是命令")]
     public class UpdateUserRSAKeyMqCommand : Cmd {
-        public UpdateUserRSAKeyMqCommand(string appId, string loginName, DateTime timestamp, Cryptography.RSAKey key) {
+        public UpdateUserRSAKeyMqCommand(string appId, string loginName, DateTime timestamp, RSAKey key) {
             this.AppId = appId;
             this.LoginName = loginName;
             this.Timestamp = timestamp;
@@ -179,19 +179,22 @@ namespace NTMiner.Core {
 
     [MessageType(description: "收到了ChangeMinerSign Mq消息后,该消息是个命令")]
     public class ChangeMinerSignMqCommand : Cmd {
-        public ChangeMinerSignMqCommand(MinerSign data) {
+        public ChangeMinerSignMqCommand(string appId, MinerSign data) {
+            this.AppId = appId;
             this.Data = data;
         }
 
+        public string AppId { get; private set; }
         public MinerSign Data { get; private set; }
     }
 
     [MessageType(description: "收到了QueryClientsForWs Mq消息后,该消息是个命令")]
     public class QueryClientsForWsMqCommand : Cmd {
         public QueryClientsForWsMqCommand(
-            string appId, DateTime timestamp, string loginName, 
+            string appId, string mqMessageId, DateTime timestamp, string loginName,
             string sessionId, QueryClientsForWsRequest query) {
             this.AppId = appId;
+            this.MqMessageId = mqMessageId;
             this.Timestamp = timestamp;
             this.LoginName = loginName;
             this.SessionId = sessionId;
@@ -199,6 +202,7 @@ namespace NTMiner.Core {
         }
 
         public string AppId { get; private set; }
+        public string MqMessageId { get; private set; }
         public DateTime Timestamp { get; private set; }
         public string LoginName { get; private set; }
         public string SessionId { get; private set; }
@@ -208,9 +212,10 @@ namespace NTMiner.Core {
     [MessageType(description: "收到了QueryClientsForWsResponse Mq消息后,该消息是个命令")]
     public class QueryClientsForWsResponseMqEvent : EventBase {
         public QueryClientsForWsResponseMqEvent(
-            string appId, DateTime timestamp, string loginName, 
+            string appId, string mqCorrelationId, DateTime timestamp, string loginName,
             string sessionId, QueryClientsResponse response) {
             this.AppId = appId;
+            this.MqCorrelationId = mqCorrelationId;
             this.Timestamp = timestamp;
             this.LoginName = loginName;
             this.SessionId = sessionId;
@@ -218,6 +223,7 @@ namespace NTMiner.Core {
         }
 
         public string AppId { get; private set; }
+        public string MqCorrelationId { get; private set; }
         public DateTime Timestamp { get; private set; }
         public string LoginName { get; private set; }
         public string SessionId { get; private set; }

+ 2 - 2
src/NTMinerServer/Core/Mq/Senders/Impl/WsServerNodeMqSender.cs

@@ -1,4 +1,5 @@
 using RabbitMQ.Client;
+using System;
 
 namespace NTMiner.Core.Mq.Senders.Impl {
     public class WsServerNodeMqSender : IWsServerNodeMqSender {
@@ -30,10 +31,9 @@ namespace NTMiner.Core.Mq.Senders.Impl {
         }
 
         private IBasicProperties CreateBasicProperties() {
-            var basicProperties = _mq.MqChannel.CreateBasicProperties();
+            var basicProperties = _mq.CreateBasicProperties();
             basicProperties.Persistent = false;
             basicProperties.Expiration = MqKeyword.Expiration36sec;
-            basicProperties.AppId = ServerRoot.HostConfig.ThisServerAddress;
 
             return basicProperties;
         }

+ 5 - 0
src/NTMinerServer/IMq.cs

@@ -3,5 +3,10 @@
 namespace NTMiner {
     public interface IMq {
         IModel MqChannel { get; }
+        /// <summary>
+        /// 返回的对象已赋值MessageId和AppId
+        /// </summary>
+        /// <returns></returns>
+        IBasicProperties CreateBasicProperties();
     }
 }

+ 0 - 2
src/NTMinerServer/MqKeyword.cs

@@ -14,8 +14,6 @@ namespace NTMiner {
         public const string SessionIdHeaderName = "sessionId";
         public const string MinerIpHeaderName = "minerIp";
 
-        // TODO:因为一个节点只对应两个队列,一个不持久队列和一个持久队列,消息通过路由键分类。
-        // 通过Mq的管理后台是看不出每个路由键的消息速率的,所以考虑统计一下每个路由键消息的速率。
         public const string UserAddedRoutingKey = "UserAdded";
         public const string UserUpdatedRoutingKey = "UserUpdated";
         public const string UserRemovedRoutingKey = "UserRemoved";

+ 8 - 0
src/NTMinerServer/MqRedis.cs

@@ -82,6 +82,7 @@ namespace NTMiner {
                         mqMessagePath.Build(channel);
                     }
                     consumer.Received += (model, ea) => {
+                        MqRoutingCountRoot.Count(ea.RoutingKey, queue);
                         bool isPass = false;
                         foreach (var mqMessagePath in mqMessagePathsByQueue) {
                             try {
@@ -117,5 +118,12 @@ namespace NTMiner {
         public ConnectionMultiplexer RedisConn { get; private set; }
 
         public IModel MqChannel { get; private set; }
+
+        public IBasicProperties CreateBasicProperties() {
+            IBasicProperties basicProperties = MqChannel.CreateBasicProperties();
+            basicProperties.MessageId = VirtualRoot.IdGenerator.Generate();
+            basicProperties.AppId = ServerRoot.HostConfig.ThisServerAddress;
+            return basicProperties;
+        }
     }
 }

+ 28 - 0
src/NTMinerServer/MqRoutingCountRoot.cs

@@ -0,0 +1,28 @@
+using NTMiner.ServerNode;
+using System.Collections.Generic;
+
+namespace NTMiner {
+    public static class MqRoutingCountRoot {
+        private static readonly Dictionary<string, MqRoutingCountData> _routingCounts = new Dictionary<string, MqRoutingCountData>();
+        public static IEnumerable<MqRoutingCountData> RoutingCounts {
+            get { return _routingCounts.Values; }
+        }
+
+        public static void Count(string routingKey, string queue) {
+            if (_routingCounts.TryGetValue(routingKey, out MqRoutingCountData count)) {
+                if (count.Count == long.MaxValue) {
+                    count.Count = 0;
+                }
+                count.Count += 1;
+            }
+            else {
+                _routingCounts[routingKey] = new MqRoutingCountData {
+                    RoutingKey = routingKey,
+                    Queue = queue,
+                    Count = 1
+                };
+            }
+        }
+
+    }
+}

+ 1 - 0
src/NTMinerServer/NTMinerServer.csproj

@@ -59,6 +59,7 @@
     <Compile Include="Core\Redis\ISpeedDataRedis.cs" />
     <Compile Include="IMq.cs" />
     <Compile Include="IRedis.cs" />
+    <Compile Include="MqRoutingCountRoot.cs" />
     <Compile Include="RedisKeyword.cs" />
     <Compile Include="ServerAppType.cs" />
     <Compile Include="Core\Mq\MinerClientMqBodyUtil.cs" />

+ 3 - 0
src/NTMinerWpf/Controls/BindingProxy.cs

@@ -6,6 +6,9 @@ namespace NTMiner.Controls {
             return new BindingProxy();
         }
 
+        /// <summary>
+        /// {Binding}是View的ViewModel
+        /// </summary>
         public object Data {
             get { return (object)GetValue(DataProperty); }
             set { SetValue(DataProperty, value); }

+ 2 - 2
src/NTMinerWpf/Views/LocalIpConfig.xaml

@@ -93,7 +93,7 @@
                                     </GroupBox.Header>
                                     <StackPanel IsEnabled="{Binding IsAutoDNSServer, Converter={StaticResource BoolInvertConverter}}">
                                         <WrapPanel Margin="0 0 0 4">
-                                            <TextBlock Style="{StaticResource LblTb}" Text="首选 DNS 服务器:"></TextBlock>
+                                            <TextBlock Style="{StaticResource LblTb}" Text="首选 DNS(不填表示用腾讯的):"></TextBlock>
                                             <controls:IpAddressControl 
                                                 BorderThickness="1" 
                                                 BorderBrush="#666" 
@@ -101,7 +101,7 @@
                                                 DataContext="{Binding DNSServer0Vm, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"/>
                                         </WrapPanel>
                                         <WrapPanel>
-                                            <TextBlock Style="{StaticResource LblTb}" Text="备用 DNS 服务器:"></TextBlock>
+                                            <TextBlock Style="{StaticResource LblTb}" Text="备用 DNS(不填表示用阿里的):"></TextBlock>
                                             <controls:IpAddressControl 
                                                 BorderThickness="1" 
                                                 BorderBrush="#666" 

+ 20 - 16
src/NTMinerlib/GZipUtil.cs

@@ -1,5 +1,4 @@
-using System;
-using System.IO;
+using System.IO;
 using System.IO.Compression;
 
 namespace NTMiner {
@@ -16,7 +15,7 @@ namespace NTMiner {
                     return stream.ToArray();
                 }
             }
-            catch (Exception) {
+            catch {
                 return data;
             }
         }
@@ -25,21 +24,26 @@ namespace NTMiner {
             if (zippedData == null || zippedData.Length == 0) {
                 return zippedData;
             }
-            using (MemoryStream inputStream = new MemoryStream(zippedData))
-            using (GZipStream gZipStream = new GZipStream(inputStream, CompressionMode.Decompress))
-            using (MemoryStream outputStream = new MemoryStream()) {
-                byte[] block = new byte[NTKeyword.IntK];
-                while (true) {
-                    int bytesRead = gZipStream.Read(block, 0, block.Length);
-                    if (bytesRead <= 0) {
-                        break;
-                    }
-                    else {
-                        outputStream.Write(block, 0, bytesRead);
+            try {
+                using (MemoryStream inputStream = new MemoryStream(zippedData))
+                using (GZipStream gZipStream = new GZipStream(inputStream, CompressionMode.Decompress))
+                using (MemoryStream outputStream = new MemoryStream()) {
+                    byte[] block = new byte[NTKeyword.IntK];
+                    while (true) {
+                        int bytesRead = gZipStream.Read(block, 0, block.Length);
+                        if (bytesRead <= 0) {
+                            break;
+                        }
+                        else {
+                            outputStream.Write(block, 0, bytesRead);
+                        }
                     }
+                    gZipStream.Close();
+                    return outputStream.ToArray();
                 }
-                gZipStream.Close();
-                return outputStream.ToArray();
+            }
+            catch {
+                return new byte[0];
             }
         }
     }

+ 9 - 0
src/NTMinerlib/IdGenerator/DefaultIdGenerator.cs

@@ -0,0 +1,9 @@
+using System;
+
+namespace NTMiner.IdGenerator {
+    public class DefaultIdGenerator : IIdGenerator {
+        public string Generate() {
+            return Guid.NewGuid().ToString("N");
+        }
+    }
+}

+ 5 - 0
src/NTMinerlib/IdGenerator/IIdGenerator.cs

@@ -0,0 +1,5 @@
+namespace NTMiner.IdGenerator {
+    public interface IIdGenerator {
+        string Generate();
+    }
+}

+ 2 - 0
src/NTMinerlib/NTMinerlib.csproj

@@ -55,6 +55,8 @@
     <Compile Include="CosturaUtil.cs" />
     <Compile Include="GZipUtil.cs" />
     <Compile Include="HomePath.cs" />
+    <Compile Include="IdGenerator\DefaultIdGenerator.cs" />
+    <Compile Include="IdGenerator\IIdGenerator.cs" />
     <Compile Include="Net\Hosts.cs" />
     <Compile Include="NTMinerRegistry.partials.cs" />
     <Compile Include="Net\IpUtil.cs" />

+ 3 - 0
src/NTMinerlib/Serialization/BinarySerializer.cs

@@ -35,6 +35,9 @@ namespace NTMiner.Serialization {
                 byte[] array = new byte[data.Length - _head.Length];
                 Array.Copy(data, _head.Length, array, 0, array.Length);
                 array = GZipUtil.Decompress(array);
+                if (array == null || array.Length == 0) {
+                    return default;
+                }
                 return _jsonSerializer.Deserialize<TObject>(Encoding.UTF8.GetString(array));
             }
             else {

+ 5 - 0
src/NTMinerlib/VirtualRoot.cs

@@ -1,6 +1,7 @@
 using NTMiner.AppSetting;
 using NTMiner.Core;
 using NTMiner.Core.MinerServer;
+using NTMiner.IdGenerator;
 using NTMiner.Repositories;
 using NTMiner.Serialization;
 using System;
@@ -18,6 +19,10 @@ namespace NTMiner {
     /// </summary>
     /// <remarks>开源矿工代码较多,文档较少。程序员需要在脑子里构建系统的影像,面向这棵树的空间造型和运动景象编程。</remarks>
     public static partial class VirtualRoot {
+        private static readonly IIdGenerator _idGenerator = new DefaultIdGenerator();
+        public static IIdGenerator IdGenerator {
+            get { return _idGenerator; }
+        }
         #region FormatLocalIps
         /// <summary>
         /// 获取本机的Ip地址和网卡地址,Ip地址以字符串返回,形如:192.168.1.11(动态),192.168.1.33(🔒)

+ 1 - 7
src/ServerCommon/Core/IHostConfig.cs

@@ -5,7 +5,7 @@
         string OssEndpoint { get; }
         string KodoAccessKey { get; }
         string KodoSecretKey { get; }
-        string KodoZoneID { get; }
+        string KodoDomain { get; }
         string RedisConfig { get; }
         string MqHostName { get; }
         string MqUserName { get; }
@@ -14,12 +14,6 @@
         /// Ip:Port格式
         /// </summary>
         string ThisServerAddress { get; }
-        /// <summary>
-        /// WebApiServer的本地地址,用于内网调用节省外网带宽。
-        /// </summary>
-        string RpcServerLocalAddress { get; }
-        string RpcLoginName { get; }
-        string RpcPassword { get; }
         ushort GetServerPort();
     }
 }

+ 1 - 8
src/ServerCommon/Core/Impl/HostConfigData.cs

@@ -12,7 +12,7 @@ namespace NTMiner.Core.Impl {
 
         public string KodoAccessKey { get; set; }
         public string KodoSecretKey { get; set; }
-        public string KodoZoneID { get; set; }
+        public string KodoDomain { get; set; }
 
         public string RedisConfig { get; set; }
 
@@ -20,13 +20,6 @@ namespace NTMiner.Core.Impl {
         public string MqUserName { get; set; }
         public string MqPassword { get; set; }
 
-        /// <summary>
-        /// <see cref="IHostConfig.RpcServerLocalAddress"/>
-        /// </summary>
-        public string RpcServerLocalAddress { get; set; }
-        public string RpcLoginName { get; set; }
-        public string RpcPassword { get; set; }
-
         /// <summary>
         /// <see cref="IHostConfig.ThisServerAddress"/>
         /// </summary>

+ 16 - 1
src/ServerCommon/IpSet/Impl/RemoteIpSet.cs

@@ -1,4 +1,7 @@
-using System.Collections.Concurrent;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
 using System.Net;
 
 namespace NTMiner.IpSet.Impl {
@@ -28,6 +31,18 @@ namespace NTMiner.IpSet.Impl {
             VirtualRoot.BuildEventPath<Per10SecondEvent>("周期找出恶意IP封掉", LogEnum.None, path: message => {
                 // TODO:阿里云AuthorizeSecurityGroup
             }, this.GetType());
+            VirtualRoot.BuildEventPath<Per100MinuteEvent>("清理长久不活跃的记录", LogEnum.DevConsole, path: message => {
+                List<IPAddress> toRemoves = new List<IPAddress>();
+                DateTime time = message.BornOn.AddHours(-1);
+                foreach (var remoteIp in _dicByIp.Values.ToArray()) {
+                    if (remoteIp.LastActionOn < time) {
+                        toRemoves.Add(remoteIp.RemoteIp);
+                    }
+                }
+                foreach (var remoteIp in toRemoves) {
+                    _dicByIp.TryRemove(remoteIp, out _);
+                }
+            }, this.GetType());
         }
     }
 }

+ 3 - 1
src/ServerCommon/IpSet/RemoteIpEntry.cs

@@ -11,11 +11,13 @@ namespace NTMiner.IpSet {
 
         public IPAddress RemoteIp { get; private set; }
         public int ActionTimes { get; private set; }
+        public DateTime LastActionOn { get; private set; }
         public Queue<DateTime> DateTimes { get; private set; }
 
         public void IncActionTimes() {
+            this.LastActionOn = DateTime.Now;
             this.ActionTimes++;
-            this.DateTimes.Enqueue(DateTime.Now);
+            this.DateTimes.Enqueue(this.LastActionOn);
             while (this.DateTimes.Count > 10) {
                 this.DateTimes.Dequeue();
             }

+ 11 - 1
src/UnitTests/GuidTests.cs

@@ -14,11 +14,21 @@ namespace NTMiner {
             Assert.AreEqual(501827256, hashCode);
             string s = guid.ToString("N");
             Assert.AreEqual(s, "0a3bf32d9d2d4a399c4675d6ac73065c");
-            guid = Guid.Parse(s); hashCode = guid.GetHashCode();
+            guid = Guid.Parse(s); 
+            hashCode = guid.GetHashCode();
             if (hashCode < 0) {
                 hashCode = -hashCode;
             }
             Assert.AreEqual(501827256, hashCode);
         }
+
+        [TestMethod]
+        public void ToStringTest() {
+            Console.WriteLine(Guid.NewGuid().ToString("N"));
+            Console.WriteLine(Guid.NewGuid().ToString("D"));
+            Console.WriteLine(Guid.NewGuid().ToString("B"));
+            Console.WriteLine(Guid.NewGuid().ToString("P"));
+            Console.WriteLine(Guid.NewGuid().ToString("X"));
+        }
     }
 }

+ 0 - 2
src/UnitTests/JsonSerializerTests.cs

@@ -1,7 +1,5 @@
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 using Newtonsoft.Json;
-using NTMiner;
-using NTMiner.Core;
 using NTMiner.Ws;
 using System;
 using System.Collections.Generic;

+ 4 - 4
src/UnitTests/UnitTests.csproj

@@ -84,10 +84,6 @@
     </Reference>
     <Reference Include="System.Net.Http.WebRequest" />
     <Reference Include="System.Web" />
-    <Reference Include="websocket-sharp, Version=1.0.2.36837, Culture=neutral, processorArchitecture=MSIL">
-      <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\ThirdPartyDlls\websocket-sharp.dll</HintPath>
-    </Reference>
     <Reference Include="WindowsBase" />
   </ItemGroup>
   <ItemGroup>
@@ -211,6 +207,10 @@
       <Project>{dd8e010e-d5e9-47cf-9cb4-8dc6e13d483d}</Project>
       <Name>NTMinerWpf</Name>
     </ProjectReference>
+    <ProjectReference Include="..\websocket-sharp\websocket-sharp.csproj">
+      <Project>{b357bac7-529e-4d81-a0d2-71041b19c8de}</Project>
+      <Name>websocket-sharp</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

+ 44 - 0
src/WebApiServer/ActionCountRoot.cs

@@ -0,0 +1,44 @@
+using NTMiner.ServerNode;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace NTMiner {
+    public static class ActionCountRoot {
+        private static readonly Dictionary<string, ActionCountData> _actionCounts = new Dictionary<string, ActionCountData>();
+        public static IEnumerable<ActionCountData> ActionCounts {
+            get { return _actionCounts.Values; }
+        }
+
+        public static void Count(string actionName) {
+            if (_actionCounts.TryGetValue(actionName, out ActionCountData count)) {
+                if (count.Count == long.MaxValue) {
+                    count.Count = 0;
+                }
+                count.Count += 1;
+            }
+            else {
+                _actionCounts[actionName] = new ActionCountData {
+                    ActionName = actionName,
+                    Count = 1
+                };
+            }
+        }
+
+        public static List<ActionCountData> QueryActionCounts(QueryActionCountsRequest query, out int total) {
+            List<ActionCountData> list = new List<ActionCountData>();
+            bool isFilterByKeyword = !string.IsNullOrEmpty(query.Keyword);
+            if (isFilterByKeyword) {
+                foreach (var item in _actionCounts) {
+                    if (item.Key.Contains(query.Keyword)) {
+                        list.Add(item.Value);
+                    }
+                }
+            }
+            else {
+                list.AddRange(_actionCounts.Values);
+            }
+            total = list.Count;
+            return list.OrderBy(a => a.ActionName).Take(paging: query).ToList();
+        }
+    }
+}

+ 4 - 41
src/WebApiServer/AppRoot.cs

@@ -1,4 +1,6 @@
 using LiteDB;
+using NTMiner.CloudFileUrlGenerater;
+using NTMiner.CloudFileUrlGenerater.Impl;
 using NTMiner.Controllers;
 using NTMiner.Core;
 using NTMiner.Core.Impl;
@@ -7,8 +9,6 @@ using NTMiner.Core.Mq.MqMessagePaths;
 using NTMiner.Core.Mq.Senders.Impl;
 using NTMiner.Core.Redis;
 using NTMiner.Core.Redis.Impl;
-using NTMiner.NTMinerFileUrlGenerater;
-using NTMiner.NTMinerFileUrlGenerater.Impl;
 using NTMiner.ServerNode;
 using NTMiner.User;
 using System;
@@ -66,7 +66,7 @@ namespace NTMiner {
                         }
                         Console.Title = $"{ServerAppType.WebApiServer.GetName()}_{ServerRoot.HostConfig.ThisServerAddress}";
                         // 阿里云OSS坑爹比七牛Kodo贵一半
-                        NTMinerFileUrlGenerater = new AliNTMinerOSSFileUrlGenerater();
+                        CloudFileUrlGenerater = new AliCloudOSSFileUrlGenerater();
                         IRedis redis = mqRedis;
                         IMq mq = mqRedis;
                         var minerClientMqSender = new MinerClientMqSender(mq);
@@ -167,44 +167,7 @@ namespace NTMiner {
         static AppRoot() {
         }
 
-        private static readonly Dictionary<string, ActionCountData> _actionCounts = new Dictionary<string, ActionCountData>();
-        public static IEnumerable<ActionCountData> ActionCounts {
-            get { return _actionCounts.Values; }
-        }
-
-        public static void Action(string actionName) {
-            if (_actionCounts.TryGetValue(actionName, out ActionCountData count)) {
-                if (count.Count == int.MaxValue) {
-                    count.Count = 0;
-                }
-                count.Count += 1;
-            }
-            else {
-                _actionCounts[actionName] = new ActionCountData {
-                    ActionName = actionName,
-                    Count = 1
-                };
-            }
-        }
-
-        public static List<ActionCountData> QueryActionCounts(QueryActionCountsRequest query, out int total) {
-            List<ActionCountData> list = new List<ActionCountData>();
-            bool isFilterByKeyword = !string.IsNullOrEmpty(query.Keyword);
-            if (isFilterByKeyword) {
-                foreach (var item in _actionCounts) {
-                    if (item.Key.Contains(query.Keyword)) {
-                        list.Add(item.Value);
-                    }
-                }
-            }
-            else {
-                list.AddRange(_actionCounts.Values);
-            }
-            total = list.Count;
-            return list.OrderBy(a => a.ActionName).Take(paging: query).ToList();
-        }
-
-        public static INTMinerFileUrlGenerater NTMinerFileUrlGenerater { get; private set; }
+        public static ICloudFileUrlGenerater CloudFileUrlGenerater { get; private set; }
 
         public static IWsServerNodeRedis WsServerNodeRedis { get; private set; }
 

部分文件因为文件数量过多而无法显示