From 505f90a3413e65af30a34985c441526651a7c9fa Mon Sep 17 00:00:00 2001 From: SlimRG <39348033+SlimRG@users.noreply.github.com> Date: Thu, 13 Aug 2026 06:24:54 +0300 Subject: [PATCH 01/32] Migrate to .NET 10 and modernize WinForms Retargets the Windows client to net10.0-windows (x86) and modernizes build, runtime and WinForms code. Adds NET10-MIGRATION.md and a FolderProfile publish profile; updates appveyor.yml to use dotnet CLI and modern image. Introduces HttpServerUtilityUrlToken compatibility encoder/decoder and replaces non-deterministic string.GetHashCode() usages with GetDeterministicHashCode in Util (added implementation and usages across IPC, AutoStartup, PrivoxyRunner, temp path, and Mutex naming). Improve IPC robustness (ReadExactlyAsync and bounds check), switch RNG to RandomNumberGenerator with span APIs, fix exception rethrow style, and enable HighDpiMode. Replace legacy Menu/MenuItem APIs with MenuStrip/ToolStripMenuItem throughout forms and utilities (including ViewUtils updates and NotifyIcon.Text handling). Add SupportedOSPlatform assembly attribute, adjust Fody weavers, update generated Geosite warnings, and remove/adjust legacy framework-specific checks for .NET 10 compatibility. --- NET10-MIGRATION.md | 26 + appveyor.yml | 201 ++----- shadowsocks-csharp/Controller/FileManager.cs | 2 +- shadowsocks-csharp/Controller/I18N.cs | 6 +- .../Controller/Service/IPCService.cs | 14 +- .../Controller/Service/PACServer.cs | 5 +- .../Controller/Service/PrivoxyRunner.cs | 2 +- .../Controller/System/AutoStartup.cs | 2 +- shadowsocks-csharp/Encryption/RNG.cs | 18 +- shadowsocks-csharp/FodyWeavers.xml | 9 +- shadowsocks-csharp/FodyWeavers.xsd | 1 - .../HttpServerUtilityUrlToken.cs | 49 ++ shadowsocks-csharp/Model/Geosite/Geosite.cs | 4 +- shadowsocks-csharp/Program.cs | 19 +- shadowsocks-csharp/Properties/AssemblyInfo.cs | 80 +-- .../PublishProfiles/FolderProfile.pubxml | 12 + .../Util/SystemProxy/ProxyException.cs | 8 - shadowsocks-csharp/Util/Util.cs | 34 +- shadowsocks-csharp/Util/ViewUtils.cs | 32 +- shadowsocks-csharp/View/LogForm.Designer.cs | 136 ++--- shadowsocks-csharp/View/LogForm.cs | 26 +- shadowsocks-csharp/View/MenuViewController.cs | 184 +++--- .../ViewModels/ForwardProxyViewModel.cs | 73 ++- .../ViewModels/HotkeysViewModel.cs | 105 +++- .../ViewModels/OnlineConfigViewModel.cs | 25 +- .../ViewModels/ServerSharingViewModel.cs | 33 +- shadowsocks-csharp/app.config | 33 +- shadowsocks-csharp/app.manifest | 6 - shadowsocks-csharp/packages.config | 38 -- shadowsocks-csharp/shadowsocks-csharp.csproj | 541 +++--------------- shadowsocks-windows.sln | 86 +-- test/ProcessEnvironment.cs | 4 - test/Properties/AssemblyInfo.cs | 78 +-- test/ShadowsocksTest.csproj | 127 +--- test/UrlTest.cs | 504 ++++++++-------- test/app.config | 19 - test/packages.config | 4 - 37 files changed, 1048 insertions(+), 1498 deletions(-) create mode 100644 NET10-MIGRATION.md create mode 100644 shadowsocks-csharp/HttpServerUtilityUrlToken.cs create mode 100644 shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml delete mode 100644 shadowsocks-csharp/packages.config delete mode 100644 test/app.config delete mode 100644 test/packages.config diff --git a/NET10-MIGRATION.md b/NET10-MIGRATION.md new file mode 100644 index 000000000..455539f1a --- /dev/null +++ b/NET10-MIGRATION.md @@ -0,0 +1,26 @@ +# .NET 10 migration notes + +This port keeps the Shadowsocks v4 architecture and behavior and retargets the existing Windows client to `net10.0-windows` (x86). + +Key compatibility changes are deliberately narrow: SDK-style projects/PackageReference, `GlobalHotKeyCore` in place of the .NET Framework-only `GlobalHotKey`, ToolStrip-based menus, the original `HttpServerUtility.UrlTokenEncode` token format, deterministic cross-process instance IDs, modern `NotifyIcon.Text`, shell URL launching, and .NET 10 AppVeyor commands. + +Build on Windows with a .NET 10 SDK: + +```powershell +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 +``` + +For a framework-dependent x86 single-file publish: + +```powershell +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile +``` + +The migration was statically validated against the project's historical upstream .NET Core port and current .NET 10 API behavior. The environment used to prepare this archive did not contain a .NET SDK, so a local `dotnet build` could not be executed here. + +## WPF markup compiler + +- Normal Debug/Release builds no longer carry a RuntimeIdentifier; x86 is enforced by PlatformTarget. win-x86 remains in the publish profile. +- MdXaml was updated to 1.27.0 and the localization markup packages to their .NET Core-capable stable versions to keep MarkupCompilePass1 away from legacy .NET Framework assets. diff --git a/appveyor.yml b/appveyor.yml index 8fa2a3e83..8410b3535 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,156 +1,45 @@ - -# Notes: -# - Minimal appveyor.yml file is an empty file. All sections are optional. -# - Indent each level of configuration with 2 spaces. Do not use tabs! -# - All section names are case-sensitive. -# - Section names should be unique on each level. - -#---------------------------------# -# general configuration # -#---------------------------------# - -# version format -# Build version format is taken from UI if it is not set -version: 4.4.1.{build} - -# # branches to build -# branches: -# # whitelist -# only: -# - master -# - production - -# # blacklist -# except: -# - gh-pages - - -#---------------------------------# -# environment configuration # -#---------------------------------# - -# Build worker image (VM template) -image: Visual Studio 2019 - -# scripts that are called at very beginning, before repo cloning -# init: -# - git config --global core.autocrlf false - - -# set clone depth -clone_depth: 5 # clone entire repository history if not defined - - -# environment variables -environment: - # my_var1: value1 - # # this is how to set encrypted variable. Go to "Settings" -> "Encrypt YAML" page in account menu to encrypt data. - # my_secure_var1: - # secure: FW3tJ3fMncxvs58/ifSP7w== - matrix: - - platform: x86 - configuration: Debug - - platform: x86 - configuration: Release - -# this is how to allow failing jobs in the matrix -matrix: - fast_finish: false # set this flag to immediately finish build once one of the jobs fails. - -# build cache to preserve files/folders between builds -cache: - - packages -> **\packages.config # preserve "packages" directory in the root of build folder but will reset it if packages.config is modified - # - '%LocalAppData%\NuGet\Cache' # NuGet < v3 - - '%LocalAppData%\NuGet\v3-cache' # NuGet v3 - - -# Automatically register private account and/or project AppVeyor NuGet feeds. -# nuget: - # account_feed: true - # project_feed: true - # disable_publish_on_pr: true # disable publishing of .nupkg artifacts to account/project feeds for pull request builds - # publish_wap_octopus: true # disable publishing of Octopus Deploy .nupkg artifacts to account/project feeds - -#---------------------------------# -# build configuration # -#---------------------------------# - -# Build settings, not to be confused with "before_build" and "after_build". -# "project" is relative to the original build directory and not influenced by directory changes in "before_build". -build: - # parallel: true # enable MSBuild parallel builds - # publish_nuget: true # package projects with .nuspec files and push to artifacts - # publish_nuget_symbols: true # generate and publish NuGet symbol packages - # include_nuget_references: true # add -IncludeReferencedProjects option while packaging NuGet artifacts - - # MSBuild verbosity level - verbosity: normal # quiet|minimal|normal|detailed - - -# scripts to run before build -before_build: - - cmd: nuget restore - -# to run your custom scripts instead of automatic MSBuild -# build_script: - -# scripts to run after build (working directory and environment changes are persisted from the previous steps) -after_build: -- ps: |+ - function CalculateHash($file) - { - $newLine = "`r`n" - $text = (Split-Path $file -Leaf) + $newLine - $text += 'MD5' + $newLine - $text += (Get-FileHash $file -Algorithm MD5).Hash + $newLine - $text += 'SHA-1' + $newLine - $text += (Get-FileHash $file -Algorithm SHA1).Hash + $newLine - $text += 'SHA-256' + $newLine - $text += (Get-FileHash $file -Algorithm SHA256).Hash + $newLine - $text += 'SHA-512' + $newLine - $text += (Get-FileHash $file -Algorithm SHA512).Hash - return $text - } - - $WorkingFolder = "$env:APPVEYOR_BUILD_FOLDER\shadowsocks-csharp\bin\$env:PLATFORM\$env:CONFIGURATION" - $ReleaseFile = "$WorkingFolder\Shadowsocks.exe" - $ReleaseHashFile = "$ReleaseFile.hash" - $ReleaseLocalizationFiles = "$WorkingFolder\*\" - $ZipFile = "$WorkingFolder\Shadowsocks-$env:APPVEYOR_BUILD_VERSION.zip" - $ZipHashFile = "$ZipFile.hash" - - CalculateHash -file "$ReleaseFile" | Out-File -FilePath "$ReleaseHashFile" - 7z a "$ZipFile" "$ReleaseFile" "$ReleaseHashFile" "$ReleaseLocalizationFiles" - Push-AppveyorArtifact "$ZipFile" - - # Calculate packed zip Hash - CalculateHash -file "$ZipFile" | Out-File -FilePath "$ZipHashFile" - Push-AppveyorArtifact "$ZipHashFile" - - -# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services) -# before_package: - -# to disable automatic builds -#build: off - - -#---------------------------------# -# deployment configuration # -#---------------------------------# - -# providers: Local, FTP, WebDeploy, AzureCS, AzureBlob, S3, NuGet, Environment -# provider names are case-sensitive! -# deploy: - -# # scripts to run before deployment -# before_deploy: - -# # scripts to run after deployment -# after_deploy: - -# # to run your custom scripts instead of provider deployments -# deploy_script: - -# # to disable deployment -#deploy: off \ No newline at end of file +version: 4.4.1.{build} + +image: Visual Studio 2026 +clone_depth: 5 + +environment: + matrix: + - platform: x86 + configuration: Debug + - platform: x86 + configuration: Release + +matrix: + fast_finish: false + +cache: + - '%LocalAppData%\NuGet\v3-cache' + +build_script: + - cmd: dotnet --info + - cmd: dotnet restore shadowsocks-windows.sln + - cmd: dotnet build shadowsocks-windows.sln -c %configuration% -p:Platform=x86 --no-restore + +test_script: + - cmd: dotnet test test\ShadowsocksTest.csproj -c %configuration% -p:Platform=x86 --no-build + +after_build: + - ps: | + if ($env:CONFIGURATION -ne "Release") { return } + + $publishDir = Join-Path $env:APPVEYOR_BUILD_FOLDER "working\publish" + $zipFile = Join-Path $env:APPVEYOR_BUILD_FOLDER "working\Shadowsocks-$env:APPVEYOR_BUILD_VERSION.zip" + $hashFile = "$zipFile.sha256" + + dotnet publish "$env:APPVEYOR_BUILD_FOLDER\shadowsocks-csharp\shadowsocks-csharp.csproj" ` + -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile ` + -o $publishDir --no-restore + if ($LASTEXITCODE -ne 0) { throw "dotnet publish failed with exit code $LASTEXITCODE" } + + if (Test-Path $zipFile) { Remove-Item $zipFile -Force } + Compress-Archive -Path "$publishDir\*" -DestinationPath $zipFile -CompressionLevel Optimal + (Get-FileHash $zipFile -Algorithm SHA256).Hash | Out-File -FilePath $hashFile -Encoding ascii + + Push-AppveyorArtifact $zipFile + Push-AppveyorArtifact $hashFile diff --git a/shadowsocks-csharp/Controller/FileManager.cs b/shadowsocks-csharp/Controller/FileManager.cs index ef30470d7..3611ea8d1 100755 --- a/shadowsocks-csharp/Controller/FileManager.cs +++ b/shadowsocks-csharp/Controller/FileManager.cs @@ -61,7 +61,7 @@ public static string NonExclusiveReadAllText(string path, Encoding encoding) catch (Exception ex) { logger.Error(ex); - throw ex; + throw; } } } diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index eb948c39e..5111a7771 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -108,12 +108,12 @@ public static void TranslateForm(Form c) if (item == null) continue; item.Text = GetString(item.Text); } - TranslateMenu(c.Menu); + TranslateMenu(c.MainMenuStrip); } - public static void TranslateMenu(Menu m) + public static void TranslateMenu(MenuStrip m) { if (m == null) return; - foreach (var item in ViewUtils.GetMenuItems(m)) + foreach (var item in ViewUtils.GetToolStripMenuItems(m)) { if (item == null) continue; item.Text = GetString(item.Text); diff --git a/shadowsocks-csharp/Controller/Service/IPCService.cs b/shadowsocks-csharp/Controller/Service/IPCService.cs index 5e32f4aa2..258239008 100644 --- a/shadowsocks-csharp/Controller/Service/IPCService.cs +++ b/shadowsocks-csharp/Controller/Service/IPCService.cs @@ -2,6 +2,7 @@ using System.IO.Pipes; using System.Net; using System.Text; +using Shadowsocks.Util; namespace Shadowsocks.Controller { @@ -19,7 +20,7 @@ internal class IPCService { private const int INT32_LEN = 4; private const int OP_OPEN_URL = 1; - private static readonly string PIPE_PATH = $"Shadowsocks\\{Program.ExecutablePath.GetHashCode()}"; + private static readonly string PIPE_PATH = $"Shadowsocks\\{Utils.GetDeterministicHashCode(Program.ExecutablePath)}"; public event EventHandler OpenUrlRequested; @@ -31,14 +32,19 @@ public async void RunServer() using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_PATH)) { await stream.WaitForConnectionAsync(); - await stream.ReadAsync(buf, 0, INT32_LEN); + await stream.ReadExactlyAsync(buf.AsMemory(0, INT32_LEN)); int opcode = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buf, 0)); if (opcode == OP_OPEN_URL) { - await stream.ReadAsync(buf, 0, INT32_LEN); + await stream.ReadExactlyAsync(buf.AsMemory(0, INT32_LEN)); int strlen = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buf, 0)); + if (strlen < 0 || strlen > buf.Length) + { + stream.Close(); + continue; + } - await stream.ReadAsync(buf, 0, strlen); + await stream.ReadExactlyAsync(buf.AsMemory(0, strlen)); string url = Encoding.UTF8.GetString(buf, 0, strlen); OpenUrlRequested?.Invoke(this, new RequestAddUrlEventArgs(url)); diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index 5a84fe8e9..c8c95d97d 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -5,7 +5,6 @@ using System.Net; using System.Net.Sockets; using System.Text; -using System.Web; using NLog; namespace Shadowsocks.Controller @@ -24,7 +23,7 @@ private string PacSecret { var rd = new byte[32]; RNG.GetBytes(rd); - _cachedPacSecret = HttpServerUtility.UrlTokenEncode(rd); + _cachedPacSecret = HttpServerUtilityUrlToken.Encode(rd); } return _cachedPacSecret; } @@ -51,7 +50,7 @@ public void UpdatePACURL(Configuration config) private static string GetHash(string content) { - return HttpServerUtility.UrlTokenEncode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content))); + return HttpServerUtilityUrlToken.Encode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content))); } public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) diff --git a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs index 1a7aaebf9..229cec3ac 100644 --- a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs +++ b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs @@ -28,7 +28,7 @@ static PrivoxyRunner() { try { - _uid = Program.WorkingDirectory.GetHashCode(); // Currently we use ss's StartupPath to identify different Privoxy instance. + _uid = Utils.GetDeterministicHashCode(Program.WorkingDirectory); // Currently we use ss's StartupPath to identify different Privoxy instance. _uniqueConfigFile = $"privoxy_{_uid}.conf"; _privoxyJob = new Job(); diff --git a/shadowsocks-csharp/Controller/System/AutoStartup.cs b/shadowsocks-csharp/Controller/System/AutoStartup.cs index d7e92580e..4f0c352f8 100644 --- a/shadowsocks-csharp/Controller/System/AutoStartup.cs +++ b/shadowsocks-csharp/Controller/System/AutoStartup.cs @@ -15,7 +15,7 @@ static class AutoStartup // Don't use Application.ExecutablePath // see https://stackoverflow.com/questions/12945805/odd-c-sharp-path-issue - private static string Key = "Shadowsocks_" + Program.ExecutablePath.GetHashCode(); + private static string Key = "Shadowsocks_" + Utils.GetDeterministicHashCode(Program.ExecutablePath); public static bool Set(bool enabled) { diff --git a/shadowsocks-csharp/Encryption/RNG.cs b/shadowsocks-csharp/Encryption/RNG.cs index cd6c49f32..407e8683d 100644 --- a/shadowsocks-csharp/Encryption/RNG.cs +++ b/shadowsocks-csharp/Encryption/RNG.cs @@ -5,11 +5,11 @@ namespace Shadowsocks.Encryption { public static class RNG { - private static RNGCryptoServiceProvider _rng = null; + private static RandomNumberGenerator _rng = null; public static void Init() { - _rng = _rng ?? new RNGCryptoServiceProvider(); + _rng = _rng ?? RandomNumberGenerator.Create(); } public static void Close() @@ -32,17 +32,9 @@ public static void GetBytes(byte[] buf) public static void GetBytes(byte[] buf, int len) { if (_rng == null) Init(); - try - { - _rng.GetBytes(buf, 0, len); - } - catch - { - // the backup way - byte[] tmp = new byte[len]; - _rng.GetBytes(tmp); - Buffer.BlockCopy(tmp, 0, buf, 0, len); - } + if (buf == null) throw new ArgumentNullException(nameof(buf)); + if ((uint)len > (uint)buf.Length) throw new ArgumentOutOfRangeException(nameof(len)); + _rng.GetBytes(buf.AsSpan(0, len)); } } } \ No newline at end of file diff --git a/shadowsocks-csharp/FodyWeavers.xml b/shadowsocks-csharp/FodyWeavers.xml index 39c0beecd..090bf2b87 100644 --- a/shadowsocks-csharp/FodyWeavers.xml +++ b/shadowsocks-csharp/FodyWeavers.xml @@ -1,6 +1,5 @@ - - - - - + + + + \ No newline at end of file diff --git a/shadowsocks-csharp/FodyWeavers.xsd b/shadowsocks-csharp/FodyWeavers.xsd index 91102829c..a96b3592f 100644 --- a/shadowsocks-csharp/FodyWeavers.xsd +++ b/shadowsocks-csharp/FodyWeavers.xsd @@ -4,7 +4,6 @@ - diff --git a/shadowsocks-csharp/HttpServerUtilityUrlToken.cs b/shadowsocks-csharp/HttpServerUtilityUrlToken.cs new file mode 100644 index 000000000..efde4169b --- /dev/null +++ b/shadowsocks-csharp/HttpServerUtilityUrlToken.cs @@ -0,0 +1,49 @@ +using System; + +namespace Shadowsocks +{ + /// + /// Compatibility implementation of HttpServerUtility.UrlTokenEncode/UrlTokenDecode. + /// The format is base64url without '=' padding plus one trailing digit containing + /// the removed padding count; this is intentionally not ordinary Base64Url. + /// + public static class HttpServerUtilityUrlToken + { + public static string Encode(byte[] bytes) + { + if (bytes == null) throw new ArgumentNullException(nameof(bytes)); + if (bytes.Length == 0) return string.Empty; + + string base64 = Convert.ToBase64String(bytes); + int end = base64.Length; + while (end > 0 && base64[end - 1] == '=') end--; + + char[] result = new char[end + 1]; + for (int i = 0; i < end; i++) + { + char c = base64[i]; + result[i] = c == '+' ? '-' : c == '/' ? '_' : c; + } + result[end] = (char)('0' + (base64.Length - end)); + return new string(result); + } + + public static byte[] Decode(string input) + { + if (input == null) throw new ArgumentNullException(nameof(input)); + if (input.Length == 0) return Array.Empty(); + + int padding = input[input.Length - 1] - '0'; + if (padding < 0 || padding > 2) throw new FormatException("Invalid URL token padding."); + + char[] chars = new char[input.Length - 1 + padding]; + for (int i = 0; i < input.Length - 1; i++) + { + char c = input[i]; + chars[i] = c == '-' ? '+' : c == '_' ? '/' : c; + } + for (int i = input.Length - 1; i < chars.Length; i++) chars[i] = '='; + return Convert.FromBase64CharArray(chars, 0, chars.Length); + } + } +} diff --git a/shadowsocks-csharp/Model/Geosite/Geosite.cs b/shadowsocks-csharp/Model/Geosite/Geosite.cs index 731ea4d86..fe2a93e21 100644 --- a/shadowsocks-csharp/Model/Geosite/Geosite.cs +++ b/shadowsocks-csharp/Model/Geosite/Geosite.cs @@ -1,8 +1,8 @@ -// +// // Generated by the protocol buffer compiler. DO NOT EDIT! // source: geosite.proto // -#pragma warning disable 1591, 0612, 3021 +#pragma warning disable 1591, 0612, 3021, 8981 #region Designer generated code using pb = global::Google.Protobuf; diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index 39c5b9786..8f5ebaf85 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.IO.Pipes; -using System.Net; using System.Reflection; using System.Text; using System.Threading; @@ -34,7 +33,7 @@ internal static class Program public static readonly string ExecutablePath = Process.GetCurrentProcess().MainModule?.FileName; public static readonly string WorkingDirectory = Path.GetDirectoryName(ExecutablePath); - private static readonly Mutex mutex = new Mutex(true, $"Shadowsocks_{ExecutablePath.GetHashCode()}"); + private static readonly Mutex mutex = new Mutex(true, $"Shadowsocks_{Utils.GetDeterministicHashCode(ExecutablePath)}"); /// /// 应用程序的主入口点。 @@ -74,9 +73,6 @@ private static void Main(string[] args) // todo: initialize the NLog configuartion Model.NLogConfig.TouchAndApplyNLogConfig(); - // .NET Framework 4.7.2 on Win7 compatibility - ServicePointManager.SecurityProtocol |= - SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; #endregion #region Compactibility Check @@ -88,16 +84,6 @@ private static void Main(string[] args) return; } - // Check .NET Framework version - if (!Utils.IsSupportedRuntimeVersion()) - { - if (DialogResult.OK == MessageBox.Show(I18N.GetString("Unsupported .NET Framework, please update to {0} or later.", "4.8"), - "Shadowsocks Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error)) - { - Process.Start("https://dotnet.microsoft.com/download/dotnet-framework/net48"); - } - return; - } #endregion #region Event Handlers Setup @@ -108,6 +94,7 @@ private static void Main(string[] args) AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.ApplicationExit += Application_ApplicationExit; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; + Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); AutoStartup.RegisterForRestart(true); diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs index b140accfc..24d103335 100755 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ b/shadowsocks-csharp/Properties/AssemblyInfo.cs @@ -1,37 +1,43 @@ -using Shadowsocks.Controller; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// 有关程序集的常规信息通过下列属性集 -// 控制。更改这些属性值可修改 -// 与程序集关联的信息。 -[assembly: AssemblyTitle("Shadowsocks")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Shadowsocks")] -[assembly: AssemblyCopyright("clowwindy & community 2020")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// 将 ComVisible 设置为 false 使此程序集中的类型 -// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, -// 则将该类型上的 ComVisible 属性设置为 true。 -[assembly: ComVisible(false)] - -// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID -[assembly: Guid("f8334709-4309-436a-8bbd-6165dcf4a660")] - -// 程序集的版本信息由下面四个值组成: -// -// 主版本 -// 次版本 -// 内部版本号 -// 修订号 -// -// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, -// 方法是按如下所示使用“*”: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion(UpdateChecker.Version)] -// [assembly: AssemblyFileVersion("2.0.0")] +using Shadowsocks.Controller; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +// This is a Windows-only desktop application. GenerateAssemblyInfo is disabled, +// so the SDK cannot emit this platform annotation automatically. +[assembly: SupportedOSPlatform("windows7.0")] + + +// 有关程序集的常规信息通过下列属性集 +// 控制。更改这些属性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Shadowsocks")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Shadowsocks")] +[assembly: AssemblyCopyright("clowwindy & community 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 属性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("f8334709-4309-436a-8bbd-6165dcf4a660")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion(UpdateChecker.Version)] +// [assembly: AssemblyFileVersion("2.0.0")] diff --git a/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 000000000..b92b00bc3 --- /dev/null +++ b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,12 @@ + + + + Release + net10.0-windows + win-x86 + false + true + false + false + + diff --git a/shadowsocks-csharp/Util/SystemProxy/ProxyException.cs b/shadowsocks-csharp/Util/SystemProxy/ProxyException.cs index 76e858cbd..8f167d8bf 100644 --- a/shadowsocks-csharp/Util/SystemProxy/ProxyException.cs +++ b/shadowsocks-csharp/Util/SystemProxy/ProxyException.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -33,9 +32,6 @@ public ProxyException(string message, Exception innerException) : base(message, { } - protected ProxyException(SerializationInfo info, StreamingContext context) : base(info, context) - { - } public ProxyException(ProxyExceptionType type) { this.Type = type; @@ -51,9 +47,5 @@ public ProxyException(ProxyExceptionType type, string message, Exception innerEx this.Type = type; } - protected ProxyException(ProxyExceptionType type, SerializationInfo info, StreamingContext context) : base(info, context) - { - this.Type = type; - } } } diff --git a/shadowsocks-csharp/Util/Util.cs b/shadowsocks-csharp/Util/Util.cs index 9d8e80ce5..0a4bc2058 100755 --- a/shadowsocks-csharp/Util/Util.cs +++ b/shadowsocks-csharp/Util/Util.cs @@ -12,6 +12,7 @@ using ZXing; using ZXing.QrCode; using ZXing.Common; +using ZXing.Windows.Compatibility; namespace Shadowsocks.Util { @@ -50,7 +51,7 @@ public static string GetTempPath() } else { - _tempPath = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), @"Shadowsocks\ss_win_temp_" + Program.ExecutablePath.GetHashCode())).FullName; + _tempPath = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), @"Shadowsocks\ss_win_temp_" + GetDeterministicHashCode(Program.ExecutablePath))).FullName; } } catch (Exception e) @@ -62,6 +63,37 @@ public static string GetTempPath() return _tempPath; } + // .NET Framework String.GetHashCode() was stable between processes. Modern .NET + // randomizes string hashes, so process-wide identifiers must not use string.GetHashCode(). + // This reproduces the legacy algorithm used by the original application. + public static int GetDeterministicHashCode(string value) + { + if (value == null) throw new ArgumentNullException(nameof(value)); + + unchecked + { + int hash1 = (5381 << 16) + 5381; + int hash2 = hash1; + int i = 0; + + while (i < value.Length) + { + int block = value[i]; + if (i + 1 < value.Length) block |= value[i + 1] << 16; + hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27)) ^ block; + i += 2; + if (i >= value.Length) break; + + block = value[i]; + if (i + 1 < value.Length) block |= value[i + 1] << 16; + hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27)) ^ block; + i += 2; + } + + return hash1 + hash2 * 1566083941; + } + } + public enum WindowsThemeMode { Dark, Light } // Support on Windows 10 1903+ diff --git a/shadowsocks-csharp/Util/ViewUtils.cs b/shadowsocks-csharp/Util/ViewUtils.cs index 43f547213..12c139d14 100644 --- a/shadowsocks-csharp/Util/ViewUtils.cs +++ b/shadowsocks-csharp/Util/ViewUtils.cs @@ -5,7 +5,6 @@ using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; -using System.Reflection; using System.Windows.Forms; namespace Shadowsocks.Util @@ -22,28 +21,31 @@ public static IEnumerable GetChildControls(this Control cont return children.SelectMany(GetChildControls).Concat(children); } - public static IEnumerable GetMenuItems(Menu m) + public static IEnumerable GetToolStripMenuItems(MenuStrip menu) { - if (m?.MenuItems == null || m.MenuItems.Count == 0) return Enumerable.Empty(); - var children = new List(); - foreach (var item in m.MenuItems) + if (menu == null) return Enumerable.Empty(); + return GetToolStripMenuItems(menu.Items); + } + + private static IEnumerable GetToolStripMenuItems(ToolStripItemCollection items) + { + foreach (ToolStripItem item in items) { - children.Add((MenuItem)item); + if (item is not ToolStripMenuItem menuItem) continue; + yield return menuItem; + foreach (var child in GetToolStripMenuItems(menuItem.DropDownItems)) + yield return child; } - return children.SelectMany(GetMenuItems).Concat(children); } - // Workaround NotifyIcon's 63 chars limit - // https://stackoverflow.com/questions/579665/how-can-i-show-a-systray-tooltip-longer-than-63-chars + // NotifyIcon.Text supports 127 characters on modern WinForms. public static void SetNotifyIconText(NotifyIcon ni, string text) { + if (ni == null) throw new ArgumentNullException(nameof(ni)); + if (text == null) throw new ArgumentNullException(nameof(text)); if (text.Length >= 128) - throw new ArgumentOutOfRangeException("Text limited to 127 characters"); - Type t = typeof(NotifyIcon); - BindingFlags hidden = BindingFlags.NonPublic | BindingFlags.Instance; - t.GetField("text", hidden).SetValue(ni, text); - if ((bool)t.GetField("added", hidden).GetValue(ni)) - t.GetMethod("UpdateIcon", hidden).Invoke(ni, new object[] { true }); + throw new ArgumentOutOfRangeException(nameof(text), "Text limited to 127 characters"); + ni.Text = text; } public static Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays) diff --git a/shadowsocks-csharp/View/LogForm.Designer.cs b/shadowsocks-csharp/View/LogForm.Designer.cs index 4a62262ab..a51838240 100644 --- a/shadowsocks-csharp/View/LogForm.Designer.cs +++ b/shadowsocks-csharp/View/LogForm.Designer.cs @@ -34,17 +34,17 @@ private void InitializeComponent() System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); this.LogMessageTextBox = new System.Windows.Forms.TextBox(); - this.MainMenu = new System.Windows.Forms.MainMenu(this.components); - this.FileMenuItem = new System.Windows.Forms.MenuItem(); - this.OpenLocationMenuItem = new System.Windows.Forms.MenuItem(); - this.ExitMenuItem = new System.Windows.Forms.MenuItem(); - this.ViewMenuItem = new System.Windows.Forms.MenuItem(); - this.ClearLogsMenuItem = new System.Windows.Forms.MenuItem(); - this.ChangeFontMenuItem = new System.Windows.Forms.MenuItem(); - this.WrapTextMenuItem = new System.Windows.Forms.MenuItem(); - this.TopMostMenuItem = new System.Windows.Forms.MenuItem(); - this.MenuItemSeparater = new System.Windows.Forms.MenuItem(); - this.ShowToolbarMenuItem = new System.Windows.Forms.MenuItem(); + this.MainMenu = new System.Windows.Forms.MenuStrip(); + this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClearLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ChangeFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.WrapTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TopMostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolStripMenuItemSeparater = new System.Windows.Forms.ToolStripSeparator(); + this.ShowToolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); this.ChangeFontButton = new System.Windows.Forms.Button(); this.ClearLogsButton = new System.Windows.Forms.Button(); @@ -79,76 +79,65 @@ private void InitializeComponent() // // MainMenu // - this.MainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.FileMenuItem, - this.ViewMenuItem}); + this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.FileToolStripMenuItem, + this.ViewToolStripMenuItem}); // - // FileMenuItem + // FileToolStripMenuItem // - this.FileMenuItem.Index = 0; - this.FileMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.OpenLocationMenuItem, - this.ExitMenuItem}); - this.FileMenuItem.Text = "&File"; + this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.OpenLocationToolStripMenuItem, + this.ExitToolStripMenuItem}); + this.FileToolStripMenuItem.Text = "&File"; // - // OpenLocationMenuItem + // OpenLocationToolStripMenuItem // - this.OpenLocationMenuItem.Index = 0; - this.OpenLocationMenuItem.Text = "&Open Location"; - this.OpenLocationMenuItem.Click += new System.EventHandler(this.OpenLocationMenuItem_Click); + this.OpenLocationToolStripMenuItem.Text = "&Open Location"; + this.OpenLocationToolStripMenuItem.Click += new System.EventHandler(this.OpenLocationToolStripMenuItem_Click); // - // ExitMenuItem + // ExitToolStripMenuItem // - this.ExitMenuItem.Index = 1; - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); + this.ExitToolStripMenuItem.Text = "E&xit"; + this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click); // - // ViewMenuItem + // ViewToolStripMenuItem // - this.ViewMenuItem.Index = 1; - this.ViewMenuItem.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { - this.ClearLogsMenuItem, - this.ChangeFontMenuItem, - this.WrapTextMenuItem, - this.TopMostMenuItem, - this.MenuItemSeparater, - this.ShowToolbarMenuItem}); - this.ViewMenuItem.Text = "&View"; + this.ViewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ClearLogsToolStripMenuItem, + this.ChangeFontToolStripMenuItem, + this.WrapTextToolStripMenuItem, + this.TopMostToolStripMenuItem, + this.ToolStripMenuItemSeparater, + this.ShowToolbarToolStripMenuItem}); + this.ViewToolStripMenuItem.Text = "&View"; // - // ClearLogsMenuItem + // ClearLogsToolStripMenuItem // - this.ClearLogsMenuItem.Index = 0; - this.ClearLogsMenuItem.Text = "&Clear Logs"; - this.ClearLogsMenuItem.Click += new System.EventHandler(this.ClearLogsMenuItem_Click); + this.ClearLogsToolStripMenuItem.Text = "&Clear Logs"; + this.ClearLogsToolStripMenuItem.Click += new System.EventHandler(this.ClearLogsToolStripMenuItem_Click); // - // ChangeFontMenuItem + // ChangeFontToolStripMenuItem // - this.ChangeFontMenuItem.Index = 1; - this.ChangeFontMenuItem.Text = "Change &Font"; - this.ChangeFontMenuItem.Click += new System.EventHandler(this.ChangeFontMenuItem_Click); + this.ChangeFontToolStripMenuItem.Text = "Change &Font"; + this.ChangeFontToolStripMenuItem.Click += new System.EventHandler(this.ChangeFontToolStripMenuItem_Click); // - // WrapTextMenuItem + // WrapTextToolStripMenuItem // - this.WrapTextMenuItem.Index = 2; - this.WrapTextMenuItem.Text = "&Wrap Text"; - this.WrapTextMenuItem.Click += new System.EventHandler(this.WrapTextMenuItem_Click); + this.WrapTextToolStripMenuItem.Text = "&Wrap Text"; + this.WrapTextToolStripMenuItem.Click += new System.EventHandler(this.WrapTextToolStripMenuItem_Click); // - // TopMostMenuItem + // TopMostToolStripMenuItem // - this.TopMostMenuItem.Index = 3; - this.TopMostMenuItem.Text = "&Top Most"; - this.TopMostMenuItem.Click += new System.EventHandler(this.TopMostMenuItem_Click); + this.TopMostToolStripMenuItem.Text = "&Top Most"; + this.TopMostToolStripMenuItem.Click += new System.EventHandler(this.TopMostToolStripMenuItem_Click); // - // MenuItemSeparater + // ToolStripMenuItemSeparater // - this.MenuItemSeparater.Index = 4; - this.MenuItemSeparater.Text = "-"; // - // ShowToolbarMenuItem + // ShowToolbarToolStripMenuItem // - this.ShowToolbarMenuItem.Index = 5; - this.ShowToolbarMenuItem.Text = "&Show Toolbar"; - this.ShowToolbarMenuItem.Click += new System.EventHandler(this.ShowToolbarMenuItem_Click); + this.ShowToolbarToolStripMenuItem.Text = "&Show Toolbar"; + this.ShowToolbarToolStripMenuItem.Click += new System.EventHandler(this.ShowToolbarToolStripMenuItem_Click); // // TopMostCheckBox // @@ -294,7 +283,8 @@ private void InitializeComponent() this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.ClientSize = new System.Drawing.Size(384, 161); this.Controls.Add(this.tableLayoutPanel1); - this.Menu = this.MainMenu; + this.Controls.Add(this.MainMenu); + this.MainMenuStrip = this.MainMenu; this.MinimumSize = new System.Drawing.Size(400, 200); this.Name = "LogForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; @@ -319,23 +309,23 @@ private void InitializeComponent() #endregion private System.Windows.Forms.TextBox LogMessageTextBox; - private System.Windows.Forms.MainMenu MainMenu; - private System.Windows.Forms.MenuItem FileMenuItem; - private System.Windows.Forms.MenuItem OpenLocationMenuItem; - private System.Windows.Forms.MenuItem ExitMenuItem; + private System.Windows.Forms.MenuStrip MainMenu; + private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem OpenLocationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem; private System.Windows.Forms.CheckBox WrapTextCheckBox; private System.Windows.Forms.Button ClearLogsButton; private System.Windows.Forms.Button ChangeFontButton; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.CheckBox TopMostCheckBox; - private System.Windows.Forms.MenuItem ViewMenuItem; - private System.Windows.Forms.MenuItem ClearLogsMenuItem; - private System.Windows.Forms.MenuItem ChangeFontMenuItem; - private System.Windows.Forms.MenuItem WrapTextMenuItem; - private System.Windows.Forms.MenuItem TopMostMenuItem; + private System.Windows.Forms.ToolStripMenuItem ViewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ClearLogsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ChangeFontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem WrapTextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem TopMostToolStripMenuItem; private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel; - private System.Windows.Forms.MenuItem MenuItemSeparater; - private System.Windows.Forms.MenuItem ShowToolbarMenuItem; + private System.Windows.Forms.ToolStripSeparator ToolStripMenuItemSeparater; + private System.Windows.Forms.ToolStripMenuItem ShowToolbarToolStripMenuItem; private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.DataVisualization.Charting.Chart trafficChart; } diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index 9f5efbebc..937553b77 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -256,14 +256,14 @@ private void LogForm_Load(object sender, EventArgs e) } topMostTriggerLock = true; - TopMost = TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; + TopMost = TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; topMostTriggerLock = false; wrapTextTriggerLock = true; - LogMessageTextBox.WordWrap = WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; + LogMessageTextBox.WordWrap = WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; wrapTextTriggerLock = false; - ToolbarFlowLayoutPanel.Visible = ShowToolbarMenuItem.Checked = toolbarTrigger; + ToolbarFlowLayoutPanel.Visible = ShowToolbarToolStripMenuItem.Checked = toolbarTrigger; } private void LogForm_FormClosing(object sender, FormClosingEventArgs e) @@ -288,14 +288,14 @@ private void LogForm_FormClosing(object sender, FormClosingEventArgs e) controller.SaveLogViewerConfig(config); } - private void OpenLocationMenuItem_Click(object sender, EventArgs e) + private void OpenLocationToolStripMenuItem_Click(object sender, EventArgs e) { string argument = "/select, \"" + filename + "\""; logger.Debug(argument); System.Diagnostics.Process.Start("explorer.exe", argument); } - private void ExitMenuItem_Click(object sender, EventArgs e) + private void ExitToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } @@ -317,7 +317,7 @@ private void DoClearLogs() LogMessageTextBox.Clear(); } - private void ClearLogsMenuItem_Click(object sender, EventArgs e) + private void ClearLogsToolStripMenuItem_Click(object sender, EventArgs e) { DoClearLogs(); } @@ -347,7 +347,7 @@ private void DoChangeFont() } } - private void ChangeFontMenuItem_Click(object sender, EventArgs e) + private void ChangeFontToolStripMenuItem_Click(object sender, EventArgs e) { DoChangeFont(); } @@ -369,12 +369,12 @@ private void TriggerWrapText() wrapTextTrigger = !wrapTextTrigger; LogMessageTextBox.WordWrap = wrapTextTrigger; LogMessageTextBox.ScrollToCaret(); - WrapTextMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; + WrapTextToolStripMenuItem.Checked = WrapTextCheckBox.Checked = wrapTextTrigger; wrapTextTriggerLock = false; } - private void WrapTextMenuItem_Click(object sender, EventArgs e) + private void WrapTextToolStripMenuItem_Click(object sender, EventArgs e) { if (!wrapTextTriggerLock) { @@ -401,7 +401,7 @@ private void TriggerTopMost() topMostTrigger = !topMostTrigger; TopMost = topMostTrigger; - TopMostMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; + TopMostToolStripMenuItem.Checked = TopMostCheckBox.Checked = topMostTrigger; topMostTriggerLock = false; } @@ -414,7 +414,7 @@ private void TopMostCheckBox_CheckedChanged(object sender, EventArgs e) } } - private void TopMostMenuItem_Click(object sender, EventArgs e) + private void TopMostToolStripMenuItem_Click(object sender, EventArgs e) { if (!topMostTriggerLock) { @@ -425,11 +425,11 @@ private void TopMostMenuItem_Click(object sender, EventArgs e) private bool toolbarTrigger = false; - private void ShowToolbarMenuItem_Click(object sender, EventArgs e) + private void ShowToolbarToolStripMenuItem_Click(object sender, EventArgs e) { toolbarTrigger = !toolbarTrigger; ToolbarFlowLayoutPanel.Visible = toolbarTrigger; - ShowToolbarMenuItem.Checked = toolbarTrigger; + ShowToolbarToolStripMenuItem.Checked = toolbarTrigger; } private class TrafficInfo diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 71f0b76c8..f8adc154e 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -33,32 +33,32 @@ public class MenuViewController private bool _isStartupCheck; private string _urlToOpen; - private ContextMenu contextMenu1; - private MenuItem disableItem; - private MenuItem AutoStartupItem; - private MenuItem ProtocolHandlerItem; - private MenuItem ShareOverLANItem; - private MenuItem SeperatorItem; - private MenuItem ConfigItem; - private MenuItem ServersItem; - private MenuItem globalModeItem; - private MenuItem PACModeItem; - private MenuItem localPACItem; - private MenuItem onlinePACItem; - private MenuItem editLocalPACItem; - private MenuItem updateFromGeositeItem; - private MenuItem editGFWUserRuleItem; - private MenuItem editOnlinePACItem; - private MenuItem secureLocalPacUrlToggleItem; - private MenuItem regenerateLocalPacOnUpdateItem; - private MenuItem autoCheckUpdatesToggleItem; - private MenuItem checkPreReleaseToggleItem; - private MenuItem proxyItem; - private MenuItem hotKeyItem; - private MenuItem VerboseLoggingToggleItem; - private MenuItem ShowPluginOutputToggleItem; - private MenuItem WriteI18NFileItem; - private MenuItem onlineConfigItem; + private ContextMenuStrip contextMenu1; + private ToolStripMenuItem disableItem; + private ToolStripMenuItem AutoStartupItem; + private ToolStripMenuItem ProtocolHandlerItem; + private ToolStripMenuItem ShareOverLANItem; + private ToolStripSeparator SeperatorItem; + private ToolStripMenuItem ConfigItem; + private ToolStripMenuItem ServersItem; + private ToolStripMenuItem globalModeItem; + private ToolStripMenuItem PACModeItem; + private ToolStripMenuItem localPACItem; + private ToolStripMenuItem onlinePACItem; + private ToolStripMenuItem editLocalPACItem; + private ToolStripMenuItem updateFromGeositeItem; + private ToolStripMenuItem editGFWUserRuleItem; + private ToolStripMenuItem editOnlinePACItem; + private ToolStripMenuItem secureLocalPacUrlToggleItem; + private ToolStripMenuItem regenerateLocalPacOnUpdateItem; + private ToolStripMenuItem autoCheckUpdatesToggleItem; + private ToolStripMenuItem checkPreReleaseToggleItem; + private ToolStripMenuItem proxyItem; + private ToolStripMenuItem hotKeyItem; + private ToolStripMenuItem VerboseLoggingToggleItem; + private ToolStripMenuItem ShowPluginOutputToggleItem; + private ToolStripMenuItem WriteI18NFileItem; + private ToolStripMenuItem onlineConfigItem; private ConfigForm configForm; private LogForm logForm; @@ -95,7 +95,7 @@ public MenuViewController(ShadowsocksController controller) _notifyIcon = new NotifyIcon(); UpdateTrayIconAndNotifyText(); _notifyIcon.Visible = true; - _notifyIcon.ContextMenu = contextMenu1; + _notifyIcon.ContextMenuStrip = contextMenu1; _notifyIcon.BalloonTipClicked += notifyIcon1_BalloonTipClicked; _notifyIcon.MouseClick += notifyIcon1_Click; _notifyIcon.MouseDoubleClick += notifyIcon1_DoubleClick; @@ -244,67 +244,68 @@ private void UpdateIconSet(Color colorMask, Size size, #region MenuItems and MenuGroups - private MenuItem CreateMenuItem(string text, EventHandler click) + private ToolStripMenuItem CreateMenuItem(string text, EventHandler click) { - return new MenuItem(I18N.GetString(text), click); + return new ToolStripMenuItem(I18N.GetString(text), null, click); } - private MenuItem CreateMenuGroup(string text, MenuItem[] items) + private ToolStripMenuItem CreateMenuGroup(string text, ToolStripItem[] items) { - return new MenuItem(I18N.GetString(text), items); + return new ToolStripMenuItem(I18N.GetString(text), null, items); } private void LoadMenu() { - this.contextMenu1 = new ContextMenu(new MenuItem[] { - CreateMenuGroup("System Proxy", new MenuItem[] { - this.disableItem = CreateMenuItem("Disable", new EventHandler(this.EnableItem_Click)), - this.PACModeItem = CreateMenuItem("PAC", new EventHandler(this.PACModeItem_Click)), - this.globalModeItem = CreateMenuItem("Global", new EventHandler(this.GlobalModeItem_Click)) + contextMenu1 = new ContextMenuStrip(); + contextMenu1.Items.AddRange(new ToolStripItem[] { + CreateMenuGroup("System Proxy", new ToolStripItem[] { + disableItem = CreateMenuItem("Disable", EnableItem_Click), + PACModeItem = CreateMenuItem("PAC", PACModeItem_Click), + globalModeItem = CreateMenuItem("Global", GlobalModeItem_Click) }), - this.ServersItem = CreateMenuGroup("Servers", new MenuItem[] { - this.SeperatorItem = new MenuItem("-"), - this.ConfigItem = CreateMenuItem("Edit Servers...", new EventHandler(this.Config_Click)), - new MenuItem("-"), - CreateMenuItem("Share Server Config...", new EventHandler(this.QRCodeItem_Click)), - CreateMenuItem("Scan QRCode from Screen...", new EventHandler(this.ScanQRCodeItem_Click)), - CreateMenuItem("Import URL from Clipboard...", new EventHandler(this.ImportURLItem_Click)) + ServersItem = CreateMenuGroup("Servers", new ToolStripItem[] { + SeperatorItem = new ToolStripSeparator(), + ConfigItem = CreateMenuItem("Edit Servers...", Config_Click), + new ToolStripSeparator(), + CreateMenuItem("Share Server Config...", QRCodeItem_Click), + CreateMenuItem("Scan QRCode from Screen...", ScanQRCodeItem_Click), + CreateMenuItem("Import URL from Clipboard...", ImportURLItem_Click) }), - CreateMenuGroup("PAC ", new MenuItem[] { - this.localPACItem = CreateMenuItem("Local PAC", new EventHandler(this.LocalPACItem_Click)), - this.onlinePACItem = CreateMenuItem("Online PAC", new EventHandler(this.OnlinePACItem_Click)), - new MenuItem("-"), - this.editLocalPACItem = CreateMenuItem("Edit Local PAC File...", new EventHandler(this.EditPACFileItem_Click)), - this.updateFromGeositeItem = CreateMenuItem("Update Local PAC from Geosite", new EventHandler(this.UpdatePACFromGeositeItem_Click)), - this.editGFWUserRuleItem = CreateMenuItem("Edit User Rule for Geosite...", new EventHandler(this.EditUserRuleFileForGeositeItem_Click)), - this.secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", new EventHandler(this.SecureLocalPacUrlToggleItem_Click)), - this.regenerateLocalPacOnUpdateItem = CreateMenuItem("Regenerate local PAC on version update", new EventHandler(this.RegenerateLocalPacOnUpdateItem_Click)), - CreateMenuItem("Copy Local PAC URL", new EventHandler(this.CopyLocalPacUrlItem_Click)), - this.editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", new EventHandler(this.UpdateOnlinePACURLItem_Click)), + CreateMenuGroup("PAC ", new ToolStripItem[] { + localPACItem = CreateMenuItem("Local PAC", LocalPACItem_Click), + onlinePACItem = CreateMenuItem("Online PAC", OnlinePACItem_Click), + new ToolStripSeparator(), + editLocalPACItem = CreateMenuItem("Edit Local PAC File...", EditPACFileItem_Click), + updateFromGeositeItem = CreateMenuItem("Update Local PAC from Geosite", UpdatePACFromGeositeItem_Click), + editGFWUserRuleItem = CreateMenuItem("Edit User Rule for Geosite...", EditUserRuleFileForGeositeItem_Click), + secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", SecureLocalPacUrlToggleItem_Click), + regenerateLocalPacOnUpdateItem = CreateMenuItem("Regenerate local PAC on version update", RegenerateLocalPacOnUpdateItem_Click), + CreateMenuItem("Copy Local PAC URL", CopyLocalPacUrlItem_Click), + editOnlinePACItem = CreateMenuItem("Edit Online PAC URL...", UpdateOnlinePACURLItem_Click), }), - this.proxyItem = CreateMenuItem("Forward Proxy...", new EventHandler(this.proxyItem_Click)), - this.onlineConfigItem = CreateMenuItem("Online Config...", new EventHandler(this.OnlineConfig_Click)), - new MenuItem("-"), - this.AutoStartupItem = CreateMenuItem("Start on Boot", new EventHandler(this.AutoStartupItem_Click)), - this.ProtocolHandlerItem = CreateMenuItem("Associate ss:// Links", new EventHandler(this.ProtocolHandlerItem_Click)), - this.ShareOverLANItem = CreateMenuItem("Allow other Devices to connect", new EventHandler(this.ShareOverLANItem_Click)), - new MenuItem("-"), - this.hotKeyItem = CreateMenuItem("Edit Hotkeys...", new EventHandler(this.hotKeyItem_Click)), - CreateMenuGroup("Help", new MenuItem[] { - CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)), - this.VerboseLoggingToggleItem = CreateMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ), - this.ShowPluginOutputToggleItem = CreateMenuItem("Show Plugin Output", new EventHandler(this.ShowPluginOutputToggleItem_Click)), - this.WriteI18NFileItem = CreateMenuItem("Write translation template",new EventHandler(WriteI18NFileItem_Click)), - CreateMenuGroup("Updates...", new MenuItem[] { - CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)), - new MenuItem("-"), - this.autoCheckUpdatesToggleItem = CreateMenuItem("Check for Updates at Startup", new EventHandler(this.autoCheckUpdatesToggleItem_Click)), - this.checkPreReleaseToggleItem = CreateMenuItem("Check Pre-release Version", new EventHandler(this.checkPreReleaseToggleItem_Click)), + proxyItem = CreateMenuItem("Forward Proxy...", proxyItem_Click), + onlineConfigItem = CreateMenuItem("Online Config...", OnlineConfig_Click), + new ToolStripSeparator(), + AutoStartupItem = CreateMenuItem("Start on Boot", AutoStartupItem_Click), + ProtocolHandlerItem = CreateMenuItem("Associate ss:// Links", ProtocolHandlerItem_Click), + ShareOverLANItem = CreateMenuItem("Allow other Devices to connect", ShareOverLANItem_Click), + new ToolStripSeparator(), + hotKeyItem = CreateMenuItem("Edit Hotkeys...", hotKeyItem_Click), + CreateMenuGroup("Help", new ToolStripItem[] { + CreateMenuItem("Show Logs...", ShowLogItem_Click), + VerboseLoggingToggleItem = CreateMenuItem("Verbose Logging", VerboseLoggingToggleItem_Click), + ShowPluginOutputToggleItem = CreateMenuItem("Show Plugin Output", ShowPluginOutputToggleItem_Click), + WriteI18NFileItem = CreateMenuItem("Write translation template", WriteI18NFileItem_Click), + CreateMenuGroup("Updates...", new ToolStripItem[] { + CreateMenuItem("Check for Updates...", checkUpdatesItem_Click), + new ToolStripSeparator(), + autoCheckUpdatesToggleItem = CreateMenuItem("Check for Updates at Startup", autoCheckUpdatesToggleItem_Click), + checkPreReleaseToggleItem = CreateMenuItem("Check Pre-release Version", checkPreReleaseToggleItem_Click), }), - CreateMenuItem("About...", new EventHandler(this.AboutItem_Click)), + CreateMenuItem("About...", AboutItem_Click), }), - new MenuItem("-"), - CreateMenuItem("Quit", new EventHandler(this.Quit_Click)) + new ToolStripSeparator(), + CreateMenuItem("Quit", Quit_Click) }); } @@ -652,7 +653,7 @@ private void PACModeItem_Click(object sender, EventArgs e) private void UpdateServersMenu() { - var items = ServersItem.MenuItems; + var items = ServersItem.DropDownItems; while (items[0] != SeperatorItem) { items.RemoveAt(0); @@ -660,15 +661,15 @@ private void UpdateServersMenu() int strategyCount = 0; foreach (var strategy in controller.GetStrategies()) { - MenuItem item = new MenuItem(strategy.Name); + ToolStripMenuItem item = new ToolStripMenuItem(strategy.Name); item.Tag = strategy.ID; item.Click += AStrategyItem_Click; - items.Add(strategyCount, item); + items.Insert(strategyCount, item); strategyCount++; } // user wants a seperator item between strategy and servers menugroup - items.Add(strategyCount++, new MenuItem("-")); + items.Insert(strategyCount++, new ToolStripSeparator()); int maxCount = 20; int serverCount = 0; @@ -693,16 +694,16 @@ private void UpdateServersMenu() { var server = configuration.configs[i]; Configuration.CheckServer(server); - var item = new MenuItem(server.ToString()); + var item = new ToolStripMenuItem(server.ToString()); item.Tag = i; item.Click += AServerItem_Click; - items.Add(strategyCount + serverCount, item); + items.Insert(strategyCount + serverCount, item); serverCount++; } if (overflow) { - items.Add(strategyCount + serverCount, new MenuItem($"... more than {maxCount} (total {configuration.configs.Count})", Config_Click)); + items.Insert(strategyCount + serverCount, new ToolStripMenuItem($"... more than {maxCount} (total {configuration.configs.Count})", null, Config_Click)); break; } @@ -713,24 +714,25 @@ private void UpdateServersMenu() } } - foreach (MenuItem item in items) + foreach (ToolStripItem stripItem in items) { - if (item.Tag != null && (item.Tag.ToString() == configuration.index.ToString() || item.Tag.ToString() == configuration.strategy)) - { - item.Checked = true; - } + if (stripItem is not ToolStripMenuItem item || item.Tag == null) + continue; + + item.Checked = item.Tag.ToString() == configuration.index.ToString() + || item.Tag.ToString() == configuration.strategy; } } private void AServerItem_Click(object sender, EventArgs e) { - MenuItem item = (MenuItem)sender; + ToolStripMenuItem item = (ToolStripMenuItem)sender; controller.SelectServerIndex((int)item.Tag); } private void AStrategyItem_Click(object sender, EventArgs e) { - MenuItem item = (MenuItem)sender; + ToolStripMenuItem item = (ToolStripMenuItem)sender; controller.SelectStrategy((string)item.Tag); } @@ -741,7 +743,7 @@ private void Config_Click(object sender, EventArgs e) void openURLFromQRCode() { - Process.Start(_urlToOpen); + Process.Start(new ProcessStartInfo(_urlToOpen) { UseShellExecute = true }); } private void QRCodeItem_Click(object sender, EventArgs e) @@ -995,7 +997,7 @@ private async void checkUpdatesItem_Click(object sender, EventArgs e) private void AboutItem_Click(object sender, EventArgs e) { - Process.Start("https://github.com/shadowsocks/shadowsocks-windows"); + Process.Start(new ProcessStartInfo("https://github.com/shadowsocks/shadowsocks-windows") { UseShellExecute = true }); } #endregion diff --git a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs index f901cac82..40ac12dcf 100644 --- a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs +++ b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs @@ -1,5 +1,4 @@ using ReactiveUI; -using ReactiveUI.Fody.Helpers; using ReactiveUI.Validation.Extensions; using ReactiveUI.Validation.Helpers; using Shadowsocks.Controller; @@ -33,8 +32,8 @@ public ForwardProxyViewModel() Username = _config.proxy.authUser; Password = _config.proxy.authPwd; - this.WhenAnyValue(x => x.NoProxy, x => !x) - .ToPropertyEx(this, x => x.CanModifyDetails); + _canModifyDetails = this.WhenAnyValue(x => x.NoProxy, x => !x) + .ToProperty(this, x => x.CanModifyDetails); AddressRule = this.ValidationRule( viewModel => viewModel.Address, @@ -76,32 +75,64 @@ public ForwardProxyViewModel() public ReactiveCommand Save { get; } public ReactiveCommand Cancel { get; } - [ObservableAsProperty] - public bool CanModifyDetails { get; } + private readonly ObservableAsPropertyHelper _canModifyDetails; + public bool CanModifyDetails => _canModifyDetails.Value; - [Reactive] - public bool NoProxy { get; set; } + private bool _noProxy; + public bool NoProxy + { + get => _noProxy; + set => this.RaiseAndSetIfChanged(ref _noProxy, value); + } - [Reactive] - public bool UseSocks5Proxy { get; set; } + private bool _useSocks5Proxy; + public bool UseSocks5Proxy + { + get => _useSocks5Proxy; + set => this.RaiseAndSetIfChanged(ref _useSocks5Proxy, value); + } - [Reactive] - public bool UseHttpProxy { get; set; } + private bool _useHttpProxy; + public bool UseHttpProxy + { + get => _useHttpProxy; + set => this.RaiseAndSetIfChanged(ref _useHttpProxy, value); + } - [Reactive] - public string Address { get; set; } + private string _address; + public string Address + { + get => _address; + set => this.RaiseAndSetIfChanged(ref _address, value); + } - [Reactive] - public int Port { get; set; } + private int _port; + public int Port + { + get => _port; + set => this.RaiseAndSetIfChanged(ref _port, value); + } - [Reactive] - public int Timeout { get; set; } + private int _timeout; + public int Timeout + { + get => _timeout; + set => this.RaiseAndSetIfChanged(ref _timeout, value); + } - [Reactive] - public string Username { get; set; } + private string _username; + public string Username + { + get => _username; + set => this.RaiseAndSetIfChanged(ref _username, value); + } - [Reactive] - public string Password { get; set; } + private string _password; + public string Password + { + get => _password; + set => this.RaiseAndSetIfChanged(ref _password, value); + } private ForwardProxyConfig GetForwardProxyConfig() { diff --git a/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs b/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs index 141d2cf92..9df327f28 100644 --- a/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs +++ b/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs @@ -1,5 +1,4 @@ using ReactiveUI; -using ReactiveUI.Fody.Helpers; using Shadowsocks.Controller; using Shadowsocks.Model; using Shadowsocks.View; @@ -45,44 +44,96 @@ public HotkeysViewModel() public ReactiveCommand Save { get; } public ReactiveCommand Cancel { get; } - [Reactive] - public string HotkeySystemProxy { get; set; } + private string _hotkeySystemProxy; + public string HotkeySystemProxy + { + get => _hotkeySystemProxy; + set => this.RaiseAndSetIfChanged(ref _hotkeySystemProxy, value); + } - [Reactive] - public string HotkeyProxyMode { get; set; } + private string _hotkeyProxyMode; + public string HotkeyProxyMode + { + get => _hotkeyProxyMode; + set => this.RaiseAndSetIfChanged(ref _hotkeyProxyMode, value); + } - [Reactive] - public string HotkeyAllowLan { get; set; } + private string _hotkeyAllowLan; + public string HotkeyAllowLan + { + get => _hotkeyAllowLan; + set => this.RaiseAndSetIfChanged(ref _hotkeyAllowLan, value); + } - [Reactive] - public string HotkeyOpenLogs { get; set; } + private string _hotkeyOpenLogs; + public string HotkeyOpenLogs + { + get => _hotkeyOpenLogs; + set => this.RaiseAndSetIfChanged(ref _hotkeyOpenLogs, value); + } - [Reactive] - public string HotkeySwitchPrev { get; set; } + private string _hotkeySwitchPrev; + public string HotkeySwitchPrev + { + get => _hotkeySwitchPrev; + set => this.RaiseAndSetIfChanged(ref _hotkeySwitchPrev, value); + } - [Reactive] - public string HotkeySwitchNext { get; set; } + private string _hotkeySwitchNext; + public string HotkeySwitchNext + { + get => _hotkeySwitchNext; + set => this.RaiseAndSetIfChanged(ref _hotkeySwitchNext, value); + } - [Reactive] - public bool RegisterAtStartup { get; set; } + private bool _registerAtStartup; + public bool RegisterAtStartup + { + get => _registerAtStartup; + set => this.RaiseAndSetIfChanged(ref _registerAtStartup, value); + } - [Reactive] - public string HotkeySystemProxyStatus { get; set; } + private string _hotkeySystemProxyStatus; + public string HotkeySystemProxyStatus + { + get => _hotkeySystemProxyStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeySystemProxyStatus, value); + } - [Reactive] - public string HotkeyProxyModeStatus { get; set; } + private string _hotkeyProxyModeStatus; + public string HotkeyProxyModeStatus + { + get => _hotkeyProxyModeStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeyProxyModeStatus, value); + } - [Reactive] - public string HotkeyAllowLanStatus { get; set; } + private string _hotkeyAllowLanStatus; + public string HotkeyAllowLanStatus + { + get => _hotkeyAllowLanStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeyAllowLanStatus, value); + } - [Reactive] - public string HotkeyOpenLogsStatus { get; set; } + private string _hotkeyOpenLogsStatus; + public string HotkeyOpenLogsStatus + { + get => _hotkeyOpenLogsStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeyOpenLogsStatus, value); + } - [Reactive] - public string HotkeySwitchPrevStatus { get; set; } + private string _hotkeySwitchPrevStatus; + public string HotkeySwitchPrevStatus + { + get => _hotkeySwitchPrevStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeySwitchPrevStatus, value); + } - [Reactive] - public string HotkeySwitchNextStatus { get; set; } + private string _hotkeySwitchNextStatus; + public string HotkeySwitchNextStatus + { + get => _hotkeySwitchNextStatus; + set => this.RaiseAndSetIfChanged(ref _hotkeySwitchNextStatus, value); + } public void RecordKeyDown(int hotkeyIndex, KeyEventArgs keyEventArgs) { diff --git a/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs b/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs index f803b3514..729ab079c 100644 --- a/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs +++ b/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs @@ -1,5 +1,4 @@ using ReactiveUI; -using ReactiveUI.Fody.Helpers; using ReactiveUI.Validation.Extensions; using ReactiveUI.Validation.Helpers; using Shadowsocks.Controller; @@ -103,13 +102,25 @@ public OnlineConfigViewModel() public ReactiveCommand Remove { get; } public ReactiveCommand Add { get; } - [Reactive] - public ObservableCollection Sources { get; private set; } + private ObservableCollection _sources; + public ObservableCollection Sources + { + get => _sources; + private set => this.RaiseAndSetIfChanged(ref _sources, value); + } - [Reactive] - public string SelectedSource { get; set; } + private string _selectedSource; + public string SelectedSource + { + get => _selectedSource; + set => this.RaiseAndSetIfChanged(ref _selectedSource, value); + } - [Reactive] - public string Address { get; set; } + private string _address; + public string Address + { + get => _address; + set => this.RaiseAndSetIfChanged(ref _address, value); + } } } diff --git a/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs b/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs index f13756908..99d186aad 100644 --- a/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs +++ b/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs @@ -1,5 +1,4 @@ using ReactiveUI; -using ReactiveUI.Fody.Helpers; using Shadowsocks.Model; using System; using System.Collections.Generic; @@ -33,17 +32,33 @@ public ServerSharingViewModel() public ReactiveCommand CopyLink { get; } - [Reactive] - public List Servers { get; private set; } + private List _servers; + public List Servers + { + get => _servers; + private set => this.RaiseAndSetIfChanged(ref _servers, value); + } - [Reactive] - public Server SelectedServer { get; set; } + private Server _selectedServer; + public Server SelectedServer + { + get => _selectedServer; + set => this.RaiseAndSetIfChanged(ref _selectedServer, value); + } - [Reactive] - public string SelectedServerUrl { get; private set; } + private string _selectedServerUrl; + public string SelectedServerUrl + { + get => _selectedServerUrl; + private set => this.RaiseAndSetIfChanged(ref _selectedServerUrl, value); + } - [Reactive] - public BitmapImage SelectedServerUrlImage { get; private set; } + private BitmapImage _selectedServerUrlImage; + public BitmapImage SelectedServerUrlImage + { + get => _selectedServerUrlImage; + private set => this.RaiseAndSetIfChanged(ref _selectedServerUrlImage, value); + } /// /// Called when SelectedServer changed diff --git a/shadowsocks-csharp/app.config b/shadowsocks-csharp/app.config index ac464a1f3..93d8ee7fb 100755 --- a/shadowsocks-csharp/app.config +++ b/shadowsocks-csharp/app.config @@ -5,38 +5,7 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 600 diff --git a/shadowsocks-csharp/app.manifest b/shadowsocks-csharp/app.manifest index f26ad4356..ef73e18be 100755 --- a/shadowsocks-csharp/app.manifest +++ b/shadowsocks-csharp/app.manifest @@ -8,12 +8,6 @@ - - - true - - - diff --git a/shadowsocks-csharp/packages.config b/shadowsocks-csharp/packages.config deleted file mode 100644 index 5bd46f56c..000000000 --- a/shadowsocks-csharp/packages.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index 8786c8b17..f9e2e7415 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -1,457 +1,84 @@ - - - - - - - Debug - AnyCPU - 9.0.21022 - 2.0 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} - WinExe - Properties - Shadowsocks - Shadowsocks - v4.8 - 512 - - - shadowsocks.ico - false - - - - - 3.5 - - - - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 1 - 1.0.0.%2a - false - true - {60DC8134-EBA5-43B8-BCC9-BB4BC16C2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - true - bin\x86\Debug\ - TRACE;DEBUG - full - x86 - prompt - ManagedMinimumRules.ruleset - false - false - - - bin\x86\Release\ - TRACE - true - pdbonly - x86 - prompt - ManagedMinimumRules.ruleset - false - true - - - app.manifest - - - - ..\packages\Caseless.Fody.1.9.0\lib\net452\Caseless.dll - - - ..\packages\CommandLineParser.2.8.0\lib\net461\CommandLine.dll - - - ..\packages\Costura.Fody.4.1.0\lib\net40\Costura.dll - - - ..\packages\DynamicData.7.1.1\lib\net461\DynamicData.dll - - - ..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll - - - ..\packages\Google.Protobuf.3.27.2\lib\net45\Google.Protobuf.dll - - - ..\packages\AvalonEdit.6.0.1\lib\net45\ICSharpCode.AvalonEdit.dll - - - ..\packages\MdXaml.1.6.0\lib\net45\MdXaml.dll - - - - - ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll - - - ..\packages\NLog.4.7.6\lib\net45\NLog.dll - - - ..\packages\Pharmacist.Common.2.0.5\lib\net472\Pharmacist.Common.dll - - - - - - ..\packages\ReactiveUI.12.1.5\lib\net461\ReactiveUI.dll - - - ..\packages\ReactiveUI.Events.WPF.12.1.5\lib\net472\ReactiveUI.Events.WPF.dll - - - ..\packages\ReactiveUI.Fody.12.1.5\lib\net461\ReactiveUI.Fody.Helpers.dll - - - ..\packages\ReactiveUI.Validation.1.8.6\lib\net461\ReactiveUI.Validation.dll - - - ..\packages\ReactiveUI.WPF.12.1.5\lib\net472\ReactiveUI.Wpf.dll - - - ..\packages\Splat.9.8.1\lib\net461\Splat.dll - - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - - - - - - ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll - True - True - - - - - ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll - - - - ..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll - True - True - - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Reactive.5.0.0\lib\net472\System.Reactive.dll - - - ..\packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll - True - True - - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll - - - - ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll - True - True - - - ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll - True - True - - - ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll - True - True - - - ..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll - True - True - - - - ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - - ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll - - - - - - - - - - - - ..\packages\WPFLocalizeExtension.3.8.0\lib\net452\WPFLocalizeExtension.dll - - - ..\packages\XAMLMarkupExtensions.2.0.0\lib\net472\XAMLMarkupExtensions.dll - - - ..\packages\ZXing.Net.0.16.6\lib\net47\zxing.dll - - - ..\packages\ZXing.Net.0.16.6\lib\net47\zxing.presentation.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Strings.resx - - - - - - - - True - True - Resources.resx - - - True - True - Settings.settings - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ForwardProxyView.xaml - - - HotkeysView.xaml - - - OnlineConfigView.xaml - - - VersionUpdatePromptView.xaml - - - Form - - - ConfigForm.cs - - - - - - - - - Form - - - LogForm.cs - - - - ServerSharingView.xaml - - - - - - ResXFileCodeGenerator - Strings.Designer.cs - - - - - - ConfigForm.cs - Designer - - - PublicResXFileCodeGenerator - Designer - Resources.Designer.cs - - - LogForm.cs - - - - Designer - - - - - - - - - - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - - - - Designer - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - true - - - False - .NET Framework 3.5 SP1 - false - - - False - Windows Installer 3.1 - true - - - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - \ No newline at end of file + + + WinExe + net10.0-windows + Shadowsocks + Shadowsocks + shadowsocks.ico + app.manifest + true + true + true + x86 + false + false + disable + disable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + Strings.resx + + + true + true + Resources.resx + + + true + true + Settings.settings + + + + + + ResXFileCodeGenerator + Strings.Designer.cs + + + PublicResXFileCodeGenerator + Resources.Designer.cs + + + ConfigForm.cs + + + LogForm.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + diff --git a/shadowsocks-windows.sln b/shadowsocks-windows.sln index d00484377..c3f51f8c8 100644 --- a/shadowsocks-windows.sln +++ b/shadowsocks-windows.sln @@ -1,41 +1,45 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29709.97 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\ShadowsocksTest.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}" - ProjectSection(ProjectDependencies) = postProject - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} = {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|x86 - {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.ActiveCfg = Debug|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Release|Any CPU.ActiveCfg = Release|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.ActiveCfg = Release|x86 - {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.Build.0 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {F7E7D35B-4FDA-4385-95CF-09DADED042EA} - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29709.97 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "shadowsocks-csharp", "shadowsocks-csharp\shadowsocks-csharp.csproj", "{8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShadowsocksTest", "test\ShadowsocksTest.csproj", "{45913187-0685-4903-B250-DCEF0479CD86}" + ProjectSection(ProjectDependencies) = postProject + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} = {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Build.0 = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Debug|x86.Deploy.0 = Debug|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|Any CPU.Build.0 = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.ActiveCfg = Release|Any CPU + {8C02D2F7-7CDB-4D55-9F25-CD03EF4AA062}.Release|x86.Build.0 = Release|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.ActiveCfg = Debug|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Debug|x86.Build.0 = Debug|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Release|Any CPU.Build.0 = Release|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.ActiveCfg = Release|Any CPU + {45913187-0685-4903-B250-DCEF0479CD86}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F7E7D35B-4FDA-4385-95CF-09DADED042EA} + EndGlobalSection +EndGlobal diff --git a/test/ProcessEnvironment.cs b/test/ProcessEnvironment.cs index 106afee2d..5fe8a5350 100644 --- a/test/ProcessEnvironment.cs +++ b/test/ProcessEnvironment.cs @@ -44,7 +44,6 @@ THE SOFTWARE. using System.Diagnostics; using System.Linq; using System.Management; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -265,7 +264,6 @@ static StringDictionary _EnvToDictionary(byte[] env) static bool _TryReadIntPtr32(IntPtr hProcess, IntPtr ptr, out IntPtr readPtr) { bool result; - RuntimeHelpers.PrepareConstrainedRegions(); try { } @@ -293,7 +291,6 @@ static bool _TryReadIntPtr32(IntPtr hProcess, IntPtr ptr, out IntPtr readPtr) static bool _TryReadIntPtr(IntPtr hProcess, IntPtr ptr, out IntPtr readPtr) { bool result; - RuntimeHelpers.PrepareConstrainedRegions(); try { } @@ -321,7 +318,6 @@ static bool _TryReadIntPtr(IntPtr hProcess, IntPtr ptr, out IntPtr readPtr) static bool _TryReadIntPtrWow64(IntPtr hProcess, long ptr, out long readPtr) { bool result; - RuntimeHelpers.PrepareConstrainedRegions(); try { } diff --git a/test/Properties/AssemblyInfo.cs b/test/Properties/AssemblyInfo.cs index 26e77a341..37cce7317 100755 --- a/test/Properties/AssemblyInfo.cs +++ b/test/Properties/AssemblyInfo.cs @@ -1,36 +1,42 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("test")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f74e87ac-7e3a-444b-a1d9-8b91a674c60f")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; + +// This is a Windows-only desktop application. GenerateAssemblyInfo is disabled, +// so the SDK cannot emit this platform annotation automatically. +[assembly: SupportedOSPlatform("windows7.0")] + + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("test")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("test")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f74e87ac-7e3a-444b-a1d9-8b91a674c60f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/ShadowsocksTest.csproj b/test/ShadowsocksTest.csproj index 7fd11b490..1c64f781d 100644 --- a/test/ShadowsocksTest.csproj +++ b/test/ShadowsocksTest.csproj @@ -1,101 +1,26 @@ - - - - Debug - AnyCPU - {45913187-0685-4903-B250-DCEF0479CD86} - Library - Properties - Shadowsocks.Test - Shadowsocks.Test - v4.8 - 512 - {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages - False - UnitTest - - - - - - bin\x86\Debug\ - x86 - TRACE;DEBUG - - - bin\x86\Release\ - x86 - true - TRACE - - - - - - - ..\packages\GlobalHotKey.1.1.0\lib\GlobalHotKey.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - {8c02d2f7-7cdb-4d55-9f25-cd03ef4aa062} - shadowsocks-csharp - - - - - - - - - - - False - - - False - - - False - - - False - - - - - - - - + + + net10.0-windows + Shadowsocks.Test + Shadowsocks.Test + true + true + true + x86 + false + disable + disable + + + + + + + + + + + + + + diff --git a/test/UrlTest.cs b/test/UrlTest.cs index 87eb369f7..77783a8c0 100644 --- a/test/UrlTest.cs +++ b/test/UrlTest.cs @@ -1,252 +1,252 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Shadowsocks.Controller; -using System.Threading; -using System.Collections.Generic; -using Shadowsocks.Model; -using System.Diagnostics; - -namespace Shadowsocks.Test -{ - [TestClass] - public class UrlTest - { - Server server1, server1WithRemark, server1WithPlugin, server1WithPluginAndRemark; - string server1CanonUrl, server1WithRemarkCanonUrl, server1WithPluginCanonUrl, server1WithPluginAndRemarkCanonUrl; - - Server server2, server2WithRemark, server2WithPlugin, server2WithPluginAndRemark; - string server2CanonUrl, server2WithRemarkCanonUrl, server2WithPluginCanonUrl, server2WithPluginAndRemarkCanonUrl; - - - [TestInitialize] - public void PrepareTestData() - { - server1 = new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb" - }; - server1CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4"; - - // server2 has base64 padding - server2 = new Server - { - server = "192.168.1.1", - server_port = 8388, - password = "test", - method = "bf-cfb" - }; - server2CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA=="; - - server1WithRemark = new Server - { - server = server1.server, - server_port = server1.server_port, - password = server1.password, - method = server1.method, - remarks = "example-server 1" - }; - server1WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4#example-server+1"; - - server2WithRemark = new Server - { - server = server2.server, - server_port = server2.server_port, - password = server2.password, - method = server2.method, - remarks = "example-server 2" - }; - - server2WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==#example-server+2"; - - server1WithPlugin = new Server - { - server = server1.server, - server_port = server1.server_port, - password = server1.password, - method = server1.method, - plugin = "obfs-local", - plugin_opts = "obfs=http;obfs-host=google.com" - }; - server1WithPluginCanonUrl = - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com"; - - server2WithPlugin = new Server - { - server = server2.server, - server_port = server2.server_port, - password = server2.password, - method = server2.method, - plugin = "obfs-local", - plugin_opts = "obfs=http;obfs-host=google.com" - }; - server2WithPluginCanonUrl = - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com"; - - server1WithPluginAndRemark = new Server - { - server = server1.server, - server_port = server1.server_port, - password = server1.password, - method = server1.method, - plugin = server1WithPlugin.plugin, - plugin_opts = server1WithPlugin.plugin_opts, - remarks = server1WithRemark.remarks - }; - server1WithPluginAndRemarkCanonUrl = - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+1"; - - server2WithPluginAndRemark = new Server - { - server = server2.server, - server_port = server2.server_port, - password = server2.password, - method = server2.method, - plugin = server2WithPlugin.plugin, - plugin_opts = server2WithPlugin.plugin_opts, - remarks = server2WithRemark.remarks - }; - server2WithPluginAndRemarkCanonUrl = - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+2"; - } - - [TestMethod] - public void TestParseUrl_Server1() - { - RunParseShadowsocksUrlTest( - string.Join( - "\r\n", - server1CanonUrl, - "\r\n", - "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/", - server1WithRemarkCanonUrl, - "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/#example-server+1"), - new[] - { - server1, - server1, - server1WithRemark, - server1WithRemark - }); - - RunParseShadowsocksUrlTest( - string.Join( - "\r\n", - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888", - "\r\n", - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/", - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888#example-server+1", - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/#example-server+1", - server1WithPluginCanonUrl, - server1WithPluginAndRemarkCanonUrl, - "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+1"), - new[] - { - server1, - server1, - server1WithRemark, - server1WithRemark, - server1WithPlugin, - server1WithPluginAndRemark, - server1WithPluginAndRemark - }); - } - - - - [TestMethod] - public void TestParseUrl_Server2() - { - RunParseShadowsocksUrlTest( - string.Join( - "\r\n", - server2CanonUrl, - "\r\n", - "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/", - server2WithRemarkCanonUrl, - "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/#example-server+2"), - new[] - { - server2, - server2, - server2WithRemark, - server2WithRemark - }); - - RunParseShadowsocksUrlTest( - string.Join( - "\r\n", - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388", - "\r\n", - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/", - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388#example-server+2", - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/#example-server+2", - server2WithPluginCanonUrl, - server2WithPluginAndRemarkCanonUrl, - "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+2"), - new[] - { - server2, - server2, - server2WithRemark, - server2WithRemark, - server2WithPlugin, - server2WithPluginAndRemark, - server2WithPluginAndRemark - }); - } - - - [TestMethod] - public void TestUrlGenerate() - { - var generateUrlCases = new Dictionary - { - [server1CanonUrl] = server1, - [server1WithRemarkCanonUrl] = server1WithRemark, - [server1WithPluginCanonUrl] = server1WithPlugin, - [server1WithPluginAndRemarkCanonUrl] = server1WithPluginAndRemark - }; - RunGenerateShadowsocksUrlTest(generateUrlCases); - } - - private static void RunParseShadowsocksUrlTest(string testCase, IReadOnlyList expected) - { - var actual = Server.GetServers(testCase); - if (actual.Count != expected.Count) - { - Assert.Fail("Wrong number of configs. Expected: {0}. Actual: {1}", expected.Count, actual.Count); - } - - for (int i = 0; i < expected.Count; i++) - { - var expectedServer = expected[i]; - var actualServer = actual[i]; - - Assert.AreEqual(expectedServer.server, actualServer.server); - Assert.AreEqual(expectedServer.server_port, actualServer.server_port); - Assert.AreEqual(expectedServer.password, actualServer.password); - Assert.AreEqual(expectedServer.method, actualServer.method); - Assert.AreEqual(expectedServer.plugin, actualServer.plugin); - Assert.AreEqual(expectedServer.plugin_opts, actualServer.plugin_opts); - Assert.AreEqual(expectedServer.remarks, actualServer.remarks); - Assert.AreEqual(expectedServer.timeout, actualServer.timeout); - } - } - - private static void RunGenerateShadowsocksUrlTest(IReadOnlyDictionary testCases) - { - foreach (var testCase in testCases) - { - string expected = testCase.Key; - Server config = testCase.Value; - - var actual = config.GetURL(true); - Assert.AreEqual(expected, actual); - } - } - - } -} +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shadowsocks.Controller; +using System.Threading; +using System.Collections.Generic; +using Shadowsocks.Model; +using System.Diagnostics; + +namespace Shadowsocks.Test +{ + [TestClass] + public class UrlTest + { + Server server1, server1WithRemark, server1WithPlugin, server1WithPluginAndRemark; + string server1CanonUrl, server1WithRemarkCanonUrl, server1WithPluginCanonUrl, server1WithPluginAndRemarkCanonUrl; + + Server server2, server2WithRemark, server2WithPlugin, server2WithPluginAndRemark; + string server2CanonUrl, server2WithRemarkCanonUrl, server2WithPluginCanonUrl, server2WithPluginAndRemarkCanonUrl; + + + [TestInitialize] + public void PrepareTestData() + { + server1 = new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb" + }; + server1CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4"; + + // server2 has base64 padding + server2 = new Server + { + server = "192.168.1.1", + server_port = 8388, + password = "test", + method = "bf-cfb" + }; + server2CanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA=="; + + server1WithRemark = new Server + { + server = server1.server, + server_port = server1.server_port, + password = server1.password, + method = server1.method, + remarks = "example-server 1" + }; + server1WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4#example-server+1"; + + server2WithRemark = new Server + { + server = server2.server, + server_port = server2.server_port, + password = server2.password, + method = server2.method, + remarks = "example-server 2" + }; + + server2WithRemarkCanonUrl = "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==#example-server+2"; + + server1WithPlugin = new Server + { + server = server1.server, + server_port = server1.server_port, + password = server1.password, + method = server1.method, + plugin = "obfs-local", + plugin_opts = "obfs=http;obfs-host=google.com" + }; + server1WithPluginCanonUrl = + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com"; + + server2WithPlugin = new Server + { + server = server2.server, + server_port = server2.server_port, + password = server2.password, + method = server2.method, + plugin = "obfs-local", + plugin_opts = "obfs=http;obfs-host=google.com" + }; + server2WithPluginCanonUrl = + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com"; + + server1WithPluginAndRemark = new Server + { + server = server1.server, + server_port = server1.server_port, + password = server1.password, + method = server1.method, + plugin = server1WithPlugin.plugin, + plugin_opts = server1WithPlugin.plugin_opts, + remarks = server1WithRemark.remarks + }; + server1WithPluginAndRemarkCanonUrl = + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+1"; + + server2WithPluginAndRemark = new Server + { + server = server2.server, + server_port = server2.server_port, + password = server2.password, + method = server2.method, + plugin = server2WithPlugin.plugin, + plugin_opts = server2WithPlugin.plugin_opts, + remarks = server2WithRemark.remarks + }; + server2WithPluginAndRemarkCanonUrl = + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com#example-server+2"; + } + + [TestMethod] + public void TestParseUrl_Server1() + { + RunParseShadowsocksUrlTest( + string.Join( + "\r\n", + server1CanonUrl, + "\r\n", + "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/", + server1WithRemarkCanonUrl, + "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xMDAuMTo4ODg4/#example-server+1"), + new[] + { + server1, + server1, + server1WithRemark, + server1WithRemark + }); + + RunParseShadowsocksUrlTest( + string.Join( + "\r\n", + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888", + "\r\n", + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/", + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888#example-server+1", + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/#example-server+1", + server1WithPluginCanonUrl, + server1WithPluginAndRemarkCanonUrl, + "ss://YmYtY2ZiOnRlc3Q@192.168.100.1:8888/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+1"), + new[] + { + server1, + server1, + server1WithRemark, + server1WithRemark, + server1WithPlugin, + server1WithPluginAndRemark, + server1WithPluginAndRemark + }); + } + + + + [TestMethod] + public void TestParseUrl_Server2() + { + RunParseShadowsocksUrlTest( + string.Join( + "\r\n", + server2CanonUrl, + "\r\n", + "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/", + server2WithRemarkCanonUrl, + "ss://YmYtY2ZiOnRlc3RAMTkyLjE2OC4xLjE6ODM4OA==/#example-server+2"), + new[] + { + server2, + server2, + server2WithRemark, + server2WithRemark + }); + + RunParseShadowsocksUrlTest( + string.Join( + "\r\n", + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388", + "\r\n", + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/", + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388#example-server+2", + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/#example-server+2", + server2WithPluginCanonUrl, + server2WithPluginAndRemarkCanonUrl, + "ss://YmYtY2ZiOnRlc3Q@192.168.1.1:8388/?plugin=obfs-local%3bobfs%3dhttp%3bobfs-host%3dgoogle.com&unsupported=1#example-server+2"), + new[] + { + server2, + server2, + server2WithRemark, + server2WithRemark, + server2WithPlugin, + server2WithPluginAndRemark, + server2WithPluginAndRemark + }); + } + + + [TestMethod] + public void TestUrlGenerate() + { + var generateUrlCases = new Dictionary + { + [server1CanonUrl] = server1, + [server1WithRemarkCanonUrl] = server1WithRemark, + [server1WithPluginCanonUrl] = server1WithPlugin, + [server1WithPluginAndRemarkCanonUrl] = server1WithPluginAndRemark + }; + RunGenerateShadowsocksUrlTest(generateUrlCases); + } + + private static void RunParseShadowsocksUrlTest(string testCase, IReadOnlyList expected) + { + var actual = Server.GetServers(testCase); + if (actual.Count != expected.Count) + { + Assert.Fail($"Wrong number of configs. Expected: {expected.Count}. Actual: {actual.Count}"); + } + + for (int i = 0; i < expected.Count; i++) + { + var expectedServer = expected[i]; + var actualServer = actual[i]; + + Assert.AreEqual(expectedServer.server, actualServer.server); + Assert.AreEqual(expectedServer.server_port, actualServer.server_port); + Assert.AreEqual(expectedServer.password, actualServer.password); + Assert.AreEqual(expectedServer.method, actualServer.method); + Assert.AreEqual(expectedServer.plugin, actualServer.plugin); + Assert.AreEqual(expectedServer.plugin_opts, actualServer.plugin_opts); + Assert.AreEqual(expectedServer.remarks, actualServer.remarks); + Assert.AreEqual(expectedServer.timeout, actualServer.timeout); + } + } + + private static void RunGenerateShadowsocksUrlTest(IReadOnlyDictionary testCases) + { + foreach (var testCase in testCases) + { + string expected = testCase.Key; + Server config = testCase.Value; + + var actual = config.GetURL(true); + Assert.AreEqual(expected, actual); + } + } + + } +} diff --git a/test/app.config b/test/app.config deleted file mode 100644 index 6c1547434..000000000 --- a/test/app.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/test/packages.config b/test/packages.config deleted file mode 100644 index b0cd2533d..000000000 --- a/test/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 165e2e0792e01f8a1de06704009e878d62d1e658 Mon Sep 17 00:00:00 2001 From: SlimRG <39348033+SlimRG@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:42:13 +0300 Subject: [PATCH 02/32] Code clean up + small fixes --- .editorconfig | 26 + CONTRIBUTING.md | 36 +- NET10-MIGRATION.md | 59 +- README.md | 321 +++++---- README.ru.md | 151 +++++ shadowsocks-csharp/Controller/FileManager.cs | 4 +- .../Controller/Service/IPCService.cs | 59 +- .../Controller/Service/Listener.cs | 61 +- .../Controller/Service/PACServer.cs | 8 - .../Controller/Service/Sip003Plugin.cs | 4 +- shadowsocks-csharp/FodyWeavers.xml | 1 - shadowsocks-csharp/FodyWeavers.xsd | 86 --- shadowsocks-csharp/Model/Configuration.cs | 5 - shadowsocks-csharp/Program.cs | 46 +- shadowsocks-csharp/Util/ViewUtils.cs | 25 +- shadowsocks-csharp/View/LogForm.Designer.cs | 621 ++++++++---------- shadowsocks-csharp/View/LogForm.cs | 26 +- shadowsocks-csharp/View/MenuViewController.cs | 12 +- .../View/TrafficChartControl.cs | 194 ++++++ shadowsocks-csharp/shadowsocks-csharp.csproj | 4 +- test/Sip003PluginTest.cs | 442 ++++++------- 21 files changed, 1226 insertions(+), 965 deletions(-) create mode 100644 .editorconfig create mode 100644 README.ru.md create mode 100644 shadowsocks-csharp/View/TrafficChartControl.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..b65f9f029 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,26 @@ +root = true + +[*] +charset = utf-8 +end_of_line = crlf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +end_of_line = lf +trim_trailing_whitespace = true + +[*.{cs,csx}] +indent_style = space +indent_size = 4 + +csharp_new_line_before_open_brace = all +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_around_binary_operators = before_and_after +csharp_prefer_braces = true:suggestion + +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f11709049..671b78474 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,18 +1,28 @@ -How to Contribute -================= +# Contributing -Pull Requests -------------- +Contributions are welcome. Keep changes focused and avoid unrelated behavior changes in the same pull request. -1. Pull requests are welcome. -2. Make sure to pass the unit tests. Write unit tests for new modules if -needed. -3. Search before sending new pull request. +## Before opening a pull request -Issues ------- +1. Search existing issues and pull requests for related work. +2. Build the solution with the .NET 10 SDK. +3. Run the test project. +4. Add or update tests when behavior changes. +5. Update documentation when user-visible behavior, requirements, or configuration changes. -1. **DO NOT post question about connection problem in issue tracker**, read [Troubleshooting]. -2. Search before sending new issue. +```powershell +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 +``` -[Troubleshooting]: https://github.com/shadowsocks/shadowsocks-windows/wiki/Troubleshooting +The application must remain x86 until the bundled in-process `libsscrypto.dll` is replaced with a compatible 64-bit build. + +## Issues + +Before opening an issue: + +- Search existing issues first. +- For connection problems, review the upstream [Troubleshooting guide](https://github.com/shadowsocks/shadowsocks-windows/wiki/Troubleshooting). +- Remove passwords, server addresses, subscription URLs, and other sensitive data from logs and screenshots. +- Include the client version, Windows version, .NET runtime version, reproduction steps, and relevant log output. diff --git a/NET10-MIGRATION.md b/NET10-MIGRATION.md index 455539f1a..00cdc7b19 100644 --- a/NET10-MIGRATION.md +++ b/NET10-MIGRATION.md @@ -1,10 +1,29 @@ # .NET 10 migration notes -This port keeps the Shadowsocks v4 architecture and behavior and retargets the existing Windows client to `net10.0-windows` (x86). +This branch keeps the Shadowsocks Windows v4 architecture and retargets the existing client to `net10.0-windows` while preserving the x86 process architecture required by the bundled native cryptography library. -Key compatibility changes are deliberately narrow: SDK-style projects/PackageReference, `GlobalHotKeyCore` in place of the .NET Framework-only `GlobalHotKey`, ToolStrip-based menus, the original `HttpServerUtility.UrlTokenEncode` token format, deterministic cross-process instance IDs, modern `NotifyIcon.Text`, shell URL launching, and .NET 10 AppVeyor commands. +## Scope -Build on Windows with a .NET 10 SDK: +The migration intentionally avoids the large architectural changes found in later Shadowsocks Windows generations. Compatibility changes are limited to the parts required for modern .NET and tooling. + +Notable changes include: + +- SDK-style application and test projects with `PackageReference`. +- `net10.0-windows` target framework. +- x86 `PlatformTarget` retained for `libsscrypto.dll` compatibility. +- `GlobalHotKeyCore` replacing the .NET Framework-only hotkey package. +- ToolStrip-based WinForms menus replacing legacy menu controls. +- Compatibility implementation for the original `HttpServerUtility.UrlTokenEncode` format used by PAC URLs. +- Deterministic cross-process instance and IPC identifiers instead of randomized `string.GetHashCode()` values. +- Modern `NotifyIcon.Text` and shell URL launching. +- ReactiveUI properties implemented without `ReactiveUI.Fody` IL weaving. +- Native .NET single-file publishing; Costura is no longer used. +- Modern WPF-compatible MdXaml/AvalonEdit/localization package versions. +- Modern MSTest project and assertions. + +## Build + +Use a .NET 10 SDK on Windows: ```powershell dotnet restore .\shadowsocks-windows.sln @@ -12,15 +31,39 @@ dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 ``` -For a framework-dependent x86 single-file publish: +## Publish + +The supplied profile creates a framework-dependent x86 single-file application: ```powershell -dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` + -c Release ` + -p:Platform=x86 ` + -p:PublishProfile=FolderProfile ``` -The migration was statically validated against the project's historical upstream .NET Core port and current .NET 10 API behavior. The environment used to prepare this archive did not contain a .NET SDK, so a local `dotnet build` could not be executed here. +`RuntimeIdentifier=win-x86` is scoped to the publish profile rather than normal Debug/Release builds. ## WPF markup compiler -- Normal Debug/Release builds no longer carry a RuntimeIdentifier; x86 is enforced by PlatformTarget. win-x86 remains in the publish profile. -- MdXaml was updated to 1.27.0 and the localization markup packages to their .NET Core-capable stable versions to keep MarkupCompilePass1 away from legacy .NET Framework assets. +The WPF project uses current package assets compatible with modern Windows Desktop builds. In particular, MdXaml and its AvalonEdit dependency were updated together to prevent NuGet downgrade and legacy WPF markup-compiler failures. + +When changing WPF dependencies, remove stale `bin`/`obj` directories before diagnosing `MarkupCompilePass1` failures. + +## Native constraints + +The process remains x86 because `Data/libsscrypto.dll.gz` contains a 32-bit native DLL loaded in-process. `privoxy.exe` is a separate x86 helper process. Both x86 and x64 variants of `sysproxy` are bundled. + +Moving the main application to x64 therefore requires replacing or rebuilding `libsscrypto.dll` first. + +## Validation history + +The port has been iterated against actual .NET 10 restore/build/publish diagnostics. The current project configuration has successfully reached `dotnet publish` under .NET 10; subsequent cleanup changes intentionally avoid behavioral modifications to networking, encryption, configuration, and server-selection logic. + +### WinForms chart compatibility + +The legacy `System.Windows.Forms.DataVisualization` traffic chart was replaced with a small built-in WinForms/GDI+ control. This removes the chart package's hidden runtime dependency on `System.Data.SqlClient` and prevents the unrelated native `sni.dll` SQL transport from being included in the publish output. Shadowsocks itself does not use SQL Server. + +### Socket listener shutdown on .NET 7+ + +.NET 7 changed the legacy `Socket.Begin*/End*` cancellation behavior: closing a socket with a pending asynchronous operation can surface as `SocketException` with `SocketError.OperationAborted` instead of `ObjectDisposedException`. `Listener.AcceptCallback` now treats `OperationAborted`/`Interrupted` during listener shutdown as expected and does not re-arm a stopped or replaced listener. Real socket errors are still logged. diff --git a/README.md b/README.md index c4b328f6a..89553a41d 100644 --- a/README.md +++ b/README.md @@ -1,170 +1,151 @@ -[logo] Shadowsocks for Windows -======================= - -[![Build Status]][Appveyor] - -[中文说明] - -## Features - -1. System proxy configuration -2. PAC mode and global mode -3. [GeoSite] and user rules -4. Supports HTTP proxy -5. Supports server auto switching -6. Supports UDP relay (see Usage) -7. Supports plugins - -## Downloads - -Download the latest release from [release page]. - -## Requirements - -.NET Framework 4.8 or higher, Microsoft [Visual C++ 2015 Redistributable] (x86) . - -## Basics - -1. Find Shadowsocks icon in the notification tray -2. You can add multiple servers in servers menu -3. Select `Enable System Proxy` menu to enable system proxy. Please disable other -proxy addons in your browser, or set them to use system proxy -4. You can also configure your browser proxy manually if you don't want to enable -system proxy. Set Socks5 or HTTP proxy to 127.0.0.1:1080. You can change this -port in `Servers -> Edit Servers` - -## PAC - -- The PAC rules are generated from the geosite database in [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). -- Generation modes: whitelist mode and blacklist mode. -- Domain groups: `geositeDirectGroups` and `geositeProxiedGroups`. - - `geositeDirectGroups` is initialized with `cn` and `geolocation-!cn@cn`. - - `geositeProxiedGroups` is initialized with `geolocation-!cn`. -- To switch between different modes, modify the `geositePreferDirect` property in `gui-config.json` - - When `geositePreferDirect` is false (default), PAC works in whitelist mode. Exception rules are generated from `geositeDirectGroups`. Unmatched domains goes through the proxy. - - When `geositePreferDirect` is true, PAC works in blacklist mode. Blocking rules are generated from `geositeProxiedGroups`. Exception rules are generated from `geositeDirectGroups`. Unmatched domains are connected to directly. -- Starting from 4.3.0.0, shadowsocks-windows defaults to whitelist mode with Chinese domains excluded from connecting via the proxy. -- The new default values make sure that: - - When in whitelist mode, Chinese domains, including non-Chinese companies' Chinese CDNs, are connected to directly. - - When in blacklist mode, only non-Chinese domains goes through the proxy. Chinese domains, as well as non-Chinese companies' Chinese CDNs, are connected to directly. - -### User-defined rules - -- To define your own PAC rules, it's recommended to use the `user-rule.txt` file. -- You can also modify `pac.txt` directly. But your modifications won't persist after updating geosite from the upstream. - -For Windows10 Store and related applications, please execute the following command under Admin privilege: -``` -netsh winhttp import proxy source=ie -``` - -## Server Auto Switching - -1. Load balance: choosing server randomly -2. High availability: choosing the best server (low latency and packet loss) -3. Choose By Total Package Loss: ping and choose. Please also enable - `Availability Statistics` in the menu if you want to use this -4. Write your own strategy by implement IStrategy interface and send us a pull request! - -## UDP - -For UDP, you need to use SocksCap or ProxyCap to force programs you want -to be proxied to tunnel over Shadowsocks - -## Multiple Instances - -If you want to manage multiple servers using other tools like SwitchyOmega, -you can start multiple Shadowsocks instances. To avoid configuration conflicts, -copy Shadowsocks to a new directory and choose a different local port. - -## Plugins - -If you would like to connect to server via a plugin, please set the plugin's -path (relative or absolute) on Edit Servers form. -_Note_: Forward Proxy will not be used while a plugin is enabled. - -Details: -[Working with non SIP003 standard Plugin]. - -## Global hotkeys - -Hotkeys could be registered automatically on startup. -If you are using multiple instances of Shadowsocks, -you must set different key combination for each instance. - -### How to input? - -1. Put focus in the corresponding textbox. -2. Press the key combination that you want to use. -3. Release all keys when you think it is ready. -4. Your input appears in the textbox. - -### How to change? - -1. Put focus in the corresponding textbox. -2. Press BackSpace key to clear content. -3. Re-input new key combination. - -### How to deactivate? - -1. Clear content in the textbox that you want to deactivate, -if you want to deactivate all, please clear all textboxes. -2. Press OK button to confirm. - -### Meaning of label color - -- Green: This key combination is not occupied by other programs and register successfully. -- Yellow: This key combination is occupied by other programs and you have to change to another one. -- Transparent without color: The initial status. - -## Server Configuration - -Please visit [Servers] for more information. - -## Experimental - -[Experimental Features] - -## Development - -1. Visual Studio 2019 & .NET Framework 4.8 SDK are required. -2. It is recommended to share your idea on the Issue Board before you start to work, -especially for feature development. - -## License - -[GPLv3] - -## Open Source Components / Libraries - -``` -Caseless.Fody (MIT) https://github.com/Fody/Caseless -Costura.Fody (MIT) https://github.com/Fody/Costura -Fody (MIT) https://github.com/Fody/Fody -GlobalHotKey (GPLv3) https://github.com/kirmir/GlobalHotKey -MdXaml (MIT) https://github.com/whistyun/MdXaml -Newtonsoft.Json (MIT) https://www.newtonsoft.com/json -ReactiveUI.WPF (MIT) https://github.com/reactiveui/ReactiveUI -ReactiveUI.Events.WPF (MIT) https://github.com/reactiveui/ReactiveUI -ReactiveUI.Fody (MIT) https://github.com/reactiveui/ReactiveUI -ReactiveUI.Validation (MIT) https://github.com/reactiveui/ReactiveUI.Validation -WPFLocalizationExtension (MS-PL) https://github.com/XAMLMarkupExtensions/WPFLocalizationExtension/ -ZXing.Net (Apache 2.0) https://github.com/micjahn/ZXing.Net - -libsscrypto (GPLv2) https://github.com/shadowsocks/libsscrypto -Privoxy (GPLv2) https://www.privoxy.org -Sysproxy () https://github.com/Noisyfox/sysproxy -``` - - - -[Appveyor]: https://ci.appveyor.com/project/celeron533/shadowsocks-windows -[Build Status]: https://ci.appveyor.com/api/projects/status/tfw57q6eecippsl5/branch/master?svg=true -[release page]: https://github.com/shadowsocks/shadowsocks-csharp/releases -[GeoSite]: https://github.com/v2fly/domain-list-community -[Servers]: https://github.com/shadowsocks/shadowsocks/wiki/Ports-and-Clients#linux--server-side -[中文说明]: https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E -[Visual C++ 2015 Redistributable]: https://www.microsoft.com/en-us/download/details.aspx?id=53840 -[GPLv3]: https://github.com/shadowsocks/shadowsocks-windows/blob/master/LICENSE.txt -[Working with non SIP003 standard Plugin]: https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin -[Experimental Features]: https://github.com/shadowsocks/shadowsocks-windows/wiki/Experimental \ No newline at end of file +# Shadowsocks for Windows + +Shadowsocks logo + +**English** | [Русский](README.ru.md) | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) + +This repository contains the Shadowsocks Windows v4 client migrated to **.NET 10** while preserving the original architecture and behavior as closely as possible. + +## Features + +- System proxy configuration. +- PAC and global proxy modes. +- GeoSite and user-defined PAC rules. +- Local SOCKS5 and HTTP proxy endpoints. +- Server auto-switching strategies. +- UDP relay. +- SIP003 plugins. +- Global hotkeys. +- QR-code import/export. +- Online configuration support. + +## Requirements + +- Windows supported by .NET 10 Desktop. +- .NET 10 Desktop Runtime (x86) for the framework-dependent published build. +- Microsoft Visual C++ Redistributable (x86) may be required by the bundled native components. + +> The application is intentionally built as **x86** because the bundled `libsscrypto.dll` is 32-bit. Privoxy is also bundled as an x86 helper process, while both x86 and x64 variants of `sysproxy` are included. + +## Download and publish + +Published builds are produced as a framework-dependent, x86, single-file executable. + +```powershell +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` + -c Release ` + -p:Platform=x86 ` + -p:PublishProfile=FolderProfile +``` + +The publish output is written under: + +```text +shadowsocks-csharp\bin\x86\Release\net10.0-windows\win-x86\publish\ +``` + +## Basic usage + +1. Start Shadowsocks and find its icon in the notification area. +2. Add one or more servers from the **Servers** menu. +3. Select **Enable System Proxy** to route applications that use the Windows system proxy. +4. Alternatively, configure an application manually to use the local SOCKS5 or HTTP proxy at `127.0.0.1:1080` by default. The local port can be changed in the server settings. + +## PAC + +PAC rules are generated from the GeoSite database from [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). + +Two modes are supported: + +- **Whitelist mode** (`geositePreferDirect = false`, default): domains from the direct groups bypass the proxy; unmatched domains use the proxy. +- **Blacklist mode** (`geositePreferDirect = true`): domains from the proxied groups use the proxy; direct-group exceptions bypass it; unmatched domains connect directly. + +Relevant configuration properties in `gui-config.json`: + +- `geositeDirectGroups` — initialized with `cn` and `geolocation-!cn@cn`. +- `geositeProxiedGroups` — initialized with `geolocation-!cn`. +- `geositePreferDirect` — selects whitelist/blacklist behavior. + +### User-defined PAC rules + +Use `user-rule.txt` for custom PAC rules. Direct edits to generated `pac.txt` can be overwritten when the GeoSite database is updated. + +For Microsoft Store/UWP applications, Windows may require importing the Internet Explorer/system proxy into WinHTTP from an elevated terminal: + +```cmd +netsh winhttp import proxy source=ie +``` + +## Server auto switching + +Available strategies include: + +1. Load balancing — select a server randomly. +2. High availability — prefer a server with lower latency and packet loss. +3. Total package loss — use availability statistics to select a server. + +Custom strategies can implement the `IStrategy` interface. + +## UDP + +Applications that do not support SOCKS5 UDP directly may require software such as SocksCap or ProxyCap to route their UDP traffic through Shadowsocks. + +## Multiple instances + +To run multiple instances independently, place each copy in a different directory and configure a different local port. Instance identification is derived deterministically from the executable path so IPC and single-instance behavior remain stable on modern .NET. + +## Plugins + +Configure a plugin executable path, relative or absolute, in the server editor. Forward proxy settings are not used while a SIP003 plugin is active. + +See the upstream documentation for [non-SIP003 plugins](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). + +## Global hotkeys + +Hotkeys can be registered automatically at startup. If multiple Shadowsocks instances are running, use different key combinations for each instance. + +- Focus a hotkey field and press the desired combination to assign it. +- Press **Backspace** to clear the current combination. +- Green indicates successful registration. +- Yellow indicates a conflict with another application. + +## Development + +The solution targets `net10.0-windows` and keeps the application and tests on x86. + +```powershell +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 +``` + +Migration-specific details are documented in [NET10-MIGRATION.md](NET10-MIGRATION.md). + +## Main managed dependencies + +| Component | Purpose | +| --- | --- | +| ReactiveUI / ReactiveUI.WPF | WPF MVVM and bindings | +| WPFLocalizeExtension | WPF localization | +| MdXaml / AvalonEdit | Markdown rendering | +| Newtonsoft.Json | Configuration and API JSON | +| NLog | Logging | +| Google.Protobuf | GeoSite data model | +| ZXing.Net | QR-code support | +| GlobalHotKeyCore | Global keyboard shortcuts | +| Caseless.Fody / Fody | Case-insensitive string comparison weaving | + +## Bundled native components + +| Component | Architecture | Purpose | +| --- | --- | --- | +| `libsscrypto.dll` | x86 | Shadowsocks native cryptography | +| `privoxy.exe` | x86 | Local HTTP-to-SOCKS bridge | +| `sysproxy.exe` | x86 | Windows system-proxy helper | +| `sysproxy64.exe` | x64 | Windows system-proxy helper on 64-bit Windows | + +## License + +Shadowsocks for Windows is distributed under the [GNU General Public License v3.0](LICENSE.txt). + +The repository also contains third-party components under their respective licenses. See their upstream projects for details. diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 000000000..d40dca640 --- /dev/null +++ b/README.ru.md @@ -0,0 +1,151 @@ +# Shadowsocks для Windows + +Логотип Shadowsocks + +[English](README.md) | **Русский** | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) + +Этот репозиторий содержит клиент Shadowsocks for Windows ветки v4, перенесённый на **.NET 10** с максимально возможным сохранением исходной архитектуры и поведения. + +## Возможности + +- Настройка системного прокси Windows. +- PAC-режим и глобальный режим проксирования. +- GeoSite и пользовательские PAC-правила. +- Локальные SOCKS5- и HTTP-прокси. +- Автоматическое переключение серверов. +- UDP relay. +- SIP003-плагины. +- Глобальные горячие клавиши. +- Импорт и экспорт серверов через QR-коды. +- Онлайн-конфигурации. + +## Требования + +- Windows, поддерживаемая .NET 10 Desktop. +- .NET 10 Desktop Runtime (x86) для framework-dependent публикации. +- Для встроенных native-компонентов может потребоваться Microsoft Visual C++ Redistributable (x86). + +> Приложение намеренно собирается как **x86**, потому что встроенная `libsscrypto.dll` является 32-битной. Privoxy также поставляется как отдельный x86-процесс, а `sysproxy` присутствует сразу в x86- и x64-вариантах. + +## Сборка и публикация + +Release публикуется как framework-dependent x86 single-file приложение: + +```powershell +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` + -c Release ` + -p:Platform=x86 ` + -p:PublishProfile=FolderProfile +``` + +Результат появляется в каталоге: + +```text +shadowsocks-csharp\bin\x86\Release\net10.0-windows\win-x86\publish\ +``` + +## Быстрый старт + +1. Запустите Shadowsocks и найдите его значок в области уведомлений. +2. Добавьте один или несколько серверов через меню **Servers**. +3. Включите **Enable System Proxy**, если приложения должны использовать системный прокси Windows. +4. Либо настройте приложение вручную на локальный SOCKS5/HTTP-прокси `127.0.0.1:1080`. Порт можно изменить в настройках. + +## PAC + +PAC-правила строятся по базе GeoSite из проекта [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). + +Поддерживаются два режима: + +- **Whitelist** (`geositePreferDirect = false`, по умолчанию): домены из direct-групп идут напрямую, остальные — через прокси. +- **Blacklist** (`geositePreferDirect = true`): домены из proxied-групп идут через прокси, direct-группы являются исключениями, остальные соединения идут напрямую. + +Основные параметры в `gui-config.json`: + +- `geositeDirectGroups` — по умолчанию содержит `cn` и `geolocation-!cn@cn`. +- `geositeProxiedGroups` — по умолчанию содержит `geolocation-!cn`. +- `geositePreferDirect` — выбирает режим whitelist/blacklist. + +### Пользовательские PAC-правила + +Собственные правила рекомендуется добавлять в `user-rule.txt`. Изменения непосредственно в сгенерированном `pac.txt` могут быть потеряны после обновления GeoSite. + +Для Microsoft Store/UWP-приложений иногда требуется импортировать системный прокси в WinHTTP из консоли администратора: + +```cmd +netsh winhttp import proxy source=ie +``` + +## Автоматическое переключение серверов + +Доступны, в частности, следующие стратегии: + +1. Load balancing — случайный выбор сервера. +2. High availability — предпочтение сервера с меньшей задержкой и потерями. +3. Total package loss — выбор по статистике доступности. + +Собственную стратегию можно реализовать через интерфейс `IStrategy`. + +## UDP + +Если приложение не умеет напрямую использовать SOCKS5 UDP, для маршрутизации UDP-трафика через Shadowsocks может понадобиться SocksCap, ProxyCap или аналогичный инструмент. + +## Несколько экземпляров + +Для независимого запуска нескольких экземпляров разместите каждую копию Shadowsocks в отдельном каталоге и назначьте разные локальные порты. Идентификатор экземпляра вычисляется детерминированно по пути к исполняемому файлу, поэтому IPC и single-instance логика стабильны на современном .NET. + +## Плагины + +Путь к исполняемому файлу плагина задаётся в редакторе сервера и может быть относительным или абсолютным. При активном SIP003-плагине настройки Forward Proxy не используются. + +Документация upstream по [плагинам, не соответствующим SIP003](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). + +## Глобальные горячие клавиши + +Горячие клавиши могут регистрироваться автоматически при запуске. Для нескольких одновременно запущенных экземпляров Shadowsocks необходимо назначать разные сочетания. + +- Установите фокус в поле и нажмите нужное сочетание клавиш. +- **Backspace** очищает назначение. +- Зелёный цвет означает успешную регистрацию. +- Жёлтый означает конфликт с другой программой. + +## Разработка + +Solution нацелен на `net10.0-windows`; приложение и тесты сохраняют x86-архитектуру. + +```powershell +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 +``` + +Подробности переноса находятся в [NET10-MIGRATION.md](NET10-MIGRATION.md). + +## Основные managed-зависимости + +| Компонент | Назначение | +| --- | --- | +| ReactiveUI / ReactiveUI.WPF | MVVM и WPF bindings | +| WPFLocalizeExtension | Локализация WPF | +| MdXaml / AvalonEdit | Отображение Markdown | +| Newtonsoft.Json | JSON-конфигурации и API | +| NLog | Логирование | +| Google.Protobuf | Модель данных GeoSite | +| ZXing.Net | QR-коды | +| GlobalHotKeyCore | Глобальные горячие клавиши | +| Caseless.Fody / Fody | IL-weaving для регистронезависимых сравнений строк | + +## Встроенные native-компоненты + +| Компонент | Архитектура | Назначение | +| --- | --- | --- | +| `libsscrypto.dll` | x86 | Native-криптография Shadowsocks | +| `privoxy.exe` | x86 | Локальный HTTP-to-SOCKS bridge | +| `sysproxy.exe` | x86 | Управление системным прокси Windows | +| `sysproxy64.exe` | x64 | Управление системным прокси на 64-битной Windows | + +## Лицензия + +Shadowsocks for Windows распространяется по лицензии [GNU General Public License v3.0](LICENSE.txt). + +В репозитории также присутствуют сторонние компоненты, распространяемые по собственным лицензиям. Подробности смотрите в соответствующих upstream-проектах. diff --git a/shadowsocks-csharp/Controller/FileManager.cs b/shadowsocks-csharp/Controller/FileManager.cs index 3611ea8d1..f207cbfe5 100755 --- a/shadowsocks-csharp/Controller/FileManager.cs +++ b/shadowsocks-csharp/Controller/FileManager.cs @@ -8,7 +8,7 @@ namespace Shadowsocks.Controller { public static class FileManager { - private static Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public static bool ByteArrayToFile(string fileName, byte[] content) { @@ -32,7 +32,7 @@ public static void UncompressFile(string fileName, byte[] content) byte[] buffer = new byte[4096]; int n; - using(var fs = File.Create(fileName)) + using (var fs = File.Create(fileName)) using (var input = new GZipStream(new MemoryStream(content), CompressionMode.Decompress, false)) { diff --git a/shadowsocks-csharp/Controller/Service/IPCService.cs b/shadowsocks-csharp/Controller/Service/IPCService.cs index 258239008..b4a31efa3 100644 --- a/shadowsocks-csharp/Controller/Service/IPCService.cs +++ b/shadowsocks-csharp/Controller/Service/IPCService.cs @@ -6,21 +6,21 @@ namespace Shadowsocks.Controller { - class RequestAddUrlEventArgs : EventArgs + internal sealed class RequestAddUrlEventArgs : EventArgs { - public readonly string Url; - public RequestAddUrlEventArgs(string url) { - this.Url = url; + Url = url; } + + public string Url { get; } } internal class IPCService { - private const int INT32_LEN = 4; - private const int OP_OPEN_URL = 1; - private static readonly string PIPE_PATH = $"Shadowsocks\\{Utils.GetDeterministicHashCode(Program.ExecutablePath)}"; + private const int Int32Length = 4; + private const int OpenUrlOpcode = 1; + private static readonly string PipePath = $"Shadowsocks\\{Utils.GetDeterministicHashCode(Program.ExecutablePath)}"; public event EventHandler OpenUrlRequested; @@ -29,18 +29,17 @@ public async void RunServer() byte[] buf = new byte[4096]; while (true) { - using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_PATH)) + using (NamedPipeServerStream stream = new NamedPipeServerStream(PipePath)) { await stream.WaitForConnectionAsync(); - await stream.ReadExactlyAsync(buf.AsMemory(0, INT32_LEN)); + await stream.ReadExactlyAsync(buf.AsMemory(0, Int32Length)); int opcode = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buf, 0)); - if (opcode == OP_OPEN_URL) + if (opcode == OpenUrlOpcode) { - await stream.ReadExactlyAsync(buf.AsMemory(0, INT32_LEN)); + await stream.ReadExactlyAsync(buf.AsMemory(0, Int32Length)); int strlen = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buf, 0)); if (strlen < 0 || strlen > buf.Length) { - stream.Close(); continue; } @@ -49,14 +48,13 @@ public async void RunServer() OpenUrlRequested?.Invoke(this, new RequestAddUrlEventArgs(url)); } - stream.Close(); } } } private static (NamedPipeClientStream, bool) TryConnect() { - NamedPipeClientStream pipe = new NamedPipeClientStream(PIPE_PATH); + NamedPipeClientStream pipe = new NamedPipeClientStream(PipePath); bool exist; try { @@ -70,25 +68,24 @@ private static (NamedPipeClientStream, bool) TryConnect() return (pipe, exist); } - public static bool AnotherInstanceRunning() - { - (NamedPipeClientStream pipe, bool exist) = TryConnect(); - pipe.Dispose(); - return exist; - } - public static void RequestOpenUrl(string url) { - (NamedPipeClientStream pipe, bool exist) = TryConnect(); - if(!exist) return; - byte[] opAddUrl = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(OP_OPEN_URL)); - pipe.Write(opAddUrl, 0, INT32_LEN); // opcode addurl - byte[] b = Encoding.UTF8.GetBytes(url); - byte[] blen = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(b.Length)); - pipe.Write(blen, 0, INT32_LEN); - pipe.Write(b, 0, b.Length); - pipe.Close(); - pipe.Dispose(); + (NamedPipeClientStream pipe, bool exists) = TryConnect(); + using (pipe) + { + if (!exists) + { + return; + } + + byte[] opcode = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(OpenUrlOpcode)); + pipe.Write(opcode, 0, Int32Length); + + byte[] urlBytes = Encoding.UTF8.GetBytes(url); + byte[] length = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(urlBytes.Length)); + pipe.Write(length, 0, Int32Length); + pipe.Write(urlBytes, 0, urlBytes.Length); + } } } } diff --git a/shadowsocks-csharp/Controller/Service/Listener.cs b/shadowsocks-csharp/Controller/Service/Listener.cs index 2627587cd..f7794a995 100644 --- a/shadowsocks-csharp/Controller/Service/Listener.cs +++ b/shadowsocks-csharp/Controller/Service/Listener.cs @@ -97,16 +97,13 @@ public void Start(Configuration config) public void Stop() { - if (_tcpSocket != null) - { - _tcpSocket.Close(); - _tcpSocket = null; - } - if (_udpSocket != null) - { - _udpSocket.Close(); - _udpSocket = null; - } + Socket tcpSocket = _tcpSocket; + _tcpSocket = null; + tcpSocket?.Close(); + + Socket udpSocket = _udpSocket; + _udpSocket = null; + udpSocket?.Close(); _services.ForEach(s => s.Stop()); } @@ -167,6 +164,11 @@ public void AcceptCallback(IAsyncResult ar) } catch (ObjectDisposedException) { + // Expected when the listener is stopped on .NET Framework / .NET 5-6. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // .NET 7+ reports cancellation of a pending BeginAccept as OperationAborted. } catch (Exception e) { @@ -174,23 +176,38 @@ public void AcceptCallback(IAsyncResult ar) } finally { - try - { - listener.BeginAccept( - new AsyncCallback(AcceptCallback), - listener); - } - catch (ObjectDisposedException) - { - // do nothing - } - catch (Exception e) + // Do not re-arm a callback belonging to a listener that has been stopped + // or replaced during a controller restart. + if (ReferenceEquals(listener, _tcpSocket)) { - logger.LogUsefulException(e); + try + { + listener.BeginAccept( + new AsyncCallback(AcceptCallback), + listener); + } + catch (ObjectDisposedException) + { + // Expected during shutdown. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // Expected during shutdown on .NET 7+. + } + catch (Exception e) + { + logger.LogUsefulException(e); + } } } } + private static bool IsExpectedSocketShutdown(SocketException exception) + { + return exception.SocketErrorCode == SocketError.OperationAborted + || exception.SocketErrorCode == SocketError.Interrupted; + } + private void ReceiveCallback(IAsyncResult ar) { object[] state = (object[])ar.AsyncState; diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index c8c95d97d..aa81fe241 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -123,14 +123,6 @@ public override bool Handle(byte[] firstPacket, int length, Socket socket, objec hostMatch = true; } } - //else if (kv[0] == "User-Agent") - //{ - // // we need to drop connections when changing servers - // if (kv[1].IndexOf("Chrome") >= 0) - // { - // useSocks = true; - // } - //} } } diff --git a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs index c955c7b9c..257568983 100644 --- a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs +++ b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs @@ -104,9 +104,7 @@ public bool StartIfNeeded() catch (System.ComponentModel.Win32Exception ex) { // do not use File.Exists(...), it can not handle the scenarios when the plugin file is in system environment path. - // https://docs.microsoft.com/en-us/windows/win32/seccrypto/common-hresult-values - //if ((uint)ex.ErrorCode == 0x80004005) - // https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-erref/18d8fbe8-a967-4f1c-ae50-99ca8e491d2d + // ERROR_FILE_NOT_FOUND (2) if (ex.NativeErrorCode == 0x00000002) { throw new FileNotFoundException(I18N.GetString("Cannot find the plugin program file"), _pluginProcess.StartInfo.FileName, ex); diff --git a/shadowsocks-csharp/FodyWeavers.xml b/shadowsocks-csharp/FodyWeavers.xml index 090bf2b87..b80be8592 100644 --- a/shadowsocks-csharp/FodyWeavers.xml +++ b/shadowsocks-csharp/FodyWeavers.xml @@ -1,5 +1,4 @@  - \ No newline at end of file diff --git a/shadowsocks-csharp/FodyWeavers.xsd b/shadowsocks-csharp/FodyWeavers.xsd index a96b3592f..ff63073f1 100644 --- a/shadowsocks-csharp/FodyWeavers.xsd +++ b/shadowsocks-csharp/FodyWeavers.xsd @@ -4,92 +4,6 @@ - - - - - - A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks - - - - - A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. - - - - - A list of unmanaged 32 bit assembly names to include, delimited with line breaks. - - - - - A list of unmanaged 64 bit assembly names to include, delimited with line breaks. - - - - - The order of preloaded assemblies, delimited with line breaks. - - - - - - This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file. - - - - - Controls if .pdbs for reference assemblies are also embedded. - - - - - Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. - - - - - As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off. - - - - - Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code. - - - - - Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior. - - - - - A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with | - - - - - A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. - - - - - A list of unmanaged 32 bit assembly names to include, delimited with |. - - - - - A list of unmanaged 64 bit assembly names to include, delimited with |. - - - - - The order of preloaded assemblies, delimited with |. - - - - diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 5cf6b5348..a48cf0e00 100644 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -335,11 +335,6 @@ public static Server AddDefaultServerOrServer(Configuration config, Server serve server = (server ?? GetDefaultServer()); config.configs.Insert(index.GetValueOrDefault(config.configs.Count), server); - - //if (index.HasValue) - // config.configs.Insert(index.Value, server); - //else - // config.configs.Add(server); } return server; } diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index 8f5ebaf85..c2805eb4b 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -1,21 +1,16 @@ using System; using System.Diagnostics; using System.IO; -using System.IO.Pipes; -using System.Reflection; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using CommandLine; using Microsoft.Win32; using NLog; -using ReactiveUI; using Shadowsocks.Controller; using Shadowsocks.Controller.Hotkeys; using Shadowsocks.Util; using Shadowsocks.View; -using Splat; using WPFLocalizeExtension.Engine; namespace Shadowsocks @@ -30,22 +25,23 @@ internal static class Program public static string[] Args { get; private set; } // https://github.com/dotnet/runtime/issues/13051#issuecomment-510267727 - public static readonly string ExecutablePath = Process.GetCurrentProcess().MainModule?.FileName; - public static readonly string WorkingDirectory = Path.GetDirectoryName(ExecutablePath); + public static readonly string ExecutablePath = Process.GetCurrentProcess().MainModule?.FileName + ?? Application.ExecutablePath; + public static readonly string WorkingDirectory = Path.GetDirectoryName(ExecutablePath) + ?? AppContext.BaseDirectory; private static readonly Mutex mutex = new Mutex(true, $"Shadowsocks_{Utils.GetDeterministicHashCode(ExecutablePath)}"); /// /// 应用程序的主入口点。 /// - ///
[STAThread] private static void Main(string[] args) { - #region Single Instance and IPC + #region Single instance and IPC bool hasAnotherInstance = !mutex.WaitOne(TimeSpan.Zero, true); - // store args for further use + // Store arguments for later use. Args = args; Parser.Default.ParseArguments(args) .WithParsed(opt => Options = opt) @@ -68,15 +64,14 @@ private static void Main(string[] args) } #endregion - #region Enviroment Setup + #region Environment setup Directory.SetCurrentDirectory(WorkingDirectory); - // todo: initialize the NLog configuartion Model.NLogConfig.TouchAndApplyNLogConfig(); #endregion - #region Compactibility Check - // Check OS since we are using dual-mode socket + #region Compatibility check + // Check the OS because the client uses dual-mode sockets. if (!Utils.IsWinVistaOrHigher()) { MessageBox.Show(I18N.GetString("Unsupported operating system, use Windows Vista at least."), @@ -86,11 +81,11 @@ private static void Main(string[] args) #endregion - #region Event Handlers Setup + #region Event handlers setup Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - // handle UI exceptions + // Handle UI exceptions. Application.ThreadException += Application_ThreadException; - // handle non-UI exceptions + // Handle non-UI exceptions. AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.ApplicationExit += Application_ApplicationExit; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; @@ -100,10 +95,6 @@ private static void Main(string[] args) AutoStartup.RegisterForRestart(true); #endregion - // We would use this in v5. - // Parameters would have to be dropped from views' constructors (VersionUpdatePromptView) - //Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly()); - // Workaround for hosting WPF controls in a WinForms app. // We have to manually set the culture for the LocalizeDictionary instance. // https://stackoverflow.com/questions/374518/localizing-a-winforms-application-with-embedded-wpf-user-controls @@ -122,17 +113,17 @@ private static void Main(string[] args) HotKeys.Init(MainController); MainController.Start(); - // Update online config + // Update online configuration after startup. Task.Run(async () => { - await Task.Delay(10 * 1000); + await Task.Delay(TimeSpan.FromSeconds(10)); await MainController.UpdateAllOnlineConfig(); }); -#region IPC Handler and Arguement Process +#region IPC handler and argument processing IPCService ipcService = new IPCService(); Task.Run(() => ipcService.RunServer()); - ipcService.OpenUrlRequested += (_1, e) => MainController.AskAddServerBySSURL(e.Url); + ipcService.OpenUrlRequested += (_, e) => MainController.AskAddServerBySSURL(e.Url); if (!string.IsNullOrWhiteSpace(Options.OpenUrl)) { @@ -141,10 +132,9 @@ private static void Main(string[] args) #endregion Application.Run(); - } - private static int exited = 0; + private static int exited; private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (Interlocked.Increment(ref exited) == 1) @@ -207,7 +197,7 @@ private static void SystemEvents_PowerModeChanged(object sender, PowerModeChange private static void Application_ApplicationExit(object sender, EventArgs e) { - // detach static event handlers + // Detach static event handlers. Application.ApplicationExit -= Application_ApplicationExit; SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged; Application.ThreadException -= Application_ThreadException; diff --git a/shadowsocks-csharp/Util/ViewUtils.cs b/shadowsocks-csharp/Util/ViewUtils.cs index 12c139d14..4866f9d54 100644 --- a/shadowsocks-csharp/Util/ViewUtils.cs +++ b/shadowsocks-csharp/Util/ViewUtils.cs @@ -1,5 +1,4 @@ -using Shadowsocks.Controller; -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; @@ -51,13 +50,17 @@ public static void SetNotifyIconText(NotifyIcon ni, string text) public static Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays) { Bitmap bitmap = new Bitmap(original.Width, original.Height, PixelFormat.Format64bppArgb); - Graphics canvas = Graphics.FromImage(bitmap); - canvas.DrawImage(original, new Point(0, 0)); - foreach (Bitmap overlay in overlays) + using (Graphics canvas = Graphics.FromImage(bitmap)) { - canvas.DrawImage(new Bitmap(overlay, original.Size), new Point(0, 0)); + canvas.DrawImage(original, Point.Empty); + foreach (Bitmap overlay in overlays) + { + using (Bitmap resizedOverlay = new Bitmap(overlay, original.Size)) + { + canvas.DrawImage(resizedOverlay, Point.Empty); + } + } } - canvas.Save(); return bitmap; } @@ -103,10 +106,10 @@ public static Bitmap ResizeBitmap(Bitmap original, int width, int height) public static int GetScreenDpi() { - Graphics graphics = Graphics.FromHwnd(IntPtr.Zero); - int dpi = (int)graphics.DpiX; - graphics.Dispose(); - return dpi; + using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero)) + { + return (int)graphics.DpiX; + } } } } diff --git a/shadowsocks-csharp/View/LogForm.Designer.cs b/shadowsocks-csharp/View/LogForm.Designer.cs index a51838240..50bc9e7b2 100644 --- a/shadowsocks-csharp/View/LogForm.Designer.cs +++ b/shadowsocks-csharp/View/LogForm.Designer.cs @@ -1,332 +1,291 @@ -namespace Shadowsocks.View -{ - partial class LogForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); - System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series(); - this.LogMessageTextBox = new System.Windows.Forms.TextBox(); - this.MainMenu = new System.Windows.Forms.MenuStrip(); - this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.OpenLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ClearLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ChangeFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.WrapTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TopMostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolStripMenuItemSeparater = new System.Windows.Forms.ToolStripSeparator(); - this.ShowToolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); - this.ChangeFontButton = new System.Windows.Forms.Button(); - this.ClearLogsButton = new System.Windows.Forms.Button(); - this.WrapTextCheckBox = new System.Windows.Forms.CheckBox(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.ToolbarFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.trafficChart = new System.Windows.Forms.DataVisualization.Charting.Chart(); - this.tableLayoutPanel1.SuspendLayout(); - this.ToolbarFlowLayoutPanel.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.trafficChart)).BeginInit(); - this.SuspendLayout(); - // - // LogMessageTextBox - // - this.LogMessageTextBox.BackColor = System.Drawing.Color.Black; - this.LogMessageTextBox.Dock = System.Windows.Forms.DockStyle.Fill; - this.LogMessageTextBox.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.LogMessageTextBox.ForeColor = System.Drawing.Color.White; - this.LogMessageTextBox.Location = new System.Drawing.Point(0, 0); - this.LogMessageTextBox.MaxLength = 2147483647; - this.LogMessageTextBox.Multiline = true; - this.LogMessageTextBox.Name = "LogMessageTextBox"; - this.LogMessageTextBox.ReadOnly = true; - this.LogMessageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; - this.LogMessageTextBox.Size = new System.Drawing.Size(378, 74); - this.LogMessageTextBox.TabIndex = 0; - // - // MainMenu - // - this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { - this.FileToolStripMenuItem, - this.ViewToolStripMenuItem}); - // - // FileToolStripMenuItem - // - this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { - this.OpenLocationToolStripMenuItem, - this.ExitToolStripMenuItem}); - this.FileToolStripMenuItem.Text = "&File"; - // - // OpenLocationToolStripMenuItem - // - this.OpenLocationToolStripMenuItem.Text = "&Open Location"; - this.OpenLocationToolStripMenuItem.Click += new System.EventHandler(this.OpenLocationToolStripMenuItem_Click); - // - // ExitToolStripMenuItem - // - this.ExitToolStripMenuItem.Text = "E&xit"; - this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click); - // - // ViewToolStripMenuItem - // - this.ViewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ClearLogsToolStripMenuItem, - this.ChangeFontToolStripMenuItem, - this.WrapTextToolStripMenuItem, - this.TopMostToolStripMenuItem, - this.ToolStripMenuItemSeparater, - this.ShowToolbarToolStripMenuItem}); - this.ViewToolStripMenuItem.Text = "&View"; - // - // ClearLogsToolStripMenuItem - // - this.ClearLogsToolStripMenuItem.Text = "&Clear Logs"; - this.ClearLogsToolStripMenuItem.Click += new System.EventHandler(this.ClearLogsToolStripMenuItem_Click); - // - // ChangeFontToolStripMenuItem - // - this.ChangeFontToolStripMenuItem.Text = "Change &Font"; - this.ChangeFontToolStripMenuItem.Click += new System.EventHandler(this.ChangeFontToolStripMenuItem_Click); - // - // WrapTextToolStripMenuItem - // - this.WrapTextToolStripMenuItem.Text = "&Wrap Text"; - this.WrapTextToolStripMenuItem.Click += new System.EventHandler(this.WrapTextToolStripMenuItem_Click); - // - // TopMostToolStripMenuItem - // - this.TopMostToolStripMenuItem.Text = "&Top Most"; - this.TopMostToolStripMenuItem.Click += new System.EventHandler(this.TopMostToolStripMenuItem_Click); - // - // ToolStripMenuItemSeparater - // - // - // ShowToolbarToolStripMenuItem - // - this.ShowToolbarToolStripMenuItem.Text = "&Show Toolbar"; - this.ShowToolbarToolStripMenuItem.Click += new System.EventHandler(this.ShowToolbarToolStripMenuItem_Click); - // - // TopMostCheckBox - // - this.TopMostCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.TopMostCheckBox.AutoSize = true; - this.TopMostCheckBox.Location = new System.Drawing.Point(249, 3); - this.TopMostCheckBox.Name = "TopMostCheckBox"; - this.TopMostCheckBox.Size = new System.Drawing.Size(72, 23); - this.TopMostCheckBox.TabIndex = 3; - this.TopMostCheckBox.Text = "&Top Most"; - this.TopMostCheckBox.UseVisualStyleBackColor = true; - this.TopMostCheckBox.CheckedChanged += new System.EventHandler(this.TopMostCheckBox_CheckedChanged); - // - // ChangeFontButton - // - this.ChangeFontButton.AutoSize = true; - this.ChangeFontButton.Location = new System.Drawing.Point(84, 3); - this.ChangeFontButton.Name = "ChangeFontButton"; - this.ChangeFontButton.Size = new System.Drawing.Size(75, 23); - this.ChangeFontButton.TabIndex = 2; - this.ChangeFontButton.Text = "&Font"; - this.ChangeFontButton.UseVisualStyleBackColor = true; - this.ChangeFontButton.Click += new System.EventHandler(this.ChangeFontButton_Click); - // - // ClearLogsButton - // - this.ClearLogsButton.AutoSize = true; - this.ClearLogsButton.Location = new System.Drawing.Point(3, 3); - this.ClearLogsButton.Name = "ClearLogsButton"; - this.ClearLogsButton.Size = new System.Drawing.Size(75, 23); - this.ClearLogsButton.TabIndex = 1; - this.ClearLogsButton.Text = "&Clear Logs"; - this.ClearLogsButton.UseVisualStyleBackColor = true; - this.ClearLogsButton.Click += new System.EventHandler(this.ClearLogsButton_Click); - // - // WrapTextCheckBox - // - this.WrapTextCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); - this.WrapTextCheckBox.AutoSize = true; - this.WrapTextCheckBox.Location = new System.Drawing.Point(165, 3); - this.WrapTextCheckBox.Name = "WrapTextCheckBox"; - this.WrapTextCheckBox.Size = new System.Drawing.Size(78, 23); - this.WrapTextCheckBox.TabIndex = 0; - this.WrapTextCheckBox.Text = "&Wrap Text"; - this.WrapTextCheckBox.UseVisualStyleBackColor = true; - this.WrapTextCheckBox.CheckedChanged += new System.EventHandler(this.WrapTextCheckBox_CheckedChanged); - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 1; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.Controls.Add(this.ToolbarFlowLayoutPanel, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.splitContainer1, 0, 1); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 2; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(384, 161); - this.tableLayoutPanel1.TabIndex = 2; - // - // ToolbarFlowLayoutPanel - // - this.ToolbarFlowLayoutPanel.AutoSize = true; - this.ToolbarFlowLayoutPanel.Controls.Add(this.ClearLogsButton); - this.ToolbarFlowLayoutPanel.Controls.Add(this.ChangeFontButton); - this.ToolbarFlowLayoutPanel.Controls.Add(this.WrapTextCheckBox); - this.ToolbarFlowLayoutPanel.Controls.Add(this.TopMostCheckBox); - this.ToolbarFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.ToolbarFlowLayoutPanel.Location = new System.Drawing.Point(3, 3); - this.ToolbarFlowLayoutPanel.Name = "ToolbarFlowLayoutPanel"; - this.ToolbarFlowLayoutPanel.Size = new System.Drawing.Size(378, 29); - this.ToolbarFlowLayoutPanel.TabIndex = 2; - // - // splitContainer1 - // - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.Location = new System.Drawing.Point(3, 38); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // - // splitContainer1.Panel1 - // - this.splitContainer1.Panel1.Controls.Add(this.LogMessageTextBox); - // - // splitContainer1.Panel2 - // - this.splitContainer1.Panel2.Controls.Add(this.trafficChart); - this.splitContainer1.Size = new System.Drawing.Size(378, 120); - this.splitContainer1.SplitterDistance = 74; - this.splitContainer1.TabIndex = 3; - // - // trafficChart - // - chartArea1.AxisX.LabelStyle.Enabled = false; - chartArea1.AxisX.MajorGrid.Interval = 5D; - chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray; - chartArea1.AxisX.MajorTickMark.Enabled = false; - chartArea1.AxisX.Maximum = 61D; - chartArea1.AxisX.Minimum = 1D; - chartArea1.AxisY.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.VariableCount; - chartArea1.AxisY.LabelAutoFitMaxFontSize = 8; - chartArea1.AxisY.LabelStyle.Interval = 0D; - chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray; - chartArea1.AxisY.MajorTickMark.Enabled = false; - chartArea1.AxisY2.MajorGrid.LineColor = System.Drawing.Color.LightGray; - chartArea1.AxisY2.Minimum = 0D; - chartArea1.Name = "ChartArea1"; - this.trafficChart.ChartAreas.Add(chartArea1); - this.trafficChart.Dock = System.Windows.Forms.DockStyle.Fill; - legend1.MaximumAutoSize = 25F; - legend1.Name = "Legend1"; - this.trafficChart.Legends.Add(legend1); - this.trafficChart.Location = new System.Drawing.Point(0, 0); - this.trafficChart.Name = "trafficChart"; - this.trafficChart.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; - series1.BorderWidth = 2; - series1.ChartArea = "ChartArea1"; - series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; - series1.Color = System.Drawing.Color.FromArgb(255, 128, 0); - series1.IsXValueIndexed = true; - series1.Legend = "Legend1"; - series1.Name = "Inbound"; - series2.BorderWidth = 2; - series2.ChartArea = "ChartArea1"; - series2.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline; - series2.Color = System.Drawing.Color.FromArgb(128, 128, 255); - series2.IsXValueIndexed = true; - series2.Legend = "Legend1"; - series2.Name = "Outbound"; - this.trafficChart.Series.Add(series1); - this.trafficChart.Series.Add(series2); - this.trafficChart.Size = new System.Drawing.Size(378, 42); - this.trafficChart.TabIndex = 0; - this.trafficChart.Text = "chart1"; - // - // LogForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.ClientSize = new System.Drawing.Size(384, 161); - this.Controls.Add(this.tableLayoutPanel1); - this.Controls.Add(this.MainMenu); - this.MainMenuStrip = this.MainMenu; - this.MinimumSize = new System.Drawing.Size(400, 200); - this.Name = "LogForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "Log Viewer"; - this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LogForm_FormClosing); - this.Load += new System.EventHandler(this.LogForm_Load); - this.Shown += new System.EventHandler(this.LogForm_Shown); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.ToolbarFlowLayoutPanel.ResumeLayout(false); - this.ToolbarFlowLayoutPanel.PerformLayout(); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel1.PerformLayout(); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.trafficChart)).EndInit(); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.TextBox LogMessageTextBox; - private System.Windows.Forms.MenuStrip MainMenu; - private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem OpenLocationToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem; - private System.Windows.Forms.CheckBox WrapTextCheckBox; - private System.Windows.Forms.Button ClearLogsButton; - private System.Windows.Forms.Button ChangeFontButton; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.CheckBox TopMostCheckBox; - private System.Windows.Forms.ToolStripMenuItem ViewToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ClearLogsToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem ChangeFontToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem WrapTextToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem TopMostToolStripMenuItem; - private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel; - private System.Windows.Forms.ToolStripSeparator ToolStripMenuItemSeparater; - private System.Windows.Forms.ToolStripMenuItem ShowToolbarToolStripMenuItem; - private System.Windows.Forms.SplitContainer splitContainer1; - private System.Windows.Forms.DataVisualization.Charting.Chart trafficChart; - } +namespace Shadowsocks.View +{ + partial class LogForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.LogMessageTextBox = new System.Windows.Forms.TextBox(); + this.MainMenu = new System.Windows.Forms.MenuStrip(); + this.FileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenLocationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClearLogsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ChangeFontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.WrapTextToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TopMostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolStripMenuItemSeparater = new System.Windows.Forms.ToolStripSeparator(); + this.ShowToolbarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TopMostCheckBox = new System.Windows.Forms.CheckBox(); + this.ChangeFontButton = new System.Windows.Forms.Button(); + this.ClearLogsButton = new System.Windows.Forms.Button(); + this.WrapTextCheckBox = new System.Windows.Forms.CheckBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.ToolbarFlowLayoutPanel = new System.Windows.Forms.FlowLayoutPanel(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.trafficChart = new Shadowsocks.View.TrafficChartControl(); + this.tableLayoutPanel1.SuspendLayout(); + this.ToolbarFlowLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + this.SuspendLayout(); + // + // LogMessageTextBox + // + this.LogMessageTextBox.BackColor = System.Drawing.Color.Black; + this.LogMessageTextBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.LogMessageTextBox.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.LogMessageTextBox.ForeColor = System.Drawing.Color.White; + this.LogMessageTextBox.Location = new System.Drawing.Point(0, 0); + this.LogMessageTextBox.MaxLength = 2147483647; + this.LogMessageTextBox.Multiline = true; + this.LogMessageTextBox.Name = "LogMessageTextBox"; + this.LogMessageTextBox.ReadOnly = true; + this.LogMessageTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.LogMessageTextBox.Size = new System.Drawing.Size(378, 74); + this.LogMessageTextBox.TabIndex = 0; + // + // MainMenu + // + this.MainMenu.Items.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.FileToolStripMenuItem, + this.ViewToolStripMenuItem}); + // + // FileToolStripMenuItem + // + this.FileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripMenuItem[] { + this.OpenLocationToolStripMenuItem, + this.ExitToolStripMenuItem}); + this.FileToolStripMenuItem.Text = "&File"; + // + // OpenLocationToolStripMenuItem + // + this.OpenLocationToolStripMenuItem.Text = "&Open Location"; + this.OpenLocationToolStripMenuItem.Click += new System.EventHandler(this.OpenLocationToolStripMenuItem_Click); + // + // ExitToolStripMenuItem + // + this.ExitToolStripMenuItem.Text = "E&xit"; + this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click); + // + // ViewToolStripMenuItem + // + this.ViewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ClearLogsToolStripMenuItem, + this.ChangeFontToolStripMenuItem, + this.WrapTextToolStripMenuItem, + this.TopMostToolStripMenuItem, + this.ToolStripMenuItemSeparater, + this.ShowToolbarToolStripMenuItem}); + this.ViewToolStripMenuItem.Text = "&View"; + // + // ClearLogsToolStripMenuItem + // + this.ClearLogsToolStripMenuItem.Text = "&Clear Logs"; + this.ClearLogsToolStripMenuItem.Click += new System.EventHandler(this.ClearLogsToolStripMenuItem_Click); + // + // ChangeFontToolStripMenuItem + // + this.ChangeFontToolStripMenuItem.Text = "Change &Font"; + this.ChangeFontToolStripMenuItem.Click += new System.EventHandler(this.ChangeFontToolStripMenuItem_Click); + // + // WrapTextToolStripMenuItem + // + this.WrapTextToolStripMenuItem.Text = "&Wrap Text"; + this.WrapTextToolStripMenuItem.Click += new System.EventHandler(this.WrapTextToolStripMenuItem_Click); + // + // TopMostToolStripMenuItem + // + this.TopMostToolStripMenuItem.Text = "&Top Most"; + this.TopMostToolStripMenuItem.Click += new System.EventHandler(this.TopMostToolStripMenuItem_Click); + // + // ToolStripMenuItemSeparater + // + // + // ShowToolbarToolStripMenuItem + // + this.ShowToolbarToolStripMenuItem.Text = "&Show Toolbar"; + this.ShowToolbarToolStripMenuItem.Click += new System.EventHandler(this.ShowToolbarToolStripMenuItem_Click); + // + // TopMostCheckBox + // + this.TopMostCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.TopMostCheckBox.AutoSize = true; + this.TopMostCheckBox.Location = new System.Drawing.Point(249, 3); + this.TopMostCheckBox.Name = "TopMostCheckBox"; + this.TopMostCheckBox.Size = new System.Drawing.Size(72, 23); + this.TopMostCheckBox.TabIndex = 3; + this.TopMostCheckBox.Text = "&Top Most"; + this.TopMostCheckBox.UseVisualStyleBackColor = true; + this.TopMostCheckBox.CheckedChanged += new System.EventHandler(this.TopMostCheckBox_CheckedChanged); + // + // ChangeFontButton + // + this.ChangeFontButton.AutoSize = true; + this.ChangeFontButton.Location = new System.Drawing.Point(84, 3); + this.ChangeFontButton.Name = "ChangeFontButton"; + this.ChangeFontButton.Size = new System.Drawing.Size(75, 23); + this.ChangeFontButton.TabIndex = 2; + this.ChangeFontButton.Text = "&Font"; + this.ChangeFontButton.UseVisualStyleBackColor = true; + this.ChangeFontButton.Click += new System.EventHandler(this.ChangeFontButton_Click); + // + // ClearLogsButton + // + this.ClearLogsButton.AutoSize = true; + this.ClearLogsButton.Location = new System.Drawing.Point(3, 3); + this.ClearLogsButton.Name = "ClearLogsButton"; + this.ClearLogsButton.Size = new System.Drawing.Size(75, 23); + this.ClearLogsButton.TabIndex = 1; + this.ClearLogsButton.Text = "&Clear Logs"; + this.ClearLogsButton.UseVisualStyleBackColor = true; + this.ClearLogsButton.Click += new System.EventHandler(this.ClearLogsButton_Click); + // + // WrapTextCheckBox + // + this.WrapTextCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.WrapTextCheckBox.AutoSize = true; + this.WrapTextCheckBox.Location = new System.Drawing.Point(165, 3); + this.WrapTextCheckBox.Name = "WrapTextCheckBox"; + this.WrapTextCheckBox.Size = new System.Drawing.Size(78, 23); + this.WrapTextCheckBox.TabIndex = 0; + this.WrapTextCheckBox.Text = "&Wrap Text"; + this.WrapTextCheckBox.UseVisualStyleBackColor = true; + this.WrapTextCheckBox.CheckedChanged += new System.EventHandler(this.WrapTextCheckBox_CheckedChanged); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.ToolbarFlowLayoutPanel, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.splitContainer1, 0, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 2; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(384, 161); + this.tableLayoutPanel1.TabIndex = 2; + // + // ToolbarFlowLayoutPanel + // + this.ToolbarFlowLayoutPanel.AutoSize = true; + this.ToolbarFlowLayoutPanel.Controls.Add(this.ClearLogsButton); + this.ToolbarFlowLayoutPanel.Controls.Add(this.ChangeFontButton); + this.ToolbarFlowLayoutPanel.Controls.Add(this.WrapTextCheckBox); + this.ToolbarFlowLayoutPanel.Controls.Add(this.TopMostCheckBox); + this.ToolbarFlowLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.ToolbarFlowLayoutPanel.Location = new System.Drawing.Point(3, 3); + this.ToolbarFlowLayoutPanel.Name = "ToolbarFlowLayoutPanel"; + this.ToolbarFlowLayoutPanel.Size = new System.Drawing.Size(378, 29); + this.ToolbarFlowLayoutPanel.TabIndex = 2; + // + // splitContainer1 + // + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(3, 38); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.LogMessageTextBox); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.trafficChart); + this.splitContainer1.Size = new System.Drawing.Size(378, 120); + this.splitContainer1.SplitterDistance = 74; + this.splitContainer1.TabIndex = 3; + // + // trafficChart + // + this.trafficChart.Dock = System.Windows.Forms.DockStyle.Fill; + this.trafficChart.Location = new System.Drawing.Point(0, 0); + this.trafficChart.Name = "trafficChart"; + this.trafficChart.Size = new System.Drawing.Size(378, 42); + this.trafficChart.TabIndex = 0; + // + // + // LogForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(384, 161); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.MainMenu); + this.MainMenuStrip = this.MainMenu; + this.MinimumSize = new System.Drawing.Size(400, 200); + this.Name = "LogForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Log Viewer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.LogForm_FormClosing); + this.Load += new System.EventHandler(this.LogForm_Load); + this.Shown += new System.EventHandler(this.LogForm_Shown); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.ToolbarFlowLayoutPanel.ResumeLayout(false); + this.ToolbarFlowLayoutPanel.PerformLayout(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox LogMessageTextBox; + private System.Windows.Forms.MenuStrip MainMenu; + private System.Windows.Forms.ToolStripMenuItem FileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem OpenLocationToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem; + private System.Windows.Forms.CheckBox WrapTextCheckBox; + private System.Windows.Forms.Button ClearLogsButton; + private System.Windows.Forms.Button ChangeFontButton; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.CheckBox TopMostCheckBox; + private System.Windows.Forms.ToolStripMenuItem ViewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ClearLogsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ChangeFontToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem WrapTextToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem TopMostToolStripMenuItem; + private System.Windows.Forms.FlowLayoutPanel ToolbarFlowLayoutPanel; + private System.Windows.Forms.ToolStripSeparator ToolStripMenuItemSeparater; + private System.Windows.Forms.ToolStripMenuItem ShowToolbarToolStripMenuItem; + private System.Windows.Forms.SplitContainer splitContainer1; + private Shadowsocks.View.TrafficChartControl trafficChart; + } } \ No newline at end of file diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index 937553b77..8b2a9b4b6 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -2,7 +2,6 @@ using System.Drawing; using System.IO; using System.Windows.Forms; -using System.Windows.Forms.DataVisualization.Charting; using System.Collections.Generic; using System.Linq; @@ -37,8 +36,6 @@ public partial class LogForm : Form BandwidthScaleInfo bandwidthScale; List inboundPoints = new List(); List outboundPoints = new List(); - TextAnnotation inboundAnnotation = new TextAnnotation(); - TextAnnotation outboundAnnotation = new TextAnnotation(); #endregion public LogForm(ShadowsocksController controller) @@ -115,17 +112,13 @@ private void UpdateTrafficChart() if (trafficChart.IsHandleCreated) { - trafficChart.Series["Inbound"].Points.DataBindY(inboundPoints); - trafficChart.Series["Outbound"].Points.DataBindY(outboundPoints); - trafficChart.ChartAreas[0].AxisY.LabelStyle.Format = "{0:0.##} " + bandwidthScale.unitName; - trafficChart.ChartAreas[0].AxisY.Maximum = bandwidthScale.value; - inboundAnnotation.AnchorDataPoint = trafficChart.Series["Inbound"].Points.Last(); - inboundAnnotation.Text = Utils.FormatBandwidth(lastInbound); - outboundAnnotation.AnchorDataPoint = trafficChart.Series["Outbound"].Points.Last(); - outboundAnnotation.Text = Utils.FormatBandwidth(lastOutbound); - trafficChart.Annotations.Clear(); - trafficChart.Annotations.Add(inboundAnnotation); - trafficChart.Annotations.Add(outboundAnnotation); + trafficChart.SetData( + inboundPoints, + outboundPoints, + (float)bandwidthScale.value, + bandwidthScale.unitName, + Utils.FormatBandwidth(lastInbound), + Utils.FormatBandwidth(lastOutbound)); } } @@ -163,8 +156,9 @@ private void controller_TrafficChanged(object sender, EventArgs e) private void UpdateTexts() { I18N.TranslateForm(this); - trafficChart.Series["Inbound"].LegendText = I18N.GetString("Inbound"); - trafficChart.Series["Outbound"].LegendText = I18N.GetString("Outbound"); + trafficChart.SetLegendText( + I18N.GetString("Inbound"), + I18N.GetString("Outbound")); } private void Timer_Tick(object sender, EventArgs e) diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index f8adc154e..47338a9c6 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -38,7 +38,7 @@ public class MenuViewController private ToolStripMenuItem AutoStartupItem; private ToolStripMenuItem ProtocolHandlerItem; private ToolStripMenuItem ShareOverLANItem; - private ToolStripSeparator SeperatorItem; + private ToolStripSeparator SeparatorItem; private ToolStripMenuItem ConfigItem; private ToolStripMenuItem ServersItem; private ToolStripMenuItem globalModeItem; @@ -264,7 +264,7 @@ private void LoadMenu() globalModeItem = CreateMenuItem("Global", GlobalModeItem_Click) }), ServersItem = CreateMenuGroup("Servers", new ToolStripItem[] { - SeperatorItem = new ToolStripSeparator(), + SeparatorItem = new ToolStripSeparator(), ConfigItem = CreateMenuItem("Edit Servers...", Config_Click), new ToolStripSeparator(), CreateMenuItem("Share Server Config...", QRCodeItem_Click), @@ -654,7 +654,7 @@ private void PACModeItem_Click(object sender, EventArgs e) private void UpdateServersMenu() { var items = ServersItem.DropDownItems; - while (items[0] != SeperatorItem) + while (items[0] != SeparatorItem) { items.RemoveAt(0); } @@ -668,7 +668,7 @@ private void UpdateServersMenu() strategyCount++; } - // user wants a seperator item between strategy and servers menugroup + // user wants a separator item between strategy and servers menu group items.Insert(strategyCount++, new ToolStripSeparator()); int maxCount = 20; @@ -741,7 +741,7 @@ private void Config_Click(object sender, EventArgs e) ShowConfigForm(); } - void openURLFromQRCode() + private void OpenUrlFromQrCode() { Process.Start(new ProcessStartInfo(_urlToOpen) { UseShellExecute = true }); } @@ -779,7 +779,7 @@ private void ScanQRCodeItem_Click(object sender, EventArgs e) if (result.ToLowerInvariant().StartsWith("http://") || result.ToLowerInvariant().StartsWith("https://")) { _urlToOpen = result; - openURLFromQRCode(); + OpenUrlFromQrCode(); } else if (controller.AddServerBySSURL(result)) { diff --git a/shadowsocks-csharp/View/TrafficChartControl.cs b/shadowsocks-csharp/View/TrafficChartControl.cs new file mode 100644 index 000000000..52655179d --- /dev/null +++ b/shadowsocks-csharp/View/TrafficChartControl.cs @@ -0,0 +1,194 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Windows.Forms; + +namespace Shadowsocks.View +{ + internal sealed class TrafficChartControl : Control + { + private static readonly Color InboundColor = Color.FromArgb(255, 128, 0); + private static readonly Color OutboundColor = Color.FromArgb(128, 128, 255); + private static readonly Color GridColor = Color.LightGray; + + private float[] _inboundPoints = Array.Empty(); + private float[] _outboundPoints = Array.Empty(); + private float _maximum = 1F; + private string _unitName = string.Empty; + private string _inboundValue = string.Empty; + private string _outboundValue = string.Empty; + private string _inboundLegendText = "Inbound"; + private string _outboundLegendText = "Outbound"; + + public TrafficChartControl() + { + SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw | + ControlStyles.UserPaint, + true); + + BackColor = Color.White; + } + + public void SetLegendText(string inbound, string outbound) + { + _inboundLegendText = inbound ?? string.Empty; + _outboundLegendText = outbound ?? string.Empty; + Invalidate(); + } + + public void SetData( + IReadOnlyCollection inboundPoints, + IReadOnlyCollection outboundPoints, + float maximum, + string unitName, + string inboundValue, + string outboundValue) + { + _inboundPoints = inboundPoints?.ToArray() ?? Array.Empty(); + _outboundPoints = outboundPoints?.ToArray() ?? Array.Empty(); + _maximum = Math.Max(1F, maximum); + _unitName = unitName ?? string.Empty; + _inboundValue = inboundValue ?? string.Empty; + _outboundValue = outboundValue ?? string.Empty; + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics graphics = e.Graphics; + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + + Rectangle client = ClientRectangle; + if (client.Width <= 8 || client.Height <= 8) + return; + + int axisWidth = Math.Min(58, Math.Max(38, client.Width / 8)); + int legendWidth = Math.Min(160, Math.Max(100, client.Width / 3)); + int top = 4; + int bottom = 4; + Rectangle plot = new Rectangle( + axisWidth, + top, + Math.Max(1, client.Width - axisWidth - legendWidth - 4), + Math.Max(1, client.Height - top - bottom)); + + using (var gridPen = new Pen(GridColor, 1F)) + using (var inboundPen = new Pen(InboundColor, 2F)) + using (var outboundPen = new Pen(OutboundColor, 2F)) + using (var textBrush = new SolidBrush(ForeColor)) + using (var mutedBrush = new SolidBrush(SystemColors.GrayText)) + { + DrawGrid(graphics, plot, gridPen); + DrawYAxisLabels(graphics, plot, textBrush); + DrawSeries(graphics, plot, _inboundPoints, inboundPen); + DrawSeries(graphics, plot, _outboundPoints, outboundPen); + DrawLegend(graphics, plot.Right + 8, client.Height, inboundPen, outboundPen, textBrush, mutedBrush); + } + } + + private void DrawGrid(Graphics graphics, Rectangle plot, Pen gridPen) + { + const int horizontalLines = 4; + for (int i = 0; i <= horizontalLines; i++) + { + float y = plot.Top + (plot.Height - 1) * i / (float)horizontalLines; + graphics.DrawLine(gridPen, plot.Left, y, plot.Right, y); + } + + const int verticalLines = 6; + for (int i = 0; i <= verticalLines; i++) + { + float x = plot.Left + (plot.Width - 1) * i / (float)verticalLines; + graphics.DrawLine(gridPen, x, plot.Top, x, plot.Bottom); + } + } + + private void DrawYAxisLabels(Graphics graphics, Rectangle plot, Brush brush) + { + string maxLabel = $"{_maximum:0.##} {_unitName}"; + SizeF maxSize = graphics.MeasureString(maxLabel, Font); + graphics.DrawString(maxLabel, Font, brush, Math.Max(0, plot.Left - maxSize.Width - 3), plot.Top - 1); + + if (plot.Height >= Font.Height * 2 + 4) + { + string zeroLabel = $"0 {_unitName}"; + SizeF zeroSize = graphics.MeasureString(zeroLabel, Font); + graphics.DrawString( + zeroLabel, + Font, + brush, + Math.Max(0, plot.Left - zeroSize.Width - 3), + plot.Bottom - zeroSize.Height + 1); + } + } + + private void DrawSeries(Graphics graphics, Rectangle plot, IReadOnlyList points, Pen pen) + { + if (points == null || points.Count == 0) + return; + + PointF[] mapped = new PointF[points.Count]; + float denominator = Math.Max(1, points.Count - 1); + for (int i = 0; i < points.Count; i++) + { + float normalized = Math.Clamp(points[i] / _maximum, 0F, 1F); + mapped[i] = new PointF( + plot.Left + (plot.Width - 1) * i / denominator, + plot.Bottom - 1 - (plot.Height - 1) * normalized); + } + + if (mapped.Length == 1) + graphics.DrawEllipse(pen, mapped[0].X - 1F, mapped[0].Y - 1F, 2F, 2F); + else + graphics.DrawLines(pen, mapped); + } + + private void DrawLegend( + Graphics graphics, + int x, + int height, + Pen inboundPen, + Pen outboundPen, + Brush textBrush, + Brush mutedBrush) + { + int lineHeight = Math.Max(Font.Height + 2, 14); + int firstY = Math.Max(2, (height - lineHeight * 2) / 2); + + DrawLegendRow(graphics, x, firstY, inboundPen, _inboundLegendText, _inboundValue, textBrush, mutedBrush); + DrawLegendRow(graphics, x, firstY + lineHeight, outboundPen, _outboundLegendText, _outboundValue, textBrush, mutedBrush); + } + + private void DrawLegendRow( + Graphics graphics, + int x, + int y, + Pen pen, + string label, + string value, + Brush textBrush, + Brush mutedBrush) + { + const int swatchWidth = 14; + int midY = y + Font.Height / 2; + graphics.DrawLine(pen, x, midY, x + swatchWidth, midY); + + string safeLabel = string.IsNullOrWhiteSpace(label) ? string.Empty : label; + graphics.DrawString(safeLabel, Font, textBrush, x + swatchWidth + 4, y); + + if (!string.IsNullOrWhiteSpace(value)) + { + SizeF labelSize = graphics.MeasureString(safeLabel, Font); + graphics.DrawString(value, Font, mutedBrush, x + swatchWidth + 8 + labelSize.Width, y); + } + } + } +} diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index f9e2e7415..b0402ff29 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -18,9 +18,8 @@ - + - @@ -36,7 +35,6 @@ - diff --git a/test/Sip003PluginTest.cs b/test/Sip003PluginTest.cs index 3820c3740..42a11886f 100644 --- a/test/Sip003PluginTest.cs +++ b/test/Sip003PluginTest.cs @@ -1,221 +1,221 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading; -using System.Collections.Generic; -using Shadowsocks.Model; -using Shadowsocks.Controller.Service; -using System.Diagnostics; -using System.Net; - -namespace Shadowsocks.Test -{ - [TestClass] - public class Sip003PluginTest - { - string fake_plugin = "ftp"; - - [TestMethod] - public void TestSip003Plugin_NoPlugin() - { - - - var NoPlugin = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb" - }, - false); - - RunPluginSupportTest( - NoPlugin, - "", - "", - "", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_Plugin() - { - var Plugin = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin - }, - false); - - RunPluginSupportTest( - Plugin, - fake_plugin, - "", - "", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_PluginWithOpts() - { - var PluginWithOpts = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin, - plugin_opts = "_option" - }, - false); - - RunPluginSupportTest( - PluginWithOpts, - fake_plugin, - "_option", - "", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_PluginWithArgs() - { - var PluginWithArgs = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin, - plugin_args = "_test" - }, - false); - - RunPluginSupportTest( - PluginWithArgs, - fake_plugin, - "", - "_test", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_PluginWithOptsAndArgs() - { - var PluginWithOptsAndArgs = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin, - plugin_opts = "_option", - plugin_args = "_test" - }, - false); - - RunPluginSupportTest( - PluginWithOptsAndArgs, - fake_plugin, - "_option", - "_test", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_PluginWithArgsReplaced() - { - var PluginWithArgsReplaced = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin, - plugin_args = "_test,%SS_REMOTE_HOST%" - }, - false); - - RunPluginSupportTest( - PluginWithArgsReplaced, - fake_plugin, - "", - "_test,192.168.100.1", - "192.168.100.1", - 8888); - } - - [TestMethod] - public void TestSip003Plugin_PluginWithOptsAndArgsReplaced() - { - var PluginWithOptsAndArgsReplaced = Sip003Plugin.CreateIfConfigured( - new Server - { - server = "192.168.100.1", - server_port = 8888, - password = "test", - method = "bf-cfb", - plugin = fake_plugin, - plugin_opts = "_option", - plugin_args = "_test,%SS_REMOTE_HOST%,%SS_PLUGIN_OPTIONS%" - }, - false); - - RunPluginSupportTest( - PluginWithOptsAndArgsReplaced, - fake_plugin, - "_option", - "_test,192.168.100.1,_option", - "192.168.100.1", - 8888); - } - - private static void RunPluginSupportTest(Sip003Plugin plugin, string pluginName, string pluginOpts, string pluginArgs, string serverAddress, int serverPort) - { - - if (string.IsNullOrWhiteSpace(pluginName)) return; - - plugin.StartIfNeeded(); - - Process[] processes = Process.GetProcessesByName(pluginName); - Assert.AreEqual(processes.Length, 1); - Process p = processes[0]; - - - var penv = ProcessEnvironment.ReadEnvironmentVariables(p); - var pcmd = ProcessEnvironment.GetCommandLine(p).Trim(); - pcmd = pcmd.IndexOf(' ') >= 0 ? pcmd.Substring(pcmd.IndexOf(' ') + 1) : ""; - - Assert.AreEqual(penv["SS_REMOTE_HOST"], serverAddress); - Assert.AreEqual(penv["SS_REMOTE_PORT"], serverPort.ToString()); - Assert.AreEqual(penv["SS_LOCAL_HOST"], IPAddress.Loopback.ToString()); - - int _ignored; - Assert.IsTrue(int.TryParse(penv["SS_LOCAL_PORT"], out _ignored)); - - Assert.AreEqual(penv["SS_PLUGIN_OPTIONS"], pluginOpts); - Assert.AreEqual(pcmd, pluginArgs); - - - plugin.Dispose(); - for (int i = 0; i < 50; i++) - { - if (Process.GetProcessesByName(pluginName).Length == 0) return; - Thread.Sleep(50); - } - } - } -} +using System; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading; +using System.Collections.Generic; +using Shadowsocks.Model; +using Shadowsocks.Controller.Service; +using System.Diagnostics; +using System.Net; + +namespace Shadowsocks.Test +{ + [TestClass] + public class Sip003PluginTest + { + string fake_plugin = "ftp"; + + [TestMethod] + public void TestSip003Plugin_NoPlugin() + { + + + var NoPlugin = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb" + }, + false); + + RunPluginSupportTest( + NoPlugin, + "", + "", + "", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_Plugin() + { + var Plugin = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin + }, + false); + + RunPluginSupportTest( + Plugin, + fake_plugin, + "", + "", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_PluginWithOpts() + { + var PluginWithOpts = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin, + plugin_opts = "_option" + }, + false); + + RunPluginSupportTest( + PluginWithOpts, + fake_plugin, + "_option", + "", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_PluginWithArgs() + { + var PluginWithArgs = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin, + plugin_args = "_test" + }, + false); + + RunPluginSupportTest( + PluginWithArgs, + fake_plugin, + "", + "_test", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_PluginWithOptsAndArgs() + { + var PluginWithOptsAndArgs = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin, + plugin_opts = "_option", + plugin_args = "_test" + }, + false); + + RunPluginSupportTest( + PluginWithOptsAndArgs, + fake_plugin, + "_option", + "_test", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_PluginWithArgsReplaced() + { + var PluginWithArgsReplaced = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin, + plugin_args = "_test,%SS_REMOTE_HOST%" + }, + false); + + RunPluginSupportTest( + PluginWithArgsReplaced, + fake_plugin, + "", + "_test,192.168.100.1", + "192.168.100.1", + 8888); + } + + [TestMethod] + public void TestSip003Plugin_PluginWithOptsAndArgsReplaced() + { + var PluginWithOptsAndArgsReplaced = Sip003Plugin.CreateIfConfigured( + new Server + { + server = "192.168.100.1", + server_port = 8888, + password = "test", + method = "bf-cfb", + plugin = fake_plugin, + plugin_opts = "_option", + plugin_args = "_test,%SS_REMOTE_HOST%,%SS_PLUGIN_OPTIONS%" + }, + false); + + RunPluginSupportTest( + PluginWithOptsAndArgsReplaced, + fake_plugin, + "_option", + "_test,192.168.100.1,_option", + "192.168.100.1", + 8888); + } + + private static void RunPluginSupportTest(Sip003Plugin plugin, string pluginName, string pluginOpts, string pluginArgs, string serverAddress, int serverPort) + { + + if (string.IsNullOrWhiteSpace(pluginName)) return; + + plugin.StartIfNeeded(); + + Process[] processes = Process.GetProcessesByName(pluginName); + Assert.AreEqual(1, processes.Length); + Process p = processes[0]; + + + var penv = ProcessEnvironment.ReadEnvironmentVariables(p); + var pcmd = ProcessEnvironment.GetCommandLine(p).Trim(); + pcmd = pcmd.IndexOf(' ') >= 0 ? pcmd.Substring(pcmd.IndexOf(' ') + 1) : ""; + + Assert.AreEqual(serverAddress, penv["SS_REMOTE_HOST"]); + Assert.AreEqual(serverPort.ToString(), penv["SS_REMOTE_PORT"]); + Assert.AreEqual(IPAddress.Loopback.ToString(), penv["SS_LOCAL_HOST"]); + + int _ignored; + Assert.IsTrue(int.TryParse(penv["SS_LOCAL_PORT"], out _ignored)); + + Assert.AreEqual(pluginOpts, penv["SS_PLUGIN_OPTIONS"]); + Assert.AreEqual(pluginArgs, pcmd); + + + plugin.Dispose(); + for (int i = 0; i < 50; i++) + { + if (Process.GetProcessesByName(pluginName).Length == 0) return; + Thread.Sleep(50); + } + } + } +} From 11534c7b1a18c972b1f6f85dade8faa204ccef98 Mon Sep 17 00:00:00 2001 From: SlimRG <39348033+SlimRG@users.noreply.github.com> Date: Thu, 13 Aug 2026 10:32:44 +0300 Subject: [PATCH 03/32] Remove sysproxy Remove sysproxy and switch to WinINet --- .github/ISSUE_TEMPLATE/bug_report_en.md | 46 +- .github/ISSUE_TEMPLATE/bug_report_zh.md | 49 +- .github/ISSUE_TEMPLATE/feature_request.md | 29 +- .github/PULL_REQUEST_TEMPLATE.md | 25 +- CONTRIBUTING.md | 58 +- NET10-MIGRATION.md | 69 --- README.md | 153 +++--- README.ru.md | 153 +++--- appveyor.yml.obsolete | 24 - appveyor.yml.sample | 483 ----------------- shadowsocks-csharp/CommandLineOption.cs | 4 +- shadowsocks-csharp/Controller/FileManager.cs | 2 +- shadowsocks-csharp/Controller/HotkeyReg.cs | 4 +- shadowsocks-csharp/Controller/I18N.cs | 12 +- .../Controller/LoggerExtension.cs | 38 +- .../Controller/Service/GeositeUpdater.cs | 15 +- .../Controller/Service/Listener.cs | 497 ++++++++--------- .../Service/OnlineConfigResolver.cs | 4 +- .../Controller/Service/PACDaemon.cs | 9 +- .../Controller/Service/PACServer.cs | 7 +- .../Controller/Service/PortForwarder.cs | 103 +++- .../Controller/Service/PrivoxyRunner.cs | 52 +- .../Controller/Service/Sip003Plugin.cs | 4 +- .../Controller/Service/UpdateChecker.cs | 5 +- .../Controller/ShadowsocksController.cs | 11 +- .../Controller/Strategy/BalancingStrategy.cs | 5 +- .../Strategy/HighAvailabilityStrategy.cs | 7 +- .../Controller/Strategy/IStrategy.cs | 4 +- .../Controller/Strategy/StrategyManager.cs | 3 - .../System/Hotkeys/HotkeyCallbacks.cs | 4 +- .../Controller/System/Hotkeys/Hotkeys.cs | 22 +- .../Controller/System/ProtocolHandler.cs | 9 +- .../Controller/System/SystemProxy.cs | 126 +++-- shadowsocks-csharp/Data/i18n.csv | 26 +- shadowsocks-csharp/Data/sysproxy.exe.gz | Bin 56029 -> 0 bytes shadowsocks-csharp/Data/sysproxy64.exe.gz | Bin 61784 -> 0 bytes .../Encryption/AEAD/AEADEncryptor.cs | 88 +-- .../Encryption/AEAD/AEADMbedTLSEncryptor.cs | 18 +- .../Encryption/AEAD/AEADOpenSSLEncryptor.cs | 14 +- .../Encryption/AEAD/AEADSodiumEncryptor.cs | 19 +- .../Encryption/EncryptorBase.cs | 4 +- .../Encryption/EncryptorFactory.cs | 6 +- shadowsocks-csharp/Encryption/MbedTLS.cs | 4 +- shadowsocks-csharp/Localization/Strings.resx | 31 +- .../Localization/Strings.ru.resx | 127 ++++- shadowsocks-csharp/Model/Configuration.cs | 2 +- shadowsocks-csharp/Model/LogViewerConfig.cs | 33 +- shadowsocks-csharp/Model/NlogConfig.cs | 6 +- shadowsocks-csharp/Model/Server.cs | 8 +- shadowsocks-csharp/Model/SysproxyConfig.cs | 28 - shadowsocks-csharp/Program.cs | 8 +- shadowsocks-csharp/Properties/AssemblyInfo.cs | 3 +- .../PublishProfiles/FolderProfile.pubxml | 4 +- .../Properties/Resources.Designer.cs | 20 - shadowsocks-csharp/Properties/Resources.resx | 10 +- .../Properties/Settings.Designer.cs | 86 --- .../Properties/Settings.settings | 21 - shadowsocks-csharp/Proxy/HttpProxy.cs | 10 +- shadowsocks-csharp/Proxy/Socks5Proxy.cs | 14 +- shadowsocks-csharp/Settings.cs | 28 - .../Util/ProcessManagement/Job.cs | 5 +- shadowsocks-csharp/Util/Sockets/SocketUtil.cs | 4 +- .../Util/Sockets/WrappedSocket.cs | 18 +- .../Util/SystemProxy/ProxyException.cs | 51 -- shadowsocks-csharp/Util/SystemProxy/RAS.cs | 75 +++ .../Util/SystemProxy/Sysproxy.cs | 291 ---------- .../Util/SystemProxy/WinINet.cs | 508 ++++++++++++++++++ shadowsocks-csharp/Util/Util.cs | 10 +- shadowsocks-csharp/View/ConfigForm.cs | 8 +- shadowsocks-csharp/View/LogForm.cs | 19 +- shadowsocks-csharp/View/MenuViewController.cs | 64 +-- .../View/TrafficChartControl.cs | 53 +- .../ViewModels/ForwardProxyViewModel.cs | 25 +- .../ViewModels/HotkeysViewModel.cs | 10 +- .../ViewModels/OnlineConfigViewModel.cs | 16 +- .../ViewModels/ServerSharingViewModel.cs | 5 +- .../VersionUpdatePromptViewModel.cs | 15 +- .../Views/ForwardProxyView.xaml.cs | 4 +- shadowsocks-csharp/Views/HotkeysView.xaml.cs | 4 +- .../Views/OnlineConfigView.xaml.cs | 4 +- .../Views/ServerSharingView.xaml.cs | 4 +- .../Views/VersionUpdatePromptView.xaml.cs | 4 +- shadowsocks-csharp/app.config | 72 --- shadowsocks-csharp/shadowsocks-csharp.csproj | 19 +- test/Properties/AssemblyInfo.cs | 3 +- test/ShadowsocksTest.csproj | 2 +- test/Sip003PluginTest.cs | 16 +- test/UnitTest.cs | 9 +- test/UrlTest.cs | 8 +- 89 files changed, 1820 insertions(+), 2160 deletions(-) delete mode 100644 NET10-MIGRATION.md delete mode 100644 appveyor.yml.obsolete delete mode 100644 appveyor.yml.sample delete mode 100644 shadowsocks-csharp/Data/sysproxy.exe.gz delete mode 100644 shadowsocks-csharp/Data/sysproxy64.exe.gz delete mode 100644 shadowsocks-csharp/Model/SysproxyConfig.cs delete mode 100644 shadowsocks-csharp/Properties/Settings.Designer.cs delete mode 100644 shadowsocks-csharp/Properties/Settings.settings delete mode 100644 shadowsocks-csharp/Settings.cs delete mode 100644 shadowsocks-csharp/Util/SystemProxy/ProxyException.cs create mode 100644 shadowsocks-csharp/Util/SystemProxy/RAS.cs delete mode 100644 shadowsocks-csharp/Util/SystemProxy/Sysproxy.cs create mode 100644 shadowsocks-csharp/Util/SystemProxy/WinINet.cs delete mode 100755 shadowsocks-csharp/app.config diff --git a/.github/ISSUE_TEMPLATE/bug_report_en.md b/.github/ISSUE_TEMPLATE/bug_report_en.md index d1998ede0..f49a2108a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_en.md +++ b/.github/ISSUE_TEMPLATE/bug_report_en.md @@ -1,39 +1,47 @@ --- name: Bug report (English) -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - +about: Report a reproducible client problem +title: "" +labels: "" +assignees: "" --- -### Describe the bug +## Bug description + +Describe the problem clearly and concisely. -### Environment +## Environment - Shadowsocks client version: -- OS version: -- .NET version: +- Windows version: +- .NET runtime/SDK version: +- Build architecture: x86 -### Steps you have tried +## Steps to reproduce +1. +2. +3. -### What did you expect to see? +## Expected behavior +Describe what should happen. -### What did you see instead? +## Actual behavior +Describe what happens instead. -### Config and error log in detail (with all sensitive info masked) +## Configuration and logs -``` +Remove passwords, server addresses, subscription URLs, and other sensitive information. + +```text PASTE LOG HERE ``` diff --git a/.github/ISSUE_TEMPLATE/bug_report_zh.md b/.github/ISSUE_TEMPLATE/bug_report_zh.md index 17d46f707..7d817c836 100644 --- a/.github/ISSUE_TEMPLATE/bug_report_zh.md +++ b/.github/ISSUE_TEMPLATE/bug_report_zh.md @@ -1,39 +1,46 @@ --- -name: Bug报告 (中文) -about: 反馈Bug -title: '' -labels: bug report -assignees: '' - +name: Bug 报告(中文) +about: 反馈可复现的客户端问题 +title: "" +labels: "bug report" +assignees: "" --- -### 简要描述问题 +## 问题描述 -### 环境 +请简要、清晰地描述问题。 -- Shadowsocks客户端版本: -- 操作系统版本: -- .NET版本: +## 环境 -### 操作步骤 +- Shadowsocks 客户端版本: +- Windows 版本: +- .NET Runtime/SDK 版本: +- 构建架构:x86 +## 复现步骤 -### 期望的结果 +1. +2. +3. +## 期望结果 -### 实际结果 +请描述预期行为。 +## 实际结果 -### 配置文件和日志文件(请隐去敏感信息) +请描述实际行为。 -``` +## 配置和日志 + +请先移除所有敏感信息。 + +```text 在此粘贴日志 ``` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 24473dee7..6c56bee22 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,23 @@ --- name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - +about: Suggest an improvement or new capability +title: "" +labels: "" +assignees: "" --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +## Problem + +Describe the problem or limitation the proposal addresses. + +## Proposed solution + +Describe the desired behavior. + +## Alternatives considered -**Describe the solution you'd like** -A clear and concise description of what you want to happen. +Describe other approaches you considered and why they are less suitable. -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. +## Additional context -**Additional context** -Add any other context or screenshots about the feature request here. \ No newline at end of file +Add examples, screenshots, compatibility constraints, or other relevant information. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 88187a169..c75edb388 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,21 +1,18 @@ -## Please follow the guide below +## Checklist -- You will be asked some questions, please read them **carefully** and answer honestly -- Put an `x` into all the boxes [ ] relevant to your *pull request* (like that [x]) -- Use *Preview* tab to see how your *pull request* will actually look like +- [ ] I searched for similar issues and pull requests. +- [ ] I built the solution with the .NET 10 SDK. +- [ ] I ran the relevant tests. +- [ ] I updated translations when user-visible text changed. +- [ ] I updated documentation when requirements, configuration, or behavior changed. -- [ ] [Searched](https://github.com/shadowsocks/shadowsocks-windows/search?q=is%3Apr&type=Issues) for similar pull requests -- [ ] Compiled the code with Visual Studio -- [ ] Require translation update -- [ ] Require document update (readme.md, wikipage, etc) +## Change type -### What is the purpose of your *pull request*? - [ ] Bug fix -- [ ] Improvement +- [ ] Improvement/refactoring - [ ] New feature +- [ ] Documentation ---- +## Description -### Description of your *pull request* and other information - -Explanation of your *pull request* in arbitrary form goes here. Please make sure the description explains the purpose and effect of your *pull request* and is worded well enough to be understood. Provide as much context and examples as possible. \ No newline at end of file +Describe the purpose of the change, the affected behavior, and any compatibility considerations. Include reproduction steps or test evidence when relevant. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 671b78474..c76798093 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,28 +1,56 @@ # Contributing -Contributions are welcome. Keep changes focused and avoid unrelated behavior changes in the same pull request. +Keep pull requests focused. Avoid unrelated protocol, configuration or UI changes in the same patch. -## Before opening a pull request +## Requirements -1. Search existing issues and pull requests for related work. -2. Build the solution with the .NET 10 SDK. -3. Run the test project. -4. Add or update tests when behavior changes. -5. Update documentation when user-visible behavior, requirements, or configuration changes. +- Windows +- .NET 10 SDK +- Target framework: `net10.0-windows10.0.19041.0` +- Application/test architecture: x86 -```powershell +The application must remain x86 until the bundled in-process `libsscrypto.dll` is replaced with a compatible build. + +## Build and validate + +```cmd dotnet restore .\shadowsocks-windows.sln dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile ``` -The application must remain x86 until the bundled in-process `libsscrypto.dll` is replaced with a compatible 64-bit build. +Delete stale `bin`/`obj` before diagnosing problems after TFM, WPF dependency or publish-profile changes. + +A successful build is not enough for runtime-sensitive changes. Exercise the code path you changed. + +## Compatibility rules + +- Preserve existing v4 protocol and configuration behavior unless the change explicitly requires otherwise. +- Keep application settings in `gui-config.json`; do not reintroduce `ApplicationSettingsBase`, `app.config` or `Shadowsocks.dll.config`. +- Keep system-proxy integration in-process; do not reintroduce `sysproxy.exe` / `sysproxy64.exe`. +- Do not reintroduce `System.Windows.Forms.DataVisualization` / `System.Data.SqlClient` solely for the traffic chart. +- Do not globally suppress `Win32Exception`. Filter an expected native error only at the call site where it is known to be harmless. + +## Runtime checks + +For system-proxy changes, test saved PAC and Global modes, mode switching, internal reload, full exit/restoration and restart/reapplication. Tray/menu state must match the effective Windows proxy state. + +For listener/Privoxy changes, run repeated reloads and distinguish expected shutdown cancellation from genuine failures. + +For WPF/ReactiveUI changes, open every affected view at runtime. + +## Localization + +User-visible text must be localizable: + +- WinForms/tray/menu strings: `shadowsocks-csharp/Data/i18n.csv` +- WPF strings: `shadowsocks-csharp/Localization/Strings*.resx` + +Do not add a hard-coded English `MessageBox`, window title, label, tooltip or validation message when it belongs in the UI. -## Issues +## Bug reports -Before opening an issue: +Remove passwords, server addresses, subscription URLs, PAC secrets and other sensitive data. -- Search existing issues first. -- For connection problems, review the upstream [Troubleshooting guide](https://github.com/shadowsocks/shadowsocks-windows/wiki/Troubleshooting). -- Remove passwords, server addresses, subscription URLs, and other sensitive data from logs and screenshots. -- Include the client version, Windows version, .NET runtime version, reproduction steps, and relevant log output. +Include the client version, Windows version, .NET runtime/SDK version, build/publish command, reproduction steps and relevant logs. For native failures, keep `NativeErrorCode`, HRESULT and the full stack trace. diff --git a/NET10-MIGRATION.md b/NET10-MIGRATION.md deleted file mode 100644 index 00cdc7b19..000000000 --- a/NET10-MIGRATION.md +++ /dev/null @@ -1,69 +0,0 @@ -# .NET 10 migration notes - -This branch keeps the Shadowsocks Windows v4 architecture and retargets the existing client to `net10.0-windows` while preserving the x86 process architecture required by the bundled native cryptography library. - -## Scope - -The migration intentionally avoids the large architectural changes found in later Shadowsocks Windows generations. Compatibility changes are limited to the parts required for modern .NET and tooling. - -Notable changes include: - -- SDK-style application and test projects with `PackageReference`. -- `net10.0-windows` target framework. -- x86 `PlatformTarget` retained for `libsscrypto.dll` compatibility. -- `GlobalHotKeyCore` replacing the .NET Framework-only hotkey package. -- ToolStrip-based WinForms menus replacing legacy menu controls. -- Compatibility implementation for the original `HttpServerUtility.UrlTokenEncode` format used by PAC URLs. -- Deterministic cross-process instance and IPC identifiers instead of randomized `string.GetHashCode()` values. -- Modern `NotifyIcon.Text` and shell URL launching. -- ReactiveUI properties implemented without `ReactiveUI.Fody` IL weaving. -- Native .NET single-file publishing; Costura is no longer used. -- Modern WPF-compatible MdXaml/AvalonEdit/localization package versions. -- Modern MSTest project and assertions. - -## Build - -Use a .NET 10 SDK on Windows: - -```powershell -dotnet restore .\shadowsocks-windows.sln -dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 -dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 -``` - -## Publish - -The supplied profile creates a framework-dependent x86 single-file application: - -```powershell -dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` - -c Release ` - -p:Platform=x86 ` - -p:PublishProfile=FolderProfile -``` - -`RuntimeIdentifier=win-x86` is scoped to the publish profile rather than normal Debug/Release builds. - -## WPF markup compiler - -The WPF project uses current package assets compatible with modern Windows Desktop builds. In particular, MdXaml and its AvalonEdit dependency were updated together to prevent NuGet downgrade and legacy WPF markup-compiler failures. - -When changing WPF dependencies, remove stale `bin`/`obj` directories before diagnosing `MarkupCompilePass1` failures. - -## Native constraints - -The process remains x86 because `Data/libsscrypto.dll.gz` contains a 32-bit native DLL loaded in-process. `privoxy.exe` is a separate x86 helper process. Both x86 and x64 variants of `sysproxy` are bundled. - -Moving the main application to x64 therefore requires replacing or rebuilding `libsscrypto.dll` first. - -## Validation history - -The port has been iterated against actual .NET 10 restore/build/publish diagnostics. The current project configuration has successfully reached `dotnet publish` under .NET 10; subsequent cleanup changes intentionally avoid behavioral modifications to networking, encryption, configuration, and server-selection logic. - -### WinForms chart compatibility - -The legacy `System.Windows.Forms.DataVisualization` traffic chart was replaced with a small built-in WinForms/GDI+ control. This removes the chart package's hidden runtime dependency on `System.Data.SqlClient` and prevents the unrelated native `sni.dll` SQL transport from being included in the publish output. Shadowsocks itself does not use SQL Server. - -### Socket listener shutdown on .NET 7+ - -.NET 7 changed the legacy `Socket.Begin*/End*` cancellation behavior: closing a socket with a pending asynchronous operation can surface as `SocketException` with `SocketError.OperationAborted` instead of `ObjectDisposedException`. `Listener.AcceptCallback` now treats `OperationAborted`/`Interrupted` during listener shutdown as expected and does not re-arm a stopped or replaced listener. Real socket errors are still logged. diff --git a/README.md b/README.md index 89553a41d..6475e0288 100644 --- a/README.md +++ b/README.md @@ -4,148 +4,121 @@ **English** | [Русский](README.ru.md) | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) -This repository contains the Shadowsocks Windows v4 client migrated to **.NET 10** while preserving the original architecture and behavior as closely as possible. +This repository keeps the Shadowsocks for Windows **v4** client architecture and ports it to **.NET 10**. The goal is compatibility with current Windows/.NET while preserving the v4 transport, encryption, configuration, plugin and server-selection behavior. ## Features -- System proxy configuration. -- PAC and global proxy modes. -- GeoSite and user-defined PAC rules. +- PAC and Global Windows system-proxy modes. - Local SOCKS5 and HTTP proxy endpoints. -- Server auto-switching strategies. -- UDP relay. -- SIP003 plugins. +- GeoSite-based PAC generation and custom user rules. +- SIP003 plugins and UDP relay. +- Server switching strategies. +- QR-code import/export and online configuration sources. - Global hotkeys. -- QR-code import/export. -- Online configuration support. +- Localized WinForms/WPF UI. +- Log viewer with a built-in traffic chart. -## Requirements +## Requirements and architecture -- Windows supported by .NET 10 Desktop. -- .NET 10 Desktop Runtime (x86) for the framework-dependent published build. -- Microsoft Visual C++ Redistributable (x86) may be required by the bundled native components. +- Target framework: `net10.0-windows10.0.19041.0`. +- Publish RID: `win-x86`. +- .NET 10 Desktop Runtime (x86) is required for the framework-dependent publish. +- The main process remains x86 because bundled `libsscrypto.dll` is loaded in-process and is 32-bit. +- `privoxy.exe` is bundled as an x86 helper process. -> The application is intentionally built as **x86** because the bundled `libsscrypto.dll` is 32-bit. Privoxy is also bundled as an x86 helper process, while both x86 and x64 variants of `sysproxy` are included. +The explicit Windows TFM is required by the current ReactiveUI/System.Reactive stack so the Windows dispatcher implementation is selected correctly. -## Download and publish +## Build -Published builds are produced as a framework-dependent, x86, single-file executable. +Use a .NET 10 SDK on Windows: -```powershell -dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` - -c Release ` - -p:Platform=x86 ` - -p:PublishProfile=FolderProfile +```cmd +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 ``` -The publish output is written under: +Publish with the supplied profile: -```text -shadowsocks-csharp\bin\x86\Release\net10.0-windows\win-x86\publish\ +```cmd +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile ``` -## Basic usage +Output: -1. Start Shadowsocks and find its icon in the notification area. -2. Add one or more servers from the **Servers** menu. -3. Select **Enable System Proxy** to route applications that use the Windows system proxy. -4. Alternatively, configure an application manually to use the local SOCKS5 or HTTP proxy at `127.0.0.1:1080` by default. The local port can be changed in the server settings. +```text +shadowsocks-csharp\bin\x86\Release\net10.0-windows10.0.19041.0\win-x86\publish\ +``` -## PAC +The publish is framework-dependent, untrimmed and single-file. -PAC rules are generated from the GeoSite database from [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). +## Configuration -Two modes are supported: +Application settings are stored in `gui-config.json`, including Log Viewer state. -- **Whitelist mode** (`geositePreferDirect = false`, default): domains from the direct groups bypass the proxy; unmatched domains use the proxy. -- **Blacklist mode** (`geositePreferDirect = true`): domains from the proxied groups use the proxy; direct-group exceptions bypass it; unmatched domains connect directly. +`Shadowsocks.dll.config` is not used. The old `ApplicationSettingsBase`/`app.config` settings path has been removed. -Relevant configuration properties in `gui-config.json`: +`Shadowsocks.pdb` is optional at runtime. Keep it while testing to retain source file and line information in stack traces. -- `geositeDirectGroups` — initialized with `cn` and `geolocation-!cn@cn`. -- `geositeProxiedGroups` — initialized with `geolocation-!cn`. -- `geositePreferDirect` — selects whitelist/blacklist behavior. +## System proxy -### User-defined PAC rules +The legacy `sysproxy.exe` / `sysproxy64.exe` path has been removed. System proxy settings are applied directly through WinINet. -Use `user-rule.txt` for custom PAC rules. Direct edits to generated `pac.txt` can be overwritten when the GeoSite database is updated. +The selected mode is persisted in `gui-config.json`: -For Microsoft Store/UWP applications, Windows may require importing the Internet Explorer/system proxy into WinHTTP from an elevated terminal: +- Disabled: `enabled = false` +- Global: `enabled = true`, `global = true` +- PAC: `enabled = true`, `global = false` -```cmd -netsh winhttp import proxy source=ie -``` +At startup and after internal reloads, Shadowsocks reapplies the saved mode and reads the effective Windows state back. Tray/menu state follows the effective state, not only the JSON flags. -## Server auto switching +On full exit, the system proxy state captured before Shadowsocks started is restored. The selected Shadowsocks mode remains saved and is reapplied on the next start. -Available strategies include: +## PAC -1. Load balancing — select a server randomly. -2. High availability — prefer a server with lower latency and packet loss. -3. Total package loss — use availability statistics to select a server. +PAC rules are generated from the GeoSite database from [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). -Custom strategies can implement the `IStrategy` interface. +Custom rules belong in `user-rule.txt`; generated `pac.txt` may be replaced after a GeoSite update. -## UDP +Relevant settings include `geositeDirectGroups`, `geositeProxiedGroups` and `geositePreferDirect`. -Applications that do not support SOCKS5 UDP directly may require software such as SocksCap or ProxyCap to route their UDP traffic through Shadowsocks. +## Plugins and HTTP forwarding -## Multiple instances +Configure a plugin executable in the server editor. Relative and absolute paths are supported. -To run multiple instances independently, place each copy in a different directory and configure a different local port. Instance identification is derived deterministically from the executable path so IPC and single-instance behavior remain stable on modern .NET. +Privoxy startup is synchronized with the local HTTP forwarder so normal traffic is not accepted before Privoxy starts listening. During reload, active forwarding handlers are closed before Privoxy is stopped. -## Plugins +See the upstream guide for [non-SIP003 plugins](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). -Configure a plugin executable path, relative or absolute, in the server editor. Forward proxy settings are not used while a SIP003 plugin is active. +## UDP -See the upstream documentation for [non-SIP003 plugins](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). +Applications that do not support SOCKS5 UDP directly may require a routing tool such as SocksCap or ProxyCap. -## Global hotkeys +Listener cancellation during normal stop/reload is treated as expected shutdown. Unexpected socket failures are still logged. -Hotkeys can be registered automatically at startup. If multiple Shadowsocks instances are running, use different key combinations for each instance. +## Localization -- Focus a hotkey field and press the desired combination to assign it. -- Press **Backspace** to clear the current combination. -- Green indicates successful registration. -- Yellow indicates a conflict with another application. +The classic WinForms UI uses `shadowsocks-csharp/Data/i18n.csv`. WPF views use `shadowsocks-csharp/Localization/Strings*.resx`. -## Development +When adding user-visible text, add it to the appropriate localization source instead of leaving a hard-coded UI string. -The solution targets `net10.0-windows` and keeps the application and tests on x86. +## Diagnostics -```powershell -dotnet restore .\shadowsocks-windows.sln -dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 -dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 -``` - -Migration-specific details are documented in [NET10-MIGRATION.md](NET10-MIGRATION.md). +Runtime logging uses NLog. Real `Win32Exception` failures are logged with the native error code, HRESULT and stack trace. -## Main managed dependencies +`ERROR_PARTIAL_COPY (299)` is ignored only at the specific cross-bitness process-inspection call where it is expected. -| Component | Purpose | -| --- | --- | -| ReactiveUI / ReactiveUI.WPF | WPF MVVM and bindings | -| WPFLocalizeExtension | WPF localization | -| MdXaml / AvalonEdit | Markdown rendering | -| Newtonsoft.Json | Configuration and API JSON | -| NLog | Logging | -| Google.Protobuf | GeoSite data model | -| ZXing.Net | QR-code support | -| GlobalHotKeyCore | Global keyboard shortcuts | -| Caseless.Fody / Fody | Case-insensitive string comparison weaving | +For runtime reports, keep the complete WARN/ERROR entry and stack trace. Keeping `Shadowsocks.pdb` next to the executable makes those traces substantially more useful. ## Bundled native components | Component | Architecture | Purpose | | --- | --- | --- | -| `libsscrypto.dll` | x86 | Shadowsocks native cryptography | +| `libsscrypto.dll` | x86 | In-process Shadowsocks cryptography | | `privoxy.exe` | x86 | Local HTTP-to-SOCKS bridge | -| `sysproxy.exe` | x86 | Windows system-proxy helper | -| `sysproxy64.exe` | x64 | Windows system-proxy helper on 64-bit Windows | -## License +The current port does not use `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` or `sni.dll`. -Shadowsocks for Windows is distributed under the [GNU General Public License v3.0](LICENSE.txt). +## License -The repository also contains third-party components under their respective licenses. See their upstream projects for details. +Shadowsocks for Windows is distributed under the [GNU General Public License v3.0](LICENSE.txt). Third-party components remain under their respective licenses. diff --git a/README.ru.md b/README.ru.md index d40dca640..4798e07b5 100644 --- a/README.ru.md +++ b/README.ru.md @@ -4,148 +4,121 @@ [English](README.md) | **Русский** | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) -Этот репозиторий содержит клиент Shadowsocks for Windows ветки v4, перенесённый на **.NET 10** с максимально возможным сохранением исходной архитектуры и поведения. +Этот репозиторий сохраняет архитектуру клиента Shadowsocks for Windows **v4** и переносит её на **.NET 10**. Основная цель — совместимость с современными Windows/.NET без ненужного изменения транспорта, шифрования, формата конфигурации, плагинов и логики выбора серверов. ## Возможности -- Настройка системного прокси Windows. -- PAC-режим и глобальный режим проксирования. -- GeoSite и пользовательские PAC-правила. +- Системный прокси Windows в режимах PAC и Global. - Локальные SOCKS5- и HTTP-прокси. -- Автоматическое переключение серверов. -- UDP relay. -- SIP003-плагины. +- Генерация PAC по GeoSite и пользовательские правила. +- SIP003-плагины и UDP relay. +- Стратегии переключения серверов. +- Импорт и экспорт через QR-коды и онлайн-конфигурации. - Глобальные горячие клавиши. -- Импорт и экспорт серверов через QR-коды. -- Онлайн-конфигурации. +- Локализованный WinForms/WPF-интерфейс. +- Просмотр журнала со встроенным графиком трафика. -## Требования +## Требования и архитектура -- Windows, поддерживаемая .NET 10 Desktop. -- .NET 10 Desktop Runtime (x86) для framework-dependent публикации. -- Для встроенных native-компонентов может потребоваться Microsoft Visual C++ Redistributable (x86). +- Target framework: `net10.0-windows10.0.19041.0`. +- Publish RID: `win-x86`. +- Для framework-dependent публикации требуется .NET 10 Desktop Runtime (x86). +- Основной процесс остаётся x86: встроенная `libsscrypto.dll` загружается в процесс и является 32-битной. +- `privoxy.exe` поставляется как отдельный x86-процесс. -> Приложение намеренно собирается как **x86**, потому что встроенная `libsscrypto.dll` является 32-битной. Privoxy также поставляется как отдельный x86-процесс, а `sysproxy` присутствует сразу в x86- и x64-вариантах. +Явная Windows-версия в TFM нужна текущему стеку ReactiveUI/System.Reactive, чтобы NuGet выбирал Windows-реализацию dispatcher scheduler. -## Сборка и публикация +## Сборка -Release публикуется как framework-dependent x86 single-file приложение: +Используйте .NET 10 SDK под Windows: -```powershell -dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj ` - -c Release ` - -p:Platform=x86 ` - -p:PublishProfile=FolderProfile +```cmd +dotnet restore .\shadowsocks-windows.sln +dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 +dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 ``` -Результат появляется в каталоге: +Публикация: -```text -shadowsocks-csharp\bin\x86\Release\net10.0-windows\win-x86\publish\ +```cmd +dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile ``` -## Быстрый старт +Результат: -1. Запустите Shadowsocks и найдите его значок в области уведомлений. -2. Добавьте один или несколько серверов через меню **Servers**. -3. Включите **Enable System Proxy**, если приложения должны использовать системный прокси Windows. -4. Либо настройте приложение вручную на локальный SOCKS5/HTTP-прокси `127.0.0.1:1080`. Порт можно изменить в настройках. +```text +shadowsocks-csharp\bin\x86\Release\net10.0-windows10.0.19041.0\win-x86\publish\ +``` -## PAC +Профиль создаёт framework-dependent, untrimmed, single-file публикацию. -PAC-правила строятся по базе GeoSite из проекта [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). +## Конфигурация -Поддерживаются два режима: +Настройки приложения хранятся в `gui-config.json`, включая состояние окна журнала. -- **Whitelist** (`geositePreferDirect = false`, по умолчанию): домены из direct-групп идут напрямую, остальные — через прокси. -- **Blacklist** (`geositePreferDirect = true`): домены из proxied-групп идут через прокси, direct-группы являются исключениями, остальные соединения идут напрямую. +`Shadowsocks.dll.config` больше не используется. Старый механизм `ApplicationSettingsBase`/`app.config` удалён. -Основные параметры в `gui-config.json`: +`Shadowsocks.pdb` для работы программы не обязателен. Во время тестирования его лучше оставлять, чтобы stack trace содержал имена исходных файлов и номера строк. -- `geositeDirectGroups` — по умолчанию содержит `cn` и `geolocation-!cn@cn`. -- `geositeProxiedGroups` — по умолчанию содержит `geolocation-!cn`. -- `geositePreferDirect` — выбирает режим whitelist/blacklist. +## Системный прокси -### Пользовательские PAC-правила +Старый механизм через `sysproxy.exe` / `sysproxy64.exe` удалён. Системный прокси теперь настраивается напрямую через WinINet. -Собственные правила рекомендуется добавлять в `user-rule.txt`. Изменения непосредственно в сгенерированном `pac.txt` могут быть потеряны после обновления GeoSite. +Выбранный режим сохраняется в `gui-config.json`: -Для Microsoft Store/UWP-приложений иногда требуется импортировать системный прокси в WinHTTP из консоли администратора: +- Отключено: `enabled = false` +- Global: `enabled = true`, `global = true` +- PAC: `enabled = true`, `global = false` -```cmd -netsh winhttp import proxy source=ie -``` +При запуске и после внутренних reload Shadowsocks заново применяет сохранённый режим и считывает фактическое состояние Windows. Галочки меню и состояние tray отражают именно фактически применённый режим. -## Автоматическое переключение серверов +При полном выходе восстанавливается системный прокси, который был активен до запуска Shadowsocks. Выбранный режим Shadowsocks остаётся сохранённым и применяется при следующем запуске. -Доступны, в частности, следующие стратегии: - -1. Load balancing — случайный выбор сервера. -2. High availability — предпочтение сервера с меньшей задержкой и потерями. -3. Total package loss — выбор по статистике доступности. +## PAC -Собственную стратегию можно реализовать через интерфейс `IStrategy`. +PAC-правила генерируются по базе GeoSite проекта [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). -## UDP +Пользовательские правила следует добавлять в `user-rule.txt`: сгенерированный `pac.txt` может быть заменён при обновлении GeoSite. -Если приложение не умеет напрямую использовать SOCKS5 UDP, для маршрутизации UDP-трафика через Shadowsocks может понадобиться SocksCap, ProxyCap или аналогичный инструмент. +Основные параметры: `geositeDirectGroups`, `geositeProxiedGroups` и `geositePreferDirect`. -## Несколько экземпляров +## Плагины и HTTP-прокси -Для независимого запуска нескольких экземпляров разместите каждую копию Shadowsocks в отдельном каталоге и назначьте разные локальные порты. Идентификатор экземпляра вычисляется детерминированно по пути к исполняемому файлу, поэтому IPC и single-instance логика стабильны на современном .NET. +Исполняемый файл плагина задаётся в редакторе сервера; поддерживаются относительные и абсолютные пути. -## Плагины +Запуск Privoxy синхронизирован с локальным HTTP-forwarder: обычный трафик не принимается до того, как Privoxy начнёт слушать порт. При reload активные forwarding handlers закрываются до остановки Privoxy. -Путь к исполняемому файлу плагина задаётся в редакторе сервера и может быть относительным или абсолютным. При активном SIP003-плагине настройки Forward Proxy не используются. +Upstream-документация по [плагинам, не соответствующим SIP003](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). -Документация upstream по [плагинам, не соответствующим SIP003](https://github.com/shadowsocks/shadowsocks-windows/wiki/Working-with-non-SIP003-standard-Plugin). +## UDP -## Глобальные горячие клавиши +Если приложение не умеет напрямую использовать SOCKS5 UDP, может потребоваться SocksCap, ProxyCap или аналогичный инструмент. -Горячие клавиши могут регистрироваться автоматически при запуске. Для нескольких одновременно запущенных экземпляров Shadowsocks необходимо назначать разные сочетания. +Отмена listener-операций при штатном stop/reload не считается ошибкой. Неожиданные socket failures по-прежнему записываются в журнал. -- Установите фокус в поле и нажмите нужное сочетание клавиш. -- **Backspace** очищает назначение. -- Зелёный цвет означает успешную регистрацию. -- Жёлтый означает конфликт с другой программой. +## Локализация -## Разработка +Классический WinForms-интерфейс использует `shadowsocks-csharp/Data/i18n.csv`. WPF-окна используют `shadowsocks-csharp/Localization/Strings*.resx`. -Solution нацелен на `net10.0-windows`; приложение и тесты сохраняют x86-архитектуру. +При добавлении пользовательского текста его нужно сразу добавлять в соответствующий источник локализации, а не оставлять жёстко заданной английской строкой. -```powershell -dotnet restore .\shadowsocks-windows.sln -dotnet build .\shadowsocks-windows.sln -c Release -p:Platform=x86 -dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 -``` +## Диагностика -Подробности переноса находятся в [NET10-MIGRATION.md](NET10-MIGRATION.md). +Для runtime-логов используется NLog. Реальные `Win32Exception` записываются вместе с native error code, HRESULT и stack trace. -## Основные managed-зависимости +`ERROR_PARTIAL_COPY (299)` игнорируется только в конкретном месте проверки чужого процесса, где такая cross-bitness ошибка ожидаема. -| Компонент | Назначение | -| --- | --- | -| ReactiveUI / ReactiveUI.WPF | MVVM и WPF bindings | -| WPFLocalizeExtension | Локализация WPF | -| MdXaml / AvalonEdit | Отображение Markdown | -| Newtonsoft.Json | JSON-конфигурации и API | -| NLog | Логирование | -| Google.Protobuf | Модель данных GeoSite | -| ZXing.Net | QR-коды | -| GlobalHotKeyCore | Глобальные горячие клавиши | -| Caseless.Fody / Fody | IL-weaving для регистронезависимых сравнений строк | +При отчёте об ошибке прикладывайте полный WARN/ERROR и stack trace. `Shadowsocks.pdb` рядом с EXE делает диагностику заметно полезнее. ## Встроенные native-компоненты | Компонент | Архитектура | Назначение | | --- | --- | --- | -| `libsscrypto.dll` | x86 | Native-криптография Shadowsocks | +| `libsscrypto.dll` | x86 | Встроенная криптография Shadowsocks | | `privoxy.exe` | x86 | Локальный HTTP-to-SOCKS bridge | -| `sysproxy.exe` | x86 | Управление системным прокси Windows | -| `sysproxy64.exe` | x64 | Управление системным прокси на 64-битной Windows | -## Лицензия +Текущий порт не использует `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` и `sni.dll`. -Shadowsocks for Windows распространяется по лицензии [GNU General Public License v3.0](LICENSE.txt). +## Лицензия -В репозитории также присутствуют сторонние компоненты, распространяемые по собственным лицензиям. Подробности смотрите в соответствующих upstream-проектах. +Shadowsocks for Windows распространяется по лицензии [GNU General Public License v3.0](LICENSE.txt). Сторонние компоненты сохраняют собственные лицензии. diff --git a/appveyor.yml.obsolete b/appveyor.yml.obsolete deleted file mode 100644 index d23aa9974..000000000 --- a/appveyor.yml.obsolete +++ /dev/null @@ -1,24 +0,0 @@ -# Created by wongsyrone - -version: 1.0.{build} -image: Visual Studio 2017 -environment: - matrix: - - platform: x86 - configuration: Debug - - platform: x86 - configuration: Release -matrix: - fast_finish: false -nuget: - project_feed: true -before_build: -- cmd: nuget restore -build: - parallel: true - verbosity: normal -artifacts: -- path: shadowsocks-csharp\bin\x86\Release\Shadowsocks.exe - name: Shadowsocks-release.exe -- path: shadowsocks-csharp\bin\x86\Debug\Shadowsocks.exe - name: Shadowsocks-debug.exe diff --git a/appveyor.yml.sample b/appveyor.yml.sample deleted file mode 100644 index e3bd655a0..000000000 --- a/appveyor.yml.sample +++ /dev/null @@ -1,483 +0,0 @@ - -# Notes: -# - Minimal appveyor.yml file is an empty file. All sections are optional. -# - Indent each level of configuration with 2 spaces. Do not use tabs! -# - All section names are case-sensitive. -# - Section names should be unique on each level. - -#---------------------------------# -# general configuration # -#---------------------------------# - -# version format -version: 1.0.{build} - -# you can use {branch} name in version format too -# version: 1.0.{build}-{branch} - -# branches to build -branches: - # whitelist - only: - - master - - production - - # blacklist - except: - - gh-pages - -# Do not build on tags (GitHub and BitBucket) -skip_tags: true - -# Start builds on tags only (GitHub and BitBucket) -skip_non_tags: true - -# Skipping commits with particular message or from specific user -skip_commits: - message: /Created.*\.(png|jpg|jpeg|bmp|gif)/ # Regex for matching commit message - author: John # Commit author's username, name, email or regexp maching one of these. - -# Including commits with particular message or from specific user -only_commits: - message: /build/ # Start a new build if message contains 'build' - author: jack@company.com # Start a new build for commit of user with email jack@company.com - -# Skipping commits affecting specific files (GitHub only). More details here: /docs/appveyor-yml -#skip_commits: -# files: -# - docs/* -# - '**/*.html' - -# Including commits affecting specific files (GitHub only). More details here: /docs/appveyor-yml -#only_commits: -# files: -# - Project-A/ -# - Project-B/ - -# Do not build feature branch with open Pull Requests -skip_branch_with_pr: true - -# Maximum number of concurrent jobs for the project -max_jobs: 1 - -#---------------------------------# -# environment configuration # -#---------------------------------# - -# Build worker image (VM template) -image: Visual Studio 2015 - -# scripts that are called at very beginning, before repo cloning -init: - - git config --global core.autocrlf input - -# clone directory -clone_folder: c:\projects\myproject - -# fetch repository as zip archive -shallow_clone: true # default is "false" - -# set clone depth -clone_depth: 5 # clone entire repository history if not defined - -# setting up etc\hosts file -hosts: - queue-server: 127.0.0.1 - db.server.com: 127.0.0.2 - -# environment variables -environment: - my_var1: value1 - my_var2: value2 - # this is how to set encrypted variable. Go to "Settings" -> "Encrypt YAML" page in account menu to encrypt data. - my_secure_var1: - secure: FW3tJ3fMncxvs58/ifSP7w== - -# environment: -# global: -# connection_string: server=12;password=13; -# service_url: https://127.0.0.1:8090 -# -# matrix: -# - db: mysql -# provider: mysql -# -# - db: mssql -# provider: mssql -# password: -# secure: $#(JFDA)jQ@#$ - -# this is how to allow failing jobs in the matrix -matrix: - fast_finish: true # set this flag to immediately finish build once one of the jobs fails. - allow_failures: - - platform: x86 - configuration: Debug - - platform: x64 - configuration: Release - -# exclude configuration from the matrix. Works similarly to 'allow_failures' but build not even being started for excluded combination. - exclude: - - platform: x86 - configuration: Debug - -# build cache to preserve files/folders between builds -cache: - - packages -> **\packages.config # preserve "packages" directory in the root of build folder but will reset it if packages.config is modified - - projectA\libs - - node_modules # local npm modules - - '%LocalAppData%\NuGet\Cache' # NuGet < v3 - - '%LocalAppData%\NuGet\v3-cache' # NuGet v3 - -# enable service required for build/tests -services: - - mssql2014 # start SQL Server 2014 Express - - mssql2014rs # start SQL Server 2014 Express and Reporting Services - - mssql2012sp1 # start SQL Server 2012 SP1 Express - - mssql2012sp1rs # start SQL Server 2012 SP1 Express and Reporting Services - - mssql2008r2sp2 # start SQL Server 2008 R2 SP2 Express - - mssql2008r2sp2rs # start SQL Server 2008 R2 SP2 Express and Reporting Services - - mysql # start MySQL 5.6 service - - postgresql # start PostgreSQL 9.5 service - - iis # start IIS - - msmq # start Queuing services - - mongodb # start MongoDB - -# scripts that run after cloning repository -install: - # by default, all script lines are interpreted as batch - - echo This is batch - # to run script as a PowerShell command prepend it with ps: - - ps: Write-Host 'This is PowerShell' - # batch commands start from cmd: - - cmd: echo This is batch again - - cmd: set MY_VAR=12345 - -# enable patching of AssemblyInfo.* files -assembly_info: - patch: true - file: AssemblyInfo.* - assembly_version: "2.2.{build}" - assembly_file_version: "{version}" - assembly_informational_version: "{version}" - - -# Automatically register private account and/or project AppVeyor NuGet feeds. -nuget: - account_feed: true - project_feed: true - disable_publish_on_pr: true # disable publishing of .nupkg artifacts to account/project feeds for pull request builds - publish_wap_octopus: true # disable publishing of Octopus Deploy .nupkg artifacts to account/project feeds - -#---------------------------------# -# build configuration # -#---------------------------------# - -# build platform, i.e. x86, x64, Any CPU. This setting is optional. -platform: Any CPU - -# to add several platforms to build matrix: -#platform: -# - x86 -# - Any CPU - -# build Configuration, i.e. Debug, Release, etc. -configuration: Release - -# to add several configurations to build matrix: -#configuration: -# - Debug -# - Release - -# Build settings, not to be confused with "before_build" and "after_build". -# "project" is relative to the original build directory and not influenced by directory changes in "before_build". -build: - parallel: true # enable MSBuild parallel builds - project: MyTestAzureCS.sln # path to Visual Studio solution or project - publish_wap: true # package Web Application Projects (WAP) for Web Deploy - publish_wap_xcopy: true # package Web Application Projects (WAP) for XCopy deployment - publish_wap_beanstalk: true # Package Web Applications for AWS Elastic Beanstalk deployment - publish_wap_octopus: true # Package Web Applications for Octopus deployment - publish_azure_webjob: true # Package Azure WebJobs for Zip Push deployment - publish_azure: true # package Azure Cloud Service projects and push to artifacts - publish_aspnet_core: true # Package ASP.NET Core projects - publish_core_console: true # Package .NET Core console projects - publish_nuget: true # package projects with .nuspec files and push to artifacts - publish_nuget_symbols: true # generate and publish NuGet symbol packages - include_nuget_references: true # add -IncludeReferencedProjects option while packaging NuGet artifacts - - # MSBuild verbosity level - verbosity: quiet|minimal|normal|detailed - - -# scripts to run before build -before_build: - -# to run your custom scripts instead of automatic MSBuild -build_script: - -# scripts to run after build (working directory and environment changes are persisted from the previous steps) -after_build: - -# scripts to run *after* solution is built and *before* automatic packaging occurs (web apps, NuGet packages, Azure Cloud Services) -before_package: - -# to disable automatic builds -#build: off - -#---------------------------------# -# tests configuration # -#---------------------------------# - -# to run tests against only selected assemblies and/or categories -test: - assemblies: - only: - - asm1.dll - - asm2.dll - - categories: - only: - - UI - - E2E - -# to run tests against all except selected assemblies and/or categories -#test: -# assemblies: -# except: -# - asm1.dll -# - asm2.dll -# -# categories: -# except: -# - UI -# - E2E - -# to run tests from different categories as separate jobs in parallel -#test: -# categories: -# - A # A category common for all jobs -# - [UI] # 1st job -# - [DAL, BL] # 2nd job - -# scripts to run before tests (working directory and environment changes are persisted from the previous steps such as "before_build") -before_test: - - echo script1 - - ps: Write-Host "script1" - -# to run your custom scripts instead of automatic tests -test_script: - - echo This is my custom test script - -# scripts to run after tests -after_test: - -# to disable automatic tests -#test: off - - -#---------------------------------# -# artifacts configuration # -#---------------------------------# - -artifacts: - - # pushing a single file - - path: test.zip - - # pushing a single file with environment variable in path and "Deployment name" specified - - path: MyProject\bin\$(configuration) - name: myapp - - # pushing entire folder as a zip archive - - path: logs - - # pushing all *.nupkg files in build directory recursively - - path: '**\*.nupkg' - - -#---------------------------------# -# deployment configuration # -#---------------------------------# - -# providers: Local, FTP, WebDeploy, AzureCS, AzureBlob, S3, NuGet, Environment -# provider names are case-sensitive! -deploy: - - # FTP deployment provider settings - - provider: FTP - protocol: ftp|ftps|sftp - host: ftp.myserver.com - username: admin - password: - secure: eYKZKFkkEvFYWX6NfjZIVw== - folder: - application: - active_mode: false - beta: true # enable alternative FTP library for 'ftp' and 'ftps' modes - debug: true # show complete FTP log - - # Amazon S3 deployment provider settings - - provider: S3 - access_key_id: - secure: ABcd== - secret_access_key: - secure: ABcd== - bucket: my_bucket - folder: - artifact: - set_public: false - - # Azure Blob storage deployment provider settings - - provider: AzureBlob - storage_account_name: - secure: ABcd== - storage_access_key: - secure: ABcd== - container: my_container - folder: - artifact: - - # Web Deploy deployment provider settings - - provider: WebDeploy - server: http://www.deploy.com/myendpoint - website: mywebsite - username: user - password: - secure: eYKZKFkkEvFYWX6NfjZIVw== - ntlm: false - remove_files: false - app_offline: false - do_not_use_checksum: true # do not use check sum for comparing source and destination files. By default checksums are used. - sync_retry_attempts: 2 # sync attempts, max - sync_retry_interval: 2000 # timeout between sync attempts, milliseconds - aspnet_core: true # artifact zip contains ASP.NET Core application - aspnet_core_force_restart: true # poke app's web.config before deploy to force application restart - skip_dirs: \\App_Data - skip_files: web.config - on: - branch: release - platform: x86 - configuration: debug - - # Deploying to Azure Cloud Service - - provider: AzureCS - subscription_id: - secure: fjZIVw== - subscription_certificate: - secure: eYKZKFkkEv...FYWX6NfjZIVw== - storage_account_name: my_storage - storage_access_key: - secure: ABcd== - service: my_service - slot: Production - target_profile: Cloud - artifact: MyPackage.cspkg - - # Deploying to NuGet feed - - provider: NuGet - server: https://my.nuget.server/feed - api_key: - secure: FYWX6NfjZIVw== - skip_symbols: false - symbol_server: https://your.symbol.server/feed - artifact: MyPackage.nupkg - - # Deploy to GitHub Releases - - provider: GitHub - artifact: /.*\.nupkg/ # upload all NuGet packages to release assets - draft: false - prerelease: false - on: - branch: master # release from master branch only - APPVEYOR_REPO_TAG: true # deploy on tag push only - - # Deploying to a named environment - - provider: Environment - name: staging - on: - branch: staging - env_var1: value1 - env_var2: value2 - -# scripts to run before deployment -before_deploy: - -# scripts to run after deployment -after_deploy: - -# to run your custom scripts instead of provider deployments -deploy_script: - -# to disable deployment -#deploy: off - -#---------------------------------# -# global handlers # -#---------------------------------# - -# on successful build -on_success: - - do something - -# on build failure -on_failure: - - do something - -# after build failure or success -on_finish: - - do something - - -#---------------------------------# -# notifications # -#---------------------------------# - -notifications: - - # Email - - provider: Email - to: - - user1@email.com - - user2@email.com - subject: 'Build {{status}}' # optional - message: "{{message}}, {{commitId}}, ..." # optional - on_build_status_changed: true - - # HipChat - - provider: HipChat - auth_token: - secure: RbOnSMSFKYzxzFRrxM1+XA== - room: ProjectA - template: "{message}, {commitId}, ..." - - # Slack - - provider: Slack - incoming_webhook: http://incoming-webhook-url - - # ...or using auth token - - - provider: Slack - auth_token: - secure: kBl9BlxvRMr9liHmnBs14A== - channel: development - template: "{message}, {commitId}, ..." - - # Campfire - - provider: Campfire - account: appveyor - auth_token: - secure: RifLRG8Vfyol+sNhj9u2JA== - room: ProjectA - template: "{message}, {commitId}, ..." - - # Webhook - - provider: Webhook - url: http://www.myhook2.com - headers: - User-Agent: myapp 1.0 - Authorization: - secure: GhD+5xhLz/tkYY6AO3fcfQ== - on_build_success: false - on_build_failure: true - on_build_status_changed: true diff --git a/shadowsocks-csharp/CommandLineOption.cs b/shadowsocks-csharp/CommandLineOption.cs index 1ab23ec44..35d8e1d04 100644 --- a/shadowsocks-csharp/CommandLineOption.cs +++ b/shadowsocks-csharp/CommandLineOption.cs @@ -1,10 +1,10 @@ -using CommandLine; +using CommandLine; namespace Shadowsocks { public class CommandLineOption { - [Option("open-url",Required = false,HelpText = "Add an ss:// URL")] + [Option("open-url", Required = false, HelpText = "Add an ss:// URL")] public string OpenUrl { get; set; } } } \ No newline at end of file diff --git a/shadowsocks-csharp/Controller/FileManager.cs b/shadowsocks-csharp/Controller/FileManager.cs index f207cbfe5..59ea05489 100755 --- a/shadowsocks-csharp/Controller/FileManager.cs +++ b/shadowsocks-csharp/Controller/FileManager.cs @@ -1,8 +1,8 @@ -using NLog; using System; using System.IO; using System.IO.Compression; using System.Text; +using NLog; namespace Shadowsocks.Controller { diff --git a/shadowsocks-csharp/Controller/HotkeyReg.cs b/shadowsocks-csharp/Controller/HotkeyReg.cs index 25b1dd933..adce14828 100644 --- a/shadowsocks-csharp/Controller/HotkeyReg.cs +++ b/shadowsocks-csharp/Controller/HotkeyReg.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; +using System; using System.Windows.Forms; using NLog; using Shadowsocks.Controller.Hotkeys; -using Shadowsocks.Model; namespace Shadowsocks.Controller { diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index 5111a7771..f34dc7b7d 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -1,12 +1,12 @@ -using Microsoft.VisualBasic.FileIO; -using NLog; -using Shadowsocks.Properties; -using Shadowsocks.Util; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Text; using System.Windows.Forms; +using Microsoft.VisualBasic.FileIO; +using NLog; +using Shadowsocks.Properties; +using Shadowsocks.Util; namespace Shadowsocks.Controller { @@ -63,8 +63,8 @@ private static void Init(string res, string locale) while (!csvParser.EndOfData) { string[] translations = csvParser.ReadFields(); - string source = translations[enIndex]; - string translation = translations[targetIndex]; + string source = translations[enIndex].Trim(); + string translation = translations[targetIndex].Trim(); // source string or translation empty if (string.IsNullOrWhiteSpace(source) || string.IsNullOrWhiteSpace(translation)) continue; diff --git a/shadowsocks-csharp/Controller/LoggerExtension.cs b/shadowsocks-csharp/Controller/LoggerExtension.cs index bd9b59252..bd524ef15 100644 --- a/shadowsocks-csharp/Controller/LoggerExtension.cs +++ b/shadowsocks-csharp/Controller/LoggerExtension.cs @@ -1,11 +1,8 @@ -using System; +using System; using System.ComponentModel; -using System.IO; -using System.Net.Sockets; using System.Net; -using System.Diagnostics; +using System.Net.Sockets; using System.Text; -using Shadowsocks.Util.SystemProxy; namespace NLog { @@ -84,31 +81,14 @@ public static void LogUsefulException(this Logger logger, Exception e) else if (e is ObjectDisposedException) { } - else if (e is Win32Exception) - { - var ex = (Win32Exception)e; - - // Win32Exception (0x80004005): A 32 bit processes cannot access modules of a 64 bit process. - if ((uint)ex.ErrorCode != 0x80004005) - { - logger.Warn(e); - } - } - else if (e is ProxyException) + else if (e is Win32Exception ex) { - var ex = (ProxyException)e; - switch (ex.Type) - { - case ProxyExceptionType.FailToRun: - case ProxyExceptionType.QueryReturnMalformed: - case ProxyExceptionType.SysproxyExitError: - logger.Error($"sysproxy - {ex.Type.ToString()}:{ex.Message}"); - break; - case ProxyExceptionType.QueryReturnEmpty: - case ProxyExceptionType.Unspecific: - logger.Error($"sysproxy - {ex.Type.ToString()}"); - break; - } + // Never suppress Win32Exception by HRESULT. Win32Exception.ErrorCode can be + // the generic E_FAIL (0x80004005) for unrelated native failures, which used + // to hide real errors such as failed WinINet proxy updates. + logger.Warn( + e, + $"Win32 API failure (NativeErrorCode={ex.NativeErrorCode}, HRESULT=0x{unchecked((uint)ex.ErrorCode):X8})."); } else { diff --git a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs index 181605dc9..923818776 100644 --- a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs +++ b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs @@ -1,17 +1,14 @@ -using NLog; -using Shadowsocks.Properties; -using Shadowsocks.Util; using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Security.Cryptography; using System.Text; -using Newtonsoft.Json; -using Shadowsocks.Model; -using System.Net; -using System.Net.Http; using System.Threading.Tasks; -using System.Security.Cryptography; +using Newtonsoft.Json; +using NLog; +using Shadowsocks.Properties; +using Shadowsocks.Util; namespace Shadowsocks.Controller { @@ -211,7 +208,7 @@ private static bool SeparateAttributeFromGroupName(string group, out string grou groupName = ""; attribute = ""; return false; - } + } return true; } diff --git a/shadowsocks-csharp/Controller/Service/Listener.cs b/shadowsocks-csharp/Controller/Service/Listener.cs index f7794a995..3d7cb3afc 100644 --- a/shadowsocks-csharp/Controller/Service/Listener.cs +++ b/shadowsocks-csharp/Controller/Service/Listener.cs @@ -1,242 +1,257 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Net.NetworkInformation; -using System.Net.Sockets; -using NLog; -using Shadowsocks.Model; - -namespace Shadowsocks.Controller -{ - public class Listener - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - public interface IService - { - bool Handle(byte[] firstPacket, int length, Socket socket, object state); - - void Stop(); - } - - public abstract class Service : IService - { - public abstract bool Handle(byte[] firstPacket, int length, Socket socket, object state); - - public virtual void Stop() { } - } - - public class UDPState - { - public UDPState(Socket s) - { - socket = s; - remoteEndPoint = new IPEndPoint(s.AddressFamily == AddressFamily.InterNetworkV6 ? IPAddress.IPv6Any : IPAddress.Any, 0); - } - public Socket socket; - public byte[] buffer = new byte[4096]; - public EndPoint remoteEndPoint; - } - - Configuration _config; - bool _shareOverLAN; - Socket _tcpSocket; - Socket _udpSocket; - List _services; - - public Listener(List services) - { - this._services = services; - } - - private bool CheckIfPortInUse(int port) - { - IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); - return ipProperties.GetActiveTcpListeners().Any(endPoint => endPoint.Port == port); - } - - public void Start(Configuration config) - { - this._config = config; - this._shareOverLAN = config.shareOverLan; - - if (CheckIfPortInUse(_config.localPort)) - throw new Exception(I18N.GetString("Port {0} already in use", _config.localPort)); - - try - { - // Create a TCP/IP socket. - _tcpSocket = new Socket(config.isIPv6Enabled ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - _udpSocket = new Socket(config.isIPv6Enabled ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - _tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - _udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - IPEndPoint localEndPoint = null; - localEndPoint = _shareOverLAN - ? new IPEndPoint(config.isIPv6Enabled ? IPAddress.IPv6Any : IPAddress.Any, _config.localPort) - : new IPEndPoint(config.isIPv6Enabled ? IPAddress.IPv6Loopback : IPAddress.Loopback, _config.localPort); - - // Bind the socket to the local endpoint and listen for incoming connections. - _tcpSocket.Bind(localEndPoint); - _udpSocket.Bind(localEndPoint); - _tcpSocket.Listen(1024); - - // Start an asynchronous socket to listen for connections. - logger.Info($"Shadowsocks started ({UpdateChecker.Version})"); - logger.Debug(Encryption.EncryptorFactory.DumpRegisteredEncryptor()); - _tcpSocket.BeginAccept(new AsyncCallback(AcceptCallback), _tcpSocket); - UDPState udpState = new UDPState(_udpSocket); - _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); - } - catch (SocketException) - { - _tcpSocket.Close(); - throw; - } - } - - public void Stop() - { - Socket tcpSocket = _tcpSocket; - _tcpSocket = null; - tcpSocket?.Close(); - - Socket udpSocket = _udpSocket; - _udpSocket = null; - udpSocket?.Close(); - - _services.ForEach(s => s.Stop()); - } - - public void RecvFromCallback(IAsyncResult ar) - { - UDPState state = (UDPState)ar.AsyncState; - var socket = state.socket; - try - { - int bytesRead = socket.EndReceiveFrom(ar, ref state.remoteEndPoint); - foreach (IService service in _services) - { - if (service.Handle(state.buffer, bytesRead, socket, state)) - { - break; - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using NLog; +using Shadowsocks.Model; + +namespace Shadowsocks.Controller +{ + public class Listener + { + private static Logger logger = LogManager.GetCurrentClassLogger(); + + public interface IService + { + bool Handle(byte[] firstPacket, int length, Socket socket, object state); + + void Stop(); + } + + public abstract class Service : IService + { + public abstract bool Handle(byte[] firstPacket, int length, Socket socket, object state); + + public virtual void Stop() { } + } + + public class UDPState + { + public UDPState(Socket s) + { + socket = s; + remoteEndPoint = new IPEndPoint(s.AddressFamily == AddressFamily.InterNetworkV6 ? IPAddress.IPv6Any : IPAddress.Any, 0); + } + public Socket socket; + public byte[] buffer = new byte[4096]; + public EndPoint remoteEndPoint; + } + + Configuration _config; + bool _shareOverLAN; + Socket _tcpSocket; + Socket _udpSocket; + List _services; + + public Listener(List services) + { + this._services = services; + } + + private bool CheckIfPortInUse(int port) + { + IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + return ipProperties.GetActiveTcpListeners().Any(endPoint => endPoint.Port == port); + } + + public void Start(Configuration config) + { + this._config = config; + this._shareOverLAN = config.shareOverLan; + + if (CheckIfPortInUse(_config.localPort)) + throw new Exception(I18N.GetString("Port {0} already in use", _config.localPort)); + + try + { + // Create a TCP/IP socket. + _tcpSocket = new Socket(config.isIPv6Enabled ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + _udpSocket = new Socket(config.isIPv6Enabled ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + _tcpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + _udpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + IPEndPoint localEndPoint = null; + localEndPoint = _shareOverLAN + ? new IPEndPoint(config.isIPv6Enabled ? IPAddress.IPv6Any : IPAddress.Any, _config.localPort) + : new IPEndPoint(config.isIPv6Enabled ? IPAddress.IPv6Loopback : IPAddress.Loopback, _config.localPort); + + // Bind the socket to the local endpoint and listen for incoming connections. + _tcpSocket.Bind(localEndPoint); + _udpSocket.Bind(localEndPoint); + _tcpSocket.Listen(1024); + + // Start an asynchronous socket to listen for connections. + logger.Info($"Shadowsocks started ({UpdateChecker.Version})"); + logger.Debug(Encryption.EncryptorFactory.DumpRegisteredEncryptor()); + _tcpSocket.BeginAccept(new AsyncCallback(AcceptCallback), _tcpSocket); + UDPState udpState = new UDPState(_udpSocket); + _udpSocket.BeginReceiveFrom(udpState.buffer, 0, udpState.buffer.Length, 0, ref udpState.remoteEndPoint, new AsyncCallback(RecvFromCallback), udpState); + } + catch (SocketException) + { + _tcpSocket.Close(); + throw; + } + } + + public void Stop() + { + Socket tcpSocket = _tcpSocket; + _tcpSocket = null; + tcpSocket?.Close(); + + Socket udpSocket = _udpSocket; + _udpSocket = null; + udpSocket?.Close(); + + _services.ForEach(s => s.Stop()); + } + + public void RecvFromCallback(IAsyncResult ar) + { + UDPState state = (UDPState)ar.AsyncState; + var socket = state.socket; + try + { + int bytesRead = socket.EndReceiveFrom(ar, ref state.remoteEndPoint); + foreach (IService service in _services) + { + if (service.Handle(state.buffer, bytesRead, socket, state)) + { + break; + } + } + } + catch (ObjectDisposedException) + { + // Expected when the UDP listener is stopped. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // .NET 7+ reports cancellation of a pending BeginReceiveFrom as OperationAborted. + } + catch (Exception ex) + { + logger.Debug(ex); + } + finally + { + // Do not re-arm a callback belonging to a UDP socket that has been + // stopped or replaced during a controller restart. + if (ReferenceEquals(socket, _udpSocket)) + { + try + { + socket.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, 0, ref state.remoteEndPoint, new AsyncCallback(RecvFromCallback), state); + } + catch (ObjectDisposedException) + { + // Expected during shutdown. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // Expected during shutdown on .NET 7+. + } + catch (Exception ex) + { + logger.Debug(ex); + } + } + } + } + + public void AcceptCallback(IAsyncResult ar) + { + Socket listener = (Socket)ar.AsyncState; + try + { + Socket conn = listener.EndAccept(ar); + + byte[] buf = new byte[4096]; + object[] state = new object[] { + conn, + buf + }; + + conn.BeginReceive(buf, 0, buf.Length, 0, + new AsyncCallback(ReceiveCallback), state); + } + catch (ObjectDisposedException) + { + // Expected when the listener is stopped on .NET Framework / .NET 5-6. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // .NET 7+ reports cancellation of a pending BeginAccept as OperationAborted. + } + catch (Exception e) + { + logger.LogUsefulException(e); + } + finally + { + // Do not re-arm a callback belonging to a listener that has been stopped + // or replaced during a controller restart. + if (ReferenceEquals(listener, _tcpSocket)) + { + try + { + listener.BeginAccept( + new AsyncCallback(AcceptCallback), + listener); + } + catch (ObjectDisposedException) + { + // Expected during shutdown. + } + catch (SocketException e) when (IsExpectedSocketShutdown(e)) + { + // Expected during shutdown on .NET 7+. + } + catch (Exception e) + { + logger.LogUsefulException(e); + } + } + } + } + + private static bool IsExpectedSocketShutdown(SocketException exception) + { + return exception.SocketErrorCode == SocketError.OperationAborted + || exception.SocketErrorCode == SocketError.Interrupted; + } + + private void ReceiveCallback(IAsyncResult ar) + { + object[] state = (object[])ar.AsyncState; + + Socket conn = (Socket)state[0]; + byte[] buf = (byte[])state[1]; + try + { + int bytesRead = conn.EndReceive(ar); + if (bytesRead <= 0) goto Shutdown; + foreach (IService service in _services) + { + if (service.Handle(buf, bytesRead, conn, null)) + { + return; + } } - } - catch (ObjectDisposedException) - { - } - catch (Exception ex) - { - logger.Debug(ex); - } - finally - { - try - { - socket.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, 0, ref state.remoteEndPoint, new AsyncCallback(RecvFromCallback), state); - } - catch (ObjectDisposedException) - { - // do nothing - } - catch (Exception) - { - } - } - } - - public void AcceptCallback(IAsyncResult ar) - { - Socket listener = (Socket)ar.AsyncState; - try - { - Socket conn = listener.EndAccept(ar); - - byte[] buf = new byte[4096]; - object[] state = new object[] { - conn, - buf - }; - - conn.BeginReceive(buf, 0, buf.Length, 0, - new AsyncCallback(ReceiveCallback), state); - } - catch (ObjectDisposedException) - { - // Expected when the listener is stopped on .NET Framework / .NET 5-6. - } - catch (SocketException e) when (IsExpectedSocketShutdown(e)) - { - // .NET 7+ reports cancellation of a pending BeginAccept as OperationAborted. - } - catch (Exception e) - { - logger.LogUsefulException(e); - } - finally - { - // Do not re-arm a callback belonging to a listener that has been stopped - // or replaced during a controller restart. - if (ReferenceEquals(listener, _tcpSocket)) - { - try - { - listener.BeginAccept( - new AsyncCallback(AcceptCallback), - listener); - } - catch (ObjectDisposedException) - { - // Expected during shutdown. - } - catch (SocketException e) when (IsExpectedSocketShutdown(e)) - { - // Expected during shutdown on .NET 7+. - } - catch (Exception e) - { - logger.LogUsefulException(e); - } - } - } - } - - private static bool IsExpectedSocketShutdown(SocketException exception) - { - return exception.SocketErrorCode == SocketError.OperationAborted - || exception.SocketErrorCode == SocketError.Interrupted; - } - - private void ReceiveCallback(IAsyncResult ar) - { - object[] state = (object[])ar.AsyncState; - - Socket conn = (Socket)state[0]; - byte[] buf = (byte[])state[1]; - try - { - int bytesRead = conn.EndReceive(ar); - if (bytesRead <= 0) goto Shutdown; - foreach (IService service in _services) - { - if (service.Handle(buf, bytesRead, conn, null)) - { - return; - } - } - Shutdown: - // no service found for this - if (conn.ProtocolType == ProtocolType.Tcp) - { - conn.Close(); - } - } - catch (Exception e) - { - logger.LogUsefulException(e); - conn.Close(); - } - } - } -} + Shutdown: + // no service found for this + if (conn.ProtocolType == ProtocolType.Tcp) + { + conn.Close(); + } + } + catch (Exception e) + { + logger.LogUsefulException(e); + conn.Close(); + } + } + } +} diff --git a/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs b/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs index 31059b73e..f2a798051 100644 --- a/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs +++ b/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs @@ -1,8 +1,6 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; -using System.Net; -using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json.Linq; using Shadowsocks.Model; diff --git a/shadowsocks-csharp/Controller/Service/PACDaemon.cs b/shadowsocks-csharp/Controller/Service/PACDaemon.cs index 217f0fda9..26fd2afb9 100644 --- a/shadowsocks-csharp/Controller/Service/PACDaemon.cs +++ b/shadowsocks-csharp/Controller/Service/PACDaemon.cs @@ -1,13 +1,10 @@ -using NLog; -using Shadowsocks.Model; -using Shadowsocks.Properties; -using Shadowsocks.Util; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Threading.Tasks; +using NLog; +using Shadowsocks.Model; +using Shadowsocks.Properties; namespace Shadowsocks.Controller { diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index aa81fe241..d171f6702 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -1,11 +1,10 @@ -using Shadowsocks.Encryption; -using Shadowsocks.Model; -using Shadowsocks.Util; using System; using System.Net; using System.Net.Sockets; using System.Text; using NLog; +using Shadowsocks.Encryption; +using Shadowsocks.Model; namespace Shadowsocks.Controller { @@ -161,7 +160,7 @@ public void SendResponse(Socket socket, bool useSocks) $@"HTTP/1.1 200 OK Server: ShadowsocksWindows/{UpdateChecker.Version} Content-Type: application/x-ns-proxy-autoconfig -Content-Length: { Encoding.UTF8.GetBytes(pacContent).Length} +Content-Length: {Encoding.UTF8.GetBytes(pacContent).Length} Connection: Close "; diff --git a/shadowsocks-csharp/Controller/Service/PortForwarder.cs b/shadowsocks-csharp/Controller/Service/PortForwarder.cs index 8284fd11d..3f74cdd8e 100644 --- a/shadowsocks-csharp/Controller/Service/PortForwarder.cs +++ b/shadowsocks-csharp/Controller/Service/PortForwarder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Net; using System.Net.Sockets; using NLog; @@ -9,6 +10,9 @@ namespace Shadowsocks.Controller class PortForwarder : Listener.Service { private readonly int _targetPort; + private readonly object _handlersLock = new(); + private readonly HashSet _handlers = []; + private bool _stopping; public PortForwarder(int targetPort) { @@ -21,19 +25,57 @@ public override bool Handle(byte[] firstPacket, int length, Socket socket, objec { return false; } - new Handler().Start(firstPacket, length, socket, _targetPort); + + Handler handler; + lock (_handlersLock) + { + if (_stopping) + { + socket.Close(); + return true; + } + + handler = new Handler(RemoveHandler); + _handlers.Add(handler); + } + + handler.Start(firstPacket, length, socket, _targetPort); return true; } + public override void Stop() + { + Handler[] handlers; + lock (_handlersLock) + { + _stopping = true; + handlers = [.. _handlers]; + } + + foreach (Handler handler in handlers) + { + handler.Close(); + } + } + + private void RemoveHandler(Handler handler) + { + lock (_handlersLock) + { + _handlers.Remove(handler); + } + } + private class Handler { - private static Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + private readonly Action _onClosed; private byte[] _firstPacket; private int _firstPacketLength; private Socket _local; private WrappedSocket _remote; - private bool _closed = false; + private volatile bool _closed; private bool _localShutdown = false; private bool _remoteShutdown = false; private const int RecvSize = 2048; @@ -45,23 +87,41 @@ private class Handler // instance-based lock private readonly object _Lock = new object(); + public Handler(Action onClosed) + { + _onClosed = onClosed; + } + public void Start(byte[] firstPacket, int length, Socket socket, int targetPort) { - _firstPacket = firstPacket; - _firstPacketLength = length; - _local = socket; + lock (_Lock) + { + if (_closed) + { + socket.Close(); + return; + } + + _firstPacket = firstPacket; + _firstPacketLength = length; + _local = socket; + _remote = new WrappedSocket(); + } + try { // Local Port Forward use IP as is EndPoint remoteEP = SocketUtil.GetEndPoint(_local.AddressFamily == AddressFamily.InterNetworkV6 ? "[::1]" : "127.0.0.1", targetPort); // Connect to the remote endpoint. - _remote = new WrappedSocket(); _remote.BeginConnect(remoteEP, ConnectCallback, null); } catch (Exception e) { - logger.LogUsefulException(e); + if (!_closed) + { + logger.LogUsefulException(e); + } Close(); } } @@ -80,7 +140,10 @@ private void ConnectCallback(IAsyncResult ar) } catch (Exception e) { - logger.LogUsefulException(e); + if (!_closed) + { + logger.LogUsefulException(e); + } Close(); } } @@ -238,11 +301,15 @@ public void Close() try { _local.Shutdown(SocketShutdown.Both); - _local.Close(); } - catch (Exception e) + catch (SocketException) { - logger.LogUsefulException(e); + // Expected if the peer already closed while the forwarder is stopping. + } + finally + { + _local.Close(); + _local = null; } } if (_remote != null) @@ -250,13 +317,19 @@ public void Close() try { _remote.Shutdown(SocketShutdown.Both); - _remote.Dispose(); } - catch (SocketException e) + catch (SocketException) { - logger.LogUsefulException(e); + // Expected if the peer already closed while the forwarder is stopping. + } + finally + { + _remote.Dispose(); + _remote = null; } } + + _onClosed(this); } } } diff --git a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs index 229cec3ac..53453c0be 100644 --- a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs +++ b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs @@ -1,11 +1,11 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; -using System.Windows.Forms; +using System.Threading; using NLog; using Shadowsocks.Model; using Shadowsocks.Properties; @@ -17,6 +17,7 @@ namespace Shadowsocks.Controller class PrivoxyRunner { private static Logger logger = LogManager.GetCurrentClassLogger(); + private const int ErrorPartialCopy = 299; private static int _uid; private static string _uniqueConfigFile; @@ -82,7 +83,45 @@ public void Start(Configuration configuration) * when ss exit unexpectedly, this process will be forced killed by system. */ _privoxyJob.AddProcess(_process.Handle); + + try + { + WaitUntilReady(configuration.isIPv6Enabled); + } + catch + { + Stop(); + throw; + } + } + } + + private void WaitUntilReady(bool isIPv6Enabled) + { + IPAddress address = isIPv6Enabled ? IPAddress.IPv6Loopback : IPAddress.Loopback; + AddressFamily addressFamily = isIPv6Enabled ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork; + const int attempts = 100; + + for (int attempt = 0; attempt < attempts; attempt++) + { + if (_process.HasExited) + { + throw new InvalidOperationException($"Privoxy exited during startup with code {_process.ExitCode}."); + } + + using TcpClient probe = new(addressFamily); + try + { + probe.Connect(address, _runningPort); + return; + } + catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionRefused) + { + Thread.Sleep(20); + } } + + throw new TimeoutException($"Privoxy did not start listening on {address}:{_runningPort} within 2 seconds."); } public void Stop() @@ -135,12 +174,19 @@ private static bool IsChildProcess(Process process) return Utils.GetTempPath("ss_privoxy.exe").Equals(path); } + catch (System.ComponentModel.Win32Exception ex) when (ex.NativeErrorCode == ErrorPartialCopy) + { + // ERROR_PARTIAL_COPY: an x86 process cannot inspect modules of a 64-bit + // process. This is expected only while probing whether an existing process + // belongs to this Shadowsocks instance, so suppress it here rather than + // globally suppressing unrelated Win32Exception instances. + return false; + } catch (Exception ex) { /* * Sometimes Process.GetProcessesByName will return some processes that * are already dead, and that will cause exceptions here. - * We could simply ignore those exceptions. */ logger.LogUsefulException(ex); return false; diff --git a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs index 257568983..91d2cd598 100644 --- a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs +++ b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Specialized; using System.Diagnostics; using System.IO; @@ -123,7 +123,7 @@ public string ExpandEnvironmentVariables(string name, StringDictionary environme // Expand the environment variables from the new process itself if (environmentVariables != null) { - foreach(string key in environmentVariables.Keys) + foreach (string key in environmentVariables.Keys) { name = name.Replace($"%{key}%", environmentVariables[key]); } diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index be57427b1..35359f265 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; +using System; using System.Diagnostics; using System.IO; -using System.Net; using System.Net.Http; -using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using Newtonsoft.Json.Linq; diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 1025b073d..69d31232a 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; @@ -6,16 +6,13 @@ using System.Net; using System.Net.Http; using System.Net.Sockets; -using System.Text; using System.Threading; using System.Threading.Tasks; -using System.Web; using System.Windows.Forms; using NLog; using Shadowsocks.Controller.Service; using Shadowsocks.Controller.Strategy; using Shadowsocks.Model; -using Shadowsocks.Util; using WPFLocalizeExtension.Engine; namespace Shadowsocks.Controller @@ -251,8 +248,10 @@ protected void Reload() ReportError(e); } - ConfigChanged?.Invoke(this, new EventArgs()); + // Apply the Windows proxy first, then notify the UI. The menu must represent + // the effective WinINet state rather than only the persisted desired mode. UpdateSystemProxy(); + ConfigChanged?.Invoke(this, new EventArgs()); } protected void SaveConfig(Configuration newConfig) @@ -269,6 +268,7 @@ protected void ReportError(Exception e) public HttpClient GetHttpClient() => httpClient; public Server GetCurrentServer() => _config.GetCurrentServer(); public Configuration GetCurrentConfiguration() => _config; + internal SystemProxyMode GetSystemProxyMode() => SystemProxy.GetCurrentMode(_config, _pacServer); public Server GetAServer(IStrategyCallerType type, IPEndPoint localIPEndPoint, EndPoint destEndPoint) { @@ -506,7 +506,6 @@ public void SaveSkippedUpdateVerion(string version) public void SaveLogViewerConfig(LogViewerConfig newConfig) { _config.logViewer = newConfig; - newConfig.SaveSize(); Configuration.Save(_config); ConfigChanged?.Invoke(this, new EventArgs()); diff --git a/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs b/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs index 82e30eb8b..9637ab820 100644 --- a/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs @@ -1,9 +1,6 @@ -using Shadowsocks.Controller; -using Shadowsocks.Model; using System; -using System.Collections.Generic; using System.Net; -using System.Text; +using Shadowsocks.Model; namespace Shadowsocks.Controller.Strategy { diff --git a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs index d19ea24af..a2db09748 100644 --- a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs @@ -1,9 +1,8 @@ -using NLog; -using Shadowsocks.Model; using System; using System.Collections.Generic; using System.Net; -using System.Text; +using NLog; +using Shadowsocks.Model; namespace Shadowsocks.Controller.Strategy { @@ -112,7 +111,7 @@ public void ChooseNewServer() // 100 * failure - 2 * latency - 0.5 * (lastread - lastwrite) status.score = 100 * 1000 * Math.Min(5 * 60, (now - status.lastFailure).TotalSeconds) - -2 * 5 * (Math.Min(2000, status.latency.TotalMilliseconds) / (1 + (now - status.lastTimeDetectLatency).TotalSeconds / 30 / 10) + + - 2 * 5 * (Math.Min(2000, status.latency.TotalMilliseconds) / (1 + (now - status.lastTimeDetectLatency).TotalSeconds / 30 / 10) + -0.5 * 200 * Math.Min(5, (status.lastRead - status.lastWrite).TotalSeconds)); logger.Debug(String.Format("server: {0} latency:{1} score: {2}", status.server.ToString(), status.latency, status.score)); } diff --git a/shadowsocks-csharp/Controller/Strategy/IStrategy.cs b/shadowsocks-csharp/Controller/Strategy/IStrategy.cs index 48bd3aca5..1efa5ce43 100644 --- a/shadowsocks-csharp/Controller/Strategy/IStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/IStrategy.cs @@ -1,8 +1,6 @@ -using Shadowsocks.Model; using System; -using System.Collections.Generic; using System.Net; -using System.Text; +using Shadowsocks.Model; namespace Shadowsocks.Controller.Strategy { diff --git a/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs b/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs index be8869da7..80093abaf 100644 --- a/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs +++ b/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs @@ -1,7 +1,4 @@ -using Shadowsocks.Controller; -using System; using System.Collections.Generic; -using System.Text; namespace Shadowsocks.Controller.Strategy { diff --git a/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs b/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs index 08f15836d..8ff6274c0 100644 --- a/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs +++ b/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Reflection; namespace Shadowsocks.Controller.Hotkeys @@ -30,7 +30,7 @@ public static Delegate GetCallback(string methodname) } #region Singleton - + private static HotkeyCallbacks Instance { get; set; } private readonly ShadowsocksController _controller; diff --git a/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs b/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs index a55591ef4..34fcf7c32 100644 --- a/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs +++ b/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; @@ -58,13 +58,13 @@ public static bool UnregExistingHotkey(HotKeys.HotKeyCallBackHandler cb) } } - public static bool IsHotkeyExists( HotKey hotKey ) + public static bool IsHotkeyExists(HotKey hotKey) { if (hotKey == null) throw new ArgumentNullException(nameof(hotKey)); - return _keymap.Any( v => v.Key.Equals( hotKey ) ); + return _keymap.Any(v => v.Key.Equals(hotKey)); } - public static bool IsCallbackExists( HotKeyCallBackHandler cb, out HotKey hotkey) + public static bool IsCallbackExists(HotKeyCallBackHandler cb, out HotKey hotkey) { if (cb == null) throw new ArgumentNullException(nameof(cb)); if (_keymap.Any(v => v.Value == cb)) @@ -81,16 +81,16 @@ public static bool IsCallbackExists( HotKeyCallBackHandler cb, out HotKey hotkey #region Converters - public static string HotKey2Str( HotKey key ) + public static string HotKey2Str(HotKey key) { if (key == null) throw new ArgumentNullException(nameof(key)); - return HotKey2Str( key.Key, key.Modifiers ); + return HotKey2Str(key.Key, key.Modifiers); } - public static string HotKey2Str( Key key, ModifierKeys modifier ) + public static string HotKey2Str(Key key, ModifierKeys modifier) { if (!Enum.IsDefined(typeof(Key), key)) - throw new InvalidEnumArgumentException(nameof(key), (int) key, typeof(Key)); + throw new InvalidEnumArgumentException(nameof(key), (int)key, typeof(Key)); try { ModifierKeysConverter mkc = new ModifierKeysConverter(); @@ -118,8 +118,8 @@ public static HotKey Str2HotKey(string s) KeyConverter kc = new KeyConverter(); ModifierKeysConverter mkc = new ModifierKeysConverter(); - Key key = (Key) kc.ConvertFrom(keyStr.ToUpper()); - ModifierKeys modifier = (ModifierKeys) mkc.ConvertFrom(modifierStr.ToUpper()); + Key key = (Key)kc.ConvertFrom(keyStr.ToUpper()); + ModifierKeys modifier = (ModifierKeys)mkc.ConvertFrom(modifierStr.ToUpper()); return new HotKey(key, modifier); } @@ -167,7 +167,7 @@ private static void Unregister(HotKey key) if (key == null) throw new ArgumentNullException(nameof(key)); _hotKeyManager.Unregister(key); - if(_keymap.ContainsKey(key)) + if (_keymap.ContainsKey(key)) _keymap.Remove(key); } } diff --git a/shadowsocks-csharp/Controller/System/ProtocolHandler.cs b/shadowsocks-csharp/Controller/System/ProtocolHandler.cs index c04d18556..95f1750cd 100644 --- a/shadowsocks-csharp/Controller/System/ProtocolHandler.cs +++ b/shadowsocks-csharp/Controller/System/ProtocolHandler.cs @@ -1,11 +1,6 @@ -using Microsoft.Win32; -using NLog; -using Shadowsocks.Util; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Microsoft.Win32; +using NLog; namespace Shadowsocks.Controller { diff --git a/shadowsocks-csharp/Controller/System/SystemProxy.cs b/shadowsocks-csharp/Controller/System/SystemProxy.cs index ee767e128..bd6db750f 100644 --- a/shadowsocks-csharp/Controller/System/SystemProxy.cs +++ b/shadowsocks-csharp/Controller/System/SystemProxy.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Windows.Forms; using NLog; using Shadowsocks.Model; @@ -6,70 +7,113 @@ namespace Shadowsocks.Controller { + internal enum SystemProxyMode + { + Disabled, + Global, + Pac, + } + public static class SystemProxy { - private static Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - private static string GetTimestamp(DateTime value) + internal static SystemProxyMode GetCurrentMode(Configuration config, PACServer pacSrv) { - return value.ToString("yyyyMMddHHmmssfff"); - } + if (!config.enabled || !WinINet.Operational) + { + return SystemProxyMode.Disabled; + } - public static void Update(Configuration config, bool forceDisable, PACServer pacSrv, bool noRetry = false) - { - bool global = config.global; - bool enabled = config.enabled; + try + { + WinINetSetting setting = WinINet.Query(); + if (config.global) + { + string expectedServer = $"localhost:{config.localPort}"; + return setting.Flags.HasFlag(InternetPerConnectionFlags.Proxy) && + string.Equals(setting.ProxyServer, expectedServer, StringComparison.OrdinalIgnoreCase) + ? SystemProxyMode.Global + : SystemProxyMode.Disabled; + } + + string expectedPacUrl = config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl) + ? config.pacUrl + : pacSrv?.PacUrl; - if (forceDisable) + return !string.IsNullOrEmpty(expectedPacUrl) && + setting.Flags.HasFlag(InternetPerConnectionFlags.AutoProxyUrl) && + string.Equals(setting.AutoConfigUrl, expectedPacUrl, StringComparison.OrdinalIgnoreCase) + ? SystemProxyMode.Pac + : SystemProxyMode.Disabled; + } + catch (Win32Exception ex) { - enabled = false; + logger.LogUsefulException(ex); + return SystemProxyMode.Disabled; } + } + + public static void Update(Configuration config, bool forceDisable, PACServer pacSrv, bool noRetry = false) + { + bool enabled = config.enabled && !forceDisable; try { - if (enabled) + if (!WinINet.Operational) { - if (global) - { - Sysproxy.SetIEProxy(true, true, "localhost:" + config.localPort.ToString(), null); - } - else - { - string pacUrl; - if (config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl)) - { - pacUrl = config.pacUrl; - } - else - { + throw new InvalidOperationException("WinINet system proxy integration is unavailable."); + } - pacUrl = pacSrv.PacUrl; - } - Sysproxy.SetIEProxy(true, false, null, pacUrl); - } + if (!enabled) + { + WinINet.Restore(); + return; } - else + + if (config.global) { - Sysproxy.SetIEProxy(false, false, null, null); + WinINet.ProxyGlobal($"localhost:{config.localPort}"); + return; } + + string pacUrl = config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl) + ? config.pacUrl + : pacSrv?.PacUrl ?? throw new InvalidOperationException("PAC server is not initialized."); + + WinINet.ProxyPAC(pacUrl); } - catch (ProxyException ex) + catch (Exception ex) when (ex is Win32Exception or InvalidOperationException) { logger.LogUsefulException(ex); - if (ex.Type != ProxyExceptionType.Unspecific && !noRetry) + if (!noRetry) { - var ret = MessageBox.Show(I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), I18N.GetString("Shadowsocks"), MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (ret == DialogResult.Yes) + DialogResult result = MessageBox.Show( + I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), + I18N.GetString("Shadowsocks"), + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + if (result == DialogResult.Yes) { - Sysproxy.ResetIEProxy(); - Update(config, forceDisable, pacSrv, true); + try + { + WinINet.Reset(); + Update(config, forceDisable, pacSrv, true); + return; + } + catch (Exception retryException) + { + logger.LogUsefulException(retryException); + } } } - else - { - MessageBox.Show(I18N.GetString("Unrecoverable proxy setting error occured, see log for detail"), I18N.GetString("Shadowsocks"), MessageBoxButtons.OK, MessageBoxIcon.Error); - } + + MessageBox.Show( + I18N.GetString("Unrecoverable proxy setting error occured, see log for detail"), + I18N.GetString("Shadowsocks"), + MessageBoxButtons.OK, + MessageBoxIcon.Error); } } } -} \ No newline at end of file +} diff --git a/shadowsocks-csharp/Data/i18n.csv b/shadowsocks-csharp/Data/i18n.csv index fb4e671c0..c994f65dd 100644 --- a/shadowsocks-csharp/Data/i18n.csv +++ b/shadowsocks-csharp/Data/i18n.csv @@ -16,7 +16,8 @@ PAC,Сценарий настройки (PAC),PAC 模式,PAC 模式,PACモード Global,Для всей системы,全局模式,全局模式,グローバルプロキシ,전역,Global Servers,Серверы,服务器,伺服器,サーバー,서버,Serveurs Edit Servers...,Редактировать серверы…,编辑服务器...,編輯伺服器...,サーバーの編集...,서버 수정…,Éditer serveurs… -Online Config...,,在线配置...,線上配置...,,, +... more than {0} (total {1}),... показано {0} из {1},,,,, +Online Config...,Онлайн-конфигурации…,在线配置...,線上配置...,,, Start on Boot,Автозагрузка,开机启动,開機啟動,システム起動時に実行,시스템 시작 시에 시작하기,Démarrage automatique Associate ss:// Links,Ассоциированный ss:// Ссылки,关联 ss:// 链接,關聯 ss:// 鏈接,ss:// リンクの関連付け,ss:// 링크 연결, Forward Proxy...,Прямой прокси…,正向代理设置...,正向 Proxy 設定...,フォワードプロキシの設定...,포워드 프록시,Forward-proxy… @@ -27,7 +28,7 @@ Edit Local PAC File...,Редактировать локальный PAC…,编 Update Local PAC from Geosite,Обновить локальный PAC из Geosite,从 Geosite 更新本地 PAC,從 Geosite 更新本機 PAC,Geosite からローカル PAC を更新,Geosite에서 로컬 프록시 자동 구성 파일 업데이트,Mettre à jour le PAC local à partir de Geosite Edit User Rule for Geosite...,Редактировать свои правила для Geosite,编辑 Geosite 的用户规则...,編輯 Geosite 的使用者規則...,ユーザールールの編集...,Geosite 사용자 수정,Modifier la règle utilisateur pour Geosite ... Secure Local PAC,Безопасный URL локального PAC,保护本地 PAC,安全本機 PAC,ローカル PAC を保護,로컬 프록시 자동 구성 파일 암호화,Sécuriser PAC local -Regenerate local PAC on version update,,版本更新后重新生成本地 PAC,版本更新後重新生成本地 PAC,,, +Regenerate local PAC on version update,Пересоздавать локальный PAC после обновления версии,版本更新后重新生成本地 PAC,版本更新後重新生成本地 PAC,,, Copy Local PAC URL,Копировать URL локального PAC,复制本地 PAC 网址,複製本機 PAC 網址,ローカル PAC URL をコピー,로컬 프록시 자동 구성 파일 URL 복사,Copier l'URL du PAC local Share Server Config...,Поделиться конфигурацией сервера…,分享服务器配置...,分享伺服器設定檔...,サーバーの設定を共有...,서버 설정 공유,Partager la configuration du serveur ... Scan QRCode from Screen...,Сканировать QRCode с экрана…,扫描屏幕上的二维码...,掃描螢幕上的 QR 碼...,画面から QR コードをスキャン...,화면에서 QR코드 스캔,Scanner le QRCode à partir de l'écran ... @@ -63,12 +64,15 @@ Show Password,Показать пароль,显示密码,顯示密碼,パスワ Encryption,Шифрование,加密,加密,暗号化,암호화,Chiffrement Plugin Program,Плагин,插件程序,外掛程式,プラグインプログラム,플러그인 프로그램,Programme de plugin Plugin Options,Опции плагина,插件选项,外掛程式選項,プラグインのオプション,플러그인 설정,Options de plugin +Environment variables for plugin program,Переменные окружения для программы плагина,,,,, Need Plugin Argument,Требуются аргументы,需要命令行参数,,コマンドライン引数を有効にする,플러그인 인자가 필요함,Besoin d'un argument de plugin Plugin Arguments,Аргументы,插件参数,外掛程式參數,プラグインの引数,플러그인 인자,Arguments du plugin +"Plugin arguments are not part of SIP003. They are passed as command-line arguments. Mandatory: %SS_LOCAL_HOST%, %SS_LOCAL_PORT%, %SS_REMOTE_HOST%, %SS_REMOTE_PORT%. Optional: %SS_PLUGIN_OPTIONS%.","Аргументы плагина не входят в стандарт SIP003 и передаются через командную строку. Обязательные: %SS_LOCAL_HOST%, %SS_LOCAL_PORT%, %SS_REMOTE_HOST%, %SS_REMOTE_PORT%. Необязательная: %SS_PLUGIN_OPTIONS%.",,,,, Proxy Port,Порт прокси,代理端口,Proxy 連接埠,プロキシポート,프록시 포트,Port proxy Portable Mode,Переносимый режим,便携模式,便攜模式,ポータブルモード,포터블 모드,Mode portable Restart required,Требуется перезапуск программы,需要重新启动SS,需要重新啟動SS,再起動が必要,재시작이 필요합니다,Redémarrage nécessaire Remarks,Примечания,备注,註解,付記,알림,Remarques +Group,Группа,,,,, Timeout(Sec),Таймаут(сек),超时(秒),逾時 (秒),タイムアウト (秒),시간 초과 (초),Délai d'attente(sec) OK,ОК,确定,確定,OK,확인,OK Cancel,Отмена,取消,取消,キャンセル,취소,Annuler @@ -77,7 +81,7 @@ New server,Новый сервер,未配置的服务器,新伺服器,新規サ Move &Up,Выше,上移(&U),上移 (&U),上に移動 (&U),위로 (&U),Monter Move D&own,Ниже,下移(&O),下移 (&O),下に移動 (&O),아래로 (&O),Descendre deprecated,Устаревшее,不推荐,不推薦,非推奨,더 이상 사용되지 않음,Obsolète -"Encryption method {0} not exist, will replace with {1}",,加密方法{0}不存在,将使用{1}代替,,暗号化方式{0}が存在しません,{1}に置換します,{0} 암호화 방식이 존재하지 않으므로 {1}로 대체될 것입니다.,"Méthode de chiffrement {0} n'existe pas, sera remplacée par {1}" +"Encryption method {0} not exist, will replace with {1}",Метод шифрования {0} не найден; будет использован {1},加密方法{0}不存在,将使用{1}代替,,暗号化方式{0}が存在しません,{1}に置換します,{0} 암호화 방식이 존재하지 않으므로 {1}로 대체될 것입니다.,"Méthode de chiffrement {0} n'existe pas, sera remplacée par {1}" ,,,,,, # Log Form,,,,,, ,,,,,, @@ -87,12 +91,16 @@ E&xit,Выход,退出(&X),結束 (&X),終了 (&X),종료 (&X),Quitter &View,Вид,视图(&V),檢視 (&V),表示 (&V),보기 (&V),Afficher &Clear Logs,Очистить журнал,清空日志(&C),清除記錄檔 (&C),ログの削除 (&C),로그 초기화 (&C),Effacer les journaux Change &Font,Шрифт…,设置字体(&F),變更字型 (&F),フォント (&F),글꼴 변경 (&F),Définir la police +&Font,Шрифт,,,,, &Wrap Text,Перенос строк,自动换行(&W),自動換行 (&W),右端で折り返す (&W),텍스트 감싸기 (&W),Retour à la ligne &Top Most,Поверх всех окон,置顶(&T),置頂 (&T),常に最前面に表示 (&T),상단 우선 (Top Most) (&T),Metter en haut &Show Toolbar,Панель инструментов,显示工具栏(&S),顯示工具列 (&S),ツールバーの表示 (&S),툴바 보여주기 (&S),Afficher la barre d'outils Log Viewer,Просмотр журнала,日志查看器,記錄檔檢視器,ログビューア,로그 뷰어,Visionneuse de journaux +Cannot get the log file name from NLog config file. Please check whether the NLog configuration contains the required XML nodes.,Не удалось определить имя файла журнала из конфигурации NLog. Проверьте наличие необходимых XML-узлов.,,,,, Inbound,Входящая,入站,輸入,受信,"인바운드 (Rx, 다운로드)",Entrant Outbound,Исходящая,出站,輸出,送信,"아웃바운드 (Tx, 업로드)",Sortant +In,Вх.,,,,, +Out,Исх.,,,,, ,,,,,, # QRCode Form,,,,,, ,,,,,, @@ -121,20 +129,21 @@ Shadowsocks is here,Shadowsocks находится здесь,Shadowsocks 在这 You can turn on/off Shadowsocks in the context menu,Вы можете управлять Shadowsocks из контекстного меню,可以在右键菜单中开关 Shadowsocks,可以在右鍵選項單中開關 Shadowsocks,コンテキストメニューを使って、Shadowsocks を有効または無効にすることができます。,프로그램 메뉴에서 Shadowsocks를 끄고 켤 수 있습니다.,Vous pouvez activer / désactiver Shadowsocks dans le menu contextuel System Proxy Enabled,Системный прокси включен,系统代理已启用,系統 Proxy 已啟用,システム プロキシが有効です。,시스템 프록시가 활성화되었습니다.,Proxy système activé System Proxy Disabled,Системный прокси отключен,系统代理未启用,系統 Proxy 未啟用,システム プロキシが無効です。,시스템 프록시가 비활성화되었습니다.,Proxy système désactivé -Failed to update PAC file ,Не удалось обновить PAC файл,更新 PAC 文件失败,更新 PAC 檔案失敗,PAC の更新に失敗しました。,프록시 자동 구성 파일을 업데이트하는데 실패했습니다.,Impossible de mettre à jour le fichier PAC +Failed to update PAC file,Не удалось обновить PAC файл,更新 PAC 文件失败,更新 PAC 檔案失敗,PAC の更新に失敗しました。,프록시 자동 구성 파일을 업데이트하는데 실패했습니다.,Impossible de mettre à jour le fichier PAC PAC updated,PAC файл обновлен,更新 PAC 成功,更新 PAC 成功,PAC を更新しました。,프록시 자동 구성 파일이 업데이트되었습니다.,PAC mis à jour No updates found. Please report to Geosite if you have problems with it.,Обновлений не найдено. Сообщите авторам Geosite если у вас возникли проблемы.,未发现更新。如有问题请提交给 Geosite。,未發現更新。如有問題請報告至 Geosite。,お使いのバージョンは最新です。問題がある場合は、GFWList に報告して下さい。,사용 가능한 업데이트를 찾지 못했습니다. 문제가 있다면 Geosite로 전송해주세요.,Aucune mise à jour trouvée. Veuillez signaler à Geosite si vous avez des problèmes concernant. No QRCode found. Try to zoom in or move it to the center of the screen.,QRCode не обнаружен. Попробуйте увеличить изображение или переместить его в центр экрана.,未发现二维码,尝试把它放大或移动到靠近屏幕中间的位置,未發現 QR 碼,嘗試把它放大或移動到靠近熒幕中間的位置,QR コードが見つかりませんでした。コードを大きくするか、画面の中央に移動して下さい。,QR코드를 찾을 수 없습니다. 가운데로 화면을 이동시키거나 확대해보세요.,Aucun QRCode trouvé. Essayez de zoomer ou de le déplacer vers le centre de l'écran. Shadowsocks is already running.,Shadowsocks уже запущен.,Shadowsocks 已经在运行。,Shadowsocks 已經在執行。,Shadowsocks 実行中,Shadowsocks가 이미 실행 중입니다.,Shadowsocks est déjà en cours d'exécution. Find Shadowsocks icon in your notify tray.,Значок Shadowsocks можно найти в области уведомлений.,请在任务栏里寻找 Shadowsocks 图标。,請在工作列裡尋找 Shadowsocks 圖示。,通知領域には Shadowsocks のアイコンがあります。,트레이에서 Shadowsocks를 찾아주세요.,Trouvez l'icône Shadowsocks dans votre barre de notification. "If you want to start multiple Shadowsocks, make a copy in another directory.","Если вы хотите запустить несколько копий Shadowsocks одновременно, создайте отдельную папку на каждую копию.",如果想同时启动多个,可以另外复制一份到别的目录。,如果想同時啟動多個,可以另外複製一份至別的目錄。,複数起動したい場合は、プログラムファイルを別のフォルダーにコピーしてから、もう一度実行して下さい。,"만약 여러 개의 Shadowsocks를 사용하고 싶으시다면, 파일을 다른 곳에 복사해주세요.","Si vous souhaitez démarrer plusieurs Shadowsocks, faites une copie dans un autre répertoire." -Invalid QR Code content: {0},,无效二维码内容: {0},無效二維碼內容: {0},,, +Invalid QR Code content: {0},Недопустимое содержимое QR-кода: {0},无效二维码内容: {0},無效二維碼內容: {0},,, Failed to update registry,Не удалось обновить запись в реестре,无法修改注册表,無法修改登錄檔,レジストリの更新に失敗しました。,레지스트리를 업데이트하는데에 실패했습니다.,Impossible de mettre à jour de la base de registre +Failed to open registry key: {0},Не удалось открыть раздел реестра: {0},,,,, Import from URL: {0} ?,импортировать из адреса: {0} ?,从URL导入: {0} ?,從URL匯入: {0} ?,{0}:このURLからインポートしますか?,, Successfully imported from {0},Успешно импортировано из {0},导入成功:{0},導入成功:{0},{0}:インポートしました。,, -Failed to import. Please check if the link is valid.,,导入失败,请检查链接是否有效。,導入失敗,請檢查鏈接是否有效。,インポートに失敗しました。リンクの有効性を確認してください。,, -Warning: importing {0} from a legacy ss:// link. Support for legacy ss:// links will be dropped in version 5. Make sure to update your ss:// links.,,警告: 正在从旧版 ss:// 链接导入 {0}。对旧版 ss:// 链接的支持将于 v5 移除,请及时更新你的链接。,,,, -System Proxy On: ,Системный прокси:,系统代理已启用:,系統 Proxy 已啟用:,システム プロキシが有効:,시스템 프록시 활성화됨: ,Proxy système activé: +Failed to import. Please check if the link is valid.,Не удалось импортировать. Проверьте корректность ссылки.,导入失败,请检查链接是否有效。,導入失敗,請檢查鏈接是否有效。,インポートに失敗しました。リンクの有効性を確認してください。,, +Warning: importing {0} from a legacy ss:// link. Support for legacy ss:// links will be dropped in version 5. Make sure to update your ss:// links.,Предупреждение: выполняется импорт {0} из устаревшей ссылки ss://. Поддержка таких ссылок будет удалена в версии 5. Обновите ссылки ss://.,警告: 正在从旧版 ss:// 链接导入 {0}。对旧版 ss:// 链接的支持将于 v5 移除,请及时更新你的链接。,,,, +System Proxy On:,Системный прокси:,系统代理已启用:,系統 Proxy 已啟用:,システム プロキシが有効:,시스템 프록시 활성화됨: ,Proxy système activé: Running: Port {0},Запущен на порту {0},正在运行:端口 {0},正在執行:連接埠號碼 {0},実行中:ポート {0},실행 중: 포트 {0}번,En cours d'exécution: port {0} "Unexpected error, shadowsocks will exit. Please report to","Непредвиденная ошибка, пожалуйста сообщите на",非预期错误,Shadowsocks将退出。请提交此错误到,非預期錯誤,Shadowsocks 將結束。請報告此錯誤至,予想外のエラーが発生したため、Shadowsocks を終了します。詳しくは下記までお問い合わせ下さい:,알 수 없는 오류로 Shadowsocks가 종료될 것입니다. 오류를 여기로 제보해주세요:,Shadowsocks va quitter en présence d/érreur inattendue. Veuillez signaler à "Unsupported operating system, use Windows Vista at least.","Операционная система не поддерживается, минимальные системные требования: Windows Vista или выше.",不支持的操作系统版本,最低需求为Windows Vista。,不支援的作業系統版本,最低需求為 Windows Vista。,お使いの OS はサポートされていません。Windows Vista 以降の OS で実行して下さい。,지원하지 않는 운영체제입니다. 최소 Windows Vista가 필요합니다.,"Système d'exploitation incompatible, veuillez utiliser Windows Vista ou ultérieure." @@ -148,6 +157,7 @@ Cannot find the plugin program file,Файл плагина не найден, ,,,,,, Operation failure,Операция завершилась неудачей,操作失败,,操作に失敗しました,작업에 실패했습니다.,Operation failure Auto save failed,Автоматическое сохранение не удалось,自动保存失败,,オートセーブに失敗しました,자동 저장에 실패했습니다.,Échec de l'enregistrement automatique +Cannot get the log level from the NLog configuration: {0},Не удалось определить уровень журналирования из конфигурации NLog: {0},,,,, Whether to discard unconfigured servers,Внесенные изменения будут утеряны,是否丢弃未配置的服务器,,未設定のサーバーを破棄しますか,구성되지 않은 서버 설정 변경 사항을 폐기하시겠습니까?,Eliminer les serveurs non configurés ou non "Invalid server address, Cannot automatically save or discard changes",Неверный адрес сервера. Невозможно сохранить или отменить изменения,非法服务器地址,无法自动保存,是否丢弃修改,,サーバーアドレスが無効なため、オートセーブできません。変更を破棄しますか,"서버 주소가 올바르지 않아 자동 저장 할 수 없습니다, 변경 사항을 폐기하시겠습니까?","Adresse de serveur invalide, impossible d'enregistrer ou d'annuler automatiquement les modifications" "Illegal port number format, Cannot automatically save or discard changes",Неверный числовой адрес порта. Невозможно сохранить или отменить изменения,非法端口格式,无法自动保存,是否丢弃修改,,ポート番号のフォーマットが無効なため、オートセーブできません。変更を破棄しますか,"포트 번호가 올바르지 않아 자동 저장 할 수 없습니다, 변경 사항을 폐기하시겠습니까?","Format de numéro de port illégal, impossible d'enregistrer ou d'annuler automatiquement les modifications" diff --git a/shadowsocks-csharp/Data/sysproxy.exe.gz b/shadowsocks-csharp/Data/sysproxy.exe.gz deleted file mode 100644 index 980d304b0cba3417b89e1f1ef9abbfbb7e3b05a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56029 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⩔dTauZbqj2!fgkwyd_j0M_af$t)K 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

S@~IR^T3Q+L}HNuE$+1a!ecDgSa0Qn-cgP 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 diff --git a/shadowsocks-csharp/Data/sysproxy64.exe.gz b/shadowsocks-csharp/Data/sysproxy64.exe.gz deleted file mode 100644 index c5ff36af391832b09710ea138375632cc984dd32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61784 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 diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs index 72dd693af..9a8c133ca 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs @@ -1,11 +1,11 @@ -using NLog; using System; using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Text; -using Shadowsocks.Encryption.CircularBuffer; +using NLog; using Shadowsocks.Controller; +using Shadowsocks.Encryption.CircularBuffer; using Shadowsocks.Encryption.Exception; namespace Shadowsocks.Encryption.AEAD @@ -75,7 +75,8 @@ protected void InitEncryptorInfo(string method) CipherInfo = ciphers[_method]; _innerLibName = CipherInfo.InnerLibName; _cipher = CipherInfo.Type; - if (_cipher == 0) { + if (_cipher == 0) + { throw new System.Exception("method not found"); } keyLen = CipherInfo.KeySize; @@ -126,17 +127,21 @@ public void DeriveSessionKey(byte[] salt, byte[] masterKey, byte[] sessionKey) protected void IncrementNonce(bool isEncrypt) { - lock (_nonceIncrementLock) { + lock (_nonceIncrementLock) + { Sodium.sodium_increment(isEncrypt ? _encNonce : _decNonce, nonceLen); } } public virtual void InitCipher(byte[] salt, bool isEncrypt, bool isUdp) { - if (isEncrypt) { + if (isEncrypt) + { _encryptSalt = new byte[saltLen]; Array.Copy(salt, _encryptSalt, saltLen); - } else { + } + else + { _decryptSalt = new byte[saltLen]; Array.Copy(salt, _decryptSalt, saltLen); } @@ -158,7 +163,8 @@ public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outl _encCircularBuffer.Put(buf, 0, length); outlength = 0; logger.Trace("---Start Encryption"); - if (! _encryptSaltSent) { + if (!_encryptSaltSent) + { _encryptSaltSent = true; // Generate salt byte[] saltBytes = new byte[saltLen]; @@ -169,7 +175,8 @@ public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outl logger.Trace($"_encryptSaltSent outlength {outlength}"); } - if (! _tcpRequestSent) { + if (!_tcpRequestSent) + { _tcpRequestSent = true; // The first TCP request int encAddrBufLength; @@ -183,7 +190,8 @@ public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outl } // handle other chunks - while (true) { + while (true) + { uint bufSize = (uint)_encCircularBuffer.Size; if (bufSize <= 0) return; var chunklength = (int)Math.Min(bufSize, CHUNK_LEN_MASK); @@ -196,12 +204,14 @@ public override void Encrypt(byte[] buf, int length, byte[] outbuf, out int outl outlength += encChunkLength; logger.Trace("chunks enc outlength " + outlength); // check if we have enough space for outbuf - if (outlength + TCPHandler.ChunkOverheadSize > TCPHandler.BufferSize) { + if (outlength + TCPHandler.ChunkOverheadSize > TCPHandler.BufferSize) + { logger.Trace("enc outbuf almost full, giving up"); return; } bufSize = (uint)_encCircularBuffer.Size; - if (bufSize <= 0) { + if (bufSize <= 0) + { logger.Trace("No more data to encrypt, leaving"); return; } @@ -218,10 +228,12 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl _decCircularBuffer.Put(buf, 0, length); logger.Trace("---Start Decryption"); - if (! _decryptSaltReceived) { + if (!_decryptSaltReceived) + { bufSize = _decCircularBuffer.Size; // check if we get the leading salt - if (bufSize <= saltLen) { + if (bufSize <= saltLen) + { // need more return; } @@ -232,16 +244,19 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl } // handle chunks - while (true) { + while (true) + { bufSize = _decCircularBuffer.Size; // check if we have any data - if (bufSize <= 0) { + if (bufSize <= 0) + { logger.Trace("No data in _decCircularBuffer"); return; } // first get chunk length - if (bufSize <= CHUNK_LEN_BYTES + tagLen) { + if (bufSize <= CHUNK_LEN_BYTES + tagLen) + { // so we only have chunk length and its tag? return; } @@ -255,7 +270,7 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl cipherDecrypt(encLenBytes, CHUNK_LEN_BYTES + (uint)tagLen, decChunkLenBytes, ref decChunkLenLength); Debug.Assert(decChunkLenLength == CHUNK_LEN_BYTES); // finally we get the real chunk len - ushort chunkLen = (ushort) IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(decChunkLenBytes, 0)); + ushort chunkLen = (ushort)IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(decChunkLenBytes, 0)); if (chunkLen > CHUNK_LEN_MASK) { // we get invalid chunk @@ -264,7 +279,8 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl } logger.Trace("Get the real chunk len:" + chunkLen); bufSize = _decCircularBuffer.Size; - if (bufSize < CHUNK_LEN_BYTES + tagLen /* we haven't remove them */+ chunkLen + tagLen) { + if (bufSize < CHUNK_LEN_BYTES + tagLen /* we haven't remove them */+ chunkLen + tagLen) + { logger.Trace("No more data to decrypt one chunk"); return; } @@ -283,7 +299,7 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl #endregion // output to outbuf - Buffer.BlockCopy(decChunkBytes, 0, outbuf, outlength, (int) decChunkLen); + Buffer.BlockCopy(decChunkBytes, 0, outbuf, outlength, (int)decChunkLen); outlength += (int)decChunkLen; logger.Trace("aead dec outlength " + outlength); if (outlength + 100 > TCPHandler.BufferSize) @@ -293,7 +309,8 @@ public override void Decrypt(byte[] buf, int length, byte[] outbuf, out int outl } bufSize = _decCircularBuffer.Size; // check if we already done all of them - if (bufSize <= 0) { + if (bufSize <= 0) + { logger.Trace("No data in _decCircularBuffer, already all done"); return; } @@ -310,11 +327,12 @@ public override void EncryptUDP(byte[] buf, int length, byte[] outbuf, out int o randBytes(outbuf, saltLen); InitCipher(outbuf, true, true); uint olen = 0; - lock (_udpTmpBuf) { - cipherEncrypt(buf, (uint) length, _udpTmpBuf, ref olen); + lock (_udpTmpBuf) + { + cipherEncrypt(buf, (uint)length, _udpTmpBuf, ref olen); Debug.Assert(olen == length + tagLen); - Buffer.BlockCopy(_udpTmpBuf, 0, outbuf, saltLen, (int) olen); - outlength = (int) (saltLen + olen); + Buffer.BlockCopy(_udpTmpBuf, 0, outbuf, saltLen, (int)olen); + outlength = (int)(saltLen + olen); } } @@ -322,12 +340,13 @@ public override void DecryptUDP(byte[] buf, int length, byte[] outbuf, out int o { InitCipher(buf, false, true); uint olen = 0; - lock (_udpTmpBuf) { + lock (_udpTmpBuf) + { // copy remaining data to first pos Buffer.BlockCopy(buf, saltLen, buf, 0, length - saltLen); - cipherDecrypt(buf, (uint) (length - saltLen), _udpTmpBuf, ref olen); - Buffer.BlockCopy(_udpTmpBuf, 0, outbuf, 0, (int) olen); - outlength = (int) olen; + cipherDecrypt(buf, (uint)(length - saltLen), _udpTmpBuf, ref olen); + Buffer.BlockCopy(_udpTmpBuf, 0, outbuf, 0, (int)olen); + outlength = (int)olen; } } @@ -336,7 +355,8 @@ public override void DecryptUDP(byte[] buf, int length, byte[] outbuf, out int o // we know the plaintext length before encryption, so we can do it in one operation private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out int cipherLen) { - if (plainLen > CHUNK_LEN_MASK) { + if (plainLen > CHUNK_LEN_MASK) + { logger.Error("enc chunk too big"); throw new CryptoErrorException(); } @@ -344,7 +364,7 @@ private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out // encrypt len byte[] encLenBytes = new byte[CHUNK_LEN_BYTES + tagLen]; uint encChunkLenLength = 0; - byte[] lenbuf = BitConverter.GetBytes((ushort) IPAddress.HostToNetworkOrder((short)plainLen)); + byte[] lenbuf = BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)plainLen)); cipherEncrypt(lenbuf, CHUNK_LEN_BYTES, encLenBytes, ref encChunkLenLength); Debug.Assert(encChunkLenLength == CHUNK_LEN_BYTES + tagLen); IncrementNonce(true); @@ -352,14 +372,14 @@ private void ChunkEncrypt(byte[] plaintext, int plainLen, byte[] ciphertext, out // encrypt corresponding data byte[] encBytes = new byte[plainLen + tagLen]; uint encBufLength = 0; - cipherEncrypt(plaintext, (uint) plainLen, encBytes, ref encBufLength); + cipherEncrypt(plaintext, (uint)plainLen, encBytes, ref encBufLength); Debug.Assert(encBufLength == plainLen + tagLen); IncrementNonce(true); // construct outbuf - Array.Copy(encLenBytes, 0, ciphertext, 0, (int) encChunkLenLength); - Buffer.BlockCopy(encBytes, 0, ciphertext, (int) encChunkLenLength, (int) encBufLength); - cipherLen = (int) (encChunkLenLength + encBufLength); + Array.Copy(encLenBytes, 0, ciphertext, 0, (int)encChunkLenLength); + Buffer.BlockCopy(encBytes, 0, ciphertext, (int)encChunkLenLength, (int)encBufLength); + cipherLen = (int)(encChunkLenLength + encBufLength); } } } \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs index 2f73f9e4a..17246214d 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; @@ -80,19 +80,19 @@ public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertex case CIPHER_AES: ret = MbedTLS.cipher_auth_encrypt(_encryptCtx, /* nonce */ - _encNonce, (uint) nonceLen, + _encNonce, (uint)nonceLen, /* AD */ IntPtr.Zero, 0, /* plain */ plaintext, plen, /* cipher */ ciphertext, ref olen, - tagbuf, (uint) tagLen); + tagbuf, (uint)tagLen); if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); Debug.Assert(olen == plen); // attach tag to ciphertext - Array.Copy(tagbuf, 0, ciphertext, (int) plen, tagLen); - clen = olen + (uint) tagLen; + Array.Copy(tagbuf, 0, ciphertext, (int)plen, tagLen); + clen = olen + (uint)tagLen; break; default: throw new System.Exception("not implemented"); @@ -107,16 +107,16 @@ public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintex uint olen = 0; // split tag byte[] tagbuf = new byte[tagLen]; - Array.Copy(ciphertext, (int) (clen - tagLen), tagbuf, 0, tagLen); + Array.Copy(ciphertext, (int)(clen - tagLen), tagbuf, 0, tagLen); switch (_cipher) { case CIPHER_AES: ret = MbedTLS.cipher_auth_decrypt(_decryptCtx, - _decNonce, (uint) nonceLen, + _decNonce, (uint)nonceLen, IntPtr.Zero, 0, - ciphertext, (uint) (clen - tagLen), + ciphertext, (uint)(clen - tagLen), plaintext, ref olen, - tagbuf, (uint) tagLen); + tagbuf, (uint)tagLen); if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); Debug.Assert(olen == clen - tagLen); plen = olen; diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs index e122e4b8c..f6a662aa1 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Shadowsocks.Encryption.Exception; @@ -93,9 +93,9 @@ public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertex var tagBuf = new byte[tagLen]; ret = OpenSSL.EVP_CipherUpdate(_encryptCtx, ciphertext, out tmpLen, - plaintext, (int) plen); + plaintext, (int)plen); if (ret != 1) throw new CryptoErrorException("openssl: fail to encrypt AEAD"); - clen += (uint) tmpLen; + clen += (uint)tmpLen; // For AEAD cipher, it should not output anything ret = OpenSSL.EVP_CipherFinal_ex(_encryptCtx, ciphertext, ref tmpLen); if (ret != 1) throw new CryptoErrorException("openssl: fail to finalize AEAD"); @@ -106,7 +106,7 @@ public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertex OpenSSL.AEADGetTag(_encryptCtx, tagBuf, tagLen); Array.Copy(tagBuf, 0, ciphertext, clen, tagLen); - clen += (uint) tagLen; + clen += (uint)tagLen; } public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) @@ -120,13 +120,13 @@ public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintex // split tag byte[] tagbuf = new byte[tagLen]; - Array.Copy(ciphertext, (int) (clen - tagLen), tagbuf, 0, tagLen); + Array.Copy(ciphertext, (int)(clen - tagLen), tagbuf, 0, tagLen); OpenSSL.AEADSetTag(_decryptCtx, tagbuf, tagLen); ret = OpenSSL.EVP_CipherUpdate(_decryptCtx, - plaintext, out tmpLen, ciphertext, (int) (clen - tagLen)); + plaintext, out tmpLen, ciphertext, (int)(clen - tagLen)); if (ret != 1) throw new CryptoErrorException("openssl: fail to decrypt AEAD"); - plen += (uint) tmpLen; + plen += (uint)tmpLen; // For AEAD cipher, it should not output anything ret = OpenSSL.EVP_CipherFinal_ex(_decryptCtx, plaintext, ref tmpLen); diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs index 06aef5d7a..7736bb2d3 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using NLog; -using Shadowsocks.Controller; using Shadowsocks.Encryption.Exception; namespace Shadowsocks.Encryption.AEAD @@ -60,12 +59,12 @@ public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertex ulong encClen = 0; logger.Dump("_encNonce before enc", _encNonce, nonceLen); logger.Dump("_sodiumEncSubkey", _sodiumEncSubkey, keyLen); - logger.Dump("before cipherEncrypt: plain", plaintext, (int) plen); + logger.Dump("before cipherEncrypt: plain", plaintext, (int)plen); switch (_cipher) { case CIPHER_CHACHA20IETFPOLY1305: ret = Sodium.crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext, ref encClen, - plaintext, (ulong) plen, + plaintext, (ulong)plen, null, 0, null, _encNonce, _sodiumEncSubkey); @@ -88,8 +87,8 @@ public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertex throw new System.Exception("not implemented"); } if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - logger.Dump("after cipherEncrypt: cipher", ciphertext, (int) encClen); - clen = (uint) encClen; + logger.Dump("after cipherEncrypt: cipher", ciphertext, (int)encClen); + clen = (uint)encClen; } public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) @@ -101,13 +100,13 @@ public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintex ulong decPlen = 0; logger.Dump("_decNonce before dec", _decNonce, nonceLen); logger.Dump("_sodiumDecSubkey", _sodiumDecSubkey, keyLen); - logger.Dump("before cipherDecrypt: cipher", ciphertext, (int) clen); + logger.Dump("before cipherDecrypt: cipher", ciphertext, (int)clen); switch (_cipher) { case CIPHER_CHACHA20IETFPOLY1305: ret = Sodium.crypto_aead_chacha20poly1305_ietf_decrypt(plaintext, ref decPlen, null, - ciphertext, (ulong) clen, + ciphertext, (ulong)clen, null, 0, _decNonce, _sodiumDecSubkey); break; @@ -130,8 +129,8 @@ public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintex } if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - logger.Dump("after cipherDecrypt: plain", plaintext, (int) decPlen); - plen = (uint) decPlen; + logger.Dump("after cipherDecrypt: plain", plaintext, (int)decPlen); + plen = (uint)decPlen; } public override void Dispose() diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index ab69f1eca..065007162 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -1,4 +1,4 @@ -namespace Shadowsocks.Encryption +namespace Shadowsocks.Encryption { public class EncryptorInfo { @@ -92,6 +92,6 @@ protected EncryptorBase(string method, string password) public abstract void Dispose(); - public int AddrBufLength { get; set; } = - 1; + public int AddrBufLength { get; set; } = -1; } } \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index 81df1fe97..b462ada39 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using System.Text; @@ -11,7 +11,7 @@ public static class EncryptorFactory { private static Dictionary _registeredEncryptors = new Dictionary(); - private static readonly Type[] ConstructorTypes = {typeof(string), typeof(string)}; + private static readonly Type[] ConstructorTypes = { typeof(string), typeof(string) }; static EncryptorFactory() { @@ -66,7 +66,7 @@ public static IEncryptor GetEncryptor(string method, string password) ConstructorInfo c = t.GetConstructor(ConstructorTypes); if (c == null) throw new System.Exception("Invalid ctor"); - IEncryptor result = (IEncryptor) c.Invoke(new object[] {method, password}); + IEncryptor result = (IEncryptor)c.Invoke(new object[] { method, password }); return result; } diff --git a/shadowsocks-csharp/Encryption/MbedTLS.cs b/shadowsocks-csharp/Encryption/MbedTLS.cs index be6816702..6d64a0ba9 100644 --- a/shadowsocks-csharp/Encryption/MbedTLS.cs +++ b/shadowsocks-csharp/Encryption/MbedTLS.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Runtime.InteropServices; using NLog; @@ -37,7 +37,7 @@ static MbedTLS() public static byte[] MD5(byte[] input) { byte[] output = new byte[16]; - if (md5_ret(input, (uint) input.Length, output) != 0) + if (md5_ret(input, (uint)input.Length, output) != 0) throw new System.Exception("mbedtls: MD5 failure"); return output; } diff --git a/shadowsocks-csharp/Localization/Strings.resx b/shadowsocks-csharp/Localization/Strings.resx index 9348c4882..a2f4503d8 100644 --- a/shadowsocks-csharp/Localization/Strings.resx +++ b/shadowsocks-csharp/Localization/Strings.resx @@ -238,6 +238,35 @@ Successfully updated all sources! - The following sources failed to update:\n\n + The following sources failed to update: + + + + + Address can't be empty or whitespace. + + + {0} is out of range (0, 65535]. + + + {0} is out of range (0, 10]. + + + You must provide both username and password. + + + Warning: getting online configuration from plain HTTP sources is NOT secure! + + + Pre-release + + + Release + + + Failed to get tag name + + + Failed to get release notes \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.ru.resx b/shadowsocks-csharp/Localization/Strings.ru.resx index ce0074480..487e5fd43 100644 --- a/shadowsocks-csharp/Localization/Strings.ru.resx +++ b/shadowsocks-csharp/Localization/Strings.ru.resx @@ -121,63 +121,152 @@ Пароль - тип + Тип - адрес + Адрес - порт + Порт Таймаут (сек) - Отмена + _Отмена - ОК + _ОК - ВКЛ/ВЫКЛ системный прокси-сервер + Включить/выключить системный прокси - Переключение режима прокси-сервера + Переключить режим прокси - Общий доступ к подключению + Разрешить подключения из локальной сети - Просмотр журналов + Открыть журнал - Переключить на пред. сервер + Переключиться на предыдущий сервер - Переключить на след. сервер + Переключиться на следующий сервер - Применить все + Применять горячие клавиши при запуске - Применять при запуске программы + _Применить все - Добавить + _Добавить - пропустить версию + _Пропустить версию - копировать ссылку + _Копировать ссылку - Удалить + _Удалить - Обновить + _Обновить - копировать + _Копировать + + + Без прокси + + + SOCKS5 + + + HTTP + + + Параметры + + + Учётные данные (необязательно) + + + Имя пользователя + + + _Сохранить + + + Обновить все + + + Доступно обновление. + + + Ознакомьтесь с примечаниями к выпуску и выберите, устанавливать ли обновление. + + + _Не сейчас + + + Прямой прокси + + + Поделиться конфигурацией сервера + + + Горячие клавиши + + + Онлайн-конфигурации + + + Обновление Shadowsocks + + + Выбранный источник успешно обновлён. + + + Не удалось обновить источник. Подробности смотрите в журнале. + + + Все источники успешно обновлены. + + + Не удалось обновить следующие источники: + + + + + Адрес не может быть пустым. + + + Порт {0} вне допустимого диапазона (0, 65535]. + + + Таймаут {0} вне допустимого диапазона (0, 10]. + + + Укажите и имя пользователя, и пароль. + + + Внимание: получение онлайн-конфигурации по обычному HTTP небезопасно! + + + Предварительная версия + + + Релиз + + + Не удалось получить номер версии + + + Не удалось получить примечания к выпуску \ No newline at end of file diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index a48cf0e00..ae3f9e4dc 100644 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -237,7 +237,7 @@ public static void Process(ref Configuration config) } catch (Exception e) { - MessageBox.Show($"Cannot get the log level from NLog config file. Please check if the nlog config file exists with corresponding XML nodes.\n{e.Message}"); + MessageBox.Show(I18N.GetString("Cannot get the log level from the NLog configuration: {0}", e.Message)); } } diff --git a/shadowsocks-csharp/Model/LogViewerConfig.cs b/shadowsocks-csharp/Model/LogViewerConfig.cs index 6a2fc8620..6dce25404 100644 --- a/shadowsocks-csharp/Model/LogViewerConfig.cs +++ b/shadowsocks-csharp/Model/LogViewerConfig.cs @@ -11,6 +11,11 @@ public class LogViewerConfig public bool topMost; public bool wrapText; public bool toolbarShown; + public int width = 600; + public int height = 400; + public int top; + public int left; + public bool maximized = true; public Font Font { get; set; } = new Font("Consolas", 8F); @@ -28,41 +33,39 @@ public LogViewerConfig() #region Size - public void SaveSize() - { - Properties.Settings.Default.Save(); - } - [JsonIgnore] public int Width { - get { return Properties.Settings.Default.LogViewerWidth; } - set { Properties.Settings.Default.LogViewerWidth = value; } + get { return width; } + set { width = value; } } [JsonIgnore] public int Height { - get { return Properties.Settings.Default.LogViewerHeight; } - set { Properties.Settings.Default.LogViewerHeight = value; } + get { return height; } + set { height = value; } } + [JsonIgnore] public int Top { - get { return Properties.Settings.Default.LogViewerTop; } - set { Properties.Settings.Default.LogViewerTop = value; } + get { return top; } + set { top = value; } } + [JsonIgnore] public int Left { - get { return Properties.Settings.Default.LogViewerLeft; } - set { Properties.Settings.Default.LogViewerLeft = value; } + get { return left; } + set { left = value; } } + [JsonIgnore] public bool Maximized { - get { return Properties.Settings.Default.LogViewerMaximized; } - set { Properties.Settings.Default.LogViewerMaximized = value; } + get { return maximized; } + set { maximized = value; } } [JsonIgnore] diff --git a/shadowsocks-csharp/Model/NlogConfig.cs b/shadowsocks-csharp/Model/NlogConfig.cs index 27c930155..2b8541551 100644 --- a/shadowsocks-csharp/Model/NlogConfig.cs +++ b/shadowsocks-csharp/Model/NlogConfig.cs @@ -1,11 +1,7 @@ -using NLog; using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Xml; +using NLog; namespace Shadowsocks.Model { diff --git a/shadowsocks-csharp/Model/Server.cs b/shadowsocks-csharp/Model/Server.cs index 7eb71e974..9a2d76a04 100755 --- a/shadowsocks-csharp/Model/Server.cs +++ b/shadowsocks-csharp/Model/Server.cs @@ -1,13 +1,13 @@ using System; using System.Collections.Generic; using System.Collections.Specialized; +using System.ComponentModel; +using System.Linq; using System.Text; -using System.Web; -using Shadowsocks.Controller; using System.Text.RegularExpressions; -using System.Linq; +using System.Web; using Newtonsoft.Json; -using System.ComponentModel; +using Shadowsocks.Controller; namespace Shadowsocks.Model { diff --git a/shadowsocks-csharp/Model/SysproxyConfig.cs b/shadowsocks-csharp/Model/SysproxyConfig.cs deleted file mode 100644 index 53e78a6ef..000000000 --- a/shadowsocks-csharp/Model/SysproxyConfig.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace Shadowsocks.Model -{ - /* - * Data come from WinINET - */ - - [Serializable] - public class SysproxyConfig - { - public bool UserSettingsRecorded; - public string Flags; - public string ProxyServer; - public string BypassList; - public string PacUrl; - - public SysproxyConfig() - { - UserSettingsRecorded = false; - Flags = "1"; - // Watchout, Nullable! See #2100 - ProxyServer = ""; - BypassList = ""; - PacUrl = ""; - } - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index c2805eb4b..b2f740111 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Threading; @@ -120,7 +120,7 @@ private static void Main(string[] args) await MainController.UpdateAllOnlineConfig(); }); -#region IPC handler and argument processing + #region IPC handler and argument processing IPCService ipcService = new IPCService(); Task.Run(() => ipcService.RunServer()); ipcService.OpenUrlRequested += (_, e) => MainController.AskAddServerBySSURL(e.Url); @@ -129,8 +129,8 @@ private static void Main(string[] args) { MainController.AskAddServerBySSURL(Options.OpenUrl); } -#endregion - + #endregion + Application.Run(); } diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs index 24d103335..aee362849 100755 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ b/shadowsocks-csharp/Properties/AssemblyInfo.cs @@ -1,8 +1,7 @@ -using Shadowsocks.Controller; using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; +using Shadowsocks.Controller; // This is a Windows-only desktop application. GenerateAssemblyInfo is disabled, // so the SDK cannot emit this platform annotation automatically. diff --git a/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml index b92b00bc3..04a8abdd5 100644 --- a/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml +++ b/shadowsocks-csharp/Properties/PublishProfiles/FolderProfile.pubxml @@ -1,8 +1,8 @@ - + Release - net10.0-windows + net10.0-windows10.0.19041.0 win-x86 false true diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index e3cd3ddf4..1e4050233 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -221,26 +221,6 @@ public static System.Drawing.Bitmap ssw128 { } } - /// - /// Looks up a localized resource of type System.Byte[]. - /// - public static byte[] sysproxy_exe { - get { - object obj = ResourceManager.GetObject("sysproxy_exe", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - public static byte[] sysproxy64_exe { - get { - object obj = ResourceManager.GetObject("sysproxy64_exe", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// Looks up a localized string similar to ! Put user rules line by line in this file. ///! See https://adblockplus.org/en/filter-cheatsheet diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index 94f4f48e0..c50ad62b8 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -1,4 +1,4 @@ - + - diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index b0402ff29..e419c428a 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -1,7 +1,7 @@  WinExe - net10.0-windows + net10.0-windows10.0.19041.0 Shadowsocks Shadowsocks shadowsocks.ico @@ -52,11 +52,6 @@ true Resources.resx - - true - true - Settings.settings - @@ -74,9 +69,13 @@ LogForm.cs - - SettingsSingleFileGenerator - Settings.Designer.cs - + + + + + + diff --git a/test/Properties/AssemblyInfo.cs b/test/Properties/AssemblyInfo.cs index 37cce7317..eb440b980 100755 --- a/test/Properties/AssemblyInfo.cs +++ b/test/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ -using System.Reflection; -using System.Runtime.CompilerServices; +using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.Versioning; diff --git a/test/ShadowsocksTest.csproj b/test/ShadowsocksTest.csproj index 1c64f781d..cd45cfcd6 100644 --- a/test/ShadowsocksTest.csproj +++ b/test/ShadowsocksTest.csproj @@ -1,6 +1,6 @@  - net10.0-windows + net10.0-windows10.0.19041.0 Shadowsocks.Test Shadowsocks.Test true diff --git a/test/Sip003PluginTest.cs b/test/Sip003PluginTest.cs index 42a11886f..7a39f6176 100644 --- a/test/Sip003PluginTest.cs +++ b/test/Sip003PluginTest.cs @@ -1,11 +1,9 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading; -using System.Collections.Generic; -using Shadowsocks.Model; -using Shadowsocks.Controller.Service; using System.Diagnostics; using System.Net; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shadowsocks.Controller.Service; +using Shadowsocks.Model; namespace Shadowsocks.Test { @@ -198,14 +196,14 @@ private static void RunPluginSupportTest(Sip003Plugin plugin, string pluginName, var penv = ProcessEnvironment.ReadEnvironmentVariables(p); var pcmd = ProcessEnvironment.GetCommandLine(p).Trim(); pcmd = pcmd.IndexOf(' ') >= 0 ? pcmd.Substring(pcmd.IndexOf(' ') + 1) : ""; - + Assert.AreEqual(serverAddress, penv["SS_REMOTE_HOST"]); Assert.AreEqual(serverPort.ToString(), penv["SS_REMOTE_PORT"]); Assert.AreEqual(IPAddress.Loopback.ToString(), penv["SS_LOCAL_HOST"]); - + int _ignored; Assert.IsTrue(int.TryParse(penv["SS_LOCAL_PORT"], out _ignored)); - + Assert.AreEqual(pluginOpts, penv["SS_PLUGIN_OPTIONS"]); Assert.AreEqual(pluginArgs, pcmd); diff --git a/test/UnitTest.cs b/test/UnitTest.cs index d3bcd8689..7866997f3 100755 --- a/test/UnitTest.cs +++ b/test/UnitTest.cs @@ -1,12 +1,7 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Shadowsocks.Controller; -using GlobalHotKey; using System.Windows.Input; -using System.Threading; -using System.Collections.Generic; +using GlobalHotKey; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Shadowsocks.Controller.Hotkeys; -using System.Diagnostics; namespace Shadowsocks.Test diff --git a/test/UrlTest.cs b/test/UrlTest.cs index 77783a8c0..73fb415ed 100644 --- a/test/UrlTest.cs +++ b/test/UrlTest.cs @@ -1,10 +1,6 @@ -using System; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Shadowsocks.Controller; -using System.Threading; using System.Collections.Generic; +using Microsoft.VisualStudio.TestTools.UnitTesting; using Shadowsocks.Model; -using System.Diagnostics; namespace Shadowsocks.Test { @@ -201,7 +197,7 @@ public void TestParseUrl_Server2() [TestMethod] public void TestUrlGenerate() - { + { var generateUrlCases = new Dictionary { [server1CanonUrl] = server1, From 9980179e96fb98ae0e543e02b87da222a05588e7 Mon Sep 17 00:00:00 2001 From: SlimRG <39348033+SlimRG@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:12:11 +0300 Subject: [PATCH 04/32] Switch to System.Security.Cryptography Switch to System.Security.Cryptography --- CONTRIBUTING.md | 10 +- OPENSSL-GUIDE | 15 -- README.md | 37 +++- README.ru.md | 37 +++- .../Controller/Service/PACServer.cs | 3 +- shadowsocks-csharp/Data/libsscrypto.dll.gz | Bin 833636 -> 0 bytes .../Encryption/AEAD/AEADBclEncryptor.cs | 201 ++++++++++++++++++ .../Encryption/AEAD/AEADEncryptor.cs | 37 ++-- .../Encryption/AEAD/AEADMbedTLSEncryptor.cs | 178 ---------------- .../Encryption/AEAD/AEADOpenSSLEncryptor.cs | 192 ----------------- .../Encryption/AEAD/AEADSodiumEncryptor.cs | 140 ------------ .../Encryption/EncryptorFactory.cs | 41 +--- shadowsocks-csharp/Encryption/MbedTLS.cs | 109 ---------- shadowsocks-csharp/Encryption/OpenSSL.cs | 164 -------------- shadowsocks-csharp/Encryption/Sodium.cs | 113 ---------- shadowsocks-csharp/Model/Configuration.cs | 15 ++ .../Properties/Resources.Designer.cs | 10 - shadowsocks-csharp/Properties/Resources.resx | 5 +- shadowsocks-csharp/View/ConfigForm.cs | 1 - .../ViewModels/ForwardProxyViewModel.cs | 8 - shadowsocks-csharp/shadowsocks-csharp.csproj | 11 + test/CryptoTest.cs | 89 ++++++++ 22 files changed, 420 insertions(+), 996 deletions(-) delete mode 100644 OPENSSL-GUIDE delete mode 100755 shadowsocks-csharp/Data/libsscrypto.dll.gz create mode 100644 shadowsocks-csharp/Encryption/AEAD/AEADBclEncryptor.cs delete mode 100644 shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs delete mode 100644 shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs delete mode 100644 shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs delete mode 100644 shadowsocks-csharp/Encryption/MbedTLS.cs delete mode 100644 shadowsocks-csharp/Encryption/OpenSSL.cs delete mode 100755 shadowsocks-csharp/Encryption/Sodium.cs create mode 100644 test/CryptoTest.cs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c76798093..9a72acf91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ Keep pull requests focused. Avoid unrelated protocol, configuration or UI change - Target framework: `net10.0-windows10.0.19041.0` - Application/test architecture: x86 -The application must remain x86 until the bundled in-process `libsscrypto.dll` is replaced with a compatible build. +The current release profile is x86. Cryptography no longer imposes an in-process x86 native-library requirement. The current publish baseline is framework-dependent/single-file; NativeAOT is not enabled yet. ## Build and validate @@ -20,7 +20,9 @@ dotnet test .\test\ShadowsocksTest.csproj -c Release -p:Platform=x86 dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Platform=x86 -p:PublishProfile=FolderProfile ``` -Delete stale `bin`/`obj` before diagnosing problems after TFM, WPF dependency or publish-profile changes. +Delete stale `bin`/`obj` before diagnosing problems after TFM, WPF dependency or publish-profile changes. This is especially important after extracting a new archive over an older working tree. + +The SDK-style project explicitly excludes retired `Settings` and native-crypto source filenames. Do not make stale `AEADMbedTLSEncryptor`, `AEADOpenSSLEncryptor`, `AEADSodiumEncryptor`, `MbedTLS`, `OpenSSL` or `Sodium` files compile again; remove/ignore them and keep the active BCL implementation in `AEADBclEncryptor`. A successful build is not enough for runtime-sensitive changes. Exercise the code path you changed. @@ -31,6 +33,10 @@ A successful build is not enough for runtime-sensitive changes. Exercise the cod - Keep system-proxy integration in-process; do not reintroduce `sysproxy.exe` / `sysproxy64.exe`. - Do not reintroduce `System.Windows.Forms.DataVisualization` / `System.Data.SqlClient` solely for the traffic chart. - Do not globally suppress `Win32Exception`. Filter an expected native error only at the call site where it is known to be harmless. +- Keep classic AEAD wire compatibility: MD5 password derivation and HKDF-SHA1/`ss-subkey` are protocol requirements, not upgradeable hash choices. +- Do not reintroduce `libsscrypto.dll`, OpenSSL, mbedTLS or libsodium for the supported AEAD methods without a concrete compatibility requirement. +- Keep documentation explicit about the current publish mode: do not describe the build as NativeAOT until `PublishAot` is actually enabled and the complete application is validated under AOT. +- Treat the current WinForms/WPF UI as transitional; do not claim the Windows 11 WPF/Metro migration is complete until the remaining WinForms surfaces are replaced. ## Runtime checks diff --git a/OPENSSL-GUIDE b/OPENSSL-GUIDE deleted file mode 100644 index 42eaa8fee..000000000 --- a/OPENSSL-GUIDE +++ /dev/null @@ -1,15 +0,0 @@ -OpenSSL library guide for VS2017 - -# Read NOTES.WIN and NOTES.PERL - -# use Visual Studio native tools command prompt -# use activeperl, install NASM assembler -ppm install dmake - -# Win32 x86 -set PATH=D:\NASM-32;%PATH% -perl Configure VC-WIN32 --release --prefix=C:\Users\home\Downloads\openssl-1.1.0g\x86-build --openssldir=C:\Users\home\Downloads\openssl-1.1.0g\x86-install -nmake -nmake test -# to rebuild -nmake distclean diff --git a/README.md b/README.md index 6475e0288..78c68c4ab 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **English** | [Русский](README.ru.md) | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) -This repository keeps the Shadowsocks for Windows **v4** client architecture and ports it to **.NET 10**. The goal is compatibility with current Windows/.NET while preserving the v4 transport, encryption, configuration, plugin and server-selection behavior. +This repository keeps the Shadowsocks for Windows **v4** client architecture and incrementally ports it to **.NET 10**. The goal is compatibility with current Windows/.NET while preserving the v4 transport, encryption, configuration, plugin and server-selection behavior. ## Features @@ -23,10 +23,19 @@ This repository keeps the Shadowsocks for Windows **v4** client architecture and - Target framework: `net10.0-windows10.0.19041.0`. - Publish RID: `win-x86`. - .NET 10 Desktop Runtime (x86) is required for the framework-dependent publish. -- The main process remains x86 because bundled `libsscrypto.dll` is loaded in-process and is 32-bit. +- The current publish profile remains `win-x86`; there is no longer an in-process x86 crypto DLL requirement. - `privoxy.exe` is bundled as an x86 helper process. -The explicit Windows TFM is required by the current ReactiveUI/System.Reactive stack so the Windows dispatcher implementation is selected correctly. +The explicit Windows TFM is required by the current ReactiveUI/System.Reactive stack so the Windows dispatcher implementation is selected correctly. ChaCha20-Poly1305 additionally requires platform support reported by `ChaCha20Poly1305.IsSupported`. + +## Port status + +- The application and test projects target `.NET 10` on Windows. +- Supported AEAD methods are implemented by `AEADBclEncryptor` using `System.Security.Cryptography`. +- The old `libsscrypto.dll`, OpenSSL, mbedTLS and libsodium wrappers are not part of the active crypto path. Their legacy source filenames are explicitly excluded in the SDK-style project so stale files left by an in-place archive update cannot be compiled accidentally. +- System proxy changes are performed in-process through WinINet; the old `sysproxy.exe` helpers are not used. +- The UI is currently **mixed WinForms/WPF**. A complete Windows 11 WPF/Metro UI migration is not finished yet. +- The supplied publish profile is currently **framework-dependent, untrimmed, x86 and single-file**. **NativeAOT is not enabled yet.** ## Build @@ -50,7 +59,24 @@ Output: shadowsocks-csharp\bin\x86\Release\net10.0-windows10.0.19041.0\win-x86\publish\ ``` -The publish is framework-dependent, untrimmed and single-file. +The publish is framework-dependent, untrimmed and single-file. `PublishAot` is not enabled in the current profile. + +### Cleaning an upgraded working tree + +The repository is intended to tolerate extracting a newer archive over an older checkout. Known retired settings and native-crypto source files are explicitly excluded from compilation. If Visual Studio still shows errors originating from one of these retired files, close/reload the solution and delete stale `bin`/`obj` directories before rebuilding. + +Do **not** restore `libsscrypto.dll` or fix the retired OpenSSL/mbedTLS/libsodium wrappers just to make those stale files compile; the active implementation is `Encryption\AEAD\AEADBclEncryptor.cs`. + +## Cryptography + +AEAD cryptography uses `System.Security.Cryptography` through `Encryption/AEAD/AEADBclEncryptor.cs` instead of the legacy bundled `libsscrypto.dll`: + +- `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm` use `AesGcm`; +- `chacha20-ietf-poly1305` uses `ChaCha20Poly1305`; +- password-to-key derivation keeps the legacy Shadowsocks MD5 construction for protocol compatibility; +- session subkeys use HKDF-SHA1 with `ss-subkey`, as required by the classic Shadowsocks AEAD protocol. + +`xchacha20-ietf-poly1305` has been removed. Old local configurations using it are changed to `chacha20-ietf-poly1305` when loaded; the remote server must be configured to use the same method. ## Configuration @@ -114,10 +140,9 @@ For runtime reports, keep the complete WARN/ERROR entry and stack trace. Keeping | Component | Architecture | Purpose | | --- | --- | --- | -| `libsscrypto.dll` | x86 | In-process Shadowsocks cryptography | | `privoxy.exe` | x86 | Local HTTP-to-SOCKS bridge | -The current port does not use `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` or `sni.dll`. +The current port does not bundle `libsscrypto.dll` and does not use `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` or `sni.dll`. ## License diff --git a/README.ru.md b/README.ru.md index 4798e07b5..711302d90 100644 --- a/README.ru.md +++ b/README.ru.md @@ -4,7 +4,7 @@ [English](README.md) | **Русский** | [中文说明](https://github.com/shadowsocks/shadowsocks-windows/wiki/Shadowsocks-Windows-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) -Этот репозиторий сохраняет архитектуру клиента Shadowsocks for Windows **v4** и переносит её на **.NET 10**. Основная цель — совместимость с современными Windows/.NET без ненужного изменения транспорта, шифрования, формата конфигурации, плагинов и логики выбора серверов. +Этот репозиторий сохраняет архитектуру клиента Shadowsocks for Windows **v4** и поэтапно переносит её на **.NET 10**. Основная цель — совместимость с современными Windows/.NET без ненужного изменения транспорта, шифрования, формата конфигурации, плагинов и логики выбора серверов. ## Возможности @@ -23,10 +23,19 @@ - Target framework: `net10.0-windows10.0.19041.0`. - Publish RID: `win-x86`. - Для framework-dependent публикации требуется .NET 10 Desktop Runtime (x86). -- Основной процесс остаётся x86: встроенная `libsscrypto.dll` загружается в процесс и является 32-битной. +- Текущий профиль публикации остаётся `win-x86`, но требования к x86 из-за in-process crypto DLL больше нет. - `privoxy.exe` поставляется как отдельный x86-процесс. -Явная Windows-версия в TFM нужна текущему стеку ReactiveUI/System.Reactive, чтобы NuGet выбирал Windows-реализацию dispatcher scheduler. +Явная Windows-версия в TFM нужна текущему стеку ReactiveUI/System.Reactive, чтобы NuGet выбирал Windows-реализацию dispatcher scheduler. Для ChaCha20-Poly1305 также требуется поддержка платформой, которую сообщает `ChaCha20Poly1305.IsSupported`. + +## Текущее состояние порта + +- Основной проект и тесты переведены на `.NET 10` для Windows. +- Поддерживаемые AEAD-методы реализованы в `AEADBclEncryptor` через `System.Security.Cryptography`. +- Старые `libsscrypto.dll`, OpenSSL, mbedTLS и libsodium больше не входят в активный crypto-path. Имена legacy `.cs`-файлов явно исключены в SDK-style `.csproj`, поэтому оставшиеся после распаковки поверх старой папки файлы не должны случайно попасть в компиляцию. +- Системный прокси меняется внутри процесса через WinINet; старые `sysproxy.exe` не используются. +- UI пока **смешанный WinForms/WPF**. Полный перенос интерфейса на Windows 11 WPF/Metro ещё не завершён. +- Текущий профиль публикации — **framework-dependent, untrimmed, x86, single-file**. **NativeAOT пока не включён.** ## Сборка @@ -50,7 +59,24 @@ dotnet publish .\shadowsocks-csharp\shadowsocks-csharp.csproj -c Release -p:Plat shadowsocks-csharp\bin\x86\Release\net10.0-windows10.0.19041.0\win-x86\publish\ ``` -Профиль создаёт framework-dependent, untrimmed, single-file публикацию. +Профиль создаёт framework-dependent, untrimmed, single-file публикацию. `PublishAot` в текущем профиле не включён. + +### Очистка рабочей папки после обновления поверх старой версии + +Проект рассчитан на ситуацию, когда новый архив распаковывается поверх старого checkout. Известные удалённые Settings- и native-crypto-файлы явно исключены из компиляции. Если Visual Studio всё ещё показывает ошибки из таких файлов, перезагрузите solution, удалите старые каталоги `bin`/`obj` и выполните rebuild. + +Не нужно возвращать `libsscrypto.dll` или чинить старые OpenSSL/mbedTLS/libsodium-wrapper'ы только ради компиляции оставшихся legacy-файлов: активная реализация находится в `Encryption\AEAD\AEADBclEncryptor.cs`. + +## Криптография + +AEAD-криптография реализована через `Encryption/AEAD/AEADBclEncryptor.cs` и `System.Security.Cryptography`; старая встроенная `libsscrypto.dll` больше не используется: + +- `aes-128-gcm`, `aes-192-gcm`, `aes-256-gcm` используют `AesGcm`; +- `chacha20-ietf-poly1305` использует `ChaCha20Poly1305`; +- старое Shadowsocks-преобразование пароля через MD5 сохранено ради совместимости протокола; +- session subkey выводится через HKDF-SHA1 с `ss-subkey`, как требует классический Shadowsocks AEAD. + +`xchacha20-ietf-poly1305` удалён. Старые локальные конфигурации с этим методом при загрузке переключаются на `chacha20-ietf-poly1305`; на удалённом сервере необходимо выставить тот же метод. ## Конфигурация @@ -114,10 +140,9 @@ Upstream-документация по [плагинам, не соответс | Компонент | Архитектура | Назначение | | --- | --- | --- | -| `libsscrypto.dll` | x86 | Встроенная криптография Shadowsocks | | `privoxy.exe` | x86 | Локальный HTTP-to-SOCKS bridge | -Текущий порт не использует `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` и `sni.dll`. +Текущий порт не содержит `libsscrypto.dll` и не использует `sysproxy.exe`, `sysproxy64.exe`, Costura, `System.Windows.Forms.DataVisualization`, `System.Data.SqlClient` и `sni.dll`. ## Лицензия diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index d171f6702..5db6ddece 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -1,6 +1,7 @@ using System; using System.Net; using System.Net.Sockets; +using System.Security.Cryptography; using System.Text; using NLog; using Shadowsocks.Encryption; @@ -49,7 +50,7 @@ public void UpdatePACURL(Configuration config) private static string GetHash(string content) { - return HttpServerUtilityUrlToken.Encode(MbedTLS.MD5(Encoding.ASCII.GetBytes(content))); + return HttpServerUtilityUrlToken.Encode(MD5.HashData(Encoding.ASCII.GetBytes(content))); } public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) diff --git a/shadowsocks-csharp/Data/libsscrypto.dll.gz b/shadowsocks-csharp/Data/libsscrypto.dll.gz deleted file mode 100755 index ff39152f8334e9802e00de27d126be3278ae1264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833636 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%0Dnss&VQ&c=!!2S<{E(rJgf5VcUx5E= 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

^cd*uG8WiJjid6a+%|TFi${S42}K15WLPF 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�T57GNJeWku7 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

kfi-Bj!1$fplo^`-;Q+B>rne)AZi_~q+ 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%0DGmCLdkG}GLbxu`*$|C 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

R|T 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ജ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 B zU2aU0z9%(tzHNqfj2JqGX2#{CZs4QM6t)wXn>#Vxc`Bv}- zC@d$w-PQbsGb^WwLh#nS+npt&<6pasUL5y4K0&t$IxXisVXSQy*~n&Ob29pL5|q!K zS*Z|5{0mq2z+U`*FN4Y!@m*F|;u4GnYFn~PdRRCij03q?CudZ?JT2_p!;+|4ysD-R z2cnUuYqJ&IOn3zO7=$ao(e(p@e5^VA8Fx%mjdkv9xW14ap?iy{M?X8=+@HvmLoMWV zyLimm>3%58Y(1{Qy*%l23=tB48Kp1cW&)t}PY{I1lKCI&S(E|m#VE>{P4es4O%EGK zKnG}kNsT35e!nF)nh2~LUm7lhmS^7|8|cMwFLlwhY;p`rR6ozY&wQKP;@?;oe-z*2 z0kFjo3PQ4+rA%F6C!@o$&sd-GKft0}VQj=5Y}HBt*O6m*yu_x^*K)>uXTCCpe45^o zb(9&~;^b9q&R&P#cUe+~pRh_N7M{uMj38=h+roUT0P^}HQ?VLUg8mCSlj`;RNt8Ax zY7L8rB&hgyt6!>%9WmGbibnwmT(}F7gl_Q0a8l=O&hdSfd+=K8`02`%`}*$g!ROE^ zF)}Mv`aSc_(id{+*(9+g_n#Ksu0Qlv?H%)1vt6|^HPv8PrBD@=7C)9~Tu7m?+f3ue&UrCSbD|K92T|8o$8^LQQ}bjh0_qAZDkVgy9ieCKvY2NKoQn(+pz!L-JN z4b;Xnn+_ypymMtE1>~Cnj+K527+?n2R#s4e%?!v|Sw;c-Zr1^>m9r>dI|7WS@-Jh* zg2l!#>gSbLBBnKCgBl}9O`JS#0(En2@FO%H@$E{z{s=C)Ofm6gZ8|dPkColvl1zXg%@*Dg%57l_1Q1kJ^V}t!{q774cW9 zJxJ82ei*%uz-#aN{x9~XeKv7BN7WKlW?wVG;sD_I83-xaSXT$j_?*N+MX;&nXc7gM zQGs=lHtfO46L01co9Nux>YBb6(fNpu5Fpr}8Nn{V+ApWfx{gyHk#*c_N!2m;#wCss zed_z+F|v1k@AcJ=5xu!i6Ho=zh_2KTm~Uwxkvx-TAbEA?q4vPi*W zD!$iTkmae+0v%ev05I~Sz5U{*6Avm>-gn$9`DGZ;SlN0|>m>$fk>~#qQhTCUuybT_ zNPPx^@(4hM3EJ#EKj8^F-k)x6?{ZxCW z5pWuPN9bfR=;?oCDy~`{#gZoR;>Le;B%`ORPmfqkpM~nPNJQzgNPRlQO#1u@ zf8soW4|vC))6%WKJD|Al^Y!@11qDKMb8i~Zqzy`trew2khEIp7x_*74Yr+a_CVwXW_#xWT2DQY za(a*em9c~k!+RsEb@wNqeC7W$V_)B4Kaerd`lE$iD#^gUh>0r%s(5BXy(0y;8RlHtX3; znN;xwyaO`elrvR6L5BVT?ERuw^zDJXaQm5!kpg_|V?NbqX02fvK`MdLf?ok?;0TE! zM^&Ir@f;5VXi`e8?q?R-l>JpH!<82{1xjJTLgDRU@EWT?MWfMq7|)-z%A3~n zPz3op%QCLckFOhTzq%ND;8%lamzt|a3GEQS<7=#+ChSP*THZ(-OD4>xW`lv~>IXZ^ z?g}@a{ai0h9Ny?V8IO}1eIxJ~*616FM_!{ZACIApzEkiR(&#%CkHL+;06jp$ztix@ zZS)o3aZ00a6dw7FzSHCD3yq0vR1XsUo)GsRy4$`ep9Ir{*(P68)x4(K(zf@gWnb#% z1;tsSV%Cr)%o=hMzr$>QrELFtsh=1eH$2v7_0QSC`h+$XvYl8=+QQY0H^auK zs8&Iv9lxU*tE_m8X{@s0QQTN%Z>oZPC@jRnUv{yqCEMIywlH#37bo@K{?5x=xpHF* zug~cOut$wpZ5I94t1A)l;tTkxlhM&%qPBlu*O838p|b?UuNa`G{k|Y8FFb4I!dVoH z!Kd5j4O!HA7biEKAez+(6tI-tM8^D(4@vR?fhOaK$Yee5;GFYH6kmekO;>bW{b^RS z`s@EDHO~PFS*M#>D>-ZD8$Gg8=~n9Qh>dk4@`;SY!2Y47Q@e!S&36(N8B% zUQ~886LL+{Y$5gte5^~=Sm~u28yah@&4-+g)A(@LehT8mJ*(1>_Q2ja4300H)jsODl{647OpP~a{vE4$ zaHN^XA(8p!A|5N=L=<7>Uey0U7U&l4l$ULCJO&$snyQZBxZgD880T-aHBPqH+pNPG zx6JOoM=JZb#||ic-+ZXf&~jZ$HvYj>Aq)T4;$7SgWggsGDgW9FZ0e>63vZewkwtFn zGYB0WD_qbkdTCn)-lGw&a!q`9Vbl{$kch-p2jm7(#T=iXA`uj-Jv4X+T`$yl9)Pv} zDmFaX{CRF-N*=;ae!$q;{G~hV-)w&1!o0+_xg{GBJ|b(=16eTY-n`S9b;Ov3xGA}b z8z{%f__}-mN-W6D`WIdHOE{JXpk?+A@qsH`j~-dQqRYr~ zy)cFv+5ELLYj0DfEn)Y57aJDon}(;ZMo9)rQl?CqdE^dboPKI7rKNRRSWJCgbCE{z z`2_x!LBEGZ>FZjsWmmgPyzrWq5Bj5&6rUD9W}AN%E)RAC@Au^>x zt!~eVjO@|0Rj+f?kUNueLp9>n?>P@3(Agm3?2)5E=18N8R+lmV^YDSR`>9g80;OKA zAPiE=njr|fAiz$SKuC&A^hXIB=b=%?f+7_CluZgLoF8B3z+HKNw3C^AY#f4(im`&~ z0ykN*5nJ;3{6|rdg^%*V<$}mpOqFj1R^hN<#5t7$S{coFXyuFqobx#{zQ*m3EZhcq!jgRpsFU{cuRdX;}r@u%kG_&pI{3JjuT5HN%X~^WfjD;{e}X zvKW#ZF#;!yp=)ImPYFS&`4t>{hi z{vL(c}o7(G!D88=h z)Ly8)8?^<^0$dB{6HgvlFVD~iq5kBn`LS|_1f)6}M|lA1N1=BjG$ek@aoOsaKeva5 zi&RvHdKj^bxr!K|MQ0q&oi{0B$8F!_f(*?116+PIfLuy)JBN%FeH2 z`w(K9wC0i>e^Xs+O@Gs9R>!$?{U^ZFnn15fqsc1)nLGo`tY8%fc&|ar=;pVnCOP45 z_OwKv_%Lf6nLKO0%IF7{`75ou`|EHqSP~FZPy?-zx8elkFx{r}(Q~SoF940bw11MM z*$pNDHxqPOa}!QuJx7)toU7g_CXq`#_ znoO)i2;C|C4o~0~GqHs)!o@9Cvk?uoRBW(2P=;|WhAZF~z3p1#VfjpuAS!`wbe*^e zMG!2vZp@v}IQqFCL+{n$uK|C1@I4UE(fDh{pQV@i&)Vz%^v`C#*&XU7WCh zZ|V>DhxL7j`75VyShT6Jd}IQT5g!sTaMGwF;hEW1C5?!=0E#?M+*gJnIh)e@9EE5~ z!|Cxgo-kY|1;p*=q&$bMAO&OV97o|1q$4UDLhv6*EB*4;jL6P|%$H(gX)jrTGMjuJ z?>EL#*NnsAx{x1k(8QtNG7+OSmI(l8)_lObb(F^sI56EYz{vtDW7s zX~1?{rG2=s+1NhmUoGF*;H7rA6$)>=YeqY|Cy4F|i<|cyNLsIQ*pEt=&4r&NKzWSI ztnbsUTd4d00=}g24%6)M!&X=II|+#9(dd%?(4AyE!?mJA==u{>#n?81r@P~lb@ z9+&eu>qWdsC9&uBIQ?j84=f42ZHSkrXJ}c&!b&#@Vetr&XTcPk}DNj3a2{ zPs7M1#h3?TJgMpp4*Qz& zIdK(ktm7G=Q{`|xBJ|YI5l2eX=NKJ>=5ltA|44zMnp`06Ywi2qA+RkKl=B z>BPMIPS1fpW5OveAJ5%r#?2zL1vm1TIgoYzT^-59MD`muTXit%h4tSj!U&+6x1gTF8Ew-mB{IY8N|ktl8bUgF6t4zG*!*8IEY%%#@YbL^!yE% zkl)kd4)foTtL3=!!ze%e6W^IsEQO)b%OX>eE?Oz&nobrw{%YD4iw=si!E3R39;Mg7 zbp6F`g6JP~*m$i;5E2WwbeeYVqmF0^BhR~J{xmyAA@TH1O2~~@^{wUg|4sV&znZOh zTtHoQL0B9CLqXon`3@I!{*JbcSBGa z!l(#XuqS?~D>m^q+xX1-)8dDY#>#Iy*E-&3tsfFUbSyUdwsURceYW~O@k7bjh}+J! zkN4S8P>>5^N4Z?qC0rJG#EbyjPokdXiqjS2iSKgNO^K*O0kQTF9~~}0cbeC@m#?CO zq-i88@_Ot=Hc^{0F&!k;k;VOE%q-@db3d|6sNPkmrJ9Csf1m3EFbP!4_xCL#+;qCqI&{ZlN~U9M@*#>305X z^VS~g=AXEn=l@Q*|M}Uej5dz#JyJh1@--} zoLOMwgXc}nkq;e`X#N+TxV-pwSC^(}UPZ{bDmRR3N;oKb78u9T3^KFuoSnpTC3*b> z-qA#@p?-~niQe;Jx6Y_^7#D)vV@-u(F?vT=(l2%2-+RSW+^j%)E&VKB;czE=h%v)a z#-pilw+e^7<5b`gJCR=nG!K7<$s80dt>!xa3~^B_gFpHYGsi}|w0;}tX=Z4Zj9}VT z#syN5ciY*kT_7OdU2hi9K!HF;V)|EX=x0{#%OuUm^2|3p*P%qHora?kTYcu{_T??H z!<*Y*qBKT}t9tG7kD4xIww$Zx-{`0^j7Q`1HkQ9-uwxkpi-y8DF4?@I6Ukzvpw&X^ z5n8^SJ7y$VYpB(RyK!Xg^^Bwmg4zzZIPf$R{Y%2F07m(wwEAV@b~}yk2UcltXO{S< zmBzM+xUOk#7Ajc$*0aj&%)cRA83Cq#R*s-dPf*PJ;Z6<8sFdlY>y1qIIj155-JCql z4!{c2FV<;gvgvHCxchj;#>p~E72trG*+Zcis8PsI`UnhTwUoI9xk$W&-N_@g4%qED zToWQLT(V0v+NclSwWKL4{9RdtMp<=r-76rs2-WZ&^Ch;F+MMbUym`#}UHl^eW3`ki z&?B&f0x|O>pj0b|@;y45dF~s@WO@^o1&pvbK{k?P=;`i;2xBH?rTl+8Fd5<7iqz!T ziXb^t70SU-wu9$GW|>3J={ty1l?CLeh5QiqML4}Vg@aR&C`7sB zXN^2|gl2RF9b*;30{Jvd!d3x; zq_GW_PkJeXPV5{Ww_SXhNg_7!Lsr+VH zp}W?K%aZRXeD#%SVXb0TIJHLKMlgoD*rI!2;bK<4TLKH{t%SsZj{?ckvgBBld1

    -_W^5}wLq%2JBE-9bQt;%NW?KM=pnCcdich?X>(GdJB#R8RSr&%n=M zg)BV<#L8!M>qaW&lE3|pCnJg$kKt8Q^mKYvw)3HXZssbZ`4M8peestxrF2ftrXRv$ z*&1HLq;VVHZc}l5(G?K;j~+<|VBZ(Ne8p9w-U`Ghydj}>BtZhzWJSC`*U71U2T}0> zVA)Le3!>1G9{E<&c3@FY+juZ*f=FsGQ1Pd)n|t0pJ+p+ zehd3!DnVV!%3@lAo7A!*eBX1Mi>RtlyUo3z+Kis0RME@B;`-P0c31jC-4Q#9YKN{n z59zdipv_by$-(*i&=Jkhlkyim?_->}2}qVeFaEQKHTior0)*v{!28rNLHtJ2kqA2C zyXA4lDvvYG2%zK4v94GZjx$yqXO10>mCQV;I8#Z-nPbV=Npzg4w8sV} zOD2kIWO3fkC3h*)Vp962`}vgbKmNnrwSY%aUE$sACRvieY#>5VkO)D6U`2vT*kBVd z0mR^jn1n|YYO86wT140-q7s6WXeQIGebJ}3)@oa;ZEfqTDw>BT0Tdx9@)EF8opq=N z2xJK%)Bl`1v)KSXYQKJ8zvlZkGjkv3+QbC8f*X{>f5xg$Tx zyHL|6^e;r-GO^lC`2Df=>Lh)>xrWsi=cHWOYJLhVfEKiP3m0mCiOO{aW#NT9x8se8 z)hTjyij6d&KwMi~3=eSrp=umRRCO6$HEWSbD%QSo5s0r<;J+z1L8j}&YMW&aL20HV z7LCGf%7NAk)_&HEPImtszm52%0_FnzqU9}^*{Qufo*9GpF+m|`=>3bsM#R3tr8buY zSJ>G;JF>so>Rrf-5U-s!UD-#&yYEbRtz#{CCFX&cM-XD(z|ZR{=xCZ3*+@I$Bl^L- z<1_E)ZLs&~|1c7*H8{PA~zRtI6z&H4JeAsOoL{dC0`vAIL{a7i#1l$5JE-{=51s0 z)vbBse07|EI4!-_jNx`GqcvFuc08i86=^@nj>rbf$=~i@%=@Zur3l7(6-C$r z=JP0x<+~JKzDu?7W0aG-7k!wkc;}B7t9VoK>|e$6eS_h_U$7Ec5Iom<-sH4_>v_Du z##w10qa2wl>#dMdZGj@z^?s8c=I2Xz;;u)FB}{(D`HM67efa1B{O*Q(`(V{H+J&}^ zpo@yVFd7ZsHpMY#x-b%6D1dmiHR=63QKb_vBv%C08TMtVTT}m^D*(S65lq5efpEt6<2^ZubHsOkrB+#_6GB(;WveyMRGo|r_cM2 zZ;Z0G^|9_g%|_azv;ZTW5@*&b;{Rmlaf5HJF0w8*!WE7@Qi!dfa&w2!jnn68q-W>z zov1Vk%qB&gq}tbjOs#U#XmfpP#u2r2RK`)yF)8?_xVZclY!%}Q0lqsv&C%>=g8ehF z+A)rU7sckrz3UuF%o!H3I3{1>?dN7p@yotR(>pOCfPEQ`|L!O!lf#8C#K4 zxjr?}gkrSK8O2LJ`|r*pL0rVJ-Wb~t3ngy6z=Up8X+lZ06spTI=n#Ce(9t5ijM97m8w~}WYO4sqf3=Ank@EHc z|BLM3-20}`r`^~eip2&H@}u30)WvBuxpoop*AVgh_yk~PqfaVi*RuQ1M+H|Up$%wn zk?dR0cdztx(;1{zwNqR|>T=9>m*6bNjc*;tASKAZ%I#>KxQZ{Lf>W%Lj6TOls>2gr zx6n&8!32`-45&%#C*M$B9;!ayqF^eVug(^S%T^`n3gyCX1`1AZX2nGSAG*DURxk+W zx(8i6(ylszIy6##_e5 zRn!FOL@V2vep;Q!Ql&4IX@#^P*J!^40C0iJd#A->quXs-qnix4j2prXit>NdVeS_a z4N^+fRcWQz3*?1!IlQK-65D~VP2%mqhw!j2SI$o|WxmZC0a&N1P8I47nz|$j2NBC% znVaC#VV1hu?KoDGJtQGG$1dfy<*H%N=DR-@DUk^Rehlo=*grt@E+XuOQmrjQ3ocZ- zZN%Z8tE;c5ya1^yM|ny9Unob+?BVK>#)S*5NOJjonJk8`au<8oG3$XCr8-Gl2pS-g zD{Ubn%2S)uMhu-&k!Y`d3vEG@xv@S}9YXJV9KyiW_@zRl#C|Td==zg3fUh3y0UK9N zw~A4u-FXknsPW#fKbJbfOiouq`<#W9Gy4-3BB6C=AltLtwBDrGAO zn>Z_dY1%CtqMX!mZ-Zj&f+@qK$~-HnR~wJqX5Uwqy9PF>5=Uxri*UhMd0l^|&h?xr zU5x%}8`N*J@t2vc&qR~&BGGgg_>cBi=MRtGUtN{1`G$+_)meCA^}!;w+4R>Sn_Qg= zn}buQ1%L#kQ}cz@XSK(RvN`fcc?ptjw15;o50J!kV-GUH^k8CjDrJ2G5mwf9uM#(z z<)l}$=v=0q0)iSg%Yq3KRw}Oa1&Xw#BO`ZT&;-ayVRNi7sqULVm}!`mfc{>4NwWK4 z{9-30yLV4acHfNt@;1JIjrTv`xg6mM`0dBLEy13^f24sW{CEE127bo7=>MRo{YT%W zf_u`mi|*;y_b&HM3xRHl3<=Tfa)DRk?f zZ$_juK8y&T#{{y0Q>79RK3%pVEn-B;D{B#bh14^bWp7xbR;Br_i$L@e!~*j(Ma!kn z1>&ckg+^#OmtQ zh>4Z3*y(YI-J+v-(iCFmFis#>!$-d|FdJJAufviLp{=r5`n`ITRdq`8~Yd=F`a^-)&b z+7XpE4lKwj0U?7AhoBtylVuiB;Y(Q`S4ER>xn+r)iA=k6D+2b)^d0e+ZVkeg@aXsd z)NbmVaGD7cxuEm8#2QelSPGw9s!dH6GUY=dGDyECiSoR8N9Oj zg-W>-ijH=d!5%f(LEd-1XJa2?>Ml5!9fdpi1`z1owIJVxs4P;@RTLS!JqM)g50EGe zI!7|i?>@h>A(H7S%Jc*>Aw6<|m5R`LinT$TjvHtxhmN-3?mdbKh-+l%Uqv>%8kQluQk|NW@506r-ZP;ixM)pJU5*ehZ2*Y-W`2>!S#1h@X?45SY(b2@En-Dt!iw7hAkVPemIW+!m=;p z6f}9GI?+P%#@)x!F+#`slZzJ8hYEme6S(>A@32`E4pygWS;L};yhuF_ddMI2mKJ$& z{}bQ7194!)R1dFt@v74RHZzbkAFsXqYM<{p?H?KZ4%htS;-E7NM{80cu33@AN(ZFK z^({)A&JL=H0zdC%Dx2j~cSU;p9p6%~CSzpbY;uZpJzh$|OxL!8eIdStJ*VgDGfZYD zA{oX6#S0(c(2#JUmMA07U3wYAl7| zt%b~m#oFeC0kf?ZYQpMc`a9~?mP+x)K*9RhnrM|Gkd{^L_KzXbKl%M`>*xZP)&z)7 z`iO;3+{#s&5T$;%ScuXpcMU|86NQNC#rn(rG|>%Z;~&w_v=<#E>_x9XVeMAc|Ji27 z1rGVJFZi@OiU%)O^Lg9v8vrt3fWIHS!{aKqeT2#NpF!F}8eE0+RL}PBaXkq{Izmd2 z*UZ5EJnJ+=3EgPUh_VI=e}dKz^&ccAGMC{QnG&^#GnAN9Tzf^bdnJDF;g^P%y9LiX z@p~EXrFhz`QxG(di2v{W#YN@|b3}{S62N{R1^TB9lQ6duf+K|<+Eh&7V9UvKh3h#_ ziT1};k-37oI@~)%tPZD0(W}FsY~ML5;Y|BZ*i%7l_-B9f!%nseFwo}KZW2+RpJ+yuA_7Au3O57Ca z>OQ8nci)tr@;&@>JGQSJ;z6P+7oJGC+LeJdfD5qehNlb9r0zZ4yW~B#rOj?zls>=~ zh({&&rKt;XaBkG!V$9Dp`W*Z>M^tQuRNXipJhW~mOi9*BGR@47NlO}GHxWohqVuM6 zqRX0BCp^!)^0bzK?^h-HB0Gb*!Yxv?O7}<{cUyafwCac*|F+vkZ}u~*Zvb}LI~T6u;U0j0xBJp!?x;i0Md&DZzEtEFzj*Sr6aM~ zZxV+_Z-jIrYClCCZF!!T0$ovck`Jd*y`^X2!K26Jch%nWWz-=sVfUq9#ZyU1=hbqq zZZcY#|GU{u>zI5sNQY>(YkoOY|FJJHhQ;*ZQ^YLl@dGqBaD z!6ujuw)!&pq|-l~-6U!`$RlccCEoND@jeOfB0ddo(XGAe605bP+9^OITDYgrg3^h% z&<42d6X2}$(f8e=y-WeXj*nRY>>^Qs=MFuW1OQ@g5aQts0nmxQpNbR^BHizs zGQbTP5br_S)%FFM9awFpE?=bXD=d@`(GF^{dJFkEcdCcw!xNzG-vxOnJu4{%;R<-g zbzy-%G#AAG)mPKmf0gu|4|(hyZ%DMqUOuxE&#G9-9j|BjT;OnI-n2w|wh2Vv6;mO- z(iorF2uS`|M<2k#`(fbkY5{wCYGxP$z|sn7#@Ay8uXf4JZba+wG`S6oAwq*G*Q)cA z)E=zy74$}BnyEHLeO)HG2T^)y@a@@maeB zMwD*FLEC^bOhOr?36MU4Cj4H51i)UQQ_Gp)qcPT zM&Lbgo4TDzYr(r_0Fkbg+#@7+fi3=IZTn<(4|zV=Azb`|@Owb`y*6q1Ug9+M zi2Q~jJu^~nveShP-Axi%W`Bf!pIjmNw}B{o$dTF0k`S(YULaDA+qM1_Q}dEz(rv`B z9Z0(!KO*F2feOv7mx%Qg~C-P^cn&(qBc2MFh15LcwaI;l`NSL;eXA6f@(Mz)KCe4&+L0s4(Ov1o#i=k2BF4nnUfc z9yfw>45FaghW}@uhbW>er)i>-xwqjf5Ub6k)%b@uB%rKQxA<3*^RTHRH1MIUIadxP zm#^=+90%y(b{x#KI0l#dvhZ@}zo{ku4q zzutdPy|x#r$4%A!Bb!2Qye8o_MsHshoCQyH!C8IF=>KW{-;4h$HeC;wh5q(-mtnr% zs~k6c?#lMRVEU1(bm4*qH2`%K=l4mk)qbvZ!CTvK8sFahfMWHWmyLC7f;x7{abxjf zPa9nZ;@>IXe8>i8g2`hMNHP#tdLYwcY{>==wdM8FT~}HniTPG74QN`_z#$}`M9D>| z3SpCyzrBl37W)^-YjLCbToeUeqaiLIZFn-{h(1-t{R+WcJGy^^J(mLudOcfLkEqF> zIuj;R2E+@GK+hod!7BxNx?qQCZRgXoP_*E@%t)J&)<9j<^NF`D1 zFv=NkvxN=Z-{P{#7ujHlQzlB9**HDVRiXxxK%}2G9UOxpaDg*%`1*HAp-F6_oulUU z3j~-r`C{Ap3VJunzfkre2Hp+ym@klBZ8uTN@7m=}c4Y`)m=#WfM2WUqTXpxEdwRl#C|nVu5=6gX2eJCFzX1`WWMM+<7P2H1PN0jE$DCDov8*fCBV zE|P4{%uC5E0Cd#ka#+0$zkEn$8w_^B)VeTOkW}c^ z=+st;2*KBN;1w(ssm1B#(0~)vf>DVDX@Qvf1g4UUIg{zbE3X{0P1%? z9rgA7s7Z%SC*D-ImTK>O*=7T$xP0-8Lb*;_>36GJl{^hwwna+bVeQc?5LV_27MxTH z4h9P}C9qE^IHbp`TeSv671igRl%8qyfmiN5&}F(Od9R`1q+0B*Ie97Wa<0F}g=*s6 zA6s)WgOF;4$k@$`n;~}JN(147vZj_Ko{U{xY}j|YJH@-wKdPMYoTd`M_H?>d7Z$9>Y!9g zSyz2oU+_*B!Axz<>$4;0%hMtyn&ST$sWSIYFEel@>wNjWIJsqzQr6kfGykY!#MRv z(DXjrQq?BRpjF!pmsCdr013xOB@E7TdBTBoD)<<+tV@)Az7`W*_>V*t)h}A$v1b(+ zg?K14s*)VM}(NKRMg$cV*w~AC$c!kkn9M=m43_K1cK*)j_Ad5{JJ54{2dFj{@4qJ z2>gPu3DoQesOM|eo~Eme_crA9p-&Dc0=Fa)f&Jx3c>Yu-nIP$7%Mf!Lna5zZlwGyxP4lSv=qeBwJEf%nNj1n{MB9a|> z?vl(CkkS~%l5peE+DG>6sbRkYu)^Mhujw%IN-(i zUC8ZoEP^o`6)srNsoet24YfW@@5>TtPpFozfDSr?Y@7a;S%IV?2ui8}l^y$jYf1uH^WUs&~-#}Qe1(r3yI=enjKIITtW6v&g36j*uWl!)=3>I{0?}KQNp5iRbY3eg{ z+Ja(UOQ7O~Xgdvn(x#AlS|6wV#YSTr_`&Im)g@@G->?FP`r@Q#hO2KZg|?W5OfCA{ znyV-Ja~k3hdAambdoXvK93HfKWH9%aa(LwG+v#p%5XXb=-M9HQ5ern@`4P&oQcAH~4JTpLFFKaPBTk)xX42>Xj)AV|h zV$y~tTwMkg&{X`+j9I^lltg|1IU-0;(_cMDgq?Cc0hn~xWuu}02Cs6O4a2jEz!!5C z@^@=A1K+R)B+Oo|>^P+%a-0!y>=;u2 zS&%>Mq8P}KvtrgA;~0m2NHxBO`rVFSHGV(F?+N^x@Y{*sLHv&3mx#KWJu?SN5aw5- zuVVRlk-By=`FX)6cK=RG?RjT<-V{hn zC9kXI)TLOg-YHorFfrK`{;2L>|jGduTpjh3I@h$rC949+P2Hh+pM9@{C>HIIm@s+r4y{b8 ziuDv9TpcTKaq6ihg+^eX5!j`jKxrIMmX6XI-A)@7JT*fMmA#>F@Fb;|0)Gkh2fhdb zBaFbC_%;IDwAa2w+6eSSwNuYg*M_n6s;z40b^@w00l3skG zB?eyRZ|=0cL^EeS_9c=6YH_DNgks{m51<^~`_;E=*1l$23LQJIQGSRgL13=6>1fb? zwL2cyCGH$B7AEcf2-B1jFE%Kko!ZnRu+~*y+g%pMhU2tgzROrW1^eQ2`OYt#ovPH9 z^6LcBh5VzisO%q6Q~f2I-}$6nmjFrK>eZG5xgImMaln{McskF-^G;dk06YheM(`~E zR6L!8XXZKZjKa`(1TuYk`IiDSVjL<#l2X@8=+nGcBJpEK>wK97)oOUC0sKj zx7+-QK{_6Et9nPT?!e+CSo0!^b0)SSYJp4hO@s#O!2ZQf0+U1o@{6>5qUKMbM$Ml_ zoLQzRYkSdL*q4pNS{4T7%#O@WQ1ufLSr7&f`V&0Goq#TH2FgloBrp#i@B(E97|oiYM)2plx>9J_m*0 zdMiTVA#X8-Cw)4F$5|8}Or&s4pdM18IJ9rS6`}F-XVdr)G@fW0cSX~2)UBWcZ;R;_UukEt=FD9u(b0BXp?~oTA^B0$MnoHE;Fs7;|sUKic)0L5I z6puUv{5bR=kxWoJ?o%nPS(Hv@O1sp&Lz$Z@6xTUuU4$h9t?OdGLEx0(KM$iPq`uEp zs6DyO67T!eh(;pkqAhZ7RlU79B%h+qdo$7&_w1my(33Dm8@VfRb7IVs_OfQD?OfT0 z_Gg|5$7ZA1Sr=1T?-{>Ay=I0?!Es9I{R1Gl7QS`mFLK ze>~WFkew4L)l8ohaOJe-54Yn3 zvo6OZG2Oih^~L88@QH_gGC%H`AR^}=@|Fb?VDXYR{Q-Mp5j5QIe`4`rxkVfh8j4K7 z>mXw^dwo6}+n`uQn6c$z!(l71Yxx-b;FG#$jnn3LsCM}Eto$X}+EijowsIT&n+#N% zdpmBfp+o^Q(W8+>bBplr5lWLqju%9-|5NhM1 z(6cetx&tSss|OnI!415@D^P35skxwDL8qg+d$+=)0_=U1p@{0<1&DGuN0K}FiU|X9 ztuaR%`^)17(nEB~jgWQ+)n<7cw3$On-ae7Qjs)Y{TJuiZ$L&mP4mj$|PD6mJ1&7A9 zjoX^o^k-DEVM~31F}*AmzFz^LcpqYrw4uchQBaSG{iXn_?!Q87nZ>uhTrg7@F4FB# zkdX~#Df-CiWhq#D(vz_UkQTb_oEzwo%D z;A*wK<_`3vVcKG_p%*$Q(fIxkFhfe#Zix!I4ncg{XK9o+g+76`lGGAfXP92(M86Qd zVuWnuRApgMkh5&7W7XT8dQ9dCIm?dsc`m$fs#%+2BRPR}1oU2aW}~BZAx6+bZ|EXw z__n5xW95Tm&`80mKFGa7T!r~=tYfoU>{3&nN5^$s^Q;qnL+-EHzd~mcnMs6Ib)IEW(y1i>+GWV);a7@j!Yh?_)R5!YUr7oOf z*sj#Qf&>}6agFYSuTjP}mr{2SFPPqJc$1zdlsb)`o0PiA=*G&^hw!Cr+=u^I4jioR z3f)3i4RRv+>_GmG)?Py87^OTV%JCq@&sMlr z3V-Nd{ye2QRCXMh&C-bMI3UPR)g*J~CMyINf!uN;!O@vJXCSeqx*suZ;Fg6pQkpV5 zd1d0o=K`}{V*9zBGc;H@KjGKb=#1x>4TWk zp!0I2jtVczjzVjHUXE>?)~16oUX_!<%&qPfWD8=?=v`cnDN;Jx;E(#Js1kBh^X7uV zal!q4?5g=`N&)N4^T9%OhXF%08?tudBlKVlsW?NcJ(cc(mGfd0e%Vk5eP??HM`g5$+3gurpZZx!nE(2PT89G`9 z6=%0}AA6r7TeIb-!AX7__Nhy6F`xMw$5p`In+)N63#nP5Ep&xZb^vGOCXc(WT4O-fh3=CfEIy=u1EjX5aU!h@URO*}BpWoQM^nhNRrvpI6FdmVTy`n+YB|OUmULLLgA&XO)%uNIcR-M7wkkO}s2Y-Y>#|+~f;U z7i~ic3GxWdLYw+nTyE$WmvKTID$K#+okA_~*)GIqf*KZsD-N8UQXa&cB{n;t_iSLX zX`qmHQg9ejkcDTHBEFnYMug{Umhe0()wQ$mWH}Tpu?sk%zw!hJ(wHTNy4AYOMLxO8 zU*y?LVl!xp%~nfna!M|&>b$4>QQ!dAvB*SHGXV?BToY=K3S=xUe}~oLX@D)&_5umu zCtL8b3Sq);%QP%VoNbtq3vo$#s0OA&#x>3NbW3%E*&bKfFi>0$?6;?GV7{>=rX?=L z1CkX(F4x}k|%&* zHHi4vlur@Kq~An>_Azw7KYSjRzCD_ySB*SZXABh?q+v(b&3mrO{h^4&3-o#_o$)kj z_K~fvUwmY(QG6$vuKE_jl6k}?ZNwT|jvj*v^?ZY-W9=#{^-7Qj)8G>XNS>H16!nWJ z|3=nA_k!&oJS5cp2fy7z>OSk98)=q+UJXs3b$q9(%-qXleu;E@x?OzZcaf$0eGrCT zqg6N+aJY%*t91aPKwZCp8&TvamCBfA3xxWVs76OXq|uQyLYEB-xxGY2QFN&4%QH8j zjZ)Rt%oAYie#pa4 z5pvaSXO=u@OytQ{-n=*izaz_K!kqf?POj)Om&J zN*sbXm+~OJMUOREJQd{e#!}NUK0U`H&9i5YG~;Qc*>+eEuJ+djM92@W%2gxMFLli62A4MYgwf#^)Z_F{oG5KZnM zh$6yBmlyAwoh%_)haV^*J48arN!H;P3OV`1FDfUGUl%1O z1!x|CKzSa_vTSQ(GVG+f%a7hf98%s5VVbLKpmtHfAM_vTdFsk-X9~$ZUwmcb?Xu6i zvQbta5t1FVNJutI_x*}EgL}4ZfKHF%ouSh+k7~!}i&jASNn(lGsQf?lF{D=(iv;NP z&3Z@#LtY-mkOIsUgT)X6gpNs*aC0O*3K4uT^fHQq^{Dvv6Cbv^eYM*B%$eFuTdGN%L>A7D}3HJ0Nqp-a-s3 z7>O-i6LBsjNN;L8WG>_}nh-LVLQF3XXh^X%@?2zT1R>Ef7pn#ziKP*W2$tFfl+bRH zxm;IWl^-SfWuuXlHRx_4(PNPnlB2vrg6!rB3FTLj@@&D2p~6}r>9i8D@XZ%%vnt~j zSa3@4A$cPs_UG`D2kmD7S+a!;%On;uBm-|VSnB))js=7O7-&R(Q-U%j=6E&=Wj)j< zByvAD0l*n8baJjW13)uzKQ<*Yb)j=DnoQ==;3;#ZfzBtZ&J84yBV@nZi&3+ypDlKE zor$zoAdN;DI>{4=&&)b+t|fBkv&cni61hmuB6k%GR>bUuTJe_z6HMMMmY&dj=5iB? zYK{p#SeiOWg9+O_GFq`B@?vzCjTUeELa<6yDZS?^=EHM7c`ESR4}|?&sPmX5WMISL z%sio|skJPI&z={oGMe6xb#&HkLb?u0$3;0iU7^wR_gKd^97AmN9Q7F&oEV4hLEN%T zx|f{kSj>bypr(&veQDT`5e z(iUYj1ye4}A_(Z9ET?~rE9h3$*R}9_6W#+ZGEjZe4uc^wIWb}yPg5c1D9N}7srWlIHP}wi_f*D{*rJGGb>0FK@f$E0;W`V{`gc`PFp!4lEEv&+ zj;L-u_Bae_YBsiTUtMAs?Wi)Xu_Up_9DlQ;SQ-J$(r2mwtMj6UUki>97?}B)E3FyZ z6#l}ZUWVH2>0EsgbCt(!zzbN zR@wLe!zwVvngzkm%rR9c%lf3x!6b#VS?&cbk;BtH?Z_mAZlrgZDlJ|Ns&E~!XRGk? zeLWACkQzfh2daih8(YvIEA09($Qnu7*u-DFgWQ^?^4=pDYhFet&Yh0ORHP#ZW-J$0 zqkS2eqpg)kX8W+W$F+>x4nGX>BEW_N*eyu9YVC1@=xptHsJwCkqfT0JhAhe%$LlZV zX9pT!!?ZrqJ0OX*XOLNK7tHPm5|Cj+4{k&$@95LxGI+R*a6P~8iju3P3k$WC@9^%e zekqa(9drZlgmd~x%EF*n!_n?P$Xo9)Aj1uRuP@cIt~vA68kXvdU2LnKX#`igrq2aC z;atGndGfoX<)&0eQ}9|BnG4TyI@%SS)I8$9f~?n9(O|x(YTQa#6;zFuo{0kr>5)^; zpEiBqgyq2=`CDOUK1QA$x&tvl0iGWW-gomsJ^zuZFox+x{9(2{<0DhFJ&ld(B3vM` zFM5lbx2DNv^?5pZ*zz1qRI%&RBImm8YM~3J7&wnoqTZeaix79#?I|l0t75YX-K(8b z$xq`TZ3uN9%;}7BY)bdFk8Nr}V_xg>TuL!Wrm4+1w*hZ^+b`(o z?ijbt?>dp3n-7&G3_zw`7|eVFfUI9mMrE4Ke+iun9x7|`fe#nTP1k58F6z)a`am~4 z@2`GK?n$EqC9v^e+q>KexGZWUhVbePIUH9F>(hAuU^(pa<86?CFb+5yx2I{d07Q4u z+fuxd-{tAK=>U^6fEHtz76xcx+K>gyUFsHX^dLUq7E4DZzgZfrPQ^Kg*IXRtrm!2x zfGdW+{fUTLyPLEj9BHoh+tlh6f#CqLm)8m*|JXbR#&4;ltc23y7ez$N%yhF=zbU&b#Fzj^pw zk6#9UH{izxc-oIhi(UXncw8f=KbdGPIAd#h=!G4ILC^VknmvLtkrPO;CCrFn(1SM@ zEQ{6G23Qk+zcpe_T(*r~CzCZXbH;fQW8y@geW8~G4Cq&G8D9cHDVcUw(XQDxi=EDw zp2?rQ(6h~-KyiI>X#Ws$ip%88^CYF}Nv*iA%V;Qb{moWG2WfUx)FpWXgzD0gV3i9Q zuonj*Pv$PN zFR$Pwo?c#P%TJ>ae8kT>$tY!kOCS3wr8eueR2b;zx=N&H z+;Wdky8jhsf|eE%)5upDg!ON_A}f=(X3(sDwFsV@z9a8aH3AtGos8 zF_w?h9DF2N5%l4*KA=uC46o_Q44hYUN6b_L;y^f33}T;PH9c2y%ruTcaDtf;F*o@~ z*7SVSpHkCvn_sHw3HTFgdhWoP&YnequPC>>^ydjttd(Bwxz!JcPJRq7J$D8?6c-m= zqIm0rt8=SW9cNT^9Q0m@cOeT$_H;oul%%lmAj#ps5=O!eF0B1toY@G1PGTEi*zM-0 z)aMTux7^|~l=}R1TyTOeJt(Js!FdX^1a;s-S3^v8Rlo&x4;Xb<_H4g1yC~pn%}uvQ z&Sn5HRMS9buw*h!?O+Ce2@oYQq6rK*jgh1RA>mc>(c)}-S?Y5wR(p;;u98tQhVG{N z0@@*U=AZx^Rt7_51uqM(N>i&{HD50CR}`7`@h_r-vNJtx{;Y;O>@`N2|MG@K#*722 z;~H8T4m5=O+Um}}dyfcj=dKP#SvTtY8hYsl(XTtjT(R4LyVi(9;!}-$V zop4eq1Y&NQ9FAe~K_WQ(2{c~CV!Vo`sPs&+i@M?F_3sKO^W;t8+{{M6&e?I$XRCEi zT?9pe0a`*7`sGjpIEcqSItYj1H3sJ#qmLUVRE@;w{MNn6ZjRtnZN3=23rRbL4~dP4 zYsRk)KYHK7KfIg2H=@E#>wmXlDQJeNpd~>;s~WwM6tt@04S6&hlCljbB7>xt8oe5E ze}CE0tvzvO0Q~zc|YWwmz*?c-)e=FD|TaMQz5;yMU5$6iW3<)cp%5b7~m383sMH0 zmMBqI^kUgFMSJhzNcl!_`SfdR*1Dl$;m`y$bH+@f{!;okX0EA-Is-e&z!b-9$p5{5 z9)IXVD)6kpODu?99|!J?oQ{Bt3^tEWjkt^;`_GCONvj!E)?)hqbdpad)BR13N|%I9 zMcZ9G<3@X6BAoDyZqnRzKiFslCeOIh5lA76)MjVxp+JXfK&{msfP+)N?L^(~W|F$_ z)Dwf#F97ucJQgA2uI}a-3V*0VMFip4iqK}l@hWiq4PJfpTG6Al`%>sQxXUwTWxRG5 zy-(4W)5H0smhctQwmh} zzzOo31y&%BI@tMp=mqct4o~Ivt`FI2u6_##7HWR<6Wi$he}2#o#q#py#|;dQOXZ&U zy9cd%ex`9-&JU{oddsGplsL%I5@!wu#^^(7SR*eDuI+r>XMgFU>Tij zi>HHr+hC_uOm@I96ULf;tYTLRodm&`RH>26pdqo8iL+f9VW6`+ zXzuLNS9p5<#om>GMR8=|9vEOaltB;?iK3#SfZ~k;4hSeJAOa$IM7iXU%Q-k)Tv2q@ zAVw4K6OBoTcM_v$JirrgJmS5IM+^oxqCrJtVEt=YMrqy{@XM ze%)QIoXqFZJiNNY7f>4Q{7h>=#41Ed$8fQ$DXOJ`=yDK+)EFXLoQo-q3o4*eln`D$ zrvwQ@t3xcNiu z@%IDj_=nu=SqV0HxI&w&HOm#ZAeQwDu&`WRhGS4gvfOep$ro9Qo47-N+&voMX<^V5 zh7-vxvmwvKF~fkJtEuYQIC$>V8=g}w)V37b3P(E{j|J0dZ(C0d_R*Zv8e2IaAF=D( z(NQ{7-4V4rG{<-lvhXrfUmIMryO1xdIh7^u&gCxdOT``{bJ4Kv6k1KS!L{2mUsQdX zd7e?f02yp|S8H&4SHA!o-bW6fbMUFe?%6$c;)%ZX(~R?sJ!|QndCzldD|!S?)>sfI zZ7j7lFv-XHQLx?I?sIdc=;~~MJCj1)yh&-u21;T(?aW=JRp`N${H98Sv6~XckXb>4 z1dEOa1I@L9;CqcUFLoXwObC&$e;o|?7tj6H&S1vg{LWx38YLBHV;h4}8hXC12=VCI zJ|7EyxIN?@CB~XNkYIr6mnq9jDh$PgeT63qsublfj3<@37g`i~bZQ}g<}Y#1*9^_i zlXS*)&wd&kjXyT#jSQ=HZHhtn5_N)N8la?3o@bQpp?Y+iZ!=7h+GA{G~nRPW6A?b1Fi#J%^mF zDb1|&c`c@y(2bnavYJ*OS+1{XaZ+LvNA>60(CVsXtTyJA59kFIk(AxwPmnv!g0*OZ zuWTxv!iA5*`*lMjt1HaWk*=|gzA^LS{dY|*=RM@#3^C&#Sm>?TSdU5QS$G_+)wRM4 z57=FqM+@#N%Il3MopGmM6zMGLwAlOL1Aj?p6o>}^3neaiLS~4?^1|9@<%a4!*p2A% zEltP5skMbtp_7}q8Q{qvb+hnMRNa0!Y_vBw?O7~D!E zk5-M(FSmbz$CxPx1^Ns!#tXhQv~eQL(7uB`r`BnHLSRihoqnWgR;^kl>WrzYrauLr zH9v_N6AhNAt->Pt`gCAB-{5&Ps=KC13O0NVi>x*=r?rCNbL$KEg&w2#;5j zg49xZETEoNdgU*T3vMeW9e3}^o;jTQ3Kv?L!UC$Hv-~_+XRKimS0d;=5D!*8gstBk z9TRJ6_V^xacz7W_^@#25Y74L7iLK>^cy6oO`r0#pnRCA7%%kkRucJ_ly6Oj}>?(t2 zfQ7~fLtW#Ed`VZKQo~DyCys@0kDq-wqrSO}4YJhFO)DYKX3Zl_v!@Qe5AS@3i@+Ul}lfQ9u)Id-|!9)nUl zddtyw@lP9HKd{ASAn#&fBwS&qRH9<(5lYrkF?n&zad<w2EqwBPk(bXw?FVC|oj}IhXO*Gbc z{@=4gWycs&>ZJOqupC>UzkmGDza~GWHa~HB5V?N=z3?B;TpPJSSpK{rCBCp0 zePsOe#_=vB6x=a1JXl_DP*C>B@aXFeK4sWM+K^d!0t+f$`DmI&B4PRa$N)PY(iH}* zt*58L4zzm#%lF0eYxd`1jeC7=B%GYuRxkZXJPAIxkZwDB(2lB~W`Yb+{>ngO#r|e}sf%*ZQi@Njdm9>?WV*4|XqzvX#4B!P!%* zgLFX!=L#C5-DBZd80i3;RKF3@sm4D2Y^LYE44gX%7m{3Trt_K2jkLhKb{qRv=Oe=u zlY%mOv^E+#N#RQ6O;JXq9qqjlD}}b0dywq;1Ejx_;??RU0)`-1ajO1! zT3sWl+@pFpB=|>1Bcw_7>;>W`DC})^yiH|SVC!B8>acl+jdYOk^?69z=(=KHY+BH>%6Mqvd ztl3sE8$Z-$e0P3bBiq!dW)RM13rb5kn$()$8gn;hCc!31ZZ5yTEZYW~&|y>2jbGL^ zLMp7a+-V5sN;vWB;zxUwde*8hyVT}SeZ|qPN43Iku)+~w3*#hO7?*X^wWd7udk1UE zg>L%Rl#_n{fHfujwK?VRQPG^DwWOp-knf3~kRk*dT$4e?Q-ZAoszZ)3n@W*iBQuV? zv5vN@9zS2J%4J1t9sS@-wiu(mnQs>cT11vVuy|H3(M-av8cT5`D)-l)vz15FZdfe~ zUN)$0a0XX+0w-`djWguet~ilBnxBL7w{{e(1;uIxBk>)@q$loJIve(y#g;vT+$3u3 z|6BBW|6jfWH9ash7LAYyyGP>$&*g-Uec=_eFVvEnFdD0OHqc>yJ&tiF!mRT+UHQZ7 zd=JcH`J(Hk$RxR@VbvQpK>vtu@Bywc7+CHsAE(`Pn~vIg@28C&I71GX-!rkB-=Wed z%ujm1N24Ocdp7d#Y?*2^nBL0p{L1rd1y{Ja@S6)K!W_gfJ24D?2oqoPU`Oe-uX&IQ zuX(saAxLCHe&=e=U1hI%xUQ)~IKAe zfTsIxIY+=1@BoGaV}UGS0k8&TYy|HGE&}&~IzW2Bma_w#fL=f#5COyjN?-=?5wHO1 zzXBfwZUXm#IzWnc+XFp-fj}6L3gnd`Ez)EGAwVCXHDC-p`xfbeYrsKZE3gWf11Nzg zU?AWMGy|UPvE}XnXMpX%B7i=JQAPH*p3C=aj!oPa8pc1GD97|9pkOa&FwgWc+ z*%wF;^a4naf#9(~4lobc42&Ni8>32ycV=&v9v>H<5SI$hj8VnKr1E|$bv)!$CaaT@ zRm=f-VvI^H%2^3<>I@}w@%f}O2a^+GVv{+_Q?2aN3#?2~sg=obYVy;h$D}4FrYFR6 zqAyj%F+CxhBaTlk^;sV(X zAQ|Y$!n$zXz#RZDf;aM{e8H|@XKZ5jd+_@}9;N9BhR_A!E`S@*4d_7WkjM)ebo53X z;C*01)gC{%;0r!&%jTI~T-BR;o2Ch7L3<%^VghfOQd424}qy2{aH#21Y8GTjk z&k&JMMp}BZBlQhcaw3(fRfZ5tO#W6F%Rwg;;b}4HF^LKBe^q&J$3td+Q^%yGzm(rw zy8bJ%(KmC`W75#wlhc#c$r$xh5|oY;5d|4(!(!A4Imv3>dhs!+taqr;gmb1QJR>cW^_$_bDQJ>o5b7)hhKvjfqBtGm z5fAK&uWI^j*ofa*Aco82k}+GRaVmUgLrw?BaT%PFOMo;HKCzILEIgI#j&BC!^*7SO zHP4y{$l_PN>%x$;<#}7euI<=3A*mV z3F^q0RE?frxacPl{Dx?|q@NNJj&(RRn4FOwki*g$)4zn)QijHyv4LC~5D;KQpWg0V zC`E8~^azbIk#T+9-A9F*K*^3W6I%OBNSc5T$K_<^;3G4EuL&oU$qU64&eiHL7BNAzXw?=$V+tOBFHj9p06W+s3R}Xkr(R7AL+;+>&QC{Ud!L; z$QFEFoFQNe;FyR<8h>56cvgSxrJtb;z&H+7X2d0^R2-LX$FC*V3p{qPvD`G!SU$cb zkB_jv{1H%Q8OsZ@_&B!^HzLYdo(~KgYAjy|+?dSA-;@4&Z3;J&tL^x(72te9rsHeN zjxi5Ifk}6EyneYR?D+ESF%jA*W6b;*n+aj&I$^dfEzg!hzH-6O3TVc_`?nSRdkbz~ z!R;rwLxnV9f`7QcqlEmUg|bu0pXr?+$C-cwou>(PH5TIM3w53@@C+fmKnS17@?m{} z^|m#Fd!1094MKUJ3;w%=`kfKNFAL#zCcG}<;#Azoh(T^1kcqqZ2?`h)GQ@AVe*hPU zKNb0N5!@h*U=LAd^G6>phzo!_gc|~F4Cnme;<$>fSR-$% zDh1aAy}ra68YlzozJd&t0L^G(!C>;6t@a{=<52tRFG-uXB)AINI`lHVz9 z4y!qID<0>+S#Ol{Iz8*38ieDQQyV89q1o?T7o z`SQQXZ|3{vuQ@y3G015Wz7tv9S*ffYXvI6{tKZ^y_{LCAMV_(v&iM!P(bXI~B4Uew zOOJ?`#cNYsr-(U;ZZ_BZDia1JrzZGjCaZiy!iR7sf1@HrbmA*n)O@jlx8(slgAyp=jWVmYE)EDy1C{DwkGr?|*1 zmdb{k6yVEddETAN;<2_dPNi^gBISv6nWRrP*PuV4?pdTuHam&=Ygn$i+H#aSK4O_T zw-C!^zn@~6(4bf@i!YXqk;_UH>%itc{`^K;pA6nD)=M{rSVvtymUl4YP=SN-*A4oL z$9FDYK4kvS6|1*k;m=X@VX^p_f%xl>+|%%lUrK&XV>8o8wl?(IVI}tg{DD9q2nYot zfGA)BkOX7`dB7ZC0k8@v1~vdCz-C}OumdOs_5x+VVW0vy1zZHGfNCLrEl>||-(Zae z*Z>ZIGtdk00K9-eU@RaJ=CdTonLrMZ56l4;0Ly@4U^`F-R08*addhz%@&=p$SD+W* z1^5F&Km;%rhzC*uHIN6)1B!voLi|$TFi;6p0d;_M7uJh_E6@w@0z!ctU>;zx8{vQx z;0~mqueqT&(OP{9JDc@G-@rL6TR{xt!nFPo7-!# zSoqP$ixw|gx@`H1m8({-SzEkr{U;kf{p|CSFE(!4yk+aQ?O%TN^^R|L?ke5A=i9ye z_8%xKKX~Zyk)y{dj-NPr>hzhjmFLc1xcJ?r%U7;myME)3H*ZzlzH|59_xFFOe(+<> z!$1A>sP^%bpX;7JdtU$I%ZClv2v~T6` zUh6iFZQHeX>d>*1bLTEDu5Mksxp(i;vsdpveLed1_w@1}pzw)_#f7nniAl*RlTy>t zGcqSDRccLEc24e;F=NNQKYqer4*y-=)Zb70Pq+U+UH(6jS)q|~RP#(wH4I~3M z2g|{>U^}oK&Dr3VU}vyB*d5#o>;ZNF`+(o0wJNwZI27Cl90hiy>nq^4)NXJ)YB#t& zwHxe2?FM%M&jEL&_Jcc7`@x;5{opRtey|I*AM8r)2fI=G!QH6+;6BuTa9?Ua*n`>+ z?nmth51{sg71VyP54HbgZ-)f;6c=W@L*~`cnGy0Je1lG9!Bj4hfw>$ z!>Rq?P-;IolG+a*MePTVruKsqsQut+)PAr89bhKdK#KN*4Z*9xQZTJKjihKl+{WM? zU=wf|SOz`?HU-mK)f{{UZVT`|a1(GXxGDG**b*!|iT(h#0b7A-ecKF7>sxEEBm8Z^ zuHfci53nuRA8ZE>1-Ar`1>1v@z^%Y)umd>cAHbp1AHZSMAHb2+55S|SAAmkRsr496KP1=G2V2{GKJU?;E{*d1&E_5#y{69~2jM}Tc) zs3+JKoC>xF=YZdnp?+Xj@G7t;cn5d@xD4zEJ_VixzDM=2K)t9QG+~`ZJ-`-VQ?MP_ z4D1B90K0?j!Cqiba0GY~cmh}=$MFP9!FiMqcn;+QUPSqTizy%QX37U#O8I~fQ+gZd zi_(LuC_VTgr3cqjda$$->A`ZaJ=g*43GM}!*kL??O~IjHGw@i74^E=^U^T@D&!hMb z&=182mr#804vGgZqj=ye6pyaQQao@S#iI%I9KyjCV2Kmz0X79YgU!IbC>-oV;m)WJ zg@eaZI5>&?T~QzM2j`PNcpmw?V|6~W= za^Zr%iZQHEJo7dlW^v{@oo7BCyPm>W$Ug}oJZp#$suEbuIECfQ&gmJaBVWdXI}>ik ze0+8_gJ%t&uTYK(Iq*DL;4H>!#9%DM)9}n}ZOqN5V^$@WPHY!n9$Z;G3+{nEcrE%W#1hVlJ_$pJziaYM>5zF$Bd#0}y52Fc7niQ>aINa!PO=y@age!~32`M$#B z2)=(n4ncg9W0^dh^uqi@;m`UCt8*CNUm%Ae4(l^a9?AC`R#q6_cUXIe@%;y~FY;l1 zi2PYw)PkKUknc-O4&(b1D|Z;*r&vAx$)DvpQqW-nt4}oFzgV6__&&z;iTvS9>XTf9bn2X{BP&IjjTx;!iysV` z`g|_a!$5u<@wyeql9)mqQ|u_C)#BJg5)IhU^olX?9{iQ@{s0pgfp@!6Qs`lsVhJ7!p%Q2v++H4fF+I~xOR+`iGz{8$^= zT*8hw8z=nnW@UxwA4@U5Ui$;!E6g{{HCX%m6DZClth@-m%}gFCwwdXkwVCDatJ{X( ztRHKGST^DWh-I@DNAqQ~^n>}bng2+>Y`zS!Y{ZDrDLYU*pA6*d0WGBPTGlDUA9@hW z2xcK-8AHS}*l`!j@Z;xAzJ5Z#SMg=Mb&UA(!u8q|%-2`w?*ZC;Lz(|XA&wufx4)Qg z%v0c0%E+;J!jO0q`}tPYq0uag~9K!Kc6%s2=Y1VCi)$ zIo-o02a}E+z+Z!%!JDWY!N$=G?n1$qWJ2wNd#GSjl2QBM{)E~EK27=tZ>IKvkJE7h ze?;vA@1c5uk5Ie7J18IUCGcKwCAAAYjM@V(qxOI=2(~LzY7gA!s2$)xQaf%~$uCno zz$d63;BTlM;Bu-z_#)T`yn*gp0B-?Dfp5{=1^$@y4z8m6_rc$S=YY?E7lCh+{=nD4 zo544!KH#h1!{DP7U$9YC!ks|85|qm^7m zdJt@N7H}^D+krm?JAt=?-N7`^c!76<1HpTl?TEKoMZi5rutD`Df4HYn{RG=zD%>>A zss&qE4%}+WSFqvDgnJwHFYsu=HrRy55!}NCo0>EA3%FARTU{F(S8&Hrdjy+e8Qh_Q zEzy$38QhC0Kkx{_wkW6Z26q_w3pTo1xRrvH4vz75S zIve=UB|U+|1zTMYY8TwOf{lJO?`3dekDo3zo*TWr4{YbENOK;;I3&CdGix}=Tq<`@5sGkV7Y#+Fjsh!{q zDi3T(`T*ad{s&$_{SLg2`WyHw>TlqUln;0i^*3;)cpgM|W{SVX_)ZXItjLnIay()Q zGGZi(GFIY~wQ>rVA<8&o$kxiK$mzA5tCiDq%FTdFlqc)>t8`_Zv{=Q7GJF%n^}FyL zC$7!j@J|)jf8u#7zH>!80Q(ltzi=-fzb0k=F}i6*TLD{vFk1mDaf)~jMfVYkb_0A* z64$~ky(r@zBT;7GqKrFbb!3fre#Nwf5ysmcSQ$!w9mew2h%!o^BFe0mS{WfsrnEY8 zGFX&TP=+X{>*SM(x{9(If1-^0o_Lw>LppM{xISY?NR)ARC6jr5rM{MR{dMBU>-gjT zC>>eF%d9PGt(=6?nas46Bg*hi7G-uut(C#AWu=asE6VH)QIs`0{#im=HLDLVYxuf} zb`6xO6m3K7TeL6WTRcZ$y^zWL@zRl#M45dvneP)?ISsMcxjJ7ilQn$b6>U$#{cA~J zt-nxij3~2j(LRN5t^FkiC5Uz(e2aD~_RY@0`Fe^n`(`#z)|WCx+X~&QE80hZDNGi} zm}p-RUChnmDS0~zlM_X|5&IVHN%$6R3ar11b|8H7_75>v{;Y|8Gh2v`KkJvG%;MyV z_8#^v+TobRmf0HEF%xC>&Fl_3aa7`XV7-l%CED=Vw`iNd-G`#gzQyx*aioZD*86qc ze9sl_f9zYd|M8Y%l}@=T@ksztX7vN zSh{%5tLL7~`dKQI#eS(fe>4BzoP*)dO3M7r`0#%#eimOcFYB~Do4?mw$F>D#Y1BG; zR3nB~X6KvuX0kZ{iMCUGGg-|a53Rja!{TUIoJ^)`{%C66`pwey*KGrDBh6wiX4_=t zvh!blEV7ZQ>sITz(?uDWB+B%}iYOy}q9`M6Hj_1CIaqj_M;Ndi<#BHBADd*vv5(J> ze^L*sT;;mff?P3AcW*kdVeFyDo#WnP!SUbx+RNzh`PmacdePi7)t}=txVj)=k?X+N z%aVY0D_V5yG@PwN4Hlb}&y93)`26LO#Iy?4jkGN_N_NLv`I-1m>*G$?ZFtn-cjr!L zKDsrj&43?Qk2mC4t0!DYJKR-Eg=)ptROi<8=T}xzsUv12@ zZ#&=T%m+W4pE*3UlX*?vp+z0G3~5G%+W+xd#M)B_Vxn(s+BEi3$MBBaR!nW=D zrE}4T6Bc!0Wwf>U;M*1(=5LGqV(nn#K3@$RS2g}dzS+ixTA!=)ODgm2C$*15OFe>m zEIBr+;JblC@5QwH;;OgYYoGGx?-#0@N0&AE?7fGnSG&kB+^5#hYCR@qczSY|-`P3b z36;9^`eV1BI)%n9pM3l?+XqAEJ9m|}$VeYzpWf1dD%hi=&lYK@vh|Da&MoTv?ddTS zmvr@9e|_r9gw5eMvsbQn+#deoz|l<|77Yu&E9IuU9r~rNvRzoHv*oUzpIDEwwi$S1 z>bQQFmbZ+qckuX#yJYkAA9iPdIwhuISF@BDb7;@%y`scJk&bN^^)KvWx>A;$xo>|$ zmSfG~jw@GJCpJ$vZNA#&Nsr0aBLerIS^s@N*fh2h|2AjQbAvKQrDa0UFz0OBs%L2j7y6Ajdwg-Hk(=&Z>U6(k)n{LNv%WI4@?l-=oc7a>q?tu! zNDufO8s}CYD6{&>A-edbb8X#e#iw0c7Eivkcea1>R7v^^`RYjfT+IepVQzo5+ecjb)06t|n0s^f8rh(L;3SLBuK&95W2alz50l(G`R`c%lkfDMhfWwoJsy#Cb$y4d zsYR1RBsem^+%FjY#B$51MONSBa}&Sm?0EM4k;_xl6rVZ-?>c=mbM-ZEU)x=+X{yTBo(yl%E8tJ>f7?BHVG zHAb@I1B~|+S67_{ZxLbm6S)?3}$40iO`vgF*Emmgd|eKX__Wl1B~jZ6M& zu2(as$pKU4xGUVD)6f>_qqfFA+&H)0qd)$#e&@YMw_7~fH?e2_oE?1!xRxGRcyn`0 zS$y5akd(&WO;aKhZFXPxIpNtQCuwDmNmq|-d%8C{z9Ws9y7BqHY&$pdPbH2+SJsbO zy2-3ztK@f|xeiTUe4uq_hr`DtL5v+r)HE$#b>5 zP5)O`f!}YL9~UkE;pEclc-LhY#ulT{o-1cz& zM;7wh@lUK$4|Nz=_~Q8Lh32Yld5uQ1-2ApDYh2u1XO8+z{-{kQ=QHKl_pznbDRZvK zzh8E`;>gIk@{v2ED=+TYo@MUVl5RxPN>38U;eU#q_q&I?&$RWKc#$h;zV5!}?x`o8yUm==X8IP{@xMI1Fxfk+_(3b4z9Vhr$OT5hHOg`1t?bE)Gj$iv=NB3_B`UbtYlxkF1 zQ7SRIllP~kVTWT5#csTEZT8I{dzQu|)h^n%;*@pDcjZNH5_SNrtNTnjx~8*jota|D z&u2gTH2ahG`!~!Ov;I^!rM&kv|JD0Ttq+!j^awh>rRSQxdm1)p^=KQ^wa01e0Xr5p zWcIl__S;!YZ3g~oe`-+uA3g4$pKX%d;+%nf!{cuTY~8f`P{vO(hy4cp!Pt1vXZqFb zdROnuwq0RRP8mwP68d>JXCH~syyNOw$w|B=H z({J+jM0+#I`Lf$am7c0**A-pYesX8^S21^P#C6##?YL;=cbPFuI@~?DTVrn1*7dzM z6H=^8*L$9ytD5?F!mZ0Ej=J1RHtsvS)ag&gA5W}FAJQ`8deO(48S3}@tVlo7eb<6M zM+Q1q%+KBGbh9b@z4t9&G3UGGu6|eTf5>0o)%)2b@7y6X{J!`hcj*0J+pWmFRQ2fW z38Tv!iuR>)@pr$z5%OuetYqDqfDhFb5%XV-I;uW(@lff&^th{|PL27d_k#xO)R+;6 z?XT}y{LSi+$Lm6WcyVL$v^W!&wcT#6ZpW`B=I(pnE3$9)U5`&rdJkW7e!A$O5n@q&C$>z&u#76hJ6`@Qs@)ACSOrU4G2A=W=q zQ%)jn!byypaS~%}ByHT9Gcf7E8OYo?Ls@Um&~yN2h}%}AW?`Jvd>kjWNalB(mmi5}B=^#MCxg zV%j28Vrn->VrEw?F>AS7VrG9qV%F*>iFqqi19OKC2IlXXk@f+4KNcB`ivJ+td;K6P*}XlU%40kNkKGZ6gL!|f&$OS^jKuDU|Hh|QA#zVCFM)sa(`fRW z-ubwiMc3WfbK6e3@!7{xWZtvvx=j3i!)1)+RW|k<2}7|yy?fXvXL`;r{o{+Pp+CR?B0UuNHUGUdqunQzwvsZ&P3S#CaBB1(-nKEJ$s*2KwQHt`YL(!}R^ zA3uv_EuSs^RY+N-FignF)TYO6X_DK?7(*r%!476;(PjBb$p+C8x7f zhqw$CJ6D^mRKIn6pbfhCB@tu}8NB_uXI5gEr)c$jgqw#E?Zk9*=ju^~3M2Pl8cZj7 zcw->k+?u&a@!su)7CEo_(auZryIxzNu+L0ibFNiyZ>}u*`IRlj3fN9fM|5e0@VKMT zUw)!cJe~eHwvPDt(t$WSe!Udnt!J+ z!jI&4`gn)p=TBo#Z$8`&^?mTZ%4nxz?bLPc&mL-l{Du}~PuiuJl3v`b+Ry>%?}eCO zDpkw~3OV&X*AL}8wcF8ikD~Xe#9ot<@A2j&fZ+r1A~q~?p2&T z*>y(eb2VOEaccRFf%_E?f{T8({JsOqPx;cQ=z!w$>|N_WosXTW9KDXLOe<3ayuAHW z(exgq&&>mxlq}ND;5J&s98VgZAtQS9dJA9iFHcT%C+7$1~ehw?ICnFM`T|I#-{Ce#<#jU0m?Yl;G^5y~u4sY7= zyy8Wh4bJl4H%ER}pT)+WS2SyB(bax?GjHySU)khk=M}kq*KAJi=Ysxgo>l(cdBp*| zHSgw+{m~!3{rqc-3yL0BcD7vp5ytb|^F8~W(Bl#MTw8rjkE`}9lyAu$5kWs*}3tu9#7b&&&$T^bETy|=O4PH$0bwrxw5-HXFmK+kL921vvYzz z`?S~R%6k{}c*1A;oHR+F>s|FZ=jjDK&flZYT!B8 zPM@oGoYmv}41IR&qR03NIitrD*6K4iTAvrR(r5Qer}emOsXm8B>vNU8E~A{gr}VgX zgFa`b=`+_&pYxxe)MXT`%lzs{9h08K))x>&?g6G{2Q4|sJ1&83*}zRq&0w29PK=3V zYmu~!_=#-Y63;KO#>XLmI4L(XLydTdz|tv&@LYGGJCM$e$3iET{L&M0)G-sW0UTc= z8#=x}@z;uNz+_RAg6Ued4BUp=|D3FQ@(rHllG1 z|JHPT;BH3OxWSIpKfo4rEf{Q0*W$s=>E0Ev16>max1?*_U@N+Z1#Cz6Ab@S@8aKEF z_y)Kgt+c@H!PQ_|!#@Ofpn8KlQoX^@FVj18%vf9t>aH2731Wz4(V(Zmo1z-bJp z8Jz6wm2_wZkZvu6yo|Zmdv!Gt@-?Aj#_{`LH5JNG<*Jl1>G2t9VtK6goP>W$QD!PQ z4Fo5O`RgCa-w3a&nUd$}Te{UY^6tyWYY(SfGcBrF)#J-w{}5|rJAOzhH-6RPy`O~6 zbNaIK%aN-J9*vRuk3AgaF#iu%+J*eFa;?>y&m^@Z+!o! z!#_PYY`R*|Cil;zo%cUi?;FQocV#qCR90z_qGdH{ zP@b3|kkGQyeSP2G|KR(0e9!Oa{BX{F zpZmI=*LA&KQ;ti?zOCQ>|K6YOW={TxJ|f3q97&9@g-R|%c&j^Q>qJw8^E*PuXZ}#k zkj%fQ@e$2&lgqd=uut>h<;x-Tb<#%lzJ0=7^7JW`{@`NvlQ6eV*G-UsHv zdQ=YLEB??8BOh+Nr-2j(hvDKV0iCcH!T)mkYX`HO?@H7+EuUG}EI@|QQp(p`0u7^B z)(~q%MoVJIW$7fCTv$%7y5hKXxSWK8=D@S%7mWxy2Q9hhc>K!p&*$QdD7=ODn=UA*Fhdnm0Q$jg^5k z#&$R~_A%PP5}0DR0*y|1!WNph(w+~4P#G}5n>*`Cd`=f_Fz!N5`C1wi(hubgM)Y*E z3$`@f!L@(iv;5*%x}s-9DGj43WW!EoRQ&^mw+>-WRX8GNe&>t(}9Gs+nkZ%Vd{U&crFtPL^d?K%3_EkmeCinpw9oWK0V5 zHbt}E#R^c=oyYY%o?&*tZx-WGE6}AKOIp&mky&nlwp45U=$g+KnFqlXo9I;ZZdjak z;U`p?^WU-BU z_z<%W)3m~{%UBMb*UG3Yw}h>pvk7B$RoMJ@>+$O3MSjOohVD<%;CGdaXkG6Sl+;GR z-zSYNo+XP{)3sTS)F9NGKQNap7d(3KnBh=0)T~1BTV)}<#NO~<_l{y#?PR{GeJuK; z3t7kUb~?AT7QW`?wBU>oUpe*}iN8r>iusk8tND&8_uR%id0`&4RSA_^7s<<`f;Q_+ zqPt=usQPWj2NiX&pgfxV_bf#HWGNoHyd82EZm~nIUg#Sfz#glAs4(O+*HleM;Hcr; zKIsD$bUbI@b+1D0+FXiQv4E;>PvvVKK0uY80W&+c3#E^$$wKuDb>S+08)uM}$sHzH z_Al;Q8bHgc50YUwc|nODCI6D(x70GAzNDL{Tjt|MlQ4TJG=@&k{zeBc4a2te-)Q(XN&ozPX4WZ3izhoXW~>iw zcP$FGpos=WmRHWeNOa%=B86ezw^2%WU&8km86revBxS~yVbZaq@c(fE?+06Hds#Z28#ciEE7st)f+M>-{1ciz zrZS5Ya%3DiTVS(1fwb$_;nbL39CV+I^#eI%-8jgVzc0noWG{+zw4@O&@0d-&41)S1 zt~($G$v;=9#{L5dCCBkuzB%}+7)sN6L&z{>811to^a=*3=gm^Z5QT0G(_RL%bxLrK ze~70BdGsPGmKKX9!Fb9j=q?+I2;(V~#P_nM+F`U+fwPM$TPWyF7e5#>hO&MH;=_Ay zteh>*S6eTIiH;225mut1{c=z&v&VSf`7}DiBKVw5t>iNGBKtD1hU5cwGmETzx>M)`w+X5!S+xQaO(tPt!fuv$FB*1= zE?8=o2V{qO&Q z+-rX@(?tOdCQPHFyk3cNK0Wv<~&<-GY7b5Pt%{u$Z7yeCR*I&3v;UC92Msik}z6 zCm&I+xe@j*O?=;{B3e5r!LAzAkhIu#7Ls61kJ9}ypt%6;?WH_rSrn#sYq6*tB`TY- znN5D!OHzB~*d`ep(jQlcOJ|NzP1#r0T10SP6pBWXtC%-Flo_%HYz$E2raIT@f?*=2 z?(0Hf+gu!x5}3-`4yO!XQz)gju&MhDQGF`_zg43!`LZ>?J?lJPcNy}ED?(7!Q(}G< zDcF*{h2#pZk$P(&-8Y# z`4E#0@=1Bs1$JY{Z|FDgVW%c^V|~3W);YLSUxFvHe0nh?^ebOK(hsW^k7AERV`%+p zf0}k@B!&FkOsQWg=*^W_>Z+JdbGBaNqA_NaG_@6av-Xnwd==iYYb&XEBr>f-GvN|2 z1Car8_)@%`EBYx5-me!|YV;@9q0Tf>%oE|(Yna)^cNG7uhToDjqx9XxM(?y!*{~II5Ir0h`DHcAockcUM7)>b?=IKnXfk5{)}hV3&N>`B&fiA6IovNM{=|?+IJ;V z_z^Rlk2R$o6ANkTTnXCc7C=HBdFbywPN7)}&}ea?gO$}3V-iP(vWYy>eLYQxH0L76 z#~@U93Y**h7jl}CIAHpMV*Y7?b6+ez^D5+&6j5w%9Vf-x7?%B$c|S0~v~QetXLdtq zkpbUlxSD=Rn(*cie$*-akVZBqQ)6u|8>2n}F%|#t;jY6-v)cg9zV>9){RP?gz2Rjr zi^-+@gjJ#}mv5N}i8Du8!ktV?DlnqKwb?lB`40@oThr{YepYi~HrP{fuP~Jt zqe*zI4{o>$;nC=GRHG~b>E)q(wVW8XHZ5XrJbf@z<`b%S3GA@ejwLDif z@F1Sp{K2QFeUr`~MCp>r^`UrPbpv-k33Bq0lS#Q?ClX?(LE21&#b!FdS}6eSKbkS% zE`=Z5iH6R#V#B+H$s{0xm;X(m6`u9@y<-g~D9qx_zJ}7w%`vEC1ewA)WMu4!fc8@~ z-D)D97`D?YL7wqtuLw8(5{&q{i`gX`R~jwfz~bJWBZstddU)~{&V@8Ev8r`+C}IlR zx&IAP4!N-ScWd$bA5*q?`3eNhb!7ka`q1h6dLHFejH|ne1x&L;q0f5qE{UWV{)Fp@ z|HPzfCqA)K7ca$*a1Wh-s9yUq|6%?QJVvkOmj#nh`dp2DIr520qIKEJ4LdRI`D1=* z*;Ij))~j-u;^q2~Bee%mgZHrDj9?844emj_gPYv}#`AGbCE6yLmXBPLZdzt8G|S=|}_$-C}l6$}ptgj%NH= zh3c2Gki9O36#`S{fBL2A!r05uFuVvWqf1QYk1i(VO5<_qEAnW&#d_}<;?~w`emuY& zH%5-)aR(-1wR{tEcFQ2W7<*QFZY16KlEBDk8y1N#=H^->=&xuD!-Wqt!gn*9^GF{1 zPDS(M*(Eep(GeBZGE_RUobM5GMQedSeTuiIZyUDIsxwxI%6rBlB{WIm>0zu3ET;Yu z^6ZgU8+Ig#@jGQVX?jNx?XcWRPkna4OX3~kuG~PQL=?S?awF9cAM8nUW7q6YqDp)g z?@f3|rA`yzG^UBRjh@B|>JEYzo6_)YKk4VMB*>W^rng6q;aN)_9_}8=DyLb~)pghK zwS5x3OG~56xqpy85Qv`f2jH1!PeVRjro=IK1mM+yT!xD>4UZX=m$M5~8>6ANVHN+V z*@4-|e)Cz$qPRD$jiPk#;+TE~ZQC$}PTE@Y#zTR4tA3QH3QE8mHOJ8Ru|MgAm?-zD z{7JXu8Q{PGyiarXl>7f&Nb z;`A%y0>_Uyj9=pi_kUHeBmWThmkFb5pTAJAkTLaKI?Nj^OsH-{55MDKPHSF-VB%O& z3OcolEZ16~HdLK!9si7GPif2<{s?cEYq67j0>YvMtxwC>;hn5t>ayhwp8a*;`+DQC ze8vo>diy(RuWjO%CY_ZdfYI2#o|=UNnk@t!U8|hrz{v3O{=J)(~uqWo`;+xw`r589+eM$ zPh}4N$WNHXqQ2QK7-R6lIgbBN`W@jCH}Rm4}p(e1^MV0I%c?v>z}v?@47yw z@9jzo8!LGB8Yyayf6iTG^+>mUAuk($4Pn}reD(x+$~+!RlZCtBeP|b})*3>)tmF97 zr^o4FT>@MCITv%R>!O%`3p zmeZhc8${-hrHx0D5jbr=No0DV(J6&?KWre?Z@=i*z0bT)atiM5xyh2-HdB4=m2%*PZG?}psy9c*RgR)~g;CAr;; zDfM;{({fz}k;$C@;=d{W{B!bhmZntqM>w^q1VO?IWUe*=QzFGlw)-kV-rBQOhnLdW z8FoDA>I<^^^qH>TRYuHxSw7o!D2dlevy!JK|kyNoEfd@|YS zt{|CF6Og=R9b4XOjp#tZZ25wp6#B-RN$)7n-m$RfH8S97Nn;vtw!u@o-${Gt@+DU9;IbS(<1jS$ViGs8Mer8{mOT2xr!3Cx7@Yl zJ9WE#Vr3I=AjUhC#HuW@S!N|)HFg8#2nDl^Hk@|tdPaVm{K>BB2ss^_g9BqG<9YNl zT3I)p{rlGf_Yb_K%dhgG+Axx4+&YZmA||+9RgH%N`@e}72kByQ1A7=~jY%<1xIeO* z{72>Snd>y5>+H_7D}~9yN`^TlIYLCj8cLfzU~pv|yJ~uTa4BW@ z-{Y392J_D?X5;$Y=m9ApuR~ApPZXiQxoRY(U&)4+ zgO=~P$Ub=~(%01ws6YNQ8d63un_G)v>vWfGN)jUf;4}*OeHJ#`yePBi34Jn_rd$hK zNE9BX%J4qiO>?8BfO$xrpT`FN%tP6T-E8U$TZB#e#gpo{lK3}i`ny?5Pz7L|m9|w@Cej5@-9yF~gnk)iGvk}J+(JG;O>g^A~%CS1^`-dFLugqd$L!A+3 zk&G`()2KS50n*Y_=Y0)OVU`+LHqUS*(EY2YtDP7lzRgY&h z{P*>h0#UO=Ds#PIk2O9W=P$?U1?1=87BO_gH5Y2efdY~r8sYLXZ0*8D@0 zPM)A4K^jz1ai4t})k%Yw7n0}pm1KDQ4nIn}aU!sl#Mh@`;A8=U3f~LPv@`suq!LZc zJBHDMHB{F9m9;!gq(a3e?jVSx%4@&V!b^e3by>$lEQ{%!?q!UV+(|oT{bIJyjKMdH z@^Xh%T76H7NB{GJzHK{?yd-CO8F`8~ZL7s;^))QEwt`A>gy=xW0#cpi%kroLb1HQZ zWR^vrH+GPTei)s7I+}?Eh{F4r8ksD=hPyw{;G1F(j-AWnrN=H}hYGQ+e#RJ9ItgPY zt;6)$_qfd2O4>18m>Nxmu~Yj5U#c(#qK7}STQ)u<@>rT5nUFwzL1DD>S2r?UPvB7B zS2}R-C5!enAS_t?{Ottj|srNVUZDmTxmr8}z!acQv^ zlvZkTRsH*vV6=slcfTR!d5TDpvOz=VUotTfFdcc~Usu~fwD>SKdY{6kUE_GM)G6$a z-6PO_GbX>{ZzM5Pf~Led;M$JOH0_BayJD+IabZR{v^9`!JYSAc$0kv$$R2+0=uQY& z2YiK6Dhe<@4zF)59!$djpx-&Z75A1p7hD6VK$Yk;D8BCaw@i)4hvX z^NR_{Zp!AnuYW~PRR*&gpGWVacfhDC6va1PpcyxWv|L8;)e9RbJg)(MR;Ossvl2|U zYo@}P583Vyt~j(Jf~3vl$o#4Wt8oja^M{IQ@bCaleP@Uue{T{^^JH7s+CZY&f_JYt zDLBs>`9-(=bfJuxZ`LZRJ~|&v>K)OL^!?0Vl5pHf2X$k3`U+2?rHuc;*}#~i)|dPnUPHXYk!FnDgQO&Nt~q}V z{dw}3EF}KQ=?tbT*Q$9}QX2iq`NSum{YX_3LG1fK8!$m>Cm-Mb0!zNtP|u=i zI6LMnU0*7PnVmcMP{H|HCfm)X*Cf-`w`yEUESG*wozH^>$|>ECgm`404&r=MIXx%jPWcx^#dQL%RuV&O?FQ{lRgNzt4hf&O6NBy>4+Bc z_to*Y`q~2ir^2e#o@2v@ANY`6jI5hC`M-kvd+C9&y6=pc<`r~m(3U&`Ou5i+J=&-~oz)DfhmG%j z7;Bqj$;3!jbhm~q)}6tHDUT>oCWI}x@&IRaHc-`c8v&=YBb`1&+-sT3giX_F^nqLa zbg2nFd>p{0*Tqupfj_Lv$qUOwY_M#9BVAfN3fpw*X;bMS)>kB;ul5By?9QN+SsWaEZcE>vQuDvgC%%tW}O5KSN2MU^x_smly#&2M8i zkSs}4)f=g2&L6s}sK&gmFCkl{b!5{KA@D$UBj7lI?V{|Ipza;#VoEFXtuV*$ z6}rRC5W7g9N7t*8cEt)hnjb<+58Zk3Tv1B?@JYZtR}yUuVFRbzV6(-ajozRSzmqp` z#8NQV9dZWYN!MxH%FN^854DQD+uFJ`y@8&P}A;BPC?J?jw6y zmO&z;j`6x89h&0sg8#8~K~uvp=C)XbYV$U6Cx3b5ynIDx0(w3p+VzdG$oJc_4TitO;X+0=j15Kh7#RIdJr$F)s`MZsSFx9Ken)qcfPcg{ie zG(}3xSB8~m9=kU46LuK-bGLWTaIBz3X76+9_)k0P3~{3u?(KAXlr|~Vc+jN>I=p+-M1g9R4O3E3ro+sV ztoMDPf+%g48{3W7uNRR_vKq{dBblmE1%8FKL0ZiOUEW%}@x(OhJ7UQ^{akU6=Q821 zrsR z-y^jR@da+Qa{d!ismg|Pf|{V0GKa}+oJ>zFV_8%8H_}U=hr0z9WH-Exy>L5E>(ob( z{hb4}ZP+B5@XMLjEFOuaH9h2h^(8<5A&rhN@?|pz#A%P?1U7fecUrRQ3e8(BL<(|I zD3RNOpl@psyCWNCbtdv#NBSr$B^qIpqfz3h%Zmc0li5LaIw@yBwel5w{{c&y)G>(% z;v=2&c3`Eeo6)u+p69doBBiZn0JD;*%qSmUJW@l%TUTyOKwoq zLuz{dH1t#pN!L2_ua0H7N&nceD?RvB&F0;h?aZdO~t=r?`r(xvEb=J?a!Wc{jY)2;TkXC8XGVpO$*%QN)&P zw%V-}B_2IIutb@{7SCc9`sE}(%8Ujh;^=R&6X~oorAAK&JhUF9c`j3UY|TbeVe+IL z8%MFb68Vzzt0*^45_SW6DA3gadmu@)pV7<+McUw)0Ed(Ws2rG0)#7g{wk?>?WUhkm zkdL&DHz;W9F)HocM&}hhxomJO{#4B3{;TY0PvZt|k+=XAs_HoOa5GJ5m1jw1vRInx z!6*C6P{XsOuv`^^N2>eT_-FO>@?|jfw@<_6MIp#v_@4NQRW$itH%+X00f*g($*;K| zO>LiO+P@_{?S2Vm%)ZU*Z4TkIO#(I4CE>Q1I{WbT4Gj*Pz*j|wq4lX2H|?{er4`03 zCFKD{Yv{pU?LC$ymJmL?M19sQw))ma3{O2rQbu_+Q9GW=%)E*TPoE+r+ZU~0i>Mv; zG+*}ybj(`G{qGe%*mjZ%9aNa9u>rjtugz`${-ANAis_qP4z?A(W(`T+f_UXM7Pk0- zZOMTBQ&s$2nau2)uHxnWV@xqRgYK(srfpS;)EB-Euek$+wPxb%PF-4dVLVpZTB0?` zjyXJ7LLYsr*pCtmC~m7{>E~?e$R0uMX`q(wy%C1al^Co}nnhg>8|a%+1iu;FkISvi z@Sik;l4Fm;S+g9zO+)zdsXt-Y_=}QlU(%+CRZK&1GzQlE%R6%PD575sEosB3R;3fJ zjqYT%HJJ0G7FgZY!(F!eKo`=F-=lzBK~tze zh%YDEjs*wo7V!0-EPd}?e7&lPvqB!ElVHv&#Rc4`T!?*)=a?n@n!8B~s$G7vC zm~sCoPxsg+;BTquHGU5Hb~k)MIcZN z55cH&Z^%R?8;94QAgiH%2v5l(&yW#xJof>O+*gRp!n0AmIg7POrjcQKIEEHJCLgDI zW^=Oze3vpUzEOZMy=rLdpQ9&E{WvPv!yYI6kYKQboKt78)+hH+Z0W*QUOz~Cg+jTy z%@mmHI`UqH81k&FWqSwyMPc$!Jq!k>b*a`7kvzQ(X&-vcRc zP9ER)a6L5)6V!PGIq}87RMzgO0DZkOu43&0cPmv&dzMdgPN>3VlPI;Rm-EhJ_7FBO zXB{6s@JmdMAH5`wLld^p+HbOSp?Ng--93*2uDJ1p>l% z0@BAqW%nKyF=aH2t~#U zo6lP^n`wIbKe+Vg1nHhU$bDEe64m4R3x0|I2%kh2_odAnmm*DiF>ya3#FkA*z~Dtb zZJr5525iLJ_)fB#{gC`-+yr-YV)NHl;z3I-`)c)!q<^Zh*B6Rtx~nR=g!~0Z9cKQ~ z!2HB^wqfOaTq^p>FNg#}m%k4yLp0sv-WxXWT_L(bM2Vu zdwD#nl%Ow{TM^uG9Os9>pi%1|@zC_wBxRpY>ZJ`>6H|ngwo8z6(nMa~aFPh@$Cbtt zc!O#t^W!Z#-@DNGUrvx~o{DK3vPpUNJKnvmfhG=}ORDuo$ov_P$$kiQfk zyn73+-Fw)v@x!4xd>qY_?W9VDR_>K}31Y2#acTH8+_ni}O(#`QC-IZGm=zk0NF)Z zbkjN(b4UNgsE|K=Mf+n?k-Ui%VQY#`(&93y8C00JnR&XOrZ9~|R3pegio5>9(0#at z*hXOhzaLqJl#FC+7%55-70Mn-LXk=(Ldd9)J~B#18WNS279|oXTa+Rs*(sFlqKL$E zfBg&Rde3|A^E>Z#y)6WEmT`EslbmqC36D#y#5&dSoE?9acR$%c$3VL&XKY09bOV|E zYY3d<|6<9BApENg#F)gXu$kPE4~muWY3Y7C^_@p~WP~i;?uK0v=cIa}ZRI2{XCq)Ghvse^BZMLah856m9cV1uR_l>1c4 zW=B?GX~#{hyte?s#cA?fNhs&KMvK1oyO0#;B`j9t;=A?jlc{{L#focAe@05PV4e=UD2D$GV)UHzV&TYoF28NYnT3IT zYEUJ1zq`(|8;!Kt(ViKRaqQBs2U|H$mDg;_@ZDw}ml+iB$D>0i+Z{=ZmnQN`{XCvE zJtT&_G=gj2r|7PFiKkDfW4`q82>(Y?hGMRV0Q*gY~ zeXO26kL?F2F-Oe}7Q>&(xbU?wykEjG;XQcx@K&)fVGC2c1km5Oso!sO5E=$;cs{K_ z1QjTAp;{zfx>{qP+g`Z87>76Q zD|%U%5#D`}JTcDz>&|``%6^;J>icbR#nO;@d)?)gx*+aRSC>;=?BLTFExrzGa{TZI z+e-jt)4}fl-3&Iv&K;g3) zGIhTN8s6QK9)6Q)<*`6+IoBE9N3m+k-| zX56fEg^30G@nD^X7?zcawzY+FyJZ#n>huy>UNg{pXo9>}Hyk4;hs&6xdtB&ofVuJk zPpSPvwbC8bMAgE{v>(6qSVX1y(R?@SC65KnK+(KH@$F?A4=)N6#%HI|$TL~kmMz00 zt>y3;X@b^0I^*ln+c^2~5P~NT#@;!-kyqOcB|~tP<=PmK0ZXI6rj{O_|XW;}MKpP3zJ?*1vt*PUYfyg+f^tOoBt z&1au#H72YI5odgLa8x%@);KJ|GV>hKwfQ)--!&BR+m^ELT78-9oQvR+E|?TM62V^M z<^Cnn{8DfTT}q<4V`hbXYx;`Lk=J44W5hnXPla;CRL+fEFO@r3Bcf=RhWIZ~5`~d$BO&%h9@n`xLdWL8s#lKeWZrhg$ z$Kr7Ro;!YZ?JE|BjX=K%Bj8hbm$isP!jGQFTl*H9S03cNzBt|3}2v1C_Cd3Q_~T9`!sIgK6kJ?J>F^bY@$SSDrG?X{k z8NWK@im}5zpmNWdL$ob1Ja)7gGjj^_jVH>QvHs9_U54^tNA`Suhl-`!kf-xmEZQ>% zX1X>_--~MCqgHGApmrbP<3?ks{%futVok-Ha{s zemZn5+Qc!DnQZarAugG9mj+#5@Wk4C^zE7;N43W?)jTmBUL=jDj@$rh-v9m;ztmK=7;OdMFGN8ji-`1WfD7UrJi zu8HL=oT(xP+#kr;>#z9C?+0JJ$mXSsHT;`;lsAn!BQ)*2ywtSMKbn4q-CEs1#A6T6 zYjXP;ewLzhpNkN!++@%DN_h9F1&n(ZV`uA9IdOOrCcT*>e6C)Gyx}fV8dB+W_=0q7 z=E*aT(>U49np4IE$a;MXxP9Lw>!TKNka3YTUGxdjr{if~+Z!u&1ekf1YtFQnC(Ht{ z;p=zIn>HGwrmW+Jn=9bk{4C09i?OATzKrcZ07>Cq!r=Hyu0Qh`(;g^Op=+KP@cA)j zYdsML^OrMUy{An6auZ?wHi|DdBQZ}ai(_Y>q>iSB+`4fbYhpAxtRNn@I(yTg{XM9^ z?jinL6$lEuP-;VUFx#&t*e-^aqVbsyYU`GJ5(L$K^<5xh(vV!72b*|$?R>)lM4 zu}h8FJq$T(t{SHNapjwV`Mm!89*b3y;I_?K=vIw@Y;%`xmq*k0Mx&guWEei2zalP- z_hL~>0tYWYM?c#HgvS{%x=nLNRm@{}u!}VRIDk$Ahto6u3l5BvP}<#;UzS?Sy2HU3 zd)88>`{l9ysJ_UxAIM1ObRIw+BjqZ-nRlH2&wrtV>T7JaTqm!0RixpodoU=OfRBtv zvxka!W%N>}zWzZcll!7JqZxZS#EUBZoxD<2iV=g&xw6e6q&ply_bOMo*!_pRxnWGQ zUWNv%qoT*hD(>$zN1C;{fhcV)nZ3V`l_jD+PQ>7c*(Zd2ZZ5{YFvIm#Q^nf4 z2ee3yflbd?&Y09kc6h&>A+>oT$-@?Z!CD?k0IiAN5;gw*HPp z_kEmhvz-BDPsQaE0sPR)1qNPbeEzNxzMebLPt8wmHTaBev%;{YY9G5!xr7!!hcWx* zchMoIlHczv!je^Y5cAm@ofOY9R@5MWpE=h2DyG4!AdI}yT4?Gk!p5QnjSgqif2}^J z>~6>6`KdCZ%S1eX{ZFp(Jjbw+L*&bJb;i<6L`T%(U!Wa~r@q6Gn`P{E+K{ou>sX{& z#ty$TL^CCK9?JR6!-ekjkh!!T)f{J2-Nl0NMp`JvqFHbP*EWBT+NT0)nmwp{%o?VV z^`g=84D$OZaK?%d-aMu%DorfuH#kggYaWlWX{qS?Z#C>(?8KkaSyN0D*GOTpMV4Q!g8RSs4A)$aKRv930o33(FGh5p)0;0ITVSQ*CYU*%VCzkp zP`#)u{{`3can~VoS~d84{sg+c-i0hhidOMOxVJS=*gd(8El-^BDzXe+bW&vQipS7h zvs*q*_rU@qOW}R^E0o7%Qh#(B4?ADwn|tZhZ4ts$w-Wxi6oDQ?53+Kty6oxx0BZI7 z8Th^h`~%+#D+^bA+0utCR*b@U&rNK#sx!hm+RB_`@45B78J<5(=evC+QekTrywfj< z?#jJ*X3-27&WfUcuVL(TXgk$1c8S*?G|<=kB$NK8aPpq}GT@IUCRu+GrSCd&z@1Zc zn^w)d&adg2cavIs7Kks0O}TWT9ag+;hKf&Rh<5bl6t8%Wb!f&;VSTvhNmK5xS}c#( zC&Ka9TAB2^J4>655GnU(!LL%4-PZZSw@rjNH~0-b^0Q?^v(>PgUIM-7bgJK4FJ~Ug z#5|R&qHRPjoNErS&F6`j6Yk5@z$Y-KkKb!~w=9*duBV#yP2AeybJI z)jN_6R#p6`v>Q)0&X<}#pD}mH2+`R%5m}+;%wP_l{5F@SE9$YnlZ{MNsKnAS8XW&2 zkhP`8QonRIRz?1zOU7be-P8s_4>RFx6d+E9-sgt=LMAT^hgoQ(oM6@;8;sIf|Hz$b zUt6Qq&~;GjbqfF0#B%SIySTO4o*%crWl#T8Ebugh-$GN$;|k){zVm#tV}vX_7t9Ct z!`Qt~BgZ~562(OeVRO<6Vf~HqdgXhm+5HFK-o7cTRjcs)dAvMv=oMb*$BEkyj?;5Z zoKRkHi9Tl2kagq$9=@L_2gYCI#e+lTtCUQ}g`C3Y!8g!qmx^$XA48Q_iFlc-f^9tp zap8DxntisH{cTQR;#G5AvOm;hAYJg)J05S6%Nf0TEsr0l73#fD!ryh3Ojer))c{aH zufId3GRCL{)K(tj#Cd;tYQ;Aw<*nyGexs#dF<#|7mFthI@=Yr@Ts6qV8pZA6gT_ui z9=8pHd^a$|btod|EyYB`Dk>fHVfuuwNU*zy;X6N}x~B_P#XNxP!AKZyL6$~?c_LcXd@q2H+YqT*8q`(7!LKQ1-kYP%U?%Upr-?Wdqv zmPgA?Q;_t`kuk}6!ZHjPw@6>4&Wpyg%~N@_|4$Ak zjz?@H6Na*Te^vQ(!F0?Cdm(#i-QgU?7FanTpI<#)Fk;jocxSa2df(ULfGFjmgv#8O1U4ypL!sqd>tb5V_5PaOsJfHj#ItuNX_%`Ek7pm%bhr(j^@2tVKhzKVn>B*~RE3_jeA( zpvVOF-*f@DtUl5wpqM9vs`$h=4Iy@xM)MYP^mE8HhM#Nz2`a1Tx8 zfgNAPwVWMTHN#&VXubzA`;B>P?N8LKo-Ea7s&b?MC-yhGhJnS08M7?`XIl&uW9Ij# z)@&=Dt@J^#HN>WOUyFs5m_pooa4k=R0RH?YaTH{p>`=n=SAkHJZ)xQXsY3$*_y}v5!Bf ziA40=|5D7aEW!LdGdXH|J_`nz!oPYs&mFH8yEn{)VrP5i9vaMpP9tF7GZV9p&BodA zjYv#v#ZE=#h|R1;%=&ED#-_<=6(3%-{UFLmu4j)f_R#d-#FH%|WqjK$jJeeV#}@2B zE6pAvPP-8b`nAOK%NUXNR^0#C3?nY>kbYMbS>U~i7qtrUzUwp0n7#yRfdSlicO3TE z_{-l3`Fs)@gs9<()cNdyPWsU(m;0%C@ErZm^boqPJ^5@y6+a$rixJsv<+oL>*g{c7 zYB+dedEQ;Lj_8koz)Ehs*q^Iix5>n9UEnr;5EN^xnPqH>Z2^mD)Voebl;_jWHbVx5 z7I2TYiHI_*;JnGP;%@3C%!nFHr{MS0x@O8Z56^ST)5o%_taA~p4*Z*=YvV71je+!FVeP`BYV_#K565M++IaUN&3Og z@6U_)Zl2ze4+R7E9&~#$*;2tSkmE; zEOFb!=dLPpS85HC3$}3YjT5Ynx*?u=3_y)}f^4Qxi_Uk`WqM&}LQj;xnQ zyRK&3jC>r5YJ=#&>EhY2zZkN3JC>B@;$O0rG|uP(^(JSc{sJyD3zDw)8aTSam+MR) zarL?3(qZ;jM3z_ylgS2{leZs^507H}y-fa?r;CnSXRu-ID-2EQC*F(EY?m7dg@=6^ zWO@fl3#Vgn`7~skjl$VPKe4UtF`B38;^z2JY#Mw`^c^%EBR&}kcJ9x5r*PO-Zid

    0>x#XtB>7pt7eg_n}a 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 diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADBclEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADBclEncryptor.cs new file mode 100644 index 000000000..bdbacd1b7 --- /dev/null +++ b/shadowsocks-csharp/Encryption/AEAD/AEADBclEncryptor.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using Shadowsocks.Encryption.Exception; + +namespace Shadowsocks.Encryption.AEAD +{ + public sealed class AEADBclEncryptor : AEADEncryptor + { + private const int CIPHER_AES_GCM = 1; + private const int CIPHER_CHACHA20_POLY1305 = 2; + + private static readonly Dictionary _ciphers = new Dictionary + { + {"aes-128-gcm", new EncryptorInfo(16, 16, 12, 16, CIPHER_AES_GCM)}, + {"aes-192-gcm", new EncryptorInfo(24, 24, 12, 16, CIPHER_AES_GCM)}, + {"aes-256-gcm", new EncryptorInfo(32, 32, 12, 16, CIPHER_AES_GCM)}, + {"chacha20-ietf-poly1305", new EncryptorInfo(32, 32, 12, 16, CIPHER_CHACHA20_POLY1305)}, + }; + + private byte[] _encryptSubkey; + private byte[] _decryptSubkey; + private AesGcm _encryptAes; + private AesGcm _decryptAes; + private ChaCha20Poly1305 _encryptChaCha; + private ChaCha20Poly1305 _decryptChaCha; + private bool _disposed; + + public AEADBclEncryptor(string method, string password) + : base(method, password) + { + _encryptSubkey = new byte[keyLen]; + _decryptSubkey = new byte[keyLen]; + } + + public static List SupportedCiphers() + { + return new List(_ciphers.Keys); + } + + protected override Dictionary getCiphers() + { + return _ciphers; + } + + public override void InitCipher(byte[] salt, bool isEncrypt, bool isUdp) + { + base.InitCipher(salt, isEncrypt, isUdp); + + byte[] subkey = isEncrypt ? _encryptSubkey : _decryptSubkey; + DeriveSessionKey(isEncrypt ? _encryptSalt : _decryptSalt, _masterKey, subkey); + + switch (_cipher) + { + case CIPHER_AES_GCM: + if (isEncrypt) + { + _encryptAes?.Dispose(); + _encryptAes = new AesGcm(subkey, tagLen); + } + else + { + _decryptAes?.Dispose(); + _decryptAes = new AesGcm(subkey, tagLen); + } + break; + + case CIPHER_CHACHA20_POLY1305: + if (!ChaCha20Poly1305.IsSupported) + { + throw new PlatformNotSupportedException( + "ChaCha20-Poly1305 is not supported by this Windows version."); + } + + if (isEncrypt) + { + _encryptChaCha?.Dispose(); + _encryptChaCha = new ChaCha20Poly1305(subkey); + } + else + { + _decryptChaCha?.Dispose(); + _decryptChaCha = new ChaCha20Poly1305(subkey); + } + break; + + default: + throw new NotSupportedException($"Encryption method '{_method}' is not supported."); + } + } + + public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertext, ref uint clen) + { + int plainLength = checked((int)plen); + if (ciphertext.Length < plainLength + tagLen) + { + throw new ArgumentException("Ciphertext buffer is too small.", nameof(ciphertext)); + } + + ReadOnlySpan plain = plaintext.AsSpan(0, plainLength); + Span encrypted = ciphertext.AsSpan(0, plainLength); + Span tag = ciphertext.AsSpan(plainLength, tagLen); + + try + { + switch (_cipher) + { + case CIPHER_AES_GCM: + if (_encryptAes == null) + throw new InvalidOperationException("Encryption cipher is not initialized."); + _encryptAes.Encrypt(_encNonce, plain, encrypted, tag); + break; + + case CIPHER_CHACHA20_POLY1305: + if (_encryptChaCha == null) + throw new InvalidOperationException("Encryption cipher is not initialized."); + _encryptChaCha.Encrypt(_encNonce, plain, encrypted, tag); + break; + + default: + throw new NotSupportedException($"Encryption method '{_method}' is not supported."); + } + } + catch (CryptographicException e) + { + throw new CryptoErrorException("AEAD encryption failed.", e); + } + + clen = plen + (uint)tagLen; + } + + public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) + { + int cipherLength = checked((int)clen); + if (cipherLength < tagLen) + { + throw new CryptoErrorException("AEAD ciphertext is shorter than the authentication tag."); + } + + int plainLength = cipherLength - tagLen; + if (plaintext.Length < plainLength) + { + throw new ArgumentException("Plaintext buffer is too small.", nameof(plaintext)); + } + + ReadOnlySpan encrypted = ciphertext.AsSpan(0, plainLength); + ReadOnlySpan tag = ciphertext.AsSpan(plainLength, tagLen); + Span plain = plaintext.AsSpan(0, plainLength); + + try + { + switch (_cipher) + { + case CIPHER_AES_GCM: + if (_decryptAes == null) + throw new InvalidOperationException("Decryption cipher is not initialized."); + _decryptAes.Decrypt(_decNonce, encrypted, tag, plain); + break; + + case CIPHER_CHACHA20_POLY1305: + if (_decryptChaCha == null) + throw new InvalidOperationException("Decryption cipher is not initialized."); + _decryptChaCha.Decrypt(_decNonce, encrypted, tag, plain); + break; + + default: + throw new NotSupportedException($"Encryption method '{_method}' is not supported."); + } + } + catch (CryptographicException e) + { + throw new CryptoErrorException("AEAD authentication or decryption failed.", e); + } + + plen = (uint)plainLength; + } + + public override void Dispose() + { + if (_disposed) + return; + + _disposed = true; + _encryptAes?.Dispose(); + _decryptAes?.Dispose(); + _encryptChaCha?.Dispose(); + _decryptChaCha?.Dispose(); + _encryptAes = null; + _decryptAes = null; + _encryptChaCha = null; + _decryptChaCha = null; + + if (_encryptSubkey != null) + CryptographicOperations.ZeroMemory(_encryptSubkey); + if (_decryptSubkey != null) + CryptographicOperations.ZeroMemory(_decryptSubkey); + if (_masterKey != null) + CryptographicOperations.ZeroMemory(_masterKey); + } + } +} diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs index 9a8c133ca..a63cc0419 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Net; +using System.Security.Cryptography; using System.Text; using NLog; using Shadowsocks.Controller; @@ -35,8 +36,7 @@ public abstract class AEADEncryptor // internal name in the crypto library protected string _innerLibName; protected EncryptorInfo CipherInfo; - protected static byte[] _Masterkey = null; - protected byte[] _sessionKey; + protected byte[] _masterKey; protected int keyLen; protected int saltLen; protected int tagLen; @@ -88,12 +88,11 @@ protected void InitEncryptorInfo(string method) protected void InitKey(string password) { byte[] passbuf = Encoding.UTF8.GetBytes(password); - // init master key - if (_Masterkey == null) _Masterkey = new byte[keyLen]; - if (_Masterkey.Length != keyLen) Array.Resize(ref _Masterkey, keyLen); - DeriveKey(passbuf, _Masterkey, keyLen); - // init session key - if (_sessionKey == null) _sessionKey = new byte[keyLen]; + // The master key belongs to this encryptor instance. Keeping it per-instance + // prevents concurrent connections to servers with different passwords from + // overwriting each other's key material. + _masterKey = new byte[keyLen]; + DeriveKey(passbuf, _masterKey, keyLen); } public void DeriveKey(byte[] password, byte[] key, int keylen) @@ -105,13 +104,13 @@ public void DeriveKey(byte[] password, byte[] key, int keylen) { if (i == 0) { - md5sum = MbedTLS.MD5(password); + md5sum = MD5.HashData(password); } else { Array.Copy(md5sum, 0, result, 0, MD5_LEN); Array.Copy(password, 0, result, MD5_LEN, password.Length); - md5sum = MbedTLS.MD5(result); + md5sum = MD5.HashData(result); } Array.Copy(md5sum, 0, key, i, Math.Min(MD5_LEN, keylen - i)); i += MD5_LEN; @@ -120,16 +119,26 @@ public void DeriveKey(byte[] password, byte[] key, int keylen) public void DeriveSessionKey(byte[] salt, byte[] masterKey, byte[] sessionKey) { - int ret = MbedTLS.hkdf(salt, saltLen, masterKey, keyLen, InfoBytes, InfoBytes.Length, sessionKey, - keyLen); - if (ret != 0) throw new System.Exception("failed to generate session key"); + HKDF.DeriveKey( + HashAlgorithmName.SHA1, + masterKey.AsSpan(0, keyLen), + sessionKey.AsSpan(0, keyLen), + salt.AsSpan(0, saltLen), + InfoBytes); } protected void IncrementNonce(bool isEncrypt) { lock (_nonceIncrementLock) { - Sodium.sodium_increment(isEncrypt ? _encNonce : _decNonce, nonceLen); + byte[] nonce = isEncrypt ? _encNonce : _decNonce; + // Shadowsocks AEAD treats the nonce as a little-endian unsigned integer. + for (int i = 0; i < nonceLen; i++) + { + nonce[i]++; + if (nonce[i] != 0) + break; + } } } diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs deleted file mode 100644 index 17246214d..000000000 --- a/shadowsocks-csharp/Encryption/AEAD/AEADMbedTLSEncryptor.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; -using Shadowsocks.Encryption.Exception; - -namespace Shadowsocks.Encryption.AEAD -{ - public class AEADMbedTLSEncryptor - : AEADEncryptor, IDisposable - { - const int CIPHER_AES = 1; - - private IntPtr _encryptCtx = IntPtr.Zero; - private IntPtr _decryptCtx = IntPtr.Zero; - - public AEADMbedTLSEncryptor(string method, string password) - : base(method, password) - { - } - - private static readonly Dictionary _ciphers = new Dictionary - { - {"aes-128-gcm", new EncryptorInfo("AES-128-GCM", 16, 16, 12, 16, CIPHER_AES)}, - {"aes-192-gcm", new EncryptorInfo("AES-192-GCM", 24, 24, 12, 16, CIPHER_AES)}, - {"aes-256-gcm", new EncryptorInfo("AES-256-GCM", 32, 32, 12, 16, CIPHER_AES)}, - }; - - public static List SupportedCiphers() - { - return new List(_ciphers.Keys); - } - - protected override Dictionary getCiphers() - { - return _ciphers; - } - - public override void InitCipher(byte[] salt, bool isEncrypt, bool isUdp) - { - base.InitCipher(salt, isEncrypt, isUdp); - IntPtr ctx = Marshal.AllocHGlobal(MbedTLS.cipher_get_size_ex()); - if (isEncrypt) - { - _encryptCtx = ctx; - } - else - { - _decryptCtx = ctx; - } - - MbedTLS.cipher_init(ctx); - if (MbedTLS.cipher_setup(ctx, MbedTLS.cipher_info_from_string(_innerLibName)) != 0) - throw new System.Exception("Cannot initialize mbed TLS cipher context"); - - DeriveSessionKey(isEncrypt ? _encryptSalt : _decryptSalt, - _Masterkey, _sessionKey); - CipherSetKey(isEncrypt, _sessionKey); - } - - private void CipherSetKey(bool isEncrypt, byte[] key) - { - IntPtr ctx = isEncrypt ? _encryptCtx : _decryptCtx; - int ret = MbedTLS.cipher_setkey(ctx, key, keyLen * 8, - isEncrypt ? MbedTLS.MBEDTLS_ENCRYPT : MbedTLS.MBEDTLS_DECRYPT); - if (ret != 0) throw new System.Exception("failed to set key"); - ret = MbedTLS.cipher_reset(ctx); - if (ret != 0) throw new System.Exception("failed to finish preparation"); - } - - public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertext, ref uint clen) - { - // buf: all plaintext - // outbuf: ciphertext + tag - int ret; - byte[] tagbuf = new byte[tagLen]; - uint olen = 0; - switch (_cipher) - { - case CIPHER_AES: - ret = MbedTLS.cipher_auth_encrypt(_encryptCtx, - /* nonce */ - _encNonce, (uint)nonceLen, - /* AD */ - IntPtr.Zero, 0, - /* plain */ - plaintext, plen, - /* cipher */ - ciphertext, ref olen, - tagbuf, (uint)tagLen); - if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - Debug.Assert(olen == plen); - // attach tag to ciphertext - Array.Copy(tagbuf, 0, ciphertext, (int)plen, tagLen); - clen = olen + (uint)tagLen; - break; - default: - throw new System.Exception("not implemented"); - } - } - - public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) - { - // buf: ciphertext + tag - // outbuf: plaintext - int ret; - uint olen = 0; - // split tag - byte[] tagbuf = new byte[tagLen]; - Array.Copy(ciphertext, (int)(clen - tagLen), tagbuf, 0, tagLen); - switch (_cipher) - { - case CIPHER_AES: - ret = MbedTLS.cipher_auth_decrypt(_decryptCtx, - _decNonce, (uint)nonceLen, - IntPtr.Zero, 0, - ciphertext, (uint)(clen - tagLen), - plaintext, ref olen, - tagbuf, (uint)tagLen); - if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - Debug.Assert(olen == clen - tagLen); - plen = olen; - break; - default: - throw new System.Exception("not implemented"); - } - } - - #region IDisposable - - private bool _disposed; - - // instance based lock - private readonly object _lock = new object(); - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - ~AEADMbedTLSEncryptor() - { - Dispose(false); - } - - protected virtual void Dispose(bool disposing) - { - lock (_lock) - { - if (_disposed) return; - _disposed = true; - } - - if (disposing) - { - // free managed objects - } - - // free unmanaged objects - if (_encryptCtx != IntPtr.Zero) - { - MbedTLS.cipher_free(_encryptCtx); - Marshal.FreeHGlobal(_encryptCtx); - _encryptCtx = IntPtr.Zero; - } - - if (_decryptCtx != IntPtr.Zero) - { - MbedTLS.cipher_free(_decryptCtx); - Marshal.FreeHGlobal(_decryptCtx); - _decryptCtx = IntPtr.Zero; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs deleted file mode 100644 index f6a662aa1..000000000 --- a/shadowsocks-csharp/Encryption/AEAD/AEADOpenSSLEncryptor.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System; -using System.Collections.Generic; -using Shadowsocks.Encryption.Exception; - -namespace Shadowsocks.Encryption.AEAD -{ - public class AEADOpenSSLEncryptor - : AEADEncryptor, IDisposable - { - const int CIPHER_AES = 1; - const int CIPHER_CHACHA20IETFPOLY1305 = 2; - - private byte[] _opensslEncSubkey; - private byte[] _opensslDecSubkey; - - private IntPtr _encryptCtx = IntPtr.Zero; - private IntPtr _decryptCtx = IntPtr.Zero; - - private IntPtr _cipherInfoPtr = IntPtr.Zero; - - public AEADOpenSSLEncryptor(string method, string password) - : base(method, password) - { - _opensslEncSubkey = new byte[keyLen]; - _opensslDecSubkey = new byte[keyLen]; - } - - private static readonly Dictionary _ciphers = new Dictionary - { - {"aes-128-gcm", new EncryptorInfo("aes-128-gcm", 16, 16, 12, 16, CIPHER_AES)}, - {"aes-192-gcm", new EncryptorInfo("aes-192-gcm", 24, 24, 12, 16, CIPHER_AES)}, - {"aes-256-gcm", new EncryptorInfo("aes-256-gcm", 32, 32, 12, 16, CIPHER_AES)}, - {"chacha20-ietf-poly1305", new EncryptorInfo("chacha20-poly1305", 32, 32, 12, 16, CIPHER_CHACHA20IETFPOLY1305)} - }; - - public static List SupportedCiphers() - { - return new List(_ciphers.Keys); - } - - protected override Dictionary getCiphers() - { - return _ciphers; - } - - public override void InitCipher(byte[] salt, bool isEncrypt, bool isUdp) - { - base.InitCipher(salt, isEncrypt, isUdp); - _cipherInfoPtr = OpenSSL.GetCipherInfo(_innerLibName); - if (_cipherInfoPtr == IntPtr.Zero) throw new System.Exception("openssl: cipher not found"); - IntPtr ctx = OpenSSL.EVP_CIPHER_CTX_new(); - if (ctx == IntPtr.Zero) throw new System.Exception("openssl: fail to create ctx"); - - if (isEncrypt) - { - _encryptCtx = ctx; - } - else - { - _decryptCtx = ctx; - } - - DeriveSessionKey(isEncrypt ? _encryptSalt : _decryptSalt, _Masterkey, - isEncrypt ? _opensslEncSubkey : _opensslDecSubkey); - - var ret = OpenSSL.EVP_CipherInit_ex(ctx, _cipherInfoPtr, IntPtr.Zero, null, null, - isEncrypt ? OpenSSL.OPENSSL_ENCRYPT : OpenSSL.OPENSSL_DECRYPT); - if (ret != 1) throw new System.Exception("openssl: fail to init ctx"); - - ret = OpenSSL.EVP_CIPHER_CTX_set_key_length(ctx, keyLen); - if (ret != 1) throw new System.Exception("openssl: fail to set key length"); - - ret = OpenSSL.EVP_CIPHER_CTX_ctrl(ctx, OpenSSL.EVP_CTRL_AEAD_SET_IVLEN, - nonceLen, IntPtr.Zero); - if (ret != 1) throw new System.Exception("openssl: fail to set AEAD nonce length"); - - ret = OpenSSL.EVP_CipherInit_ex(ctx, IntPtr.Zero, IntPtr.Zero, - isEncrypt ? _opensslEncSubkey : _opensslDecSubkey, - null, - isEncrypt ? OpenSSL.OPENSSL_ENCRYPT : OpenSSL.OPENSSL_DECRYPT); - if (ret != 1) throw new System.Exception("openssl: cannot set key"); - OpenSSL.EVP_CIPHER_CTX_set_padding(ctx, 0); - } - - public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertext, ref uint clen) - { - OpenSSL.SetCtxNonce(_encryptCtx, _encNonce, true); - // buf: all plaintext - // outbuf: ciphertext + tag - int ret; - int tmpLen = 0; - clen = 0; - var tagBuf = new byte[tagLen]; - - ret = OpenSSL.EVP_CipherUpdate(_encryptCtx, ciphertext, out tmpLen, - plaintext, (int)plen); - if (ret != 1) throw new CryptoErrorException("openssl: fail to encrypt AEAD"); - clen += (uint)tmpLen; - // For AEAD cipher, it should not output anything - ret = OpenSSL.EVP_CipherFinal_ex(_encryptCtx, ciphertext, ref tmpLen); - if (ret != 1) throw new CryptoErrorException("openssl: fail to finalize AEAD"); - if (tmpLen > 0) - { - throw new System.Exception("openssl: fail to finish AEAD"); - } - - OpenSSL.AEADGetTag(_encryptCtx, tagBuf, tagLen); - Array.Copy(tagBuf, 0, ciphertext, clen, tagLen); - clen += (uint)tagLen; - } - - public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) - { - OpenSSL.SetCtxNonce(_decryptCtx, _decNonce, false); - // buf: ciphertext + tag - // outbuf: plaintext - int ret; - int tmpLen = 0; - plen = 0; - - // split tag - byte[] tagbuf = new byte[tagLen]; - Array.Copy(ciphertext, (int)(clen - tagLen), tagbuf, 0, tagLen); - OpenSSL.AEADSetTag(_decryptCtx, tagbuf, tagLen); - - ret = OpenSSL.EVP_CipherUpdate(_decryptCtx, - plaintext, out tmpLen, ciphertext, (int)(clen - tagLen)); - if (ret != 1) throw new CryptoErrorException("openssl: fail to decrypt AEAD"); - plen += (uint)tmpLen; - - // For AEAD cipher, it should not output anything - ret = OpenSSL.EVP_CipherFinal_ex(_decryptCtx, plaintext, ref tmpLen); - if (ret <= 0) - { - // If this is not successful authenticated - throw new CryptoErrorException(String.Format("ret is {0}", ret)); - } - - if (tmpLen > 0) - { - throw new System.Exception("openssl: fail to finish AEAD"); - } - } - - #region IDisposable - - private bool _disposed; - - // instance based lock - private readonly object _lock = new object(); - - public override void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - ~AEADOpenSSLEncryptor() - { - Dispose(false); - } - - protected virtual void Dispose(bool disposing) - { - lock (_lock) - { - if (_disposed) return; - _disposed = true; - } - - if (disposing) - { - // free managed objects - } - - // free unmanaged objects - if (_encryptCtx != IntPtr.Zero) - { - OpenSSL.EVP_CIPHER_CTX_free(_encryptCtx); - _encryptCtx = IntPtr.Zero; - } - - if (_decryptCtx != IntPtr.Zero) - { - OpenSSL.EVP_CIPHER_CTX_free(_decryptCtx); - _decryptCtx = IntPtr.Zero; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs deleted file mode 100644 index 7736bb2d3..000000000 --- a/shadowsocks-csharp/Encryption/AEAD/AEADSodiumEncryptor.cs +++ /dev/null @@ -1,140 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using NLog; -using Shadowsocks.Encryption.Exception; - -namespace Shadowsocks.Encryption.AEAD -{ - public class AEADSodiumEncryptor - : AEADEncryptor, IDisposable - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - private const int CIPHER_CHACHA20IETFPOLY1305 = 1; - private const int CIPHER_XCHACHA20IETFPOLY1305 = 2; - private const int CIPHER_AES256GCM = 3; - - private byte[] _sodiumEncSubkey; - private byte[] _sodiumDecSubkey; - - public AEADSodiumEncryptor(string method, string password) - : base(method, password) - { - _sodiumEncSubkey = new byte[keyLen]; - _sodiumDecSubkey = new byte[keyLen]; - } - - private static readonly Dictionary _ciphers = new Dictionary - { - {"chacha20-ietf-poly1305", new EncryptorInfo(32, 32, 12, 16, CIPHER_CHACHA20IETFPOLY1305)}, - {"xchacha20-ietf-poly1305", new EncryptorInfo(32, 32, 24, 16, CIPHER_XCHACHA20IETFPOLY1305)}, - {"aes-256-gcm", new EncryptorInfo(32, 32, 12, 16, CIPHER_AES256GCM)}, - }; - - public static List SupportedCiphers() - { - return new List(_ciphers.Keys); - } - - protected override Dictionary getCiphers() - { - return _ciphers; - } - - public override void InitCipher(byte[] salt, bool isEncrypt, bool isUdp) - { - base.InitCipher(salt, isEncrypt, isUdp); - DeriveSessionKey(isEncrypt ? _encryptSalt : _decryptSalt, _Masterkey, - isEncrypt ? _sodiumEncSubkey : _sodiumDecSubkey); - } - - - public override void cipherEncrypt(byte[] plaintext, uint plen, byte[] ciphertext, ref uint clen) - { - Debug.Assert(_sodiumEncSubkey != null); - // buf: all plaintext - // outbuf: ciphertext + tag - int ret; - ulong encClen = 0; - logger.Dump("_encNonce before enc", _encNonce, nonceLen); - logger.Dump("_sodiumEncSubkey", _sodiumEncSubkey, keyLen); - logger.Dump("before cipherEncrypt: plain", plaintext, (int)plen); - switch (_cipher) - { - case CIPHER_CHACHA20IETFPOLY1305: - ret = Sodium.crypto_aead_chacha20poly1305_ietf_encrypt(ciphertext, ref encClen, - plaintext, (ulong)plen, - null, 0, - null, _encNonce, - _sodiumEncSubkey); - break; - case CIPHER_XCHACHA20IETFPOLY1305: - ret = Sodium.crypto_aead_xchacha20poly1305_ietf_encrypt(ciphertext, ref encClen, - plaintext, (ulong)plen, - null, 0, - null, _encNonce, - _sodiumEncSubkey); - break; - case CIPHER_AES256GCM: - ret = Sodium.crypto_aead_aes256gcm_encrypt(ciphertext, ref encClen, - plaintext, (ulong)plen, - null, 0, - null, _encNonce, - _sodiumEncSubkey); - break; - default: - throw new System.Exception("not implemented"); - } - if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - logger.Dump("after cipherEncrypt: cipher", ciphertext, (int)encClen); - clen = (uint)encClen; - } - - public override void cipherDecrypt(byte[] ciphertext, uint clen, byte[] plaintext, ref uint plen) - { - Debug.Assert(_sodiumDecSubkey != null); - // buf: ciphertext + tag - // outbuf: plaintext - int ret; - ulong decPlen = 0; - logger.Dump("_decNonce before dec", _decNonce, nonceLen); - logger.Dump("_sodiumDecSubkey", _sodiumDecSubkey, keyLen); - logger.Dump("before cipherDecrypt: cipher", ciphertext, (int)clen); - switch (_cipher) - { - case CIPHER_CHACHA20IETFPOLY1305: - ret = Sodium.crypto_aead_chacha20poly1305_ietf_decrypt(plaintext, ref decPlen, - null, - ciphertext, (ulong)clen, - null, 0, - _decNonce, _sodiumDecSubkey); - break; - case CIPHER_XCHACHA20IETFPOLY1305: - ret = Sodium.crypto_aead_xchacha20poly1305_ietf_decrypt(plaintext, ref decPlen, - null, - ciphertext, (ulong)clen, - null, 0, - _decNonce, _sodiumDecSubkey); - break; - case CIPHER_AES256GCM: - ret = Sodium.crypto_aead_aes256gcm_decrypt(plaintext, ref decPlen, - null, - ciphertext, (ulong)clen, - null, 0, - _decNonce, _sodiumDecSubkey); - break; - default: - throw new System.Exception("not implemented"); - } - - if (ret != 0) throw new CryptoErrorException(String.Format("ret is {0}", ret)); - logger.Dump("after cipherDecrypt: plain", plaintext, (int)decPlen); - plen = (uint)decPlen; - } - - public override void Dispose() - { - } - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index b462ada39..217a34730 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -15,42 +15,14 @@ public static class EncryptorFactory static EncryptorFactory() { - var AEADMbedTLSEncryptorSupportedCiphers = AEADMbedTLSEncryptor.SupportedCiphers(); - var AEADSodiumEncryptorSupportedCiphers = AEADSodiumEncryptor.SupportedCiphers(); - var PlainEncryptorSupportedCiphers = PlainEncryptor.SupportedCiphers(); - - if (Sodium.AES256GCMAvailable) - { - // prefer to aes-256-gcm in libsodium - AEADMbedTLSEncryptorSupportedCiphers.Remove("aes-256-gcm"); - } - else - { - AEADSodiumEncryptorSupportedCiphers.Remove("aes-256-gcm"); - } - - foreach (string method in AEADOpenSSLEncryptor.SupportedCiphers()) - { - if (!_registeredEncryptors.ContainsKey(method)) - _registeredEncryptors.Add(method, typeof(AEADOpenSSLEncryptor)); - } - - foreach (string method in AEADSodiumEncryptorSupportedCiphers) + foreach (string method in AEADBclEncryptor.SupportedCiphers()) { - if (!_registeredEncryptors.ContainsKey(method)) - _registeredEncryptors.Add(method, typeof(AEADSodiumEncryptor)); + _registeredEncryptors.Add(method, typeof(AEADBclEncryptor)); } - foreach (string method in AEADMbedTLSEncryptorSupportedCiphers) + foreach (string method in PlainEncryptor.SupportedCiphers()) { - if (!_registeredEncryptors.ContainsKey(method)) - _registeredEncryptors.Add(method, typeof(AEADMbedTLSEncryptor)); - } - - foreach (string method in PlainEncryptorSupportedCiphers) - { - if (!_registeredEncryptors.ContainsKey(method)) - _registeredEncryptors.Add(method, typeof(PlainEncryptor)); + _registeredEncryptors.Add(method, typeof(PlainEncryptor)); } } @@ -62,7 +34,10 @@ public static IEncryptor GetEncryptor(string method, string password) } method = method.ToLowerInvariant(); - Type t = _registeredEncryptors[method]; + if (!_registeredEncryptors.TryGetValue(method, out Type t)) + { + throw new NotSupportedException($"Encryption method '{method}' is not supported."); + } ConstructorInfo c = t.GetConstructor(ConstructorTypes); if (c == null) throw new System.Exception("Invalid ctor"); diff --git a/shadowsocks-csharp/Encryption/MbedTLS.cs b/shadowsocks-csharp/Encryption/MbedTLS.cs deleted file mode 100644 index 6d64a0ba9..000000000 --- a/shadowsocks-csharp/Encryption/MbedTLS.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using NLog; -using Shadowsocks.Controller; -using Shadowsocks.Properties; -using Shadowsocks.Util; - -namespace Shadowsocks.Encryption -{ - public static class MbedTLS - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - private const string DLLNAME = "libsscrypto.dll"; - - public const int MBEDTLS_ENCRYPT = 1; - public const int MBEDTLS_DECRYPT = 0; - - static MbedTLS() - { - string dllPath = Utils.GetTempPath(DLLNAME); - try - { - FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll); - } - catch (IOException) - { - } - catch (System.Exception e) - { - logger.LogUsefulException(e); - } - LoadLibrary(dllPath); - } - - public static byte[] MD5(byte[] input) - { - byte[] output = new byte[16]; - if (md5_ret(input, (uint)input.Length, output) != 0) - throw new System.Exception("mbedtls: MD5 failure"); - return output; - } - - [DllImport("Kernel32.dll")] - private static extern IntPtr LoadLibrary(string path); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int md5_ret(byte[] input, uint ilen, byte[] output); - - ///

    - /// Get cipher ctx size for unmanaged memory allocation - /// - /// - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_get_size_ex(); - - #region Cipher layer wrappers - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr cipher_info_from_string(string cipher_name); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern void cipher_init(IntPtr ctx); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_setup(IntPtr ctx, IntPtr cipher_info); - - // XXX: Check operation before using it - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_setkey(IntPtr ctx, byte[] key, int key_bitlen, int operation); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_set_iv(IntPtr ctx, byte[] iv, int iv_len); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_reset(IntPtr ctx); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_update(IntPtr ctx, byte[] input, int ilen, byte[] output, ref int olen); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern void cipher_free(IntPtr ctx); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_auth_encrypt(IntPtr ctx, - byte[] iv, uint iv_len, - IntPtr ad, uint ad_len, - byte[] input, uint ilen, - byte[] output, ref uint olen, - byte[] tag, uint tag_len); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int cipher_auth_decrypt(IntPtr ctx, - byte[] iv, uint iv_len, - IntPtr ad, uint ad_len, - byte[] input, uint ilen, - byte[] output, ref uint olen, - byte[] tag, uint tag_len); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int hkdf(byte[] salt, - int salt_len, byte[] ikm, int ikm_len, - byte[] info, int info_len, byte[] okm, - int okm_len); - - #endregion - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/OpenSSL.cs b/shadowsocks-csharp/Encryption/OpenSSL.cs deleted file mode 100644 index 00056a04c..000000000 --- a/shadowsocks-csharp/Encryption/OpenSSL.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using System.Security; -using System.Text; -using NLog; -using Shadowsocks.Controller; -using Shadowsocks.Encryption.Exception; -using Shadowsocks.Properties; -using Shadowsocks.Util; - -namespace Shadowsocks.Encryption -{ - // XXX: only for OpenSSL 1.1.0 and higher - public static class OpenSSL - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - private const string DLLNAME = "libsscrypto.dll"; - - public const int OPENSSL_ENCRYPT = 1; - public const int OPENSSL_DECRYPT = 0; - - public const int EVP_CTRL_AEAD_SET_IVLEN = 0x9; - public const int EVP_CTRL_AEAD_GET_TAG = 0x10; - public const int EVP_CTRL_AEAD_SET_TAG = 0x11; - - static OpenSSL() - { - string dllPath = Utils.GetTempPath(DLLNAME); - try - { - FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll); - } - catch (IOException) - { - } - catch (System.Exception e) - { - logger.LogUsefulException(e); - } - LoadLibrary(dllPath); - } - - public static IntPtr GetCipherInfo(string cipherName) - { - var name = Encoding.ASCII.GetBytes(cipherName); - Array.Resize(ref name, name.Length + 1); - return EVP_get_cipherbyname(name); - } - - /// - /// Need init cipher context after EVP_CipherFinal_ex to reuse context - /// - /// - /// - /// - public static void SetCtxNonce(IntPtr ctx, byte[] nonce, bool isEncrypt) - { - var ret = EVP_CipherInit_ex(ctx, IntPtr.Zero, - IntPtr.Zero, null, - nonce, - isEncrypt ? OPENSSL_ENCRYPT : OPENSSL_DECRYPT); - if (ret != 1) throw new System.Exception("openssl: fail to set AEAD nonce"); - } - - public static void AEADGetTag(IntPtr ctx, byte[] tagbuf, int taglen) - { - IntPtr tagBufIntPtr = IntPtr.Zero; - try - { - tagBufIntPtr = Marshal.AllocHGlobal(taglen); - var ret = EVP_CIPHER_CTX_ctrl(ctx, - EVP_CTRL_AEAD_GET_TAG, taglen, tagBufIntPtr); - if (ret != 1) throw new CryptoErrorException("openssl: fail to get AEAD tag"); - // take tag from unmanaged memory - Marshal.Copy(tagBufIntPtr, tagbuf, 0, taglen); - } - finally - { - if (tagBufIntPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(tagBufIntPtr); - } - } - } - - public static void AEADSetTag(IntPtr ctx, byte[] tagbuf, int taglen) - { - IntPtr tagBufIntPtr = IntPtr.Zero; - try - { - // allocate unmanaged memory for tag - tagBufIntPtr = Marshal.AllocHGlobal(taglen); - - // copy tag to unmanaged memory - Marshal.Copy(tagbuf, 0, tagBufIntPtr, taglen); - - var ret = EVP_CIPHER_CTX_ctrl(ctx, - EVP_CTRL_AEAD_SET_TAG, taglen, tagBufIntPtr); - - if (ret != 1) throw new CryptoErrorException("openssl: fail to set AEAD tag"); - - } - finally - { - if (tagBufIntPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(tagBufIntPtr); - } - } - } - - [DllImport("Kernel32.dll")] - private static extern IntPtr LoadLibrary(string path); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr EVP_CIPHER_CTX_new(); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern void EVP_CIPHER_CTX_free(IntPtr ctx); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CIPHER_CTX_reset(IntPtr ctx); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CipherInit_ex(IntPtr ctx, IntPtr type, - IntPtr impl, byte[] key, byte[] iv, int enc); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CipherUpdate(IntPtr ctx, byte[] outb, - out int outl, byte[] inb, int inl); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CipherFinal_ex(IntPtr ctx, byte[] outm, ref int outl); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CIPHER_CTX_set_padding(IntPtr x, int padding); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CIPHER_CTX_set_key_length(IntPtr x, int keylen); - - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int EVP_CIPHER_CTX_ctrl(IntPtr ctx, int type, int arg, IntPtr ptr); - - /// - /// simulate NUL-terminated string - /// - /// - /// - [SuppressUnmanagedCodeSecurity] - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr EVP_get_cipherbyname(byte[] name); - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Encryption/Sodium.cs b/shadowsocks-csharp/Encryption/Sodium.cs deleted file mode 100755 index 6b9441dd5..000000000 --- a/shadowsocks-csharp/Encryption/Sodium.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.IO; -using System.Runtime.InteropServices; -using NLog; -using Shadowsocks.Controller; -using Shadowsocks.Properties; -using Shadowsocks.Util; - -namespace Shadowsocks.Encryption -{ - public static class Sodium - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - private const string DLLNAME = "libsscrypto.dll"; - - private static bool _initialized = false; - private static readonly object _initLock = new object(); - - public static bool AES256GCMAvailable { get; private set; } = false; - - static Sodium() - { - string dllPath = Utils.GetTempPath(DLLNAME); - try - { - FileManager.UncompressFile(dllPath, Resources.libsscrypto_dll); - } - catch (IOException) - { - } - catch (System.Exception e) - { - logger.LogUsefulException(e); - } - LoadLibrary(dllPath); - - lock (_initLock) - { - if (!_initialized) - { - if (sodium_init() == -1) - { - throw new System.Exception("Failed to initialize sodium"); - } - else /* 1 means already initialized; 0 means success */ - { - _initialized = true; - } - - AES256GCMAvailable = crypto_aead_aes256gcm_is_available() == 1; - logger.Debug($"sodium: AES256GCMAvailable is {AES256GCMAvailable}"); - } - } - } - - [DllImport("Kernel32.dll")] - private static extern IntPtr LoadLibrary(string path); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - private static extern int sodium_init(); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - private static extern int crypto_aead_aes256gcm_is_available(); - - #region AEAD - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int sodium_increment(byte[] n, int nlen); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_chacha20poly1305_ietf_encrypt(byte[] c, ref ulong clen_p, byte[] m, - ulong mlen, byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_chacha20poly1305_ietf_decrypt(byte[] m, ref ulong mlen_p, - byte[] nsec, byte[] c, ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_xchacha20poly1305_ietf_encrypt(byte[] c, ref ulong clen_p, byte[] m, ulong mlen, - byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_xchacha20poly1305_ietf_decrypt(byte[] m, ref ulong mlen_p, byte[] nsec, byte[] c, - ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_aes256gcm_encrypt(byte[] c, ref ulong clen_p, byte[] m, ulong mlen, - byte[] ad, ulong adlen, byte[] nsec, byte[] npub, byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_aead_aes256gcm_decrypt(byte[] m, ref ulong mlen_p, byte[] nsec, byte[] c, - ulong clen, byte[] ad, ulong adlen, byte[] npub, byte[] k); - - #endregion - - #region Stream - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_stream_salsa20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, - byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_stream_chacha20_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, ulong ic, - byte[] k); - - [DllImport(DLLNAME, CallingConvention = CallingConvention.Cdecl)] - public static extern int crypto_stream_chacha20_ietf_xor_ic(byte[] c, byte[] m, ulong mlen, byte[] n, uint ic, - byte[] k); - - #endregion - } -} \ No newline at end of file diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index ae3f9e4dc..04afc9690 100644 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -205,6 +205,21 @@ public static void Process(ref Configuration config) // Add an empty server configuration if (config.configs.Count == 0) config.configs.Add(GetDefaultServer()); + + // XChaCha20-Poly1305 depended on the removed native libsodium backend. + // Keep old gui-config.json files loadable, but the remote server must also + // be changed to the replacement method before the connection can succeed. + foreach (Server server in config.configs) + { + if (string.Equals(server.method, "xchacha20-ietf-poly1305", StringComparison.OrdinalIgnoreCase)) + { + logger.Warn( + $"Encryption method 'xchacha20-ietf-poly1305' is no longer supported for {server.server}:{server.server_port}; " + + $"using '{Server.DefaultMethod}' locally. The remote server must use the same method."); + server.method = Server.DefaultMethod; + } + } + // Selected server if (config.index == -1 && string.IsNullOrEmpty(config.strategy)) config.index = 0; diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 1e4050233..5fe8ee762 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -119,16 +119,6 @@ public static string i18n_csv { } } - /// - /// Looks up a localized resource of type System.Byte[]. - /// - public static byte[] libsscrypto_dll { - get { - object obj = ResourceManager.GetObject("libsscrypto_dll", resourceCulture); - return ((byte[])(obj)); - } - } - /// /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> ///<!-- Warning: Configuration may reset after shadowsocks upgrade. --> diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index c50ad62b8..79c1b944c 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -127,10 +127,7 @@ ..\Data\i18n.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - ..\Data\libsscrypto.dll.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - + ..\data\nlog.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 diff --git a/shadowsocks-csharp/View/ConfigForm.cs b/shadowsocks-csharp/View/ConfigForm.cs index f14f4d310..5b998a04d 100755 --- a/shadowsocks-csharp/View/ConfigForm.cs +++ b/shadowsocks-csharp/View/ConfigForm.cs @@ -33,7 +33,6 @@ private class EncryptionMethod "aes-192-gcm", "aes-128-gcm", "chacha20-ietf-poly1305", - "xchacha20-ietf-poly1305", }; public static EncryptionMethod[] AllMethods { diff --git a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs index 4a8778093..12f493fb6 100644 --- a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs +++ b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs @@ -20,17 +20,11 @@ public ForwardProxyViewModel() _menuViewController = Program.MenuController; if (!_config.proxy.useProxy) - { NoProxy = true; - } else if (_config.proxy.proxyType == 0) - { UseSocks5Proxy = true; - } else - { UseHttpProxy = true; - } Address = _config.proxy.proxyServer; Port = _config.proxy.proxyPort; @@ -152,9 +146,7 @@ private ForwardProxyConfig GetForwardProxyConfig() authPwd = Password }; if (NoProxy) - { forwardProxyConfig.useProxy = false; - } else if (UseSocks5Proxy) { forwardProxyConfig.useProxy = true; diff --git a/shadowsocks-csharp/shadowsocks-csharp.csproj b/shadowsocks-csharp/shadowsocks-csharp.csproj index e419c428a..37f9aa6e3 100644 --- a/shadowsocks-csharp/shadowsocks-csharp.csproj +++ b/shadowsocks-csharp/shadowsocks-csharp.csproj @@ -78,4 +78,15 @@ + + + + + + diff --git a/test/CryptoTest.cs b/test/CryptoTest.cs new file mode 100644 index 000000000..eb33171e9 --- /dev/null +++ b/test/CryptoTest.cs @@ -0,0 +1,89 @@ +using System; +using System.Security.Cryptography; +using System.Text; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Shadowsocks.Encryption; +using Shadowsocks.Encryption.AEAD; + +namespace Shadowsocks.Test +{ + [TestClass] + public class CryptoTest + { + private static readonly byte[] Plaintext = Encoding.ASCII.GetBytes("Shadowsocks BCL AEAD test vector."); + + [TestMethod] + public void Aes128GcmMatchesKnownVector() + { + AssertCipherVector( + "aes-128-gcm", + 16, + "bba8aa0b54856cc1a4b63f7e8970fbf9b6e66699924451cda14fea4a140c83f76ea29a8f2cb2749f8773bf9a63e6b34e00"); + } + + [TestMethod] + public void Aes192GcmMatchesKnownVector() + { + AssertCipherVector( + "aes-192-gcm", + 24, + "2b528572ee8a4f9638e4f59dfbd9b57d00e7a6c6924d0f4ee22f54b61dc4533b3d57bd9eb8329953e5f314b3fa60a03410"); + } + + [TestMethod] + public void Aes256GcmMatchesKnownVector() + { + AssertCipherVector( + "aes-256-gcm", + 32, + "b3b8c1facbe8751d4d7ce600f6cd5fa9cd8273d3e48139b2eb4d2ae7876d819d12776ded0d6194192833f2a25b12113581"); + } + + [TestMethod] + public void ChaCha20Poly1305MatchesKnownVector() + { + if (!ChaCha20Poly1305.IsSupported) + { + Assert.Inconclusive("ChaCha20-Poly1305 is not supported by this Windows version."); + } + + AssertCipherVector( + "chacha20-ietf-poly1305", + 32, + "2977565a6f87f83abd2a2e01a0524eb0f30a977d31e52368cf4b1491f3ea4d8a583f7dc40bba501dd5bfb38aa5734f2f00"); + } + + [TestMethod] + public void FactoryDoesNotRegisterXChaCha() + { + string registered = EncryptorFactory.DumpRegisteredEncryptor(); + Assert.IsFalse(registered.Contains("xchacha20-ietf-poly1305", StringComparison.Ordinal)); + Assert.IsTrue(registered.Contains("aes-256-gcm=>AEADBclEncryptor", StringComparison.Ordinal)); + Assert.IsTrue(registered.Contains("chacha20-ietf-poly1305=>AEADBclEncryptor", StringComparison.Ordinal)); + } + + private static void AssertCipherVector(string method, int saltLength, string expectedHex) + { + using var encryptor = new AEADBclEncryptor(method, "test-password"); + byte[] salt = new byte[saltLength]; + for (int i = 0; i < salt.Length; i++) + salt[i] = (byte)i; + + encryptor.InitCipher(salt, true, true); + byte[] ciphertext = new byte[Plaintext.Length + 16]; + uint ciphertextLength = 0; + encryptor.cipherEncrypt(Plaintext, (uint)Plaintext.Length, ciphertext, ref ciphertextLength); + + Assert.AreEqual(ciphertext.Length, (int)ciphertextLength); + Assert.AreEqual(expectedHex, Convert.ToHexString(ciphertext).ToLowerInvariant()); + + encryptor.InitCipher(salt, false, true); + byte[] decrypted = new byte[Plaintext.Length]; + uint plaintextLength = 0; + encryptor.cipherDecrypt(ciphertext, ciphertextLength, decrypted, ref plaintextLength); + + Assert.AreEqual(Plaintext.Length, (int)plaintextLength); + CollectionAssert.AreEqual(Plaintext, decrypted); + } + } +} From 3ec9464f806d8966596b92b74f32b51b4d7bce4a Mon Sep 17 00:00:00 2001 From: SlimRG <39348033+SlimRG@users.noreply.github.com> Date: Thu, 13 Aug 2026 19:24:28 +0300 Subject: [PATCH 05/32] Fix GeoSite logic --- .gitignore | 7 + README.md | 13 +- README.ru.md | 13 +- shadowsocks-csharp/CommandLineOption.cs | 2 +- shadowsocks-csharp/Controller/FileManager.cs | 2 +- shadowsocks-csharp/Controller/HotkeyReg.cs | 2 +- shadowsocks-csharp/Controller/I18N.cs | 2 +- .../Controller/LoggerExtension.cs | 2 +- .../Controller/Service/GeositeUpdater.cs | 697 +- .../Controller/Service/Listener.cs | 2 +- .../Service/LocalProxyHttpClient.cs | 38 + .../Service/OnlineConfigResolver.cs | 2 +- .../Controller/Service/OnlinePacCache.cs | 188 + .../Controller/Service/PACDaemon.cs | 128 +- .../Controller/Service/PACServer.cs | 397 +- .../Controller/Service/PrivoxyRunner.cs | 2 +- .../Controller/Service/Sip003Plugin.cs | 2 +- .../Controller/Service/UpdateChecker.cs | 2 +- .../Controller/ShadowsocksController.cs | 1565 +-- .../Controller/Strategy/BalancingStrategy.cs | 2 +- .../Strategy/HighAvailabilityStrategy.cs | 2 +- .../Controller/Strategy/IStrategy.cs | 2 +- .../Controller/Strategy/StrategyManager.cs | 2 +- .../System/Hotkeys/HotkeyCallbacks.cs | 2 +- .../Controller/System/Hotkeys/Hotkeys.cs | 2 +- .../Controller/System/ProtocolHandler.cs | 2 +- .../Controller/System/SystemProxy.cs | 237 +- shadowsocks-csharp/Data/dlc.dat | 10782 ---------------- shadowsocks-csharp/Data/i18n.csv | 2 + .../Encryption/AEAD/AEADEncryptor.cs | 2 +- .../Encryption/EncryptorBase.cs | 2 +- .../Encryption/EncryptorFactory.cs | 2 +- .../Localization/Strings.fr.resx | 18 + .../Localization/Strings.ja.resx | 21 + .../Localization/Strings.ko.resx | 21 + shadowsocks-csharp/Localization/Strings.resx | 15 + .../Localization/Strings.ru.resx | 15 + .../Localization/Strings.zh-Hans.resx | 15 + .../Localization/Strings.zh-Hant.resx | 21 + shadowsocks-csharp/Model/Configuration.cs | 59 +- shadowsocks-csharp/Model/NlogConfig.cs | 2 +- shadowsocks-csharp/Program.cs | 2 +- shadowsocks-csharp/Properties/AssemblyInfo.cs | 2 +- .../Properties/Resources.Designer.cs | 440 +- shadowsocks-csharp/Properties/Resources.resx | 311 +- shadowsocks-csharp/Proxy/HttpProxy.cs | 2 +- shadowsocks-csharp/Proxy/Socks5Proxy.cs | 2 +- .../Util/ProcessManagement/Job.cs | 2 +- shadowsocks-csharp/Util/Sockets/SocketUtil.cs | 2 +- .../Util/Sockets/WrappedSocket.cs | 2 +- shadowsocks-csharp/Util/Util.cs | 2 +- shadowsocks-csharp/View/LogForm.cs | 2 +- shadowsocks-csharp/View/MenuViewController.cs | 38 +- .../ViewModels/ForwardProxyViewModel.cs | 2 +- .../ViewModels/GeositeSourcesViewModel.cs | 143 + .../ViewModels/HotkeysViewModel.cs | 2 +- .../ViewModels/OnlineConfigViewModel.cs | 2 +- .../ViewModels/ServerSharingViewModel.cs | 2 +- .../VersionUpdatePromptViewModel.cs | 2 +- .../Views/ForwardProxyView.xaml.cs | 2 +- .../Views/GeositeSourcesView.xaml | 68 + .../Views/GeositeSourcesView.xaml.cs | 46 + shadowsocks-csharp/Views/HotkeysView.xaml.cs | 2 +- .../Views/OnlineConfigView.xaml.cs | 2 +- .../Views/ServerSharingView.xaml.cs | 2 +- .../Views/VersionUpdatePromptView.xaml.cs | 2 +- shadowsocks-csharp/shadowsocks-csharp.csproj | 11 +- test/GeositeSourceTest.cs | 35 + test/Properties/AssemblyInfo.cs | 2 +- test/Sip003PluginTest.cs | 2 +- test/UnitTest.cs | 2 +- test/UrlTest.cs | 2 +- 72 files changed, 2923 insertions(+), 12509 deletions(-) create mode 100644 shadowsocks-csharp/Controller/Service/LocalProxyHttpClient.cs create mode 100644 shadowsocks-csharp/Controller/Service/OnlinePacCache.cs delete mode 100644 shadowsocks-csharp/Data/dlc.dat create mode 100644 shadowsocks-csharp/ViewModels/GeositeSourcesViewModel.cs create mode 100644 shadowsocks-csharp/Views/GeositeSourcesView.xaml create mode 100644 shadowsocks-csharp/Views/GeositeSourcesView.xaml.cs create mode 100644 test/GeositeSourceTest.cs diff --git a/.gitignore b/.gitignore index 61dc74987..a25d030d8 100644 --- a/.gitignore +++ b/.gitignore @@ -364,3 +364,10 @@ MigrationBackup/ !.vscode/launch.json !.vscode/extensions.json *.code-workspace + +# Runtime PAC/GeoSite caches +/dlc.dat +/online-pac-cache.pac +/online-pac-cache.meta.json + +/geosite-cache/ diff --git a/README.md b/README.md index 78c68c4ab..6a67e52b4 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ This repository keeps the Shadowsocks for Windows **v4** client architecture and - PAC and Global Windows system-proxy modes. - Local SOCKS5 and HTTP proxy endpoints. -- GeoSite-based PAC generation and custom user rules. +- Local PAC generation from an on-demand GeoSite cache, plus cached Online PAC support. - SIP003 plugins and UDP relay. - Server switching strategies. - QR-code import/export and online configuration sources. @@ -34,6 +34,8 @@ The explicit Windows TFM is required by the current ReactiveUI/System.Reactive s - Supported AEAD methods are implemented by `AEADBclEncryptor` using `System.Security.Cryptography`. - The old `libsscrypto.dll`, OpenSSL, mbedTLS and libsodium wrappers are not part of the active crypto path. Their legacy source filenames are explicitly excluded in the SDK-style project so stale files left by an in-place archive update cannot be compiled accidentally. - System proxy changes are performed in-process through WinINet; the old `sysproxy.exe` helpers are not used. +- GeoSite is no longer embedded. Local PAC downloads its configured GeoSite source(s) through the active Shadowsocks connection on demand and keeps per-source runtime caches. +- Online PAC files are downloaded through Shadowsocks, cached locally, and served to WinINet from the local `/pac` endpoint; Windows no longer fetches the remote PAC URL directly. - The UI is currently **mixed WinForms/WPF**. A complete Windows 11 WPF/Metro UI migration is not finished yet. - The supplied publish profile is currently **framework-dependent, untrimmed, x86 and single-file**. **NativeAOT is not enabled yet.** @@ -102,11 +104,14 @@ On full exit, the system proxy state captured before Shadowsocks started is rest ## PAC -PAC rules are generated from the GeoSite database from [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). +The two PAC sources are independent: -Custom rules belong in `user-rule.txt`; generated `pac.txt` may be replaced after a GeoSite update. +- **Local PAC** uses one or more configurable GeoSite databases. The default source is [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community), but `PAC → GeoSite Sources...` can replace it or add third-party databases. Sources are downloaded only while Local PAC is active, through the already running Shadowsocks connection, cached independently under `geosite-cache`, and merged by GeoSite group name. For every database URL Shadowsocks automatically tries the adjacent `.sha256sum`; a missing or unreachable checksum is non-fatal, while a checksum that is present must match. Custom rules belong in `user-rule.txt`; generated `pac.txt` may be replaced after a GeoSite/source update. +- **Online PAC** does not use GeoSite. The configured remote PAC URL is fetched through the running Shadowsocks connection and stored as `online-pac-cache.pac`. WinINet is always configured with the local Shadowsocks `/pac` URL, so a blocked or temporarily unavailable PAC host does not invalidate an existing cache. HTTP validators (`ETag`/`Last-Modified`) are reused when available. -Relevant settings include `geositeDirectGroups`, `geositeProxiedGroups` and `geositePreferDirect`. +Until a first-time PAC download finishes, the local PAC endpoint temporarily returns a proxy-all rule instead of falling back to a direct connection. + +Local PAC settings include `geositeDirectGroups`, `geositeProxiedGroups` and `geositePreferDirect`. ## Plugins and HTTP forwarding diff --git a/README.ru.md b/README.ru.md index 711302d90..3c15a688f 100644 --- a/README.ru.md +++ b/README.ru.md @@ -10,7 +10,7 @@ - Системный прокси Windows в режимах PAC и Global. - Локальные SOCKS5- и HTTP-прокси. -- Генерация PAC по GeoSite и пользовательские правила. +- Local PAC по лениво загружаемой GeoSite-базе и кэшируемый Online PAC. - SIP003-плагины и UDP relay. - Стратегии переключения серверов. - Импорт и экспорт через QR-коды и онлайн-конфигурации. @@ -34,6 +34,8 @@ - Поддерживаемые AEAD-методы реализованы в `AEADBclEncryptor` через `System.Security.Cryptography`. - Старые `libsscrypto.dll`, OpenSSL, mbedTLS и libsodium больше не входят в активный crypto-path. Имена legacy `.cs`-файлов явно исключены в SDK-style `.csproj`, поэтому оставшиеся после распаковки поверх старой папки файлы не должны случайно попасть в компиляцию. - Системный прокси меняется внутри процесса через WinINet; старые `sysproxy.exe` не используются. +- GeoSite больше не вшивается в приложение. Local PAC по требованию загружает настроенный источник или несколько источников через активное Shadowsocks-соединение и хранит отдельный runtime-кэш для каждого URL. +- Online PAC скачивается через Shadowsocks, кэшируется локально и отдаётся WinINet через локальный `/pac`; Windows больше не загружает удалённый PAC URL напрямую. - UI пока **смешанный WinForms/WPF**. Полный перенос интерфейса на Windows 11 WPF/Metro ещё не завершён. - Текущий профиль публикации — **framework-dependent, untrimmed, x86, single-file**. **NativeAOT пока не включён.** @@ -102,11 +104,14 @@ AEAD-криптография реализована через `Encryption/AEAD ## PAC -PAC-правила генерируются по базе GeoSite проекта [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community). +Два источника PAC теперь независимы: -Пользовательские правила следует добавлять в `user-rule.txt`: сгенерированный `pac.txt` может быть заменён при обновлении GeoSite. +- **Local PAC** использует один или несколько настраиваемых GeoSite-источников. По умолчанию используется [v2fly/domain-list-community](https://github.com/v2fly/domain-list-community), но через `PAC → GeoSite Sources...` его можно заменить или добавить сторонние базы. Источники скачиваются только при активном Local PAC через уже работающее Shadowsocks-соединение, кэшируются независимо в `geosite-cache` и объединяются по именам GeoSite-групп. Для каждого URL автоматически проверяется соседний `.sha256sum`; отсутствие или недоступность checksum не считается ошибкой, но найденная checksum обязана совпасть. Пользовательские правила находятся в `user-rule.txt`; сгенерированный `pac.txt` может заменяться после обновления GeoSite или списка источников. +- **Online PAC** GeoSite не использует. Указанный удалённый PAC URL загружается через работающее Shadowsocks-соединение и сохраняется в `online-pac-cache.pac`. WinINet всегда получает локальный URL Shadowsocks `/pac`, поэтому блокировка или временная недоступность хоста PAC не ломает уже существующий кэш. При наличии серверных валидаторов используются `ETag`/`Last-Modified`. -Основные параметры: `geositeDirectGroups`, `geositeProxiedGroups` и `geositePreferDirect`. +Пока первая загрузка PAC ещё не завершена, локальный PAC endpoint временно возвращает правило proxy-all, а не делает fallback в DIRECT. + +К Local PAC относятся параметры `geositeDirectGroups`, `geositeProxiedGroups` и `geositePreferDirect`. ## Плагины и HTTP-прокси diff --git a/shadowsocks-csharp/CommandLineOption.cs b/shadowsocks-csharp/CommandLineOption.cs index 35d8e1d04..386704f2a 100644 --- a/shadowsocks-csharp/CommandLineOption.cs +++ b/shadowsocks-csharp/CommandLineOption.cs @@ -1,4 +1,4 @@ -using CommandLine; +using CommandLine; namespace Shadowsocks { diff --git a/shadowsocks-csharp/Controller/FileManager.cs b/shadowsocks-csharp/Controller/FileManager.cs index 59ea05489..db77703ec 100755 --- a/shadowsocks-csharp/Controller/FileManager.cs +++ b/shadowsocks-csharp/Controller/FileManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Text; diff --git a/shadowsocks-csharp/Controller/HotkeyReg.cs b/shadowsocks-csharp/Controller/HotkeyReg.cs index adce14828..c41dd86af 100644 --- a/shadowsocks-csharp/Controller/HotkeyReg.cs +++ b/shadowsocks-csharp/Controller/HotkeyReg.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Windows.Forms; using NLog; using Shadowsocks.Controller.Hotkeys; diff --git a/shadowsocks-csharp/Controller/I18N.cs b/shadowsocks-csharp/Controller/I18N.cs index f34dc7b7d..46df2c085 100755 --- a/shadowsocks-csharp/Controller/I18N.cs +++ b/shadowsocks-csharp/Controller/I18N.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Text; diff --git a/shadowsocks-csharp/Controller/LoggerExtension.cs b/shadowsocks-csharp/Controller/LoggerExtension.cs index bd524ef15..439a29705 100644 --- a/shadowsocks-csharp/Controller/LoggerExtension.cs +++ b/shadowsocks-csharp/Controller/LoggerExtension.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.ComponentModel; using System.Net; using System.Net.Sockets; diff --git a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs index 923818776..8deab9de3 100644 --- a/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs +++ b/shadowsocks-csharp/Controller/Service/GeositeUpdater.cs @@ -1,67 +1,279 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net.Http; using System.Security.Cryptography; using System.Text; +using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using NLog; +using Shadowsocks.Model; using Shadowsocks.Properties; -using Shadowsocks.Util; -namespace Shadowsocks.Controller +namespace Shadowsocks.Controller.Service { - public class GeositeResultEventArgs : EventArgs + public class GeositeResultEventArgs(bool success) : EventArgs { - public bool Success; - - public GeositeResultEventArgs(bool success) - { - this.Success = success; - } + public bool Success = success; } public static class GeositeUpdater { - private static Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Lock databaseLock = new(); + private static readonly SemaphoreSlim updateLock = new(1, 1); public static event EventHandler UpdateCompleted; - public static event ErrorEventHandler Error; - private static readonly string DATABASE_PATH = Utils.GetTempPath("dlc.dat"); + public const string DefaultSourceUrl = "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat"; - private static readonly string GEOSITE_URL = "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat"; - private static readonly string GEOSITE_SHA256SUM_URL = "https://github.com/v2fly/domain-list-community/raw/release/dlc.dat.sha256sum"; - private static byte[] geositeDB; + // fix28 used one shared dlc.dat cache. fix29 migrates it when there is exactly + // one configured source, then keeps a separate cache per URL. + private static readonly string LegacyDatabasePath = Path.Combine(Program.WorkingDirectory, "dlc.dat"); + private static readonly string CacheDirectory = Path.Combine(Program.WorkingDirectory, "geosite-cache"); + private static readonly string AppliedSourcesPath = Path.Combine(CacheDirectory, "active-sources.sha256"); - public static readonly Dictionary> Geosites = new Dictionary>(); + private static List configuredSources = [DefaultSourceUrl]; + private static string configuredSourcesFingerprint = GetSourcesFingerprint([DefaultSourceUrl]); + private static HashSet sourcesNeedingRefresh = new(StringComparer.OrdinalIgnoreCase); - static GeositeUpdater() + public static readonly Dictionary> Geosites = + new(StringComparer.OrdinalIgnoreCase); + + public static bool IsDatabaseAvailable { - if (File.Exists(DATABASE_PATH) && new FileInfo(DATABASE_PATH).Length > 0) + get { - geositeDB = File.ReadAllBytes(DATABASE_PATH); + lock (databaseLock) + { + return Geosites.Count > 0; + } } - else + } + + public static bool NeedsRefresh + { + get { - geositeDB = Resources.dlc_dat; - File.WriteAllBytes(DATABASE_PATH, Resources.dlc_dat); + lock (databaseLock) + { + return configuredSources.Count == 0 || sourcesNeedingRefresh.Count > 0; + } + } + } + + public static bool IsSourceSetDirty + { + get + { + string expected; + lock (databaseLock) + { + expected = configuredSourcesFingerprint; + } + + try + { + return !File.Exists(AppliedSourcesPath) || + !string.Equals(File.ReadAllText(AppliedSourcesPath).Trim(), expected, StringComparison.OrdinalIgnoreCase); + } + catch + { + return true; + } } - LoadGeositeList(); } /// - /// load new GeoSite data from geositeDB + /// Switch the in-memory GeoSite view to the caches belonging to the configured URLs. + /// No network traffic is performed here. All databases are merged by group name. /// - static void LoadGeositeList() + public static void ConfigureSources(IEnumerable sources) + { + List normalized = NormalizeSources(sources); + Directory.CreateDirectory(CacheDirectory); + TryMigrateLegacyCache(normalized); + + List>> databases = []; + HashSet needsRefresh = new(StringComparer.OrdinalIgnoreCase); + foreach (string source in normalized) + { + string cachePath = GetCachePath(source); + if (!File.Exists(cachePath)) + { + needsRefresh.Add(source); + continue; + } + + try + { + databases.Add(ParseGeositeList(File.ReadAllBytes(cachePath))); + logger.Info($"Loaded cached GeoSite source: {source}"); + } + catch (Exception ex) + { + needsRefresh.Add(source); + logger.Warn(ex, $"Cached GeoSite source is invalid and will be refreshed when Local PAC needs it: {source}"); + } + } + + lock (databaseLock) + { + configuredSources = normalized; + configuredSourcesFingerprint = GetSourcesFingerprint(normalized); + sourcesNeedingRefresh = needsRefresh; + ReplaceGeositesNoLock(MergeDatabases(databases)); + } + } + + private static List NormalizeSources(IEnumerable sources) + { + List normalized = (sources ?? []) + .Select(source => source?.Trim()) + .Where(source => !string.IsNullOrWhiteSpace(source)) + .Where(source => Uri.TryCreate(source, UriKind.Absolute, out Uri uri) && + (uri.Scheme == Uri.UriSchemeHttps || uri.Scheme == Uri.UriSchemeHttp)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalized.Count == 0) + { + normalized.Add(DefaultSourceUrl); + } + + return normalized; + } + + private static void TryMigrateLegacyCache(IReadOnlyList sources) + { + if (sources.Count != 1 || !File.Exists(LegacyDatabasePath)) + { + return; + } + + string target = GetCachePath(sources[0]); + if (File.Exists(target)) + { + return; + } + + try + { + byte[] legacy = File.ReadAllBytes(LegacyDatabasePath); + ParseGeositeList(legacy); // validate before associating it with the source URL + File.WriteAllBytes(target, legacy); + File.Delete(LegacyDatabasePath); + logger.Info($"Migrated legacy GeoSite cache to {target}."); + } + catch (Exception ex) + { + logger.Warn(ex, "Could not migrate the legacy dlc.dat cache; it will be ignored."); + } + } + + private static Dictionary> ParseGeositeList(byte[] database) { - var list = GeositeList.Parser.ParseFrom(geositeDB); - foreach (var item in list.Entries) + if (database == null || database.Length == 0) { - Geosites[item.GroupName.ToLowerInvariant()] = item.Domains; + throw new InvalidDataException("GeoSite database is empty."); + } + + GeositeList list = GeositeList.Parser.ParseFrom(database); + Dictionary> parsed = new(StringComparer.OrdinalIgnoreCase); + foreach (Geosite item in list.Entries) + { + if (string.IsNullOrWhiteSpace(item.GroupName)) + { + continue; + } + + parsed[item.GroupName.ToLowerInvariant()] = item.Domains.ToList(); + } + + if (parsed.Count == 0) + { + throw new InvalidDataException("GeoSite database contains no groups."); + } + + return parsed; + } + + private static Dictionary> MergeDatabases( + IEnumerable>> databases) + { + Dictionary> merged = new(StringComparer.OrdinalIgnoreCase); + foreach (Dictionary> database in databases) + { + foreach (KeyValuePair> group in database) + { + if (!merged.TryGetValue(group.Key, out IList domains)) + { + domains = []; + merged[group.Key] = domains; + } + + foreach (DomainObject domain in group.Value) + { + domains.Add(domain); + } + } } + return merged; + } + + private static void ReplaceGeositesNoLock(Dictionary> database) + { + Geosites.Clear(); + foreach (KeyValuePair> item in database) + { + Geosites[item.Key] = item.Value; + } + } + + private static string GetCachePath(string sourceUrl) + { + byte[] sourceHash = SHA256.HashData(Encoding.UTF8.GetBytes(sourceUrl)); + return Path.Combine(CacheDirectory, Convert.ToHexString(sourceHash) + ".dat"); + } + + private static string GetSourcesFingerprint(IEnumerable sources) + { + string canonical = string.Join("\n", (sources ?? []) + .Select(source => source?.Trim() ?? "")); + return Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(canonical))); + } + + private static void MarkCurrentSourceSetApplied() + { + string fingerprint; + lock (databaseLock) + { + fingerprint = configuredSourcesFingerprint; + } + + try + { + Directory.CreateDirectory(CacheDirectory); + File.WriteAllText(AppliedSourcesPath, fingerprint, Encoding.ASCII); + } + catch (Exception ex) + { + logger.Warn(ex, "Could not persist the active GeoSite source fingerprint."); + } + } + + public static string GetChecksumUrl(string sourceUrl) + { + Uri uri = new(sourceUrl, UriKind.Absolute); + UriBuilder builder = new(uri) + { + Path = uri.AbsolutePath + ".sha256sum" + }; + return builder.Uri.AbsoluteUri; } public static void ResetEvent() @@ -70,135 +282,266 @@ public static void ResetEvent() Error = null; } - public static async Task UpdatePACFromGeosite() + /// + /// Download/update every configured GeoSite source through the already running + /// local Shadowsocks connection, merge them, then regenerate Local PAC. + /// A missing/unreachable .sha256sum is deliberately non-fatal. + /// + public static async Task UpdatePACFromGeosite(bool raiseEvents = true) { - var geositeUrl = GEOSITE_URL; - var geositeSha256sumUrl = GEOSITE_SHA256SUM_URL; - var geositeVerifySha256 = true; - var geositeSha256sum = ""; - var mySHA256 = SHA256.Create(); - var config = Program.MainController.GetCurrentConfiguration(); - var blacklist = config.geositePreferDirect; - var httpClient = Program.MainController.GetHttpClient(); - - if (!string.IsNullOrWhiteSpace(config.geositeUrl)) - { - logger.Info("Found custom Geosite URL in config file"); - geositeUrl = config.geositeUrl; - geositeSha256sumUrl = config.geositeSha256sumUrl; - if (string.IsNullOrWhiteSpace(geositeSha256sumUrl)) + Configuration config = Program.MainController.GetCurrentConfiguration(); + if (config.useOnlinePac) + { + logger.Debug("Skipping GeoSite update because Online PAC is enabled."); + return false; + } + + List sources = NormalizeSources(config.geositeUrls); + bool blacklist = config.geositePreferDirect; + + await updateLock.WaitAsync(); + try + { + using HttpClient httpClient = LocalProxyHttpClient.Create(config); + List>> loadedDatabases = []; + List failedSources = []; + + foreach (string source in sources) { - geositeVerifySha256 = false; - logger.Info("Geosite SHA256 verification is disabled."); + try + { + loadedDatabases.Add(await LoadOrRefreshSourceAsync(httpClient, source)); + } + catch (Exception ex) + { + failedSources.Add(source); + logger.Warn(ex, $"GeoSite source could not be loaded: {source}"); + } } + + if (loadedDatabases.Count == 0) + { + throw new InvalidOperationException( + "None of the configured GeoSite sources could be loaded. " + + string.Join(", ", failedSources)); + } + + Dictionary> merged = MergeDatabases(loadedDatabases); + lock (databaseLock) + { + configuredSources = sources; + configuredSourcesFingerprint = GetSourcesFingerprint(sources); + sourcesNeedingRefresh = new(failedSources, StringComparer.OrdinalIgnoreCase); + ReplaceGeositesNoLock(merged); + } + + LogInvalidConfiguredGroups(config); + bool pacFileChanged = MergeAndWritePACFile( + config.geositeDirectGroups, + config.geositeProxiedGroups, + blacklist); + + if (failedSources.Count > 0) + { + logger.Warn("Local PAC was regenerated from available GeoSite sources; unavailable sources: " + + string.Join(", ", failedSources)); + } + + if (raiseEvents) + { + UpdateCompleted?.Invoke(null, new(pacFileChanged)); + } + return pacFileChanged; } - logger.Info($"Checking Geosite from {geositeUrl}"); + catch (Exception ex) + { + if (raiseEvents) + { + Error?.Invoke(null, new(ex)); + return false; + } + throw; + } + finally + { + updateLock.Release(); + } + } - try + private static async Task>> LoadOrRefreshSourceAsync( + HttpClient httpClient, + string sourceUrl) + { + Directory.CreateDirectory(CacheDirectory); + string cachePath = GetCachePath(sourceUrl); + string expectedHash = await TryGetChecksumAsync(httpClient, sourceUrl); + + if (!string.IsNullOrEmpty(expectedHash) && File.Exists(cachePath)) { - // Use sha256sum to check if local database is already latest. - if (geositeVerifySha256) + try { - // download checksum first - geositeSha256sum = await httpClient.GetStringAsync(geositeSha256sumUrl); - geositeSha256sum = geositeSha256sum.Substring(0, 64).ToUpper(); - logger.Info($"Got Sha256sum: {geositeSha256sum}"); - // compare downloaded checksum with local geositeDB - byte[] localDBHashBytes = mySHA256.ComputeHash(geositeDB); - string localDBHash = BitConverter.ToString(localDBHashBytes).Replace("-", String.Empty); - logger.Info($"Local Sha256sum: {localDBHash}"); - // if already latest - if (geositeSha256sum == localDBHash) + byte[] cachedBytes = await File.ReadAllBytesAsync(cachePath); + string cachedHash = Convert.ToHexString(SHA256.HashData(cachedBytes)); + if (string.Equals(expectedHash, cachedHash, StringComparison.OrdinalIgnoreCase)) { - logger.Info("Local GeoSite DB is up to date."); - UpdateCompleted?.Invoke(null, new GeositeResultEventArgs(false)); - return; + logger.Info($"GeoSite source is up to date: {sourceUrl}"); + return ParseGeositeList(cachedBytes); } } + catch (Exception ex) + { + logger.Warn(ex, $"Cached GeoSite source could not be reused: {sourceUrl}"); + } + } + + try + { + logger.Info($"Downloading GeoSite through Shadowsocks: {sourceUrl}"); + byte[] downloadedBytes = await httpClient.GetByteArrayAsync(sourceUrl); + if (downloadedBytes.Length == 0) + { + throw new InvalidDataException("Downloaded GeoSite database is empty."); + } - // not latest. download new DB - var downloadedBytes = await httpClient.GetByteArrayAsync(geositeUrl); + if (!string.IsNullOrEmpty(expectedHash)) + { + string downloadedHash = Convert.ToHexString(SHA256.HashData(downloadedBytes)); + if (!string.Equals(expectedHash, downloadedHash, StringComparison.OrdinalIgnoreCase)) + { + throw new InvalidDataException($"GeoSite SHA256 mismatch for {sourceUrl}."); + } + } - // verify sha256sum - if (geositeVerifySha256) + Dictionary> parsed = ParseGeositeList(downloadedBytes); + string tempPath = cachePath + ".new"; + await File.WriteAllBytesAsync(tempPath, downloadedBytes); + File.Move(tempPath, cachePath, true); + return parsed; + } + catch (Exception downloadException) + { + // The last known-good source cache is more useful than failing Local PAC + // merely because a mirror is temporarily offline or its checksum changed. + if (File.Exists(cachePath)) { - byte[] downloadedDBHashBytes = mySHA256.ComputeHash(downloadedBytes); - string downloadedDBHash = BitConverter.ToString(downloadedDBHashBytes).Replace("-", String.Empty); - logger.Info($"Actual Sha256sum: {downloadedDBHash}"); - if (geositeSha256sum != downloadedDBHash) + try { - logger.Info("Sha256sum Verification: FAILED. Downloaded GeoSite DB is corrupted. Aborting the update."); - throw new Exception("Sha256sum mismatch"); + byte[] cachedBytes = await File.ReadAllBytesAsync(cachePath); + Dictionary> parsed = ParseGeositeList(cachedBytes); + logger.Warn(downloadException, + $"GeoSite refresh failed; using last known-good cache for {sourceUrl}."); + return parsed; } - else + catch (Exception cacheException) { - logger.Info("Sha256sum Verification: PASSED. Applying to local GeoSite DB."); + throw new AggregateException( + $"GeoSite source and its cache are both unusable: {sourceUrl}", + downloadException, + cacheException); } } - // write to geosite file - using (FileStream geositeFileStream = File.Create(DATABASE_PATH)) - await geositeFileStream.WriteAsync(downloadedBytes, 0, downloadedBytes.Length); + throw; + } + } - // update stuff - geositeDB = downloadedBytes; - LoadGeositeList(); - bool pacFileChanged = MergeAndWritePACFile(config.geositeDirectGroups, config.geositeProxiedGroups, blacklist); - UpdateCompleted?.Invoke(null, new GeositeResultEventArgs(pacFileChanged)); + private static async Task TryGetChecksumAsync(HttpClient httpClient, string sourceUrl) + { + string checksumUrl = GetChecksumUrl(sourceUrl); + try + { + using HttpResponseMessage response = await httpClient.GetAsync(checksumUrl); + if (!response.IsSuccessStatusCode) + { + logger.Info($"GeoSite checksum is unavailable ({(int)response.StatusCode}); continuing without it: {checksumUrl}"); + return null; + } + + string content = await response.Content.ReadAsStringAsync(); + Match match = Regex.Match(content ?? string.Empty, @"(?i)\b[0-9a-f]{64}\b"); + if (!match.Success) + { + logger.Info($"GeoSite checksum response has no SHA256 value; continuing without it: {checksumUrl}"); + return null; + } + + string checksum = match.Value.ToUpperInvariant(); + logger.Info($"GeoSite SHA256 for {sourceUrl}: {checksum}"); + return checksum; } catch (Exception ex) { - Error?.Invoke(null, new ErrorEventArgs(ex)); + logger.Warn(ex, $"GeoSite checksum could not be fetched; continuing without verification: {checksumUrl}"); + return null; + } + } + + private static void LogInvalidConfiguredGroups(Configuration config) + { + foreach (string group in (config.geositeDirectGroups ?? []) + .Concat(config.geositeProxiedGroups ?? []) + .Distinct(StringComparer.OrdinalIgnoreCase)) + { + if (!CheckGeositeGroup(group)) + { + logger.Warn($"Configured GeoSite group is absent from the currently merged sources and will be skipped: {group}"); + } } } /// - /// Merge and write pac.txt from geosite. - /// Used at multiple places. + /// Merge and write pac.txt from the cached GeoSite database. /// - /// A list of geosite groups configured for direct connection. - /// A list of geosite groups configured for proxied connection. - /// Whether to use blacklist mode. False for whitelist. - /// public static bool MergeAndWritePACFile(List directGroups, List proxiedGroups, bool blacklist) { - string abpContent = MergePACFile(directGroups, proxiedGroups, blacklist); + if (!IsDatabaseAvailable) + { + throw new InvalidOperationException("GeoSite database is not installed. Enable Local PAC and wait for the database download to complete."); + } + + string abpContent = MergePACFile( + directGroups ?? [], + proxiedGroups ?? [], + blacklist); if (File.Exists(PACDaemon.PAC_FILE)) { string original = FileManager.NonExclusiveReadAllText(PACDaemon.PAC_FILE, Encoding.UTF8); if (original == abpContent) { + MarkCurrentSourceSetApplied(); return false; } } File.WriteAllText(PACDaemon.PAC_FILE, abpContent, Encoding.UTF8); + MarkCurrentSourceSetApplied(); return true; } /// - /// Checks if the specified group exists in GeoSite database. + /// Checks if the specified group exists in the currently merged GeoSite databases. /// - /// The group name to check for. - /// True if the group exists. False if the group doesn't exist. - public static bool CheckGeositeGroup(string group) => SeparateAttributeFromGroupName(group, out string groupName, out _) && Geosites.ContainsKey(groupName); + public static bool CheckGeositeGroup(string group) + { + if (!IsDatabaseAvailable || !SeparateAttributeFromGroupName(group, out string groupName, out _)) + { + return false; + } + + lock (databaseLock) + { + return Geosites.ContainsKey(groupName); + } + } - /// - /// Separates the attribute (e.g. @cn) from a group name. - /// No checks are performed. - /// - /// A group name potentially with a trailing attribute. - /// The group name with the attribute stripped. - /// The attribute. - /// True for success. False for more than one '@'. private static bool SeparateAttributeFromGroupName(string group, out string groupName, out string attribute) { - var splitGroupAttributeList = group.Split('@'); - if (splitGroupAttributeList.Length == 1) // no attribute + string[] splitGroupAttributeList = (group ?? string.Empty).Split('@'); + if (splitGroupAttributeList.Length == 1) { groupName = splitGroupAttributeList[0]; attribute = ""; } - else if (splitGroupAttributeList.Length == 2) // has attribute + else if (splitGroupAttributeList.Length == 2) { groupName = splitGroupAttributeList[0]; attribute = splitGroupAttributeList[1]; @@ -209,7 +552,7 @@ private static bool SeparateAttributeFromGroupName(string group, out string grou attribute = ""; return false; } - return true; + return !string.IsNullOrWhiteSpace(groupName); } private static string MergePACFile(List directGroups, List proxiedGroups, bool blacklist) @@ -224,7 +567,7 @@ private static string MergePACFile(List directGroups, List proxi abpContent = Resources.abp_js; } - List userruleLines = new List(); + List userruleLines = []; if (File.Exists(PACDaemon.USER_RULE_FILE)) { string userrulesString = FileManager.NonExclusiveReadAllText(PACDaemon.USER_RULE_FILE, Encoding.UTF8); @@ -241,118 +584,104 @@ private static string MergePACFile(List directGroups, List proxi private static List ProcessUserRules(string content) { - List valid_lines = new List(); - using (var stringReader = new StringReader(content)) + List validLines = []; + using StringReader stringReader = new(content); + for (string line = stringReader.ReadLine(); line != null; line = stringReader.ReadLine()) { - for (string line = stringReader.ReadLine(); line != null; line = stringReader.ReadLine()) + if (string.IsNullOrWhiteSpace(line) || line.StartsWith("!") || line.StartsWith("[")) { - if (string.IsNullOrWhiteSpace(line) || line.StartsWith("!") || line.StartsWith("[")) - continue; - valid_lines.Add(line); + continue; } + validLines.Add(line); } - return valid_lines; + return validLines; } - /// - /// Generates rule lines based on user preference. - /// - /// A list of geosite groups configured for direct connection. - /// A list of geosite groups configured for proxied connection. - /// Whether to use blacklist mode. False for whitelist. - /// A list of rule lines. private static List GenerateRules(List directGroups, List proxiedGroups, bool blacklist) { List ruleLines; - if (blacklist) // blocking + exception rules + if (blacklist) { ruleLines = GenerateBlockingRules(proxiedGroups); ruleLines.AddRange(GenerateExceptionRules(directGroups)); } - else // proxy all + exception rules + else { - ruleLines = new List() - { - "/.*/" // block/proxy all unmatched domains - }; + ruleLines = ["/.*/"]; ruleLines.AddRange(GenerateExceptionRules(directGroups)); } - return ruleLines; + return ruleLines.Distinct(StringComparer.Ordinal).ToList(); } - /// - /// Generates rules that match domains that should be proxied. - /// - /// A list of source groups. - /// A list of rule lines. private static List GenerateBlockingRules(List groups) { - List ruleLines = new List(); - foreach (var group in groups) + List ruleLines = []; + foreach (string group in groups ?? []) { - // separate group name and attribute - SeparateAttributeFromGroupName(group, out string groupName, out string attribute); - var domainObjects = Geosites[groupName]; - if (!string.IsNullOrEmpty(attribute)) // has attribute + if (!SeparateAttributeFromGroupName(group, out string groupName, out string attribute)) + { + continue; + } + + IList domainObjects; + lock (databaseLock) + { + if (!Geosites.TryGetValue(groupName, out domainObjects)) + { + continue; + } + domainObjects = domainObjects.ToList(); + } + + if (!string.IsNullOrEmpty(attribute)) { - var attributeObject = new DomainObject.Types.Attribute + DomainObject.Types.Attribute attributeObject = new() { Key = attribute, BoolValue = true }; - foreach (var domainObject in domainObjects) + foreach (DomainObject domainObject in domainObjects) { if (domainObject.Attribute.Contains(attributeObject)) - switch (domainObject.Type) - { - case DomainObject.Types.Type.Plain: - ruleLines.Add(domainObject.Value); - break; - case DomainObject.Types.Type.Regex: - ruleLines.Add($"/{domainObject.Value}/"); - break; - case DomainObject.Types.Type.Domain: - ruleLines.Add($"||{domainObject.Value}"); - break; - case DomainObject.Types.Type.Full: - ruleLines.Add($"|http://{domainObject.Value}"); - ruleLines.Add($"|https://{domainObject.Value}"); - break; - } + { + AddDomainRule(ruleLines, domainObject); + } } } - else // no attribute - foreach (var domainObject in domainObjects) + else + { + foreach (DomainObject domainObject in domainObjects) { - switch (domainObject.Type) - { - case DomainObject.Types.Type.Plain: - ruleLines.Add(domainObject.Value); - break; - case DomainObject.Types.Type.Regex: - ruleLines.Add($"/{domainObject.Value}/"); - break; - case DomainObject.Types.Type.Domain: - ruleLines.Add($"||{domainObject.Value}"); - break; - case DomainObject.Types.Type.Full: - ruleLines.Add($"|http://{domainObject.Value}"); - ruleLines.Add($"|https://{domainObject.Value}"); - break; - } + AddDomainRule(ruleLines, domainObject); } + } + } + return ruleLines.Distinct(StringComparer.Ordinal).ToList(); + } + + private static void AddDomainRule(List ruleLines, DomainObject domainObject) + { + switch (domainObject.Type) + { + case DomainObject.Types.Type.Plain: + ruleLines.Add(domainObject.Value); + break; + case DomainObject.Types.Type.Regex: + ruleLines.Add($"/{domainObject.Value}/"); + break; + case DomainObject.Types.Type.Domain: + ruleLines.Add($"||{domainObject.Value}"); + break; + case DomainObject.Types.Type.Full: + ruleLines.Add($"|http://{domainObject.Value}"); + ruleLines.Add($"|https://{domainObject.Value}"); + break; } - return ruleLines; } - /// - /// Generates rules that match domains that should be connected directly without a proxy. - /// - /// A list of source groups. - /// A list of rule lines. private static List GenerateExceptionRules(List groups) => GenerateBlockingRules(groups) - .Select(r => $"@@{r}") // convert blocking rules to exception rules + .Select(r => $"@@{r}") .ToList(); } } diff --git a/shadowsocks-csharp/Controller/Service/Listener.cs b/shadowsocks-csharp/Controller/Service/Listener.cs index 3d7cb3afc..2270ebbd3 100644 --- a/shadowsocks-csharp/Controller/Service/Listener.cs +++ b/shadowsocks-csharp/Controller/Service/Listener.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; diff --git a/shadowsocks-csharp/Controller/Service/LocalProxyHttpClient.cs b/shadowsocks-csharp/Controller/Service/LocalProxyHttpClient.cs new file mode 100644 index 000000000..ba85ca067 --- /dev/null +++ b/shadowsocks-csharp/Controller/Service/LocalProxyHttpClient.cs @@ -0,0 +1,38 @@ +using System; +using System.Net; +using System.Net.Http; +using Shadowsocks.Model; + +namespace Shadowsocks.Controller +{ + /// + /// Creates HTTP clients that explicitly use the local Shadowsocks HTTP endpoint. + /// The request enters the mixed local listener, is forwarded to Privoxy and then + /// leaves through the currently selected Shadowsocks server. + /// + internal static class LocalProxyHttpClient + { + public static HttpClient Create(Configuration config) + { + if (config == null) + throw new ArgumentNullException(nameof(config)); + + var handler = new HttpClientHandler + { + Proxy = new WebProxy($"http://{config.LocalHost}:{config.localPort}"), + UseProxy = true, + AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.Brotli, + }; + + var client = new HttpClient(handler) + { + Timeout = TimeSpan.FromSeconds(30), + }; + + if (!string.IsNullOrWhiteSpace(config.userAgentString)) + client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", config.userAgentString); + + return client; + } + } +} diff --git a/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs b/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs index f2a798051..7dbb478fd 100644 --- a/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs +++ b/shadowsocks-csharp/Controller/Service/OnlineConfigResolver.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; diff --git a/shadowsocks-csharp/Controller/Service/OnlinePacCache.cs b/shadowsocks-csharp/Controller/Service/OnlinePacCache.cs new file mode 100644 index 000000000..c370950ed --- /dev/null +++ b/shadowsocks-csharp/Controller/Service/OnlinePacCache.cs @@ -0,0 +1,188 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Newtonsoft.Json; +using NLog; +using Shadowsocks.Model; + +namespace Shadowsocks.Controller +{ + /// + /// Persistent cache for a user-supplied online PAC file. + /// Windows never fetches the remote PAC URL directly: PACServer serves this cache + /// from localhost while refreshes are explicitly downloaded through Shadowsocks. + /// + internal static class OnlinePacCache + { + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly SemaphoreSlim refreshLock = new SemaphoreSlim(1, 1); + + private static readonly string CachePath = Path.Combine(Program.WorkingDirectory, "online-pac-cache.pac"); + private static readonly string MetadataPath = Path.Combine(Program.WorkingDirectory, "online-pac-cache.meta.json"); + + private const long MaxPacSize = 32L * 1024L * 1024L; + + private sealed class CacheMetadata + { + public string SourceUrl { get; set; } = ""; + public string ETag { get; set; } = ""; + public DateTimeOffset? LastModified { get; set; } + public DateTimeOffset UpdatedUtc { get; set; } + } + + public static bool TryGetContent(string sourceUrl, out string content) + { + content = null; + if (string.IsNullOrWhiteSpace(sourceUrl) || !File.Exists(CachePath)) + return false; + + try + { + CacheMetadata metadata = ReadMetadata(); + if (metadata == null || !string.Equals(metadata.SourceUrl, sourceUrl, StringComparison.Ordinal)) + return false; + + string cached = File.ReadAllText(CachePath, Encoding.UTF8); + if (!IsValidPac(cached)) + return false; + + content = cached; + return true; + } + catch (Exception ex) + { + logger.LogUsefulException(ex); + return false; + } + } + + public static async Task RefreshAsync(Configuration config) + { + if (config == null) + throw new ArgumentNullException(nameof(config)); + if (string.IsNullOrWhiteSpace(config.pacUrl)) + throw new InvalidOperationException("Online PAC URL is empty."); + + await refreshLock.WaitAsync().ConfigureAwait(false); + try + { + CacheMetadata oldMetadata = ReadMetadata(); + bool sameSource = TryGetContent(config.pacUrl, out _); + + using HttpClient client = LocalProxyHttpClient.Create(config); + using var request = new HttpRequestMessage(HttpMethod.Get, config.pacUrl); + + if (sameSource) + { + if (!string.IsNullOrWhiteSpace(oldMetadata.ETag)) + request.Headers.TryAddWithoutValidation("If-None-Match", oldMetadata.ETag); + if (oldMetadata.LastModified.HasValue) + request.Headers.IfModifiedSince = oldMetadata.LastModified; + } + + logger.Info($"Refreshing online PAC through Shadowsocks: {config.pacUrl}"); + using HttpResponseMessage response = await client.SendAsync( + request, + HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false); + + if (response.StatusCode == HttpStatusCode.NotModified && sameSource) + { + logger.Info("Online PAC cache is up to date (HTTP 304)."); + return false; + } + + response.EnsureSuccessStatusCode(); + if (response.Content.Headers.ContentLength is long contentLength && contentLength > MaxPacSize) + throw new InvalidDataException($"Online PAC is too large ({contentLength} bytes)."); + + byte[] bytes = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); + if (bytes.LongLength > MaxPacSize) + throw new InvalidDataException($"Online PAC is too large ({bytes.LongLength} bytes)."); + + string content = DecodePac(bytes, response.Content.Headers.ContentType?.CharSet); + if (!IsValidPac(content)) + throw new InvalidDataException("Downloaded online PAC does not contain FindProxyForURL()."); + + string previousContent = null; + if (sameSource) + { + try + { + previousContent = File.ReadAllText(CachePath, Encoding.UTF8); + } + catch (Exception ex) + { + logger.LogUsefulException(ex); + } + } + + WriteAtomic(CachePath, content); + WriteMetadataAtomic(new CacheMetadata + { + SourceUrl = config.pacUrl, + ETag = response.Headers.ETag?.ToString() ?? "", + LastModified = response.Content.Headers.LastModified, + UpdatedUtc = DateTimeOffset.UtcNow, + }); + + logger.Info("Online PAC cache refreshed successfully."); + return !sameSource || !string.Equals(previousContent, content, StringComparison.Ordinal); + } + finally + { + refreshLock.Release(); + } + } + + private static string DecodePac(byte[] bytes, string charset) + { + if (!string.IsNullOrWhiteSpace(charset)) + { + try + { + return Encoding.GetEncoding(charset.Trim('"')).GetString(bytes); + } + catch (Exception ex) when (ex is ArgumentException or NotSupportedException) + { + // Fall back to UTF-8 below. + } + } + + return Encoding.UTF8.GetString(bytes); + } + + private static bool IsValidPac(string content) + => !string.IsNullOrWhiteSpace(content) && + content.IndexOf("FindProxyForURL", StringComparison.Ordinal) >= 0; + + private static CacheMetadata ReadMetadata() + { + if (!File.Exists(MetadataPath)) + return null; + + try + { + return JsonConvert.DeserializeObject(File.ReadAllText(MetadataPath, Encoding.UTF8)); + } + catch (Exception ex) + { + logger.LogUsefulException(ex); + return null; + } + } + + private static void WriteMetadataAtomic(CacheMetadata metadata) + => WriteAtomic(MetadataPath, JsonConvert.SerializeObject(metadata, Formatting.Indented)); + + private static void WriteAtomic(string path, string content) + { + string tempPath = path + ".new"; + File.WriteAllText(tempPath, content, new UTF8Encoding(false)); + File.Move(tempPath, path, true); + } + } +} diff --git a/shadowsocks-csharp/Controller/Service/PACDaemon.cs b/shadowsocks-csharp/Controller/Service/PACDaemon.cs index 26fd2afb9..3d2157188 100644 --- a/shadowsocks-csharp/Controller/Service/PACDaemon.cs +++ b/shadowsocks-csharp/Controller/Service/PACDaemon.cs @@ -1,28 +1,30 @@ -using System; +using System; using System.IO; using System.Text; using System.Threading.Tasks; using NLog; +using Shadowsocks.Controller.Service; using Shadowsocks.Model; using Shadowsocks.Properties; namespace Shadowsocks.Controller { - /// - /// Processing the PAC file content + /// Processing the locally generated PAC file content. + /// GeoSite is only touched while Local PAC is active. /// public class PACDaemon { - private static Logger logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); public const string PAC_FILE = "pac.txt"; public const string USER_RULE_FILE = "user-rule.txt"; public const string USER_ABP_FILE = "abp.txt"; + private Configuration config; - FileSystemWatcher PACFileWatcher; - FileSystemWatcher UserRuleFileWatcher; + private FileSystemWatcher PACFileWatcher; + private FileSystemWatcher UserRuleFileWatcher; public event EventHandler PACFileChanged; public event EventHandler UserRuleFileChanged; @@ -30,19 +32,35 @@ public class PACDaemon public PACDaemon(Configuration config) { this.config = config; - TouchPACFile(); TouchUserRuleFile(); - - this.WatchPacFile(); - this.WatchUserRuleFile(); + WatchPacFile(); + WatchUserRuleFile(); } + public void UpdateConfiguration(Configuration newConfig) + { + config = newConfig; + } public string TouchPACFile() { - if (!File.Exists(PAC_FILE)) + bool sourceSetDirty = GeositeUpdater.IsSourceSetDirty; + if (!File.Exists(PAC_FILE) || sourceSetDirty) { - GeositeUpdater.MergeAndWritePACFile(config.geositeDirectGroups, config.geositeProxiedGroups, config.geositePreferDirect); + if (GeositeUpdater.IsDatabaseAvailable && !GeositeUpdater.NeedsRefresh) + { + GeositeUpdater.MergeAndWritePACFile( + config.geositeDirectGroups, + config.geositeProxiedGroups, + config.geositePreferDirect); + } + else + { + // The user explicitly asked to open Local PAC before GeoSite finished + // downloading, or the source list changed and its caches are not ready. + // Use proxy-all rather than serving rules generated from stale sources. + File.WriteAllText(PAC_FILE, GetBootstrapLocalPac(), Encoding.UTF8); + } } return PAC_FILE; } @@ -50,81 +68,91 @@ public string TouchPACFile() internal string TouchUserRuleFile() { if (!File.Exists(USER_RULE_FILE)) - { File.WriteAllText(USER_RULE_FILE, Resources.user_rule); - } return USER_RULE_FILE; } internal string GetPACContent() { - if (!File.Exists(PAC_FILE)) + bool sourceSetDirty = GeositeUpdater.IsSourceSetDirty; + if (File.Exists(PAC_FILE) && !sourceSetDirty) + return File.ReadAllText(PAC_FILE, Encoding.UTF8); + + if (GeositeUpdater.IsDatabaseAvailable && !GeositeUpdater.NeedsRefresh) { - GeositeUpdater.MergeAndWritePACFile(config.geositeDirectGroups, config.geositeProxiedGroups, config.geositePreferDirect); + GeositeUpdater.MergeAndWritePACFile( + config.geositeDirectGroups, + config.geositeProxiedGroups, + config.geositePreferDirect); + return File.ReadAllText(PAC_FILE, Encoding.UTF8); } - return File.ReadAllText(PAC_FILE, Encoding.UTF8); + + // Do not serve a PAC generated from an old source set. Until every newly + // configured source has a usable cache, proxy everything through Shadowsocks. + return GetBootstrapLocalPac(); } + private static string GetBootstrapLocalPac() + => "function FindProxyForURL(url, host) { return __PROXY__; }\n"; private void WatchPacFile() { PACFileWatcher?.Dispose(); - PACFileWatcher = new FileSystemWatcher(Program.WorkingDirectory); - PACFileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; - PACFileWatcher.Filter = PAC_FILE; + PACFileWatcher = new FileSystemWatcher(Program.WorkingDirectory) + { + NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName, + Filter = PAC_FILE, + EnableRaisingEvents = true, + }; PACFileWatcher.Changed += PACFileWatcher_Changed; PACFileWatcher.Created += PACFileWatcher_Changed; PACFileWatcher.Deleted += PACFileWatcher_Changed; PACFileWatcher.Renamed += PACFileWatcher_Changed; - PACFileWatcher.EnableRaisingEvents = true; } private void WatchUserRuleFile() { UserRuleFileWatcher?.Dispose(); - UserRuleFileWatcher = new FileSystemWatcher(Program.WorkingDirectory); - UserRuleFileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; - UserRuleFileWatcher.Filter = USER_RULE_FILE; + UserRuleFileWatcher = new FileSystemWatcher(Program.WorkingDirectory) + { + NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName, + Filter = USER_RULE_FILE, + EnableRaisingEvents = true, + }; UserRuleFileWatcher.Changed += UserRuleFileWatcher_Changed; UserRuleFileWatcher.Created += UserRuleFileWatcher_Changed; UserRuleFileWatcher.Deleted += UserRuleFileWatcher_Changed; UserRuleFileWatcher.Renamed += UserRuleFileWatcher_Changed; - UserRuleFileWatcher.EnableRaisingEvents = true; } - #region FileSystemWatcher.OnChanged() - // FileSystemWatcher Changed event is raised twice - // http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice - // Add a short delay to avoid raise event twice in a short period private void PACFileWatcher_Changed(object sender, FileSystemEventArgs e) { - if (PACFileChanged != null) + if (PACFileChanged == null) + return; + + logger.Info($"Detected: PAC file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); + Task.Factory.StartNew(() => { - logger.Info($"Detected: PAC file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); - Task.Factory.StartNew(() => - { - ((FileSystemWatcher)sender).EnableRaisingEvents = false; - System.Threading.Thread.Sleep(10); - PACFileChanged(this, new EventArgs()); - ((FileSystemWatcher)sender).EnableRaisingEvents = true; - }); - } + ((FileSystemWatcher)sender).EnableRaisingEvents = false; + System.Threading.Thread.Sleep(10); + PACFileChanged(this, EventArgs.Empty); + ((FileSystemWatcher)sender).EnableRaisingEvents = true; + }); } private void UserRuleFileWatcher_Changed(object sender, FileSystemEventArgs e) { - if (UserRuleFileChanged != null) + if (UserRuleFileChanged == null) + return; + + logger.Info($"Detected: User Rule file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); + Task.Factory.StartNew(() => { - logger.Info($"Detected: User Rule file '{e.Name}' was {e.ChangeType.ToString().ToLower()}."); - Task.Factory.StartNew(() => - { - ((FileSystemWatcher)sender).EnableRaisingEvents = false; - System.Threading.Thread.Sleep(10); - UserRuleFileChanged(this, new EventArgs()); - ((FileSystemWatcher)sender).EnableRaisingEvents = true; - }); - } + ((FileSystemWatcher)sender).EnableRaisingEvents = false; + System.Threading.Thread.Sleep(10); + UserRuleFileChanged(this, EventArgs.Empty); + ((FileSystemWatcher)sender).EnableRaisingEvents = true; + }); } - #endregion } } diff --git a/shadowsocks-csharp/Controller/Service/PACServer.cs b/shadowsocks-csharp/Controller/Service/PACServer.cs index 5db6ddece..93f6735f8 100644 --- a/shadowsocks-csharp/Controller/Service/PACServer.cs +++ b/shadowsocks-csharp/Controller/Service/PACServer.cs @@ -1,197 +1,200 @@ -using System; -using System.Net; -using System.Net.Sockets; -using System.Security.Cryptography; -using System.Text; -using NLog; -using Shadowsocks.Encryption; -using Shadowsocks.Model; - -namespace Shadowsocks.Controller -{ - public class PACServer : Listener.Service - { - private static Logger logger = LogManager.GetCurrentClassLogger(); - - public const string RESOURCE_NAME = "pac"; - - private string PacSecret - { - get - { - if (string.IsNullOrEmpty(_cachedPacSecret)) - { - var rd = new byte[32]; - RNG.GetBytes(rd); - _cachedPacSecret = HttpServerUtilityUrlToken.Encode(rd); - } - return _cachedPacSecret; - } - } - private string _cachedPacSecret = ""; - public string PacUrl { get; private set; } = ""; - - private Configuration _config; - private PACDaemon _pacDaemon; - - public PACServer(PACDaemon pacDaemon) - { - _pacDaemon = pacDaemon; - } - - public void UpdatePACURL(Configuration config) - { - _config = config; - string usedSecret = _config.secureLocalPac ? $"&secret={PacSecret}" : ""; - string contentHash = GetHash(_pacDaemon.GetPACContent()); - PacUrl = $"http://{config.LocalHost}:{config.localPort}/{RESOURCE_NAME}?hash={contentHash}{usedSecret}"; - logger.Debug("Set PAC URL:" + PacUrl); - } - - private static string GetHash(string content) - { - return HttpServerUtilityUrlToken.Encode(MD5.HashData(Encoding.ASCII.GetBytes(content))); - } - - public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) - { - if (socket.ProtocolType != ProtocolType.Tcp) - { - return false; - } - - try - { - /* - * RFC 7230 - * - GET /hello.txt HTTP/1.1 - User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 - Host: www.example.com - Accept-Language: en, mi - */ - - string request = Encoding.UTF8.GetString(firstPacket, 0, length); - string[] lines = request.Split('\r', '\n'); - bool hostMatch = false, pathMatch = false, useSocks = false; - bool secretMatch = !_config.secureLocalPac; - - if (lines.Length < 2) // need at lease RequestLine + Host - { - return false; - } - - // parse request line - string requestLine = lines[0]; - // GET /pac?t=yyyyMMddHHmmssfff&secret=foobar HTTP/1.1 - string[] requestItems = requestLine.Split(' '); - if (requestItems.Length == 3 && requestItems[0] == "GET") - { - int index = requestItems[1].IndexOf('?'); - if (index < 0) - { - index = requestItems[1].Length; - } - string resourceString = requestItems[1].Substring(0, index).Remove(0, 1); - if (string.Equals(resourceString, RESOURCE_NAME, StringComparison.OrdinalIgnoreCase)) - { - pathMatch = true; - if (!secretMatch) - { - string queryString = requestItems[1].Substring(index); - if (queryString.Contains(PacSecret)) - { - secretMatch = true; - } - } - } - } - - // parse request header - for (int i = 1; i < lines.Length; i++) - { - if (string.IsNullOrEmpty(lines[i])) - continue; - - string[] kv = lines[i].Split(new char[] { ':' }, 2); - if (kv.Length == 2) - { - if (kv[0] == "Host") - { - if (kv[1].Trim() == ((IPEndPoint)socket.LocalEndPoint).ToString()) - { - hostMatch = true; - } - } - } - } - - if (hostMatch && pathMatch) - { - if (!secretMatch) - { - socket.Close(); // Close immediately - } - else - { - SendResponse(socket, useSocks); - } - return true; - } - return false; - } - catch (ArgumentException) - { - return false; - } - } - - - - public void SendResponse(Socket socket, bool useSocks) - { - try - { - IPEndPoint localEndPoint = (IPEndPoint)socket.LocalEndPoint; - - string proxy = GetPACAddress(localEndPoint, useSocks); - - string pacContent = $"var __PROXY__ = '{proxy}';\n" + _pacDaemon.GetPACContent(); - string responseHead = -$@"HTTP/1.1 200 OK -Server: ShadowsocksWindows/{UpdateChecker.Version} -Content-Type: application/x-ns-proxy-autoconfig -Content-Length: {Encoding.UTF8.GetBytes(pacContent).Length} -Connection: Close - -"; - byte[] response = Encoding.UTF8.GetBytes(responseHead + pacContent); - socket.BeginSend(response, 0, response.Length, 0, new AsyncCallback(SendCallback), socket); - } - catch (Exception e) - { - logger.LogUsefulException(e); - socket.Close(); - } - } - - private void SendCallback(IAsyncResult ar) - { - Socket conn = (Socket)ar.AsyncState; - try - { - conn.Shutdown(SocketShutdown.Send); - } - catch - { } - } - - - private string GetPACAddress(IPEndPoint localEndPoint, bool useSocks) - { - return localEndPoint.AddressFamily == AddressFamily.InterNetworkV6 - ? $"{(useSocks ? "SOCKS5" : "PROXY")} [{localEndPoint.Address}]:{_config.localPort};" - : $"{(useSocks ? "SOCKS5" : "PROXY")} {localEndPoint.Address}:{_config.localPort};"; - } - } -} +using System; +using System.Net; +using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; +using NLog; +using Shadowsocks.Encryption; +using Shadowsocks.Model; + +namespace Shadowsocks.Controller +{ + public class PACServer : Listener.Service + { + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + + public const string RESOURCE_NAME = "pac"; + + private string PacSecret + { + get + { + if (string.IsNullOrEmpty(_cachedPacSecret)) + { + var rd = new byte[32]; + RNG.GetBytes(rd); + _cachedPacSecret = HttpServerUtilityUrlToken.Encode(rd); + } + return _cachedPacSecret; + } + } + + private string _cachedPacSecret = ""; + public string PacUrl { get; private set; } = ""; + + private Configuration _config; + private readonly PACDaemon _pacDaemon; + + public PACServer(PACDaemon pacDaemon) + { + _pacDaemon = pacDaemon; + } + + public void UpdatePACURL(Configuration config) + { + _config = config; + string usedSecret = _config.secureLocalPac ? $"&secret={PacSecret}" : ""; + string contentHash = GetHash(GetContentForHash()); + PacUrl = $"http://{config.LocalHost}:{config.localPort}/{RESOURCE_NAME}?hash={contentHash}{usedSecret}"; + logger.Debug("Set PAC URL:" + PacUrl); + } + + private string GetContentForHash() + { + if (UseOnlinePac()) + { + if (OnlinePacCache.TryGetContent(_config.pacUrl, out string cached)) + return cached; + + string proxy = $"PROXY {_config.LocalHost}:{_config.localPort};"; + return BuildProxyAllPac(proxy); + } + + return _pacDaemon.GetPACContent(); + } + + private static string GetHash(string content) + => HttpServerUtilityUrlToken.Encode(MD5.HashData(Encoding.UTF8.GetBytes(content))); + + public override bool Handle(byte[] firstPacket, int length, Socket socket, object state) + { + if (socket.ProtocolType != ProtocolType.Tcp) + return false; + + try + { + string request = Encoding.UTF8.GetString(firstPacket, 0, length); + string[] lines = request.Split('\r', '\n'); + bool hostMatch = false, pathMatch = false; + bool secretMatch = !_config.secureLocalPac; + + if (lines.Length < 2) + return false; + + string requestLine = lines[0]; + string[] requestItems = requestLine.Split(' '); + if (requestItems.Length == 3 && requestItems[0] == "GET") + { + int index = requestItems[1].IndexOf('?'); + if (index < 0) + index = requestItems[1].Length; + + string resourceString = requestItems[1].Substring(0, index).Remove(0, 1); + if (string.Equals(resourceString, RESOURCE_NAME, StringComparison.OrdinalIgnoreCase)) + { + pathMatch = true; + if (!secretMatch) + { + string queryString = requestItems[1].Substring(index); + if (queryString.Contains(PacSecret)) + secretMatch = true; + } + } + } + + for (int i = 1; i < lines.Length; i++) + { + if (string.IsNullOrEmpty(lines[i])) + continue; + + string[] kv = lines[i].Split(new[] { ':' }, 2); + if (kv.Length == 2 && kv[0] == "Host" && + kv[1].Trim() == ((IPEndPoint)socket.LocalEndPoint).ToString()) + { + hostMatch = true; + } + } + + if (!hostMatch || !pathMatch) + return false; + + if (!secretMatch) + socket.Close(); + else + SendResponse(socket); + + return true; + } + catch (ArgumentException) + { + return false; + } + } + + private void SendResponse(Socket socket) + { + try + { + IPEndPoint localEndPoint = (IPEndPoint)socket.LocalEndPoint; + string proxy = GetPACAddress(localEndPoint); + string pacContent; + + if (UseOnlinePac()) + { + // Serve the remote PAC byte-for-byte logically from the local cache. + // If this is the first run and the cache is not ready yet, proxy-all is + // a safe bootstrap that avoids a direct-network leak. + pacContent = OnlinePacCache.TryGetContent(_config.pacUrl, out string cached) + ? cached + : BuildProxyAllPac(proxy); + } + else + { + pacContent = $"var __PROXY__ = '{proxy}';\n" + _pacDaemon.GetPACContent(); + } + + byte[] body = Encoding.UTF8.GetBytes(pacContent); + string responseHead = + $"HTTP/1.1 200 OK\r\n" + + $"Server: ShadowsocksWindows/{UpdateChecker.Version}\r\n" + + "Content-Type: application/x-ns-proxy-autoconfig; charset=utf-8\r\n" + + $"Content-Length: {body.Length}\r\n" + + "Cache-Control: no-cache\r\n" + + "Connection: Close\r\n\r\n"; + byte[] head = Encoding.UTF8.GetBytes(responseHead); + byte[] response = new byte[head.Length + body.Length]; + Buffer.BlockCopy(head, 0, response, 0, head.Length); + Buffer.BlockCopy(body, 0, response, head.Length, body.Length); + socket.BeginSend(response, 0, response.Length, 0, SendCallback, socket); + } + catch (Exception e) + { + logger.LogUsefulException(e); + socket.Close(); + } + } + + private static void SendCallback(IAsyncResult ar) + { + Socket conn = (Socket)ar.AsyncState; + try + { + conn.Shutdown(SocketShutdown.Send); + } + catch + { + } + } + + private bool UseOnlinePac() + => _config != null && _config.useOnlinePac && !string.IsNullOrWhiteSpace(_config.pacUrl); + + private static string BuildProxyAllPac(string proxy) + => $"function FindProxyForURL(url, host) {{ return '{proxy}'; }}\n"; + + private string GetPACAddress(IPEndPoint localEndPoint) + => localEndPoint.AddressFamily == AddressFamily.InterNetworkV6 + ? $"PROXY [{localEndPoint.Address}]:{_config.localPort};" + : $"PROXY {localEndPoint.Address}:{_config.localPort};"; + } +} diff --git a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs index 53453c0be..789cb4bbb 100644 --- a/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs +++ b/shadowsocks-csharp/Controller/Service/PrivoxyRunner.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Linq; diff --git a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs index 91d2cd598..156966e53 100644 --- a/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs +++ b/shadowsocks-csharp/Controller/Service/Sip003Plugin.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Specialized; using System.Diagnostics; using System.IO; diff --git a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs index 35359f265..acee9ca29 100644 --- a/shadowsocks-csharp/Controller/Service/UpdateChecker.cs +++ b/shadowsocks-csharp/Controller/Service/UpdateChecker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Net.Http; diff --git a/shadowsocks-csharp/Controller/ShadowsocksController.cs b/shadowsocks-csharp/Controller/ShadowsocksController.cs index 69d31232a..8f2d26a70 100644 --- a/shadowsocks-csharp/Controller/ShadowsocksController.cs +++ b/shadowsocks-csharp/Controller/ShadowsocksController.cs @@ -1,732 +1,833 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Net.Sockets; -using System.Threading; -using System.Threading.Tasks; -using System.Windows.Forms; -using NLog; -using Shadowsocks.Controller.Service; -using Shadowsocks.Controller.Strategy; -using Shadowsocks.Model; -using WPFLocalizeExtension.Engine; - -namespace Shadowsocks.Controller -{ - public class ShadowsocksController - { - private readonly Logger logger; - private readonly HttpClient httpClient; - - // controller: - // handle user actions - // manipulates UI - // interacts with low level logic - #region Members definition - private Thread _trafficThread; - - private Listener _listener; - private PACDaemon _pacDaemon; - private PACServer _pacServer; - private Configuration _config; - private StrategyManager _strategyManager; - private PrivoxyRunner privoxyRunner; - private readonly ConcurrentDictionary _pluginsByServer; - - private long _inboundCounter = 0; - private long _outboundCounter = 0; - public long InboundCounter => Interlocked.Read(ref _inboundCounter); - public long OutboundCounter => Interlocked.Read(ref _outboundCounter); - public Queue trafficPerSecondQueue; - - private bool stopped = false; - - public class PathEventArgs : EventArgs - { - public string Path; - } - - public class UpdatedEventArgs : EventArgs - { - public string OldVersion; - public string NewVersion; - } - - public class TrafficPerSecond - { - public long inboundCounter; - public long outboundCounter; - public long inboundIncreasement; - public long outboundIncreasement; - } - - public event EventHandler ConfigChanged; - public event EventHandler EnableStatusChanged; - public event EventHandler EnableGlobalChanged; - public event EventHandler ShareOverLANStatusChanged; - public event EventHandler VerboseLoggingStatusChanged; - public event EventHandler ShowPluginOutputChanged; - public event EventHandler TrafficChanged; - - // when user clicked Edit PAC, and PAC file has already created - public event EventHandler PACFileReadyToOpen; - public event EventHandler UserRuleFileReadyToOpen; - - public event EventHandler UpdatePACFromGeositeCompleted; - - public event ErrorEventHandler UpdatePACFromGeositeError; - - public event ErrorEventHandler Errored; - - // Invoked when controller.Start(); - public event EventHandler ProgramUpdated; - #endregion - - public ShadowsocksController() - { - logger = LogManager.GetCurrentClassLogger(); - httpClient = new HttpClient(); - _config = Configuration.Load(); - Configuration.Process(ref _config); - _strategyManager = new StrategyManager(this); - _pluginsByServer = new ConcurrentDictionary(); - StartTrafficStatistics(61); - - ProgramUpdated += (o, e) => - { - // version update precedures - if (e.OldVersion == "4.3.0.0" || e.OldVersion == "4.3.1.0") - _config.geositeDirectGroups.Add("private"); - - logger.Info($"Updated from {e.OldVersion} to {e.NewVersion}"); - }; - } - - #region Basic - - public void Start(bool systemWakeUp = false) - { - if (_config.firstRunOnNewVersion && !systemWakeUp) - { - ProgramUpdated.Invoke(this, new UpdatedEventArgs() - { - OldVersion = _config.version, - NewVersion = UpdateChecker.Version, - }); - // delete pac.txt when regeneratePacOnUpdate is true - if (_config.regeneratePacOnUpdate) - try - { - File.Delete(PACDaemon.PAC_FILE); - logger.Info("Deleted pac.txt from previous version."); - } - catch (Exception e) - { - logger.LogUsefulException(e); - } - // finish up first run of new version - _config.firstRunOnNewVersion = false; - _config.version = UpdateChecker.Version; - Configuration.Save(_config); - } - Reload(); - if (!systemWakeUp) - HotkeyReg.RegAllHotkeys(); - } - - public void Stop() - { - if (stopped) - { - return; - } - stopped = true; - if (_listener != null) - { - _listener.Stop(); - } - StopPlugins(); - if (privoxyRunner != null) - { - privoxyRunner.Stop(); - } - if (_config.enabled) - { - SystemProxy.Update(_config, true, null); - } - Encryption.RNG.Close(); - } - - protected void Reload() - { - Encryption.RNG.Reload(); - // some logic in configuration updated the config when saving, we need to read it again - _config = Configuration.Load(); - Configuration.Process(ref _config); - - NLogConfig.LoadConfiguration(); - - logger.Info($"WPF Localization Extension|Current culture: {LocalizeDictionary.CurrentCulture}"); - - // set User-Agent for httpClient - try - { - if (!string.IsNullOrWhiteSpace(_config.userAgentString)) - httpClient.DefaultRequestHeaders.Add("User-Agent", _config.userAgentString); - } - catch - { - // reset userAgent to default and reapply - Configuration.ResetUserAgent(_config); - httpClient.DefaultRequestHeaders.Add("User-Agent", _config.userAgentString); - } - - privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); - - _pacDaemon = _pacDaemon ?? new PACDaemon(_config); - _pacDaemon.PACFileChanged += PacDaemon_PACFileChanged; - _pacDaemon.UserRuleFileChanged += PacDaemon_UserRuleFileChanged; - _pacServer = _pacServer ?? new PACServer(_pacDaemon); - _pacServer.UpdatePACURL(_config); // So PACServer works when system proxy disabled. - - GeositeUpdater.ResetEvent(); - GeositeUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; - GeositeUpdater.Error += PacServer_PACUpdateError; - - _listener?.Stop(); - StopPlugins(); - - // don't put PrivoxyRunner.Start() before pacServer.Stop() - // or bind will fail when switching bind address from 0.0.0.0 to 127.0.0.1 - // though UseShellExecute is set to true now - // http://stackoverflow.com/questions/10235093/socket-doesnt-close-after-application-exits-if-a-launched-process-is-open - privoxyRunner.Stop(); - try - { - var strategy = GetCurrentStrategy(); - strategy?.ReloadServers(); - - StartPlugin(); - privoxyRunner.Start(_config); - - TCPRelay tcpRelay = new TCPRelay(this, _config); - tcpRelay.OnInbound += UpdateInboundCounter; - tcpRelay.OnOutbound += UpdateOutboundCounter; - tcpRelay.OnFailed += (o, e) => GetCurrentStrategy()?.SetFailure(e.server); - - UDPRelay udpRelay = new UDPRelay(this); - List services = new List - { - tcpRelay, - udpRelay, - _pacServer, - new PortForwarder(privoxyRunner.RunningPort) - }; - _listener = new Listener(services); - _listener.Start(_config); - } - catch (Exception e) - { - // translate Microsoft language into human language - // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use - if (e is SocketException se) - { - if (se.SocketErrorCode == SocketError.AddressAlreadyInUse) - { - e = new Exception(I18N.GetString("Port {0} already in use", _config.localPort), e); - } - else if (se.SocketErrorCode == SocketError.AccessDenied) - { - e = new Exception(I18N.GetString("Port {0} is reserved by system", _config.localPort), e); - } - } - logger.LogUsefulException(e); - ReportError(e); - } - - // Apply the Windows proxy first, then notify the UI. The menu must represent - // the effective WinINet state rather than only the persisted desired mode. - UpdateSystemProxy(); - ConfigChanged?.Invoke(this, new EventArgs()); - } - - protected void SaveConfig(Configuration newConfig) - { - Configuration.Save(newConfig); - Reload(); - } - - protected void ReportError(Exception e) - { - Errored?.Invoke(this, new ErrorEventArgs(e)); - } - - public HttpClient GetHttpClient() => httpClient; - public Server GetCurrentServer() => _config.GetCurrentServer(); - public Configuration GetCurrentConfiguration() => _config; - internal SystemProxyMode GetSystemProxyMode() => SystemProxy.GetCurrentMode(_config, _pacServer); - - public Server GetAServer(IStrategyCallerType type, IPEndPoint localIPEndPoint, EndPoint destEndPoint) - { - IStrategy strategy = GetCurrentStrategy(); - if (strategy != null) - { - return strategy.GetAServer(type, localIPEndPoint, destEndPoint); - } - if (_config.index < 0) - { - _config.index = 0; - } - return GetCurrentServer(); - } - - public void SaveServers(List servers, int localPort, bool portableMode) - { - _config.configs = servers; - _config.localPort = localPort; - _config.portableMode = portableMode; - Configuration.Save(_config); - } - - public void SelectServerIndex(int index) - { - _config.index = index; - _config.strategy = null; - SaveConfig(_config); - } - - public void ToggleShareOverLAN(bool enabled) - { - _config.shareOverLan = enabled; - SaveConfig(_config); - - ShareOverLANStatusChanged?.Invoke(this, new EventArgs()); - } - - #endregion - - #region OS Proxy - - public void ToggleEnable(bool enabled) - { - _config.enabled = enabled; - SaveConfig(_config); - - EnableStatusChanged?.Invoke(this, new EventArgs()); - } - - public void ToggleGlobal(bool global) - { - _config.global = global; - SaveConfig(_config); - - EnableGlobalChanged?.Invoke(this, new EventArgs()); - } - - public void SaveProxy(ForwardProxyConfig proxyConfig) - { - _config.proxy = proxyConfig; - SaveConfig(_config); - } - - private void UpdateSystemProxy() - { - SystemProxy.Update(_config, false, _pacServer); - } - - #endregion - - #region PAC - - private void PacDaemon_PACFileChanged(object sender, EventArgs e) - { - UpdateSystemProxy(); - } - - private void PacServer_PACUpdateCompleted(object sender, GeositeResultEventArgs e) - { - UpdatePACFromGeositeCompleted?.Invoke(this, e); - } - - private void PacServer_PACUpdateError(object sender, ErrorEventArgs e) - { - UpdatePACFromGeositeError?.Invoke(this, e); - } - - private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; - private void PacDaemon_UserRuleFileChanged(object sender, EventArgs e) - { - GeositeUpdater.MergeAndWritePACFile(_config.geositeDirectGroups, _config.geositeProxiedGroups, _config.geositePreferDirect); - UpdateSystemProxy(); - } - - public void CopyPacUrl() - { - Clipboard.SetDataObject(_pacServer.PacUrl); - } - - public void SavePACUrl(string pacUrl) - { - _config.pacUrl = pacUrl; - SaveConfig(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void UseOnlinePAC(bool useOnlinePac) - { - _config.useOnlinePac = useOnlinePac; - SaveConfig(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void TouchPACFile() - { - string pacFilename = _pacDaemon.TouchPACFile(); - - PACFileReadyToOpen?.Invoke(this, new PathEventArgs() { Path = pacFilename }); - } - - public void TouchUserRuleFile() - { - string userRuleFilename = _pacDaemon.TouchUserRuleFile(); - - UserRuleFileReadyToOpen?.Invoke(this, new PathEventArgs() { Path = userRuleFilename }); - } - - public void ToggleSecureLocalPac(bool enabled) - { - _config.secureLocalPac = enabled; - SaveConfig(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void ToggleRegeneratePacOnUpdate(bool enabled) - { - _config.regeneratePacOnUpdate = enabled; - SaveConfig(_config); - ConfigChanged?.Invoke(this, new EventArgs()); - } - - #endregion - - #region SIP002 - - public bool AskAddServerBySSURL(string ssURL) - { - var dr = MessageBox.Show(I18N.GetString("Import from URL: {0} ?", ssURL), I18N.GetString("Shadowsocks"), MessageBoxButtons.YesNo); - if (dr == DialogResult.Yes) - { - if (AddServerBySSURL(ssURL)) - { - MessageBox.Show(I18N.GetString("Successfully imported from {0}", ssURL)); - return true; - } - else - { - MessageBox.Show(I18N.GetString("Failed to import. Please check if the link is valid.")); - } - } - return false; - } - - public bool AddServerBySSURL(string ssURL) - { - try - { - if (string.IsNullOrWhiteSpace(ssURL)) - return false; - - var servers = Server.GetServers(ssURL); - if (servers == null || servers.Count == 0) - return false; - - foreach (var server in servers) - { - _config.configs.Add(server); - if (server.warnLegacyUrl) - MessageBox.Show(I18N.GetString("Warning: importing {0} from a legacy ss:// link. Support for legacy ss:// links will be dropped in version 5. Make sure to update your ss:// links.", server.ToString())); - } - _config.index = _config.configs.Count - 1; - SaveConfig(_config); - return true; - } - catch (Exception e) - { - logger.LogUsefulException(e); - return false; - } - } - - public string GetServerURLForCurrentServer() - { - return GetCurrentServer().GetURL(_config.generateLegacyUrl); - } - - #endregion - - #region Misc - - public void ToggleVerboseLogging(bool enabled) - { - _config.isVerboseLogging = enabled; - SaveConfig(_config); - NLogConfig.LoadConfiguration(); // reload nlog - - VerboseLoggingStatusChanged?.Invoke(this, new EventArgs()); - } - - public void ToggleCheckingUpdate(bool enabled) - { - _config.autoCheckUpdate = enabled; - Configuration.Save(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void ToggleCheckingPreRelease(bool enabled) - { - _config.checkPreRelease = enabled; - Configuration.Save(_config); - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void SaveSkippedUpdateVerion(string version) - { - _config.skippedUpdateVersion = version; - Configuration.Save(_config); - } - - public void SaveLogViewerConfig(LogViewerConfig newConfig) - { - _config.logViewer = newConfig; - Configuration.Save(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - public void SaveHotkeyConfig(HotkeyConfig newConfig) - { - _config.hotkey = newConfig; - SaveConfig(_config); - - ConfigChanged?.Invoke(this, new EventArgs()); - } - - #endregion - - #region Strategy - - public void SelectStrategy(string strategyID) - { - _config.index = -1; - _config.strategy = strategyID; - SaveConfig(_config); - } - - public IList GetStrategies() - { - return _strategyManager.GetStrategies(); - } - - public IStrategy GetCurrentStrategy() - { - foreach (var strategy in _strategyManager.GetStrategies()) - { - if (strategy.ID == _config.strategy) - { - return strategy; - } - } - return null; - } - - public void UpdateInboundCounter(object sender, SSTransmitEventArgs args) - { - GetCurrentStrategy()?.UpdateLastRead(args.server); - Interlocked.Add(ref _inboundCounter, args.length); - } - - public void UpdateOutboundCounter(object sender, SSTransmitEventArgs args) - { - GetCurrentStrategy()?.UpdateLastWrite(args.server); - Interlocked.Add(ref _outboundCounter, args.length); - } - - #endregion - - #region SIP003 - - private void StartPlugin() - { - var server = _config.GetCurrentServer(); - GetPluginLocalEndPointIfConfigured(server); - } - - private void StopPlugins() - { - foreach (var serverAndPlugin in _pluginsByServer) - { - serverAndPlugin.Value?.Dispose(); - } - _pluginsByServer.Clear(); - } - - public EndPoint GetPluginLocalEndPointIfConfigured(Server server) - { - var plugin = _pluginsByServer.GetOrAdd( - server, - x => Sip003Plugin.CreateIfConfigured(x, _config.showPluginOutput)); - - if (plugin == null) - { - return null; - } - - try - { - if (plugin.StartIfNeeded()) - { - logger.Info( - $"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); - } - } - catch (Exception ex) - { - logger.Error("Failed to start SIP003 plugin: " + ex.Message); - throw; - } - - return plugin.LocalEndPoint; - } - - public void ToggleShowPluginOutput(bool enabled) - { - _config.showPluginOutput = enabled; - SaveConfig(_config); - - ShowPluginOutputChanged?.Invoke(this, new EventArgs()); - } - - #endregion - - #region Traffic Statistics - - private void StartTrafficStatistics(int queueMaxSize) - { - trafficPerSecondQueue = new Queue(); - for (int i = 0; i < queueMaxSize; i++) - { - trafficPerSecondQueue.Enqueue(new TrafficPerSecond()); - } - _trafficThread = new Thread(new ThreadStart(() => TrafficStatistics(queueMaxSize))) - { - IsBackground = true - }; - _trafficThread.Start(); - } - - private void TrafficStatistics(int queueMaxSize) - { - TrafficPerSecond previous, current; - while (true) - { - previous = trafficPerSecondQueue.Last(); - current = new TrafficPerSecond - { - inboundCounter = InboundCounter, - outboundCounter = OutboundCounter - }; - current.inboundIncreasement = current.inboundCounter - previous.inboundCounter; - current.outboundIncreasement = current.outboundCounter - previous.outboundCounter; - - trafficPerSecondQueue.Enqueue(current); - if (trafficPerSecondQueue.Count > queueMaxSize) - trafficPerSecondQueue.Dequeue(); - - TrafficChanged?.Invoke(this, new EventArgs()); - - Thread.Sleep(1000); - } - } - - #endregion - - #region SIP008 - - - public async Task UpdateOnlineConfigInternal(string url) - { - var onlineServer = await OnlineConfigResolver.GetOnline(url); - _config.configs = Configuration.SortByOnlineConfig( - _config.configs - .Where(c => c.group != url) - .Concat(onlineServer) - ); - logger.Info($"updated {onlineServer.Count} server from {url}"); - return onlineServer.Count; - } - - public async Task UpdateOnlineConfig(string url) - { - var selected = GetCurrentServer(); - try - { - int count = await UpdateOnlineConfigInternal(url); - } - catch (Exception e) - { - logger.LogUsefulException(e); - return false; - } - _config.index = _config.configs.IndexOf(selected); - SaveConfig(_config); - return true; - } - - public async Task> UpdateAllOnlineConfig() - { - var selected = GetCurrentServer(); - var failedUrls = new List(); - foreach (var url in _config.onlineConfigSource) - { - try - { - await UpdateOnlineConfigInternal(url); - } - catch (Exception e) - { - logger.LogUsefulException(e); - failedUrls.Add(url); - } - } - - _config.index = _config.configs.IndexOf(selected); - SaveConfig(_config); - return failedUrls; - } - - public void SaveOnlineConfigSource(List sources) - { - _config.onlineConfigSource = sources; - SaveConfig(_config); - } - - public void RemoveOnlineConfig(string url) - { - _config.onlineConfigSource.RemoveAll(v => v == url); - _config.configs = Configuration.SortByOnlineConfig( - _config.configs.Where(c => c.group != url) - ); - SaveConfig(_config); - } - - #endregion - } -} +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using NLog; +using Shadowsocks.Controller.Service; +using Shadowsocks.Controller.Strategy; +using Shadowsocks.Model; +using WPFLocalizeExtension.Engine; + +namespace Shadowsocks.Controller +{ + public class ShadowsocksController + { + private readonly Logger logger; + private readonly HttpClient httpClient; + + // controller: + // handle user actions + // manipulates UI + // interacts with low level logic + #region Members definition + private Thread _trafficThread; + + private Listener _listener; + private PACDaemon _pacDaemon; + private PACServer _pacServer; + private Configuration _config; + private StrategyManager _strategyManager; + private PrivoxyRunner privoxyRunner; + private readonly ConcurrentDictionary _pluginsByServer; + + private long _inboundCounter = 0; + private long _outboundCounter = 0; + public long InboundCounter => Interlocked.Read(ref _inboundCounter); + public long OutboundCounter => Interlocked.Read(ref _outboundCounter); + public Queue trafficPerSecondQueue; + + private bool stopped = false; + + public class PathEventArgs : EventArgs + { + public string Path; + } + + public class UpdatedEventArgs : EventArgs + { + public string OldVersion; + public string NewVersion; + } + + public class TrafficPerSecond + { + public long inboundCounter; + public long outboundCounter; + public long inboundIncreasement; + public long outboundIncreasement; + } + + public event EventHandler ConfigChanged; + public event EventHandler EnableStatusChanged; + public event EventHandler EnableGlobalChanged; + public event EventHandler ShareOverLANStatusChanged; + public event EventHandler VerboseLoggingStatusChanged; + public event EventHandler ShowPluginOutputChanged; + public event EventHandler TrafficChanged; + + // when user clicked Edit PAC, and PAC file has already created + public event EventHandler PACFileReadyToOpen; + public event EventHandler UserRuleFileReadyToOpen; + + public event EventHandler UpdatePACFromGeositeCompleted; + + public event ErrorEventHandler UpdatePACFromGeositeError; + + public event ErrorEventHandler Errored; + + // Invoked when controller.Start(); + public event EventHandler ProgramUpdated; + #endregion + + public ShadowsocksController() + { + logger = LogManager.GetCurrentClassLogger(); + httpClient = new HttpClient(); + _config = Configuration.Load(); + Configuration.Process(ref _config); + _strategyManager = new StrategyManager(this); + _pluginsByServer = new ConcurrentDictionary(); + StartTrafficStatistics(61); + + ProgramUpdated += (o, e) => + { + // version update precedures + if (e.OldVersion == "4.3.0.0" || e.OldVersion == "4.3.1.0") + _config.geositeDirectGroups.Add("private"); + + logger.Info($"Updated from {e.OldVersion} to {e.NewVersion}"); + }; + } + + #region Basic + + public void Start(bool systemWakeUp = false) + { + if (_config.firstRunOnNewVersion && !systemWakeUp) + { + ProgramUpdated.Invoke(this, new UpdatedEventArgs() + { + OldVersion = _config.version, + NewVersion = UpdateChecker.Version, + }); + // delete pac.txt when regeneratePacOnUpdate is true + if (_config.regeneratePacOnUpdate) + try + { + File.Delete(PACDaemon.PAC_FILE); + logger.Info("Deleted pac.txt from previous version."); + } + catch (Exception e) + { + logger.LogUsefulException(e); + } + // finish up first run of new version + _config.firstRunOnNewVersion = false; + _config.version = UpdateChecker.Version; + Configuration.Save(_config); + } + Reload(); + if (!systemWakeUp) + HotkeyReg.RegAllHotkeys(); + } + + public void Stop() + { + if (stopped) + { + return; + } + stopped = true; + if (_listener != null) + { + _listener.Stop(); + } + StopPlugins(); + if (privoxyRunner != null) + { + privoxyRunner.Stop(); + } + if (_config.enabled) + { + SystemProxy.Update(_config, true, null); + } + Encryption.RNG.Close(); + } + + protected void Reload() + { + Encryption.RNG.Reload(); + // some logic in configuration updated the config when saving, we need to read it again + _config = Configuration.Load(); + Configuration.Process(ref _config); + if (!_config.useOnlinePac) + GeositeUpdater.ConfigureSources(_config.geositeUrls); + + NLogConfig.LoadConfiguration(); + + logger.Info($"WPF Localization Extension|Current culture: {LocalizeDictionary.CurrentCulture}"); + + // set User-Agent for httpClient + try + { + if (!string.IsNullOrWhiteSpace(_config.userAgentString)) + httpClient.DefaultRequestHeaders.Add("User-Agent", _config.userAgentString); + } + catch + { + // reset userAgent to default and reapply + Configuration.ResetUserAgent(_config); + httpClient.DefaultRequestHeaders.Add("User-Agent", _config.userAgentString); + } + + privoxyRunner = privoxyRunner ?? new PrivoxyRunner(); + + if (_pacDaemon == null) + { + _pacDaemon = new PACDaemon(_config); + _pacDaemon.PACFileChanged += PacDaemon_PACFileChanged; + _pacDaemon.UserRuleFileChanged += PacDaemon_UserRuleFileChanged; + } + else + { + _pacDaemon.UpdateConfiguration(_config); + } + + _pacServer = _pacServer ?? new PACServer(_pacDaemon); + _pacServer.UpdatePACURL(_config); // Both Local and cached Online PAC are served from localhost. + + // Do not even initialize GeoSite while Online PAC is selected. + if (!_config.useOnlinePac) + { + GeositeUpdater.ResetEvent(); + GeositeUpdater.UpdateCompleted += PacServer_PACUpdateCompleted; + GeositeUpdater.Error += PacServer_PACUpdateError; + } + + _listener?.Stop(); + StopPlugins(); + + // don't put PrivoxyRunner.Start() before pacServer.Stop() + // or bind will fail when switching bind address from 0.0.0.0 to 127.0.0.1 + // though UseShellExecute is set to true now + // http://stackoverflow.com/questions/10235093/socket-doesnt-close-after-application-exits-if-a-launched-process-is-open + privoxyRunner.Stop(); + try + { + var strategy = GetCurrentStrategy(); + strategy?.ReloadServers(); + + StartPlugin(); + privoxyRunner.Start(_config); + + TCPRelay tcpRelay = new TCPRelay(this, _config); + tcpRelay.OnInbound += UpdateInboundCounter; + tcpRelay.OnOutbound += UpdateOutboundCounter; + tcpRelay.OnFailed += (o, e) => GetCurrentStrategy()?.SetFailure(e.server); + + UDPRelay udpRelay = new UDPRelay(this); + List services = new List + { + tcpRelay, + udpRelay, + _pacServer, + new PortForwarder(privoxyRunner.RunningPort) + }; + _listener = new Listener(services); + _listener.Start(_config); + } + catch (Exception e) + { + // translate Microsoft language into human language + // i.e. An attempt was made to access a socket in a way forbidden by its access permissions => Port already in use + if (e is SocketException se) + { + if (se.SocketErrorCode == SocketError.AddressAlreadyInUse) + { + e = new Exception(I18N.GetString("Port {0} already in use", _config.localPort), e); + } + else if (se.SocketErrorCode == SocketError.AccessDenied) + { + e = new Exception(I18N.GetString("Port {0} is reserved by system", _config.localPort), e); + } + } + logger.LogUsefulException(e); + ReportError(e); + } + + // Apply the Windows proxy first, then notify the UI. Both PAC modes now point + // WinINet at localhost; remote data is refreshed only after the SS listener is up. + UpdateSystemProxy(); + ConfigChanged?.Invoke(this, new EventArgs()); + + _ = RefreshActivePacDataAsync(_config); + } + + protected void SaveConfig(Configuration newConfig) + { + Configuration.Save(newConfig); + Reload(); + } + + protected void ReportError(Exception e) + { + Errored?.Invoke(this, new ErrorEventArgs(e)); + } + + public HttpClient GetHttpClient() => httpClient; + public Server GetCurrentServer() => _config.GetCurrentServer(); + public Configuration GetCurrentConfiguration() => _config; + internal SystemProxyMode GetSystemProxyMode() => SystemProxy.GetCurrentMode(_config, _pacServer); + + public Server GetAServer(IStrategyCallerType type, IPEndPoint localIPEndPoint, EndPoint destEndPoint) + { + IStrategy strategy = GetCurrentStrategy(); + if (strategy != null) + { + return strategy.GetAServer(type, localIPEndPoint, destEndPoint); + } + if (_config.index < 0) + { + _config.index = 0; + } + return GetCurrentServer(); + } + + public void SaveServers(List servers, int localPort, bool portableMode) + { + _config.configs = servers; + _config.localPort = localPort; + _config.portableMode = portableMode; + Configuration.Save(_config); + } + + public void SelectServerIndex(int index) + { + _config.index = index; + _config.strategy = null; + SaveConfig(_config); + } + + public void ToggleShareOverLAN(bool enabled) + { + _config.shareOverLan = enabled; + SaveConfig(_config); + + ShareOverLANStatusChanged?.Invoke(this, new EventArgs()); + } + + #endregion + + #region OS Proxy + + public void ToggleEnable(bool enabled) + { + _config.enabled = enabled; + SaveConfig(_config); + + EnableStatusChanged?.Invoke(this, new EventArgs()); + } + + public void ToggleGlobal(bool global) + { + _config.global = global; + SaveConfig(_config); + + EnableGlobalChanged?.Invoke(this, new EventArgs()); + } + + public void SaveProxy(ForwardProxyConfig proxyConfig) + { + _config.proxy = proxyConfig; + SaveConfig(_config); + } + + private void UpdateSystemProxy() + { + SystemProxy.Update(_config, false, _pacServer); + } + + #endregion + + #region PAC + + private void PacDaemon_PACFileChanged(object sender, EventArgs e) + { + if (!_config.useOnlinePac) + { + _pacServer.UpdatePACURL(_config); + UpdateSystemProxy(); + } + } + + private void PacServer_PACUpdateCompleted(object sender, GeositeResultEventArgs e) + { + if (!_config.useOnlinePac) + { + _pacServer.UpdatePACURL(_config); + UpdateSystemProxy(); + } + UpdatePACFromGeositeCompleted?.Invoke(this, e); + } + + private void PacServer_PACUpdateError(object sender, ErrorEventArgs e) + { + UpdatePACFromGeositeError?.Invoke(this, e); + } + + private static readonly IEnumerable IgnoredLineBegins = new[] { '!', '[' }; + private void PacDaemon_UserRuleFileChanged(object sender, EventArgs e) + { + if (_config.useOnlinePac || !GeositeUpdater.IsDatabaseAvailable) + return; + + GeositeUpdater.MergeAndWritePACFile(_config.geositeDirectGroups, _config.geositeProxiedGroups, _config.geositePreferDirect); + _pacServer.UpdatePACURL(_config); + UpdateSystemProxy(); + } + + private async Task RefreshActivePacDataAsync(Configuration configAtStart) + { + try + { + // Let compound UI mode changes (e.g. PAC -> Global) finish their second + // config write before deciding whether a PAC download is still required. + await Task.Yield(); + if (!ReferenceEquals(_config, configAtStart)) + return; + + // PAC data is only fetched when PAC mode is actually active. Global and + // Disabled modes do not need either GeoSite or an online PAC refresh. + if (!configAtStart.enabled || configAtStart.global) + return; + + if (configAtStart.useOnlinePac) + { + if (string.IsNullOrWhiteSpace(configAtStart.pacUrl)) + return; + + await OnlinePacCache.RefreshAsync(configAtStart); + + // A reload may have changed the mode or URL while the request was in flight. + if (_config.enabled && !_config.global && _config.useOnlinePac && + string.Equals(_config.pacUrl, configAtStart.pacUrl, StringComparison.Ordinal)) + { + _pacServer.UpdatePACURL(_config); + UpdateSystemProxy(); + } + return; + } + + if (!GeositeUpdater.IsDatabaseAvailable || GeositeUpdater.NeedsRefresh) + { + await GeositeUpdater.UpdatePACFromGeosite(false); + if (_config.enabled && !_config.global && !_config.useOnlinePac) + { + _pacServer.UpdatePACURL(_config); + UpdateSystemProxy(); + } + } + } + catch (Exception ex) + { + // Keep the last known-good cache (or the proxy-all bootstrap PAC) and + // retry on the next relevant reload/start instead of breaking the client. + logger.LogUsefulException(ex); + } + } + + public void CopyPacUrl() + { + Clipboard.SetDataObject(_pacServer.PacUrl); + } + + public void SavePACUrl(string pacUrl) + { + _config.pacUrl = pacUrl; + SaveConfig(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void SaveGeositeSources(List sources) + { + _config.geositeUrls = Configuration.NormalizeGeositeSourceList(sources); + + // The existing pac.txt may have been generated from a different set of + // databases. Remove it before reload so Local PAC is rebuilt from the new + // merged source set (or from the safe proxy-all bootstrap while downloading). + if (!_config.useOnlinePac) + { + try + { + File.Delete(PACDaemon.PAC_FILE); + } + catch (Exception ex) + { + logger.LogUsefulException(ex); + } + } + + SaveConfig(_config); + } + + public void UseOnlinePAC(bool useOnlinePac) + { + _config.useOnlinePac = useOnlinePac; + SaveConfig(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void TouchPACFile() + { + string pacFilename = _pacDaemon.TouchPACFile(); + + PACFileReadyToOpen?.Invoke(this, new PathEventArgs() { Path = pacFilename }); + } + + public void TouchUserRuleFile() + { + string userRuleFilename = _pacDaemon.TouchUserRuleFile(); + + UserRuleFileReadyToOpen?.Invoke(this, new PathEventArgs() { Path = userRuleFilename }); + } + + public void ToggleSecureLocalPac(bool enabled) + { + _config.secureLocalPac = enabled; + SaveConfig(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void ToggleRegeneratePacOnUpdate(bool enabled) + { + _config.regeneratePacOnUpdate = enabled; + SaveConfig(_config); + ConfigChanged?.Invoke(this, new EventArgs()); + } + + #endregion + + #region SIP002 + + public bool AskAddServerBySSURL(string ssURL) + { + var dr = MessageBox.Show(I18N.GetString("Import from URL: {0} ?", ssURL), I18N.GetString("Shadowsocks"), MessageBoxButtons.YesNo); + if (dr == DialogResult.Yes) + { + if (AddServerBySSURL(ssURL)) + { + MessageBox.Show(I18N.GetString("Successfully imported from {0}", ssURL)); + return true; + } + else + { + MessageBox.Show(I18N.GetString("Failed to import. Please check if the link is valid.")); + } + } + return false; + } + + public bool AddServerBySSURL(string ssURL) + { + try + { + if (string.IsNullOrWhiteSpace(ssURL)) + return false; + + var servers = Server.GetServers(ssURL); + if (servers == null || servers.Count == 0) + return false; + + foreach (var server in servers) + { + _config.configs.Add(server); + if (server.warnLegacyUrl) + MessageBox.Show(I18N.GetString("Warning: importing {0} from a legacy ss:// link. Support for legacy ss:// links will be dropped in version 5. Make sure to update your ss:// links.", server.ToString())); + } + _config.index = _config.configs.Count - 1; + SaveConfig(_config); + return true; + } + catch (Exception e) + { + logger.LogUsefulException(e); + return false; + } + } + + public string GetServerURLForCurrentServer() + { + return GetCurrentServer().GetURL(_config.generateLegacyUrl); + } + + #endregion + + #region Misc + + public void ToggleVerboseLogging(bool enabled) + { + _config.isVerboseLogging = enabled; + SaveConfig(_config); + NLogConfig.LoadConfiguration(); // reload nlog + + VerboseLoggingStatusChanged?.Invoke(this, new EventArgs()); + } + + public void ToggleCheckingUpdate(bool enabled) + { + _config.autoCheckUpdate = enabled; + Configuration.Save(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void ToggleCheckingPreRelease(bool enabled) + { + _config.checkPreRelease = enabled; + Configuration.Save(_config); + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void SaveSkippedUpdateVerion(string version) + { + _config.skippedUpdateVersion = version; + Configuration.Save(_config); + } + + public void SaveLogViewerConfig(LogViewerConfig newConfig) + { + _config.logViewer = newConfig; + Configuration.Save(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + public void SaveHotkeyConfig(HotkeyConfig newConfig) + { + _config.hotkey = newConfig; + SaveConfig(_config); + + ConfigChanged?.Invoke(this, new EventArgs()); + } + + #endregion + + #region Strategy + + public void SelectStrategy(string strategyID) + { + _config.index = -1; + _config.strategy = strategyID; + SaveConfig(_config); + } + + public IList GetStrategies() + { + return _strategyManager.GetStrategies(); + } + + public IStrategy GetCurrentStrategy() + { + foreach (var strategy in _strategyManager.GetStrategies()) + { + if (strategy.ID == _config.strategy) + { + return strategy; + } + } + return null; + } + + public void UpdateInboundCounter(object sender, SSTransmitEventArgs args) + { + GetCurrentStrategy()?.UpdateLastRead(args.server); + Interlocked.Add(ref _inboundCounter, args.length); + } + + public void UpdateOutboundCounter(object sender, SSTransmitEventArgs args) + { + GetCurrentStrategy()?.UpdateLastWrite(args.server); + Interlocked.Add(ref _outboundCounter, args.length); + } + + #endregion + + #region SIP003 + + private void StartPlugin() + { + var server = _config.GetCurrentServer(); + GetPluginLocalEndPointIfConfigured(server); + } + + private void StopPlugins() + { + foreach (var serverAndPlugin in _pluginsByServer) + { + serverAndPlugin.Value?.Dispose(); + } + _pluginsByServer.Clear(); + } + + public EndPoint GetPluginLocalEndPointIfConfigured(Server server) + { + var plugin = _pluginsByServer.GetOrAdd( + server, + x => Sip003Plugin.CreateIfConfigured(x, _config.showPluginOutput)); + + if (plugin == null) + { + return null; + } + + try + { + if (plugin.StartIfNeeded()) + { + logger.Info( + $"Started SIP003 plugin for {server.Identifier()} on {plugin.LocalEndPoint} - PID: {plugin.ProcessId}"); + } + } + catch (Exception ex) + { + logger.Error("Failed to start SIP003 plugin: " + ex.Message); + throw; + } + + return plugin.LocalEndPoint; + } + + public void ToggleShowPluginOutput(bool enabled) + { + _config.showPluginOutput = enabled; + SaveConfig(_config); + + ShowPluginOutputChanged?.Invoke(this, new EventArgs()); + } + + #endregion + + #region Traffic Statistics + + private void StartTrafficStatistics(int queueMaxSize) + { + trafficPerSecondQueue = new Queue(); + for (int i = 0; i < queueMaxSize; i++) + { + trafficPerSecondQueue.Enqueue(new TrafficPerSecond()); + } + _trafficThread = new Thread(new ThreadStart(() => TrafficStatistics(queueMaxSize))) + { + IsBackground = true + }; + _trafficThread.Start(); + } + + private void TrafficStatistics(int queueMaxSize) + { + TrafficPerSecond previous, current; + while (true) + { + previous = trafficPerSecondQueue.Last(); + current = new TrafficPerSecond + { + inboundCounter = InboundCounter, + outboundCounter = OutboundCounter + }; + current.inboundIncreasement = current.inboundCounter - previous.inboundCounter; + current.outboundIncreasement = current.outboundCounter - previous.outboundCounter; + + trafficPerSecondQueue.Enqueue(current); + if (trafficPerSecondQueue.Count > queueMaxSize) + trafficPerSecondQueue.Dequeue(); + + TrafficChanged?.Invoke(this, new EventArgs()); + + Thread.Sleep(1000); + } + } + + #endregion + + #region SIP008 + + + public async Task UpdateOnlineConfigInternal(string url) + { + var onlineServer = await OnlineConfigResolver.GetOnline(url); + _config.configs = Configuration.SortByOnlineConfig( + _config.configs + .Where(c => c.group != url) + .Concat(onlineServer) + ); + logger.Info($"updated {onlineServer.Count} server from {url}"); + return onlineServer.Count; + } + + public async Task UpdateOnlineConfig(string url) + { + var selected = GetCurrentServer(); + try + { + int count = await UpdateOnlineConfigInternal(url); + } + catch (Exception e) + { + logger.LogUsefulException(e); + return false; + } + _config.index = _config.configs.IndexOf(selected); + SaveConfig(_config); + return true; + } + + public async Task> UpdateAllOnlineConfig() + { + var selected = GetCurrentServer(); + var failedUrls = new List(); + foreach (var url in _config.onlineConfigSource) + { + try + { + await UpdateOnlineConfigInternal(url); + } + catch (Exception e) + { + logger.LogUsefulException(e); + failedUrls.Add(url); + } + } + + _config.index = _config.configs.IndexOf(selected); + SaveConfig(_config); + return failedUrls; + } + + public void SaveOnlineConfigSource(List sources) + { + _config.onlineConfigSource = sources; + SaveConfig(_config); + } + + public void RemoveOnlineConfig(string url) + { + _config.onlineConfigSource.RemoveAll(v => v == url); + _config.configs = Configuration.SortByOnlineConfig( + _config.configs.Where(c => c.group != url) + ); + SaveConfig(_config); + } + + #endregion + } +} diff --git a/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs b/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs index 9637ab820..c60493e95 100644 --- a/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/BalancingStrategy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using Shadowsocks.Model; diff --git a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs index a2db09748..e89cd449d 100644 --- a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using NLog; diff --git a/shadowsocks-csharp/Controller/Strategy/IStrategy.cs b/shadowsocks-csharp/Controller/Strategy/IStrategy.cs index 1efa5ce43..c72c03953 100644 --- a/shadowsocks-csharp/Controller/Strategy/IStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/IStrategy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using Shadowsocks.Model; diff --git a/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs b/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs index 80093abaf..50df76f83 100644 --- a/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs +++ b/shadowsocks-csharp/Controller/Strategy/StrategyManager.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace Shadowsocks.Controller.Strategy { diff --git a/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs b/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs index 8ff6274c0..3372fbd01 100644 --- a/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs +++ b/shadowsocks-csharp/Controller/System/Hotkeys/HotkeyCallbacks.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Reflection; namespace Shadowsocks.Controller.Hotkeys diff --git a/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs b/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs index 34fcf7c32..3407ef1f9 100644 --- a/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs +++ b/shadowsocks-csharp/Controller/System/Hotkeys/Hotkeys.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; diff --git a/shadowsocks-csharp/Controller/System/ProtocolHandler.cs b/shadowsocks-csharp/Controller/System/ProtocolHandler.cs index 95f1750cd..b0f5f4e1b 100644 --- a/shadowsocks-csharp/Controller/System/ProtocolHandler.cs +++ b/shadowsocks-csharp/Controller/System/ProtocolHandler.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Win32; using NLog; diff --git a/shadowsocks-csharp/Controller/System/SystemProxy.cs b/shadowsocks-csharp/Controller/System/SystemProxy.cs index bd6db750f..d9a021a30 100644 --- a/shadowsocks-csharp/Controller/System/SystemProxy.cs +++ b/shadowsocks-csharp/Controller/System/SystemProxy.cs @@ -1,119 +1,118 @@ -using System; -using System.ComponentModel; -using System.Windows.Forms; -using NLog; -using Shadowsocks.Model; -using Shadowsocks.Util.SystemProxy; - -namespace Shadowsocks.Controller -{ - internal enum SystemProxyMode - { - Disabled, - Global, - Pac, - } - - public static class SystemProxy - { - private static readonly Logger logger = LogManager.GetCurrentClassLogger(); - - internal static SystemProxyMode GetCurrentMode(Configuration config, PACServer pacSrv) - { - if (!config.enabled || !WinINet.Operational) - { - return SystemProxyMode.Disabled; - } - - try - { - WinINetSetting setting = WinINet.Query(); - if (config.global) - { - string expectedServer = $"localhost:{config.localPort}"; - return setting.Flags.HasFlag(InternetPerConnectionFlags.Proxy) && - string.Equals(setting.ProxyServer, expectedServer, StringComparison.OrdinalIgnoreCase) - ? SystemProxyMode.Global - : SystemProxyMode.Disabled; - } - - string expectedPacUrl = config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl) - ? config.pacUrl - : pacSrv?.PacUrl; - - return !string.IsNullOrEmpty(expectedPacUrl) && - setting.Flags.HasFlag(InternetPerConnectionFlags.AutoProxyUrl) && - string.Equals(setting.AutoConfigUrl, expectedPacUrl, StringComparison.OrdinalIgnoreCase) - ? SystemProxyMode.Pac - : SystemProxyMode.Disabled; - } - catch (Win32Exception ex) - { - logger.LogUsefulException(ex); - return SystemProxyMode.Disabled; - } - } - - public static void Update(Configuration config, bool forceDisable, PACServer pacSrv, bool noRetry = false) - { - bool enabled = config.enabled && !forceDisable; - - try - { - if (!WinINet.Operational) - { - throw new InvalidOperationException("WinINet system proxy integration is unavailable."); - } - - if (!enabled) - { - WinINet.Restore(); - return; - } - - if (config.global) - { - WinINet.ProxyGlobal($"localhost:{config.localPort}"); - return; - } - - string pacUrl = config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl) - ? config.pacUrl - : pacSrv?.PacUrl ?? throw new InvalidOperationException("PAC server is not initialized."); - - WinINet.ProxyPAC(pacUrl); - } - catch (Exception ex) when (ex is Win32Exception or InvalidOperationException) - { - logger.LogUsefulException(ex); - if (!noRetry) - { - DialogResult result = MessageBox.Show( - I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), - I18N.GetString("Shadowsocks"), - MessageBoxButtons.YesNo, - MessageBoxIcon.Warning); - if (result == DialogResult.Yes) - { - try - { - WinINet.Reset(); - Update(config, forceDisable, pacSrv, true); - return; - } - catch (Exception retryException) - { - logger.LogUsefulException(retryException); - } - } - } - - MessageBox.Show( - I18N.GetString("Unrecoverable proxy setting error occured, see log for detail"), - I18N.GetString("Shadowsocks"), - MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } - } -} +using System; +using System.ComponentModel; +using System.Windows.Forms; +using NLog; +using Shadowsocks.Model; +using Shadowsocks.Util.SystemProxy; + +namespace Shadowsocks.Controller +{ + internal enum SystemProxyMode + { + Disabled, + Global, + Pac, + } + + public static class SystemProxy + { + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); + + internal static SystemProxyMode GetCurrentMode(Configuration config, PACServer pacSrv) + { + if (!config.enabled || !WinINet.Operational) + { + return SystemProxyMode.Disabled; + } + + try + { + WinINetSetting setting = WinINet.Query(); + if (config.global) + { + string expectedServer = $"localhost:{config.localPort}"; + return setting.Flags.HasFlag(InternetPerConnectionFlags.Proxy) && + string.Equals(setting.ProxyServer, expectedServer, StringComparison.OrdinalIgnoreCase) + ? SystemProxyMode.Global + : SystemProxyMode.Disabled; + } + + string expectedPacUrl = pacSrv?.PacUrl; + + return !string.IsNullOrEmpty(expectedPacUrl) && + setting.Flags.HasFlag(InternetPerConnectionFlags.AutoProxyUrl) && + string.Equals(setting.AutoConfigUrl, expectedPacUrl, StringComparison.OrdinalIgnoreCase) + ? SystemProxyMode.Pac + : SystemProxyMode.Disabled; + } + catch (Win32Exception ex) + { + logger.LogUsefulException(ex); + return SystemProxyMode.Disabled; + } + } + + public static void Update(Configuration config, bool forceDisable, PACServer pacSrv, bool noRetry = false) + { + bool enabled = config.enabled && !forceDisable; + + try + { + if (!WinINet.Operational) + { + throw new InvalidOperationException("WinINet system proxy integration is unavailable."); + } + + if (!enabled) + { + WinINet.Restore(); + return; + } + + if (config.global) + { + WinINet.ProxyGlobal($"localhost:{config.localPort}"); + return; + } + + string pacUrl = pacSrv?.PacUrl ?? throw new InvalidOperationException("PAC server is not initialized."); + + // Both Local PAC and Online PAC are served from localhost. For Online PAC + // this points at the persistent cache maintained by OnlinePacCache, so + // WinINet never needs direct access to the remote PAC URL. + WinINet.ProxyPAC(pacUrl); + } + catch (Exception ex) when (ex is Win32Exception or InvalidOperationException) + { + logger.LogUsefulException(ex); + if (!noRetry) + { + DialogResult result = MessageBox.Show( + I18N.GetString("Error occured when process proxy setting, do you want reset current setting and retry?"), + I18N.GetString("Shadowsocks"), + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + if (result == DialogResult.Yes) + { + try + { + WinINet.Reset(); + Update(config, forceDisable, pacSrv, true); + return; + } + catch (Exception retryException) + { + logger.LogUsefulException(retryException); + } + } + } + + MessageBox.Show( + I18N.GetString("Unrecoverable proxy setting error occured, see log for detail"), + I18N.GetString("Shadowsocks"), + MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } +} diff --git a/shadowsocks-csharp/Data/dlc.dat b/shadowsocks-csharp/Data/dlc.dat deleted file mode 100644 index 6ff4f969f..000000000 --- a/shadowsocks-csharp/Data/dlc.dat +++ /dev/null @@ -1,10782 +0,0 @@ - - -VIU -viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net -< - BITSQUARE bisq.io bisq.network bitsquare.io - -HUOBI -hbabit.com -hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com - - STREPSILS -cepacol.ca cepacol.com dobendan.degraneodin.com.mx -repsils.no strepsils.at strepsils.ch strepsils.cn -cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn -cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.com - -9NEWS 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au -mi9.com.au -mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au -! - -MASTERCARD mastercard.ae mastercard.at mastercard.az mastercard.ba mastercard.be mastercard.bg mastercard.by mastercard.ca mastercard.ch mastercard.cl mastercard.cn -cnmastercard.co.idmastercard.co.ilmastercard.co.inmastercard.co.jpmastercard.co.kemastercard.co.krmastercard.co.nzmastercard.co.thmastercard.co.ukmastercard.co.vemastercard.co.zamastercard.commastercard.com.armastercard.com.aumastercard.com.bhmastercard.com.brmastercard.com.bzmastercard.com.cn -cnmastercard.com.comastercard.com.cymastercard.com.egmastercard.com.gemastercard.com.gtmastercard.com.hkmastercard.com.kwmastercard.com.lbmastercard.com.mxmastercard.com.mymastercard.com.ngmastercard.com.pemastercard.com.phmastercard.com.samastercard.com.sgmastercard.com.trmastercard.com.twmastercard.com.vemastercard.com.vn mastercard.cz mastercard.de mastercard.dk mastercard.es mastercard.eu mastercard.fi mastercard.fr mastercard.gr mastercard.hr mastercard.hu mastercard.iemastercard.inc mastercard.it mastercard.jo mastercard.ke mastercard.kz mastercard.lu mastercard.md mastercard.my mastercard.nl mastercard.no mastercard.om mastercard.pl mastercard.pt mastercard.qa mastercard.ro mastercard.rs mastercard.ru mastercard.se mastercard.si mastercard.sk mastercard.ua mastercard.usareyoucreditwise.comborderlessprepaid.combranchportal.com idservice.incinclusivegrowthscore.com findacard.com mastercad.commastercard-email.commastercardacademy.commastercardadvisors.commastercardcenter.commastercardcenter.org*&mastercardcenterforinclusivegrowth.orgmastercardconnect.commastercardezsavings.commastercardidtheftalerts.commastercardrestaurant.commastercardservices.commastercardworldwide.commasterpassteststore.commasterintelligence.commcpeaceofmind.commyaccountglobalcash.commycardbenefits.comonedinesfree.com paypass.netpieceofplastic.compredictivetechnologies.com priceless.com pricelessmarketingengine.comsbitravelcard.comshoppercentre.com!smartcommunitiescoalition.com!smartcommunitiescoalition.org startpath.comtaptotokyo.comtasteofpremium.jptravelcontroller.comwwwpaypass.combecomeindex.comcashpassport.cacashpassport.co.zacashpassport.comcashpassport.com.brcashpassport.netcorporatecashpassport.comicashpassport.com.mxintercamcashpassport.com.mx!multicurrencycashpassport.comshinhangmc.commastercardbiz.camastercardbiz.com!mastercardbusinessnetwork.com -nab.com.aunabtravellercard.com.au 53world.com53worldsweeps.comlovethiscity.commastercardmoments.compahabicilemezsurprizler.com priceless.compriceless.com.cn -cn priceless.orgpricelessafrica.compricelessarabia.compricelessaruba.compricelessbeijing.cn -cnpricelessbeijing.com#pricelessbeijing.com.cn -cnpricelesshongkong.compricelesshonolulu.compricelesspick.compricelesssantiago.compricelesssydney.compricelesssurprises.compricelesstoronto.capricelesstv.com simplify.comsimplifycommerce.comcashpassportglobe.comgwktravelex.nl travelex.be travelex.bh travelex.catravelex.co.intravelex.co.jptravelex.co.nztravelex.co.uk travelex.comtravelex.com.autravelex.com.cn -cntravelex.com.hktravelex.com.mytravelex.com.omtravelex.com.tr travelex.de travelex.fr travelex.it travelex.qatravelexae.comtravelexch.comtravelexmoneycard.combidvestbank.co.zaworldcurrencycard.co.zanab.demdex.net&"nationalaustraliaban.tt.omtrdc.net -/ -XVIDEOS xvideos.comxvideos-cdn.com - -ZSH zsh.org -? - BONGACAMS bongacams.com -bcicdn.com bcrncdn.com -E -HCAPTCHA botstop.com hcaptcha.comhcaptchastatus.com -! -MIAOPASIxn--i2ru8q2qg.com -| -MEITUAN dianping.com -maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com - -RT -rt.com -+ -WIKIDOT wdfiles.com wikidot.com -f -OOKLA-SPEEDTEST-ADSOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ -ads -D -RUST rust-lang.org  rustup.rs  crates.io docs.rs - -TLD-CNcn citic baidu -unicomsohu -xn--fiqs8s -xn--fiqz9s xn--1qqw23a xn--xhq521b xn--8y0a063a xn--6frz82g -xn--fiq64b xn--estv75g xn--vuq861b xn--zfr164b -) - ADCOLONY-ADS adcolony.com -ads - - BRILLIANT brilliant.org - -EFF eff.org - -STEEMIT steemit.com - - MANMANBUY manmanbuy.com -3 -PPTV  pplive.cn -pplive.com pptv.com - - -SF-EXPRESS  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org -T - MICROSOFT azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn -cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn -cnchinacloudapp.cn -cnchinacloudsites.cn -cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn -cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn -cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com -dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com -cn cn.bing.net -cn ditu.live.com -cnbj1.api.bing.com -cnemoi-cncdn.bing.com -cn atom.io  npmjs.com npm.communitydependabot.com -git.io github.blog -github.comgithub.community  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.comadaptivecards.ioapi-extractor.com -apisof.net appcenter.ms -blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com -jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn -cn#microsoftreactor.com.cn -cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn -cn -sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.netmicrosoftnews.ccmicrosoftnews.cn -cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.comcallersbane.com minecraft.netminecraftshop.com -mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org -xbox360.co xbox360.com -xbox360.eu xbox360.org -xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn -cn xboxlive.com -xboxone.co xboxone.com -xboxone.euxboxplayanywhere.comxboxstudios.com  microsoft azure hotmail -office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com -m12.vc -aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com -binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com -ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com -gears5.com gearspop.comgearstactics.com -gfx.ms -gigjam.com hololens.com -hotmail.co hotmail.com -hotmail.eu hotmail.net hotmail.orghummingbird.ms -ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl -ingads.comintunewiki.comiotinactionevents.com -kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn -cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn -cn -msauth.netmschallenge2018.com -msecnd.net -msedge.net  msft.info msft.net msftauth.cn -cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com -msocdn.com -msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com -office.com -office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net -pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com -pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net -sfx.ms sharepoint.cn -cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com -techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com -userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net -wbd.ms what-fan.netwindows-int.net windows.com windows.net -windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com -winhec.com -winhec.net -yammer.comcdn.office.net -cn(dl.delivery.mp.microsoft.com -cn&download.windowsupdate.com -cn'bg.v4.a.dl.ws.microsoft.com -cn(bg4.v4.a.dl.ws.microsoft.com -cn2&cdn.marketplaceimages.windowsphone.com -cn cn.windowssearch.com -cn#ctldl.windowsupdate.com -cn#developer.microsoft.com -cndocs.microsoft.com -cn"download.microsoft.com -cn/#download.visualstudio.microsoft.com -cnfs.microsoft.com -cn(msgr.dlservice.microsoft.com -cn, msgruser.dlservice.microsoft.com -cn#officecdn.microsoft.com -cn&qh.dlservice.microsoft.com -cnsdx.microsoft.com -cn/#silverlight.dlservice.microsoft.com -cn, slupdate.dlservice.microsoft.com -cn, storeedgefd.dsx.mp.microsoft.com -cn&wl.dlservice.microsoft.com -cn&wscont1.apps.microsoft.com -cn&wscont2.apps.microsoft.com -cnwww.microsoft.com -cn&xb.dlservice.microsoft.com -cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net -n -TWITCH ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net - -MZED mzed.com - - OPENRESTY openresty.org -< -QUIP quip-cdn.com quip.comquipelements.com -6 - RULEOFLAWrolfoundation.orgrolsociety.org -6 -4CHAN 4cdn.org  4chan.org 4channel.org - -CATEGORY-ANTICENSORSHIP ahmia.fi akasha.worldbrowserleaks.combypasscensorship.org citizenlab.cadat.foundationdemocracy.earth eff.orgepicbrowser.com ffprofile.comfreenetproject.org fteproxy.org  gfw.press -gfw.report greatfire.orgguardianproject.infohaveibeenpwned.compwnedpasswords.com -geti2p.net ipfs.io  jitsi.orggetlantern.org -lantern.io  ntc.partyonionshare.org ooni.org openvpn.netprivacytools.io psiphon3.comshadowsocks.org softether.orgsoftether-download.com stunnel.org telex.cctorproject.org tribler.org tunsafe.comtwister.net.co -uproxy.org  v2ray.com -v2ray.cool  v2fly.org vuvuzela.io -whonix.org wikileaks.org wireguard.com -zeronet.io -z -LINE -lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net -nhncorp.jp - -PAXFUL -paxful.com - -RFI -rfi.fr - -1PONDO  1pondo.tv -% -36KR 36kr.com 36krcdn.com - -HK01 hk01.com - -PRESS  press.vin -H - ZYNGA-ADS zynga.com -ads#zyngaplayersupport.com -ads -. - -AMAZON-ADS amazon-adsystem.com -ads -% - BAIDU-ADS a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -ads -e -METART -metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net - -IQIYI 71.am  iqiyi.com iqiyipic.com -pps.tv -ppsimg.com qiyi.com qiyipic.com -qy.net -71edge.coma.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -ads -9 -NIKKEI -nikkei.com  nikkei.jp nikkei.co.jp - -OPENAI -openai.com - - CATEGORY-ADS apilog-web.acfun.cn -ads adcolony.com -ads -adjust.com -ads a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -ads amazon-adsystem.com -adsiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -ads applovin.com -ads -applvn.com -ads atom-data.io -adsanalytics-data.io -ads ironbeast.io -ads a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -adsmcs.snssdk.com -adsx.clearbitjs.com -ads bluekai.com -adsfout.jp -ads gmossp-sp.jp -adsi-mobile.co.jp -ads im-apps.net -ads impact-ad.jp -ads ladsp.com -ads microad.co.jp -ads -microad.jp -ads socdm.com -ads emogi.com -adsdata.flurry.com -ads2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -ads!assets.growingio.com -adsmlog.hiido.com -adsylog.hiido.com -adsstatic.hotjar.com -adsclick.hunantv.com -adsda.hunantv.com -ads da.mgtv.com -adslog.hunantv.com -adslog.v2.hunantv.com -adsres.hunantv.com -adsv2.log.hunantv.com -adsinner-active.mobi -adsa.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -adsads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads log-sdk.gifshow.com -adswlog.kuaishou.com -ads leanplum.com -ads#api.game.letvstore.com -ads ark.letv.com -ads dc.letv.com -adsdev.dc.letv.com -ads fz.letv.com -ads g3.letv.com -adsletv.allyes.com -adsminisite.letv.com -adsmsg.m.letv.com -adsn.mark.letv.com -adsplog.dc.letv.com -adspro.hoye.letv.com -ads pro.letv.com -ads stat.letv.com -ads"static.app.m.letv.com -ads decide.mixpanel.com -ads mopub.com -adsevt.mxplay.com -adsanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads"js-agent.newrelic.com -ads ogury.com -ads -presage.io -adsogury.co -ads onesignal.com -adsOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ -ads cdn.pocoiq.cn -ads oct.pocoiq.cn -adsads.pubmatic.com -adscdn.segment.com -ads"static.sensorsdata.cn -ads 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -adsadnet.sohu.com -ads ads.sohu.com -ads!adv-sv-show.focus.cn -ads aty.sohu.com -adsdata.vod.itc.cn -adsepro.sogou.com -ads go.sohu.com -adsgolden1.sogou.com -adsimp.optaim.com -adsinte.sogou.com -adsinte.sogoucdn.com -adslu.sogoucdn.com -ads pv.sohu.com -adstheta.sogoucdn.com -adstrack.sohu.com -adsuranus.sogou.com -adsv2.reachmax.cn -ads)e8aeb8bbdbbd7.cdn.sohucs.com -ads)643108e7617ef.cdn.sohucs.com -adssupersonic.com -adssupersonicads.com -ads -ssacdn.com -ads)supersonicads-a.akamaihd.net -ads g1.tagtic.cn -adsxy-log.tagtic.cn -adsssp.api.tappx.com -ads ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads uberads.com -adsalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads!unityads.unity3d.com -ads#unityads.unitychina.cn -ads ads.wteam.xyz -ads#collector.xhamster.com -adsad.intl.xiaomi.com -ads ad.mi.com -ads ad.xiaomi.com -adsadmob.xiaomi.com -adsad1.xiaomi.com -adsmistat.xiaomi.com -adstracking.miui.com -adsadv.sec.miui.com -ads"adv.sec.intl.miui.com -ads"misc.in.duokanbox.com -ads ad.hpplay.cn -adsadeng.hpplay.cn -ads atianqi.com -ads kuyun.com -ads umeng.com -ads ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -adsactives.youku.com -ads ad.api.3g.youku.com -ads$ad.api.mobile.youku.com -ads ad.mobile.youku.com -ads(a-dxk.play.api.3g.youku.com -ads atm.youku.com -ads#b.smartvideo.youku.com -adsc.yes.youku.com -adsdas.api.youku.com -ads!das.mobile.youku.com -ads!dev-push.m.youku.com -adsdl.g.youku.com -adsdmapp.youku.com -adse.stat.ykimg.com -ads#gamex.mobile.youku.com -ads!guanggaoad.youku.com -ads hudong.pl.youku.com -ads!huodong.pl.youku.com -ads"huodong.vip.youku.com -ads hz.youku.com -adsiyes.youku.com -ads l.ykimg.com -adslstat.youku.com -ads mobilemsg.youku.com -ads msg.youku.com -adsmyes.youku.com -ads p.l.youku.com -ads pl.youku.com -ads#passport-log.youku.com -adsp-log.ykimg.com -adspush.m.youku.com -ads r.l.youku.com -ads s.p.youku.com -adssdk.m.youku.com -adsstat.youku.com -ads$statis.api.3g.youku.com -ads&store.tv.api.3g.youku.com -ads&store.xl.api.3g.youku.com -adstdrec.youku.com -adstest.ott.youku.com -ads!test.sdk.m.youku.com -ads v.l.youku.com -adsval.api.youku.com -ads wan.youku.com -adsykatr.youku.com -adsykrec.youku.com -ads cvnad.com -ads -iyoowi.com -ads zynga.com -ads#zyngaplayersupport.com -ads 51y5.net a.adtng.com -aaxads.com -ad-srv.netad.api.moji.comad.wang502.com adbutter.netads.trafficjunky.net adtechus.comcfts1tifqr.comcontentabc.comimg-bss.csdn.net imglnkc.com imglnkd.comja2.gamersky.com jl3.yjaxa.topkepler-37b.com -lqc006.coms4yxaqyq95.comshhs-ydd8x2.yjrmss.cnstatic.javhd.comtrafficfactory.biz adx.36kr.comclick.ali213.netpbmp.ali213.net^pinggai\d\.caixin\.com$adq.chinaso.comstat.chinaso.com toboads.comdn-growing.qbox.me ad.unimhk.comdas-rpt-log.ucloud.cn adxprtz.com exoclick.com -exosrv.comcdn.advertserve.comcdn.banclip.comcdn.tsyndicate.com - - CHINAUNICOM  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cn - -D100 d100.net - -RTINGS -rtings.com - -FARFETCHfarfetch-apps.comfarfetch-contents.com farfetch.cn -cn farfetch.comfarfetch.com.cn -cn farfetch.netfarfetch.net.cn -cn  fflnk.net - -NICONICOnico -nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp -% -RTHK etvonline.hk rthk.hk -+ -VAPTCHA vaptcha.com vaptcha.net - -ERJI erji.net - -HEROKU  heroku.co -heroku.com  heroku.me herokuapp.com herokucdn.comherokucharge.com herokussl.comheroku-app.comheroku-charge.com codei.sh -codeish.co -codeish.io - -MINISOloveminiso.com.br miniso-au.com miniso-bh.com miniso-np.com miniso-nz.com  miniso.by  miniso.ca miniso.cn -cn  miniso.co miniso.co.id miniso.co.tz -miniso.com miniso.com.es miniso.com.gr miniso.com.mx miniso.com.pl miniso.com.py miniso.com.tr  miniso.ge  miniso.ie  miniso.jp  miniso.ma  miniso.my  miniso.pe  miniso.pk  miniso.ua  miniso.uz minisohome.cn -cnminisoindia.comminisojordan.comminisokorea.comminisolife.co.zaminisothailand.comminisovietam.vn minsio.cn -cn myminiso.com -d - JUSTMYSOCKSjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net - -XINGRZ  xingrz.me -& -XNXX xnxx.com xnxx-cdn.com - -BOC -boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cn -6 -CATEGORY-COLLABORATE-CN shimo.im  yuque.com - -DINGTALK ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.to -W -MOJANGcallersbane.com minecraft.netminecraftshop.com -mojang.com - -SPOTIFY byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com - -BEATS100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com -aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com -airmay.com -ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com -beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn -cn  beats1.tv beats1.com.cn -cn beats123.com beats2.com.cn -cn beats4.cn -cn -beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com -beatsep.cn -cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com -biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net -bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com -cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com -dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com -lyzsxx.com mairbeats.com -makeeu.commallheadphone.commbeats-tech.commbheadphone.com -micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com -ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com -scnshop.cc -shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com -theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net -unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.net - - CANONICAL launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io -ubuntu.com -ubuntu.netubuntuforums.org canonical.com - -GOLANG go-lang.com go-lang.net go-lang.org -go.dev  godoc.org -golang.com -golang.net -golang.org - -REDTUBE redtube.com -F -SOGOU -go2map.com sogo.com  sogou.com sogoucdn.com -. -XDAxda-developers.com xda-cdn.com - -ATYPI  atypi.org - -BEEG beeg.com - - -ONIONSHAREonionshare.org -i -RAZER  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com - - SPEEDTEST  cdnst.net cellmaps.com ekahau.cloud -ekahau.com  ookla.comooklaserver.net pingtest.net speedtest.co speedtest.netspeedtestcustom.com webtest.netOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ -ads -* -DUOWAN -duowan.com dwstatic.com - -NETFLIX fast.com -netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net -nflxso.net nflxvideo.net -. - POCKETCASTS -pca.stpocketcasts.com - -OONI ooni.org -: - SOFTETHER softether.orgsoftether-download.com - -YUEWEN -yuewen.com hongxiu.com lrts.me qdmm.com -qidian.com readnovel.com tingbook.com webnovel.com -xs8.cn xxsy.net -$ -AFP afp.com afpforum.com - -BESTBUY bby.combbycastatic.ca bbycloud.combbycontent.combbycontent.net bbyintl.com bbystatic.com  bbyurl.us bestbhy.combestbuy-audio.com"bestbuy-communityrelations.combestbuy-giftcard.infobestbuy-int.combestbuy-jobs.com -bestbuy.ca -bestbuy.cn -cn bestbuy.combestbuy.com.cn -cnbestbuy.com.mx bestbuy.infobestbuy24x7solutions.combestbuybusiness.com'#bestbuybusinessadvantageaccount.combestbuycanada.cabestbuycanada.combestbuycanadaltd.cabestbuycharityclassic.combestbuycoffeemakers.combestbuyethics.combestbuyforbusiness.cabestbuygsm.combestbuyideax.com!bestbuyphotoworkshoptours.combestbuyrewards.combestbuyrewardzone.ca bestbuys.combestbuysgeeksquad.combestbuysolutions.netbestbuystores.combestbuytradein.com bestbuyus.com besztbuy.com bextbuy.combienvenuechezbestbuy.ca cowboom.com futureshop.cainitproducts.commagnoliaav.com.cn -cn mybestbuy.commybestbuyclaims.commyrewardzone.com myrz.compacifickitchenandhome.comtiendabestbuy.comunbrandedproducts.comwelcometobestbuy.cawolfatbestbuy.comwolfatbestbuy.netwww-bestbuystores.comgeek-squad-support.comgeek-squad.netgeek-squad.orggeek-squads.net geeksquad.ca geeksquad.cc geeksquad.com geeksquad.net geeksquad.tvgeeksquadcares.comgeeksquadcentral.comgeeksquadforums.comgeeksquadonline.comgeeksquadprotectionplan.orggeeksquadservices.orggeeksquadwebroot.org gscanada.info -gsccdn.com  gslink.usonlinegeeksquad.comrocketfishproducts.com dealtree.orgtechliquidators.com -( -CHINAZ -chinaz.com -chinaz.net - -NTC  ntc.party - - SITEPOINT sitepoint.com - - STACKEXCHANGE askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.com - -VUVUZELA vuvuzela.io - - YUNFANJIASU yfcache.com -yfcalc.com yfcloud.com  yfdts.net  yfp2p.net -yfscdn.net yunfancdn.com -" - ACCUWEATHERaccuweather.com - -FTEPROXY fteproxy.org -( -IMGUR  imgur.com imgurinc.com -@ -HAVEIBEENPWNEDhaveibeenpwned.compwnedpasswords.com -Q -NEWSMAXandysparis.com newsmax.com -newsmax.in newsmaxtv.com - -TELEX telex.cc - -WEBEX webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn -cn webex.com.hk webex.com.mx webex.de webex.es webex.fr -y -FONTSHOP fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com -, -GANJI  ganji.comganjistatic1.com -D - -LIVEJASMINlivejasmin.com dditsadn.com dditscdn.com -( -TAPTAP -tapimg.com -taptap.com -; -WJX -sojump.com -wjx.cn wjx.com wjx.top -. -CHINADIGITALTIMESchinadigitaltimes.net -+ -FLATPAK flathub.org flatpak.org - - KINDGIRLS kindgirls.com -8 - HOMEDEPOThomedepot-static.com homedepot.com -2 -ZOOM zoom.com zoom.com.cn zoom.us - - -CHATURBATEchaturbate.com -. -KUAIKAN kkmh.comkuaikanmanhua.com -m -SUNING cnsuning.com -suning.comsuningcloud.comsuningestate.comsuningholdings.com - - BYTEDANCE -bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.com -douyin.com huaxiong.comjokecommunity.comneihanshequ.com -pstatp.com -snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com -wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com -ixigua.com ixgvideo.com  365yg.com - -HACPAI -hacpai.com -3 -QUORA  quora.com quoracdn.net qr.ae -V - JETBRAINS jetbrains.com jetbrains.net datalore.iokotlinlang.org - -MORTEIN -mortein.cn -cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.com - -VILAVPN vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz - -WARROOM warroom.org -% - -CHINAPOWERchinapower.csis.org -# - EMOGI-ADS emogi.com -ads -~ -GITLAB -gitlab.com  gitlab.io -gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com - -WWE wwe.com wwe9.com -$ - APPLEINSIDERappleinsider.com - -QIHOO360 75.team -75team.com baomitu.com -360.cn 360.com -360-jr.com 360chou.com360daikuan.com360huzhubao.com -360jie.com360jinrong.net -360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com -haosou.com haosou.com.cn -haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com -qihuapi.cn qihucdn.com  qihoo.com qikucdn.com -so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com -youhua.com  yunpan.cn - -VANISHo2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn -cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au - -NETEASE 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com -163yun.com 166.net -haowu.linkicourse163.org  kaola.com -lofter.com  nease.netnetease-inc.com netease.com -netease.im -qiyukf.com ydstatic.com yeah.net -youdao.comanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads -. -OP op.ggopgg-static.akamaized.net - - -SHUZIYIMINshuziyimin.org - - LARACASTS laracasts.com - -QUANTIL quantil.com - -CBScbs showtime cbs.comcbscorporation.com cbsi.com -cbsi.video -cbsiam.com  cbsig.net -cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com -viacbs.com -viacom.com viacomcbs.comviacomcbspressexpress.com paramount.com -+ -COWLEVEL cowlevel.net  cdncl.net -x -FASTLY -fastly.com -fastly.netfastlylabs.com fastlylb.netfastly-terrarium.com -zencdn.net - -VOLVO volvodynafleetonline.comescandinavia-arg.comindependentoperatorcn.com road-crew.com udfs.com vfsco.at vfsco.be vfsco.bg vfsco.ca vfsco.ch vfsco.cl vfsco.co.uk vfsco.co.za  vfsco.com vfsco.com.au vfsco.com.br vfsco.com.cn -cn vfsco.com.tr vfsco.cz vfsco.de vfsco.dk vfsco.ee vfsco.es vfsco.fi vfsco.fr vfsco.hu vfsco.ie vfsco.in vfsco.it vfsco.jp vfsco.kr vfsco.lt vfsco.lv vfsco.mx vfsco.nl vfsco.no vfsco.pe vfsco.pl vfsco.ro vfsco.ru vfsco.se vfsco.sk vfsco.us vgcareers.netvolvo-truck.nl volvo.cavolvo.cn -cn  volvo.com volvo.com.cn -cn volvo.sevolvobrandshop.com volvobuses.at volvobuses.be volvobuses.ca volvobuses.ch volvobuses.covolvobuses.co.nzvolvobuses.co.ukvolvobuses.co.zavolvobuses.comvolvobuses.com.arvolvobuses.com.auvolvobuses.com.brvolvobuses.com.kwvolvobuses.com.ptvolvobuses.com.tw volvobuses.de volvobuses.dk volvobuses.es volvobuses.fi volvobuses.fr volvobuses.hk volvobuses.hu volvobuses.in volvobuses.it volvobuses.jo volvobuses.kr volvobuses.ma volvobuses.mx volvobuses.my volvobuses.no volvobuses.om volvobuses.ph volvobuses.pk volvobuses.pl volvobuses.ru volvobuses.se volvobuses.sg volvobuses.tn volvobuses.us volvoce.comvolvodefense.com volvogroup.be volvogroup.cn -cnvolvogroup.comvolvogroup.com.brvolvogroup.com.cn -cn volvogroup.de volvogroup.fr volvogroup.jp volvogroup.kr volvogroup.mx volvogroup.nl volvogroup.pe volvogroup.pl volvogroup.ru volvogroup.sevolvogrouptruckcenter.nlvolvomerchandise.comvolvopenta.comvolvopenta.com.br volvopenta.de volvopenta.es volvopenta.fr volvopenta.it volvopenta.nl volvopenta.se volvopenta.usvolvosaatio.fivolvospares.comvolvotrucks.aevolvotrucks.alvolvotrucks.amvolvotrucks.atvolvotrucks.azvolvotrucks.bavolvotrucks.bevolvotrucks.bgvolvotrucks.byvolvotrucks.chvolvotrucks.clvolvotrucks.co.aovolvotrucks.co.bwvolvotrucks.co.ilvolvotrucks.co.mzvolvotrucks.co.navolvotrucks.co.ukvolvotrucks.co.nzvolvotrucks.co.zavolvotrucks.co.zmvolvotrucks.co.zwvolvotrucks.comvolvotrucks.com.arvolvotrucks.com.auvolvotrucks.com.bnvolvotrucks.com.brvolvotrucks.com.cn -cnvolvotrucks.com.covolvotrucks.com.kwvolvotrucks.com.ptvolvotrucks.com.trvolvotrucks.com.twvolvotrucks.com.uavolvotrucks.czvolvotrucks.devolvotrucks.dkvolvotrucks.eevolvotrucks.esvolvotrucks.fivolvotrucks.frvolvotrucks.gevolvotrucks.grvolvotrucks.hkvolvotrucks.hrvolvotrucks.huvolvotrucks.idvolvotrucks.involvotrucks.itvolvotrucks.jpvolvotrucks.kgvolvotrucks.krvolvotrucks.kzvolvotrucks.ltvolvotrucks.lvvolvotrucks.mavolvotrucks.mdvolvotrucks.mkvolvotrucks.mnvolvotrucks.myvolvotrucks.netvolvotrucks.nlvolvotrucks.novolvotrucks.pevolvotrucks.phvolvotrucks.pkvolvotrucks.plvolvotrucks.psvolvotrucks.qavolvotrucks.rovolvotrucks.rsvolvotrucks.ruvolvotrucks.sevolvotrucks.sgvolvotrucks.sivolvotrucks.skvolvotrucks.tmvolvotrucks.tnvolvotrucks.uyvolvotruckcenter.bevolvotruckcenter.dkvolvotruckcenter.esvolvotruckcenter.fivolvotruckcenter.itvolvotruckcenter.krvolvotruckcenter.kzvolvotruckcenter.nlvolvotruckcenter.novolvotruckcenter.sevolvotruckrental.beudtrucksmeena.com - -JITSI  jitsi.org - -REURL reurl.cc - - THEGUARDIAN theguardiandev-guardianapis.comdev-theguardian.com -gu-web.netguardianapis.comguardianapps.co.uk -guim.co.uktheguardian.comtheguardiandns.com -X -FACEBOOKaccountkit.comatscaleconference.com botorch.org -buck.build buckbuild.comcomponentkit.org draftjs.org -f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com -fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com -ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com -nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com -oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org -atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com -facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com -faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com -fb.careers -fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com -fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com -fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net -freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com -groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com -redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net -S -PORNHUB -phncdn.com phprcdn.com pornhub.compornhubpremium.com - -NIXOS  nixos.org -E -PIXIV  pixiv.net  pixiv.org pixiv.co.jp  pximg.net - -WEBFLOW webflow.com -* -PAGECDN pagecdn.com -pagecdn.io -. -SCALAscala-lang.org scala-sbt.org -# -V8 -v8.dev v8project.org - -GIT git-scm.com -/ -ALIBABA alibaba -alipay -taobao tmall a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com -alicdn.com alidayu.com -alidns.comaliyun-inc.comaliyun-iot-share.com -aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.to -ele.me elemecdn.com eleme.cnteambition.comteambition.netteambitionapis.com mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com -uyunad.comwhalecloud.comalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads 25pp.com  56che.com  95095.com 9game.cn -aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk -aliimg.com -alikmd.com alimama.com alimebot.com -alimei.com alios.cn -alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com -aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn -asczwa.comasczxcefsv.com -asmlink.cn atatech.org -b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com -dfkhgj.com doctoryou.ai doctoryou.cn dongting.com -dratio.com emas-poc.com -gongyi.xin ialicdn.com iconfont.cn -ics.design -jhgtgb.com -kanbox.com -lazada.comliangxinyao.com m-now.cn -maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com -zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com -hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com -mashort.cn pailitao.com -taobao.com -taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn -feizhu.com -fliggy.com  fliggy.hk -iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net -+ -BOSLIFE boslife.biz boslife.net - -EPOCHMEDIAGROUP dajiyuan.com dajiyuan.euepochmediagroup.comepochstories.com epochtime.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimestr.com epochweek.comepochweekly.com erabaru.netlagranepoca.com ntd.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz -" - ALPINELINUXalpinelinux.org -i -ARCHIVEOFOUROWN ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net - -AVSFORUM avsforum.com - -LUA lua.org - -PHP php.net - -WHOLEFOODSMARKETwholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.org - -AOMEDIA aomedia.org -# -DCARD dcard.io dcard.tw - -LITV litv.tv - -BITBANK -bitbank.cc -2 - GROWINGIO-ADS!assets.growingio.com -ads - -VISA visa.be visa.ca visa.clvisa.cn -cn -visa.co.ao -visa.co.cr -visa.co.id -visa.co.il -visa.co.in -visa.co.jp -visa.co.ke -visa.co.ni -visa.co.nz -visa.co.th -visa.co.uk -visa.co.ve -visa.co.za visa.com visa.com.ag visa.com.ai visa.com.ar visa.com.au visa.com.az visa.com.bo visa.com.br visa.com.bs visa.com.bz visa.com.cn -cn visa.com.co visa.com.cy visa.com.dm visa.com.do visa.com.ec visa.com.ge visa.com.gt visa.com.gy visa.com.hk visa.com.hn visa.com.hr visa.com.jm visa.com.kh visa.com.kn visa.com.kz visa.com.lc visa.com.lk visa.com.ms visa.com.mx visa.com.my visa.com.ng visa.com.pa visa.com.pe visa.com.ph visa.com.pr visa.com.py visa.com.ru visa.com.sg visa.com.sv visa.com.tr visa.com.tt visa.com.tw visa.com.ua visa.com.uy visa.com.vc visa.com.vi visa.com.vn visa.cz visa.de visa.dk visa.es visa.fi visa.fr visa.gd visa.gp visa.gr visa.hk visa.hu visa.ie visa.is visa.ky visa.lt visa.lv visa.mn visa.mq visa.nl visa.no visa.pl visa.pt visa.ro visa.se visa.sk visa.so visa.sx visa.tc -visabg.com visaeurope.at visaeurope.ch visaeurope.lu visaeurope.sivisaitalia.com visakorea.comvisamiddleeast.comvisasoutheasteurope.comfinlitsummit.orgmyvisaluxuryhotels.comvisainfinite.cavisainfiniteluxuryhotels.ca!visaluxuryhotelcollection.com$ visaluxuryhotelcollection.com.br$ visaluxuryhotelcollection.com.mxvisaluxuryhotels.comvisaluxuryhotels.com.arvisasignaturehotels.com($connaissancesfinancierespratiques.ca dnsvisa.comeubluecardvisa.comfinancialsoccer.ca"financialsoccer.com.cn -cnlightbridge.commiamifintechfestival.commhshosting.compracticalbusinessskills.compracticalmoneyskills.ca#practicalmoneyskills.cn -cn'practicalmoneyskills.com.cn -cnpracticalmoneyskills.jpsoccerfinancier.catorcidadeouro.com vaultify.com vaultify.info vaultify.net visa-atm.com visa-news.jp visabank.orgvisabusinessinsights.comvisacarddesignlab.com visacards.comvisacheckout.netvisacheckout.orgvisaconciergelac.comvisadigital.comvisadigitalconcierge.com visadns.comvisadpsonline.usvisaeverywhereshop.comvisafintechfasttrack.comvisafulfillment.comvisagiftcard.usvisaglobalfinance.comvisaicsdirect.comvisainfinite.cavisainfinite.cn -cn visanet.net -visapay.cn -cnvisapcsdirect.comvisaplatinum.cn -cnvisaplatinum.com.cn -cn visaplus.comvisasavingsedge.cavisasignature.co.kr visb.org -* -DANGDANG dangdang.com ddimg.cn - - ZEROHEDGE zerohedge.com -+ - TAPPX-ADSssp.api.tappx.com -ads - -AIRWICK -airwick.at -airwick.be -airwick.ca -airwick.ch -airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn -cnairwick.com.mxairwick.com.tr -airwick.cz -airwick.de -airwick.dk -airwick.es -airwick.fi -airwick.fr -airwick.hr -airwick.hu -airwick.ie -airwick.it -airwick.jp airwick.net -airwick.nl -airwick.no -airwick.pl -airwick.pt -airwick.ro -airwick.ru -airwick.se -airwick.si -airwick.sk -airwick.tv -airwick.usairwickarabia.com vipoo.es - -DIDI didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com - -EVERNOTE evernote.com - -ATOM atom.io - - CORDCLOUD cordcloud.org - -DISCORD -discord.co discord.com -discord.gg discord.gift discord.gifts discord.media discord.newdiscordapp.comdiscordapp.net -/ -FASTLANE fastlane.cifastlane.tools - -NVIDIA -geforce.cn -cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn -cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn -cn nvidia.co.jp nvidia.co.kr -nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.com - -OPENSSL openssl.org - -RENZHE renzhe.cloud -* -SCIENTIFICLINUXscientificlinux.org -9 - SQUIRRELVPNsquirrelvpn.comsquirrelgroup.net - - WIREGUARD wireguard.com - -CEX -cex.io - -CUTTLY cutt.ly -J -HUPUhoopchina.com.cn hupu.com hupucdn.com  shihuo.cn -- -ASUS asus.com asus.com.cn -cn - -FIGMA  figma.com - -RUANMEI 6655.com cooldock.com -ithome.com lapin365.com ruanmei.com -saayaa.com win7china.com win8china.com -) -OSCHINA  gitee.com oschina.net -+ -RUBY ruby-lang.org rubygems.org - -DNSPOD dns.pub  dnsapi.cn  dnspod.cn -dnspod.com dnspod.com.cn -dnspod.net -dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub -" -KODI kodi.tv  kodi.wiki -r - LAUNCHPAD launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org - -PIGAV  pigav.com -: -BBCbbc  bbc.co.uk bbc.com -bbci.co.uk - -CNcn citic baidu -unicomsohu -xn--fiqs8s -xn--fiqz9s xn--1qqw23a xn--xhq521b xn--8y0a063a xn--6frz82g -xn--fiq64b xn--estv75g xn--vuq861b xn--zfr164b -42r.cn -5566ua.com aurorapush.cn -e0n.cn japps.cn jchat.io -jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com -jsurvey.cn  jvoice.cn -kc9.cn -n0q.cn pushcfg.com -s0n.cn mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com -uyunad.comwhalecloud.comalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads bootcss.com -bootcdn.cnphpcomposer.com -maoyun.commaoyuncloud.cnmaoyuncloud.comstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com  qnssl.com  ucloud.cn ufileos.com  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com  8686c.comchinanetcenter.com -wangsu.com ourdvsss.com yfcache.com -yfcalc.com yfcloud.com  yfdts.net  yfp2p.net -yfscdn.net yunfancdn.com -boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.comicbc icbc-ltd.com icbc-us.com icbc.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com  whccb.com cebbank.com ceblease.com -eb-ind.com ebasset.com ebchina.comebchinaintl.com -ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.comdanjuanfunds.com -xueqiu.com -58.com  58.com.cn 5858.com  58che.com 58xueche.com -anjuke.comanjukestatic.com chinahr.com -daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn -skysea.com  suanya.cn -suanya.com -tieyou.com -toptown.cn toursbms.com trip.com tripcdn.com -vipdlt.com dangdang.com ddimg.cn -ele.me elemecdn.com eleme.cn  ganji.comganjistatic1.com3.cn  300hu.com -360buy.com 360buyimg.com -360top.com -7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn -dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com -jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com -jd-app.com  jd-ex.com jd.cn jd.co.th -jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com -jingxi.com -jkcsjd.com -joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn -paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com -vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads lianjia.com  ljcdn.com manmanbuy.com dianping.com -maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com mogu.com mogucdn.com mogujie.com -pddpic.com pinduoduo.com yangkeduo.com  smzdm.com -zdmimg.com cnsuning.com -suning.comsuningcloud.comsuningestate.comsuningholdings.com 40017.cn -17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com -ly.com  vancl.com vanclimg.com  vcimg.com -youzan.com yzcdn.cn youzanyun.com -ziroom.comziroomapartment.com 3dmgame.com 3304399.net 4399.com 4399api.com 4399dmw.com -4399er.com4399youpai.com 5054399.com img4399.com acfun.cn aixifan.com apilog-web.acfun.cn -ads -acplay.netdandanplay.com -ali213.net -acg.tv acgvideo.com -b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com -mincdn.com$ upos-hz-mirrorakam.akamaized.net biji.com -ddmogo.com -igetget.cn igetget.com luojilab.com  mogoo.com -sao.cn saolife.com dmzj.com  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com gamersky.com -gcores.com gitv.cn gitv.tv huya.com msstatic.com 71.am  iqiyi.com iqiyipic.com -pps.tv -ppsimg.com qiyi.com qiyipic.com -qy.net -71edge.coma.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -ads  jjwxc.net ku6.com -ku6cdn.com -ku6img.com kkmh.comkuaikanmanhua.com gifshow.com ksapisrv.com kuaishou.com -yximgs.com log-sdk.gifshow.com -adswlog.kuaishou.com -ads  kgimg.com  kugou.com -le.com lecloud.com -lemall.com letv.com letvcdn.com letvimg.com miaopai.com -mihoyo.com bh3.com  pplive.cn -pplive.com pptv.com qingting.fm  sfacg.com -61.com -taomee.com -tapimg.com -taptap.com  tgbus.com tiancity.comtiancitycdn.com u17.com u17i.com u17t.com -vgtime.com ximalaya.com  xmcdn.com -kumiao.com  youku.com  ykimg.com -mmstat.com soku.com -cibntv.net -duowan.com dwstatic.com -yy.com yystatic.com -heytea.com chiphell.com -douban.com  douban.fm doubanio.com erji.net -hacpai.com -nga.cn 178.com -ngabbs.com ngacn.cc saraba1st.com  zhihu.com  zhimg.com  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org 36kr.com 36krcdn.com  dgtle.comhoopchina.com.cn hupu.com hupucdn.com  shihuo.cn coolbuy.com  ifanr.com ifanr.inifanrusercontent.com -ifanrx.com -minapp.com -caixin.com cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn -cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn -cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn -ipanda.com ipanda.com.cn -ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn chinanews.comchinanews.com.cn -cns.com.cn ecns.cn geekpark.net jiemian.comjiemian.com.cn -lancdn.comlandiannews.com  wsoso.com  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com 6655.com cooldock.com -ithome.com lapin365.com ruanmei.com -saayaa.com win7china.com win8china.com sohu.com -sohucs.com -itc.cn solidot.org  sspai.com tmtpost.com chaindd.com -72whys.com checkzeit.com -tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com feng.com fengimg.com wfdata.club ynet.cn ynet.com ynet.com.cnhainanairlines.com hnacargo.com  hnair.com 10044.cnsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com -csdl.ac.cn  las.ac.cn  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn 115.com 3type.cn 4paradigm.com  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn -afdian.net afdiancdn.com agora.io -agoraio.cn agoralab.co -antutu.com bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com shimo.im  yuque.com chinaso.com -pg0.cn -chinaz.com -chinaz.net caiyunai.com caiyunapp.com coolapk.comcoolapkmarket.comcoolapkmarket.net c-t.workcowtransfer.com geetest.com#geetest.datasink.sensorsdata.cn hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cnfoundertype.com ipip.net jianshu.com -jianshu.io jinshuju.netjinshujucdn.com gotokeep.com keepcdn.com  lagou.com lgstatic.com baidupan.com -lanzou.com lanzous.com woozooo.com -liepin.com -lietou.comlietou-static.com mafengwo.cn mafengwo.com mafengwo.net  meitu.com meitudata.com moji.com mojichina.com  polyv.net videocc.net -renren.comrenren-inc.com vaptcha.com vaptcha.net wamawama.com -wiwide.com -sojump.com -wjx.cn wjx.com wjx.top zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cnchinesemooc.org -cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com cnki.net  apabi.comcnthinkers.com  cqvip.comhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn  guokr.comwanfangdata.com.cn speiyou.com -xesimg.com xueersi.com banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com zhihuishu.com  coding.me -coding.net csdn.net -csdnimg.cn  deepin.cn -deepin.com  deepin.io -deepin.org  gitee.comjinrishici.com  juejin.imb-gold-cdn.xitu.iomirror-gold-cdn.xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com oschina.netruby-china.orgrubyconfchina.org mysxl.cn -sxl.cn  sxlcdn.cnsegmentfault.com  sifou.com -tipdim.org alibaba -alipay -taobao tmall a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com -alicdn.com alidayu.com -alidns.comaliyun-inc.comaliyun-iot-share.com -aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.toteambition.comteambition.netteambitionapis.com 25pp.com  56che.com  95095.com 9game.cn -aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk -aliimg.com -alikmd.com alimama.com alimebot.com -alimei.com alios.cn -alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com -aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn -asczwa.comasczxcefsv.com -asmlink.cn atatech.org -b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com -dfkhgj.com doctoryou.ai doctoryou.cn dongting.com -dratio.com emas-poc.com -gongyi.xin ialicdn.com iconfont.cn -ics.design -jhgtgb.com -kanbox.com -lazada.comliangxinyao.com m-now.cn -maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com -zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com -hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com -mashort.cn pailitao.com -taobao.com -taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn -feizhu.com -fliggy.com  fliggy.hk -iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net  b3log.org a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -ads zuoyebang.cc zuoyebang.com -zybang.com baidu -91.com -aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com -baifae.com baifubao.com -bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn -bdydns.com -bdydns.net chuanke.com  dlnel.com  dlnel.org -duapps.com -dwz.cn -hao123.com hao123img.com -hao222.com -haokan.com jomocdn.net jomodns.com -mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com -bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.com -douyin.com huaxiong.comjokecommunity.comneihanshequ.com -pstatp.com -snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com -wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com -ixigua.com ixgvideo.com  365yg.com didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn -huawei.comhuaweicloud.com  vmall.com vmallres.com cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn -wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com -ks-cdn.com  ksyun.com ksyungslb.com flyme.cn meizu.cn  meizu.com  mzres.com 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com -163yun.com 166.net -haowu.linkicourse163.org  kaola.com -lofter.com  nease.netnetease-inc.com netease.com -netease.im -qiyukf.com ydstatic.com yeah.net -youdao.comanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads coloros.com finzfin.com -heytap.com heytapcs.comheytapdownload.comheytapimage.com -myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn -realme.com realmebbs.comrealmemobile.com oneplus.com -oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com 75.team -75team.com baomitu.com -360.cn 360.com -360-jr.com 360chou.com360daikuan.com360huzhubao.com -360jie.com360jinrong.net -360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com -haosou.com haosou.com.cn -haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com -qihuapi.cn qihucdn.com  qihoo.com qikucdn.com -so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com -youhua.com  yunpan.cn  97973.com -picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com -sinaimg.cn sinaimg.com  sinajs.cn -sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -ads -go2map.com sogo.com  sogou.com sogoucdn.com dns.pub  dnsapi.cn  dnspod.cn -dnspod.com dnspod.com.cn -dnspod.net -dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads -yuewen.com hongxiu.com lrts.me qdmm.com -qidian.com readnovel.com tingbook.com webnovel.com -xs8.cn xxsy.net -apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com -qcloud.com qcloudimg.com qlogo.cn qpic.cn -qq.com -qqmail.com  qzone.com -rtx.com.cnservicewechat.com smtcdns.com smtcdns.net -tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com -tenpay.com -wechat.com -wegame.com wegame.com.cn -weiyun.com alloyteam.com imweb.io ivweb.io -mi.com -mi-img.com  mifile.cn miui.com -miwifi.com  xiaomi.cn -xiaomi.com -xiaomi.netxiaomiyoupin.com  00cdn.com  88cdn.com -sandai.netthunderurl.com -xunlei.com 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn -cmvideo.cn miguvideo.com andfx.cn  andfx.net -cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com -ctexcel.ca ctexcel.comctexcel.com.hk -ctexcel.fr -ctexcel.us -189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com -chntel.com  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cnguoxuedashi.com guoxuemi.com jikipedia.com haidilao.com0123456789.com 0379home.com -055110.com  05sun.com 0759job.com  100bt.com 100offer.com  11467.com -114chn.com 114piaowu.com 114shouji.com -119you.com 123juzi.com 123juzi.net 123u.com 1637.com  16888.com 16rd.com  17173.com 178linux.com  17989.com  17cdn.com 17house.com  18183.com 188.com 1905.com  19yxw.com 1nongjing.com  1ting.com 1zhe.com 21cn.com 2265.com 2288.org 2345.com 258.com 263.net 289.com 2cto.com 3000.com -310win.com -315che.com 3234.com 32r.com 3322.org 3387.com 33lc.com 3454.com 3456.cc -35.com 3533.com 360aiyi.com -360doc.com  360jq.com 360zhyx.com -365azw.com -365dmp.com -37.com 3733.com 3839.com -39.net 3conline.com 3d66.com -3elife.net 3h3.com 3yx.com  40407.com 500.com 500d.me -50bang.org -51.com 51.la -510you.com 51credit.com  51cto.com 51eshop.com 51gaifang.com 51hejia.com51jingying.com 51meishu.com -51sole.com 51wendang.com  51yes.com 5253.com  52hxw.com -52miji.com 52pk.com 52z.com 53kf.com -55.com -56.com 5577.com  55bbs.com  58pic.com  5bite.com 5fun.com 5gzm.net 5khouse.com 5you.com 66wz.com 68h5.com -6rooms.com 714.com 7230.com -72byte.com  7down.com 7k7k.com  7moor.com 7po.com -7x24cc.com -7xdown.com  818ps.com  84399.com 885.com -900.la 917.com 91danji.com 91yunxiao.com 9553.com 962.net 9718.com  99166.com 998.com 999d.com 99danji.com 9ht.com -9xgame.com 9xu.com a9vg.com -aardio.com -adxvip.com -afzhan.com agrantsem.com  aiemy.com aiketour.com  aiops.com  aipai.comairchangan.com airguilin.com aisee.tv aiskycn.com aiyunxiao.com -aizhan.comalittle-tea.com -allyes.com anfensi.com -anquan.org -anruan.com -aotrip.net  aoyou.com apk3.com apk8.com appchina.com -appinn.com  arpun.com babytree.combabytreeimg.com baidufree.combaifendian.com  baihe.com baixing.com baixing.netbamenzhushou.combangongziyuan.com bankcomm.com baofeng.combaoxianshichang.com bcy.net bearychat.com beihaidc.combeijing-lipin.com bengbeng.com  benmi.com  berui.combestopview.com biancheng.net bianews.com bibaodao.com bidchance.com biddingx.com bihu.com -bio360.net  bio4p.com bio-equip.combiodiscover.com bishijie.com bitecoin.com biyehome.net bjcathay.com bobo.com bojianger.com -bokecc.com  boosj.com btcfans.com btgtravel.com bthhotels.com  btime.comcabbagebox.com caijingwu.com -caiyun.com cang.comcankaoxiaoxi.comcardbaobao.com -carnoc.com ccb.com  cdn20.com  cecdc.com cecport.com centanet.com cerambath.org -ch.com chachaba.com changba.com chashebao.comchazhengla.com -che168.comchina-chair.comchina-nengyuan.com  china.comchinacache.comchinacache.netchinachugui.comchinadongchu.com chinafph.comchinakaoyan.comchinalawedu.com chinapay.com chinapp.netchinapubmed.net chinasspp.comchinatranslation.net chinaunix.netchinaweiyu.comchinawutong.com chinazns.comchongdiantou.com -chouti.com chuangxin.com chuansong.mechuansongme.com -chushou.tv chuyu.me  city8.com cjol.com clouddn.com cloudxns.com cnanzhi.com -cnbeta.com cnbetacdn.com cnblogs.com -cnepub.com  cnfol.com  cnlaw.net cnstock.com cnzz.com cocodiy.com code666.com -cofeed.com -cofool.com coindog.comcontentchina.com  cpppf.org  cr173.com  crsky.com  csbew.com -csmjzs.com csslcloud.net -ctfile.com ctiforum.com ctoutiao.com  ctsbw.com -cubead.com  cwxzx.com -cyagen.com  cybtc.com cyol.com cyts.com cztv.com cztvcloud.com dadajiasu.com dadighost.com daguzhe.com dajiabao.com  dajie.com dajieimg.com dalongyun.com dangbei.com danji100.com -danji6.com daocloud.io daovoice.iodayukaoshi.com dazijia.com -dcdkjx.com  dd373.com  ddooo.com dedecms.com develenv.com -dginfo.comdgphospital.comdianchacha.com diandian.comdiandianqi.comdianwannan.comdingxiang-inc.com -diopic.net diyiyou.com dj99.com  docin.com dockerone.com -dockone.io dogedoge.com -donews.com -dongao.comdongguantoday.com dopa.com -douxie.com -downcc.com downxia.com -downyi.com -dpfile.comdreams-travel.comdrivergenius.com -dui.ai duiopen.com duoduocdn.com duokanbox.com -duomai.com duoshuo.com  duote.com dxpmedia.com -dxycdn.com  dyhjw.com dzsc.com dzw3.com  dzwww.com easesale.com  easiu.com eastday.com eastmoney.com eastsoo.com -eayyou.com  ebico.com  ebrun.com -ecitic.com ecjobhome.com -edu.cn  eduei.com eeyy.com eflycloud.com elecfans.com emarbox.com -emumax.com enterdesk.comeoeandroid.com excelhome.net expreview.comf.cx  faloo.com famulei.com  fanli.comfangxiaoer.com fanxian.com fastapi.net -feihuo.com feiniaomy.comfengkongcloud.com fengniao.comfengxian110.com  fenxi.com -fhldns.com  fimmu.com finchina.com fixdown.com  fqjob.net freebuf.com fugetech.com fuwj.com fxxz.com fyxz.com game234.com gameabc.com gamemei.com -gaodun.comgaoshouyou.comgaoxiaojob.com -gdjdxy.comgdliontech.com gdrc.com geilicdn.comgenelinkout.com  getui.com -gezida.com gfan.com -giocdn.com globrand.com gm86.com gmallbio.com  gmz88.comgobasearcher.com gold678.com  golue.comgongxiangcj.com goosail.com  goufw.com gree.comgreenxiazai.com growingio.com  gtags.net  guabu.com guaiguai.comguanaitong.comguanhaobio.com gucheng.com  guigu.org guoxinmac.com  gupzs.com gushiwen.orgguzhangting.com -gwdang.comgxairlines.com -gxb.io gzwanju.com h5uc.com hack520.com hackhome.com haishun.com hanboshi.com handanjob.comhangjiayun.com haolietou.com  haote.comhaoyouyinxiang.com hefei.cc -heisha.net  henha.com henkuai.com herostart.com  hexun.com  hiido.com hitv.com hiyd.com hktheone.com hn-cbec.com -hnrcsc.com hntv.tv hnyuyuhui.com hollycrm.com homeinns.com homekoo.comhongsanban.com -houdao.comhouyuantuan.com hteacher.net huanqiu.comhuashengdaili.com  huatu.com  huize.com  hujia.org hujiang.com hunantv.comhuochepiao.com huocheso.com  huxiu.com hxfy888.com hxsd.com iask.com -ibaotu.com ibuychem.com icaidao.com ichangtou.com idongdong.com iflytek.com  igao7.com -iheima.com ijiandao.com -ikafan.com im2maker.com  im-cc.com -imedao.com imgo.tv  imooc.com indienova.com  infoq.cominfoqstatic.com -ip-cdn.com  ip138.com ipinyou.com iranshao.com  irs01.com ishumei.com  it165.net  it168.com  it610.com  iteye.com -itjuzi.com  itmop.com  iyiou.com iyunxiao.com -izuche.com -jandan.net jb51.com  jdair.net jia.com jiameng.com jianbihua.com jianzhi8.com jiaodong.net jiaoyimao.com jiasuhui.com jiasule.com jiathis.com jiayuan.com jiazhao.com jiemeng8.comjikexueyuan.com jinianbi.comjinrongren.net  jinse.com  jinti.comjiqizhixin.com jisuanke.com jisuxia.com jiuzhilan.com jj20.com jkbl.com jmstatic.com job5588.com -job910.com  jobjm.com jsbc.com -jsrdgg.com jstv.com  jsyks.com juefeng.com -julive.com  jumei.com  juwan.com  juxia.com  jyimg.com k366.com kaifubiao.com kaixin001.com kameng98.com -kanimg.com kankanews.com kantianqi.net kanzhun.com kaopu001.comkeboyunxiao.com  kejet.net kf5.com -kimiss.com kingdee.com kkzj.com -kongfz.com koolearn.com -kouclo.com -koudai.com koudai8.com kq7.com  ksord.com  kuaaa.com kuaidi100.com kuaihou.com kuaizhan.com  kuqin.com -kuyiso.com lady8844.com laomaotao.net laomaotao.org  lascn.net  lawxp.com leanote.com ledu.comleetcode-cn.com leikeji.com leiphone.com leiting.com leju.com leturich.org lianmishu.com -liantu.com  liantu.me lianzhuli.comliaoxuefeng.com liba.com libaclub.comlieyunwang.com lightonus.com -likuso.com lingkou.com linkvans.com  linsn.com linuxidc.com liulanqi.net liuxiaoer.com live800.com liweijia.com lixinger.com lkkbrand.com longhoo.net -longre.comlongtugame.com longzhu.com  lotpc.com -loupan.com -lu.com luckyair.net  lufax.com lufaxcdn.com lunwengo.net luyouqi.com -lvmama.comlvsexitong.com  lxdns.com  lxway.com -magedu.com maisanqi.com -mamecn.com manhuatai.com manmankan.com -mapbar.com mayi.com -mayihr.com -mcbang.com  mdpda.com mechina.org -mediav.com meifang.com meika360.com meilishuo.commeimingteng.com -meiqia.commeishichina.com meishij.netmengtuoshi.wang mgtv.commiaobolive.com miaozhen.com -miercn.com mikecrm.comminhangshi.com miusi.co mjia.cc -mmbang.com mmbang.info -mofang.com mofazhu.com mogu.com mogucdn.com mogujie.com -mokahr.com moleecel.commoocollege.com mop.com msanjia.com -mscbsc.com mukewang.com -mumayi.com -muomou.com muzhiwan.com -mydown.com mydrivers.com myshow360.net myyx618.com myzaker.com naixuecha.com netbian.com -newasp.netnewbandeng.com  newyx.net nowcoder.com nowscore.com  nruan.com ntalker.com nvsheng.com  nzbdw.com oadz.com  oeeee.com  offcn.com officese.com -oicq88.com  okooo.com -ol-cdn.com -ol-img.com oldboyedu.com -oneapm.com onegreen.net -oneyac.comonlinedown.netonlinesjtu.com onlylady.com -opdown.com oray.com  ottcn.com -oupeng.com -p2peye.com p5w.netpaipaibang.com paopaoche.net pc6.com -pcbeta.com -pchome.net  pcpop.com  peccn.com pgzs.compharmacodia.com piaoliang.com -pingan.compingplusplus.com pingwest.com -pingxx.com pintu360.com  pipaw.com  pipaw.net pptbest.com psbc.com -pubyun.com  qc188.com qcc.com qcds.com qd8.com qd-metro.com qh24.com qiangbus.com qianjia.com qianlima.com qianzhan.comqiaobutang.com qichacha.com -qie.tv qifeiye.comqijiayoudao.net qingcloud.comqingdaochina.orgqingdaonews.comqingsongchou.com qiumibao.com qizuang.com  qqddc.comqqgexingqianming.com qqrizhi.comqqshuoshuo.com -qschou.com -qtmojo.com -qudong.com -qugame.com  qunar.com qunarzz.com qyer.com rfchost.comrockyenglish.com rong360.com rtbasia.com  ruan8.com -runoob.com rzrc114.com  saibo.com sanguosha.com -sanwen.net  scdng.com scoregg.com -sczsxx.com sdo.com sec-wiki.com -sencdn.com seniverse.comsenlinjimore.com -sgamer.com shang360.com -shangc.netshanghairc.com shangzhibo.tvshanshuihotel.com sharejs.com shebiaotm.comshelter-china.comshelterdome.netshengdaosoft.comshenmayouxi.com  sheui.com shijiexia.com shixiseng.com shmetro.comshoujihuifu.comshouyoubus.com shrbank.comshuidichou.comshuidihuzhu.com shumensy.comshuoshuokong.com -shutcm.com -simei8.com simuwang.com sinesafe.com  sjwyx.com  skycn.com sllssrq.com -snimay.com  sobot.com sofreight.com softwhy.com -sojson.com -somode.com soso.com souqian.comsouthmoney.comsparkletour.comspringtour.com ssports.com starbaby.cc starbaby.com stockstar.com sun0769.com -sunrtb.com supermap.comsupermapcloud.com -sys321.com szfw.org szhk.com szzfgjj.com t1y5.com  taihe.comtaihuoniao.com tangeche.com tanx.com -tao123.com -taoche.com te5.com tenxcloud.comtianjimedia.comtianjin-air.comtianlailive.com -tianqi.com tietuku.com -tiexue.net timedoo.com tingyun.com titanar.com tjjt360.com  tmcdn.net -tobosu.com tom.com tongdun.net topthink.com touqikan.com travelsky.com trunktech.comtrustexporter.com trustutn.org  tudou.com tudouui.com tuer123.com tuicool.com -tuiwen.net  tujia.com  tuniu.com tutuapp.com  tuwan.com tuwanjun.com u.tools  ucbug.com -uggame.com uoko.com urselect.comurumqi-air.com  useso.com uuu9.com uzzf.com  v5875.com value500.com vamaker.com vdolady.com veryhuo.com veryzhun.com  vic18.com videojj.com  vijos.org vip.com  vobao.com -vpgame.comwallstreetcn.comwangyangyang.vipwannianli8.com wanplus.com wanwushuo.com wanyiwang.com  wanyx.com -wdjimg.com wdzj.com  weand.com webterren.com weicaifu.com weidian.comweilaicaijing.comweilaiyunxiao.com weiphone.net weixing.com weiyangx.comwelltrend-edu.com wenjuan.comwhlovehome.com wicresoft.com -win007.com win8.netwindows10zj.comwindows7en.com windowszj.com winwin7.com wishdown.com  wmzhe.com wnhuifu.com wodingche.com  womai.com wonnder.com -wooyun.org worktile.comwoyaogexing.com  woyoo.com  wqiis.com wrating.com -wscdns.com  wtown.com  wumii.com -wuming.comwuximediaglobal.com  wywyx.com xafc.com  xbiao.com  xdwan.com -xfdown.com -xhscdn.comxiachufang.comxiaobaixitong.comxiaoe-tech.com xiaogouh5.comxiaohongshu.com  xiaoka.tv xiaokaxiu.comxiaomingtaiji.comxiaoxiongxitong.comxiaoyuxitong.com  xiayx.com xiazaiba.com xingjiesj.com xinhuanet.comxinrenxinshi.com xinshipu.comxingtan001.com xitong8.com xitu.com xiu8.com -xiucai.com xiziwang.net xmhouse.com  xnpic.com  xpgod.com -xsa239.comxuanchuanyi.com  xue51.com xuekanba.com xuexicha.com xundupdf.com  xycdn.com xywy.com -xzking.com yahui.cc -yaolan.com  yaoyl.com  yaozh.com -ycgame.com -yeepay.com -yeshen.com  yesky.com yh31.com  yicai.com  yigao.com yigoonet.com yihedoors.comyikaochacha.com yikexue.comyingjia360.comyinhang123.net yinxiang.com yinyuetai.comyinzhaowang.com -yiqifa.com -yiqifa.org yisu.com yitaifang.com  yiwan.com yixi.tv yizhibo.com  yjbys.com ynhr.com -yocajr.com -youboy.com youjiao.com youke.co youlian.fun youshang.com youxiake.com youxihezi.net youxila.com youxiniao.com youxigt.com  youzu.com yoyojie.com  yoyou.com  ypppt.com -yslyhr.com  ysten.com -yuewen.com  yunaq.com yunba.io yundaex.com yundasys.com -yundun.com yunqishi.net yunshipei.com yunxiao.com yunzhijia.com  yupoo.com  yuzua.com  yxbao.com -yxdown.com -yytcdn.com -zampda.net zampdsp.com zastatic.com -zbjimg.com zczj.com -zdfans.com zgjm.org -zgjsks.com  zglxw.com  zgzcw.com zhanbuba.comzhangyoubao.com  zhanqi.tv zhanzhang.net zhaodanji.com zhaopin.com zhcw.com -zhenai.com  zhibo8.cc  zhidx.com zhifang.com -zhipin.com zhiziyun.com zhongkao.comzhuangjiba.comzhuanyewanjia.comzhuayoukong.com zhubajie.com zhugeapi.net zhugeio.com  zimuzu.io zixiaomao.com zixuntop.com  zjstv.com zmengzhu.com zongheng.com -zpb365.com -zrblog.net zsxq.com  zuche.com zuchecdn.com zuhaowan.com zuidaima.com zuowen8.comzuowenwang.net jindidata.comtianyancha.comzhuanxiandai.com -fm3838.comlarsonlimited.com runsheng.com vzuu.com -zoom3g.com -zoomyou.cn chaoxing.com chaoxing.cc -O -COSTCOcostco-static.com -costco.comcostcobusinessdelivery.com - -DGTLE  dgtle.com -" - FOUNDERTYPEfoundertype.com -I -PYTHON -python.orgpythonhosted.org pypa.io pypi.org -/ -REALTYPErealtype.co.jp realtype.jp -s -SINOPECsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com -' - AMERICASVOICEamericasvoice.news -g - ATLASSIAN atlassian.com bitbucket.org statuspage.io -trello.com trellocdn.com - -BINANCEbinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com -) -MEITU  meitu.com meitudata.com - -HINET  hinet.net - - -JAVLIBRARYjavlibrary.com -Y -JFROG  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net -0 - COWTRANSFER c-t.workcowtransfer.com -' -FOXfoxfox-corporation.com fox-news.com fox.com -fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com -fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com -fox5dc.com -fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com -foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv -foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com -foxest.com -foxfaq.com -foxfdm.com foxfiles.com -foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com -foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com -foxnews.cc foxnews.com foxnews.net foxnews.org -foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com -foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com -fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com -anidom.comcasoneexchange.comcoronavirusnow.com -fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com -my13la.com -my20dc.commy20houston.com -my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com -q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.net - - HUNANTV-ADSclick.hunantv.com -adsda.hunantv.com -ads da.mgtv.com -adslog.hunantv.com -adslog.v2.hunantv.com -adsres.hunantv.com -adsv2.log.hunantv.com -ads - -WEBTYPE webtype.com -< -DOCKERcompose-spec.io -docker.com  docker.io -' -MOJI moji.com mojichina.com -2 -MORISAWAmorisawa.co.jptypesquare.com - - - MICROSOFT-DEVadaptivecards.ioapi-extractor.com -apisof.net appcenter.ms -blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com -jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn -cn#microsoftreactor.com.cn -cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn -cn -sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net - -AP -ap.org -apnews.com - -BINGbing bing.com bing.com.cn -cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com -dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com -cn cn.bing.net -cn ditu.live.com -cnbj1.api.bing.com -cnemoi-cncdn.bing.com -cn -. -JIEMIAN jiemian.comjiemian.com.cn - -JIGUANG -42r.cn -5566ua.com aurorapush.cn -e0n.cn japps.cn jchat.io -jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com -jsurvey.cn  jvoice.cn -kc9.cn -n0q.cn pushcfg.com -s0n.cn -" - MASTERCLASSmasterclass.com - -WEVERSE -weverse.io -. -NETLIFY netlify.combitballoon.com -{ -OREILLY oreil.ly oreilly.comoreilly.com.cn -cnoreilly.revieworeillystatic.com -orl.ly -1 -GODADDY godaddy.comx.co godaddy - -DENO  deno.land -@ -REUTERS reuters.com -reuters.tvreutersmedia.net -4 -SCInewisiknowledge.comisiknowledge.com - -BLUBRRY blubrry.com -3 - -STREAMABLE embed-cdn.comstreamable.com - -WESTERNDIGITALg-technology.com -sandisk.ae -sandisk.it -sandisk.cn -cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw -sandisk.de -sandisk.es -sandisk.fr -sandisk.hk -sandisk.id -sandisk.in -sandisk.nl -sandisk.sg -wd.com wdc.comwesterndigital.com - - CATEGORY-ORGS aomedia.org archive.org  atypi.org -change.org ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net csis.orgcsis-prod.s3.amazonaws.comemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.laglobalsecurity.org ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org -ieeer5.org -ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org -comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org ietf.org itu.int nist.gov time.gov openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.orgrolfoundation.orgrolsociety.org  smpte.org -un.org -w3.org who.int wto.org - -CTRIP c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn -skysea.com  suanya.cn -suanya.com -tieyou.com -toptown.cn toursbms.com trip.com tripcdn.com -vipdlt.com - -HUAWEI  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn -huawei.comhuaweicloud.com  vmall.com vmallres.com - -LOGITECH logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net - - OPENSTREETMAP openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.org - -RASPBIAN raspbian.org - - XIAOMITV-ADSad.intl.xiaomi.com -ads ad.mi.com -ads ad.xiaomi.com -adsadmob.xiaomi.com -adsad1.xiaomi.com -adsmistat.xiaomi.com -adstracking.miui.com -adsadv.sec.miui.com -ads"adv.sec.intl.miui.com -ads"misc.in.duokanbox.com -ads ad.hpplay.cn -adsadeng.hpplay.cn -ads atianqi.com -ads kuyun.com -ads umeng.com -ads - - -AKAMAI ak1.net -aka-ai.com -aka-ai.net akacrypto.net akadeem.net -akadns.com akadns6.net -akaeai.com -akafms.net akahost.net -akaint.net akam.net -akamaa.com -akamah.com -akamak.com -akamam.comakamai-access.comakamai-access.netakamai-cdn.com akamai-platform-internal.netakamai-platform-staging.comakamai-platform.netakamai-regression.netakamai-staging.netakamai-sucks.netakamai-thailand.comakamai-thailand.netakamai-trials.com akamai.co.kr -akamai.com -akamai.netakamaientrypoint.netakamaietpcnctest.com#akamaietpcompromisedcnctest.com'#akamaietpcompromisedmalwaretest.comakamaietpmalwaretest.comakamaietpphishingtest.comakamaihd-staging.net akamaihd.com akamaihd.netakamaimagicmath.netakamainewzealand.comakamaiphillipines.comakamaiphillipines.netakamaitech.comakamaitech.netakamaitechnologies.comakamaitechnologies.netakamaisingapore.netakamaized-staging.net akamaized.netakamaizercentral.com -akamci.com  akami.com  akami.net -akamii.com -akamqi.com akastream.com akastream.net -akatns.net iamakamai.com iamakamai.netsoasta-dswb.com -srtcdn.net - -BITFINEX bitfinex.com -? -BOOTCSS bootcss.com -bootcdn.cnphpcomposer.com -# - MOPUB-ADS mopub.com -ads - -WIKIHOW wikihow.com -% - -ADJUST-ADS -adjust.com -ads -z -CERNcern ams02.space cern.ch cixp.netdotcernpilot.info  ippog.orglinearcollider.org - - MCDONALDSmcd  mcdonalds4008-517-517.cn -cnaboutmcdonalds.comhappymeal.co.nzhappymeal.com.au mcd.commcdelivery.co.idmcdelivery.co.krmcdelivery.com.aumcdelivery.com.mymcdelivery.com.sgmcdelivery.com.twmcdindonesia.com mcdonalds.camcdonalds.co.uk mcdonalds.commcdonalds.com.hk mcdonalds.hk mcdonalds.it mcdonalds.no mcdonalds.semcdonaldsarabia.commcdonaldsparties.co.nzmcdonaldsparties.com.au!xn--qhrx81fxh2a.xn--55qx5d.hk -B - APPLOVIN-ADS applovin.com -ads -applvn.com -ads - -MIAOPAI miaopai.com - - YOUKU-ADSactives.youku.com -ads ad.api.3g.youku.com -ads$ad.api.mobile.youku.com -ads ad.mobile.youku.com -ads(a-dxk.play.api.3g.youku.com -ads atm.youku.com -ads#b.smartvideo.youku.com -adsc.yes.youku.com -adsdas.api.youku.com -ads!das.mobile.youku.com -ads!dev-push.m.youku.com -adsdl.g.youku.com -adsdmapp.youku.com -adse.stat.ykimg.com -ads#gamex.mobile.youku.com -ads!guanggaoad.youku.com -ads hudong.pl.youku.com -ads!huodong.pl.youku.com -ads"huodong.vip.youku.com -ads hz.youku.com -adsiyes.youku.com -ads l.ykimg.com -adslstat.youku.com -ads mobilemsg.youku.com -ads msg.youku.com -adsmyes.youku.com -ads p.l.youku.com -ads pl.youku.com -ads#passport-log.youku.com -adsp-log.ykimg.com -adspush.m.youku.com -ads r.l.youku.com -ads s.p.youku.com -adssdk.m.youku.com -adsstat.youku.com -ads$statis.api.3g.youku.com -ads&store.tv.api.3g.youku.com -ads&store.xl.api.3g.youku.com -adstdrec.youku.com -adstest.ott.youku.com -ads!test.sdk.m.youku.com -ads v.l.youku.com -adsval.api.youku.com -ads wan.youku.com -adsykatr.youku.com -adsykrec.youku.com -ads - -VIDEOLAN videolan.org - -VIM vim.org - -INSIDERbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com - -LYSOL lizol.co.in lysol.ca lysol.cllysol.cn -cn lysol.co.cr  lysol.com lysol.com.cn -cn lysol.com.mx  lysol.net -6 - NORDSTROM nordstrom.comnordstrommedia.com -C - SCIENCEDIRECTsciencedirect.comsciencedirectassets.com - -YARNPKG yarnpkg.com -1 -ABEMA abema.io abema.tv ameba.jp - - -FONTSINUSEfontsinuse.com -k -IKEAikea.cn -cn ikea.com ikea.net  ingka.com  ingka.devingkacentres.com -, -JAVAjava java.com java.net -6 -UDN udn.com -udn.com.twudnfunlife.com - -WENZHAO -wenzhao.ca - - YUANFUDAO banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com - -LETV-ADS#api.game.letvstore.com -ads ark.letv.com -ads dc.letv.com -adsdev.dc.letv.com -ads fz.letv.com -ads g3.letv.com -adsletv.allyes.com -adsminisite.letv.com -adsmsg.m.letv.com -adsn.mark.letv.com -adsplog.dc.letv.com -adspro.hoye.letv.com -ads pro.letv.com -ads stat.letv.com -ads"static.app.m.letv.com -ads -A -MEIZU flyme.cn meizu.cn  meizu.com  mzres.com - - NEURALINK neuralink.com - -SLACKslack-edge.comslack-imgs.com  slack.com -slackb.comslackcertified.com slackdemo.com slackhq.com -3 - XHAMSTER-ADS#collector.xhamster.com -ads -? -GEETEST geetest.com#geetest.datasink.sensorsdata.cn - -HEYTEA -heytea.com -B - LOCALBITCOINSlocalbitcoins.comlocalbitcoinschain.com -2 -INNER-ACTIVE-ADSinner-active.mobi -ads -F - -DEVIANTARTdeviantart.comdeviantart.net da-files.com -? -LIEPIN -liepin.com -lietou.comlietou-static.com -Z -PICSEE pics.ee  picsee.co -picsee.pro pise.pw pros.ee -pse.is - -GITV gitv.cn gitv.tv - -HUFFPOSThuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com - - -CLOUDFLAREcloudflare-dns.comcloudflare-ipfs.comcloudflare.comcloudflareapps.comcloudflareinsights.comcloudflareok.comcloudflaressl.comcloudflarestatus.comcloudflarestream.comcloudflaretest.com one.one.onetrycloudflare.comvideodelivery.net workers.dev - -CNPMJS -cnpmjs.org - -NUROFEN -nurofen.at -nurofen.bg -nurofen.cn -cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn -cnnurofen.com.sg -nurofen.cz -nurofen.de -nurofen.es -nurofen.fr -nurofen.hr -nurofen.hu -nurofen.ie -nurofen.it nurofen.net -nurofen.no -nurofen.pl -nurofen.pt -nurofen.ro -nurofen.sk -nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com - -CATEGORY-CRYPTOCURRENCY asproex.comasproexapi.combinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com -bitbank.cc bitcoin.org bitfinex.com bitflyer.com bitflyer.jp -bitmex.com bitquick.co bisq.io bisq.network bitsquare.io bitstamp.net bittrex.com btcbox.co.jp -cex.io coinbase.com coinone.co.krcoinonecore.comcoinonecorp.com dogecoin.com -devcon.orgethereum.foundation ethereum.org -hbabit.com -hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com -kraken.comlocalbitcoins.comlocalbitcoinschain.com okex.com -paxful.com -zb.app -zb.com zb.io zb.live - -CNN cnn.com -cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com - -OSDN osdn.net - -GAMERSKY gamersky.com - -91PORN -91porn.com - - ALIBABACLOUDalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com -e - ATOM-DATA-ADS atom-data.io -adsanalytics-data.io -ads ironbeast.io -ads - -GRAVATAR gravatar.com -" - HUBBLEPHONEhubblephone.com - -TESLA solarcity.comtesla.cn -cn  tesla.com tesla.com.cn -cnteslamotors.cn -cnteslamotors.comteslamotors.com.cn -cntesla-cdn.thron.cn -cntesla-cdn.thron.com - -UPROXY -uproxy.org - -5CH 2ch.net 5ch.net -. -ANDROID android.comandroidify.com -* -BOXUN  boxun.combowenpress.com -+ - -KUBERNETES kubernetes.io -k8s.io - -NINTENDO100classicbooks.com -amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn -cn legendofzelda.com.cn -cn miitomo.commiitomo.com.cn -cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn -cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn -cn!supersmashbros.com.cn -cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com -dialga.com giratina.com -kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn -cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn -cnmariokart.com.cn -cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn -cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com -wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com - -GEOLOCATION-!CNacadaeafagalamanaoaqaratauawaxazbabgbhbibjbmbnbobrbsbvbwbybzcacdcgclcmcrcucwcxcyczdedkdzecegehereseufifjfkfofrgagbgdgeghgiglgmgngrgsgtgugwgyhkhnhthuieiliniqirjejmjojpkekhkiknkpkrkwkykzlblclilklrlsltlulymamcmdmfmgmhmkmnmompmqmrmtmumwmxmymznancnenfngninlnonpnrnunzompapepfpgphplpnrerorurwsascsdsesgsisjskslsnsrssstsusvsxsysztctdtfthtjtktltmtntotptrtttwtzuaugukumusuyuzvavcvevgvivnvuwfytzazmzwaflmlbnbanflnra averybbbbcgcebcrsdnbdnpdunsdvagerni globalxice locus mckinsey olayangroup -olayan praxisapseek -vistaprint vistawtc xerox athletabananarepublic  bloomberg boots calvinklein cartier chloegap gucci -hermesiwcjlc  lancaster lipsyloft mango  montblanc mrporter -netaporter -nextdirectnextnike oldnavy omega panerai  patagonia -piaget  piperlimepolo redstone -swatchaarp -abbott -abbvie aetna alcon -anthembms -boehringer caremore -cialis dabur  freseniusjnj merck mutuelle -sanofiaeg -airbus -alstom -aramco -blanco bosch -bostik -chesapeakechk crown -doosan -dupontflirfls flsmidth  gecompany grainger hitachi  honeywellifm ipirangajio komatsukoneksb  kuokgroup leclerclidl linde lottemanmtr reliance rexrothril rockwoolrwesandvikcoromant sandvik sapphiresca -schaeffler schmidt schwarzgroup schwarz senersewsncf statoil total -vanish -walter -warman weberweir woodsidezara zippo agakhanakdn -ansons -bharti -extraspace genting glean ikano -imamat  ladbrokes -livestrongmaif -mattel shell transformersvanawme astriumcern -emerck  hisamitsu lilly lundbeck lupin merckmsdmsdmtpc -otsuka -pfizer stadateva toray weather auspost deutschepostdhl epost fedex -pitneyaaa -abarthadac  alfaromeoaudi bentleybmw bridgestone bugatti buick cadillaccase -caseih  chevrolet chevy chrysler -datsun dodge -dunlop ferrarifiat  firestonefordgmc goodyear honda hyundai infiniti iveco -jaguarjeepkia lamborghini -lancia  landrover lexus lincoln maseratimini -mitsubishi mopar -newholland -nissanramseatsrt -suzuki -tatamotors -toyotatvs uconnect -volkswagen volvoaigo android apple bestbuy brother canondell digikey fujitsu  fujixerox  goldpointibm nikon nokia olympus  panasonic philips pioneer samsung sharpsony toshiba  yodobashi  allfinanzallfinanzberaterallfinanzberatungallyamericanexpressamexampanz banamex barclaycard barclaysbbtbbvabnl -bnpparibasbofa bradesco -capitalone cashbackbonuscbacfa chasecimb citadelciti commbank deloitte discover everbank fidelity hdfcbankhdfchsbcitaujcbjll jpmorganchase jpmorgankfhkpmg lacaixa lasalle lixil lplfinanciallplnab nadex netbanknorthwesternmutualopen -pictetpncpohl  pramerica -prudentialprupwcsaxosbiscbscor shriram softbank  statebank temasek -transunion ubankubs vanguardvisa wolterskluwerafamilycompany  aquarellediyduck -finish glade  homedepot  homegoods mrmuscleoffraid rightathome  scjohnsonaig allstateamericanfamily amfam amicaaxa chartis esurance farmers  goodhands guardian guardianlife iselect metlifemma -mutual -nationwide -nissaynorthlandinsurance -onyourside progressive redumbrella  statefarm -swiftcover thehartfordtiaatravelersinsurance  travelers travelguardtrvvig beats blockbusterbway netflix playstation showtimetab williamhillxboxasda bloomingdales -george  homesense justforulego macys  marshallsobiqvc safeway samsclub shopyourway staples -targetthd tiffany -tjmaxxtjx -tkmaxxvons walmartabb  accentureaceraco -active -airtel -amazonandaolawsaxis azure chatr -chrome cisco comcast -connectorscscdclkdish -docomodtvdwg emerson epson ericsson etisalat  fairwindsfido -flickr frogans frontierftrgbizgeaggeegle gmailgmogmx godaddygoog -googlegoogreeguge hangouthkt hotmailhtc -hughesieee iinet infosysinfy intel -intuitjavajcpjmpjprs juniperkddi -kindle -konamikpn lanxess liaison -lockermeo  microsoftmihmiimint mitekmit -mobily -mozaicmtn multichoice naspersnec neustar nexusnico -nortonntt -officeollo -oracle -orangeovh patchpayupccwqtel quest  richardli ricoh -rogers -sakurasaposassessfrshaw skolkovo skydrive skype sling smart stcgroupstc symantectatatcitdk telecity -telefonica terra translations  ultrabook unicornuol verisignvivavivo windows xfinity -xperia yahoo yamaxun -yandex yellowpages youtube -zappos -chanel clinique garnier  kerastase -kiehls lamer lancome -loreal -matrix -maybelline -natura origins -redkensvr barefoot beknown cityeatscookingchannel -cuisinella delmonte edekafage ferrero foodnetworkfood gallo heinz -kindermcd  mcdonalds pamperedchef -rocher -wilmarxn--3oq18vl8pn36axn--55qx5d8y0buji4b870uxn--5su34j936bgsgxn--b4w605ferd xn--cckwcxetd -xn--cg4bkixn--dkwm73cwpn xn--flw351exn--fzys8d69uvgmxn--hxt035cmppuelxn--hxt035czzpfflxn--j6w470d71isscxn--jlq480n2rgxn--jlq61u9w7bxn--kcrx77d1x4axn--kcrx7bb75ajk3bxn--mgba3a3ejtxn--mgba7c0bbn0axn--mgbaakc7dvfxn--mgbb9fbpob xn--ngbe9e0a xn--pgb3ceoj xn--qcka1pmcxn--w4r85el8fhu5dnra xn--w4rs40l avianca caravan changiairport cipriani clubmed delta firmdale -hilton hyatt kerryhotelskerrylogisiticskerryproperties marriott orientexpress  shangrila tradershotelstui -viking -virgin -webjetablecbre chintai  frontdoor -lefrakabc africamagicartebbc  canalpluscbncbsdstv -eurovisionfox -gallup globogotv guardianmediahbohgtvimdbitv -kyknetmnet movistar mzansimagicnhk nowtvsbs sevensky spiegel starhub -supersport theguardian travelchannelweatherchannel bauhaus latrobe -monashrmit pubmatic.compubmatic.co.jpads.pubmatic.com -ads taboola.com ahmia.fi akasha.worldbrowserleaks.combypasscensorship.org citizenlab.cadat.foundationdemocracy.earth eff.orgepicbrowser.com ffprofile.comfreenetproject.org fteproxy.org  gfw.press -gfw.report greatfire.orgguardianproject.infohaveibeenpwned.compwnedpasswords.com -geti2p.net ipfs.io  jitsi.orggetlantern.org -lantern.io  ntc.partyonionshare.org ooni.org openvpn.netprivacytools.io psiphon3.comshadowsocks.org softether.orgsoftether-download.com stunnel.org telex.cctorproject.org tribler.org tunsafe.comtwister.net.co -uproxy.org  v2ray.com -v2ray.cool  v2fly.org vuvuzela.io -whonix.org wikileaks.org wireguard.com -zeronet.ioartstation.comartstationmedia.com drbl.in dribbble.com dynacw.co.jp -dynacw.com dynacw.com.cn dynacw.com.hk dynacw.com.tw  fonts.com  fonts.netfontsinuse.com glyphsapp.comjiyu-kobo.co.jpfontexplorerx.com fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com linotype.com myfonts.com myfonts.net monotype.commonotypeimaging.com bitstream.com itcfonts.commorisawa.co.jptypesquare.com -pin.it -pinimg.com pinterest.at pinterest.be pinterest.ca pinterest.ch pinterest.cl pinterest.copinterest.co.atpinterest.co.inpinterest.co.krpinterest.co.nzpinterest.co.uk pinterest.compinterest.com.aupinterest.com.bopinterest.com.ecpinterest.com.mxpinterest.com.pepinterest.com.pypinterest.com.uypinterest.com.vn pinterest.de pinterest.dk pinterest.ecpinterest.engineering pinterest.es pinterest.fr pinterest.hu pinterest.id pinterest.ie pinterest.inpinterest.info pinterest.it pinterest.jp pinterest.kr pinterest.mx pinterest.nl pinterest.nz pinterest.pe pinterest.ph pinterest.pt pinterest.ru pinterest.se pinterest.th pinterest.tw pinterest.uk pinterest.vnpinterestmail.comrealtype.co.jp realtype.jptypenetwork.comtypography.com webtype.commini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com -mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl -mini.co.cr -mini.co.id -mini.co.il -mini.co.kr -mini.co.me -mini.co.th -mini.co.uk -mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua -mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com -minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com -minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com -trmini.comtroisrivieresmini.comyours-customised.mini.combmwapprovedusedbmw.combaltimorebmw.combayareabmw.combmw-abudhabi.combmw-adventskalender.combmw-albania.combmw-antilles.frbmw-art-journey.combmw-arts-design.com bmw-asia.com bmw-auslieferungszentrum.combmw-authority-vehicles.combmw-bahrain.combmw-businessdrive.combmw-calgary.ca bmw-carit.debmw-classic.combmw-clubs-international.combmw-connected-drive.combmw-connecteddrive.aebmw-connecteddrive.atbmw-connecteddrive.bebmw-connecteddrive.bgbmw-connecteddrive.cabmw-connecteddrive.chbmw-connecteddrive.co.nzbmw-connecteddrive.co.ukbmw-connecteddrive.co.zabmw-connecteddrive.combmw-connecteddrive.com.aubmw-connecteddrive.com.brbmw-connecteddrive.com.cybmw-connecteddrive.com.hrbmw-connecteddrive.com.kwbmw-connecteddrive.com.mtbmw-connecteddrive.czbmw-connecteddrive.debmw-connecteddrive.dkbmw-connecteddrive.eebmw-connecteddrive.esbmw-connecteddrive.fibmw-connecteddrive.frbmw-connecteddrive.grbmw-connecteddrive.hubmw-connecteddrive.iebmw-connecteddrive.itbmw-connecteddrive.jpbmw-connecteddrive.krbmw-connecteddrive.ltbmw-connecteddrive.lubmw-connecteddrive.lvbmw-connecteddrive.mxbmw-connecteddrive.mybmw-connecteddrive.nlbmw-connecteddrive.nobmw-connecteddrive.plbmw-connecteddrive.ptbmw-connecteddrive.robmw-connecteddrive.rubmw-connecteddrive.sebmw-connecteddrive.sgbmw-connecteddrive.sibmw-connecteddrive.skbmw-connecteddrive.twbmw-corporate-sales.combmw-diplomatic-sales.combmw-driving-center.co.krbmw-drivingexperience.com bmw-dubai.com -bmw-eg.com bmw-fleet.net bmw-ghana.combmw-golfsport.com bmw-group.com bmw-group.netbmw-grouparchiv.debmw-grouparchives.com -bmw-gta.cabmw-i-pure-impulse.com bmw-i.jp bmw-int1.com bmw-iraq.combmw-jordan.combmw-konzernarchiv.de bmw-ksa.combmw-kuwait.com -bmw-lao.labmw-lebanon.combmw-m-safetycar.com  bmw-m.combmw-mdrivetour.com -bmw-me.combmw-military-sales.combmw-motorcycle.combmw-motorcycles.vnbmw-motorrad-abudhabi.com bmw-motorrad-authorities.combmw-motorrad-dubai.combmw-motorrad-motorsport.com!bmw-motorrad-now-or-never.com&"bmw-motorrad-service-inclusive.combmw-motorrad-test-ride.combmw-motorrad.atbmw-motorrad.bebmw-motorrad.bgbmw-motorrad.bhbmw-motorrad.bobmw-motorrad.cabmw-motorrad.chbmw-motorrad.clbmw-motorrad.cobmw-motorrad.co.idbmw-motorrad.co.krbmw-motorrad.co.nzbmw-motorrad.co.thbmw-motorrad.co.ukbmw-motorrad.co.zabmw-motorrad.combmw-motorrad.com.arbmw-motorrad.com.aubmw-motorrad.com.brbmw-motorrad.com.dobmw-motorrad.com.hrbmw-motorrad.com.mxbmw-motorrad.com.mybmw-motorrad.com.pebmw-motorrad.com.pybmw-motorrad.com.trbmw-motorrad.crbmw-motorrad.czbmw-motorrad.debmw-motorrad.dkbmw-motorrad.dzbmw-motorrad.ecbmw-motorrad.eebmw-motorrad.esbmw-motorrad.fibmw-motorrad.frbmw-motorrad.grbmw-motorrad.gtbmw-motorrad.hubmw-motorrad.inbmw-motorrad.itbmw-motorrad.jpbmw-motorrad.lubmw-motorrad.mabmw-motorrad.nlbmw-motorrad.nobmw-motorrad.pabmw-motorrad.plbmw-motorrad.ptbmw-motorrad.robmw-motorrad.rsbmw-motorrad.rubmw-motorrad.sabmw-motorrad.sebmw-motorrad.sibmw-motorrad.skbmw-motorrad.svbmw-motorrad.twbmw-motorrad.uabmw-motorrad.uybmw-motorsport.combmw-mountains.combmw-museum.combmw-museum.netbmw-nigeria.com bmw-oman.com bmw-ottawa.cabmw-pakistan.combmw-plant-munich.combmw-pma.com.sgbmw-powertrain.combmw-product-highlights.com bmw-qatar.combmw-routes.com -bmw-rp.combmw-rrdays.combmw-saudiarabia.combmw-security-vehicles.combmw-special-sales.combmw-sports.com bmw-sudan.combmw-tahiti.combmw-tunisia.combmw-vancouver.ca bmw-voli.me bmw-welt.com bmw-welt.net bmw-welt.tvbmw-werk-berlin.de bmw-world.com bmw-world.net bmw-world.tvbmw-worldfinal.combmw-yachtsport.com -bmw-yeg.ca bmw-yemen.com -bmw.am -bmw.at -bmw.az -bmw.ba -bmw.bb -bmw.be -bmw.bg -bmw.bm -bmw.bs -bmw.by -bmw.ca -bmw.cc -bmw.ch -bmw.cl  bmw.co.ao  bmw.co.cr  bmw.co.id  bmw.co.il  bmw.co.jp  bmw.co.ke  bmw.co.kr  bmw.co.nz  bmw.co.th  bmw.co.uk  bmw.co.za bmw.com -bmw.com.ar -bmw.com.au -bmw.com.bd -bmw.com.bn -bmw.com.bo -bmw.com.br -bmw.com.cn -cn -bmw.com.co -bmw.com.cy -bmw.com.do -bmw.com.ec -bmw.com.ge -bmw.com.gt -bmw.com.kh -bmw.com.ky -bmw.com.mk -bmw.com.mo -bmw.com.mt -bmw.com.mx -bmw.com.my -bmw.com.ni -bmw.com.pa -bmw.com.pe -bmw.com.ph -bmw.com.py -bmw.com.sg -bmw.com.sv -bmw.com.tr -bmw.com.tw -bmw.com.uy -bmw.com.ve -bmw.cw -bmw.cz -bmw.de -bmw.dk -bmw.dz -bmw.ee -bmw.es -bmw.fi -bmw.fr -bmw.gp -bmw.gr -bmw.hn -bmw.hr -bmw.ht -bmw.hu -bmw.ie -bmw.in -bmw.is -bmw.it -bmw.kg -bmw.kz -bmw.lc -bmw.lk -bmw.lt -bmw.lu -bmw.lv -bmw.ly -bmw.ma -bmw.md -bmw.mn -bmw.mq -bmw.mu -bmw.nc -bmw.nl -bmw.no -bmw.pl -bmw.ps -bmw.pt -bmw.re -bmw.ro -bmw.rs -bmw.se -bmw.si -bmw.sk -bmw.sn -bmw.tm -bmw.tt -bmw.ua -bmw.uz -bmw.vn bmwarchiv.at bmwarchiv.debmwartjourney.com bmwasia.combmwauslieferungszentrum.com bmwbikes.com  bmwbkk.de -bmwccrc.cabmwcenternet.combmwchampionship.combmwchampionshipusa.combmwcharitygolf.combmwcitychallenge.combmwclassic.combmwcolorado.combmwconnecteddrive.combmwcustomapparel.com bmwdcsnet.netbmwdealercareers.combmwdealerdirect.combmwdelawarevalley.com bmwfilms.combmwgroup-classic-heart.combmwgroup-classic.combmwgroup-gaad.combmwgroup-plants.combmwgroup-posdigital.combmwgroup-werke.com bmwgroup.at bmwgroup.com bmwgroup.net bmwgroup.jobsbmwgroupclassic.combmwgroupdesignworks.combmwgroupdirect.combmwgroupfs.combmwgroupinfobahn.combmwgroupna.com  bmwhk.com bmwi.ca bmwi.jpbmwiventures.combmwjamaica.com -bmwlat.combmwlifestyle.ca bmwm.combmwmagazine.combmwmagazine.de bmwmass.com bmwmass.net  bmwmc.netbmwmontreal.cabmwmotorcycles.combmwmotorcycleusa.combmwmotorrad.co.krbmwmotorrad.com.aubmwmotorrad.com.phbmwmotorrad.com.sgbmwmotorradhk.combmwmotorshowblog.combmwmotorsport.combmwmperformance.com bmwmuseum.netbmwmyanmar.combmwofannapolis.combmwofcentralpa.combmwoftulsa.combmwondemandusa.com bmworegon.combmwperformancecenter.combmwpittsburgh.combmwproductnews.com bmwsafari.com -bmwsfl.com -bmwsfl.net -bmwshop.cabmwspecialoffers.ca bmwsports.combmwstartupgarage.com bmwstep.combmwstepconnections.combmwsummerschool.combmwtampabay.com -bmwusa.combmwusatires.combmwusaservice.combmwusfactory.combmwusrideracademy.combmwvalueservice.combmwwholesaleconnect.com bmwworld.com bmwworld.net bmwworld.tvbmwzentrum.combrand-protection-team.comcencoastbmw.com chargenow.comchargenowusa.comchicagolandbmw.comconnected-drive.com daytonbmw.comdealerspeed.net desertbmw.com dreambmw.ca grupobmw.com guambmw.comhackthedrive.com hawaiibmw.com iaablog.comlasvegasbmw.com m-power.comminneapolisbmw.comminneapolisbmw.netmotorshowblog.com mybmw.ca  mybmw.comnewhampshirebmw.com  nmbmw.comocbmwdealers.comoffresspecialesbmw.ca park-now.com parkinfo.com -pdxbmw.com -phxbmw.compre-bmwgroup.jobspugetsoundbmw.com rentaride.com rentaride.derhodeislandbmw.comsdcountybmw.comshopbmwmotorcycles.comshopbmwusa.com socalbmw.comstlouisbmw.netthe-m-festival.comtristatebmw.comvancouverbmwretailers.cawashingtondcbmw.com alfera.com.hk alfera.com.my  alfera.in  alfera.myalphera-finance.co.inalphera-finance.com.hkalphera-finance.in -alphera.ca alphera.co.in alphera.co.nz alphera.comalphera.com.esalphera.com.hkalphera.com.my -alphera.de -alphera.es -alphera.ie -alphera.in -alphera.my alphera.netalpherafinance.com.hkalpherafinancialservices.esalpherafinancialservices.in alpherafs.caalpherafs.co.nzalpherafs.com.hkalpherafs.com.my alpherafs.ie alpherafs.in alpherafs.my premiumfs.de alphabet.asia alphabet.at alphabet.be alphabet.biz alphabet.chalphabet.co.hualphabet.co.ukalphabet.co.za alphabet.comalphabet.com.cn -cnalphabet.com.esalphabet.com.lvalphabet.com.mxalphabet.com.plalphabet.com.pt alphabet.cz alphabet.de alphabet.es alphabet.eu alphabet.fr alphabet.info alphabet.jp alphabet.lt alphabet.lu alphabet.lv alphabet.mxalphabet.net.cn -cn alphabet.noalphabet.org.uk alphabet.pl alphabet.pt alphabet.uk alphabet.usalphabetfinance.netelectricluxury.comrolls-roycecullinan.comrolls-roycemotorcars.comrolls-roycemotorcarsna.com  rrtis.comspiritofecstasy.com bridgestone  bandag.cc -bandag.comblizzak-juken.jpbookmybridgestonetyre.combridgestone-asiapacific.combridgestone-bandag.combridgestone-brand.com#bridgestone-business-service.jpbridgestone-korea.co.krbridgestone-plt-eng.combridgestone-tac-oman.combridgestone.clbridgestone.cn -cnbridgestone.co.crbridgestone.co.idbridgestone.co.inbridgestone.co.jpbridgestone.co.thbridgestone.combridgestone.com.arbridgestone.com.brbridgestone.com.cn -cnbridgestone.com.cobridgestone.com.mxbridgestone.com.sgbridgestone.com.twbridgestone.com.vnbridgestoneamericas.combridgestonearena.combridgestonecntc.combridgestonecomercial.clbridgestonecomercial.co.crbridgestonecomercial.com.arbridgestonecomercial.com.brbridgestonecomercial.com.cobridgestonecomercial.com.mxbridgestonegolf.combridgestonegz.combridgestonela.combridgestonemarketing.combridgestonemerchandise.com bridgestonenationalfleet.combridgestoneperformance.com#bridgestoneperformancemedia.net bridgestonerapiddelivery.combridgestonerewards.combridgestonesyb.combridgestonetire.cabridgestonetire.combridgestonetyre.com.mybridgestonevan.combridgestonewx.combs-adreview.com bs-awh.ne.jp  bsw.co.jp -bsw.jpcarcare-and-tireshop.jpdaytontrucktires.com ecoforme.jp gcrtires.comjsbridgestone.commenshin-channel.com monitrix.net mr-tireman.jpmybridgestoneeducation.com playz.jp -potenza.jpprodrive-japan.comstore-bridgestonesports.com thetread.com tiresplus.com cfna.combastropfirestone.comcrossfitfirestone.com firestone.clfirestone.co.crfirestone.com.arfirestone.com.brfirestone.com.cofirestone.com.mxfirestonebpco.comfirestonecomercial.clfirestonecomercial.co.crfirestonecomercial.com.arfirestonecomercial.com.brfirestonecomercial.com.cofirestonecomercial.com.mx!firestonecompleteautocare.comfirestonedrivestore.comfirestoneip.comfirestonerewards.comfirestonetire.cafirestonetire.comhibdontire.comwheelworks.netnokiantyres.cn -cnnokiantyres.com solarcity.comtesla.cn -cn  tesla.com tesla.com.cn -cnteslamotors.cn -cnteslamotors.comteslamotors.com.cn -cntesla-cdn.thron.cn -cntesla-cdn.thron.com volvodynafleetonline.comescandinavia-arg.comindependentoperatorcn.com road-crew.com udfs.com vfsco.at vfsco.be vfsco.bg vfsco.ca vfsco.ch vfsco.cl vfsco.co.uk vfsco.co.za  vfsco.com vfsco.com.au vfsco.com.br vfsco.com.cn -cn vfsco.com.tr vfsco.cz vfsco.de vfsco.dk vfsco.ee vfsco.es vfsco.fi vfsco.fr vfsco.hu vfsco.ie vfsco.in vfsco.it vfsco.jp vfsco.kr vfsco.lt vfsco.lv vfsco.mx vfsco.nl vfsco.no vfsco.pe vfsco.pl vfsco.ro vfsco.ru vfsco.se vfsco.sk vfsco.us vgcareers.netvolvo-truck.nl volvo.cavolvo.cn -cn  volvo.com volvo.com.cn -cn volvo.sevolvobrandshop.com volvobuses.at volvobuses.be volvobuses.ca volvobuses.ch volvobuses.covolvobuses.co.nzvolvobuses.co.ukvolvobuses.co.zavolvobuses.comvolvobuses.com.arvolvobuses.com.auvolvobuses.com.brvolvobuses.com.kwvolvobuses.com.ptvolvobuses.com.tw volvobuses.de volvobuses.dk volvobuses.es volvobuses.fi volvobuses.fr volvobuses.hk volvobuses.hu volvobuses.in volvobuses.it volvobuses.jo volvobuses.kr volvobuses.ma volvobuses.mx volvobuses.my volvobuses.no volvobuses.om volvobuses.ph volvobuses.pk volvobuses.pl volvobuses.ru volvobuses.se volvobuses.sg volvobuses.tn volvobuses.us volvoce.comvolvodefense.com volvogroup.be volvogroup.cn -cnvolvogroup.comvolvogroup.com.brvolvogroup.com.cn -cn volvogroup.de volvogroup.fr volvogroup.jp volvogroup.kr volvogroup.mx volvogroup.nl volvogroup.pe volvogroup.pl volvogroup.ru volvogroup.sevolvogrouptruckcenter.nlvolvomerchandise.comvolvopenta.comvolvopenta.com.br volvopenta.de volvopenta.es volvopenta.fr volvopenta.it volvopenta.nl volvopenta.se volvopenta.usvolvosaatio.fivolvospares.comvolvotrucks.aevolvotrucks.alvolvotrucks.amvolvotrucks.atvolvotrucks.azvolvotrucks.bavolvotrucks.bevolvotrucks.bgvolvotrucks.byvolvotrucks.chvolvotrucks.clvolvotrucks.co.aovolvotrucks.co.bwvolvotrucks.co.ilvolvotrucks.co.mzvolvotrucks.co.navolvotrucks.co.ukvolvotrucks.co.nzvolvotrucks.co.zavolvotrucks.co.zmvolvotrucks.co.zwvolvotrucks.comvolvotrucks.com.arvolvotrucks.com.auvolvotrucks.com.bnvolvotrucks.com.brvolvotrucks.com.cn -cnvolvotrucks.com.covolvotrucks.com.kwvolvotrucks.com.ptvolvotrucks.com.trvolvotrucks.com.twvolvotrucks.com.uavolvotrucks.czvolvotrucks.devolvotrucks.dkvolvotrucks.eevolvotrucks.esvolvotrucks.fivolvotrucks.frvolvotrucks.gevolvotrucks.grvolvotrucks.hkvolvotrucks.hrvolvotrucks.huvolvotrucks.idvolvotrucks.involvotrucks.itvolvotrucks.jpvolvotrucks.kgvolvotrucks.krvolvotrucks.kzvolvotrucks.ltvolvotrucks.lvvolvotrucks.mavolvotrucks.mdvolvotrucks.mkvolvotrucks.mnvolvotrucks.myvolvotrucks.netvolvotrucks.nlvolvotrucks.novolvotrucks.pevolvotrucks.phvolvotrucks.pkvolvotrucks.plvolvotrucks.psvolvotrucks.qavolvotrucks.rovolvotrucks.rsvolvotrucks.ruvolvotrucks.sevolvotrucks.sgvolvotrucks.sivolvotrucks.skvolvotrucks.tmvolvotrucks.tnvolvotrucks.uyvolvotruckcenter.bevolvotruckcenter.dkvolvotruckcenter.esvolvotruckcenter.fivolvotruckcenter.itvolvotruckcenter.krvolvotruckcenter.kzvolvotruckcenter.nlvolvotruckcenter.novolvotruckcenter.sevolvotruckrental.beudtrucksmeena.com mastercard.ae mastercard.at mastercard.az mastercard.ba mastercard.be mastercard.bg mastercard.by mastercard.ca mastercard.ch mastercard.cl mastercard.cn -cnmastercard.co.idmastercard.co.ilmastercard.co.inmastercard.co.jpmastercard.co.kemastercard.co.krmastercard.co.nzmastercard.co.thmastercard.co.ukmastercard.co.vemastercard.co.zamastercard.commastercard.com.armastercard.com.aumastercard.com.bhmastercard.com.brmastercard.com.bzmastercard.com.cn -cnmastercard.com.comastercard.com.cymastercard.com.egmastercard.com.gemastercard.com.gtmastercard.com.hkmastercard.com.kwmastercard.com.lbmastercard.com.mxmastercard.com.mymastercard.com.ngmastercard.com.pemastercard.com.phmastercard.com.samastercard.com.sgmastercard.com.trmastercard.com.twmastercard.com.vemastercard.com.vn mastercard.cz mastercard.de mastercard.dk mastercard.es mastercard.eu mastercard.fi mastercard.fr mastercard.gr mastercard.hr mastercard.hu mastercard.iemastercard.inc mastercard.it mastercard.jo mastercard.ke mastercard.kz mastercard.lu mastercard.md mastercard.my mastercard.nl mastercard.no mastercard.om mastercard.pl mastercard.pt mastercard.qa mastercard.ro mastercard.rs mastercard.ru mastercard.se mastercard.si mastercard.sk mastercard.ua mastercard.usareyoucreditwise.comborderlessprepaid.combranchportal.com idservice.incinclusivegrowthscore.com findacard.com mastercad.commastercard-email.commastercardacademy.commastercardadvisors.commastercardcenter.commastercardcenter.org*&mastercardcenterforinclusivegrowth.orgmastercardconnect.commastercardezsavings.commastercardidtheftalerts.commastercardrestaurant.commastercardservices.commastercardworldwide.commasterpassteststore.commasterintelligence.commcpeaceofmind.commyaccountglobalcash.commycardbenefits.comonedinesfree.com paypass.netpieceofplastic.compredictivetechnologies.com priceless.com pricelessmarketingengine.comsbitravelcard.comshoppercentre.com!smartcommunitiescoalition.com!smartcommunitiescoalition.org startpath.comtaptotokyo.comtasteofpremium.jptravelcontroller.comwwwpaypass.combecomeindex.comcashpassport.cacashpassport.co.zacashpassport.comcashpassport.com.brcashpassport.netcorporatecashpassport.comicashpassport.com.mxintercamcashpassport.com.mx!multicurrencycashpassport.comshinhangmc.commastercardbiz.camastercardbiz.com!mastercardbusinessnetwork.com -nab.com.aunabtravellercard.com.au 53world.com53worldsweeps.comlovethiscity.commastercardmoments.compahabicilemezsurprizler.com priceless.compriceless.com.cn -cn priceless.orgpricelessafrica.compricelessarabia.compricelessaruba.compricelessbeijing.cn -cnpricelessbeijing.com#pricelessbeijing.com.cn -cnpricelesshongkong.compricelesshonolulu.compricelesspick.compricelesssantiago.compricelesssydney.compricelesssurprises.compricelesstoronto.capricelesstv.com simplify.comsimplifycommerce.comcashpassportglobe.comgwktravelex.nl travelex.be travelex.bh travelex.catravelex.co.intravelex.co.jptravelex.co.nztravelex.co.uk travelex.comtravelex.com.autravelex.com.cn -cntravelex.com.hktravelex.com.mytravelex.com.omtravelex.com.tr travelex.de travelex.fr travelex.it travelex.qatravelexae.comtravelexch.comtravelexmoneycard.combidvestbank.co.zaworldcurrencycard.co.zanab.demdex.net&"nationalaustraliaban.tt.omtrdc.netaccount-paypal.infoaccount-paypal.netaccount-paypal.orgaccountpaypal.comaccountpaypal.netaccountpaypal.org anfutong.cn -cn anfutong.comanfutong.com.cn -cn beibao.cn -cn -beibao.com beibao.com.cn -cn bill-safe.combillmelater.combillmelater.infobillmelater.net bml.infobuyfast-paysmart.net cashify.comdevtools-paypal.comexperiencebillmelater.comfundpaypal.com -gmoney.org -i-o-u.infologin-paypal.comlogin-paypal.infomywaytopay.infomywaytopay.net -pa9pal.com paaypal.com  paily.net  paily.org -paipal.com -pavpal.com paydiant.com paylike.com -paypa1.com -paypa1.org paypaal.compaypal-activate.compaypal-activate.infopaypal-activate.orgpaypal-apac.compaypal-apps.compaypal-biz.compaypal-brandcentral.compaypal-business.compaypal-business.netpaypal-business.orgpaypal-cardcash.compaypal-cash.compaypal-center.compaypal-center.infopaypal-center.netpaypal-center.orgpaypal-communication.compaypal-communications.compaypal-communications.netpaypal-community.compaypal-community.netpaypal-comunidad.compaypal-corp.compaypal-database.compaypal-database.uspaypal-donations.compaypal-dynamic.compaypal-engineering.compaypal-europe.compaypal-excelinvoicing.compaypal-exchanges.compaypal-forward.compaypal-galactic.compaypal-gift.compaypal-gifts.compaypal-gpplus.compaypal-here.compaypal-hrsystem.compaypal-innovationlab.compaypal-integration.compaypal-japan.compaypal-knowledge.compaypal-labs.compaypal-latam.compaypal-learning.compaypal-login.compaypal-login.infopaypal-login.orgpaypal-login.uspaypal-luxury.compaypal-mainstreet.netpaypal-marketing.compaypal-media.compaypal-merchantloyalty.compaypal-mobilemoney.compaypal-network.orgpaypal-notice.compaypal-notify.compaypal-online.infopaypal-online.netpaypal-online.orgpaypal-optimizer.compaypal-pages.compaypal-photocard.compaypal-plaza.compaypal-portal.compaypal-prepagata.compaypal-prepagata.netpaypal-prepaid.compaypal-profile.compaypal-proserv.compaypal-qrshopping.orgpaypal-recargacelular.compaypal-redeem.compaypal-referral.compaypal-retail.compaypal-scoop.compaypal-search.compaypal-secure.netpaypal-secure.orgpaypal-security.netpaypal-security.orgpaypal-service.orgpaypal-signin.compaypal-signin.uspaypal-special.compaypal-specialoffers.compaypal-sptam.compaypal-support.compaypal-survey.compaypal-survey.orgpaypal-status.compaypal-team.compaypal-viewpoints.net  paypal.ca -paypal.com paypal.com.cn -cn paypal.com.hk paypal.com.sg  paypal.hk paypal.info  paypal.jp  paypal.me paypal.net.cn -cn paypal.org.cn -cn  paypal.so  paypal.uspaypalbeacon.compaypalbenefits.compaypalbrasil.compaypalcommunity.cn -cnpaypalcommunity.compaypalcommunity.netpaypalcommunity.orgpaypalcorp.compaypalcredit.compaypalcreditcard.compaypalgivingfund.org paypalhere.cn -cnpaypalhere.compaypalhere.com.cn -cnpaypalhere.infopaypalhere.netpaypalhere.org paypalhere.tv paypali.net paypalinc.compaypalindia.compaypalinsuranceservices.org paypall.compaypallabs.com paypalme.com paypalnet.net paypalnet.orgpaypalnetwork.infopaypalnetwork.netpaypalnetwork.orgpaypalobjects.compaypalonline.netpaypalonline.orgpaypalprepagata.compaypalprepagata.netpaypalservice.compaypalshopping.compaypalshopping.netpaypalsurvey.com paypalx.com paypaly.com payppal.com payypal.compdncommunity.com -pp-soc.com ppaypal.com  pppds.com pypl.com  pypl.info pypl.net pypl.tvsecure-paypal.infosecurepaypal.info sslpaypal.orgthepaypalshop.comtheshoppingexpresslane.netwww-paypal.info www-paypal.usxn--bnq297cix3a.cn -cnbraintreegateway.combraintreegateway.tvbraintreepayments.combraintreepayments.infobraintreepayments.orgbraintreepayments.tv!braintreepaymentsolutions.combraintreeps.combriantreepayments.netbriantreepayments.tv card.iogetbraintree.com krakenjs.comloanbuilder.comswiftcapital.com simility.com cashify.netswiftbank.info swiftbank.usswiftfinancial.comswiftfinancial.infoswiftfinancial.netvenmo-touch.com  venmo.com -venmo.info  venmo.net  venmo.org  cash2.comfilipino-music.net -s-xoom.comwebmoneyinfo.com2.wiremoneytoirelandwithxoomeasierandcheaper.com wwwxoom.comxoom-experience.com xoom.com xoom.io xoom.net.cn -cn xoom.us xoomcom.comvenmo.s3.amazonaws.com softbank sb-mobile.jpsb-telecom.netsoftbank-ipo.comsoftbank-jp.comsoftbank-robotics.comsoftbank-telecom.comsoftbank-telecom.net softbank.jp softbank.tvsoftbankbb.comsoftbankbb.netsoftbankci.comsoftbankhawksstore.jpsoftbankmobile.netsoftbankrobotics.comsoftbanktelecom.comsoftbankusa.netsoftbankventuresasia.comsoftbankworld.com -stripe.comstripe.network stripecdn.com visa.be visa.ca visa.clvisa.cn -cn -visa.co.ao -visa.co.cr -visa.co.id -visa.co.il -visa.co.in -visa.co.jp -visa.co.ke -visa.co.ni -visa.co.nz -visa.co.th -visa.co.uk -visa.co.ve -visa.co.za visa.com visa.com.ag visa.com.ai visa.com.ar visa.com.au visa.com.az visa.com.bo visa.com.br visa.com.bs visa.com.bz visa.com.cn -cn visa.com.co visa.com.cy visa.com.dm visa.com.do visa.com.ec visa.com.ge visa.com.gt visa.com.gy visa.com.hk visa.com.hn visa.com.hr visa.com.jm visa.com.kh visa.com.kn visa.com.kz visa.com.lc visa.com.lk visa.com.ms visa.com.mx visa.com.my visa.com.ng visa.com.pa visa.com.pe visa.com.ph visa.com.pr visa.com.py visa.com.ru visa.com.sg visa.com.sv visa.com.tr visa.com.tt visa.com.tw visa.com.ua visa.com.uy visa.com.vc visa.com.vi visa.com.vn visa.cz visa.de visa.dk visa.es visa.fi visa.fr visa.gd visa.gp visa.gr visa.hk visa.hu visa.ie visa.is visa.ky visa.lt visa.lv visa.mn visa.mq visa.nl visa.no visa.pl visa.pt visa.ro visa.se visa.sk visa.so visa.sx visa.tc -visabg.com visaeurope.at visaeurope.ch visaeurope.lu visaeurope.sivisaitalia.com visakorea.comvisamiddleeast.comvisasoutheasteurope.comfinlitsummit.orgmyvisaluxuryhotels.comvisainfinite.cavisainfiniteluxuryhotels.ca!visaluxuryhotelcollection.com$ visaluxuryhotelcollection.com.br$ visaluxuryhotelcollection.com.mxvisaluxuryhotels.comvisaluxuryhotels.com.arvisasignaturehotels.com($connaissancesfinancierespratiques.ca dnsvisa.comeubluecardvisa.comfinancialsoccer.ca"financialsoccer.com.cn -cnlightbridge.commiamifintechfestival.commhshosting.compracticalbusinessskills.compracticalmoneyskills.ca#practicalmoneyskills.cn -cn'practicalmoneyskills.com.cn -cnpracticalmoneyskills.jpsoccerfinancier.catorcidadeouro.com vaultify.com vaultify.info vaultify.net visa-atm.com visa-news.jp visabank.orgvisabusinessinsights.comvisacarddesignlab.com visacards.comvisacheckout.netvisacheckout.orgvisaconciergelac.comvisadigital.comvisadigitalconcierge.com visadns.comvisadpsonline.usvisaeverywhereshop.comvisafintechfasttrack.comvisafulfillment.comvisagiftcard.usvisaglobalfinance.comvisaicsdirect.comvisainfinite.cavisainfinite.cn -cn visanet.net -visapay.cn -cnvisapcsdirect.comvisaplatinum.cn -cnvisaplatinum.com.cn -cn visaplus.comvisasavingsedge.cavisasignature.co.kr visb.org ak1.net -aka-ai.com -aka-ai.net akacrypto.net akadeem.net -akadns.com akadns6.net -akaeai.com -akafms.net akahost.net -akaint.net akam.net -akamaa.com -akamah.com -akamak.com -akamam.comakamai-access.comakamai-access.netakamai-cdn.com akamai-platform-internal.netakamai-platform-staging.comakamai-platform.netakamai-regression.netakamai-staging.netakamai-sucks.netakamai-thailand.comakamai-thailand.netakamai-trials.com akamai.co.kr -akamai.com -akamai.netakamaientrypoint.netakamaietpcnctest.com#akamaietpcompromisedcnctest.com'#akamaietpcompromisedmalwaretest.comakamaietpmalwaretest.comakamaietpphishingtest.comakamaihd-staging.net akamaihd.com akamaihd.netakamaimagicmath.netakamainewzealand.comakamaiphillipines.comakamaiphillipines.netakamaitech.comakamaitech.netakamaitechnologies.comakamaitechnologies.netakamaisingapore.netakamaized-staging.net akamaized.netakamaizercentral.com -akamci.com  akami.com  akami.net -akamii.com -akamqi.com akastream.com akastream.net -akatns.net iamakamai.com iamakamai.netsoasta-dswb.com -srtcdn.netcloudflare-dns.comcloudflare-ipfs.comcloudflare.comcloudflareapps.comcloudflareinsights.comcloudflareok.comcloudflaressl.comcloudflarestatus.comcloudflarestream.comcloudflaretest.com one.one.onetrycloudflare.comvideodelivery.net workers.dev -fastly.com -fastly.netfastlylabs.com fastlylb.netfastly-terrarium.com -zencdn.net  imgix.com  imgix.net pagecdn.com -pagecdn.io quantil.com stackpath.com stackpath.devbuypass-ssl.com buypass.com -buypass.no -buypass.se minid.no -comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.comcybertrust.co.jpcybertrust.ne.jp digicert.com freessl.com geotrust.com rapidssl.com -thawte.com  thawte.de  thawte.fr entrust.netentrustdatacard.comglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com -cnocsp.globalsign.com -cn ocsp2.globalsign.com -cn identrust.comidentrust.co.uk identrust.netletsencrypt.org secom.co.jpsecomtrust.net sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch -swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch telekom.com -telekom.de trustwave.com verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com -discord.co discord.com -discord.gg discord.gift discord.gifts discord.media discord.newdiscordapp.comdiscordapp.net freenode.net -lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net -nhncorp.jp -signal.art -signal.orgsignalusers.orgslack-edge.comslack-imgs.com  slack.com -slackb.comslackcertified.com slackdemo.com slackhq.com contest.com  graph.orgquiz.directoryt.me tdesktop.com -telega.one -telegra.ph telegram.dog telegram.me telegram.orgtelegram.space -telesco.pe -tg.dev tx.meusercontent.dev asproex.comasproexapi.combinance.charity binance.cloud binance.combinance.vision binancezh.com bnbstatic.com yshyqxx.com -bitbank.cc bitcoin.org bitfinex.com bitflyer.com bitflyer.jp -bitmex.com bitquick.co bisq.io bisq.network bitsquare.io bitstamp.net bittrex.com btcbox.co.jp -cex.io coinbase.com coinone.co.krcoinonecore.comcoinonecorp.com dogecoin.com -devcon.orgethereum.foundation ethereum.org -hbabit.com -hbfile.net  huobi.com huobi.me  huobi.pro huobi.sc huobiasia.viphuobigroup.comhuobitoken.com -kraken.comlocalbitcoins.comlocalbitcoinschain.com okex.com -paxful.com -zb.app -zb.com zb.io zb.live  adidas.at  adidas.be  adidas.ch adidas.co.in adidas.co.uk -adidas.com adidas.com.cn -cn adidas.com.sa adidas.com.tw  adidas.cz  adidas.de  adidas.dk  adidas.hu  adidas.ie  adidas.it  adidas.nl  adidas.pl  adidas.ru  adidas.se bby.combbycastatic.ca bbycloud.combbycontent.combbycontent.net bbyintl.com bbystatic.com  bbyurl.us bestbhy.combestbuy-audio.com"bestbuy-communityrelations.combestbuy-giftcard.infobestbuy-int.combestbuy-jobs.com -bestbuy.ca -bestbuy.cn -cn bestbuy.combestbuy.com.cn -cnbestbuy.com.mx bestbuy.infobestbuy24x7solutions.combestbuybusiness.com'#bestbuybusinessadvantageaccount.combestbuycanada.cabestbuycanada.combestbuycanadaltd.cabestbuycharityclassic.combestbuycoffeemakers.combestbuyethics.combestbuyforbusiness.cabestbuygsm.combestbuyideax.com!bestbuyphotoworkshoptours.combestbuyrewards.combestbuyrewardzone.ca bestbuys.combestbuysgeeksquad.combestbuysolutions.netbestbuystores.combestbuytradein.com bestbuyus.com besztbuy.com bextbuy.combienvenuechezbestbuy.ca cowboom.com futureshop.cainitproducts.commagnoliaav.com.cn -cn mybestbuy.commybestbuyclaims.commyrewardzone.com myrz.compacifickitchenandhome.comtiendabestbuy.comunbrandedproducts.comwelcometobestbuy.cawolfatbestbuy.comwolfatbestbuy.netwww-bestbuystores.comgeek-squad-support.comgeek-squad.netgeek-squad.orggeek-squads.net geeksquad.ca geeksquad.cc geeksquad.com geeksquad.net geeksquad.tvgeeksquadcares.comgeeksquadcentral.comgeeksquadforums.comgeeksquadonline.comgeeksquadprotectionplan.orggeeksquadservices.orggeeksquadwebroot.org gscanada.info -gsccdn.com  gslink.usonlinegeeksquad.comrocketfishproducts.com dealtree.orgtechliquidators.com -booking.cn -cn booking.com bstatic.comcostco-static.com -costco.comcostcobusinessdelivery.comcraigslist.org dmm.com  dmm.co.jpdmm-extension.com21centuryaccess.com4ebaytraders.com adcommerce.cn -cn adcommerce.tv appforebay.cn -cnappsonebay.net -asebay.com -baazee.com -bidbay.combidorbuyindia.com billpoint.combillpoint.info billpoint.tv billpoint.usbillpointnewzealand.com blogebay.combookclubcorner.combuiltfromebay.com buyitnow.com buyitnow.net buyitnow.org buyitnow.tvbuyitnowshop.net cafr.ca carebay.comcargigileads.com  cebay.comcollective99.comcommerceos.comconnectcommerce.cn -cn"connectcommerce.com.cn -cnconnectcommerce.hkconnectcommerce.infoconnectcommerce.tv connectedcommerce.cn -cnconnectedcommerce.comconnectedcommerce.tvcrececonebay.comcreditcardsbay.com cyber-bay.cn -cncyber-bay.com.cn -cncyber-bay.info cyber-bay.org -dba.dk dealbay.com dealtime.com  didce.com  douya.orgdreamtoplay.com  e-bay.com e-bay.it  e-bay.net eachpay.com eachpay.net  ebahy.comebay-authenticate.netebay-confirm.comebay-course.com ebay-cz.comebay-delivery.comebay-discoveries.comebay-fashion.com ebay-inc.com ebay-inc.net ebay-inc.orgebay-online.comebay-sales.comebay-stories.com ebay-us.comebay-vacation.com ebay.at ebay.be ebay.ca ebay.chebay.cn -cn -ebay.co.nz -ebay.co.uk -ebay.co.ve -ebay.co.za ebay.com ebay.com.ar ebay.com.au ebay.com.cn -cn ebay.com.ec ebay.com.hk ebay.com.mt ebay.com.my ebay.com.ph ebay.com.sg ebay.de ebay.es ebay.fr ebay.ie ebay.in ebay.it ebay.jp ebay.lt ebay.mn ebay.net.cn -cn ebay.nl ebay.org ebay.org.cn -cn ebay.ph ebay.pk ebay.pl ebay.sg ebay.us ebay.vn -ebay.yn.cn -cn -ebay.zj.cn -cn -ebay25.com -ebay68.com  ebaya.com ebayads.com ebayads.netebayadvertising.cn -cnebayadvertising.comebayanunsios.netebayauction.comebayaustralia.comebayauthenticate.com.cn ebaybags.com ebaybank.comebaybenefits.comebayboutique.com -ebayca.com -ebayca.org ebaycafe.com ebaycar.comebaycareers.com ebaycbt.co.kr ebaycdn.net ebaychina.netebayclassifiedsgroup.comebayclassifieds.cn -cnebayclassifieds.com"ebayclassifieds.com.cn -cnebayclassifieds.infoebayclassifieds.orgebayclassifieds.tvebayclassifiedsgroup.comebayclassifiedsgroup.infoebayclassifiedsgroup.orgebayclassifies.com ebayclub.com ebaycoins.com ebaycom.comebaycommercenetwork.comebaycourse.com  ebayd.com -ebayde.com ebaydesc.cn -cnebaydesc.com.cn -cnebaydlassifieds.com -ebaydns.cn -cn ebaydts.com ebayedu.comebayeletro.comebayenterprise.cn -cnebayenterprise.com!ebayenterprise.com.cn -cnebayenterprise.infoebayenterprise.netebayenterprise.tv ebayetc.comebayexpress.sgebayfashion.comebayfashion.netebayforcharity.orgebayforeclosure.orgebayfrance.comebayglobalshipping.com ebaygroup.com ebayhabit.com ebayheels.com ebayhots.com ebayimg.com ebayinc.com ebayinc.net ebayinc.org ebayincconnectedcommerce.netebayinkblog.comebayinternetsalestax.com -ebayit.comebayjewelry.com ebayjob.com -ebayla.orgebaylisting.com ebaylocal.netebaylocationsdevacances.com ebaymag.comebaymainstreet.com ebaymall.comebaymarketplace.net ebaymotors.ca ebaymotors.cn -cnebaymotors.comebaymotors.com.cn -cnebaymotors.orgebaymotorsblog.com ebaynow.com ebaynyc.com -ebayon.com -ebayon.netebayoncampus.com ebayopen.comebayopensource.comebayopensource.netebaypakistan.net ebaypark.com ebayparts.com ebaypedia.cn -cnebaypedia.com.cn -cnebayprivacycenter.com -ebayqq.com ebayradio.com ebayrtm.comebayseller.comebayshoesstore.com ebayshop.comebayshop111.comebayshopping.cn -cnebayshopping.com.cn -cnebayshopping.orgebaysocial.com ebaysocial.ru ebaysoho.com ebaysohos.com ebaystatic.cn -cnebaystatic.com ebaystore.comebaystore77.com ebaystores.cn -cn ebaystyle.comebaysweden.com  ebayt.comebaytechblog.comebaytopratedseller.netebaytrading.comebaytradingassistant.com -ebaytv.org ebayuae.netebayvakantiehuizen.com ebayvalet.comebayvietnam.netebayworlds.com  ebayy.com edisebay.com  eebay.com epinions.comeu-consumer-empowerment.comexpertmaker.comfairmarket.comfragrancebay.comfrancemail.com half.com half.com.cn -cn half.tvhalfcanada.com halfjapan.comhandbagsoutletebay.com  iebay.com irribay.comitsbetterwhenyouwinit.com liketwice.comliveauction.com milofetch.com musicbay.netmyconstructionworld.net -myebay.com  nebay.net paisapay.cc paisapay.info paisapay.tv premobay.comprivatemarketplaces.netprivatemarketplaces.us prostores.cn -cn prostores.comprostores.com.cn -cn rethink.net shopibay.net shoping.comsourcingforebay.com.cnsourcingforebay.netsourcingforebay.tv speybay.comstoresense.com -svpply.com telebay.com telesell.com texttobuy.orgtheebayshop.comtheopportunityproject.orgtowerauction.com  vendu.com weareebay.comwatch-ebay.org wwwdecide.com wwwebay.com wwwebay.net wwwwebay.com xindelu.comxn--3et96bj49ahpq.comxn--4vq475g.comxn--4vq477m.comxn--7hv594h.comxn--7hvy28f.cn -cnxn--hb4aw0g.comxn--q41am8x.comxn--qoq462m.comxn--tkry91n.comxn--ubt498knmf.comxn--xsq421m.comxn--xsq605n.comxn--xsq959n.comxn--yf1at58a.com  xxbay.com  yibei.orggittigidiyor.netgittigidiyorsikayet.com -gumtree.sg  jijiji.ca kiji.ca kijii.ca kijij.ca  kijiji.ca kijijiauto.cakijijiautos.ca kijijidns.cn -cnkijijidns.com.cn -cnkijijiforbusiness.ca -kijijii.ca kijijiraps.ca kijji.ca -kijjiji.ca automobile.fr  mobile.demobileinternational.com&mobileinternational.com.cn -cn -q10.jp qoo10.jpachievementanalytics.comcdn-terapeak.comlistinganalytics.netmarketexecutive.net tearapeak.com terapeack.com terapeak.ca terapeak.cn -cn terapeak.comterapeak.com.hk terapeak.hk terapeak.info teraperk.com terrapeak.com thebayuk.com -nexcat.com nexpart.com -nexpart.tv renchead.comwhisolutions.com wrenchead.com-)ebay-25-assets.s3-us-west-1.amazonaws.comfarfetch-apps.comfarfetch-contents.com farfetch.cn -cn farfetch.comfarfetch.com.cn -cn farfetch.netfarfetch.net.cn -cn  fflnk.net guccichimeforchange.orggucci.cn -cn  gucci.comguccimuseo.comguccitimeless.comregiongold.com -hm.com hm.com.cn -cnhomedepot-static.com homedepot.comikea.cn -cn ikea.com ikea.net  ingka.com  ingka.devingkacentres.comloveminiso.com.br miniso-au.com miniso-bh.com miniso-np.com miniso-nz.com  miniso.by  miniso.ca miniso.cn -cn  miniso.co miniso.co.id miniso.co.tz -miniso.com miniso.com.es miniso.com.gr miniso.com.mx miniso.com.pl miniso.com.py miniso.com.tr  miniso.ge  miniso.ie  miniso.jp  miniso.ma  miniso.my  miniso.pe  miniso.pk  miniso.ua  miniso.uz minisohome.cn -cnminisoindia.comminisojordan.comminisokorea.comminisolife.co.zaminisothailand.comminisovietam.vn minsio.cn -cn myminiso.com muji.com muji.com.cn -cn muji.com.hk muji.eu muji.net muji.tw muji.us mujikorea.netnikeair-nike-shoes.com airmax360.combeijingnike.combetternike.combuynikechina.comcheap-nike.comcheapnikedunks.comcheapnikeoutlet.comclassicnike.comcnnikebrand.comcustomnikeshoes.com easynike.com -eenike.comfashionnike.com finenike.comfoampositeshoes.comgoldnikeclub.com -gonike.comhandbags-nike.comhightopnikes.com -idnike.cominikesneakers.com just-do-it.cn -cn justdoit.uskicksnike1.comkidsnikeshoes.com -mynike.comnike-air-max.comnike-dunksb.com nike-fr.com nike-org.com nike-shox.cn -cn nike-uk.com nike-us.com nike-usa.com nike.cinike.cn -cn nike.com nike.com.br nike.com.hk nike.gy nike.hk  nike.shop nike.usnike.xn--hxt814e nike0594.com -nike23.comnikeadidas.comnikeairhuarache.comnikeairmax.comnikeairmaxs.comnikeairmaxshoes.comnikeairrift.com nikeasia.comnikeaustralia.com nikeaw77.com  nikeb.com nikebbn.comnikebetrue.comnikebetterworld.cn -cnnikebetterworld.com"nikebetterworld.com.cn -cnnikebetterworld.infonikebetterworld.netnikebetterworld.org nikebiz.info nikebuy.com -nikeby.com nikecdn.comnikecompany.comnikeconfluence.com nikechina.cn -cnnikechosen.com nikecloud.com nikeclub.com nikecraft.com nikedawn.com nikedunks.netnikedunksshoes.com nikeelite.comnikefactorystore.com nikefind.com nikefirm.comnikefoamposites.comnikefoampositeshoes.comnikefootballcleats.comnikefootballgloves.comnikefootballjersey.comnikefoundation.org -nikefr.comnikefrance.com nikefree.comnikefreeshoes.comnikefuelband.comnikegadgets.comnikegenealogy.com nikegolf.ca nikegolf.cn -cn nikegrid.com nikehelp.comnikehightops.comnikehyperdunk.com nikeid.cn -cn nikeid.com.cn -cnnikeidshoes.com nikeinc.comnikeinc.com.cn -cnnikeincchemistry.comnikeinstock.com -nikeit.comnikeitalia.com nikeitaly.com -nikekd.com nikekid.com -nikelab.cn -cnnikelab.com.cn -cn nikelink.comnikeliuxiang.cn -cnnikeliuxiang.comnikeliuxiang.com.cn -cn nikelives.comnikelunarglide.com nikemall.cn -cnnikemall.com.cn -cnnikemarketing.com nikenews.com -niken7.comnikeonlinestore.comnikeoutletstore.comnikeoutletstores.comnikepioneer.com nikeplus.com nikeplus.org nikepress.com nikeprice.comnikeproduct.comnikepromax.comnikeresponsibility.comnikereuseashoe.comnikerunclub.cn -cnnikerunclub.com.cn -cnnikerunner.comnikerunning.com.cn -cnnikerunningshoes.com -nikesb.comnikesbdunks.netnikeseason.comnikeselling.comnikesellorder.comnikeshoemarket.comnikeshoes-store.comnikeshoes21.comnikeshoes4u.comnikeshoescity.comnikeshoesgroup.comnikeshoesinc.comnikeshoesmarket.comnikeshoesretro.comnikeshoeswon.comnikeshoponline.comnikeshoxsale.com nikesku.comnikesnowboarding.comnikesoccercleats.comnikesportswear.comnikestares.com nikestore.cn -cn nikestore.comnikestore.com.aunikestyles.com nikeswim.comniketaiwan.netniketracking.comniketradeweb.comniketrainer.comniketrainers.comniketraining.com nikeusa.com nikewear.com  nikey.com nikezoom.com nke6.comoutletnike.com runnike.comrunningnike.comsale-nikeshoes.comstatic-nike.com swoo.sh -swoosh.com  swoosh.tvthedailysnkr.comverygoodnike.comwomensnikeshox.comxn--74q035i.xn--hxt814e nordstrom.comnordstrommedia.com shopee.cn -cn shopee.co.id shopee.co.th -shopee.com shopee.com.br shopee.com.my  shopee.ph  shopee.sg  shopee.tw  shopee.vnshopeemobile.com shopeesz.com -cn -shp.ee -target -target.comtargetimg1.com walmart wal-mart.com -wal.cowalmart-content.com walmart.comwalmart.pharmacywalmartimages.com -wmt.cobetterexplained.com brilliant.org apa.orgpsyccareers.com cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.orgnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com doi.org doi.info els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com -scopus.comscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.commit mit.edu mit.netmitpressjournals.orgamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com -ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.comserialssolutions.com proquest.comsciencedirect.comsciencedirectassets.com -apress.com springer.comspringerlink.comspringernature.com wkap.nl tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com -aclweb.org acm.org altmetric.comanalytictech.comannualreviews.org  arxiv.org asha.org berkeley.edubiomedcentral.com biorxiv.org  brill.com cell.comcomputingreviews.com degruyter.comdentalhypotheses.comelifesciences.org europepmc.orgfrontiersin.org gale.com galegroup.com  ggsrv.com hindawi.com informs.orgisca-speech.orgjamanetwork.comjapanknowledge.comjbe-platform.com jmlr.org jneurosci.org  jstor.org kuke.comlawdata.com.twliteratumonline.com mdpi.com -nature.com nejm.org neurology.org ovid.com  peerj.comphysiology.org plos.org pnas.org princeton.eduresearchgate.netroutledgehandbooks.comroyalsocietypublishing.org sagepub.comscholarpedia.orgsciencemag.orgscientificamerican.com scitation.orgsilverchair-cdn.comspiedigitallibrary.orgstatsmakemecry.com thelancet.com uchicago.edu ucla.edu  umass.edu  wiley.com yale.educern ams02.space cern.ch cixp.netdotcernpilot.info  ippog.orglinearcollider.orgchinapower.csis.org code.orgcodecademy.comcoursera-for-business.orgcoursera.community coursera.help coursera.org edx.org edx-cdn.org -egghead.iofreecodecamp.orgkhanacademy.org kastatic.org -knovel.com laracasts.commasterclass.com mzed.com oreil.ly oreilly.comoreilly.com.cn -cnoreilly.revieworeillystatic.com -orl.ly sitepoint.comskillshare.com ted.com -tedcdn.com udacity.com  udemy.com udemycdn.com w3schools.com abema.io abema.tv ameba.jp ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net -att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net bandcamp.com -bcbits.com bethesda.net doom.comelderscrolls.com blizzard.cn -cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn -cn -battle.netbattlenet.com.cn -cn bnet.163.com -cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com -cn!diablo3.nosdn.127.net -cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net -cnheroesofthestorm.com%hearthstone.nosdn.127.net -cn"heroes.nos.netease.com -cnplayoverwatch.com#overwatch.nosdn.127.net -cn starcraft.comstarcraft2.comsc2.nosdn.127.net -cnplaywarcraft3.comworldofwarcraft.com wowchina.com -cnwow.nosdn.127.net -cnblizzcon-a.akamaihd.netblz.nosdn.127.net -cnblzmedia-a.akamaihd.netblznav.akamaized.net blubrry.com  castro.fmdeviantart.comdeviantart.net da-files.comabc-studios.com abc.com edgedatg.com espn.com espncdn.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net -marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com -babble.com -dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.ca -disney.com disney.com.br  disney.iodisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneytvajobs.comdisneyworld-go.com -dssott.comgo-disneyworldgo.com -go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com dawngate.com eastore.comlordofultima.com -origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com -dicela.com -dicela.netea-anz-press.com -ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com -eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com -popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com -tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com -yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com -pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com -skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net -mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com -uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.netbattlebreakers.com epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ -cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ -cn fireside.fm gog.comgog-statics.comgog.qtlglb.com -cn$gogalaxy.gog-statics.com -cn'menu-static.gog-statics.com -cn'productcard.gog-statics.com -cn(static-login.gog-statics.com -cn'www4-static.gog-statics.com -cn, ^images(-\d)?\.gog-statics\.com$ -cn cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk -hbomax.com -hbonow.com  maxgo.com -112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com -huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com -hulugo.com -huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com -huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com -hulutv.com huluusa.comjoinmaidez.com mushymush.tv -myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com imdb.com imdb.tomedia-imdb.cominternationalsaimoe.comkingkong.com.twkingkongapp.com litv.tv megaphone.fm moov.hk fast.com -netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net -nflxso.net nflxvideo.netnico -nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp100classicbooks.com -amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn -cn legendofzelda.com.cn -cn miitomo.commiitomo.com.cn -cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn -cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn -cn!supersmashbros.com.cn -cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com -dialga.com giratina.com -kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn -cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn -cnmariokart.com.cn -cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn -cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com -wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com op.ggopgg-static.akamaized.net overcast.fm  pixiv.net  pixiv.org pixiv.co.jp  pximg.net playstationplaystation.complaystation.net sonyentertainmentnetwork.com -pca.stpocketcasts.comhistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn -cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net -lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com -lpl.com.cn -cn pvp.net -pvp.tv ulol.comlolstatic-a.akamaihd.netrockstargames.com -rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com dishworld.comslinginternational.com  sling.commovenetworks.com -movetv.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com -wwtbam.comyourfantasybeginsnow.comsoundcloud.com -sndcdn.com byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com fanatical.comhumblebundle.complayartifact.com -s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com -cn csgo.wmsj.cn -cndl.steam.ksyna.com -cn dota2.wmsj.cn -cn st.dl.bscstorage.net -cnst.dl.eccdnx.com -cn!st.dl.pinyuncloud.com -cn&steampowered.com.8686c.com -cn%steamstatic.com.8686c.com -cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.netsteamunlocked.net syosetu.com -muscdn.com -musical.ly -tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com -cn -vhx.tv -vhxqa1.com -vhxqa2.com -vhxqa3.com -vhxqa4.com -vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com abow.jp angelbeats.jp -anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp -viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net -weverse.io wwe.com wwe9.comcallersbane.com minecraft.netminecraftshop.com -mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org -xbox360.co xbox360.com -xbox360.eu xbox360.org -xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn -cn xboxlive.com -xboxone.co xboxone.com -xboxone.euxboxplayanywhere.comxboxstudios.com yande.re -got001.com -got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrysapp.com  yyets.com zmz2019.com -zmzapi.com cvnad.com -ads -iyoowi.com -ads -0x0.st db.ttdropbox-dns.com dropbox.com dropbox.techdropboxapi.comdropboxbusiness.comdropboxcaptcha.comdropboxforum.comdropboxforums.comdropboxinsiders.comdropboxmail.comdropboxpartners.comdropboxstatic.comdropboxusercontent.comgetdropbox.com&"paper-attachments.s3.amazonaws.com -gfycat.com  imgur.com imgurinc.com embed-cdn.comstreamable.com 4cdn.org  4chan.org 4channel.org 2ch.net 5ch.net avsforum.com dcard.io dcard.tw  doom9.org -lih.kg  lihkg.com pincong.rocks  quora.com quoracdn.net qr.ae -reddit.comredditstatic.comredditmail.comredditmedia.com redd.it 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au -mi9.com.au -mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au9to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com afp.com afpforum.com -ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.comamericasvoice.news -ap.org -apnews.comappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk -atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.comappleinsider.com  asahi.com asahicom.jpasahishimbun.sc.omtrdc.netbbc  bbc.co.uk bbc.com -bbci.co.uk bbgwatch.com  bloomberg bbgevent.com bbhub.io -bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.brbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweekmag.comlondonmithraeum.comneweconomyforum.comnewenergyfinance.comtechatbloomberg.com  boxun.combowenpress.com breitbart.comcabletv.com.hk i-cable.comcaijinglengyan.comcbs showtime cbs.comcbscorporation.com cbsi.com -cbsi.video -cbsiam.com  cbsig.net -cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com -viacbs.com -viacom.com viacomcbs.comviacomcbspressexpress.com paramount.comchinadecoding.comchinadigitaltimes.net cnbc.com -cnbcfm.com -nbcuni.comnbcudigitaladops.com cnn.com -cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com -cup.com.hk d100.net  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk -mol.imthisismoney.co.uk -thismon.ee -dw.com dajiyuan.com dajiyuan.euepochmediagroup.comepochstories.com epochtime.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimestr.com epochweek.comepochweekly.com erabaru.netlagranepoca.com ntd.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz -forbes.com forbesimg.comfoxfox-corporation.com fox-news.com fox.com -fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com -fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com -fox5dc.com -fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com -foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv -foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com -foxest.com -foxfaq.com -foxfdm.com foxfiles.com -foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com -foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com -foxnews.cc foxnews.com foxnews.net foxnews.org -foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com -foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com -fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com -anidom.comcasoneexchange.comcoronavirusnow.com -fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com -my13la.com -my20dc.commy20houston.com -my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com -q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.netfreebeacon.comgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.comglobalvoices.orgglobalvoicesonline.org  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com hk01.com hkcnews.com hkopentv.com fantv.hkhongkongfp.comhuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com inmediahk.netbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com jfengtime.com landofhope.tvlocalpresshk.com -ltn.com.tw yes123.com.tw macrumors.com matters.news matters.one -medium.commedium.systems -myradio.hkmyradio.com.hkdreamworks.com cnbc.com -cnbcfm.com  msnbc.com -nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com -nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.comandysparis.com newsmax.com -newsmax.in newsmaxtv.com newyorker.com -nikkei.com  nikkei.jp nikkei.co.jp now.com -now.com.hk nowe.com -now-tv.comnow-ashare.com nyt.com nyt.net nytcn.me  nytco.com nytimes.com nytstyle.comtimestalks.com aweencore.com  awetv.comherringnetwork.com oanencore.com oann.compassiontimes.hk qmap.pubrealvision.com reuters.com -reuters.tvreutersmedia.net rfa.org -rfi.fr rsf.org -rt.com etvonline.hk rthk.hk -rtings.com scmp.com -i-scmp.comshuziyimin.orgsinoinsider.com slashdot.orgsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.comsoundofhope.org theguardiandev-guardianapis.comdev-theguardian.com -gu-web.netguardianapis.comguardianapps.co.uk -guim.co.uktheguardian.comtheguardiandns.comtheinitium.com  init.shopthenationalpulse.comthestandnews.comdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie thetype.cloud -cn thetype.comtypeisbeautiful.com udn.com -udn.com.twudnfunlife.com  unwire.hkamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.ru insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com -voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com cstatic.net -curbed.com  eater.comfunnyordie.com meridian.net polygon.com -racked.com -recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com -voxops.net warroom.orgwashingtonpost.com watchout.tw -waa.tw -wenzhao.castartupschool.orgycombinator.com -zaobao.com zaobao.com.sg  zaobao.sg zerohedge.com zoomingin.tv aomedia.org archive.org  atypi.org -change.org ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net csis.orgcsis-prod.s3.amazonaws.comemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.laglobalsecurity.org ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org -ieeer5.org -ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org -comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org ietf.org itu.int nist.gov time.gov openmaps.orgopenstreetmap.comopenstreetmap.netopenstreetmap.orgopenstreetmaps.org osm.orgosmfoundation.orgstateofthemap.comstateofthemap.orgrolfoundation.orgrolsociety.org  smpte.org -un.org -w3.org who.int wto.org  1pondo.tv -91porn.com  avgle.com avn.com beeg.com bongacams.com -bcicdn.com bcrncdn.com -btt804.com -btt904.com -bttzyw.com -bttzyw.net t66y.comchaturbate.com e-hentai.org ehgt.org ehtracker.org -ehwiki.org exhentai.orghentaiverse.org eporner.comfanhaodian.com  hegre.com heydoga.com  heyzo.com hqporner.com -javbus.com javfinder.sh findercdn.me o0-2.com  javhd.comjavlibrary.com -javwide.tv javwide.com kindgirls.comlivejasmin.com dditsadn.com dditscdn.com -metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net netflav.com  pigav.com -pornhd.com -phncdn.com phprcdn.com pornhub.compornhubpremium.com  press.vin redtube.com scoreland.comcdn77.scoreuniverse.com spankbang.comtheporndude.com  tube8.comvaginacontest.com  x-art.com xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com -ads xnxx.com xnxx-cdn.com xvideos.comxvideos-cdn.com youjizz.comyjcontentdelivery.com youporn.comaccuweather.comgetadblock.comadblockplus.org addthis.comaddthiscdn.comaddthisedge.com addtoany.comadguard-vpn.com adguard.com apkpure.com cdnpure.com pureapk.com -winudf.com -arphic.com arphic.com.cn arphic.com.twifontcloud.com -bit.ly  bitly.com bitly.is bitwarden.combigbuckbunny.org blender.orgelephantsdream.org videojs.com bcove.video bcovlive.io bcvp0rtal.com boltdns.netbrightcove.combrightcove.netbrightcove.servicesbrightcovecdn.combcovlive-a.akamaihd.netbcsecure01-a.akamaihd.netbrightcove.imgix.net buymeacoff.eebuymeacoffee.comcloudconvert.comcontentful.com ctfassets.net cutt.lydigitalocean.comdigitaloceanspaces.com -disqus.com disquscdn.comdisqusservice.comduckduckgo.com duck.com -ddg.ggspreadprivacy.com easylist.to lanik.usentermediadb.netentermediadb.org -arcgis.comarcgisonline.com esri.com evernote.com faststone.org -feedly.com  figma.com gofundme.com gravatar.com botstop.com hcaptcha.comhcaptchastatus.com  heroku.co -heroku.com  heroku.me herokuapp.com herokucdn.comherokucharge.com herokussl.comheroku-app.comheroku-charge.com codei.sh -codeish.co -codeish.io iina.ioinfrapedia.com inoreader.com is.gdv.gd -jwpcdn.comjwplatform.com jwplayer.com -jwpltx.com -jwpsrv.comlongtailvideo.comkindle4rss.com kodi.tv  kodi.wiki liberapay.com liberapay.org linguee.com  deepl.com -madshi.net  madvr.com  madvr.net madvrlabs.llc mapbox.cn -cn -mapbox.com -mega.co.nz mega.nz -mpv.io netlify.combitballoon.com  notion.sonotion-static.comopencollective.com osdn.net pastebin.com patreon.com pics.ee  picsee.co -picsee.pro pise.pw pros.ee -pse.is ping.pe protonmail.chprotonmail.comprotonstatus.com pm.me quip-cdn.com quip.comquipelements.com -reabble.cn -cn reabble.com rb.gy rebrandly.com reurl.cc -dns.sb ip.sb loli.net sb.sb sm.msu.nu -www.sb sharethis.com myshopify.com shopify.com shopify.devshopifycdn.comshopifystatus.comshopifysvc.com shorturl.atsourceforge.comsourceforge.net -sf.net fsdn.com startpage.com ixquick.com steemit.com svp-team.com test-ipv6.com ctan.orglatex-project.org -miktex.org tug.org tidelift.com tinyurl.com -trello.com trellocdn.com -tumblr.com -now.shvercel-dns.comvercel-status.com -vercel.app -vercel.comzeit-world.co.ukzeit-world.comzeit-world.netzeit-world.org zeit.co zeit.sh zeitworld.com webflow.com wix.com  wixmp.com wixsite.com wixstatic.comvideopress.com w.org wordpress.com wordpress.org wordpress.tv wp-themes.com -wp.com  wpvip.com -zeplin.dev  zeplin.io zoho.com zoho.com.au zoho.eu zoho.in zohocdn.comzohomeetups.comzohomerchandise.comzohopublic.comzohoschools.comzohostatic.com zohostatic.inzohouniversity.comzohowebstatic.com zoom.com zoom.com.cn zoom.usalpinelinux.org anaconda.com anaconda.org conda.io android.comandroidify.com -apache.orgappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn -cnresearchkit.com.cn -cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io -webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net archlinux.orgarchlinuxarm.org atom.io -badgen.netbootstrapcdn.comgetbootstrap.combraventures.com braveux.com -compass.isfightforux.comforthebadge.comstockagainstphotography.com launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io -ubuntu.com -ubuntu.netubuntuforums.org canonical.com  cdnjs.com -centos.orgchocolatey.org clojure.org -cnpmjs.org -cygwin.com -cython.org dart.dev dartlang.org dartpad.dev -debian.org -dotdeb.org  deno.landcompose-spec.io -docker.com  docker.ioelixir-lang.org -elrepo.org embed.ly embedly.com playerjs.io -erlang.orgaccountkit.comatscaleconference.com botorch.org -buck.build buckbuild.comcomponentkit.org draftjs.org -f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com -fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com -ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com fastlane.cifastlane.tools getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org -ffmpeg.org flathub.org flatpak.org flutter.devflutterapp.comfontawesome.comfortawesome.com freebsd.org  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com -gentoo.orggetcomposer.org git-scm.com gitbook.com -gitbook.iogitbook.zendesk.com  npmjs.com npm.communitydependabot.com -git.io github.blog -github.comgithub.community  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com -gitlab.com  gitlab.io -gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com gnu.org go-lang.com go-lang.net go-lang.org -go.dev  godoc.org -golang.com -golang.net -golang.org  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io haskell.orghaskellstack.org stackage.org brew.shhomebrew.bintray.com -01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net -oneapi.comopenvinotoolkit.orgsnap-telemetry.io -acpica.com clearlinux.cn -cnclearlinux.org -ospray.net -ospray.org -ius.iojava java.com java.net -jenkins.io jetbrains.com jetbrains.net datalore.iokotlinlang.org  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net -js.org jsdelivr.net jsdelivr.comcdn.jsdelivr.net -cn jupyter.org kali.org kubernetes.io -k8s.iolinuxfromscratch.org linuxmint.com lua.org macports.org mariadb.orgadaptivecards.ioapi-extractor.com -apisof.net appcenter.ms -blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com -jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn -cn#microsoftreactor.com.cn -cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn -cn -sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net  mingw.org mongodb.com mongodb.org  mysql.com  nginx.com  nginx.org  nixos.orgnodesource.comnotepad-plus-plus.org -openai.com openresty.org openssl.org opensuse.org openwrt.orglede-project.org packagist.org pcre.org perl.org cpan.org metacpan.org phantomjs.org php.netpolymer-project.orgpolymerproject.orgpostgresql.org -python.orgpythonhosted.org pypa.io pypi.org qt.ioqt-project.org r-project.orgraspberrypi.org raspbian.orgreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org redis.io redislabs.com remirepo.net rpmfusion.org ruby-lang.org rubygems.orgscala-lang.org scala-sbt.orgscientificlinux.org scoop.sh -shields.io -sqlite.org askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.commystrikingly.comstrikingly.comstrikinglycdn.comsublimetext.com -kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org -cnamp.akamaized.netelectronjs.org -jquery.comjquerymobile.com jqueryui.com mochajs.org -nodejs.org openjsf.orglfai.foundationlinuxfoundation.org  unity.com unity3d.com!unityads.unity3d.com -ads#unityads.unitychina.cn -ads  unpkg.com -v8.dev v8project.org videolan.org vim.org wireshark.org x.orgxda-developers.com xda-cdn.com xposed.info yarnpkg.com zsh.orgacer-group.com acer.com acer.com.cn -cn typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com -demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com -omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com -fotolia.cc fotolia.com -fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net -marketo.tvmarketodesigner.commarketolive.com -mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.comalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com amazon-adsystem.com -adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws -amazonimdb -kindle xn--cckwcxetdxn--jlq480n2rg yamaxun -zapposaboutamazon.cn -cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn -cnalexafund.com.cn -cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn -cn amazon.co.jp amazon.co.uk -amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl -amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn -cn!amazonbusiness.com.cn -cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn -cnamazonchoice.com.cn -cnamazonchoices.cn -cn amazonchoices.com.cn -cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn -cn amazoninspire.com.cn -cnamazonlaunchpad.cn -cnamazonlaunchpad.com"amazonlaunchpad.com.cn -cn amazonlending.com.cn -cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn -cnamazonnow.com.cn -cn amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn -cnassociates-amazon.comgameon-masters.comgdansk-amazon.commedia-amazon.com primeday.cn -cnprimeday.com.cn -cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de -yamaxun.cn -cn yamaxun.comz.cn -cn audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn -cnamazonworkdocs.com!amazonworkdocs.com.cn -cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$ kindle.cn -cn kindle.co.jp kindle.co.uk -kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn -cnkindleoasis.comkindleoasis.com.cn -cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn -cn#amazonprimevideo.com.cn -cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com -cn-!images-cn-8.ssl-images-amazon.com -cn amd.comamdfanstore.com -radeon.comiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -ads100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com -aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com -airmay.com -ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com -beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn -cn  beats1.tv beats1.com.cn -cn beats123.com beats2.com.cn -cn beats4.cn -cn -beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com -beatsep.cn -cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com -biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net -bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com -cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com -dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com -lyzsxx.com mairbeats.com -makeeu.commallheadphone.commbeats-tech.commbheadphone.com -micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com -ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com -scnshop.cc -shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com -theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net -unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn -cnappleicloud.cn -cnapplemx-icloud.comicloud-apple.cn -cnicloud-content.comicloud-isupport.com  icloud.ch -icloud.com icloud.com.cn -cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn -cn  icloud.om -icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn -cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com -icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com -me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn -cn itun.es itunbes.com ituneas.comitunes-apple.cn -cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th -itunes.com  itunes.hk  itunes.mx -itunes.org -itunes.rio  itunes.usitunes12days.comitunesapple.cn -cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn -cnitunesradio.comitunesradio.com.cn -cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.net apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn -cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn -cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn -cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn -cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn -cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn -cnappleappstore.cn -cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn -cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co -imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com -ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com -ipadair.cl -ipadair.cmipadair.com.bripadair.com.es -ipadair.fr -ipadair.hk -ipadair.ie -ipadair.jp -ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz -ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com -iphine.comiphone-8.com.cn -cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm -iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co -ipod.co.nz -ipod.co.uk -ipod.co.za ipod.com ipod.com.au ipod.com.cn -cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com -ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com -myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang -macbook.co -macbook.hk -macbook.tw macbook.wang macbookair.cn -cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn -cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com -apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn -cnapplepaycash.com.cn -cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn -cnapplepaysupplies.com#applepaysupplies.com.cn -cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv -i-book.com -i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg -appleid.hk ids-apple.com myappleid.com appletv.com -appletv.fr appletv.wang appletv4.cn -cnappletv4.com.cn -cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website -shazam.com1to1computing.com.au1to1conference.com.au 5lml.com -a0pple.net aapl.twairport.brussels airport.com -airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com -app0le.com -appl-e.com appl.com -appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn -cn apple-dns.comapple-dns.com.cn -cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn -cn apple-inc.netapple-livephotoskit.com apple-maps.cn -cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn -cnapplecenter.com.cn -cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn -cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn -cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn -cnappledns.com.cn -cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com -appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn -cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com -applfe.com -applle.com  applw.comappmediagroup.com -appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com -carbon.com catalina.hk cdn-apple.com  chomp.com -coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com -dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us -earpod.net ecgapp.com.cn -cn -ecgapp.netedu-research.org -emac.co.in emac.in  emagic.de -eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn -cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com -homepod.cn -cn -hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr -ilife.wang imessage.tv insidear.cn -cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se -iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn -cnlivephotos.com.cn -cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com -mac.com.au -mac.eu -mac.rs macappsto.re macboxset.com mach-os.com mach-os.net -machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com -newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us -touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn -cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net -cn!adcdownload.apple.com -cn."amp-api-search-edge.apps.apple.com -cn"amp-api.apps.apple.com -cn aod.itunes.apple.com -cn#api-edge.apps.apple.com -cnappldnld.apple.com -cn"appldnld.g.aaplimg.com -cnapps.apple.com -cnapps.mzstatic.com -cn(apptrailers.itunes.apple.com -cn bag.itunes.apple.com -cn'bookkeeper.itunes.apple.com -cnbooks.apple.com -cn!cds-cdn.v.aaplimg.com -cn$cds.apple.com.akadns.net -cn cds.apple.com -cncl2-cn.apple.com -cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net -cncl4-cn.apple.com -cn'client-api.itunes.apple.com -cn+clientflow.apple.com.akadns.net -cn clientflow.apple.com -cn cma.itunes.apple.com -cn."configuration.apple.com.akadns.net -cn#configuration.apple.com -cn!communities.apple.com -cncstat.apple.com -cn."dd-cdn.origin-apple.com.akadns.net -cn(discussionschinese.apple.com -cn(download.developer.apple.com -cnfides-pol.apple.com -cngs-loc-cn.apple.com -cngs-loc.apple.com -cn%gsp10-ssl-cn.ls.apple.com -cn!gsp11-cn.ls.apple.com -cn!gsp12-cn.ls.apple.com -cn!gsp13-cn.ls.apple.com -cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net -cn, gsp4-cn.ls.apple.com.edgekey.net -cn gsp4-cn.ls.apple.com -cn gsp5-cn.ls.apple.com -cn(gspe11-2-cn-ssl.ls.apple.com -cn&gspe12-cn-ssl.ls.apple.com -cn&gspe19-cn-ssl.ls.apple.com -cn-!gspe19-cn.ls-apple.com.akadns.net -cn"gspe19-cn.ls.apple.com -cn#gspe21-ssl.ls.apple.com -cngspe21.ls.apple.com -cn#gspe35-ssl.ls.apple.com -cn&gspe85-cn-ssl.ls.apple.com -cniadsdk.apple.com -cn, icloud-cdn.icloud.com.akadns.net -cn icloud.cdn-apple.com -cn'images.apple.com.akadns.net -cn?3images.apple.com.edgekey.net.globalredir.akadns.net -cnimages.apple.com -cn3'init-p01md-lb.push-apple.com.akadns.net -cn init-p01md.apple.com -cn3'init-p01st-lb.push-apple.com.akadns.net -cn%init-p01st.push.apple.com -cn3'init-s01st-lb.push-apple.com.akadns.net -cn%init-s01st.push.apple.com -cn!init.itunes.apple.com -cn$iosapps.itunes.apple.com -cn(iosapps.itunes.g.aaplimg.com -cniphone-ld.apple.com -cn'itunes-apple.com.akadns.net -cnitunes.apple.com -cn#itunesconnect.apple.com -cn"js-cdn.music.apple.com -cn km.support.apple.com -cnmaps.apple.com -cn)mesu-cdn.apple.com.akadns.net -cn+mesu-china.apple.com.akadns.net -cnmesu.apple.com -cnmusic.apple.com -cn(ocsp-lb.apple.com.akadns.net -cnocsp.apple.com -cnoscdn.apple.com -cn-!oscdn.origin-apple.com.akadns.net -cn$osxapps.itunes.apple.com -cnpancake.apple.com -cn, pancake.cdn-apple.com.akadns.net -cnpd.itunes.apple.com -cnphobos.apple.com -cn!play.itunes.apple.com -cn1%prod-support.apple-support.akadns.net -cn$se-edge.itunes.apple.com -cn se2.itunes.apple.com -cn#search.itunes.apple.com -cn1%sf-api-token-service.itunes.apple.com -cnsp.itunes.apple.com -cn4(stocks-sparkline-lb.apple.com.akadns.net -cn&stocks-sparkline.apple.com -cn>2store.apple.com.edgekey.net.globalredir.akadns.net -cn'store.apple.com.edgekey.net -cnstore.apple.com -cn2&store.storeimages.apple.com.akadns.net -cn+store.storeimages.cdn-apple.com -cn+streamingaudio.itunes.apple.com -cnsu.itunes.apple.com -cn2&support-china.apple-support.akadns.net -cnsupport.apple.com -cn."swcatalog-cdn.apple.com.akadns.net -cnswcatalog.apple.com -cnswcdn.apple.com -cnswcdn.g.aaplimg.com -cn'swdist.apple.com.akadns.net -cnswdist.apple.com -cn+swscan-cdn.apple.com.akadns.net -cnswscan.apple.com -cn!sync.itunes.apple.com -cn1%updates-http.cdn-apple.com.akadns.net -cn&updates-http.cdn-apple.com -cn upp.itunes.apple.com -cnvalid.apple.com -cn-!valid.origin-apple.com.akadns.net -cn"weather-data.apple.com -cn<0www.apple.com.edgekey.net.globalredir.akadns.net -cn%www.apple.com.edgekey.net -cn www.apple.com -cn#^a[1-5]\.mzstatic\.com$ -cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ -cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ -cn!^cl[1-5]\.apple\.com$ -cn+^is[1-5](-ssl)?\.mzstatic\.com$ -cn$^s[1-5]?\.mzstatic\.com$ -cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net asus.com asus.com.cn -cn atlassian.com bitbucket.org statuspage.ioaccbusiness.com -atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn -cn att.com att.jobs att.net -att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com -attcorp.cn -cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com -attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com -attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net -budatt.com -cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com -uverse.comwebhosting.com att-idns.net -attdns.com -attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com -dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com -diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.combandwagonhost.com bwh1.net bwh8.net  bwh88.net canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn -cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn -cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn -cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn -cn  cisco.com cisco.com.cn -cn -cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co -devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com -mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com -mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn -cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com -versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org -mearki.com meraki-go.com  meraki.hk merakigo.com -tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net clco.cc -cloudc.one cloudcone.com cloudcone.net -cfblob.comcloudchoose.comcloudvolumes.com -cmpaas.com -cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com -virsto.com -virsto.net vmglobal.net -vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com -vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com -vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com -badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com -nyansa.com velocloud.com gopivotal.com heptio.cn -cn -heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com -getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com -nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com -oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org -atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com -facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com -faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com -fb.careers -fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com -fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com -fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net -freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com -groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com -redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net  aorus.com aoruszone.cn -cn gigabyte.cn -cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net godaddy.comx.co godaddy blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -ads youtubeggpht.cn -cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com -youtube.ae -youtube.al -youtube.am -youtube.at -youtube.az -youtube.ba -youtube.be -youtube.bg -youtube.bh -youtube.bo -youtube.by -youtube.ca youtube.cat -youtube.ch -youtube.cl -youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve -youtube.cr -youtube.cz -youtube.de -youtube.dk -youtube.ee -youtube.es -youtube.fi -youtube.fr -youtube.ge -youtube.gr -youtube.gt -youtube.hk -youtube.hr -youtube.hu -youtube.ie -youtube.in -youtube.iq -youtube.is -youtube.it -youtube.jo -youtube.jp -youtube.kr -youtube.kz -youtube.la -youtube.lk -youtube.lt -youtube.lu -youtube.lv -youtube.ly -youtube.ma -youtube.md -youtube.me -youtube.mk -youtube.mn -youtube.mx -youtube.my -youtube.ng -youtube.ni -youtube.nl -youtube.no -youtube.pa -youtube.pe -youtube.ph -youtube.pk -youtube.pl -youtube.pr -youtube.pt -youtube.qa -youtube.ro -youtube.rs -youtube.ru -youtube.sa -youtube.se -youtube.sg -youtube.si -youtube.sk -youtube.sn youtube.soy -youtube.sv -youtube.tn -youtube.tv -youtube.ua -youtube.ug -youtube.uy -youtube.vnyoutubeeducation.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand -chromedclkgbizgle gmailgoogoog -googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca -google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn -cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw -google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com -466453.com abc.xyz adgoogle.net -admeld.comangulardart.org -api.ai -apigee.com appbridge.ca appbridge.io appbridge.it appspot.com -apture.com area120.com -asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com -brotli.org bumpshare.com -bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chat.gle -chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com -fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com -foofle.com froogle.com fuchsia.dev  g-tun.comg.cn -cng.co g.dev -g.pagegerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn -cn globaledu.org  gmail.com gmodules.com  gogle.com -gogole.comgonglchuangl.net -goo.gl -googel.com -googil.com  googl.comgoogle-syndication.com google.berlin -google.dev -google.net -google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn -cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn -cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com -googlr.com -goolge.com gooogle.com gridaware.app gsrc.io -gstatic.cn -cn gstatic.comgstaticcnapps.cn -cn -gsuite.com -gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hey.gle hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com -j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo -oauthz.com -ok.gle on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org -picasa.com picasaweb.com picasaweb.net picasaweb.org -picnik.com pittpatt.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com -revolv.comridepenguin.com run.appsavethedate.foo -saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com -stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com -verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org -wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com -webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company -x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.com xplr.cozukunftswerkstatt.de265.com -cn2mdn.net -cn adservice.google.com -cnapp-measurement.com -cn beacons.gcp.gvt2.com -cnbeacons.gvt2.com -cnbeacons3.gvt2.com -cn c.admob.com -cn(c.android.clients.google.com -cn!cache.pack.google.com -cncheckin.gstatic.com -cn%clickserve.dartsearch.net -cn)clientservices.googleapis.com -cn)connectivitycheck.gstatic.com -cncorp.google.com -cn crl.pki.goog -cn"csi-china.l.google.com -cncsi.gstatic.com -cn dl.google.com -cndl.l.google.com -cndoubleclick.net -cn-!firebase-settings.crashlytics.com -cn fonts.googleapis.com -cnfonts.gstatic.com -cn google-analytics.com -cn googleadservices.com -cngoogleanalytics.com -cn!googlesyndication.com -cn googletagmanager.com -cn!googletagservices.com -cngtm.oasisfeng.com -cn!imasdk.googleapis.com -cn kh.google.com -cn ocsp.pki.goog -cn, pagead-googlehosted.l.google.com -cn!pki-goog.l.google.com -cn recaptcha.net -cnredirector.gvt1.com -cn)safebrowsing-cache.google.com -cn'safebrowsing.googleapis.com -cn$settings.crashlytics.com -cn-!ssl-google-analytics.l.google.com -cnssl.gstatic.com -cn%toolbarqueries.google.com -cntools.google.com -cntools.l.google.com -cn$translate.googleapis.com -cn!update.googleapis.com -cn-!www-googletagmanager.l.google.com -cnwww.gstatic.com -cnwww.recaptcha.net -cn0$^khm([0-3]|db)?\.google(apis)?\.com$ -cn  hinet.net -123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com -compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info -hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com -hp.com -hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net -hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com -hpfaqs.comhpfeedback.com -hpgift.com -hpgpas.comhpgraphicspartners.com  hpiie.org -hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com -hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com -hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com -hpstore.cn -cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com -hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.comibmweatherchannel weather bluemix.com bluemix.net ibm.com -ibm.eu ibm.net -ibm.us s-bluemix.net s81c.com intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn -cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn -cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt -altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com -intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn -cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com -niosii.com -niosii.netomekinteractive.com -omnitek.tv openamt.comopendroneid.orgoptanedifference.com -pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com -siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net -vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn -xscale.combarefootnetworks.com linkedin.com  licdn.com logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn -cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn -cnchinacloudapp.cn -cnchinacloudsites.cn -cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn -cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn -cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com -dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com -cn cn.bing.net -cn ditu.live.com -cnbj1.api.bing.com -cnemoi-cncdn.bing.com -cnmicrosoftnews.ccmicrosoftnews.cn -cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com  microsoft azure hotmail -office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com -m12.vc -aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com -binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com -ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com -gears5.com gearspop.comgearstactics.com -gfx.ms -gigjam.com hololens.com -hotmail.co hotmail.com -hotmail.eu hotmail.net hotmail.orghummingbird.ms -ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl -ingads.comintunewiki.comiotinactionevents.com -kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn -cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn -cn -msauth.netmschallenge2018.com -msecnd.net -msedge.net  msft.info msft.net msftauth.cn -cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com -msocdn.com -msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com -office.com -office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net -pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com -pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net -sfx.ms sharepoint.cn -cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com -techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com -userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net -wbd.ms what-fan.netwindows-int.net windows.com windows.net -windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com -winhec.com -winhec.net -yammer.comcdn.office.net -cn(dl.delivery.mp.microsoft.com -cn&download.windowsupdate.com -cn'bg.v4.a.dl.ws.microsoft.com -cn(bg4.v4.a.dl.ws.microsoft.com -cn2&cdn.marketplaceimages.windowsphone.com -cn cn.windowssearch.com -cn#ctldl.windowsupdate.com -cn#developer.microsoft.com -cndocs.microsoft.com -cn"download.microsoft.com -cn/#download.visualstudio.microsoft.com -cnfs.microsoft.com -cn(msgr.dlservice.microsoft.com -cn, msgruser.dlservice.microsoft.com -cn#officecdn.microsoft.com -cn&qh.dlservice.microsoft.com -cnsdx.microsoft.com -cn/#silverlight.dlservice.microsoft.com -cn, slupdate.dlservice.microsoft.com -cn, storeedgefd.dsx.mp.microsoft.com -cn&wl.dlservice.microsoft.com -cn&wscont1.apps.microsoft.com -cn&wscont2.apps.microsoft.com -cnwww.microsoft.com -cn&xb.dlservice.microsoft.com -cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net neuralink.com -geforce.cn -cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn -cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn -cn nvidia.co.jp nvidia.co.kr -nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.com -oracle -oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com -bronto.comcovid19-rx.org covid19rx.org sun.com  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io -pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com -sforce.com site.com -social.comsteelbrick.com twinprime.comweinvoiceit.com samsung -xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn -cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.comsonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl -sony.co.cr -sony.co.id -sony.co.in -sony.co.jp -sony.co.kr -sony.co.nz -sony.co.th -sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com -sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net -spacex.comboringcompany.com x.comads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com -twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net vine.couber-assets.com uber.com ubereats.com -oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com -xo.com mvk.com userapi.com  vk-cdn.me vk-portal.net vk.cc -vk.com  vk.design vk.link vk.me vkcache.com vkgo.app -vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.netg-technology.com -sandisk.ae -sandisk.it -sandisk.cn -cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw -sandisk.de -sandisk.es -sandisk.fr -sandisk.hk -sandisk.id -sandisk.in -sandisk.nl -sandisk.sg -wd.com wdc.comwesterndigital.com -flickr -flickr.com -flickr.netstaticflickr.com ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn -cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn -cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com -myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com  ymail.comxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il -yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md -yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net -yandex 928.plus -zind.cloud aaex.uk amytele.com -ark.tobaicaonetwork.com bighead.groupblinkload.zone boslife.biz boslife.net  cloudn.me  conair.me cordcloud.org ctyun.online -cylink.procylink0122.icu dlercloud.com dlercloud.org dlercloud.me dleris.best duyaoss.com duyaossr.com hitun.ioxn--90wwvt03e.comjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net  maying.coxn--i2ru8q2qg.commocloudplus.com  mray.club muncloud.dog n3ro.fun  n3ro.live n3ro.net nexitally.comnexitallysafe.com nexitcore.com paofu.cloud paofuyun.me renzhe.cloud rixcloud.comshadowsocks.comshadowsocks.nlsquirrelvpn.comsquirrelgroup.net -ssplive.pwchina-internet-exchange.com cxkcloud.com ssrcloud.com ssrcloud.org -ssrpass.pwstc-server.com surflite.co surflite.net vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz cursecdn.com -fandom.com  wikia.com  wikia.org dndbeyond.com futhead.com gamepedia.com muthead.comwikia.nocookie.netfandom.zendesk.com miraheze.org scp-wiki.net  scpdb.org scpwiki.comtranslatewiki.nettranslatewiki.org wdfiles.com wikidot.com wikihow.com mediawiki.org wikibooks.org wikidata.orgwikimediafoundation.org wikimedia.org wikinews.org wikipedia.org wikiquote.orgwikisource.orgwikiversity.orgwikivoyage.orgwiktionary.orgwmfusercontent.org -w.wiki toolforge.orgwikimediacloud.org wmcloud.org wmflabs.orgfamifun.com.tw family.co.jp family.com.twfamilymart.com.cn -cnfamilymart.com.myfamilymart.com.ph  famima.vn hkedcity.nethkreadingcity.nethuanghuagang.orgmcd  mcdonalds4008-517-517.cn -cnaboutmcdonalds.comhappymeal.co.nzhappymeal.com.au mcd.commcdelivery.co.idmcdelivery.co.krmcdelivery.com.aumcdelivery.com.mymcdelivery.com.sgmcdelivery.com.twmcdindonesia.com mcdonalds.camcdonalds.co.uk mcdonalds.commcdonalds.com.hk mcdonalds.hk mcdonalds.it mcdonalds.no mcdonalds.semcdonaldsarabia.commcdonaldsparties.co.nzmcdonaldsparties.com.au!xn--qhrx81fxh2a.xn--55qx5d.hk rarbg.me rarbg.to rarbg.israrbgaccess.org rarbggo.orgrarbgmirror.comrarbgmirror.orgrarbgproxy.org rarbgprx.orgrarbgunblock.comaerogard.com.auaerogard.com.cn -cnaerogardcn.com -airwick.at -airwick.be -airwick.ca -airwick.ch -airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn -cnairwick.com.mxairwick.com.tr -airwick.cz -airwick.de -airwick.dk -airwick.es -airwick.fi -airwick.fr -airwick.hr -airwick.hu -airwick.ie -airwick.it -airwick.jp airwick.net -airwick.nl -airwick.no -airwick.pl -airwick.pt -airwick.ro -airwick.ru -airwick.se -airwick.si -airwick.sk -airwick.tv -airwick.usairwickarabia.com vipoo.es  calgon.at  calgon.be  calgon.ch calgon.cn -cn calgon.co.uk -calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com clearasil.cn -cnclearasil.com.cn -cn clearasil.usdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk -dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn -cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie -dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ardewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn -cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn -cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn -cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tvbebepremium3.com.bo -enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph -enfamil.ca enfamil.com -enfamil.es -enfamil.pl -enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl$dishwashingexpert.com.cn -cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn -cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com lizol.co.in lysol.ca lysol.cllysol.cn -cn lysol.co.cr  lysol.com lysol.com.cn -cn lysol.com.mx  lysol.netenfinitas.com.cn -cnmeadjohnson.commeadjohnson.com.cn -cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net -mortein.cn -cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.comkeepmovingwithmovefree.com move-free.net movefree.cn -cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com -mucinex.ca -mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net -mucinex.tvmucinexprofessional.com -nurofen.at -nurofen.bg -nurofen.cn -cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn -cnnurofen.com.sg -nurofen.cz -nurofen.de -nurofen.es -nurofen.fr -nurofen.hr -nurofen.hu -nurofen.ie -nurofen.it nurofen.net -nurofen.no -nurofen.pl -nurofen.pt -nurofen.ro -nurofen.sk -nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com -cepacol.ca cepacol.com dobendan.degraneodin.com.mx -repsils.no strepsils.at strepsils.ch strepsils.cn -cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn -cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.como2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn -cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au veet.at veet.be veet.ca veet.ch veet.clveet.cn -cn -veet.co.id -veet.co.in -veet.co.kr -veet.co.nz -veet.co.uk -veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn -cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it -woolite.ca -woolite.cn -cn woolite.comwoolite.com.cn -cn -woolite.pl -woolite.uswoolitecarpet.comdigital-rb.com rb-crisis.com -rb.com -rb.netrbbusinessshop.comrbdigitalab.comrbdigitallab.comrbeuroinfo.com rbgrads.comrbgraduates.comrbmavericks.comrbnainternational.com  rbplc.comrbrandlibrary.com rbspeakup.com reckitt.netreckittbenckiser.cn -cnreckittbenckiser.com#reckittbenckiser.com.cn -cnreckittbenckiser.netreckittbenckiser.tvreckittprofessional.com starbucks.castarbucks.co.uk starbucks.comstarbucks.com.cn -cn starbucks.de starbucks.fr starbucks.ie -tsquare.tv  windy.com xdty.org  xingrz.me -+ -GUARDIANPROJECTguardianproject.info - - HASHICORP  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io -- - PUBMATIC-ADSads.pubmatic.com -ads -' - WTEAM-ADS ads.wteam.xyz -ads - -ZERONET -zeronet.io - -ELIXIRelixir-lang.org -: -ESRI -arcgis.comarcgisonline.com esri.com -+ -MONGODB mongodb.com mongodb.org -T - DLERCLOUD dlercloud.com dlercloud.org dlercloud.me dleris.best - -HQPORNER hqporner.com -T - -PROTONMAIL protonmail.chprotonmail.comprotonstatus.com pm.me -) - REBRANDLY rb.gy rebrandly.com - -VIMEO -vhx.tv -vhxqa1.com -vhxqa2.com -vhxqa3.com -vhxqa4.com -vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com - -3DM 3dmgame.com - -CASTRO  castro.fm - - -ITUNES!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn -cn itun.es itunbes.com ituneas.comitunes-apple.cn -cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th -itunes.com  itunes.hk  itunes.mx -itunes.org -itunes.rio  itunes.usitunes12days.comitunesapple.cn -cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn -cnitunesradio.comitunesradio.com.cn -cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.net -+ -FORBES -forbes.com forbesimg.com -3 - SEGMENTFAULTsegmentfault.com  sifou.com -f - TAYLORFRANCIS tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com - -ANTUTU -antutu.com -+ -LINKEDIN linkedin.com  licdn.com -7 -AMD amd.comamdfanstore.com -radeon.com - -SFACG  sfacg.com -\ -TAIKANG taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.com - -TENCENT dns.pub  dnsapi.cn  dnspod.cn -dnspod.com dnspod.com.cn -dnspod.net -dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads -yuewen.com hongxiu.com lrts.me qdmm.com -qidian.com readnovel.com tingbook.com webnovel.com -xs8.cn xxsy.net -apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com -qcloud.com qcloudimg.com qlogo.cn qpic.cn -qq.com -qqmail.com  qzone.com -rtx.com.cnservicewechat.com smtcdns.com smtcdns.net -tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com -tenpay.com -wechat.com -wegame.com wegame.com.cn -weiyun.com alloyteam.com imweb.io ivweb.io - -EA dawngate.com eastore.comlordofultima.com -origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com -dicela.com -dicela.netea-anz-press.com -ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com -eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com -popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com -tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com -yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com -pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com -skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net -mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com -uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.net -= - JAVFINDER javfinder.sh findercdn.me o0-2.com - -PORNHD -pornhd.com - -YANDEXxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il -yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md -yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net -yandex - -CENTOS -centos.org - -GOOGLE-SCHOLARscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk - -SLASHDOT slashdot.org - -SHORTURL shorturl.at -0 -SOHU sohu.com -sohucs.com -itc.cn -4 -THEBORINGCOMPANYboringcompany.com x.com - -GOOGLE android.comandroidify.com blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn dart.dev dartlang.org dartpad.dev fastlane.cifastlane.tools flutter.devflutterapp.com go-lang.com go-lang.net go-lang.org -go.dev  godoc.org -golang.com -golang.net -golang.org2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -adsscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.skpolymer-project.orgpolymerproject.org -v8.dev v8project.org youtubeggpht.cn -cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com -youtube.ae -youtube.al -youtube.am -youtube.at -youtube.az -youtube.ba -youtube.be -youtube.bg -youtube.bh -youtube.bo -youtube.by -youtube.ca youtube.cat -youtube.ch -youtube.cl -youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve -youtube.cr -youtube.cz -youtube.de -youtube.dk -youtube.ee -youtube.es -youtube.fi -youtube.fr -youtube.ge -youtube.gr -youtube.gt -youtube.hk -youtube.hr -youtube.hu -youtube.ie -youtube.in -youtube.iq -youtube.is -youtube.it -youtube.jo -youtube.jp -youtube.kr -youtube.kz -youtube.la -youtube.lk -youtube.lt -youtube.lu -youtube.lv -youtube.ly -youtube.ma -youtube.md -youtube.me -youtube.mk -youtube.mn -youtube.mx -youtube.my -youtube.ng -youtube.ni -youtube.nl -youtube.no -youtube.pa -youtube.pe -youtube.ph -youtube.pk -youtube.pl -youtube.pr -youtube.pt -youtube.qa -youtube.ro -youtube.rs -youtube.ru -youtube.sa -youtube.se -youtube.sg -youtube.si -youtube.sk -youtube.sn youtube.soy -youtube.sv -youtube.tn -youtube.tv -youtube.ua -youtube.ug -youtube.uy -youtube.vnyoutubeeducation.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand -chromedclkgbizgle gmailgoogoog -googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca -google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn -cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw -google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com -466453.com abc.xyz adgoogle.net -admeld.comangulardart.org -api.ai -apigee.com appbridge.ca appbridge.io appbridge.it appspot.com -apture.com area120.com -asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com -brotli.org bumpshare.com -bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chat.gle -chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com -fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com -foofle.com froogle.com fuchsia.dev  g-tun.comg.cn -cng.co g.dev -g.pagegerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn -cn globaledu.org  gmail.com gmodules.com  gogle.com -gogole.comgonglchuangl.net -goo.gl -googel.com -googil.com  googl.comgoogle-syndication.com google.berlin -google.dev -google.net -google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn -cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn -cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com -googlr.com -goolge.com gooogle.com gridaware.app gsrc.io -gstatic.cn -cn gstatic.comgstaticcnapps.cn -cn -gsuite.com -gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hey.gle hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com -j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo -oauthz.com -ok.gle on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org -picasa.com picasaweb.com picasaweb.net picasaweb.org -picnik.com pittpatt.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com -revolv.comridepenguin.com run.appsavethedate.foo -saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com -stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com -verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org -wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com -webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company -x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.com xplr.cozukunftswerkstatt.de265.com -cn2mdn.net -cn adservice.google.com -cnapp-measurement.com -cn beacons.gcp.gvt2.com -cnbeacons.gvt2.com -cnbeacons3.gvt2.com -cn c.admob.com -cn(c.android.clients.google.com -cn!cache.pack.google.com -cncheckin.gstatic.com -cn%clickserve.dartsearch.net -cn)clientservices.googleapis.com -cn)connectivitycheck.gstatic.com -cncorp.google.com -cn crl.pki.goog -cn"csi-china.l.google.com -cncsi.gstatic.com -cn dl.google.com -cndl.l.google.com -cndoubleclick.net -cn-!firebase-settings.crashlytics.com -cn fonts.googleapis.com -cnfonts.gstatic.com -cn google-analytics.com -cn googleadservices.com -cngoogleanalytics.com -cn!googlesyndication.com -cn googletagmanager.com -cn!googletagservices.com -cngtm.oasisfeng.com -cn!imasdk.googleapis.com -cn kh.google.com -cn ocsp.pki.goog -cn, pagead-googlehosted.l.google.com -cn!pki-goog.l.google.com -cn recaptcha.net -cnredirector.gvt1.com -cn)safebrowsing-cache.google.com -cn'safebrowsing.googleapis.com -cn$settings.crashlytics.com -cn-!ssl-google-analytics.l.google.com -cnssl.gstatic.com -cn%toolbarqueries.google.com -cntools.google.com -cntools.l.google.com -cn$translate.googleapis.com -cn!update.googleapis.com -cn-!www-googletagmanager.l.google.com -cnwww.gstatic.com -cnwww.recaptcha.net -cn0$^khm([0-3]|db)?\.google(apis)?\.com$ -cn -1 -N3RO n3ro.fun  n3ro.live n3ro.net - -SAMSUNG samsung -xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn -cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.com -, -RENREN -renren.comrenren-inc.com - - SONYPICTURESimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com -wwtbam.comyourfantasybeginsnow.com -q -CATEGORY-HOSPITAL-CN  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn -@ - DIGITALOCEANdigitalocean.comdigitaloceanspaces.com -a -DYNA dynacw.co.jp -dynacw.com dynacw.com.cn dynacw.com.hk dynacw.com.tw - -OPENJSFOUNDATION amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org -cnamp.akamaized.netelectronjs.org -jquery.comjquerymobile.com jqueryui.com mochajs.org -nodejs.org openjsf.org - -PASTEBIN pastebin.com - - -KINDLE4RSSkindle4rss.com - - MEGAPHONE megaphone.fm - - NEWYORKER newyorker.com -0 - -SOUNDCLOUDsoundcloud.com -sndcdn.com - - TONGCHENG 40017.cn -17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com -ly.com - - BREITBART breitbart.com -3 -HKEDCITY hkedcity.nethkreadingcity.net - -PATREON patreon.com - -GITEE  gitee.com -$ - HUANGHUAGANGhuanghuagang.org -B -MITmit mit.edu mit.netmitpressjournals.org -$ -NOTEPADnotepad-plus-plus.org - - PHANTOMJS phantomjs.org - -ADBLOCKgetadblock.com - -CHANGE -change.org - - EPICGAMESbattlebreakers.com epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ -cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ -cn - -SSPAI  sspai.com -8 - -CYBERTRUSTcybertrust.co.jpcybertrust.ne.jp - -IEEE ieee.org ieee.tvtryengineering.org ieee-ccnc.org ieee-ecce.org ieeemce.orgstandardsuniversity.orgieee-region6.org ieee.ca ieeer10.org -ieeer5.org -ieeer8.org ieeeusa.orgieeefoundation.orgieee-into-focus.org ieee-vics.org ieeeday.orgdatasheets360.comglobalspec.com ieee-isto.orgtechstreet.com computer.org -comsoc.org embs.org emcs.org grss-ieee.org ieee-aess.org ieee-cas.org ieee-ceda.orgieee-edusociety.org ieee-ies.org ieee-ims.org ieee-npss.org ieee-pels.org ieee-pes.org ieee-ras.orgieee-sensors.org ieee-tems.org ieee-uffc.org ieeeaps.org ieeecsc.org ieeecss.org ieeedeis.orgieeemagnetics.org ieeenano.org ieeeoes.org ieeesmc.orgieeesystemscouncil.org  itsoc.org mtt.orgphotonicssociety.orgsignalprocessingsociety.orgtechnologyandsociety.org vtsociety.org -% -NGINX  nginx.com  nginx.org -+ -TRELLO -trello.com trellocdn.com - -ALI213 -ali213.net - -BILIPLUS biliplus.com - - STCSERVERstc-server.com -: -EBAY21centuryaccess.com4ebaytraders.com adcommerce.cn -cn adcommerce.tv appforebay.cn -cnappsonebay.net -asebay.com -baazee.com -bidbay.combidorbuyindia.com billpoint.combillpoint.info billpoint.tv billpoint.usbillpointnewzealand.com blogebay.combookclubcorner.combuiltfromebay.com buyitnow.com buyitnow.net buyitnow.org buyitnow.tvbuyitnowshop.net cafr.ca carebay.comcargigileads.com  cebay.comcollective99.comcommerceos.comconnectcommerce.cn -cn"connectcommerce.com.cn -cnconnectcommerce.hkconnectcommerce.infoconnectcommerce.tv connectedcommerce.cn -cnconnectedcommerce.comconnectedcommerce.tvcrececonebay.comcreditcardsbay.com cyber-bay.cn -cncyber-bay.com.cn -cncyber-bay.info cyber-bay.org -dba.dk dealbay.com dealtime.com  didce.com  douya.orgdreamtoplay.com  e-bay.com e-bay.it  e-bay.net eachpay.com eachpay.net  ebahy.comebay-authenticate.netebay-confirm.comebay-course.com ebay-cz.comebay-delivery.comebay-discoveries.comebay-fashion.com ebay-inc.com ebay-inc.net ebay-inc.orgebay-online.comebay-sales.comebay-stories.com ebay-us.comebay-vacation.com ebay.at ebay.be ebay.ca ebay.chebay.cn -cn -ebay.co.nz -ebay.co.uk -ebay.co.ve -ebay.co.za ebay.com ebay.com.ar ebay.com.au ebay.com.cn -cn ebay.com.ec ebay.com.hk ebay.com.mt ebay.com.my ebay.com.ph ebay.com.sg ebay.de ebay.es ebay.fr ebay.ie ebay.in ebay.it ebay.jp ebay.lt ebay.mn ebay.net.cn -cn ebay.nl ebay.org ebay.org.cn -cn ebay.ph ebay.pk ebay.pl ebay.sg ebay.us ebay.vn -ebay.yn.cn -cn -ebay.zj.cn -cn -ebay25.com -ebay68.com  ebaya.com ebayads.com ebayads.netebayadvertising.cn -cnebayadvertising.comebayanunsios.netebayauction.comebayaustralia.comebayauthenticate.com.cn ebaybags.com ebaybank.comebaybenefits.comebayboutique.com -ebayca.com -ebayca.org ebaycafe.com ebaycar.comebaycareers.com ebaycbt.co.kr ebaycdn.net ebaychina.netebayclassifiedsgroup.comebayclassifieds.cn -cnebayclassifieds.com"ebayclassifieds.com.cn -cnebayclassifieds.infoebayclassifieds.orgebayclassifieds.tvebayclassifiedsgroup.comebayclassifiedsgroup.infoebayclassifiedsgroup.orgebayclassifies.com ebayclub.com ebaycoins.com ebaycom.comebaycommercenetwork.comebaycourse.com  ebayd.com -ebayde.com ebaydesc.cn -cnebaydesc.com.cn -cnebaydlassifieds.com -ebaydns.cn -cn ebaydts.com ebayedu.comebayeletro.comebayenterprise.cn -cnebayenterprise.com!ebayenterprise.com.cn -cnebayenterprise.infoebayenterprise.netebayenterprise.tv ebayetc.comebayexpress.sgebayfashion.comebayfashion.netebayforcharity.orgebayforeclosure.orgebayfrance.comebayglobalshipping.com ebaygroup.com ebayhabit.com ebayheels.com ebayhots.com ebayimg.com ebayinc.com ebayinc.net ebayinc.org ebayincconnectedcommerce.netebayinkblog.comebayinternetsalestax.com -ebayit.comebayjewelry.com ebayjob.com -ebayla.orgebaylisting.com ebaylocal.netebaylocationsdevacances.com ebaymag.comebaymainstreet.com ebaymall.comebaymarketplace.net ebaymotors.ca ebaymotors.cn -cnebaymotors.comebaymotors.com.cn -cnebaymotors.orgebaymotorsblog.com ebaynow.com ebaynyc.com -ebayon.com -ebayon.netebayoncampus.com ebayopen.comebayopensource.comebayopensource.netebaypakistan.net ebaypark.com ebayparts.com ebaypedia.cn -cnebaypedia.com.cn -cnebayprivacycenter.com -ebayqq.com ebayradio.com ebayrtm.comebayseller.comebayshoesstore.com ebayshop.comebayshop111.comebayshopping.cn -cnebayshopping.com.cn -cnebayshopping.orgebaysocial.com ebaysocial.ru ebaysoho.com ebaysohos.com ebaystatic.cn -cnebaystatic.com ebaystore.comebaystore77.com ebaystores.cn -cn ebaystyle.comebaysweden.com  ebayt.comebaytechblog.comebaytopratedseller.netebaytrading.comebaytradingassistant.com -ebaytv.org ebayuae.netebayvakantiehuizen.com ebayvalet.comebayvietnam.netebayworlds.com  ebayy.com edisebay.com  eebay.com epinions.comeu-consumer-empowerment.comexpertmaker.comfairmarket.comfragrancebay.comfrancemail.com half.com half.com.cn -cn half.tvhalfcanada.com halfjapan.comhandbagsoutletebay.com  iebay.com irribay.comitsbetterwhenyouwinit.com liketwice.comliveauction.com milofetch.com musicbay.netmyconstructionworld.net -myebay.com  nebay.net paisapay.cc paisapay.info paisapay.tv premobay.comprivatemarketplaces.netprivatemarketplaces.us prostores.cn -cn prostores.comprostores.com.cn -cn rethink.net shopibay.net shoping.comsourcingforebay.com.cnsourcingforebay.netsourcingforebay.tv speybay.comstoresense.com -svpply.com telebay.com telesell.com texttobuy.orgtheebayshop.comtheopportunityproject.orgtowerauction.com  vendu.com weareebay.comwatch-ebay.org wwwdecide.com wwwebay.com wwwebay.net wwwwebay.com xindelu.comxn--3et96bj49ahpq.comxn--4vq475g.comxn--4vq477m.comxn--7hv594h.comxn--7hvy28f.cn -cnxn--hb4aw0g.comxn--q41am8x.comxn--qoq462m.comxn--tkry91n.comxn--ubt498knmf.comxn--xsq421m.comxn--xsq605n.comxn--xsq959n.comxn--yf1at58a.com  xxbay.com  yibei.orggittigidiyor.netgittigidiyorsikayet.com -gumtree.sg  jijiji.ca kiji.ca kijii.ca kijij.ca  kijiji.ca kijijiauto.cakijijiautos.ca kijijidns.cn -cnkijijidns.com.cn -cnkijijiforbusiness.ca -kijijii.ca kijijiraps.ca kijji.ca -kijjiji.ca automobile.fr  mobile.demobileinternational.com&mobileinternational.com.cn -cn -q10.jp qoo10.jpachievementanalytics.comcdn-terapeak.comlistinganalytics.netmarketexecutive.net tearapeak.com terapeack.com terapeak.ca terapeak.cn -cn terapeak.comterapeak.com.hk terapeak.hk terapeak.info teraperk.com terrapeak.com thebayuk.com -nexcat.com nexpart.com -nexpart.tv renchead.comwhisolutions.com wrenchead.com-)ebay-25-assets.s3-us-west-1.amazonaws.com - -TUMBLR -tumblr.com - - ZOOMINGIN zoomingin.tv -L -JSDELIVR jsdelivr.net jsdelivr.comcdn.jsdelivr.net -cn - -THELINUXFOUNDATION -kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org -cnamp.akamaized.netelectronjs.org -jquery.comjquerymobile.com jqueryui.com mochajs.org -nodejs.org openjsf.orglfai.foundationlinuxfoundation.org - - -APPLEDAILYappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk -atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.com -! -FREENETfreenetproject.org - -TRIBLER tribler.org -( -REDIS redis.io redislabs.com -< - YYETS-ADS cvnad.com -ads -iyoowi.com -ads -& - CHINADECODINGchinadecoding.com - -DELL -cfblob.comcloudchoose.comcloudvolumes.com -cmpaas.com -cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com -virsto.com -virsto.net vmglobal.net -vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com -vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com -vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com -badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com -nyansa.com velocloud.com gopivotal.com heptio.cn -cn -heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com -getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.com -W -HAINANAIRLINEShainanairlines.com hnacargo.com  hnair.com 10044.cn -# -MEGA -mega.co.nz mega.nz - -CYTHON -cython.org -( -UCLOUD  ucloud.cn ufileos.com - -YANDE yande.re - -CISCO webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn -cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn -cn  cisco.com cisco.com.cn -cn -cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co -devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com -mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com -mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn -cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com -versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org -mearki.com meraki-go.com  meraki.hk merakigo.com -tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net - -JAVBUS -javbus.com -* -JAVWIDE -javwide.tv javwide.com -3 -ENTRUST entrust.netentrustdatacard.com -= -SIGNAL -signal.art -signal.orgsignalusers.org -? -STRIPE -stripe.comstripe.network stripecdn.com - -TUBE8  tube8.com - - -BRIGHTCOVE videojs.com bcove.video bcovlive.io bcvp0rtal.com boltdns.netbrightcove.combrightcove.netbrightcove.servicesbrightcovecdn.combcovlive-a.akamaihd.netbcsecure01-a.akamaihd.netbrightcove.imgix.net -$ -CSDN csdn.net -csdnimg.cn - -OPPO coloros.com finzfin.com -heytap.com heytapcs.comheytapdownload.comheytapimage.com -myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn -realme.com realmebbs.comrealmemobile.com -9 - YCOMBINATORstartupschool.orgycombinator.com -a -LE -le.com lecloud.com -lemall.com letv.com letvcdn.com letvimg.com - -NETFLAV netflav.com - -ONEDRIVE 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.com - - ALJAZEERA -ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.com -g -SPRINGER -apress.com springer.comspringerlink.comspringernature.com wkap.nl -1 -HOMEBREW brew.shhomebrew.bintray.com -^ -SWIFTappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cn - -BITTREX bittrex.com -, -CYLINK -cylink.procylink0122.icu - -GNU gnu.org -7 - FONTAWESOMEfontawesome.comfortawesome.com -` -GEMFURY  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com -1 - LIBERAPAY liberapay.com liberapay.org - -SECTIGO sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com - -ADDTOANY addtoany.com - -APACHE -apache.org -B -DISQUS -disqus.com disquscdn.comdisqusservice.com - - PINTEREST -pin.it -pinimg.com pinterest.at pinterest.be pinterest.ca pinterest.ch pinterest.cl pinterest.copinterest.co.atpinterest.co.inpinterest.co.krpinterest.co.nzpinterest.co.uk pinterest.compinterest.com.aupinterest.com.bopinterest.com.ecpinterest.com.mxpinterest.com.pepinterest.com.pypinterest.com.uypinterest.com.vn pinterest.de pinterest.dk pinterest.ecpinterest.engineering pinterest.es pinterest.fr pinterest.hu pinterest.id pinterest.ie pinterest.inpinterest.info pinterest.it pinterest.jp pinterest.kr pinterest.mx pinterest.nl pinterest.nz pinterest.pe pinterest.ph pinterest.pt pinterest.ru pinterest.se pinterest.th pinterest.tw pinterest.uk pinterest.vnpinterestmail.com -7 -SCP scp-wiki.net  scpdb.org scpwiki.com - -VGTIME -vgtime.com -D -YY -duowan.com dwstatic.com -yy.com yystatic.com - - -JD3.cn  300hu.com -360buy.com 360buyimg.com -360top.com -7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn -dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com -jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com -jd-app.com  jd-ex.com jd.cn jd.co.th -jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com -jingxi.com -jkcsjd.com -joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn -paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com -vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads - -MINImini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com -mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl -mini.co.cr -mini.co.id -mini.co.il -mini.co.kr -mini.co.me -mini.co.th -mini.co.uk -mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua -mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com -minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com -minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com -trmini.comtroisrivieresmini.comyours-customised.mini.com - -MONOTYPEfontexplorerx.com  fonts.com  fonts.net fontbook.com fontshop.comfstopimages.com40fontshop-prod-responsive-images.s3.amazonaws.com linotype.com myfonts.com myfonts.net monotype.commonotypeimaging.com bitstream.com itcfonts.com - -SQLITE -sqlite.org - - TENCENT-ADS ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads - -BTCBOX btcbox.co.jp - - - CATEGORY-PORN  1pondo.tv -91porn.com  avgle.com avn.com beeg.com bongacams.com -bcicdn.com bcrncdn.com -btt804.com -btt904.com -bttzyw.com -bttzyw.net t66y.comchaturbate.com e-hentai.org ehgt.org ehtracker.org -ehwiki.org exhentai.orghentaiverse.org eporner.comfanhaodian.com  hegre.com heydoga.com  heyzo.com hqporner.com -javbus.com javfinder.sh findercdn.me o0-2.com  javhd.comjavlibrary.com -javwide.tv javwide.com kindgirls.comlivejasmin.com dditsadn.com dditscdn.com -metart.commetartnetwork.com metcams.comnaiadsystems.com  nsimg.net netflav.com  pigav.com -pornhd.com -phncdn.com phprcdn.com pornhub.compornhubpremium.com  press.vin redtube.com scoreland.comcdn77.scoreuniverse.com spankbang.comtheporndude.com  tube8.comvaginacontest.com  x-art.com xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com -ads xnxx.com xnxx-cdn.com xvideos.comxvideos-cdn.com youjizz.comyjcontentdelivery.com youporn.com - -CYGWIN -cygwin.com -C -GITBOOK gitbook.com -gitbook.iogitbook.zendesk.com -# - PASSIONTIMESpassiontimes.hk -_ -FEDORA getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org -8 -TARGET -target -target.comtargetimg1.com -1 -ZIROOM -ziroom.comziroomapartment.com - -YOUTUBE youtubeggpht.cn -cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com -youtube.ae -youtube.al -youtube.am -youtube.at -youtube.az -youtube.ba -youtube.be -youtube.bg -youtube.bh -youtube.bo -youtube.by -youtube.ca youtube.cat -youtube.ch -youtube.cl -youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve -youtube.cr -youtube.cz -youtube.de -youtube.dk -youtube.ee -youtube.es -youtube.fi -youtube.fr -youtube.ge -youtube.gr -youtube.gt -youtube.hk -youtube.hr -youtube.hu -youtube.ie -youtube.in -youtube.iq -youtube.is -youtube.it -youtube.jo -youtube.jp -youtube.kr -youtube.kz -youtube.la -youtube.lk -youtube.lt -youtube.lu -youtube.lv -youtube.ly -youtube.ma -youtube.md -youtube.me -youtube.mk -youtube.mn -youtube.mx -youtube.my -youtube.ng -youtube.ni -youtube.nl -youtube.no -youtube.pa -youtube.pe -youtube.ph -youtube.pk -youtube.pl -youtube.pr -youtube.pt -youtube.qa -youtube.ro -youtube.rs -youtube.ru -youtube.sa -youtube.se -youtube.sg -youtube.si -youtube.sk -youtube.sn youtube.soy -youtube.sv -youtube.tn -youtube.tv -youtube.ua -youtube.ug -youtube.uy -youtube.vnyoutubeeducation.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.com -& - BAICAONETWORKbaicaonetwork.com -4 -CSIS csis.orgcsis-prod.s3.amazonaws.com -, -MATTERS matters.news matters.one -g - READTHEDOCSreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org - -SINA-ADS 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -ads -) -LINGUEE linguee.com  deepl.com -" - MOCLOUDPLUSmocloudplus.com -O -PUBMATIC pubmatic.compubmatic.co.jpads.pubmatic.com -ads - - WORDPRESSvideopress.com w.org wordpress.com wordpress.org wordpress.tv wp-themes.com -wp.com  wpvip.com -7 - BUYMEACOFFEE buymeacoff.eebuymeacoffee.com -9 -EMBEDLY embed.ly embedly.com playerjs.io - - INOREADER inoreader.com -' -POLYV  polyv.net videocc.net - -UMENG mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com -uyunad.comwhalecloud.comalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads - - ZHIHUISHU zhihuishu.com -T -NOW now.com -now.com.hk nowe.com -now-tv.comnow-ashare.com -5 -YOUJIZZ youjizz.comyjcontentdelivery.com -_ -CATEGORY-WIKI-CNhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn -) -DRIBBBLE drbl.in dribbble.com - -DUREXdewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn -cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn -cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn -cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tv -H -BTTZYW -btt804.com -btt904.com -bttzyw.com -bttzyw.net - - -SKILLSHAREskillshare.com - -ZDNS zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cn -0 -BITLY -bit.ly  bitly.com bitly.is - -PCRE pcre.org - -WINDY  windy.com - -ADIDAS  adidas.at  adidas.be  adidas.ch adidas.co.in adidas.co.uk -adidas.com adidas.com.cn -cn adidas.com.sa adidas.com.tw  adidas.cz  adidas.de  adidas.dk  adidas.hu  adidas.ie  adidas.it  adidas.nl  adidas.pl  adidas.ru  adidas.se - -TIKTOK -muscdn.com -musical.ly -tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net - -ZOHO zoho.com zoho.com.au zoho.eu zoho.in zohocdn.comzohomeetups.comzohomerchandise.comzohopublic.comzohoschools.comzohostatic.com zohostatic.inzohouniversity.comzohowebstatic.com - - ALIBABA-ADS a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -ads - - APPLE-DEVappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn -cnresearchkit.com.cn -cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io -webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net - -TABOOLA taboola.com - -RARBG rarbg.me rarbg.to rarbg.israrbgaccess.org rarbggo.orgrarbgmirror.comrarbgmirror.orgrarbgproxy.org rarbgprx.orgrarbgunblock.com - - -SALESFORCE appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io -pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com -sforce.com site.com -social.comsteelbrick.com twinprime.comweinvoiceit.com -< -SHOWTIMEANYTIMEshowtimeanytime.com showtime.com - -PSIPHON psiphon3.com - -MYSQL  mysql.com -" -NIST nist.gov time.gov -j - PLAYSTATION playstationplaystation.complaystation.net sonyentertainmentnetwork.com -1 -TIANCITY tiancity.comtiancitycdn.com - -AHMIA ahmia.fi - -GUCCI guccichimeforchange.orggucci.cn -cn  gucci.comguccimuseo.comguccitimeless.comregiongold.com -, -SECOM secom.co.jpsecomtrust.net - -STUNNEL stunnel.org - -SYOSETU syosetu.com - -CLOJURE clojure.org - -MSNmicrosoftnews.ccmicrosoftnews.cn -cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com -U -SB -dns.sb ip.sb loli.net sb.sb sm.msu.nu -www.sb -" - SOUNDOFHOPEsoundofhope.org - -GEEKPARK geekpark.net - -IPFS ipfs.io -2 - NEWRELIC-ADS"js-agent.newrelic.com -ads - -CLOUDN  cloudn.me -% -DEMOCRACYEARTHdemocracy.earth -" - EPICBROWSERepicbrowser.com - -JUPYTER jupyter.org - - NETEASE-ADSanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads - - -QINGTINGFM qingting.fm - - GREATFIRE greatfire.org -* -HKOPENTV hkopentv.com fantv.hk - -JINJIANG  jjwxc.net -N - CLOUDCONE clco.cc -cloudc.one cloudcone.com cloudcone.net - -CONAIR  conair.me - -KNOVEL -knovel.com - -ORIGIN dawngate.com eastore.comlordofultima.com -origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.com - -SMPTE  smpte.org - -ATTaccbusiness.com -atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn -cn att.com att.jobs att.net -att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com -attcorp.cn -cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com -attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com -attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net -budatt.com -cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com -uverse.comwebhosting.com att-idns.net -attdns.com -attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com -dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com -diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.com -Q - BANDWAGONHOSTbandwagonhost.com bwh1.net bwh8.net  bwh88.net -, -BYPASSCENSORSHIPbypasscensorship.org -U - CLEARASIL clearasil.cn -cnclearasil.com.cn -cn clearasil.us - - FASTSTONE faststone.org - -MDNdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud - -FIRESIDE fireside.fm -E - HIIDO-ADSmlog.hiido.com -adsylog.hiido.com -ads -H - NEXITALLY nexitally.comnexitallysafe.com nexitcore.com -` -OAN aweencore.com  awetv.comherringnetwork.com oanencore.com oann.com - -XBOXcallersbane.com minecraft.netminecraftshop.com -mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org -xbox360.co xbox360.com -xbox360.eu xbox360.org -xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn -cn xboxlive.com -xboxone.co xboxone.com -xboxone.euxboxplayanywhere.comxboxstudios.com - -ERLANG -erlang.org - - FFPROFILE ffprofile.com - -FREEBSD freebsd.org -L -APKPURE apkpure.com cdnpure.com pureapk.com -winudf.com -' -CODING  coding.me -coding.net -@ - ZUOYEBANG zuoyebang.cc zuoyebang.com -zybang.com -1 - STACKPATH stackpath.com stackpath.dev - -TIDELIFT tidelift.com - -HEGRE  hegre.com -N -SEASUNseasungames.com xishanju.com xoyo.com testplus.cn - -XPOSED xposed.info - - 58TONGCHENG -58.com  58.com.cn 5858.com  58che.com 58xueche.com -anjuke.comanjukestatic.com chinahr.com -daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com -7 -DART dart.dev dartlang.org dartpad.dev - - RPMFUSION rpmfusion.org - -ISGD is.gdv.gd - -MOCHA mochajs.org -G -TEX ctan.orglatex-project.org -miktex.org tug.org - -TINYURL tinyurl.com - -EGGHEAD -egghead.io - -ELECTRONelectronjs.org - - FACEBOOK-DEVaccountkit.comatscaleconference.com botorch.org -buck.build buckbuild.comcomponentkit.org draftjs.org -f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com -fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com -ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com - - MEADJOHNSONenfinitas.com.cn -cnmeadjohnson.commeadjohnson.com.cn -cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net - -WHATSAPP wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.com -, -ACPLAY -acplay.netdandanplay.com - - BRIDGESTONE bridgestone  bandag.cc -bandag.comblizzak-juken.jpbookmybridgestonetyre.combridgestone-asiapacific.combridgestone-bandag.combridgestone-brand.com#bridgestone-business-service.jpbridgestone-korea.co.krbridgestone-plt-eng.combridgestone-tac-oman.combridgestone.clbridgestone.cn -cnbridgestone.co.crbridgestone.co.idbridgestone.co.inbridgestone.co.jpbridgestone.co.thbridgestone.combridgestone.com.arbridgestone.com.brbridgestone.com.cn -cnbridgestone.com.cobridgestone.com.mxbridgestone.com.sgbridgestone.com.twbridgestone.com.vnbridgestoneamericas.combridgestonearena.combridgestonecntc.combridgestonecomercial.clbridgestonecomercial.co.crbridgestonecomercial.com.arbridgestonecomercial.com.brbridgestonecomercial.com.cobridgestonecomercial.com.mxbridgestonegolf.combridgestonegz.combridgestonela.combridgestonemarketing.combridgestonemerchandise.com bridgestonenationalfleet.combridgestoneperformance.com#bridgestoneperformancemedia.net bridgestonerapiddelivery.combridgestonerewards.combridgestonesyb.combridgestonetire.cabridgestonetire.combridgestonetyre.com.mybridgestonevan.combridgestonewx.combs-adreview.com bs-awh.ne.jp  bsw.co.jp -bsw.jpcarcare-and-tireshop.jpdaytontrucktires.com ecoforme.jp gcrtires.comjsbridgestone.commenshin-channel.com monitrix.net mr-tireman.jpmybridgestoneeducation.com playz.jp -potenza.jpprodrive-japan.comstore-bridgestonesports.com thetread.com tiresplus.com cfna.combastropfirestone.comcrossfitfirestone.com firestone.clfirestone.co.crfirestone.com.arfirestone.com.brfirestone.com.cofirestone.com.mxfirestonebpco.comfirestonecomercial.clfirestonecomercial.co.crfirestonecomercial.com.arfirestonecomercial.com.brfirestonecomercial.com.cofirestonecomercial.com.mx!firestonecompleteautocare.comfirestonedrivestore.comfirestoneip.comfirestonerewards.comfirestonetire.cafirestonetire.comhibdontire.comwheelworks.netnokiantyres.cn -cnnokiantyres.com - -CANON canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn -cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn -cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com -* -JIANSHU jianshu.com -jianshu.io - -MOZILLA firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net - -XDTY xdty.org -3 - -CONTENTFULcontentful.com ctfassets.net - -GOFUNDME gofundme.com - -JENKINS -jenkins.io -. -U17 u17.com u17i.com u17t.com -- - ACFUN-ADS apilog-web.acfun.cn -ads -I -MADSHI -madshi.net  madvr.com  madvr.net madvrlabs.llc -p -ONEPLUS oneplus.com -oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com - -SPACEX -spacex.com - -YAHOO -flickr -flickr.com -flickr.netstaticflickr.com ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn -cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn -cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com -myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com  ymail.com - - 4PARADIGM 4paradigm.com -R -ARPHIC -arphic.com arphic.com.cn arphic.com.twifontcloud.com -< -NGA -nga.cn 178.com -ngabbs.com ngacn.cc - - -HONGKONGFPhongkongfp.com -@ -JQUERY -jquery.comjquerymobile.com jqueryui.com - -MIRAHEZE miraheze.org -S - OGURY-ADS ogury.com -ads -presage.io -adsogury.co -ads -# - PRIVACYTOOLSprivacytools.io -C -ADDTHIS addthis.comaddthiscdn.comaddthisedge.com - - BITWARDEN bitwarden.com -@ - GLOBALVOICESglobalvoices.orgglobalvoicesonline.org -9 -SHADOWSOCKSCOMshadowsocks.comshadowsocks.nl - -SKYsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.com -" - SUBLIMETEXTsublimetext.com - -0X0 -0x0.st -j -BAHAMUT gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net - -IETF ietf.org - -I2P -geti2p.net - -PINGPE ping.pe - -RFA rfa.org - -W3C -w3.org - -TELEGRAM contest.com  graph.orgquiz.directoryt.me tdesktop.com -telega.one -telegra.ph telegram.dog telegram.me telegram.orgtelegram.space -telesco.pe -tg.dev tx.meusercontent.dev -Y -UNIONPAY  95516.com unionpay.comunionpayintl.comunionpaysecure.com -] -BUYPASSbuypass-ssl.com buypass.com -buypass.no -buypass.se minid.no - - CHINAMOBILE 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn -cmvideo.cn miguvideo.com andfx.cn  andfx.net -cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com -N -CNBC cnbc.com -cnbcfm.com -nbcuni.comnbcudigitaladops.com - -YOUPORN youporn.com -@ -BETHESDA bethesda.net doom.comelderscrolls.com -J -FLICKR -flickr -flickr.com -flickr.netstaticflickr.com - - -INFRAPEDIAinfrapedia.com -F -DEEPIN  deepin.cn -deepin.com  deepin.io -deepin.org -v -NATIONALGEOGRAPHICnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.com -t - CAMBRIDGE cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.org -h -CMB cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.com - -DEDAO biji.com -ddmogo.com -igetget.cn igetget.com luojilab.com  mogoo.com -sao.cn saolife.com - -VOXMEDIA cstatic.net -curbed.com  eater.comfunnyordie.com meridian.net polygon.com -racked.com -recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com -voxops.net -G -ASAHI  asahi.com asahicom.jpasahishimbun.sc.omtrdc.net -y -GANNETTgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.com -B -HASKELL haskell.orghaskellstack.org stackage.org - -DROPBOX db.ttdropbox-dns.com dropbox.com dropbox.techdropboxapi.comdropboxbusiness.comdropboxcaptcha.comdropboxforum.comdropboxforums.comdropboxinsiders.comdropboxmail.comdropboxpartners.comdropboxstatic.comdropboxusercontent.comgetdropbox.com&"paper-attachments.s3.amazonaws.com - -LINUX  linux.org -% -MIHOYO -mihoyo.com bh3.com - -MUCINEX -mucinex.ca -mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net -mucinex.tvmucinexprofessional.com -; -UBERuber-assets.com uber.com ubereats.com - -BRAVEUXbraventures.com braveux.com -compass.isfightforux.comforthebadge.comstockagainstphotography.com -{ - CLARIVATEnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com -( -DEBIAN -debian.org -dotdeb.org - - WIRESHARK wireshark.org - -TUNSAFE tunsafe.com -& - VAGINACONTESTvaginacontest.com -$ -GFW  gfw.press -gfw.report -# -QT qt.ioqt-project.org -& - STEAMUNLOCKEDsteamunlocked.net -6 - RUBYCHINAruby-china.orgrubyconfchina.org -+ -XIMALAYA ximalaya.com  xmcdn.com - -BILIBILI -acg.tv acgvideo.com -b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com -mincdn.com$ upos-hz-mirrorakam.akamaized.net - -DIGICERT digicert.com freessl.com geotrust.com rapidssl.com -thawte.com  thawte.de  thawte.fr - -HP -123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com -compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info -hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com -hp.com -hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net -hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com -hpfaqs.comhpfeedback.com -hpgift.com -hpgpas.comhpgraphicspartners.com  hpiie.org -hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com -hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com -hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com -hpstore.cn -cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com -hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.com - -AVN avn.com -& -HUYA huya.com msstatic.com - - IQIYI-ADSa.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -ads - -ARCHIVE archive.org -u - -ATTWATCHTV -att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com -k -DOUYU  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com -- -BITFLYER bitflyer.com bitflyer.jp -* - -FLURRY-ADSdata.flurry.com -ads - - -POSTGRESQLpostgresql.org -( -LTN -ltn.com.tw yes123.com.tw -? -MAFENGWO mafengwo.cn mafengwo.com mafengwo.net -/ -MAPBOX mapbox.cn -cn -mapbox.com - -OUPamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com -ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.com -b - YAHOO-ADS ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -ads -6 -AGORA agora.io -agoraio.cn agoralab.co - -AMAZON amazon-adsystem.com -adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws -amazonimdb -kindle xn--cckwcxetdxn--jlq480n2rg yamaxun -zapposaboutamazon.cn -cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn -cnalexafund.com.cn -cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn -cn amazon.co.jp amazon.co.uk -amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl -amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn -cn!amazonbusiness.com.cn -cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn -cnamazonchoice.com.cn -cnamazonchoices.cn -cn amazonchoices.com.cn -cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn -cn amazoninspire.com.cn -cnamazonlaunchpad.cn -cnamazonlaunchpad.com"amazonlaunchpad.com.cn -cn amazonlending.com.cn -cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn -cnamazonnow.com.cn -cn amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn -cnassociates-amazon.comgameon-masters.comgdansk-amazon.commedia-amazon.com primeday.cn -cnprimeday.com.cn -cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de -yamaxun.cn -cn yamaxun.comz.cn -cn audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn -cnamazonworkdocs.com!amazonworkdocs.com.cn -cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$ kindle.cn -cn kindle.co.jp kindle.co.uk -kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn -cnkindleoasis.comkindleoasis.com.cn -cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn -cn#amazonprimevideo.com.cn -cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com -cn-!images-cn-8.ssl-images-amazon.com -cn -) - LEANPLUM-ADS leanplum.com -ads -2 -REABBLE -reabble.cn -cn reabble.com - -3TYPE 3type.cn - -CNKI cnki.net - - INMEDIAHK inmediahk.net - - HELLOFONT hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com - -ITU itu.int - -TWISTERtwister.net.co - -TWITTERads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com -twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net vine.co - -VOANEWSamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.ru insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com -voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com -P -AEROGARDaerogard.com.auaerogard.com.cn -cnaerogardcn.com - -CATEGORY-COMPANIESacer-group.com acer.com acer.com.cn -cn typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com -demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com -omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com -fotolia.cc fotolia.com -fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net -marketo.tvmarketodesigner.commarketolive.com -mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.comalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.com amazon-adsystem.com -adswholecitiesfoundation.orgwholefoodsmarket.comwholekidsfoundation.orgwholeplanetfoundation.orgaws -amazonimdb -kindle xn--cckwcxetdxn--jlq480n2rg yamaxun -zapposaboutamazon.cn -cnaboutamazon.co.ukaboutamazon.comaboutamazon.com.auaboutamazon.deaboutamazon.esaboutamazon.euaboutamazon.fraboutamazon.inaboutamazon.itaboutamazon.jpaboutamazon.pl alexafund.cn -cnalexafund.com.cn -cn amaaozn.comamazon-fashions.comamazon-jp-recruiting.comamazon-lantern.comamazon-launchpad.com  amazon.ae  amazon.ca amazon.cn -cn amazon.co.jp amazon.co.uk -amazon.com amazon.com.au amazon.com.br amazon.com.mx amazon.com.tr  amazon.de  amazon.es  amazon.fr  amazon.in  amazon.it amazon.jobs  amazon.jp  amazon.nl -amazon.red  amazon.sgamazonalexavoxcon.comamazonauthorinsights.comamazonbusiness.cn -cn!amazonbusiness.com.cn -cnamazonbusiness.orgamazonbusinessblog.comamazonchoice.cn -cnamazonchoice.com.cn -cnamazonchoices.cn -cn amazonchoices.com.cn -cnamazondevicesupport.comamazonfctours.comamazonianblog.comamazonimages.comamazoninspire.cn -cn amazoninspire.com.cn -cnamazonlaunchpad.cn -cnamazonlaunchpad.com"amazonlaunchpad.com.cn -cn amazonlending.com.cn -cn!amazonliterarypartnership.comamazonlumberyard.wang amazonnow.cn -cnamazonnow.com.cn -cn amazonsdi.comamazonstudiosguilds.comamazontrust.comamazonvideodirect.com amzn.com amzn.to  amznl.comassoc-amazon.cn -cnassociates-amazon.comgameon-masters.comgdansk-amazon.commedia-amazon.com primeday.cn -cnprimeday.com.cn -cn primeday.infosiege-amazon.comssl-images-amazon.comueberamazon.de -yamaxun.cn -cn yamaxun.comz.cn -cn audible.comacmvalidations.comacmvalidationsaws.comaesworkshops.comamazonaws-china.com amazonaws.com amazonaws.tvamazonworkdocs.cn -cnamazonworkdocs.com!amazonworkdocs.com.cn -cnamplifyapp.comamplifyframework.comaws-iot-hackathon.comawsautopilot.comawsautoscaling.com awsbraket.comawscommandlineinterface.comawsedstart.comawseducate.comawseducate.netawseducate.orgawsloft-johannesburg.comawsloft-stockholm.comawssecworkshops.com awsstatic.comawsthinkbox.com awstrust.comcdkworkshop.comcloudfront.netcontainersonaws.comelasticbeanstalk.comthinkboxsoftware.com".+\.awsdns-[0-9][0-9]\.co\.uk$.+\.awsdns-[0-9][0-9]\.com$.+\.awsdns-[0-9][0-9]\.net$.+\.awsdns-[0-9][0-9]\.org$".+\.awsdns-cn-[0-9][0-9]\.biz$!.+\.awsdns-cn-[0-9][0-9]\.cn$".+\.awsdns-cn-[0-9][0-9]\.com$".+\.awsdns-cn-[0-9][0-9]\.net$ kindle.cn -cn kindle.co.jp kindle.co.uk -kindle.com  kindle.de  kindle.es  kindle.fr  kindle.in  kindle.it  kindle.jpkindleoasis.cn -cnkindleoasis.comkindleoasis.com.cn -cnkindleoasis.infokindleoasis.jpkindleoasis.orgkindleoasis.uskindleoasisnews.comkindleproject.comamazonprimevideo.cn -cn#amazonprimevideo.com.cn -cnamazonprimevideos.comamazonvideo.ccamazonvideo.comprime-video.com primevideo.ccprimevideo.comprimevideo.infoprimevideo.org primevideo.tv+images-cn.ssl-images-amazon.com -cn-!images-cn-8.ssl-images-amazon.com -cn amd.comamdfanstore.com -radeon.comiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -adscalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn -cnresearchkit.com.cn -cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io -webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com -aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com -airmay.com -ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com -beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn -cn  beats1.tv beats1.com.cn -cn beats123.com beats2.com.cn -cn beats4.cn -cn -beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com -beatsep.cn -cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com -biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net -bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com -cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com -dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com -lyzsxx.com mairbeats.com -makeeu.commallheadphone.commbeats-tech.commbheadphone.com -micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com -ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com -scnshop.cc -shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com -theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net -unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn -cnappleicloud.cn -cnapplemx-icloud.comicloud-apple.cn -cnicloud-content.comicloud-isupport.com  icloud.ch -icloud.com icloud.com.cn -cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn -cn  icloud.om -icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn -cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com -icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com -me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn -cn itun.es itunbes.com ituneas.comitunes-apple.cn -cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th -itunes.com  itunes.hk  itunes.mx -itunes.org -itunes.rio  itunes.usitunes12days.comitunesapple.cn -cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn -cnitunesradio.comitunesradio.com.cn -cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.netappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cn apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn -cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn -cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn -cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn -cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn -cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn -cnappleappstore.cn -cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn -cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co -imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com -ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com -ipadair.cl -ipadair.cmipadair.com.bripadair.com.es -ipadair.fr -ipadair.hk -ipadair.ie -ipadair.jp -ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz -ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com -iphine.comiphone-8.com.cn -cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm -iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co -ipod.co.nz -ipod.co.uk -ipod.co.za ipod.com ipod.com.au ipod.com.cn -cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com -ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com -myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang -macbook.co -macbook.hk -macbook.tw macbook.wang macbookair.cn -cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn -cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com -apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn -cnapplepaycash.com.cn -cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn -cnapplepaysupplies.com#applepaysupplies.com.cn -cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv -i-book.com -i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg -appleid.hk ids-apple.com myappleid.com appletv.com -appletv.fr appletv.wang appletv4.cn -cnappletv4.com.cn -cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website -shazam.com1to1computing.com.au1to1conference.com.au 5lml.com -a0pple.net aapl.twairport.brussels airport.com -airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com -app0le.com -appl-e.com appl.com -appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn -cn apple-dns.comapple-dns.com.cn -cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn -cn apple-inc.netapple-livephotoskit.com apple-maps.cn -cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn -cnapplecenter.com.cn -cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn -cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn -cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn -cnappledns.com.cn -cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com -appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn -cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com -applfe.com -applle.com  applw.comappmediagroup.com -appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com -carbon.com catalina.hk cdn-apple.com  chomp.com -coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com -dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us -earpod.net ecgapp.com.cn -cn -ecgapp.netedu-research.org -emac.co.in emac.in  emagic.de -eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn -cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com -homepod.cn -cn -hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr -ilife.wang imessage.tv insidear.cn -cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se -iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn -cnlivephotos.com.cn -cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com -mac.com.au -mac.eu -mac.rs macappsto.re macboxset.com mach-os.com mach-os.net -machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com -newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us -touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn -cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net -cn!adcdownload.apple.com -cn."amp-api-search-edge.apps.apple.com -cn"amp-api.apps.apple.com -cn aod.itunes.apple.com -cn#api-edge.apps.apple.com -cnappldnld.apple.com -cn"appldnld.g.aaplimg.com -cnapps.apple.com -cnapps.mzstatic.com -cn(apptrailers.itunes.apple.com -cn bag.itunes.apple.com -cn'bookkeeper.itunes.apple.com -cnbooks.apple.com -cn!cds-cdn.v.aaplimg.com -cn$cds.apple.com.akadns.net -cn cds.apple.com -cncl2-cn.apple.com -cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net -cncl4-cn.apple.com -cn'client-api.itunes.apple.com -cn+clientflow.apple.com.akadns.net -cn clientflow.apple.com -cn cma.itunes.apple.com -cn."configuration.apple.com.akadns.net -cn#configuration.apple.com -cn!communities.apple.com -cncstat.apple.com -cn."dd-cdn.origin-apple.com.akadns.net -cn(discussionschinese.apple.com -cn(download.developer.apple.com -cnfides-pol.apple.com -cngs-loc-cn.apple.com -cngs-loc.apple.com -cn%gsp10-ssl-cn.ls.apple.com -cn!gsp11-cn.ls.apple.com -cn!gsp12-cn.ls.apple.com -cn!gsp13-cn.ls.apple.com -cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net -cn, gsp4-cn.ls.apple.com.edgekey.net -cn gsp4-cn.ls.apple.com -cn gsp5-cn.ls.apple.com -cn(gspe11-2-cn-ssl.ls.apple.com -cn&gspe12-cn-ssl.ls.apple.com -cn&gspe19-cn-ssl.ls.apple.com -cn-!gspe19-cn.ls-apple.com.akadns.net -cn"gspe19-cn.ls.apple.com -cn#gspe21-ssl.ls.apple.com -cngspe21.ls.apple.com -cn#gspe35-ssl.ls.apple.com -cn&gspe85-cn-ssl.ls.apple.com -cniadsdk.apple.com -cn, icloud-cdn.icloud.com.akadns.net -cn icloud.cdn-apple.com -cn'images.apple.com.akadns.net -cn?3images.apple.com.edgekey.net.globalredir.akadns.net -cnimages.apple.com -cn3'init-p01md-lb.push-apple.com.akadns.net -cn init-p01md.apple.com -cn3'init-p01st-lb.push-apple.com.akadns.net -cn%init-p01st.push.apple.com -cn3'init-s01st-lb.push-apple.com.akadns.net -cn%init-s01st.push.apple.com -cn!init.itunes.apple.com -cn$iosapps.itunes.apple.com -cn(iosapps.itunes.g.aaplimg.com -cniphone-ld.apple.com -cn'itunes-apple.com.akadns.net -cnitunes.apple.com -cn#itunesconnect.apple.com -cn"js-cdn.music.apple.com -cn km.support.apple.com -cnmaps.apple.com -cn)mesu-cdn.apple.com.akadns.net -cn+mesu-china.apple.com.akadns.net -cnmesu.apple.com -cnmusic.apple.com -cn(ocsp-lb.apple.com.akadns.net -cnocsp.apple.com -cnoscdn.apple.com -cn-!oscdn.origin-apple.com.akadns.net -cn$osxapps.itunes.apple.com -cnpancake.apple.com -cn, pancake.cdn-apple.com.akadns.net -cnpd.itunes.apple.com -cnphobos.apple.com -cn!play.itunes.apple.com -cn1%prod-support.apple-support.akadns.net -cn$se-edge.itunes.apple.com -cn se2.itunes.apple.com -cn#search.itunes.apple.com -cn1%sf-api-token-service.itunes.apple.com -cnsp.itunes.apple.com -cn4(stocks-sparkline-lb.apple.com.akadns.net -cn&stocks-sparkline.apple.com -cn>2store.apple.com.edgekey.net.globalredir.akadns.net -cn'store.apple.com.edgekey.net -cnstore.apple.com -cn2&store.storeimages.apple.com.akadns.net -cn+store.storeimages.cdn-apple.com -cn+streamingaudio.itunes.apple.com -cnsu.itunes.apple.com -cn2&support-china.apple-support.akadns.net -cnsupport.apple.com -cn."swcatalog-cdn.apple.com.akadns.net -cnswcatalog.apple.com -cnswcdn.apple.com -cnswcdn.g.aaplimg.com -cn'swdist.apple.com.akadns.net -cnswdist.apple.com -cn+swscan-cdn.apple.com.akadns.net -cnswscan.apple.com -cn!sync.itunes.apple.com -cn1%updates-http.cdn-apple.com.akadns.net -cn&updates-http.cdn-apple.com -cn upp.itunes.apple.com -cnvalid.apple.com -cn-!valid.origin-apple.com.akadns.net -cn"weather-data.apple.com -cn<0www.apple.com.edgekey.net.globalredir.akadns.net -cn%www.apple.com.edgekey.net -cn www.apple.com -cn#^a[1-5]\.mzstatic\.com$ -cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ -cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ -cn!^cl[1-5]\.apple\.com$ -cn+^is[1-5](-ssl)?\.mzstatic\.com$ -cn$^s[1-5]?\.mzstatic\.com$ -cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net asus.com asus.com.cn -cn atlassian.com bitbucket.org statuspage.io -trello.com trellocdn.comaccbusiness.com -atandt.comatt-bundles.com att-japan.com att-mail.comatt-promotions.com att-rsvp.comatt.cn -cn att.com att.jobs att.net -att.tvattalascom.comattbelieves.comattbusiness.net attcenter.comattcollaborate.com -attcorp.cn -cnattexperts.com attglobal.netattinnovationspace.comattinternetservice.com -attjoy.comattnetclient.comattonlineoffers.com attproxy.comattpublicpolicy.comattpurchasing.comattsavings.comattspecial.com -attssl.comattstadium.comattsuppliers.com atttvnow.comattuverseoffers.comattuverseonline.com attvoip.com attwifi.comattwirelessinternet.comattwirelessonline.comattwirelesssolutions.com bellsouth.net -budatt.com -cobatt.com currently.com currently.netdirectvbusinessmarket.comenterprisepaging.com itcanwait.com mymmode.comnaturalvoices.comnettyinternet.comopenapiplatform.comopenapiservice.compatentgold.netpaygonline.comraponlinereview.com signalbar.comsundayready.com synaptic.netthanksloyalty.com tvpromise.com -uverse.comwebhosting.com att-idns.net -attdns.com -attdns.netna-att-idns.netaudiencenetwork.comaudiencenetwork.tvcabletvdirectv.com dierectv.com -dirctv.com direcpath.com direcpath.netdirecttv-deals.tvdirecttv-dish.com dkrecttv.com directtv.netdirecttvdeals.tvdirecttvreviews.comdirectv-4-you.comdirectv-newyork.com directv.comdirectvadsales.comdirectvatlantaga.comdirectvboston.comdirectvbundles.comdirectvbusiness.comdirectvcincinnatioh.comdirectvcinema.comdirectvconnect.comdirectvcookevilletn.comdirectvcrossvilletn.comdirectvdealer.comdirectvdeals.comdirectvdealsnow.com directvdsl.tvdirectvforhotels.comdirectvgrandslam.comdirectvhouston.comdirectvinternet.comdirectvkentucky.comdirectvlebanontn.comdirectvlosangeles.comdirectvmetropolisil.comdirectvmonitoring.comdirectvmurfreesborotn.comdirectvnewhampshire.comdirectvnow.comdirectvoffercodes.comdirectvonline.comdirectvplans.comdirectvpomise.comdirectvpromise.comdirectvpromotions.comdirectvrebate.comdirectvrichmond.comdirectvsavings.comdirectvsports.comdirectvsundayticket.com direectv.com -diretv.comdtv2009offers.comfreedirecttvspecial.com getdirect.tv hddirectv.com le-direct.tvmydirectgroove.commydirectvchannels.comredzonechannel.com txdirectv.com  xandr.combandwagonhost.com bwh1.net bwh8.net  bwh88.net canon c-ij.com canon-cee.comcanon-cmos-sensors.com canon-cna.comcanon-ebm.com.hkcanon-emea.comcanon-emirates.aecanon-europa.comcanon-europe.com canon-me.com canon-ois.qacanon-se.com.tw canon.am canon.at canon.az canon.ba canon.be canon.bg canon.ca canon.chcanon.cn -cn canon.co.il canon.co.uk canon.co.za  canon.com canon.com.al canon.com.au canon.com.by canon.com.cn -cn canon.com.cy canon.com.hk canon.com.mk canon.com.mt canon.com.my canon.com.tr canon.com.tw canon.cz canon.de canon.dk canon.ee canon.es canon.fi canon.fr canon.ge canon.gr canon.hr canon.hu canon.ie canon.it canon.kz canon.lt canon.lu canon.lv canon.me  canon.net canon.nl canon.no canon.pl canon.pt canon.ro canon.rs canon.ru canon.se canon.si canon.sk canon.tj canon.ua canon.uzcanonfoundation.orgcanonproprinters.com webex.ca webex.co.in webex.co.it webex.co.jp webex.co.kr webex.co.nz webex.co.uk  webex.com webex.com.au webex.com.br webex.com.cn -cn webex.com.hk webex.com.mx webex.de webex.es webex.fr ciscoacademynetriders.comcciernslabs.comcciesecuritylabs.comccievoicelabs.com  ccna5.netcisco-returns.comcisco-warrantyfinder.comcisco.cn -cn  cisco.com cisco.com.cn -cn -cisco.mobiciscoccservice.comciscoconnectcloud.comciscoconnectcloud.netciscoconnectcloud.orgciscocontest.comciscoerate.com ciscofax.comciscoinvestments.comciscojabbervideo.netciscokinetic.comciscoknowledgenetwork.comciscolearningsociety.orgciscolearningsystem.com ciscolive.comcisconetspace.comcisconetspace.infocisconetspace.netcisconetapp.comciscopartnermarketing.comciscopowercube.comciscoprice.comciscoresearch.comciscosoftware.com ciscospark.caciscospark.com ciscospark.jpciscotaccc.com ciscotr.com ciscoturk.netciscovideo.comciscowebseminars.com cloudlock.com cloupia.com cloupia.netconnect-in-canada.comcoreoptics.net cs.co -devm2m.com dnaspaces.io flipshare.comgpstheseries.com inlethd.cominternetofeverything.com ioe.com kscisco.com m2m.com -mcisco.commediafiles-cisco.com metacloud.com mindmeld.commultiplydiversity.commyciscobenefits.com  mysdn.com -mysdn.info  mysdn.net netacad.com netacad.netnetwork-auth.cn -cnobservable.net obsrvbl.com parstream.com parstream.net parstream.orgservices-exchange.comstatic-cisco.comtandberg-china.com tandberg.com -versly.comvideochampion.com virtuata.comwballiance.com!whyiwantciscotelepresence.com wifi-mx.comyoutubecisco.comapp-dynamics.comappdynamics.co.ukappdynamics.comappdynamics.deappdynamics.frappdynamics.infoappdynamics.jpappdynamics.org -mearki.com meraki-go.com  meraki.hk merakigo.com -tail-f.com  tailf.comcisco.evergage.comciscolivehls-i.akamaihd.net clco.cc -cloudc.one cloudcone.com cloudcone.net -cfblob.comcloudchoose.comcloudvolumes.com -cmpaas.com -cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com -virsto.com -virsto.net vmglobal.net -vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com -vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com -vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com -badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com -nyansa.com velocloud.com gopivotal.com heptio.cn -cn -heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com -getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.netdelldell-brand.com dell.com dellcdn.comaccountkit.comatscaleconference.com botorch.org -buck.build buckbuild.comcomponentkit.org draftjs.org -f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com -fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com -ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.comfbmessenger.comm.me messenger.com -nbabot.net binoculus.com buyoculus.com ocul.usoculus-china.com -oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com wa.mewhatsapp-plus.infowhatsapp-plus.mewhatsapp-plus.net whatsapp.cc whatsapp.com whatsapp.info whatsapp.net whatsapp.org whatsapp.tvwhatsappbrand.comaboutfacebook.com accessfacebookfromschool.com acebooik.com acebook.comadvancediddetection.comaskfacebook.netaskfacebook.org -atdmt2.com atlasdmt.comatlasonepoint.combuyingfacebooklikes.comcareersatfb.comcelebgramme.comchina-facebook.com click-url.comcomo-hackearfacebook.comcrowdtangle.com dacebook.comdlfacebook.comdotfacebook.comdotfacebook.netexpresswifi.com faacebok.com faacebook.com faasbook.com facbebook.com facbeok.com -facboo.com facbook.com facbool.com facboox.com faccebook.comfaccebookk.com facdbook.com facdebook.com face-book.com faceabook.com facebboc.com facebbook.comfacebboook.com facebcook.com facebdok.com facebgook.com facebhook.com facebkkk.com facebo-ok.com faceboak.com facebock.com facebocke.com facebof.com faceboik.com facebok.comfacebokbook.com facebokc.com facebokk.com facebokok.com faceboks.com facebol.com facebolk.com facebomok.com faceboo.com facebooa.com faceboob.comfaceboobok.com facebooc.com faceboock.com facebood.com facebooe.com faceboof.com facebooi.com facebooik.com facebooik.org facebooj.comfacebook-corp.comfacebook-covid-19.comfacebook-ebook.comfacebook-forum.comfacebook-inc.comfacebook-login.comfacebook-newsroom.comfacebook-newsroom.orgfacebook-pmdcenter.comfacebook-pmdcenter.netfacebook-pmdcenter.orgfacebook-privacy.comfacebook-program.comfacebook-studio.comfacebook-support.orgfacebook-texas-holdem.comfacebook-texas-holdem.net facebook.br facebook.ca facebook.cc facebook.comfacebook.design facebook.net facebook.hu facebook.in fecebook.net facebook.nl facebook.org facebook.se facebook.shop facebook.tv facebook.us facebook.wangfacebook123.orgfacebook30.comfacebook30.netfacebook30.orgfacebook4business.comfacebookads.com"facebookadvertisingsecrets.comfacebookatschool.comfacebookawards.comfacebookblueprint.netfacebookbrand.comfacebookbrand.net3/facebookcanadianelectionintegrityinitiative.comfacebookcareer.comfacebookcheats.comfacebookck.comfacebookclub.comfacebookcom.comfacebookconsultant.orgfacebookcoronavirus.comfacebookcovers.orgfacebookcredits.infofacebookdating.netfacebookdusexe.orgfacebookemail.comfacebookenespanol.comfacebookexchange.comfacebookexchange.netfacebookfacebook.comfacebookflow.comfacebookgames.comfacebookgraphsearch.comfacebookgraphsearch.infofacebookgroups.comfacebookhome.ccfacebookhome.comfacebookhome.infofacebookhub.com facebooki.comfacebookinc.comfacebookland.comfacebooklikeexchange.comfacebooklive.comfacebooklivestaging.netfacebooklivestaging.orgfacebooklogin.comfacebooklogin.infofacebookloginhelp.netfacebooklogs.comfacebookmail.comfacebookmail.tvfacebookmanager.infofacebookmarketing.info facebookmarketingpartner.com!facebookmarketingpartners.comfacebookmobile.comfacebookmsn.comfacebooknews.comfacebooknfl.comfacebooknude.comfacebookofsex.comfacebookook.comfacebookpaper.comfacebookpay.comfacebookphonenumber.netfacebookphoto.comfacebookphotos.comfacebookpmdcenter.comfacebookpoke.netfacebookpoke.orgfacebookpoker.infofacebookpokerchips.infofacebookporn.netfacebookporn.orgfacebookporno.netfacebookportal.com facebooks.comfacebooksafety.comfacebooksecurity.netfacebookshop.comfacebooksignup.netfacebooksite.netfacebookstories.comfacebookstudios.netfacebookstudios.orgfacebooksupplier.comfacebooksuppliers.comfacebookswagemea.comfacebookswagstore.comfacebooksz.comfacebookthreads.netfacebooktv.netfacebooktv.orgfacebookvacation.com facebookw.comfacebookworld.com facebool.com facebool.info facebooll.com faceboom.com faceboon.com faceboonk.comfaceboooik.com faceboook.com faceboop.com faceboot.com faceboox.com facebopk.com facebpook.com facebuk.com facebuok.com facebvook.com facebyook.com facebzook.comfacecbgook.com facecbook.com facecbook.org facecook.com facecook.org facedbook.com faceebok.com faceebook.com faceebot.com facegbok.com facegbook.com faceobk.com faceobok.com faceobook.com faceook.comfacerbooik.com facerbook.com facesbooc.comfacesounds.com facetook.com facevbook.com facewbook.co facewook.comfacfacebook.com facfebook.com fackebook.com facnbook.com facrbook.com facvebook.com facwebook.com facxebook.com fadebook.com -faebok.com faebook.com faebookc.com faeboook.com faecebok.com faesebook.comfafacebook.com faicbooc.com fasebokk.com fasebook.com faseboox.com favebook.com faycbok.com -fb.careers -fb.com fb.me fbacebook.com fbbmarket.comfbboostyourbusiness.com  fbcdn.com  fbcdn.netfbfeedback.com -fbhome.com fbidb.io  fbinc.comfbinnovation.comfbmarketing.com  fbreg.com -fbrpms.com  fbsbx.com  fbsbx.netfbsupport-covid.netfbthirdpartypixel.comfbthirdpartypixel.netfbthirdpartypixel.org  fburl.comfbworkmail.com fcacebook.com fcaebook.com fcebook.com fcebookk.comfcfacebook.comfdacebook.info feacboo.com feacbook.com feacbooke.com feacebook.com fecbbok.com fecbooc.com fecbook.com feceboock.com feceboox.com fececbook.com  feook.com ferabook.com fescebook.com fesebook.com ffacebook.com fgacebook.com ficeboock.com fmcebook.com fnacebook.com fosebook.com fpacebook.com fqcebook.com fracebook.com  freeb.comfreebasics.comfreebasics.net -freebs.comfreefacebook.comfreefacebook.netfreefacebookads.netfreefblikes.comfreindfeed.comfriendbook.info friendfed.comfriendfeed-api.comfriendfeed-media.comfriendfeed.comfriendfeedmedia.com fsacebok.com fscebook.comfundraisingwithfacebook.comfunnyfacebook.orgfutureofbusinesssurvey.org gacebook.com gameroom.comgfacecbook.com -groups.comhackerfacebook.comhackfacebook.comhackfacebookid.comhifacebook.info!howtohackfacebook-account.comhsfacebook.comhttpfacebook.comhttpsfacebook.comhttpwwwfacebook.com i.org internet.org klik.me liverail.com liverail.tvlogin-account.netmarkzuckerberg.commidentsolutions.commobilefacebook.commoneywithfacebook.com myfbfans.com newsfeed.com nextstop.comonline-deals.netopencreate.orgreachtheworldonfacebook.com rocksdb.orgshopfacebook.comsportsfacebook.comsportstream.comsupportfacebook.comterragraph.comthefacebook.comthefacebook.net thefind.comtoplayerserver.comviewpointsfromfacebook.comwhyfacebook.com worldhack.comwww-facebook.comwwwfacebok.comwwwfacebook.comwwwmfacebook.comzuckerberg.comzuckerberg.netfacebookwork.com -redkix.com workplace.comworkplaceusecases.comfbcdn-a.akamaihd.net  aorus.com aoruszone.cn -cn gigabyte.cn -cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net godaddy.comx.co godaddy android.comandroidify.com blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn dart.dev dartlang.org dartpad.dev fastlane.cifastlane.tools flutter.devflutterapp.com go-lang.com go-lang.net go-lang.org -go.dev  godoc.org -golang.com -golang.net -golang.org2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -adsscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.skpolymer-project.orgpolymerproject.org -v8.dev v8project.org youtubeggpht.cn -cn  ggpht.comgooglevideo.comwithyoutube.com youtu.beyoutube-nocookie.com -youtube.ae -youtube.al -youtube.am -youtube.at -youtube.az -youtube.ba -youtube.be -youtube.bg -youtube.bh -youtube.bo -youtube.by -youtube.ca youtube.cat -youtube.ch -youtube.cl -youtube.co youtube.co.ae youtube.co.at youtube.co.cr youtube.co.hu youtube.co.id youtube.co.il youtube.co.in youtube.co.jp youtube.co.ke youtube.co.kr youtube.co.ma youtube.co.nz youtube.co.th youtube.co.tz youtube.co.ug youtube.co.uk youtube.co.ve youtube.co.za youtube.co.zw youtube.comyoutube.com.aryoutube.com.auyoutube.com.azyoutube.com.bdyoutube.com.bhyoutube.com.boyoutube.com.bryoutube.com.byyoutube.com.coyoutube.com.doyoutube.com.ecyoutube.com.eeyoutube.com.egyoutube.com.esyoutube.com.ghyoutube.com.gryoutube.com.gtyoutube.com.hkyoutube.com.hnyoutube.com.hryoutube.com.jmyoutube.com.joyoutube.com.kwyoutube.com.lbyoutube.com.lvyoutube.com.lyyoutube.com.mkyoutube.com.mtyoutube.com.mxyoutube.com.myyoutube.com.ngyoutube.com.niyoutube.com.omyoutube.com.payoutube.com.peyoutube.com.phyoutube.com.pkyoutube.com.ptyoutube.com.pyyoutube.com.qayoutube.com.royoutube.com.sayoutube.com.sgyoutube.com.svyoutube.com.tnyoutube.com.tryoutube.com.twyoutube.com.uayoutube.com.uyyoutube.com.ve -youtube.cr -youtube.cz -youtube.de -youtube.dk -youtube.ee -youtube.es -youtube.fi -youtube.fr -youtube.ge -youtube.gr -youtube.gt -youtube.hk -youtube.hr -youtube.hu -youtube.ie -youtube.in -youtube.iq -youtube.is -youtube.it -youtube.jo -youtube.jp -youtube.kr -youtube.kz -youtube.la -youtube.lk -youtube.lt -youtube.lu -youtube.lv -youtube.ly -youtube.ma -youtube.md -youtube.me -youtube.mk -youtube.mn -youtube.mx -youtube.my -youtube.ng -youtube.ni -youtube.nl -youtube.no -youtube.pa -youtube.pe -youtube.ph -youtube.pk -youtube.pl -youtube.pr -youtube.pt -youtube.qa -youtube.ro -youtube.rs -youtube.ru -youtube.sa -youtube.se -youtube.sg -youtube.si -youtube.sk -youtube.sn youtube.soy -youtube.sv -youtube.tn -youtube.tv -youtube.ua -youtube.ug -youtube.uy -youtube.vnyoutubeeducation.comyoutubegaming.comyoutubego.co.idyoutubego.co.in youtubego.comyoutubego.com.br youtubego.id youtubego.inyoutubei.googleapis.comyoutubekids.comyoutubemobilesupport.com yt.be  ytimg.comand -chromedclkgbizgle gmailgoogoog -googleguge hangout nexus xn--qcka1pmc  google.ad  google.ae  google.al  google.am  google.as  google.at  google.az  google.ba  google.be  google.bf  google.bg  google.bi  google.bj  google.bs  google.bt  google.by  google.ca -google.cat  google.cd  google.cf  google.cg  google.ch  google.ci  google.cl  google.cm google.cn -cn google.co.ao google.co.bw google.co.ck google.co.cr google.co.id google.co.il google.co.in google.co.jp google.co.ke google.co.kr google.co.ls google.co.ma google.co.mz google.co.nz google.co.th google.co.tz google.co.ug google.co.uk google.co.uz google.co.ve google.co.vi google.co.za google.co.zm google.co.zw -google.com google.com.af google.com.ag google.com.ai google.com.ar google.com.au google.com.bd google.com.bh google.com.bn google.com.bo google.com.br google.com.bz google.com.co google.com.cu google.com.cy google.com.do google.com.ec google.com.eg google.com.et google.com.fj google.com.gh google.com.gi google.com.gt google.com.hk google.com.jm google.com.kh google.com.kw google.com.lb google.com.ly google.com.mm google.com.mt google.com.mx google.com.my google.com.na google.com.ng google.com.ni google.com.np google.com.om google.com.pa google.com.pe google.com.pg google.com.ph google.com.pk google.com.pr google.com.py google.com.qa google.com.sa google.com.sb google.com.sg google.com.sl google.com.sv google.com.tj google.com.tr google.com.tw google.com.ua google.com.uy google.com.vc google.com.vn  google.cv  google.cz  google.de  google.dj  google.dk  google.dm  google.dz  google.ee  google.es  google.fi  google.fm  google.fr  google.ga  google.ge  google.gg  google.gl  google.gm  google.gr  google.gy  google.hn  google.hr  google.ht  google.hu  google.ie  google.im  google.iq  google.is  google.it  google.je  google.jo  google.kg  google.ki  google.kz  google.la  google.li  google.lk  google.lt  google.lu  google.lv  google.md  google.me  google.mg  google.mk  google.ml  google.mn  google.ms  google.mu  google.mv  google.mw  google.ne  google.nl  google.no  google.nr  google.nu  google.pl  google.pn  google.ps  google.pt  google.ro  google.rs  google.ru  google.rw  google.sc  google.se  google.sh  google.si  google.sk  google.sm  google.sn  google.so  google.sr  google.st  google.td  google.tg  google.tl  google.tm  google.tn  google.to  google.tt  google.vg  google.vu  google.ws 0emm.com  1e100.net  1ucrs.com -466453.com abc.xyz adgoogle.net -admeld.comangulardart.org -api.ai -apigee.com appbridge.ca appbridge.io appbridge.it appspot.com -apture.com area120.com -asp-cc.com autodraw.com bandpage.combaselinestudy.combaselinestudy.org bazel.build bdn.devbeatthatquote.com  blink.org blogblog.com blogger.combrocaproject.com -brotli.org bumpshare.com -bumptop.ca bumptop.com bumptop.net bumptop.org bumptunes.comcampuslondon.com certificate-transparency.org chat.gle -chrome.comchromebook.comchromecast.com chromeos.dev chromium.orgcloudburstresearch.comcloudfunctions.netcloudrobotics.comcobrasearch.com codespot.com conscrypt.com conscrypt.orgcookiechoices.org  coova.com  coova.net  coova.orgcrossmediapanel.com crr.com  cs4hs.comdartsearch.netdataliberation.org  debug.comdebugproject.com deepmind.comdevsitetest.howdialogflow.comdigitalassetlinks.org episodic.comfeedburner.com -fflick.comfinanceleadsonline.comfirebaseapp.comfirebaseio.com -foofle.com froogle.com fuchsia.dev  g-tun.comg.cn -cng.co g.dev -g.pagegerritcodereview.comgetbumptop.com ggoogle.com gipscorp.com gkecnapps.cn -cn globaledu.org  gmail.com gmodules.com  gogle.com -gogole.comgonglchuangl.net -goo.gl -googel.com -googil.com  googl.comgoogle-syndication.com google.berlin -google.dev -google.net -google.orggoogle.ventures"googleacquisitionmigration.com googleapis.cn -cngoogleapis.comgoogleapps.comgooglearth.comgoogleblog.com googlebot.comgooglecapital.comgooglecert.netgooglecnapps.cn -cngooglecode.comgooglecommerce.comgooglecompare.co.ukgoogledanmark.comgoogledomains.comgoogledrive.com googlee.comgoogleearth.comgooglefiber.netgooglefinland.comgooglemail.comgooglemaps.comgooglepagecreator.comgooglephotos.comgoogleplay.comgoogleplus.comgooglesource.comgooglestore.comgooglesverige.comgoogleusercontent.comgoogleventures.com -googlr.com -goolge.com gooogle.com gridaware.app gsrc.io -gstatic.cn -cn gstatic.comgstaticcnapps.cn -cn -gsuite.com -gv.com gvt0.com gvt1.com gvt2.com gvt3.com gvt5.com gvt6.com gvt7.com gvt9.comhdrplusdata.org hey.gle hindiweb.comhowtogetmo.co.ukhtml5rocks.com hwgo.comiamremarkable.org igoogle.com impermium.com -j2objc.orgjibemobile.com keyhole.comkeytransparency.comkeytransparency.fookeytransparency.org lanternal.com like.commadewithcode.com material.io mdialog.com meet.newmfg-inspector.commobileview.pagemoodstocks.com near.by nest.com nomulus.foo -oauthz.com -ok.gle on.here on2.comonefifteen.netonefifteen.orgoneworldmanystories.com openthread.io openweave.io orbitera.com  page.linkpagespeedmobilizer.com pageview.mobi panoramio.compartylikeits1986.orgpaxlicense.org -picasa.com picasaweb.com picasaweb.net picasaweb.org -picnik.com pittpatt.com postini.comprojectara.comprojectbaseline.compublishproxy.comquestvisual.comquickoffice.com quiksee.com -revolv.comridepenguin.com run.appsavethedate.foo -saynow.com schemer.comscreenwisetrends.comscreenwisetrendspanel.com snapseed.com solveforx.com -stadia.devstcroixmosquito.comstcroixmosquitoproject.comstudywatchbyverily.comstudywatchbyverily.orgstxmosquito.comstxmosquitoproject.comstxmosquitoproject.netstxmosquitoproject.org synergyse.comtensorflow.org  tfhub.devthecleversense.comthegooglestore.comthinkquarterly.co.ukthinkquarterly.comthinkwithgoogle.com tiltbrush.com txcloud.net  txvia.comunfiltered.news useplannr.comusvimosquito.comusvimosquitoproject.comvelostrata.com -verily.comverilylifesciences.comverilystudyhub.comverilystudywatch.comverilystudywatch.org -wallet.com  waymo.com waze.com web.app web.devwebappfieldguide.comwebmproject.orgwebpkgcache.com -webrtc.orgweltweitwachsen.dewhatbrowser.org widevine.comwithgoogle.com womenwill.comwomenwill.com.br womenwill.id womenwill.in womenwill.mx  x.company -x.team xn--9kr7l.comxn--9trs65b.comxn--flw351e.com xplr.cozukunftswerkstatt.de265.com -cn2mdn.net -cn adservice.google.com -cnapp-measurement.com -cn beacons.gcp.gvt2.com -cnbeacons.gvt2.com -cnbeacons3.gvt2.com -cn c.admob.com -cn(c.android.clients.google.com -cn!cache.pack.google.com -cncheckin.gstatic.com -cn%clickserve.dartsearch.net -cn)clientservices.googleapis.com -cn)connectivitycheck.gstatic.com -cncorp.google.com -cn crl.pki.goog -cn"csi-china.l.google.com -cncsi.gstatic.com -cn dl.google.com -cndl.l.google.com -cndoubleclick.net -cn-!firebase-settings.crashlytics.com -cn fonts.googleapis.com -cnfonts.gstatic.com -cn google-analytics.com -cn googleadservices.com -cngoogleanalytics.com -cn!googlesyndication.com -cn googletagmanager.com -cn!googletagservices.com -cngtm.oasisfeng.com -cn!imasdk.googleapis.com -cn kh.google.com -cn ocsp.pki.goog -cn, pagead-googlehosted.l.google.com -cn!pki-goog.l.google.com -cn recaptcha.net -cnredirector.gvt1.com -cn)safebrowsing-cache.google.com -cn'safebrowsing.googleapis.com -cn$settings.crashlytics.com -cn-!ssl-google-analytics.l.google.com -cnssl.gstatic.com -cn%toolbarqueries.google.com -cntools.google.com -cntools.l.google.com -cn$translate.googleapis.com -cn!update.googleapis.com -cn-!www-googletagmanager.l.google.com -cnwww.gstatic.com -cnwww.recaptcha.net -cn0$^khm([0-3]|db)?\.google(apis)?\.com$ -cn  hinet.net -123-hp.com123hplaserjet.com8008206616.com as-hp.cabaterias-hp.com campushp.comcolorprotechnology.com -compaq.orgdavid-laserscanner.com demoprint.comdigitalpack.com eprintsw.comgaming-notebooks.comgetprintersupports.comhp-imagine.comhp-infolab.com hp-invent.comhp-invent.info -hp-mns.comhp-printing.comhp-webplatform.com  hp-ww.com -hp.com -hp.company hp.io hp3d.comhp3dmetals.comhp3dprinter.comhp3dsamplepromo.comhpallinoneprinter.comhpapplicationscenter.com hpbestbuy.comhpbluecarpet.comhpbluecarpet.nethpbuiltforlearning.com hpbundle.com hpcampus.comhpcatridge.com  hpccp.com  hpceo.com  hpcmw.nethpcodewarsbcn.comhpcomputers.comhpcomputerservices.comhpconnected.comhpconnected.nethpconnected.orghpconnected.ushpconnectedstage.comhpcontinuum.com  hpcpi.com hpcu.orghpcustomersupport.comhpcustomersupport.net -hpdaas.comhpdesignjetl25500.comhpdesktopcomputer.comhpdownloadstore.comhpdreamcolor.com hpdriver.com hpdrivers.com hpdrivers.org hpeclipse.com hpengage.com hpeprint.comhpeprintcenter.com hpeurope.comhpeventcenter.com -hpfaqs.comhpfeedback.com -hpgift.com -hpgpas.comhpgraphicspartners.com  hpiie.org -hpinc.info  hpinc.nethpindigopress.com hpinkjet.comhpinstantink.cahpinstantink.comhpkeyboard.com hplaptop.comhplaptopbattery.comhplargeformatremote.comhplatexknowledgecenter.com hplfmedia.com  hplip.nethplipopensource.comhpmarketplace.comhpmemorychips.comhpmicrcartridge.com -hpmini.com hpmobile.comhpofficejetprinter.comhponlinehelp.comhponlineprinting.comhppage5000.comhppavillionlaptop.comhpphotoscanners.comhpprinterdrivers.comhpprinterinstalls.comhpprintersupplies.comhpsalescentral.com hpserver.comhpservices.comhpshooping.com -hpshop.com hpshoping.com hpshopping.hk hpsignage.com hpsmart.com hpsmarts.comhpsmartstage.comhpsmartupdate.comhpsoftware.com hpspeaker.comhpsprocket.com  hpsso.comhpstore-china.comhpstore-emea.com -hpstore.cn -cn hpstore.comhpstorethailand.com hpsupport.comhpsuresupply.comhptechventures.com hpto.net hptouch.comhptouchpointmanager.comhptrainingcenter.com  hpuae.comhpuniversity.infohpusertraining.com -hpveer.comhpvirtualthin.com hpwallart.comhpwellnesscentral.com  hpwsn.com i-123-hp.com inkchoice.cominstantink.comleavinghpinc.comlife-global.orgmyhpsupport.com printeron.comprintersetupsupport.comprintspots.comprintspots.netserviceshp.comthecompaqstore.comtouchsmartpc.comtouchsmartpc.nettouchsmartpc.orgworkstations.tv www8-hp.comxn--6eup7j.comxn--6eup7j.nethpstore.corpmerchandise.comibmweatherchannel weather bluemix.com bluemix.net ibm.com -ibm.eu ibm.net -ibm.us s-bluemix.net s81c.com -01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net -oneapi.comopenvinotoolkit.orgsnap-telemetry.io -acpica.com clearlinux.cn -cnclearlinux.org -ospray.net -ospray.org intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn -cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn -cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt -altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com -intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn -cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com -niosii.com -niosii.netomekinteractive.com -omnitek.tv openamt.comopendroneid.orgoptanedifference.com -pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com -siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net -vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn -xscale.combarefootnetworks.com linkedin.com  licdn.com logi.comlogicool.co.jp logicoolg.com logitech.biz logitech.com logitech.fr logitechg.com logitechg.frworldsfastestgamer.net azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn -cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn -cnchinacloudapp.cn -cnchinacloudsites.cn -cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn -cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.combing bing.com bing.com.cn -cn bing.net bingads.combingagencyawards.combingapistatistics.combingsandbox.combingvisualsearch.com bingworld.combluehatnights.com -dictate.msflipwithsurface.commasalladeloslimites.commicrosoft-give.commicrosoftcloudsummit.commicrosoftdiplomados.commicrosoftlatamholiday.commicrosoftmxfilantropia.com!microsoftpartnersolutions.commsunlimitedcloudsummit.comoffice365love.comoffice365tw.comrenovacionoffice.comsprinklesapp.com cn.bing.com -cn cn.bing.net -cn ditu.live.com -cnbj1.api.bing.com -cnemoi-cncdn.bing.com -cn atom.io  npmjs.com npm.communitydependabot.com -git.io github.blog -github.comgithub.community  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.comadaptivecards.ioapi-extractor.com -apisof.net appcenter.ms -blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com -jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn -cn#microsoftreactor.com.cn -cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn -cn -sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.netmicrosoftnews.ccmicrosoftnews.cn -cnmicrosoftnews.commicrosoftnews.netmicrosoftnews.orgmicrosoftnewsforkids.commicrosoftnewsforkids.netmicrosoftnewsforkids.orgmicrosoftnewskids.commicrosoftnewskids.netmicrosoftnewskids.org msn.commsnewskids.commsnewskids.netmsnewskids.org msnkids.com 1drv.com 1drv.mslivefilestore.com onedrive.coonedrive.co.uk onedrive.com onedrive.eu onedrive.net onedrive.orgonedrive.live.comstorage.live.comcallersbane.com minecraft.netminecraftshop.com -mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org -xbox360.co xbox360.com -xbox360.eu xbox360.org -xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn -cn xboxlive.com -xboxone.co xboxone.com -xboxone.euxboxplayanywhere.comxboxstudios.com  microsoft azure hotmail -office skype windowsxbox microsoft.az microsoft.be microsoft.by microsoft.ca microsoft.cat microsoft.ch microsoft.cl microsoft.com microsoft.cz microsoft.de microsoft.dk microsoft.ee microsoft.es microsoft.eu microsoft.fi microsoft.ge microsoft.hu microsoft.io microsoft.is microsoft.it microsoft.jp microsoft.lt microsoft.lu microsoft.lv microsoft.md microsoft.pl microsoft.pt microsoft.red microsoft.ro microsoft.rs microsoft.ru microsoft.se microsoft.si microsoft.tv microsoft.ua microsoft.uz microsoft.vnfemalefounderscomp.com -m12.vc -aka.msankarazirvesi2018.comapplicationinsights.ioapplicationinsights.net aria.ms asp.net aspnetcdn.com -binads.com bluehatil.combrazilpartneruniversity.com breakdown.mecentralvalidation.com -ch9.mscharticulator.com cloudapp.netcloudappsecurity.comcortanaanalytics.comcortanaskills.comcrmdynint-gcc.com crmdynint.comcrossborderexpansion.com docs.com dynamics.com efproject.netazuredigitaltwin.comfasttrackreadysupport.comfluidpreview.comgameuxmasterguide.com -gears5.com gearspop.comgearstactics.com -gfx.ms -gigjam.com hololens.com -hotmail.co hotmail.com -hotmail.eu hotmail.net hotmail.orghummingbird.ms -ie8.co ie9.com ie10.com ie11.cominternetexplorer.cointernetexplorer.com imaginecup.pl -ingads.comintunewiki.comiotinactionevents.com -kidgrid.tvlatampartneruniversity.com live.com live.com.au live.eu live.netlivingyourambition.com makecode.orgmanagedmeetingrooms.commeetfasttrack.commeetyourdevices.com mepn.commicrosoft-int.commicrosoft-ppe.commicrosoft-sap-events.commicrosoft-sbs-domains.commicrosoft-smb.cn -cnmicrosoft365.commicrosoftaccountguard.commicrosoftads.commicrosoftadvertising.com*µsoftadvertisingregionalawards.commicrosoftaffiliates.commicrosoftcloud.commicrosoftcloudworkshop.com"microsoftcommunitytraining.commicrosoftedge.commicrosofthouse.commicrosofthouse.netmicrosoftinternetsafety.netmicrosoftlatamaitour.commicrosoftlinc.commicrosoftonline-p.commicrosoftonline.com!microsoftpartnercommunity.commicrosoftready.commicrosoftsiteselection.commicrosoftstore.commicrosoftstore.com.hkmicrosoftstream.commicrosoftteams.commicrosofttradein.commicrosofttranslator.commicrosoftuwp.commomentumms.commorphcharts.commpnevolution.comms-studiosmedia.comms365surfaceoffer.com  msads.net msauth.cn -cn -msauth.netmschallenge2018.com -msecnd.net -msedge.net  msft.info msft.net msftauth.cn -cn msftauth.netmsfteducation.ca msftnet.orgmsgamesresearch.com -msocdn.com -msocsp.com msturing.orgmsudalosti.commymicrosoft.comnextechafrica.net nxta.orgo365weve-dev.como365weve-ppe.com o365weve.com -office.com -office.net office365.com onenote.com onenote.net onestore.msopticsforthecloud.netoutingsapp.com outlook.com passport.net -pixapp.netpowerappscdn.netpowerautomate.com powerbi.compowershellgallery.comprojectmurphy.netprojectsangam.com -pxt.ios-microsoft.com  s-msn.com sfbassets.com sfbassets.net -sfx.ms sharepoint.cn -cnsharepoint.comsharepointonline.com  skype.com  skype.netskypeassets.comskypeassets.net staffhub.mssuccesswithteams.com surface.com sway-cdn.com sway.comsysinternals.comtailwindtraders.com -techhub.ms tfsallin.nettrafficmanager.nettranslatetheweb.comunlocklimitlesslearning.com -userpxt.iovideobreakdown.comvideoindexer.aivirtualearth.net vsallin.net -wbd.ms what-fan.netwindows-int.net windows.com windows.net -windows.nl windows8.hkwindowscommunity.netwindowsmarketplace.comwindowsphone-int.comwindowsphone.comwindowssearch.comwindowsupdate.com -winhec.com -winhec.net -yammer.comcdn.office.net -cn(dl.delivery.mp.microsoft.com -cn&download.windowsupdate.com -cn'bg.v4.a.dl.ws.microsoft.com -cn(bg4.v4.a.dl.ws.microsoft.com -cn2&cdn.marketplaceimages.windowsphone.com -cn cn.windowssearch.com -cn#ctldl.windowsupdate.com -cn#developer.microsoft.com -cndocs.microsoft.com -cn"download.microsoft.com -cn/#download.visualstudio.microsoft.com -cnfs.microsoft.com -cn(msgr.dlservice.microsoft.com -cn, msgruser.dlservice.microsoft.com -cn#officecdn.microsoft.com -cn&qh.dlservice.microsoft.com -cnsdx.microsoft.com -cn/#silverlight.dlservice.microsoft.com -cn, slupdate.dlservice.microsoft.com -cn, storeedgefd.dsx.mp.microsoft.com -cn&wl.dlservice.microsoft.com -cn&wscont1.apps.microsoft.com -cn&wscont2.apps.microsoft.com -cnwww.microsoft.com -cn&xb.dlservice.microsoft.com -cn/+img-prod-cms-rt-microsoft-com.akamaized.netimg-s-msn-com.akamaized.netmwf-service.akamaized.net)%officecdn-microsoft-com.akamaized.net3/statics-marketingsites-eus-ms-com.akamaized.net40statics-marketingsites-wcus-ms-com.akamaized.net firefox.comdeveloper.mozilla.org($interactive-examples.mdn.mozilla.netmdn.mozillademos.orgmedia.prod.mdn.mozit.cloud rust-lang.org  rustup.rs  crates.io docs.rsmozilla.community mozilla.net mozilla.org bugzilla.org getpocket.comseamonkey-project.orgthunderbird.net -lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net -nhncorp.jp grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net neuralink.com -geforce.cn -cn geforce.co.kr geforce.co.uk geforce.comgeforce.com.twgputechconf.cn -cngputechconf.co.krgputechconf.comgputechconf.com.augputechconf.com.twgputechconf.eugputechconf.ingputechconf.jp nvidia.asia  nvidia.be  nvidia.ch nvidia.cn -cn nvidia.co.jp nvidia.co.kr -nvidia.com nvidia.com.au nvidia.com.br nvidia.com.tr nvidia.com.tw  nvidia.cz  nvidia.de  nvidia.dk  nvidia.es  nvidia.eu  nvidia.fi  nvidia.fr  nvidia.it  nvidia.lu  nvidia.nl  nvidia.no  nvidia.pl  nvidia.ro  nvidia.ru  nvidia.seshotwithgeforce.com -oracle -oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com -bronto.comcovid19-rx.org covid19rx.org sun.com addthis.comaddthiscdn.comaddthisedge.comjava java.com java.net  razer.comrazersupport.com razerzone.com razerzone.jprespawnbyrazer.com appcloud.comappexchange.com attic.iobeyondcore.combuddymedia.com chatter.comcloudcraze.com cotweet.com data.comdemandware.com desk.comdocumentforce.comdreamforce.com einstein.comexacttarget.com  force.com govforce.comgravitytank.com heywire.com krux.commarketingcloud.com metamind.io -pardot.com quotable.com radian6.com relateiq.comsalesforce.comsalesforce.orgsalesforceiq.comsalesforceliveagent.com salesforcemarketingcloud.com sequence.comsfdcstatic.com -sforce.com site.com -social.comsteelbrick.com twinprime.comweinvoiceit.com samsung -xn--cg4bkigalaxyappstore.comgalaxymobile.jpgame-platform.net knoxemm.com samsung.comsamsungapps.comsamsungcloud.com samsungdm.comsamsungeshop.com.cn -cnsamsunggalaxyfriends.comsamsungknox.comsamsungqbe.com playstationplaystation.complaystation.net sonyentertainmentnetwork.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com -wwtbam.comyourfantasybeginsnow.comsonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl -sony.co.cr -sony.co.id -sony.co.in -sony.co.jp -sony.co.kr -sony.co.nz -sony.co.th -sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com -sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net -spacex.comboringcompany.com x.comads-twitter.com periscope.tv pscp.tvt.co tellapart.com tweetdeck.com  twimg.com twitpic.com twitter.com -twitter.jptwitterinc.comtwitteroauth.comtwitterstat.us twtrdns.net vine.couber-assets.com uber.com ubereats.com -oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com -xo.com mvk.com userapi.com  vk-cdn.me vk-portal.net vk.cc -vk.com  vk.design vk.link vk.me vkcache.com vkgo.app -vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.netg-technology.com -sandisk.ae -sandisk.it -sandisk.cn -cn sandisk.co.jp sandisk.co.kr sandisk.co.uk sandisk.comsandisk.com.ausandisk.com.brsandisk.com.trsandisk.com.tw -sandisk.de -sandisk.es -sandisk.fr -sandisk.hk -sandisk.id -sandisk.in -sandisk.nl -sandisk.sg -wd.com wdc.comwesterndigital.com -flickr -flickr.com -flickr.netstaticflickr.com ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn -cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn -cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com -myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com  ymail.comxn--d1acpjx3f.xn--p1ai  yandex.az  yandex.by yandex.co.il -yandex.com yandex.com.am yandex.com.ge yandex.com.tr  yandex.ee  yandex.kg  yandex.kz  yandex.lt  yandex.lv  yandex.md -yandex.net  yandex.ru  yandex.st  yandex.sx  yandex.tj  yandex.tm  yandex.ua  yandex.uzyandexcloud.net yastatic.net -yandex - -CATEGORY-VPNSERVICES 928.plus -zind.cloud aaex.uk amytele.com -ark.tobaicaonetwork.com bighead.groupblinkload.zone boslife.biz boslife.net  cloudn.me  conair.me cordcloud.org ctyun.online -cylink.procylink0122.icu dlercloud.com dlercloud.org dlercloud.me dleris.best duyaoss.com duyaossr.com hitun.ioxn--90wwvt03e.comjustmysocks.netjustmysocks1.netjustmysocks2.netjustmysocks4.net  maying.coxn--i2ru8q2qg.commocloudplus.com  mray.club muncloud.dog n3ro.fun  n3ro.live n3ro.net nexitally.comnexitallysafe.com nexitcore.com paofu.cloud paofuyun.me renzhe.cloud rixcloud.comshadowsocks.comshadowsocks.nlsquirrelvpn.comsquirrelgroup.net -ssplive.pwchina-internet-exchange.com cxkcloud.com ssrcloud.com ssrcloud.org -ssrpass.pwstc-server.com surflite.co surflite.net vilavpn.com vilavpn.xyz vilavpn1.xyz vilavpn2.xyz vilavpn3.xyz vilavpn4.xyz vilavpn5.xyz vilavpn6.xyz vilavpn7.xyz -4 -ZB -zb.app -zb.com zb.io zb.live -9 -YOUZAN -youzan.com yzcdn.cn youzanyun.com -& -CHINASO chinaso.com -pg0.cn -* -PAYPALaccount-paypal.infoaccount-paypal.netaccount-paypal.orgaccountpaypal.comaccountpaypal.netaccountpaypal.org anfutong.cn -cn anfutong.comanfutong.com.cn -cn beibao.cn -cn -beibao.com beibao.com.cn -cn bill-safe.combillmelater.combillmelater.infobillmelater.net bml.infobuyfast-paysmart.net cashify.comdevtools-paypal.comexperiencebillmelater.comfundpaypal.com -gmoney.org -i-o-u.infologin-paypal.comlogin-paypal.infomywaytopay.infomywaytopay.net -pa9pal.com paaypal.com  paily.net  paily.org -paipal.com -pavpal.com paydiant.com paylike.com -paypa1.com -paypa1.org paypaal.compaypal-activate.compaypal-activate.infopaypal-activate.orgpaypal-apac.compaypal-apps.compaypal-biz.compaypal-brandcentral.compaypal-business.compaypal-business.netpaypal-business.orgpaypal-cardcash.compaypal-cash.compaypal-center.compaypal-center.infopaypal-center.netpaypal-center.orgpaypal-communication.compaypal-communications.compaypal-communications.netpaypal-community.compaypal-community.netpaypal-comunidad.compaypal-corp.compaypal-database.compaypal-database.uspaypal-donations.compaypal-dynamic.compaypal-engineering.compaypal-europe.compaypal-excelinvoicing.compaypal-exchanges.compaypal-forward.compaypal-galactic.compaypal-gift.compaypal-gifts.compaypal-gpplus.compaypal-here.compaypal-hrsystem.compaypal-innovationlab.compaypal-integration.compaypal-japan.compaypal-knowledge.compaypal-labs.compaypal-latam.compaypal-learning.compaypal-login.compaypal-login.infopaypal-login.orgpaypal-login.uspaypal-luxury.compaypal-mainstreet.netpaypal-marketing.compaypal-media.compaypal-merchantloyalty.compaypal-mobilemoney.compaypal-network.orgpaypal-notice.compaypal-notify.compaypal-online.infopaypal-online.netpaypal-online.orgpaypal-optimizer.compaypal-pages.compaypal-photocard.compaypal-plaza.compaypal-portal.compaypal-prepagata.compaypal-prepagata.netpaypal-prepaid.compaypal-profile.compaypal-proserv.compaypal-qrshopping.orgpaypal-recargacelular.compaypal-redeem.compaypal-referral.compaypal-retail.compaypal-scoop.compaypal-search.compaypal-secure.netpaypal-secure.orgpaypal-security.netpaypal-security.orgpaypal-service.orgpaypal-signin.compaypal-signin.uspaypal-special.compaypal-specialoffers.compaypal-sptam.compaypal-support.compaypal-survey.compaypal-survey.orgpaypal-status.compaypal-team.compaypal-viewpoints.net  paypal.ca -paypal.com paypal.com.cn -cn paypal.com.hk paypal.com.sg  paypal.hk paypal.info  paypal.jp  paypal.me paypal.net.cn -cn paypal.org.cn -cn  paypal.so  paypal.uspaypalbeacon.compaypalbenefits.compaypalbrasil.compaypalcommunity.cn -cnpaypalcommunity.compaypalcommunity.netpaypalcommunity.orgpaypalcorp.compaypalcredit.compaypalcreditcard.compaypalgivingfund.org paypalhere.cn -cnpaypalhere.compaypalhere.com.cn -cnpaypalhere.infopaypalhere.netpaypalhere.org paypalhere.tv paypali.net paypalinc.compaypalindia.compaypalinsuranceservices.org paypall.compaypallabs.com paypalme.com paypalnet.net paypalnet.orgpaypalnetwork.infopaypalnetwork.netpaypalnetwork.orgpaypalobjects.compaypalonline.netpaypalonline.orgpaypalprepagata.compaypalprepagata.netpaypalservice.compaypalshopping.compaypalshopping.netpaypalsurvey.com paypalx.com paypaly.com payppal.com payypal.compdncommunity.com -pp-soc.com ppaypal.com  pppds.com pypl.com  pypl.info pypl.net pypl.tvsecure-paypal.infosecurepaypal.info sslpaypal.orgthepaypalshop.comtheshoppingexpresslane.netwww-paypal.info www-paypal.usxn--bnq297cix3a.cn -cnbraintreegateway.combraintreegateway.tvbraintreepayments.combraintreepayments.infobraintreepayments.orgbraintreepayments.tv!braintreepaymentsolutions.combraintreeps.combriantreepayments.netbriantreepayments.tv card.iogetbraintree.com krakenjs.comloanbuilder.comswiftcapital.com simility.com cashify.netswiftbank.info swiftbank.usswiftfinancial.comswiftfinancial.infoswiftfinancial.netvenmo-touch.com  venmo.com -venmo.info  venmo.net  venmo.org  cash2.comfilipino-music.net -s-xoom.comwebmoneyinfo.com2.wiremoneytoirelandwithxoomeasierandcheaper.com wwwxoom.comxoom-experience.com xoom.com xoom.io xoom.net.cn -cn xoom.us xoomcom.comvenmo.s3.amazonaws.com -& -SMZDM  smzdm.com -zdmimg.com - - -CHOCOLATEYchocolatey.org -, -MEDIUM -medium.commedium.systems -" - RASPBERRYPIraspberrypi.org -^ -BITAUTO bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com -. -NOTION  notion.sonotion-static.com -: -WEIPHONE feng.com fengimg.com wfdata.club -! -WANFANGwanfangdata.com.cn - -SHIELDS -shields.io - -CCTV cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn -cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn -cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn -ipanda.com ipanda.com.cn -ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn -k - CHEETAHMOBILE cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.com - -MINGW  mingw.org - -IUS -ius.io - -OOKLA-SPEEDTEST  cdnst.net cellmaps.com ekahau.cloud -ekahau.com  ookla.comooklaserver.net pingtest.net speedtest.co speedtest.netspeedtestcustom.com webtest.netOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ -ads - - -CRAIGSLISTcraigslist.org -5 -V2RAY  v2ray.com -v2ray.cool  v2fly.org -m -WPS -wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn - -TGBUS  tgbus.com -o -UNITY  unity.com unity3d.com!unityads.unity3d.com -ads#unityads.unitychina.cn -ads -S - UNITY-ADS!unityads.unity3d.com -ads#unityads.unitychina.cn -ads -+ -BAIDU a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -ads zuoyebang.cc zuoyebang.com -zybang.com baidu -91.com -aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com -baifae.com baifubao.com -bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn -bdydns.com -bdydns.net chuanke.com  dlnel.com  dlnel.org -duapps.com -dwz.cn -hao123.com hao123img.com -hao222.com -haokan.com jomocdn.net jomodns.com -mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com - - TRUSTWAVE trustwave.com - -VK mvk.com userapi.com  vk-cdn.me vk-portal.net vk.cc -vk.com  vk.design vk.link vk.me vkcache.com vkgo.app -vklive.appvkmessenger.comvkmessenger.app vkontakte.ruvkuseraudio.comvkuserlive.netvkuservideo.comvkuservideo.net -; -XUEERSI speiyou.com -xesimg.com xueersi.com - -DETTOLdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk -dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn -cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie -dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ar - -GENTOO -gentoo.org -- -LANTERNgetlantern.org -lantern.io -o -IFANR coolbuy.com  ifanr.com ifanr.inifanrusercontent.com -ifanrx.com -minapp.com -" - SINOINSIDERsinoinsider.com - -WTO wto.org - -JUEJIN  juejin.imb-gold-cdn.xitu.iomirror-gold-cdn.xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com - -MUJI muji.com muji.com.cn -cn muji.com.hk muji.eu muji.net muji.tw muji.us mujikorea.net -B -RBaerogard.com.auaerogard.com.cn -cnaerogardcn.com -airwick.at -airwick.be -airwick.ca -airwick.ch -airwick.cl airwick.co.in airwick.co.nz airwick.co.uk airwick.co.za airwick.comairwick.com.auairwick.com.brairwick.com.cn -cnairwick.com.mxairwick.com.tr -airwick.cz -airwick.de -airwick.dk -airwick.es -airwick.fi -airwick.fr -airwick.hr -airwick.hu -airwick.ie -airwick.it -airwick.jp airwick.net -airwick.nl -airwick.no -airwick.pl -airwick.pt -airwick.ro -airwick.ru -airwick.se -airwick.si -airwick.sk -airwick.tv -airwick.usairwickarabia.com vipoo.es  calgon.at  calgon.be  calgon.ch calgon.cn -cn calgon.co.uk -calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com clearasil.cn -cnclearasil.com.cn -cn clearasil.usdettol-prize.com  dettol.at  dettol.be  dettol.ch  dettol.cl dettol.co.id dettol.co.in dettol.co.ke dettol.co.nz dettol.co.uk -dettol.com dettol.com.au dettol.com.bd dettol.com.br dettol.com.cn -cn dettol.com.eg dettol.com.hk dettol.com.my dettol.com.ng dettol.com.sg  dettol.cz  dettol.fr  dettol.hu  dettol.ie -dettol.net  dettol.nl  dettol.pk  dettol.pl  dettol.pt  dettol.rudettolarabia.comdettolcleannaija.comdettolsitishield.co.indettolthailand.comespadoldettol.com.ardewitwithdurex.com dotherex.com durex-shop.chdurex-shopline.comdurex-slovenia.si durex.at durex.be durex.cl durex.co.id durex.co.il durex.co.nz durex.co.th durex.co.uk durex.co.za  durex.com durex.com.au durex.com.bd durex.com.cn -cn durex.com.co durex.com.hr durex.com.my durex.com.ng durex.com.pe durex.com.ph durex.com.pk durex.com.sg durex.com.tr durex.cz durex.de durex.dk durex.ee durex.es durex.fi durex.fr durex.hu durex.ie durex.it durex.jp durex.lv durex.mx durex.nl durex.no durex.pl durex.pt durex.ro durex.ru durex.se durex.us durexcam.comdurexcanada.comdurexchina.comdurexchina.com.cn -cndurexindia.comdurexloveclub.comdurexukraine.com durexusa.comlovesexdurex.cn -cnlovesexdurex.complaybydurex.com shopdurex.com trydurex.net trydurex.tvbebepremium3.com.bo -enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph -enfamil.ca enfamil.com -enfamil.es -enfamil.pl -enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl$dishwashingexpert.com.cn -cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn -cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com lizol.co.in lysol.ca lysol.cllysol.cn -cn lysol.co.cr  lysol.com lysol.com.cn -cn lysol.com.mx  lysol.netenfinitas.com.cn -cnmeadjohnson.commeadjohnson.com.cn -cnmeadjohnson.com.hkmeadjohnson.com.twmeadjohnson.net -mortein.cn -cn mortein.co.in mortein.co.nz mortein.co.za mortein.commortein.com.aumortein.com.brmortein.com.ngmortein.com.pkmorteincam.compifpafarabia.comkeepmovingwithmovefree.com move-free.net movefree.cn -cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com -mucinex.ca -mucinex.cn mucinex.co.nz mucinex.commucinex.com.cn mucinex.net -mucinex.tvmucinexprofessional.com -nurofen.at -nurofen.bg -nurofen.cn -cn nurofen.co.il nurofen.co.nz nurofen.co.uk nurofen.co.za nurofen.comnurofen.com.aunurofen.com.cn -cnnurofen.com.sg -nurofen.cz -nurofen.de -nurofen.es -nurofen.fr -nurofen.hr -nurofen.hu -nurofen.ie -nurofen.it nurofen.net -nurofen.no -nurofen.pl -nurofen.pt -nurofen.ro -nurofen.sk -nurofen.runurofengel.com51nurofensk-prod-env.eu-west-1.elasticbeanstalk.com -cepacol.ca cepacol.com dobendan.degraneodin.com.mx -repsils.no strepsils.at strepsils.ch strepsils.cn -cnstrepsils.co.krstrepsils.co.nzstrepsils.co.zastrepsils.com.arstrepsils.com.brstrepsils.com.cn -cnstrepsils.com.costrepsils.com.austrepsils.com.hkstrepsils.com.phstrepsils.com.tw strepsils.es strepsils.fi strepsils.fr strepsils.hr strepsils.hu strepsils.ie strepsils.net strepsils.pl strepsils.pt strepsils.ro strepsils.ru strepsils.si strepsils.usstrepsilsarabia.como2action.co.krpowerofresolve.capowerofresolve.comspraynwash.com  vanish.at  vanish.be  vanish.ch  vanish.cl vanish.cn -cn vanish.co.id vanish.co.il vanish.co.in vanish.co.nz vanish.co.uk vanish.co.za vanish.com.ar vanish.com.br vanish.com.co vanish.com.hr vanish.com.mx vanish.com.my vanish.com.pe vanish.com.sg vanish.com.tr  vanish.de  vanish.dk  vanish.es  vanish.fi  vanish.fr  vanish.hu  vanish.ie  vanish.it  vanish.nl  vanish.no  vanish.pl  vanish.pt  vanish.ro  vanish.ru  vanish.se  vanish.si  vanish.skvanisharabia.comvanishbancaseulook.com.brvanishcentroamerica.com vanishinfo.czvanishstains.comvanishstains.com.au veet.at veet.be veet.ca veet.ch veet.clveet.cn -cn -veet.co.id -veet.co.in -veet.co.kr -veet.co.nz -veet.co.uk -veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn -cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it -woolite.ca -woolite.cn -cn woolite.comwoolite.com.cn -cn -woolite.pl -woolite.uswoolitecarpet.comdigital-rb.com rb-crisis.com -rb.com -rb.netrbbusinessshop.comrbdigitalab.comrbdigitallab.comrbeuroinfo.com rbgrads.comrbgraduates.comrbmavericks.comrbnainternational.com  rbplc.comrbrandlibrary.com rbspeakup.com reckitt.netreckittbenckiser.cn -cnreckittbenckiser.com#reckittbenckiser.com.cn -cnreckittbenckiser.netreckittbenckiser.tvreckittprofessional.com - -GUOKR  guokr.com - -MARIADB mariadb.org -h -51JOB  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn - -AKASHA akasha.world - -CAIXIN -caixin.com - - -FANHAODIANfanhaodian.com - -JD-ADSads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads - - LINUXMINT linuxmint.com - - -STATICFILEstaticfile.org - - BLINKLOADblinkload.zone - -CATEGORY-ENTERTAINMENT abema.io abema.tv ameba.jp ao3.orgarchiveofourown.orgarchiveofourown.comarchiveofourown.net -att.tv atttvnow.comattwatchtv.com directv.com  dtvce.comnettyinternet.com gamer.com.twbahamut.com.twgamer-cds.cdn.hinet.netgamer2-cds.cdn.hinet.net bandcamp.com -bcbits.com bethesda.net doom.comelderscrolls.com blizzard.cn -cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn -cn -battle.netbattlenet.com.cn -cn bnet.163.com -cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com -cn!diablo3.nosdn.127.net -cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net -cnheroesofthestorm.com%hearthstone.nosdn.127.net -cn"heroes.nos.netease.com -cnplayoverwatch.com#overwatch.nosdn.127.net -cn starcraft.comstarcraft2.comsc2.nosdn.127.net -cnplaywarcraft3.comworldofwarcraft.com wowchina.com -cnwow.nosdn.127.net -cnblizzcon-a.akamaihd.netblz.nosdn.127.net -cnblzmedia-a.akamaihd.netblznav.akamaized.net blubrry.com  castro.fmdeviantart.comdeviantart.net da-files.comabc-studios.com abc.com edgedatg.com espn.com espncdn.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net -marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com -babble.com -dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.ca -disney.com disney.com.br  disney.iodisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneytvajobs.comdisneyworld-go.com -dssott.comgo-disneyworldgo.com -go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com dawngate.com eastore.comlordofultima.com -origin.com  origin.tv#cloudsync-prod.s3.amazonaws.comorigin-a.akamaihd.netrtm.tnt-ea.comssl-lvlt.cdn.ea.comawayoutgame.combattlefieldbadcompany2.combattlefront2.combattlefrontii.combejewled-stars.combejeweledstars.comcapitalgames.com chillingo.comcommandandconquer.comconquerwithcharacter.com  crysis.jp dawngate.comdawngatechronicles.com -dicela.com -dicela.netea-anz-press.com -ea.com eaaccess.comeacashcard.com eacodigos.com eakorea.co.kr eamobile.com eanordic.com -eaplay.com easports.com easports.jpeasportsactive.comeasportsactiveonline.comeasportsfootball.comeasportsfootballclub.comeasportsmma.comeasportsworld.comelectronicarts.comelectronicarts.fr futpromos.com futunited.comghostgames.comheroesofdragonage.com hutpromos.commaddenchampionship.commaddenrewards.commaddenseason.infomaddenseason.netmaddenseason.org  maxis.commysimsracing.com play4free.com playapex.com pogo.com pogobeta.com -popcap.comprojectapex.com pvzheroes.com spearhead.krspeedhunters.com  spore.com ssx3.comstarwarsbattlefront.comstarwarsbattlefront2.comtiberiumalliances.com tiburon.com -tnt-ea.comultimaforever.com unravel2.comunraveltwo.comvisceralgames.com -yogify.comanthemgame.comanthemthegame.comapexlegends.comprojectapex.combattlefield.combattlefield1943.combattlefield3.combattlefield4.combattlefield5.combattlefieldheroes.combattlefieldv.com battlelog.com bioware.combiowarestore.com eamythic.com eamythic.net cncrivals.comcommandandconquer.comtiberiumalliances.comcamelot-europe.comcamelotherald.comcamelotherald.net daoc.netdarkageofcamelot.comdarkness-risen.comdeadspacegame.com dice.se dragonage.comdragonagekeep.comdragonagemovie.comthedreadwolfrises.comdungeonkeeper.cndungeonkeeper.comdungeonkeeper.com.cneafootballworld.comfifastreet.comfifastreet3.com frostbite.comindustrialtoys.commasseffect.commasseffectarchives.comeamirrorsedge.commirrorsedge.commirrorsedge.jpmirrorsedge.netmirrorsedge2.commirrorsedge2d.comblackboxgames.comeablackbox.comneedforspeed.comneedforspeedboost.comneedforspeeddriftkings.comneedforspeedeliminator.comneedforspeedlightning.comneedforspeedoverdrive.comneedforspeedproven.comneedforspeedredline.comneedforspeedshowdown.comneedforspeedstreetkings.comneedforspeedtakedown.comneedforspeedtherun.comneedforspeedtimeattack.com#needforspeedundergroundeast.com nfsworld.comteamneedforspeed.complantsvszombies2.com -pvzgw2.com pvzheroes.comseaofsolitude.comsimcity-buildit.com simcity.com -skate2.com spearhead.krstarwarsfallenorder.comstarwarsjedifallenorder.comstarwarstheoldrepublic.comswjedifallenorder.com  swjfo.com  swtor.com  swtor.net -mysims.com thesims.com thesims3.com thesims4.comthesimssocial.com titanfall.commythicentertainment.commythicentertainment.netmythicgames.comultimaonline.com -uo.com uoherald.com xdsummit.comea.tt.omtrdc.neteaassets-a.akamaihd.netbattlebreakers.com epicgames.com fortnite.com paragon.complayparagon.comroborecall.comshadowcomplex.com spyjinx.comunrealengine.comunrealtournament.com6*^cdn\d-epicgames-\d+\.file\.myqcloud\.com$ -cn*&^epicgames-download\d\.akamaized\.net$;/^epicgames-download\d-\d+\.file\.myqcloud\.com$ -cn fireside.fm gog.comgog-statics.comgog.qtlglb.com -cn$gogalaxy.gog-statics.com -cn'menu-static.gog-statics.com -cn'productcard.gog-statics.com -cn(static-login.gog-statics.com -cn'www4-static.gog-statics.com -cn, ^images(-\d)?\.gog-statics\.com$ -cn cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk -hbomax.com -hbonow.com  maxgo.com -112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com -huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com -hulugo.com -huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com -huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com -hulutv.com huluusa.comjoinmaidez.com mushymush.tv -myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com imdb.com imdb.tomedia-imdb.cominternationalsaimoe.comkingkong.com.twkingkongapp.com litv.tv megaphone.fm moov.hk fast.com -netflix.ca netflix.com netflix.netnetflixinvestor.comnetflixtechblog.com nflxext.com nflximg.com nflximg.netnflxsearch.net -nflxso.net nflxvideo.netnico -nicodic.jp nicomanga.jp niconico.com nicoseiga.jp nicovideo.jp nimg.jp simg.jp100classicbooks.com -amiibo.comayudanintendo.combowsersinsidestory.comexcitebots.comflipnotestudio.comgloryofheracles.comhackyourconsole.comkirbysuperstarultra.comkirbysepicyarn.comlegendofzelda.cn -cn legendofzelda.com.cn -cn miitomo.commiitomo.com.cn -cn miiverse.com nentindo.netnintendo-europe-sales.comnintendo-europe.com nintendo.at nintendo.be nintendo.chnintendo.co.jpnintendo.co.krnintendo.co.uknintendo.co.za nintendo.comnintendo.com.hknintendo.com.pt nintendo.de nintendo.dk nintendo.es nintendo.eu nintendo.fi nintendo.fr nintendo.it nintendo.net nintendo.nl nintendo.no nintendo.pt nintendo.ru nintendo.se nintendo.twnintendo3ds.comnintendodsi.comnintendoeurope.comnintendolabo.cn -cnnintendonetwork.netnintendonyc.comnintendostore.comnintendoswitch.comnintendoswitch.netnintendoswitchtogether.compersonaltrainermath.complaynintendo.comsupersmashbros.cn -cn!supersmashbros.com.cn -cnthelegendarystarfy.comthewonderful101.comwariolandshakeit.comwariowarediy.comyoshisnewisland.comac-pocketcamp.comdiddykongracing.com dkr.com donkeykongcountryreturns.comfire-emblem-heroes.comfireemblemawakening.com -dialga.com giratina.com -kyurem.com pokedex3d.compokemon-moon.compokemon-sun.compokemon-sunmoon.com pokemon.compokemonbank.compokemonblackwhite.com pokemonbw.compokemonchampionships.compokemongoldsilver.compokemonhome.compokemonletsgoeevee.compokemonletsgopikachu.compokemonmysterydungeon.compokemonpicross.compokemonplatinum.compokemonrubysapphire.compokemonsunmoon.compokemonswordshield.compokemonultrasunmoon.compokemonvgc.compokemonwifi.net xn--mts47c3w9b1qr.cn -cnxn--mts47c3w9b1qr.netsplatoon2tournament.com starfox.comdrmario-world.commarioandluigidreamteam.commariobroswii.com mariokart.cn -cnmariokart.com.cn -cnmariokart7.commariokart8.commariosupersluggers.comnewsupermariobrosu.comsupermario.comsupermario3dworld.com!supermariobros.com.cn -cnsupermariogalaxy.comsupermariorun.comsuperpapermario.comnintendowii.com  wii-u.com -wiifit.com wiifitu.com wiipartyu.com wiisports.comwiisportsresort.comwiiugamepad.com  wiivc.net xenoblade.com op.ggopgg-static.akamaized.net overcast.fm  pixiv.net  pixiv.org pixiv.co.jp  pximg.net playstationplaystation.complaystation.net sonyentertainmentnetwork.com -pca.stpocketcasts.comhistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn -cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net -lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com -lpl.com.cn -cn pvp.net -pvp.tv ulol.comlolstatic-a.akamaihd.netrockstargames.com -rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com dishworld.comslinginternational.com  sling.commovenetworks.com -movetv.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com -wwtbam.comyourfantasybeginsnow.comsoundcloud.com -sndcdn.com byspotify.com pscdn.co scdn.co spoti.fispotify-everywhere.com spotify.comspotify.designspotifycdn.comspotifycharts.comspotifycodes.comspotifyforbrands.comspotifyjobs.com fanatical.comhumblebundle.complayartifact.com -s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com -cn csgo.wmsj.cn -cndl.steam.ksyna.com -cn dota2.wmsj.cn -cn st.dl.bscstorage.net -cnst.dl.eccdnx.com -cn!st.dl.pinyuncloud.com -cn&steampowered.com.8686c.com -cn%steamstatic.com.8686c.com -cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.netsteamunlocked.net syosetu.com -muscdn.com -musical.ly -tiktok.com tiktokcdn.com tiktokv.com#p16-tiktokcdn-com.akamaized.net ext-twitch.tv  jtvnw.net  ttvnw.net  twitch.tv twitchcdn.net twitchsvc.net ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com -cn -vhx.tv -vhxqa1.com -vhxqa2.com -vhxqa3.com -vhxqa4.com -vhxqa6.comvimeo-staging.comvimeo-staging2.com  vimeo.com vimeo.frvimeobusiness.com vimeocdn.comvimeogoods.comvimeoondemand.comvimeostatus.comlivestream.com abow.jp angelbeats.jp -anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp -viu.tvapi.viu.now.com^ewcdn[0-9]{2}\.nowe\.com$ viu.com dfp6rglgjqszk.cloudfront.net!d1k2us671qcoau.cloudfront.net!d2anahhhmp1ffz.cloudfront.net -weverse.io wwe.com wwe9.comcallersbane.com minecraft.netminecraftshop.com -mojang.comforzamotorsport.netforzaracingchampionship.com forzarc.comorithegame.comrenovacionxboxlive.comtellmewhygame.com xbox.co xbox.com xbox.eu xbox.org -xbox360.co xbox360.com -xbox360.eu xbox360.org -xboxab.comxboxgamepass.comxboxgamestudios.com xboxlive.cn -cn xboxlive.com -xboxone.co xboxone.com -xboxone.euxboxplayanywhere.comxboxstudios.com yande.re -got001.com -got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrysapp.com  yyets.com zmz2019.com -zmzapi.com cvnad.com -ads -iyoowi.com -ads -Q - CHINANEWS chinanews.comchinanews.com.cn -cns.com.cn ecns.cn -$ -CAS -csdl.ac.cn  las.ac.cn - - NBCUNIVERSALdreamworks.com cnbc.com -cnbcfm.com  msnbc.com -nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com -nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com - -115 115.com - - W3SCHOOLS w3schools.com -c -YOUKU -kumiao.com  youku.com  ykimg.com -mmstat.com soku.com -cibntv.net -) -LIANJIA lianjia.com  ljcdn.com -( -OPENCOLLECTIVEopencollective.com -: -POLYMERpolymer-project.orgpolymerproject.org - - CHINATELECOM -ctexcel.ca ctexcel.comctexcel.com.hk -ctexcel.fr -ctexcel.us -189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com -chntel.com - -EPORNER eporner.com -2 -KU6 ku6.com -ku6cdn.com -ku6img.com - -TIPDM -tipdim.org -. -FLUTTER flutter.devflutterapp.com -, -LINUXFROMSCRATCHlinuxfromscratch.org -+ - SEGMENT-ADScdn.segment.com -ads - - -NODESOURCEnodesource.com - -OPENSUSE opensuse.org -A -ACERacer-group.com acer.com acer.com.cn -cn - -FEEDLY -feedly.com - -KERNEL -kernel.org -$ -TAOMEE -61.com -taomee.com - - -VISUALARTS abow.jp angelbeats.jp -anigema.jpcharlotte-anime.jpclannad-movie.jpheaven-burns-red.comkamisama-day.jpkamisama-maeda-lab.com koubaibu.jplitbus-anime.com product.co.jprewrite-anime.tvvisualarts.gr.jpvisual-arts.jp -F - IDENTRUST identrust.comidentrust.co.uk identrust.net -0 -OPENWRT openwrt.orglede-project.org - -SOHU-ADSadnet.sohu.com -ads ads.sohu.com -ads!adv-sv-show.focus.cn -ads aty.sohu.com -adsdata.vod.itc.cn -adsepro.sogou.com -ads go.sohu.com -adsgolden1.sogou.com -adsimp.optaim.com -adsinte.sogou.com -adsinte.sogoucdn.com -adslu.sogoucdn.com -ads pv.sohu.com -adstheta.sogoucdn.com -adstrack.sohu.com -adsuranus.sogou.com -adsv2.reachmax.cn -ads)e8aeb8bbdbbd7.cdn.sohucs.com -ads)643108e7617ef.cdn.sohucs.com -ads -* -TELEKOM telekom.com -telekom.de -, -THENATIONALPULSEthenationalpulse.com -c - UMENG-ADSalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads -, -BANDCAMP bandcamp.com -bcbits.com - -FFMPEG -ffmpeg.org -$ -SCMP scmp.com -i-scmp.com -9 -ABCabc-studios.com abc.com edgedatg.com - -CUP -cup.com.hk - -VERIZON -flickr -flickr.com -flickr.netstaticflickr.com ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -ads yahoo yahoo.ae yahoo.am yahoo.as yahoo.at yahoo.az yahoo.ba yahoo.be yahoo.bg yahoo.bi yahoo.bs yahoo.bt yahoo.by yahoo.ca  yahoo.cat yahoo.cd yahoo.cg yahoo.ch yahoo.cl yahoo.cmyahoo.cn -cn yahoo.co.ao yahoo.co.bw yahoo.co.ck yahoo.co.cr yahoo.co.id yahoo.co.il yahoo.co.in yahoo.co.jp yahoo.co.kr yahoo.co.mz yahoo.co.nz yahoo.co.th yahoo.co.tz yahoo.co.uk yahoo.co.uz yahoo.co.ve yahoo.co.vi yahoo.co.za  yahoo.com yahoo.com.af yahoo.com.ag yahoo.com.ai yahoo.com.ar yahoo.com.au yahoo.com.bd yahoo.com.bo yahoo.com.br yahoo.com.bz yahoo.com.cn -cn yahoo.com.co yahoo.com.do yahoo.com.ec yahoo.com.eg yahoo.com.es yahoo.com.fj yahoo.com.gi yahoo.com.gt yahoo.com.hk yahoo.com.kw yahoo.com.lb yahoo.com.ly yahoo.com.mt yahoo.com.mx yahoo.com.my yahoo.com.na yahoo.com.nf yahoo.com.om yahoo.com.pa yahoo.com.pe yahoo.com.ph yahoo.com.pk yahoo.com.pr yahoo.com.py yahoo.com.sa yahoo.com.sb yahoo.com.sg yahoo.com.sv yahoo.com.tj yahoo.com.tr yahoo.com.tw yahoo.com.ua yahoo.com.uy yahoo.com.vc yahoo.com.vn yahoo.cz yahoo.de yahoo.dj yahoo.dk yahoo.dm yahoo.ee yahoo.es yahoo.fi yahoo.fm yahoo.fr yahoo.ge yahoo.gg yahoo.gl yahoo.gm yahoo.gp yahoo.gr yahoo.gy yahoo.hk yahoo.hr yahoo.hu yahoo.ie yahoo.im yahoo.in yahoo.is yahoo.it yahoo.je yahoo.jo yahoo.la yahoo.lt yahoo.lu yahoo.lv yahoo.md yahoo.me yahoo.mk yahoo.mw yahoo.mx  yahoo.net yahoo.nl yahoo.no yahoo.nu yahoo.ph yahoo.pl yahoo.pn yahoo.ps yahoo.pt yahoo.ro yahoo.ru yahoo.rw yahoo.se yahoo.sg yahoo.sh yahoo.si yahoo.sk yahoo.sm yahoo.sn yahoo.so yahoo.sr yahoo.st yahoo.tg yahoo.tk yahoo.tl yahoo.tm yahoo.tn yahoo.vg yahoo.ws maktoob.com -myguide.hkyahoo-news.com.hk yahooapis.com yahoodns.netyahoofinance.comyahoohealth.comyahoomusic.comyahoosportsbook.com yho.com yimg.com  ymail.com -oath.cloud oath.com ouroath.comstatic-verizon.com verizon.com verizon.netverizonbusinessfios.comverizonenterprise.comverizonfios.comverizonmedia.comverizonwireless.com vzw.com -xo.com - -STEAM fanatical.comhumblebundle.complayartifact.com -s.teamsteam-chat.comsteamcommunity.comsteamcontent.comsteamgames.comsteampowered.comsteamstatic.comsteamusercontent.comunderlords.comvalvesoftware.com wmsjsteam.com -cn csgo.wmsj.cn -cndl.steam.ksyna.com -cn dota2.wmsj.cn -cn st.dl.bscstorage.net -cnst.dl.eccdnx.com -cn!st.dl.pinyuncloud.com -cn&steampowered.com.8686c.com -cn%steamstatic.com.8686c.com -cn steambroadcast.akamaized.netsteamcdn-a.akamaihd.net!steamcommunity-a.akamaihd.netsteamstore-a.akamaihd.net#steamusercontent-a.akamaihd.net"steamuserimages-a.akamaihd.net - - TEST-IPV6 test-ipv6.com -4 - ARCHLINUX archlinux.orgarchlinuxarm.org - -BITMEX -bitmex.com - -ELSEVIER els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com -scopus.com - -LINOTYPE linotype.com - -MUNCLOUD muncloud.dog -L - -TEAMBITIONteambition.comteambition.netteambitionapis.com - -UNWIRE  unwire.hk - -AVGLE  avgle.com - - CALGONCARBON  calgon.at  calgon.be  calgon.ch calgon.cn -cn calgon.co.uk -calgon.com calgon.com.tr  calgon.de  calgon.es  calgon.fr  calgon.ie  calgon.it  calgon.nl  calgon.pt  calgon.ru  calgon.tvcalgoncarbon-china.comcalgoncarbon.com calgonit.com - -GCORES -gcores.com -L -LANZOU baidupan.com -lanzou.com lanzous.com woozooo.com - -MRAY  mray.club -/ - STARTPAGE startpage.com ixquick.com - -SUPERSONIC-ADSsupersonic.com -adssupersonicads.com -ads -ssacdn.com -ads)supersonicads-a.akamaihd.net -ads - -UNPKG  unpkg.com - -ADOBE typekit.com typekit.net10xfotolia.com 2o7.net acrobat.com adbecrsl.comadobe-aemassets-value.comadobe-audience-finder.com"adobe-video-partner-finder.com  adobe.com adobe.lyadobeaemcloud.comadobeaemcloud.netadobeawards.comadobecreativityawards.com adobedc.net adobedemo.com adobedtm.comadobeexchange.comadobeexperienceawards.com adobegov.comadobehiddentreasures.comadobejanus.com adobeku.comadobelogin.com adobeoobe.comadobeplatinumclub.comadobeprojectm.com adobesc.com adobesign.comadobesigncdn.comadobespark.com adobess.comadobestock.com adobetag.comadobetarget.comadobetcstrialdvd.comadobetechcomm.comadobetechcommcallback.comadobetechcommdemo.comadobexdplatform.comassetsadobe.com authorxml.combusinesscatalyst.com ccnsite.com  ccpsx.com -demdex.netdollarfotoclub.comdollarphotoclub.comdollarphotosclub.comdouwriteright.com echocdn.com echosign.com edgefonts.netenablementadobe.com  ftcdn.net gostorego.comimagineecommerce.commacromedia.commagentoliveconference.commarketing-nirvana.com omniture.com -omtrdc.net photoshop.complacesdocs.comsundanceignite2016.comworldsecureemail.comworldsecuresystems.com adobe.iodevelopria.com behance.nets2stagehance.com adobecc.com adobecce.comadobeccstatic.comcreativecloud.comcreativesdk.com cotolia.com ffotolia.com fiotolia.com foftolia.com fonolia.com fotiolia.com fotoiia.comfotolia-noticias.com -fotolia.cc fotolia.com -fotolia.tv fotolja.com fptolia.com gfotolia.com motolia.com photolia.nettenbyfotolia.com votolia.combluefootcms.com mageconf.commageconf.com.ua magento.com magento.netmagentocommerce.commagentomobile.commarketing-cloud.com marketo.co.uk marketo.com marketo.net -marketo.tvmarketodesigner.commarketolive.com -mktdns.commkto-c0100.com mktorest.com mktroute.commobilemarketo.com&"revenue-performance-management.com toutapp.com -F -COINONE coinone.co.krcoinonecore.comcoinonecorp.com - -DISNEYabc-studios.com abc.com edgedatg.com espn.com espncdn.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net -marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.comnatgeomaps.comnationalgeographic.com"nationalgeographicpartners.com ngeo.comadventuresbydisney.com -babble.com -dilcdn.comdisney-asia.comdisney-discount.comdisney-plus.netdisney-studio.comdisney-studio.net  disney.ca -disney.com disney.com.br  disney.iodisneyadsales.comdisneyarena.comdisneyaulani.comdisneybaby.comdisneycareers.comdisneychannelonstage.comdisneychannelroadtrip.comdisneycruisebrasil.comdisneyenconcert.comdisneyiejobs.comdisneyinflight.comdisneyjunior.comdisneyjuniortreataday.comdisneylatino.comdisneymeetingsandevents.comdisneymovieinsiders.comdisneymusicpromotion.comdisneynewseries.com disneynow.comdisneypeoplesurveys.comdisneyplus.comdisneyredirects.comdisneysrivieraresort.comdisneystore.comdisneysubscription.comdisneytvajobs.comdisneyworld-go.com -dssott.comgo-disneyworldgo.com -go.com  mickey.tvmoviesanywhere.complaymation.comshopdisney.comshops-disney.comsorcerersarena.comspaindisney.com starwars.com#starwarsgalacticstarcruiser.comstreamingdisney.netthestationbymaker.comthisispolaris.comwatchdisneyfe.com - -XHAMSTER xhamster.comxhamsterlive.com  xhcdn.comwidgets.stripst.com#collector.xhamster.com -ads - -QMAP qmap.pub -" - TYPENETWORKtypenetwork.com - -WHONIX -whonix.org -. -XUEQIUdanjuanfunds.com -xueqiu.com -Z -XUNLEI  00cdn.com  88cdn.com -sandai.netthunderurl.com -xunlei.com - -ICLOUDapple-icloud.cn -cnappleicloud.cn -cnapplemx-icloud.comicloud-apple.cn -cnicloud-content.comicloud-isupport.com  icloud.ch -icloud.com icloud.com.cn -cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn -cn  icloud.om -icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn -cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com -icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com -me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net -9 -MOGUJIE mogu.com mogucdn.com mogujie.com - -RIOThistoryofdota.comhistoryofdota.nethistoryofdota.orginstituteofwar.orgmolesports.com rgpub.ioriot-games.com riot.com riot.net riotcdn.netriotgames.co.kr riotgames.comriotgames.info riotgames.jp riotgames.net riotgames.tv riotpin.comriotpoints.com rstatic.net supremacy.com supremacy.net championshipseriesleague.com lcsmerch.comleaguehighschool.comleagueoflegends.caleagueoflegends.cn -cnleagueoflegends.co.krleagueoflegends.comleagueoflegends.infoleagueoflegends.krleagueoflegends.netleagueoflegends.orgleagueoflegendsscripts.comleaguesharp.infoleaguoflegends.comlearnwithleague.comlol-europe.com lolclub.org lolespor.comlolesports.com lolfanart.net -lolpcs.com lolshop.co.kr lolstatic.comlolusercontent.com -lpl.com.cn -cn pvp.net -pvp.tv ulol.comlolstatic-a.akamaihd.net -$ -INTEL -01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net -oneapi.comopenvinotoolkit.orgsnap-telemetry.io -acpica.com clearlinux.cn -cnclearlinux.org -ospray.net -ospray.org intel intel.ac intel.ae intel.af intel.ag intel.ai intel.ar intel.at intel.az intel.ba intel.bg intel.bh intel.bi intel.bo intel.bs intel.by intel.ca intel.cc intel.cg intel.ch intel.cl intel.cmintel.cn -cn intel.co.ae intel.co.cr intel.co.id intel.co.il intel.co.jp intel.co.kr intel.co.uk intel.co.za  intel.com intel.com.ar intel.com.au intel.com.bo intel.com.br intel.com.cn -cn intel.com.co intel.com.ec intel.com.hk intel.com.jm intel.com.mx intel.com.my intel.com.pe intel.com.ph intel.com.pr intel.com.py intel.com.tr intel.com.tw intel.com.uy intel.com.ve intel.cr intel.cu intel.cz intel.de intel.dk intel.dz intel.ec intel.ee intel.eg intel.es intel.eu intel.fi intel.fr intel.ga intel.gd intel.ge intel.gl intel.gm intel.gr intel.gs intel.gt intel.gy intel.hk intel.hn intel.ht intel.hu intel.ie intel.in intel.io intel.it intel.je intel.jo intel.jp intel.ke intel.la intel.lc intel.lk intel.lt intel.lu intel.ly intel.ma intel.md intel.me intel.mg intel.mk intel.mn intel.mp intel.mt intel.mu intel.mw intel.mx intel.my intel.ng intel.nl intel.nu intel.nz intel.pa intel.pe intel.ph intel.pl intel.pn intel.re intel.ro intel.ru intel.rw intel.sa intel.sc intel.se intel.sg intel.si intel.sk intel.sn intel.sr intel.st intel.sv intel.sx intel.sy intel.tf intel.tj intel.tl intel.tm intel.tn intel.tt intel.tv intel.tw intel.ua intel.uk intel.us intel.uy intel.uz intel.vg intel.vn intel.vu intel.wf intel.yt -altera.comalteraforum.comalteraforums.comalteraforums.netalterauserforum.comalterauserforum.netalterauserforums.comalterauserforums.net buyaltera.com celeron.com celeron.net centrino.com centrino.net  chips.com cilk.com cilk.netcloudinsights.comclusterconnection.com coreduo.comcoreextreme.comcrosswalk-project.comcrosswalk-project.netdoceapower.com  easic.com enpirion.comexascale-tech.comexploreintel.comgordonmoore.cominsidefilms.com intc.comintel-research.net&"intel-university-collaboration.netintelamericasstore.comintelapacstore.com intelatom.netintelcapital.comintelcapital.netintelcloudbuilders.comintelcloudfinder.comintelemeastore.cominteleventexpress.comintelforchange.comintelfreepress.com intelgo.netintelinsight.cominteliotmarketplace.com -intell.comintellearningseries.comintellinuxwireless.netintelnervana.comintelnet.component intelplay.comintelquark.comintelrealsense.cn -cnintelrealsense.com intelrxt.comintelsalestraining.comintelsecurity.comintelserveredge.comintelsoftwarenetwork.comintelstore.cominteltechnologyprovider.com intelvmwarecybersecurity.com  itnel.comlatencytop.comlookinside.commakebettercode.commakesenseofdata.com movidius.com movidius.netnervanasys.com  nevex.comnextgenerationcenter.com -niosii.com -niosii.netomekinteractive.com -omnitek.tv openamt.comopendroneid.orgoptanedifference.com -pc.com pentium.com pentium.net pintool.compoweredbyintel.comreconinstruments.com reconjet.comresearchintel.comsaffrontech.comsensorynetworks.com -siport.comsmart-edge.comtheintelstore.comthunderbolttechnology.nettrustedanalytics.comtrustedanalytics.net -vokevr.com vpro.com vpro.net xeon.comxn--ztsq84g.cn -xscale.combarefootnetworks.com - -SINA  97973.com -picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com -sinaimg.cn sinaimg.com  sinajs.cn -sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -ads -D - -POCOIQ-ADS cdn.pocoiq.cn -ads oct.pocoiq.cn -ads - -VERISIGN verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com -5 -COLORFULCLOUDS caiyunai.com caiyunapp.com -% - FONTEXPLORERfontexplorerx.com - -GLYPHS glyphsapp.com - - -FAMILYMARTfamifun.com.tw family.co.jp family.com.twfamilymart.com.cn -cnfamilymart.com.myfamilymart.com.ph  famima.vn - -WALMART walmart wal-mart.com -wal.cowalmart-content.com walmart.comwalmart.pharmacywalmartimages.com -wmt.co - -OVERCAST overcast.fm -f -COURSERAcoursera-for-business.orgcoursera.community coursera.help coursera.org -2 -INTERNATIONALSAIMOEinternationalsaimoe.com - -MACPORTS macports.org - -BADGEN -badgen.net -" - SHADOWSOCKSshadowsocks.org -; - SCORELAND scoreland.comcdn77.scoreuniverse.com - - -BLOGSPOT blogspot.ae blogspot.al blogspot.am blogspot.ba blogspot.be blogspot.bg blogspot.bj blogspot.ca blogspot.cf blogspot.ch blogspot.clblogspot.co.atblogspot.co.idblogspot.co.ilblogspot.co.keblogspot.co.nzblogspot.co.ukblogspot.co.za blogspot.comblogspot.com.arblogspot.com.aublogspot.com.brblogspot.com.byblogspot.com.coblogspot.com.cyblogspot.com.eeblogspot.com.egblogspot.com.esblogspot.com.mtblogspot.com.ngblogspot.com.trblogspot.com.uy blogspot.cv blogspot.cz blogspot.de blogspot.dk blogspot.fi blogspot.fr blogspot.gr blogspot.hk blogspot.hr blogspot.hu blogspot.ie blogspot.in blogspot.is blogspot.it blogspot.jp blogspot.kr blogspot.li blogspot.lt blogspot.lu blogspot.md blogspot.mk blogspot.mx blogspot.my blogspot.nl blogspot.no blogspot.pe blogspot.pt blogspot.qa blogspot.re blogspot.ro blogspot.rs blogspot.ru blogspot.se blogspot.sg blogspot.si blogspot.sk blogspot.sn blogspot.td blogspot.tw blogspot.ug blogspot.vn - -ELREPO -elrepo.org - -GITHUB atom.io  npmjs.com npm.communitydependabot.com -git.io github.blog -github.comgithub.community  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com - -SSRPASS -ssrpass.pw - - WIKIMEDIA mediawiki.org wikibooks.org wikidata.orgwikimediafoundation.org wikimedia.org wikinews.org wikipedia.org wikiquote.orgwikisource.orgwikiversity.orgwikivoyage.orgwiktionary.orgwmfusercontent.org -w.wiki toolforge.orgwikimediacloud.org wmcloud.org wmflabs.org - -YYETS -got001.com -got002.com jstucdn.com playcvn.com rrys.tv rrys2019.com rrysapp.com  yyets.com zmz2019.com -zmzapi.com cvnad.com -ads -iyoowi.com -ads - -BITCOIN bitcoin.org -ҍ -GEOLOCATION-CN -42r.cn -5566ua.com aurorapush.cn -e0n.cn japps.cn jchat.io -jiguang.cn jmlk.co jpush.cn jpush.io jpushoa.com -jsurvey.cn  jvoice.cn -kc9.cn -n0q.cn pushcfg.com -s0n.cn mobmore.com  umeng.comumengcloud.com  umsns.com umtrack.com -uyunad.comwhalecloud.comalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads bootcss.com -bootcdn.cnphpcomposer.com -maoyun.commaoyuncloud.cnmaoyuncloud.comstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com  qnssl.com  ucloud.cn ufileos.com  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com  8686c.comchinanetcenter.com -wangsu.com ourdvsss.com yfcache.com -yfcalc.com yfcloud.com  yfdts.net  yfp2p.net -yfscdn.net yunfancdn.com -boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.comicbc icbc-ltd.com icbc-us.com icbc.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com  whccb.com cebbank.com ceblease.com -eb-ind.com ebasset.com ebchina.comebchinaintl.com -ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com taikang.comtaikanglife.comtaikangzhijia.comtkhealthcare.comdanjuanfunds.com -xueqiu.com -58.com  58.com.cn 5858.com  58che.com 58xueche.com -anjuke.comanjukestatic.com chinahr.com -daojia.com diandao.org fang.com  sofun.com soufunimg.com  jxedt.com zhuancorp.comzhuanspirit.comzhuanzhuan.com c-ctrip.com colinker.com ctrip.cn ctrip.co.id ctrip.co.kr ctrip.co.th  ctrip.com ctrip.com.hk ctrip.my ctrip.sg ctripbiz.com ctripbuy.hk ctripteam.com doticloud.com easytrip.com hhtravel.comhhtravel.com.tw izuchebao.com  lvtds.com  shuntu.cn -skysea.com  suanya.cn -suanya.com -tieyou.com -toptown.cn toursbms.com trip.com tripcdn.com -vipdlt.com dangdang.com ddimg.cn -ele.me elemecdn.com eleme.cn  ganji.comganjistatic1.com3.cn  300hu.com -360buy.com 360buyimg.com -360top.com -7fresh.com baitiao.comblackdragon.com  caiyu.comchinabank.com.cn -dao123.comjcloud-cdn.comjcloud-live.comjcloud-oss.com -jcloud.comjcloudcache.com jcloudcs.com jclouddn.com jcloudec.com jcloudlb.comjcloudlive.com jcloudlv.com jcloudoss.com jcloudss.comjcloudstatic.comjcloudvideo.com  jclps.com -jd-app.com  jd-ex.com jd.cn jd.co.th -jd.com jd.hk jd.id jd.ru jdcache.com jdcloud.com jdcloudcs.comjdcloud-api.comjddapeigou.com jddebug.com jddglobal.com jdjinrong.com  jdpay.com jdpaydns.com jdx.com jdwl.comjingdongjinrong.com -jingxi.com -jkcsjd.com -joybuy.com  joybuy.eslinglonglife.com mayshijia.com minitiao.com  ocwms.com paidaojia.cn -paipai.comprestodb-china.com qianxun.comqingzhouip.com toplife.com -vg.com wangyin.com  wdfok.com yhd.com yihaodian.comyihaodianimg.com yiyaojd.com yizhitou.comads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads lianjia.com  ljcdn.com manmanbuy.com dianping.com -maoyan.com meituan.com meituan.net  mtyun.com  neixin.cn sankuai.com mogu.com mogucdn.com mogujie.com -pddpic.com pinduoduo.com yangkeduo.com  smzdm.com -zdmimg.com cnsuning.com -suning.comsuningcloud.comsuningestate.comsuningholdings.com 40017.cn -17u.cn 17u.net 17usoft.com 17usoft.net  elong.comelongstatic.com -ly.com  vancl.com vanclimg.com  vcimg.com -youzan.com yzcdn.cn youzanyun.com -ziroom.comziroomapartment.com 3dmgame.com 3304399.net 4399.com 4399api.com 4399dmw.com -4399er.com4399youpai.com 5054399.com img4399.com acfun.cn aixifan.com apilog-web.acfun.cn -ads -acplay.netdandanplay.com -ali213.net -acg.tv acgvideo.com -b23.tv biliapi.com biliapi.net bilibili.combilibiligame.net biligame.com biligame.net bilivideo.com  hdslb.com im9.com -mincdn.com$ upos-hz-mirrorakam.akamaized.net biji.com -ddmogo.com -igetget.cn igetget.com luojilab.com  mogoo.com -sao.cn saolife.com dmzj.com  douyu.com douyu.tv douyucdn.cn douyucdn2.cn douyuscdn.com douyutv.com gamersky.com -gcores.com gitv.cn gitv.tv huya.com msstatic.com 71.am  iqiyi.com iqiyipic.com -pps.tv -ppsimg.com qiyi.com qiyipic.com -qy.net -71edge.coma.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -ads  jjwxc.net ku6.com -ku6cdn.com -ku6img.com kkmh.comkuaikanmanhua.com gifshow.com ksapisrv.com kuaishou.com -yximgs.com log-sdk.gifshow.com -adswlog.kuaishou.com -ads  kgimg.com  kugou.com -le.com lecloud.com -lemall.com letv.com letvcdn.com letvimg.com miaopai.com -mihoyo.com bh3.com  pplive.cn -pplive.com pptv.com qingting.fm  sfacg.com -61.com -taomee.com -tapimg.com -taptap.com  tgbus.com tiancity.comtiancitycdn.com u17.com u17i.com u17t.com -vgtime.com ximalaya.com  xmcdn.com -kumiao.com  youku.com  ykimg.com -mmstat.com soku.com -cibntv.net -duowan.com dwstatic.com -yy.com yystatic.com -heytea.com chiphell.com -douban.com  douban.fm doubanio.com erji.net -hacpai.com -nga.cn 178.com -ngabbs.com ngacn.cc saraba1st.com  zhihu.com  zhimg.com  feng1.comrongechain.comsf-airlines.comsf-cityrush.comsf-express.comsf-financial.com sf-saas.comsf-tech.com.cn sfcar.hk sffix.cn sfgy.org 36kr.com 36krcdn.com  dgtle.comhoopchina.com.cn hupu.com hupucdn.com  shihuo.cn coolbuy.com  ifanr.com ifanr.inifanrusercontent.com -ifanrx.com -minapp.com -caixin.com cctv.cn cctv.com cctvpic.com chinaepg.cn chinalive.com citv.net.cn cnms.net.cn cntv.cn cntv.com.cn -cctvlib.cncctvlibrary.cncctvlib.com.cncctvlibrary.com.cn -cctvpro.cncctvpro.com.cn  cntvwb.cn gjgbdszt.cngjgbdszt.com.cngjgbdszt.net.cn  ipanda.cn -ipanda.com ipanda.com.cn -ipanda.net livechina.cn livechina.comolympicchannelchina.cn tvcc.cn tvcc.com.cn%!xn--fiq53l6wcx3kp9bc7joo6apn8a.cn%!xn--fiq53l90et9fpncc7joo6apn8a.cn-)xn--fiq53l6wcx3kp9bc7joo6apn8a.xn--fiqs8s%!xn--kprv4ewxfr9cpxcc7joo6apn8a.cn-)xn--kprv4ewxfr9cpxcc7joo6apn8a.xn--fiqs8s zggbdszt.cnzggbdszt.com.cnzggbdszt.net.cnzygbdszt.net.cn chinanews.comchinanews.com.cn -cns.com.cn ecns.cn geekpark.net jiemian.comjiemian.com.cn -lancdn.comlandiannews.com  wsoso.com  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com 6655.com cooldock.com -ithome.com lapin365.com ruanmei.com -saayaa.com win7china.com win8china.com sohu.com -sohucs.com -itc.cn solidot.org  sspai.com tmtpost.com chaindd.com -72whys.com checkzeit.com -tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com feng.com fengimg.com wfdata.club ynet.cn ynet.com ynet.com.cnhainanairlines.com hnacargo.com  hnair.com 10044.cnsinopec-usa.com sinopec.comsinopecgroup.comsinopecnews.com.cnsinopecsales.com -csdl.ac.cn  las.ac.cn  fuwai.com pkuh6.cn puh3.net.cnhospital.pku.edu.cnss.bjmu.edu.cn 115.com 3type.cn 4paradigm.com  51job.com 51jobcdn.comyingjiesheng.comyingjiesheng.netzhiding.com.cn -afdian.net afdiancdn.com agora.io -agoraio.cn agoralab.co -antutu.com bitauto.combitautoimg.com cheyisou.com  yiche.com  yccdn.com shimo.im  yuque.com chinaso.com -pg0.cn -chinaz.com -chinaz.net caiyunai.com caiyunapp.com coolapk.comcoolapkmarket.comcoolapkmarket.net c-t.workcowtransfer.com geetest.com#geetest.datasink.sensorsdata.cn hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cnfoundertype.com ipip.net jianshu.com -jianshu.io jinshuju.netjinshujucdn.com gotokeep.com keepcdn.com  lagou.com lgstatic.com baidupan.com -lanzou.com lanzous.com woozooo.com -liepin.com -lietou.comlietou-static.com mafengwo.cn mafengwo.com mafengwo.net  meitu.com meitudata.com moji.com mojichina.com  polyv.net videocc.net -renren.comrenren-inc.com vaptcha.com vaptcha.net wamawama.com -wiwide.com -sojump.com -wjx.cn wjx.com wjx.top zcmbc.com.cn zdns.cn zdns.net.cn zdns.org.cn zdnscloud.biz zdnscloud.cn zdnscloud.comzdnscloud.com.cnzdnscloud.info zdnscloud.netzdnscloud.net.cnzdnscloud.org.cnchinesemooc.org -cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com cnki.net  apabi.comcnthinkers.com  cqvip.comhuijistatic.com huijiwiki.com moegirl.orgmoegirl.org.cn  guokr.comwanfangdata.com.cn speiyou.com -xesimg.com xueersi.com banmaaike.comxiaoyuankousuan.com ybccode.com yuanfudao.com yuansouti.com yuantiku.com zhihuishu.com  coding.me -coding.net csdn.net -csdnimg.cn  deepin.cn -deepin.com  deepin.io -deepin.org  gitee.comjinrishici.com  juejin.imb-gold-cdn.xitu.iomirror-gold-cdn.xitu.iop1-juejin.byteimg.comp2-juejin.byteimg.comp3-juejin.byteimg.comp4-juejin.byteimg.comp5-juejin.byteimg.comp6-juejin.byteimg.comp7-juejin.byteimg.comp8-juejin.byteimg.comp9-juejin.byteimg.com oschina.netruby-china.orgrubyconfchina.org mysxl.cn -sxl.cn  sxlcdn.cnsegmentfault.com  sifou.com -tipdim.org alibaba -alipay -taobao tmall a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -adsalibabacloud.co.inalibabacloud.comalibabacloud.com.aualibabacloud.com.hkalibabacloud.com.myalibabacloud.com.sgalibabacloud.com.tw alicloud.comalibabadns.com -alicdn.com alidayu.com -alidns.comaliyun-inc.comaliyun-iot-share.com -aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org mxhichina.com ddurl.to dingding.xin dingtalk.cn dingtalk.com dingtalk.netdingtalkapps.com laiwang.com lwurl.toteambition.comteambition.netteambitionapis.com 25pp.com  56che.com  95095.com 9game.cn -aliapp.orgalibaba-inc.com alibaba.comalibabacapital.comalibabacorp.comalibabadoctor.comalibabafuturehotel.comalibabagroup.comalibabaplanet.comalibabaued.comalibabausercontent.com alifanyi.comalihealth.com.cn alihealth.hk -aliimg.com -alikmd.com alimama.com alimebot.com -alimei.com alios.cn -alipay.comalipayobjects.com aliplus.comaliresearch.com alisoft.com alisports.com alitianji.comaliunicorn.com -aliway.com aliwork.com alixiaomi.comalizhaopin.com alyms.cn -asczwa.comasczxcefsv.com -asmlink.cn atatech.org -b2byao.com  bazai.com  bcvbw.com  cheng.xin cloudeagle.cn damai.cn dayu.com -dfkhgj.com doctoryou.ai doctoryou.cn dongting.com -dratio.com emas-poc.com -gongyi.xin ialicdn.com iconfont.cn -ics.design -jhgtgb.com -kanbox.com -lazada.comliangxinyao.com m-now.cn -maitix.com  mdeer.com mei.commiaostreet.com  mshare.cc nic.xinphilanthropy.xin phpwind.com phpwind.netqingtingtrip.com  rexpos.cn saee.org.cn shenjing.com  shuqi.comshuqireader.com sparenode.com  supet.com  ttpod.com wandoujia.comxinlingshou.cn yowhale.com yunos-inc.com  yunos.comyushanfang.com -zuodao.comaliexpress.com aliexpress.ru sm.cn cainiao.comcainiao.com.cncainiao-inc.com freshhema.com hemamax.com -hemaos.com hemashare.cn shyhhema.com 1688.com etao.com juhuasuan.comlingshoujia.com -mashort.cn pailitao.com -taobao.com -taobao.org taobaocdn.comtaobizhong.comtaopiaopiao.com tb.cn tbcache.com tburl.in  tmall.com tmall.ru tmalltv.com tmjl.ai alitrip.com  feizhu.cn -feizhu.com -fliggy.com  fliggy.hk -iuynfg.com amap.com amapauto.com autonavi.com  gaode.com  xiami.com xiami.fm  xiami.net  b3log.org a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -ads zuoyebang.cc zuoyebang.com -zybang.com baidu -91.com -aipage.com apollo.auto baidu.cn  baidu.com baidu.com.cn baidubce.combaiducontent.com baidupcs.combaidustatic.com -baifae.com baifubao.com -bcebos.com  bdimg.com bdstatic.com bdtjrcv.com  bdydns.cn -bdydns.com -bdydns.net chuanke.com  dlnel.com  dlnel.org -duapps.com -dwz.cn -hao123.com hao123img.com -hao222.com -haokan.com jomocdn.net jomodns.com -mipcdn.com  nuomi.com quyaoya.com smartapps.cn  tieba.com tiebaimg.com xianfae.com xiaodutv.com -bytecdn.cn bytedance.com bytedance.net bytedns.net byteimg.com -douyin.com huaxiong.comjokecommunity.comneihanshequ.com -pstatp.com -snssdk.com toutiao.comtoutiaocdn.comtoutiaocloud.comtoutiaohao.comtoutiaohao.net toutiaoimg.cntoutiaoimg.comtoutiaoimg.nettoutiaopage.com -wukong.comwukongwenda.cnwukongwenda.com zijiecdn.com zijiecdn.net  zjcdn.com  baike.com -ixigua.com ixgvideo.com  365yg.com didi-food.comdidiaustralia.blogdidichuxing.comdidiglobal.comdidimobility.co.jpdidistatic.comxiaojukeji.com  dbank.com dbankcdn.com harmonyos.com hicloud.com hihonor.com honor.cn -huawei.comhuaweicloud.com  vmall.com vmallres.com cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn -wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com -ks-cdn.com  ksyun.com ksyungslb.com flyme.cn meizu.cn  meizu.com  mzres.com 126.com 126.link 126.net 127.com 127.net 163.com163industry.com 163mail.com 163qiyukf.com -163yun.com 166.net -haowu.linkicourse163.org  kaola.com -lofter.com  nease.netnetease-inc.com netease.com -netease.im -qiyukf.com ydstatic.com yeah.net -youdao.comanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads coloros.com finzfin.com -heytap.com heytapcs.comheytapdownload.comheytapimage.com -myoppo.com nearme.com.cn oppo.cn oppo.com  oppo.mobioppodigital.com  oppoer.meoppomobile.com oppopay.com opposhop.cn -realme.com realmebbs.comrealmemobile.com oneplus.com -oneplus.cn oneplus.net opstatics.comoneplusbbs.com h2os.com 75.team -75team.com baomitu.com -360.cn 360.com -360-jr.com 360chou.com360daikuan.com360huzhubao.com -360jie.com360jinrong.net -360kan.com 360kuai.com  360os.com 360panyun.cn 360safe.com 360shouji.com 360taojin.com360totalsecurity.com 360tpcdn.com360webcache.com anquanke.com  haoso.com -haosou.com haosou.com.cn -haosou.net i360mall.com ludashi.com nicaifu.com  nzwgs.com  qhimg.com qhimgs0.com qhimgs1.com qhimgs2.com qhimgs3.com qhimgs4.com qhimgs5.com qhimgs6.com  qhmsg.com  qhres.com qhstatic.com qhupdate.com -qihuapi.cn qihucdn.com  qihoo.com qikucdn.com -so.com sou.com urlqh.cnxiaoluyouxuan.comxiaoluzhidian.com xjietiao.com -youhua.com  yunpan.cn  97973.com -picself.cn sina.cn sina.com sina.com.cn sina.net sinaapp.com sinaedge.com -sinaimg.cn sinaimg.com  sinajs.cn -sinajs.comt.cn videoself.cn  wbimg.com wbimg.cn wcdn.cn weibo.cn  weibo.com weibo.com.cn weibocdn.com xhaiwai.com 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -ads -go2map.com sogo.com  sogou.com sogoucdn.com dns.pub  dnsapi.cn  dnspod.cn -dnspod.com dnspod.com.cn -dnspod.net -dnspod.org  dnsv1.com  dnsv2.com  dnsv3.com  dnsv4.com  dnsv5.com doh.pub ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads -yuewen.com hongxiu.com lrts.me qdmm.com -qidian.com readnovel.com tingbook.com webnovel.com -xs8.cn xxsy.net -apcdns.net  cdn-go.cn cdntips.com foxmail.comfoxmail.com.cn gtimg.cn  gtimg.com gtimg.com.cn idqqimg.com imqq.com  myapp.com myqcloud.com -qcloud.com qcloudimg.com qlogo.cn qpic.cn -qq.com -qqmail.com  qzone.com -rtx.com.cnservicewechat.com smtcdns.com smtcdns.net -tencent.cn tencent.comtencent.com.cntencent.com.hktencent.net.cntencent-cloud.comtencentmusic.comtencentyun.com -tenpay.com -wechat.com -wegame.com wegame.com.cn -weiyun.com alloyteam.com imweb.io ivweb.io -mi.com -mi-img.com  mifile.cn miui.com -miwifi.com  xiaomi.cn -xiaomi.com -xiaomi.netxiaomiyoupin.com  00cdn.com  88cdn.com -sandai.netthunderurl.com -xunlei.com 10086.cn 139.comchinamobile.comchinamobileltd.com migucloud.com migu.cn -cmvideo.cn miguvideo.com andfx.cn  andfx.net -cmicrwx.cncmpassport.comfetion-portal.com fetionpic.com mmarket.com mmarket6.com -ctexcel.ca ctexcel.comctexcel.com.hk -ctexcel.fr -ctexcel.us -189.cnchinatelecom-h.comchinatelecom.com.cnchinatelecomglobal.com -chntel.com  10010.com 10010.com.cnchinaunicom.comchinaunicom.com.cnchinaunicom.com.hkchinaunicomglobal.commychinaunicom.com  wo.com.cnguoxuedashi.com guoxuemi.com jikipedia.com haidilao.com0123456789.com 0379home.com -055110.com  05sun.com 0759job.com  100bt.com 100offer.com  11467.com -114chn.com 114piaowu.com 114shouji.com -119you.com 123juzi.com 123juzi.net 123u.com 1637.com  16888.com 16rd.com  17173.com 178linux.com  17989.com  17cdn.com 17house.com  18183.com 188.com 1905.com  19yxw.com 1nongjing.com  1ting.com 1zhe.com 21cn.com 2265.com 2288.org 2345.com 258.com 263.net 289.com 2cto.com 3000.com -310win.com -315che.com 3234.com 32r.com 3322.org 3387.com 33lc.com 3454.com 3456.cc -35.com 3533.com 360aiyi.com -360doc.com  360jq.com 360zhyx.com -365azw.com -365dmp.com -37.com 3733.com 3839.com -39.net 3conline.com 3d66.com -3elife.net 3h3.com 3yx.com  40407.com 500.com 500d.me -50bang.org -51.com 51.la -510you.com 51credit.com  51cto.com 51eshop.com 51gaifang.com 51hejia.com51jingying.com 51meishu.com -51sole.com 51wendang.com  51yes.com 5253.com  52hxw.com -52miji.com 52pk.com 52z.com 53kf.com -55.com -56.com 5577.com  55bbs.com  58pic.com  5bite.com 5fun.com 5gzm.net 5khouse.com 5you.com 66wz.com 68h5.com -6rooms.com 714.com 7230.com -72byte.com  7down.com 7k7k.com  7moor.com 7po.com -7x24cc.com -7xdown.com  818ps.com  84399.com 885.com -900.la 917.com 91danji.com 91yunxiao.com 9553.com 962.net 9718.com  99166.com 998.com 999d.com 99danji.com 9ht.com -9xgame.com 9xu.com a9vg.com -aardio.com -adxvip.com -afzhan.com agrantsem.com  aiemy.com aiketour.com  aiops.com  aipai.comairchangan.com airguilin.com aisee.tv aiskycn.com aiyunxiao.com -aizhan.comalittle-tea.com -allyes.com anfensi.com -anquan.org -anruan.com -aotrip.net  aoyou.com apk3.com apk8.com appchina.com -appinn.com  arpun.com babytree.combabytreeimg.com baidufree.combaifendian.com  baihe.com baixing.com baixing.netbamenzhushou.combangongziyuan.com bankcomm.com baofeng.combaoxianshichang.com bcy.net bearychat.com beihaidc.combeijing-lipin.com bengbeng.com  benmi.com  berui.combestopview.com biancheng.net bianews.com bibaodao.com bidchance.com biddingx.com bihu.com -bio360.net  bio4p.com bio-equip.combiodiscover.com bishijie.com bitecoin.com biyehome.net bjcathay.com bobo.com bojianger.com -bokecc.com  boosj.com btcfans.com btgtravel.com bthhotels.com  btime.comcabbagebox.com caijingwu.com -caiyun.com cang.comcankaoxiaoxi.comcardbaobao.com -carnoc.com ccb.com  cdn20.com  cecdc.com cecport.com centanet.com cerambath.org -ch.com chachaba.com changba.com chashebao.comchazhengla.com -che168.comchina-chair.comchina-nengyuan.com  china.comchinacache.comchinacache.netchinachugui.comchinadongchu.com chinafph.comchinakaoyan.comchinalawedu.com chinapay.com chinapp.netchinapubmed.net chinasspp.comchinatranslation.net chinaunix.netchinaweiyu.comchinawutong.com chinazns.comchongdiantou.com -chouti.com chuangxin.com chuansong.mechuansongme.com -chushou.tv chuyu.me  city8.com cjol.com clouddn.com cloudxns.com cnanzhi.com -cnbeta.com cnbetacdn.com cnblogs.com -cnepub.com  cnfol.com  cnlaw.net cnstock.com cnzz.com cocodiy.com code666.com -cofeed.com -cofool.com coindog.comcontentchina.com  cpppf.org  cr173.com  crsky.com  csbew.com -csmjzs.com csslcloud.net -ctfile.com ctiforum.com ctoutiao.com  ctsbw.com -cubead.com  cwxzx.com -cyagen.com  cybtc.com cyol.com cyts.com cztv.com cztvcloud.com dadajiasu.com dadighost.com daguzhe.com dajiabao.com  dajie.com dajieimg.com dalongyun.com dangbei.com danji100.com -danji6.com daocloud.io daovoice.iodayukaoshi.com dazijia.com -dcdkjx.com  dd373.com  ddooo.com dedecms.com develenv.com -dginfo.comdgphospital.comdianchacha.com diandian.comdiandianqi.comdianwannan.comdingxiang-inc.com -diopic.net diyiyou.com dj99.com  docin.com dockerone.com -dockone.io dogedoge.com -donews.com -dongao.comdongguantoday.com dopa.com -douxie.com -downcc.com downxia.com -downyi.com -dpfile.comdreams-travel.comdrivergenius.com -dui.ai duiopen.com duoduocdn.com duokanbox.com -duomai.com duoshuo.com  duote.com dxpmedia.com -dxycdn.com  dyhjw.com dzsc.com dzw3.com  dzwww.com easesale.com  easiu.com eastday.com eastmoney.com eastsoo.com -eayyou.com  ebico.com  ebrun.com -ecitic.com ecjobhome.com -edu.cn  eduei.com eeyy.com eflycloud.com elecfans.com emarbox.com -emumax.com enterdesk.comeoeandroid.com excelhome.net expreview.comf.cx  faloo.com famulei.com  fanli.comfangxiaoer.com fanxian.com fastapi.net -feihuo.com feiniaomy.comfengkongcloud.com fengniao.comfengxian110.com  fenxi.com -fhldns.com  fimmu.com finchina.com fixdown.com  fqjob.net freebuf.com fugetech.com fuwj.com fxxz.com fyxz.com game234.com gameabc.com gamemei.com -gaodun.comgaoshouyou.comgaoxiaojob.com -gdjdxy.comgdliontech.com gdrc.com geilicdn.comgenelinkout.com  getui.com -gezida.com gfan.com -giocdn.com globrand.com gm86.com gmallbio.com  gmz88.comgobasearcher.com gold678.com  golue.comgongxiangcj.com goosail.com  goufw.com gree.comgreenxiazai.com growingio.com  gtags.net  guabu.com guaiguai.comguanaitong.comguanhaobio.com gucheng.com  guigu.org guoxinmac.com  gupzs.com gushiwen.orgguzhangting.com -gwdang.comgxairlines.com -gxb.io gzwanju.com h5uc.com hack520.com hackhome.com haishun.com hanboshi.com handanjob.comhangjiayun.com haolietou.com  haote.comhaoyouyinxiang.com hefei.cc -heisha.net  henha.com henkuai.com herostart.com  hexun.com  hiido.com hitv.com hiyd.com hktheone.com hn-cbec.com -hnrcsc.com hntv.tv hnyuyuhui.com hollycrm.com homeinns.com homekoo.comhongsanban.com -houdao.comhouyuantuan.com hteacher.net huanqiu.comhuashengdaili.com  huatu.com  huize.com  hujia.org hujiang.com hunantv.comhuochepiao.com huocheso.com  huxiu.com hxfy888.com hxsd.com iask.com -ibaotu.com ibuychem.com icaidao.com ichangtou.com idongdong.com iflytek.com  igao7.com -iheima.com ijiandao.com -ikafan.com im2maker.com  im-cc.com -imedao.com imgo.tv  imooc.com indienova.com  infoq.cominfoqstatic.com -ip-cdn.com  ip138.com ipinyou.com iranshao.com  irs01.com ishumei.com  it165.net  it168.com  it610.com  iteye.com -itjuzi.com  itmop.com  iyiou.com iyunxiao.com -izuche.com -jandan.net jb51.com  jdair.net jia.com jiameng.com jianbihua.com jianzhi8.com jiaodong.net jiaoyimao.com jiasuhui.com jiasule.com jiathis.com jiayuan.com jiazhao.com jiemeng8.comjikexueyuan.com jinianbi.comjinrongren.net  jinse.com  jinti.comjiqizhixin.com jisuanke.com jisuxia.com jiuzhilan.com jj20.com jkbl.com jmstatic.com job5588.com -job910.com  jobjm.com jsbc.com -jsrdgg.com jstv.com  jsyks.com juefeng.com -julive.com  jumei.com  juwan.com  juxia.com  jyimg.com k366.com kaifubiao.com kaixin001.com kameng98.com -kanimg.com kankanews.com kantianqi.net kanzhun.com kaopu001.comkeboyunxiao.com  kejet.net kf5.com -kimiss.com kingdee.com kkzj.com -kongfz.com koolearn.com -kouclo.com -koudai.com koudai8.com kq7.com  ksord.com  kuaaa.com kuaidi100.com kuaihou.com kuaizhan.com  kuqin.com -kuyiso.com lady8844.com laomaotao.net laomaotao.org  lascn.net  lawxp.com leanote.com ledu.comleetcode-cn.com leikeji.com leiphone.com leiting.com leju.com leturich.org lianmishu.com -liantu.com  liantu.me lianzhuli.comliaoxuefeng.com liba.com libaclub.comlieyunwang.com lightonus.com -likuso.com lingkou.com linkvans.com  linsn.com linuxidc.com liulanqi.net liuxiaoer.com live800.com liweijia.com lixinger.com lkkbrand.com longhoo.net -longre.comlongtugame.com longzhu.com  lotpc.com -loupan.com -lu.com luckyair.net  lufax.com lufaxcdn.com lunwengo.net luyouqi.com -lvmama.comlvsexitong.com  lxdns.com  lxway.com -magedu.com maisanqi.com -mamecn.com manhuatai.com manmankan.com -mapbar.com mayi.com -mayihr.com -mcbang.com  mdpda.com mechina.org -mediav.com meifang.com meika360.com meilishuo.commeimingteng.com -meiqia.commeishichina.com meishij.netmengtuoshi.wang mgtv.commiaobolive.com miaozhen.com -miercn.com mikecrm.comminhangshi.com miusi.co mjia.cc -mmbang.com mmbang.info -mofang.com mofazhu.com mogu.com mogucdn.com mogujie.com -mokahr.com moleecel.commoocollege.com mop.com msanjia.com -mscbsc.com mukewang.com -mumayi.com -muomou.com muzhiwan.com -mydown.com mydrivers.com myshow360.net myyx618.com myzaker.com naixuecha.com netbian.com -newasp.netnewbandeng.com  newyx.net nowcoder.com nowscore.com  nruan.com ntalker.com nvsheng.com  nzbdw.com oadz.com  oeeee.com  offcn.com officese.com -oicq88.com  okooo.com -ol-cdn.com -ol-img.com oldboyedu.com -oneapm.com onegreen.net -oneyac.comonlinedown.netonlinesjtu.com onlylady.com -opdown.com oray.com  ottcn.com -oupeng.com -p2peye.com p5w.netpaipaibang.com paopaoche.net pc6.com -pcbeta.com -pchome.net  pcpop.com  peccn.com pgzs.compharmacodia.com piaoliang.com -pingan.compingplusplus.com pingwest.com -pingxx.com pintu360.com  pipaw.com  pipaw.net pptbest.com psbc.com -pubyun.com  qc188.com qcc.com qcds.com qd8.com qd-metro.com qh24.com qiangbus.com qianjia.com qianlima.com qianzhan.comqiaobutang.com qichacha.com -qie.tv qifeiye.comqijiayoudao.net qingcloud.comqingdaochina.orgqingdaonews.comqingsongchou.com qiumibao.com qizuang.com  qqddc.comqqgexingqianming.com qqrizhi.comqqshuoshuo.com -qschou.com -qtmojo.com -qudong.com -qugame.com  qunar.com qunarzz.com qyer.com rfchost.comrockyenglish.com rong360.com rtbasia.com  ruan8.com -runoob.com rzrc114.com  saibo.com sanguosha.com -sanwen.net  scdng.com scoregg.com -sczsxx.com sdo.com sec-wiki.com -sencdn.com seniverse.comsenlinjimore.com -sgamer.com shang360.com -shangc.netshanghairc.com shangzhibo.tvshanshuihotel.com sharejs.com shebiaotm.comshelter-china.comshelterdome.netshengdaosoft.comshenmayouxi.com  sheui.com shijiexia.com shixiseng.com shmetro.comshoujihuifu.comshouyoubus.com shrbank.comshuidichou.comshuidihuzhu.com shumensy.comshuoshuokong.com -shutcm.com -simei8.com simuwang.com sinesafe.com  sjwyx.com  skycn.com sllssrq.com -snimay.com  sobot.com sofreight.com softwhy.com -sojson.com -somode.com soso.com souqian.comsouthmoney.comsparkletour.comspringtour.com ssports.com starbaby.cc starbaby.com stockstar.com sun0769.com -sunrtb.com supermap.comsupermapcloud.com -sys321.com szfw.org szhk.com szzfgjj.com t1y5.com  taihe.comtaihuoniao.com tangeche.com tanx.com -tao123.com -taoche.com te5.com tenxcloud.comtianjimedia.comtianjin-air.comtianlailive.com -tianqi.com tietuku.com -tiexue.net timedoo.com tingyun.com titanar.com tjjt360.com  tmcdn.net -tobosu.com tom.com tongdun.net topthink.com touqikan.com travelsky.com trunktech.comtrustexporter.com trustutn.org  tudou.com tudouui.com tuer123.com tuicool.com -tuiwen.net  tujia.com  tuniu.com tutuapp.com  tuwan.com tuwanjun.com u.tools  ucbug.com -uggame.com uoko.com urselect.comurumqi-air.com  useso.com uuu9.com uzzf.com  v5875.com value500.com vamaker.com vdolady.com veryhuo.com veryzhun.com  vic18.com videojj.com  vijos.org vip.com  vobao.com -vpgame.comwallstreetcn.comwangyangyang.vipwannianli8.com wanplus.com wanwushuo.com wanyiwang.com  wanyx.com -wdjimg.com wdzj.com  weand.com webterren.com weicaifu.com weidian.comweilaicaijing.comweilaiyunxiao.com weiphone.net weixing.com weiyangx.comwelltrend-edu.com wenjuan.comwhlovehome.com wicresoft.com -win007.com win8.netwindows10zj.comwindows7en.com windowszj.com winwin7.com wishdown.com  wmzhe.com wnhuifu.com wodingche.com  womai.com wonnder.com -wooyun.org worktile.comwoyaogexing.com  woyoo.com  wqiis.com wrating.com -wscdns.com  wtown.com  wumii.com -wuming.comwuximediaglobal.com  wywyx.com xafc.com  xbiao.com  xdwan.com -xfdown.com -xhscdn.comxiachufang.comxiaobaixitong.comxiaoe-tech.com xiaogouh5.comxiaohongshu.com  xiaoka.tv xiaokaxiu.comxiaomingtaiji.comxiaoxiongxitong.comxiaoyuxitong.com  xiayx.com xiazaiba.com xingjiesj.com xinhuanet.comxinrenxinshi.com xinshipu.comxingtan001.com xitong8.com xitu.com xiu8.com -xiucai.com xiziwang.net xmhouse.com  xnpic.com  xpgod.com -xsa239.comxuanchuanyi.com  xue51.com xuekanba.com xuexicha.com xundupdf.com  xycdn.com xywy.com -xzking.com yahui.cc -yaolan.com  yaoyl.com  yaozh.com -ycgame.com -yeepay.com -yeshen.com  yesky.com yh31.com  yicai.com  yigao.com yigoonet.com yihedoors.comyikaochacha.com yikexue.comyingjia360.comyinhang123.net yinxiang.com yinyuetai.comyinzhaowang.com -yiqifa.com -yiqifa.org yisu.com yitaifang.com  yiwan.com yixi.tv yizhibo.com  yjbys.com ynhr.com -yocajr.com -youboy.com youjiao.com youke.co youlian.fun youshang.com youxiake.com youxihezi.net youxila.com youxiniao.com youxigt.com  youzu.com yoyojie.com  yoyou.com  ypppt.com -yslyhr.com  ysten.com -yuewen.com  yunaq.com yunba.io yundaex.com yundasys.com -yundun.com yunqishi.net yunshipei.com yunxiao.com yunzhijia.com  yupoo.com  yuzua.com  yxbao.com -yxdown.com -yytcdn.com -zampda.net zampdsp.com zastatic.com -zbjimg.com zczj.com -zdfans.com zgjm.org -zgjsks.com  zglxw.com  zgzcw.com zhanbuba.comzhangyoubao.com  zhanqi.tv zhanzhang.net zhaodanji.com zhaopin.com zhcw.com -zhenai.com  zhibo8.cc  zhidx.com zhifang.com -zhipin.com zhiziyun.com zhongkao.comzhuangjiba.comzhuanyewanjia.comzhuayoukong.com zhubajie.com zhugeapi.net zhugeio.com  zimuzu.io zixiaomao.com zixuntop.com  zjstv.com zmengzhu.com zongheng.com -zpb365.com -zrblog.net zsxq.com  zuche.com zuchecdn.com zuhaowan.com zuidaima.com zuowen8.comzuowenwang.net jindidata.comtianyancha.comzhuanxiandai.com -fm3838.comlarsonlimited.com runsheng.com vzuu.com -zoom3g.com -zoomyou.cn chaoxing.com chaoxing.cc - - -GLOBALSIGNglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com -cnocsp.globalsign.com -cn ocsp2.globalsign.com -cn - -TSQUARE -tsquare.tv - -DW -dw.com - -IBMibmweatherchannel weather bluemix.com bluemix.net ibm.com -ibm.eu ibm.net -ibm.us s-bluemix.net s81c.com -+ -MYFONTS myfonts.com myfonts.net - -MOVEFREEkeepmovingwithmovefree.com move-free.net movefree.cn -cn movefrees.commovefreeoffers.commovefreerewards.comschiffvitamins.com -5 -SENSORSDATA-ADS"static.sensorsdata.cn -ads - -COINBASE coinbase.com - - -EVERBRIGHT cebbank.com ceblease.com -eb-ind.com ebasset.com ebchina.comebchinaintl.com -ebf.com.cn  ebfcn.com ebfortune.com ebtrust.com ebscn-am.com  ebscn.comeverbright.com  secec.comsunlife-everbright.com -$ - FREECODECAMPfreecodecamp.org - -HKCNEWS hkcnews.com -, - -HOTJAR-ADSstatic.hotjar.com -ads -w -JWPLAYER -jwpcdn.comjwplatform.com jwplayer.com -jwpltx.com -jwpsrv.comlongtailvideo.com - -CATEGORY-BANK-CN -boc.cnbankofchina.combocaviation.com  boccfc.cn  bocgi.com bocgins.com  bochk.com bocichina.com bocigroup.com  bocim.combocservices.com.cn cignacmb.comcmb-leasing.com cmbchina.com cmbi.com.hkcmbwinglungbank.comicbc icbc-ltd.com icbc-us.com icbc.com.cn  95516.com unionpay.comunionpayintl.comunionpaysecure.com abchina.com  whccb.com - -CATEGORY-MOOC-CNchinesemooc.org -cnmooc.orgicourse163.org icourses.cn mooc.cnopenlearning.com pmphmooc.commoocs.unipus.cnopencourse.pku.edu.cn study.163.com -c -COMODO -comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.com - -XART  x-art.com -% -IMGIX  imgix.com  imgix.net - -4399 3304399.net 4399.com 4399api.com 4399dmw.com -4399er.com4399youpai.com 5054399.com img4399.com -' -APA apa.orgpsyccareers.com - -FIREFOX firefox.com -j -IMPERIALCOLLEGE ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.com -P - KUAISHOU-ADS log-sdk.gifshow.com -adswlog.kuaishou.com -ads - -MARVEL -marvel.commarvel10thanniversary.commarveldimensionofheroes.commarvelparty.netmarvelpinball.commarvelsdoubleagent.commarvelspotlightplays.com marvelsuperheroseptember.commarvelsuperwar.comthemarvelexperiencetour.com -- -MYRADIO -myradio.hkmyradio.com.hk -} -SHOPIFY myshopify.com shopify.com shopify.devshopifycdn.comshopifystatus.comshopifysvc.com -$ - BROWSERLEAKSbrowserleaks.com -8 -DMM dmm.com  dmm.co.jpdmm-extension.com - -DOOM9  doom9.org -( -UDEMY  udemy.com udemycdn.com - -NODEJS -nodejs.org - -SSPLIVE -ssplive.pw - -WOOLITE -woolite.ca -woolite.cn -cn woolite.comwoolite.com.cn -cn -woolite.pl -woolite.uswoolitecarpet.com -$ - LOCALPRESSHKlocalpresshk.com -, - BYTEDANCE-ADSmcs.snssdk.com -ads -H -COOLAPK coolapk.comcoolapkmarket.comcoolapkmarket.net - -DOI doi.org doi.info - -THESUNdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie -) -EASYLIST easylist.to lanik.us - -FINISH$dishwashingexpert.com.cn -cn  finish.at  finish.bg finish.co.kr finish.co.nz finish.co.uk finish.co.za finish.com.cn -cn finish.com.hr finish.com.tr  finish.de  finish.es  finish.fr  finish.gr  finish.hu  finish.lv  finish.pl  finish.pt  finish.ro  finish.si  finish.skfinisharabia.comfinishbrasil.com.brfinishdishwashing.cafinishdishwashing.com finishinfo.be finishinfo.clfinishinfo.comfinishinfo.com.arfinishinfo.com.au finishinfo.cz finishinfo.fi finishinfo.it finishinfo.jp finishinfo.nl finishinfo.no finishinfo.ru finishinfo.sefinishkilpailu.fi finishwin.beyarininsuyu.com - -SHOPEE shopee.cn -cn shopee.co.id shopee.co.th -shopee.com shopee.com.br shopee.com.my  shopee.ph  shopee.sg  shopee.tw  shopee.vnshopeemobile.com shopeesz.com -cn -shp.ee - -CATEGORY-ADS-ALLad-delivery.net -ads adinplay.com -ads adnxs.com -adsadvertserve.com -adscasalemedia.com -ads!contextual.media.net -ads cpmstar.com -ads -demdex.net -ads httpool.com -ads lijit.com -ads1rx.io -ads mfadsrvr.com -adsmgid.com -adsns1p.net -ads openx.net -ads pubmatic.com -adsspotxchange.com -ads -unimhk.com -ads upapi.net -ads taboola.com apilog-web.acfun.cn -ads adcolony.com -ads -adjust.com -ads a.alimama.cn -adsacjs.aliyun.com -adsadash.m.taobao.com -ads!adashbc.m.taobao.com -ads"adashbc.ut.taobao.com -ads"adash-c.ut.taobao.com -ads adashx.m.taobao.com -ads$adashx4ae.ut.taobao.com -ads#adashx4yt.m.taobao.com -ads#adashxgc.ut.taobao.com -adsadsh.m.taobao.com -adsafp.adchina.com -adsafp.alicdn.com -ads agoodm.m.taobao.com -ads#agoodm.wapa.taobao.com -ads alipaylog.com -adsamdc.alipay.com -adsamdc.m.taobao.com -ads api.wapa.taobao.com -ads#api.waptest.taobao.com -adsapoll.m.taobao.com -ads#appdownload.alicdn.com -adsatanx.alicdn.com -adsatanx2.alicdn.com -adscbu01.alicdn.com -adscdn0.mobmore.com -adsclick.aliyun.com -ads&click.mz.simba.taobao.com -adscm.ipinyou.com -ads cm.mlt01.com -ads!dsp.simba.taobao.com -adserr.taobao.com -adsex.mobmore.com -ads ex.puata.info -ads!fav.simba.taobao.com -ads$feedback.whalecloud.com -adsff.win.taobao.com -ads fm.p0y.cn -adsg.click.taobao.com -ads -g.tbcdn.cn -adsgma.alicdn.com -adsgtms01.alicdn.com -adsgtms02.alicdn.com -adsgtms03.alicdn.com -adsgtms04.alicdn.com -adshydra.alibaba.com -ads'hz.pre.tbusergw.taobao.net -ads#hz.tbusergw.taobao.net -ads i.ipinyou.com -adsinit.phpwind.com -ads!intl.wapa.taobao.com -ads$intl.waptest.taobao.com -ads"jxlog.istreamsche.com -adslog.umtrack.com -adsm.intl.taobao.com -adsm.simba.taobao.com -adsmatch.p4p.1688.com -ads%material.istreamsche.com -ads mlt01.com -ads&nbsdk-baichuan.alicdn.com -ads&nbsdk-baichuan.taobao.com -ads"osfota.cdn.aliyun.com -ads osupdate.aliyun.com -ads&osupdateservice.yunos.com -ads%pindao.huoban.taobao.com -adspush.wandoujia.com -adsre.m.taobao.com -ads re.taobao.com -ads&redirect.simba.taobao.com -adsrj.m.taobao.co -adsrj.m.taobao.com -adssdkinit.taobao.com -adsshow.re.taobao.com -adssimaba.taobao.com -adssimba.m.taobao.com -ads!srd.simba.taobao.com -adsstats.ipinyou.com -ads strip.taobaocdn.com -ads$tanxlog.istreamsche.com -adstejia.taobao.com -adstemai.taobao.com -ads!tns.simba.taobao.com -ads tongji.linezing.com -ads tvupgrade.yunos.com -adstyh.taobao.com -adsuserimg.qunar.com -adsw.m.taobao.com -adsyiliao.hupan.com -ads amazon-adsystem.com -adsiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -ads applovin.com -ads -applvn.com -ads atom-data.io -adsanalytics-data.io -ads ironbeast.io -ads a.baidu.com -ads ad.duapps.com -ads ad.player.baidu.com -ads adm.baidu.com -adsadscdn.baidu.com -adsadx.xiaodutv.com -adsae.bdstatic.com -ads afd.baidu.com -ads als.baidu.com -ads&api.mobula.sdk.duapps.com -ads"api.tuisong.baidu.com -adsappc.baidu.com -adsb.bdstatic.com -adsbaichuan.baidu.com -adsbaidustatic.com -adsbaidutv.baidu.com -adsbanlv.baidu.com -ads bar.baidu.com -ads"bdimg.share.baidu.com -adsbdplus.baidu.com -ads bj.bcebos.com -adsbtlaunch.baidu.com -ads c.baidu.com -ads cb.baidu.com -adscbjs.baidu.com -adscjhq.baidu.com -adscleaner.baidu.com -ads click.bes.baidu.com -adsclick.hm.baidu.com -adsclick.qianqian.com -ads"cm.baichuan.baidu.com -ads cm.baidu.com -adscm.pos.baidu.com -ads cpro.baidu.cn -adscpro.baidu.com -ads!cpro.baidustatic.com -ads!cpro.tieba.baidu.com -ads"cpro.zhidao.baidu.com -adscpro2.baidu.com -ads"cpro2.baidustatic.com -ads crs.baidu.com -adsdatax.baidu.com -ads dd713.bj.bcebos.com -ads dl.client.baidu.com -adsdl.ops.baidu.com -adsdl1sw.baidu.com -adsdl2.bav.baidu.com -adsdlsw.baidu.com -adsdlsw.br.baidu.com -ads!dl-vip.bav.baidu.com -ads(dl-vip.pcfaster.baidu.co.th -ads#download.bav.baidu.com -ads"download.sd.baidu.com -adsdrmcmm.baidu.com -ads dup.baidustatic.com -ads dxp.baidu.com -ads dzl.baidu.com -ads e.baidu.com -adseclick.baidu.com -adsecma.bdimg.com -adsecmb.bdimg.com -adsecmc.bdimg.com -ads eiv.baidu.com -ads em.baidu.com -adsentry.baidu.com -ads ers.baidu.com -ads f10.baidu.com -ads#fc-feed.cdn.bcebos.com -adsfclick.baidu.com -adsfeed.baidu.com -adsfexclick.baidu.com -ads g.baidu.com -adsgimg.baidu.com -adsguanjia.baidu.com -ads hc.baidu.com -ads hm.baidu.com -adshmma.baidu.com -ads hpd.baidu.com -adsidm.bce.baidu.com -adsidm-su.baidu.com -adsiebar.baidu.com -adsikcode.baidu.com -adsimg.taotaosou.cn -adsimg01.taotaosou.cn -adsj.br.baidu.com -adskstj.baidu.com -ads log.music.baidu.com -ads m1.baidu.com -ads ma.baidu.com -adsmobads.baidu.com -ads"mobads-logs.baidu.com -adsmpro.baidu.com -adsmsite.baidu.com -adsneirong.baidu.com -adsnsclick.baidu.com -ads#nsclickvideo.baidu.com -adsopenrcv.baidu.com -ads$pc.videoclick.baidu.com -ads pos.baidu.com -adspups.bdimg.com -ads%push.zhanzhang.baidu.com -ads qianclick.baidu.com -adsrelease.baidu.com -adsres.mi.baidu.com -ads"rigel.baidustatic.com -ads#river.zhidao.baidu.com -ads rj.baidu.com -adsrplog.baidu.com -ads s.baidu.com -adss.cpro.baidu.com -ads!sa.tuisong.baidu.com -adssclick.baidu.com -adssestat.baidu.com -adsshadu.baidu.com -adsshare.baidu.com -ads"snippet.pos.baidu.com -adssobar.baidu.com -adssobartop.baidu.com -adsspcode.baidu.com -adsstat.v.baidu.com -ads su.bdimg.com -adssu.bdstatic.com -ads t10.baidu.com -ads t11.baidu.com -ads t12.baidu.com -ads tk.baidu.com -adstkweb.baidu.com -ads"tob-cms.bj.bcebos.com -adstongji.baidu.com -adstoolbar.baidu.com -adstracker.baidu.com -adstuijian.baidu.com -ads*uat1.bfsspadserver.8le8le.com -ads#ubmcmm.baidustatic.com -adsucstat.baidu.com -adsulic.baidu.com -ads ulog.imap.baidu.com -adsunion.baidu.com -ads!unionimage.baidu.com -adsutility.baidu.com -ads utk.baidu.com -ads videopush.baidu.com -adsvv84.bj.bcebos.com -adsw.gdown.baidu.com -ads w.x.baidu.com -adswangmeng.baidu.com -adsweishi.baidu.com -ads$wenku-cms.bj.bcebos.com -ads%wisepush.video.baidu.com -ads wm.baidu.com -adswn.pos.baidu.com -adsznsv.baidu.com -adszz.bdstatic.com -adszzy1.quyaoya.com -adsmcs.snssdk.com -adsx.clearbitjs.com -ads bluekai.com -adsfout.jp -ads gmossp-sp.jp -adsi-mobile.co.jp -ads im-apps.net -ads impact-ad.jp -ads ladsp.com -ads microad.co.jp -ads -microad.jp -ads socdm.com -ads emogi.com -adsdata.flurry.com -ads2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -ads!assets.growingio.com -adsmlog.hiido.com -adsylog.hiido.com -adsstatic.hotjar.com -adsclick.hunantv.com -adsda.hunantv.com -ads da.mgtv.com -adslog.hunantv.com -adslog.v2.hunantv.com -adsres.hunantv.com -adsv2.log.hunantv.com -adsinner-active.mobi -adsa.ckm.iqiyi.com -adsad.m.iqiyi.com -ads afp.iqiyi.com -adsc.uaa.iqiyi.com -ads cloudpush.iqiyi.com -ads"cm.passport.iqiyi.com -adscupid.iqiyi.com -ads#emoticon.sns.iqiyi.com -ads!gamecenter.iqiyi.com -ads!hotchat-im.iqiyi.com -adsifacelog.iqiyi.com -adsmbdlog.iqiyi.com -ads msg.71.am -adsmsg.video.qiyi.com -ads msg2.video.qiyi.com -ads#policy.video.iqiyi.com -adsyuedu.iqiyi.com -adsads.union.jd.com -ads c-nfa.jd.com -adscps.360buy.com -ads -jzt.jd.com -ads stat.m.jd.com -ads img-x.jd.com -ads log-sdk.gifshow.com -adswlog.kuaishou.com -ads leanplum.com -ads#api.game.letvstore.com -ads ark.letv.com -ads dc.letv.com -adsdev.dc.letv.com -ads fz.letv.com -ads g3.letv.com -adsletv.allyes.com -adsminisite.letv.com -adsmsg.m.letv.com -adsn.mark.letv.com -adsplog.dc.letv.com -adspro.hoye.letv.com -ads pro.letv.com -ads stat.letv.com -ads"static.app.m.letv.com -ads decide.mixpanel.com -ads mopub.com -adsevt.mxplay.com -adsanalytics.163.com -ads crash.163.com -ads crashlytics.163.com -ads g.163.com -ads"js-agent.newrelic.com -ads ogury.com -ads -presage.io -adsogury.co -ads onesignal.com -adsOB^speed\.(coe|open)\.ad\.[a-z]{2,6}\.prod\.hosts\.ooklaserver\.net$ -ads cdn.pocoiq.cn -ads oct.pocoiq.cn -adsads.pubmatic.com -adscdn.segment.com -ads"static.sensorsdata.cn -ads 2016.sina.cn -adsad.sina.com.cn -adsadbox.sina.com.cn -ads!adimages.sina.com.hk -ads!adimg.mobile.sina.cn -ads adimg.uve.weibo.com -ads!adm.leju.sina.com.cn -ads ads.sina.com -adsalitui.weibo.com -adsapi.apps.sina.cn -ads appgift.sinaapp.com -ads#appsupdate.sinaapp.com -ads atm.sina.com -adsbeacon.sina.com.cn -ads biz.weibo.com -adsc.biz.weibo.com -ads!c.wcpt.biz.weibo.com -ads%click.uve.mobile.sina.cn -ads click.uve.weibo.com -adscm.dmp.sina.cn -ads0#contentrecommend-out.mobile.sina.cn -ads$count.video.sina.com.cn -ads counter.sina.com.cn -adscre.dp.sina.cn -adscre-dp.sina.cn -adsd00.sina.com.cn -adsdcads.sina.com.cn -adsdl.kjava.sina.cn -ads dmp.sina.cn -adsdp.im.weibo.cn -ads game.weibo.cn -adsgame.weibo.com -ads"gw5.push.mcp.weibo.cn -ads"gw6.push.mcp.weibo.cn -ads"img.adbox.sina.com.cn -ads#img.amp.ad.sina.com.cn -ads"int.dpool.sina.com.cn -ads%interest.mix.sina.com.cn -ads)log.interest.mix.sina.com.cn -ads log.mix.sina.com.cn -ads log.sina.cn -ads!m.beacon.sina.com.cn -adsm.game.weibo.cn -ads!mg.games.sina.com.cn -ads!motu.p4p.sina.com.cn -adsnewspush.sinajs.cn -ads oascentral.sina.com -ads#oascentral.sina.com.hk -adsp4p.sina.com.cn -adspalmnews.sina.cn -adspay.mobile.sina.cn -adspfp.sina.com.cn -adspfpip.sina.com -ads!promote.biz.weibo.cn -ads r.dmp.sina.cn -adsrm.sina.com.cn -ads rs.sinajs.cn -adss.alitui.weibo.com -ads"s.img.mix.sina.com.cn -ads sapi.sina.cn -ads sax.sina.cn -adssax.sina.com.cn -adssaxn.sina.com.cn -adssaxs.sina.com.cn -ads sbeacon.sina.com.cn -ads"sdkapp.mobile.sina.cn -ads!sdkapp.uve.weibo.com -ads$sdkclick.mobile.sina.cn -ads slog.sina.cn -adsslog.sina.com.cn -ads'staticadm.leju.sina.com.cn -adstjs.sjs.sinajs.cn -ads"trends.mobile.sina.cn -ads"u1.img.mobile.sina.cn -ads&wapwbclick.mobile.sina.cn -ads!wbapp.mobile.sina.cn -ads wbapp.uve.weibo.com -ads#wbclick.mobile.sina.cn -ads$wbpctips.mobile.sina.cn -adswidget.weibo.com -ads woocall.sina.com.cn -adszc.biz.weibo.com -adszymo.mps.weibo.com -adsadnet.sohu.com -ads ads.sohu.com -ads!adv-sv-show.focus.cn -ads aty.sohu.com -adsdata.vod.itc.cn -adsepro.sogou.com -ads go.sohu.com -adsgolden1.sogou.com -adsimp.optaim.com -adsinte.sogou.com -adsinte.sogoucdn.com -adslu.sogoucdn.com -ads pv.sohu.com -adstheta.sogoucdn.com -adstrack.sohu.com -adsuranus.sogou.com -adsv2.reachmax.cn -ads)e8aeb8bbdbbd7.cdn.sohucs.com -ads)643108e7617ef.cdn.sohucs.com -adssupersonic.com -adssupersonicads.com -ads -ssacdn.com -ads)supersonicads-a.akamaihd.net -ads g1.tagtic.cn -adsxy-log.tagtic.cn -adsssp.api.tappx.com -ads ad.qq.com -ads ad.qun.qq.com -ads!adfilter.imtt.qq.com -ads adping.qq.com -adsadpm.app.qq.com -adsadsclick.qq.com -adsadsfile.qq.com -adsadshmmsg.qq.com -adsadslvfile.qq.com -adsadslvseed.qq.com -ads%adsmind.apdcdn.tc.qq.com -adsadsqqclick.qq.com -adsadstestview.qq.com -adsadsview.qq.com -adsadsview2.qq.com -adsadv.app.qq.com -ads adver.qq.com -ads btrace.qq.com -adse.qq.com -adslog.tbs.qq.com -ads mpush.qq.com -ads mtrace.qq.com -ads push.qq.com -ads pgdt.gtimg.cn -ads uberads.com -adsalog.umeng.com -ads alog.umengcloud.com -ads -w.cnzz.com -ads!unityads.unity3d.com -ads#unityads.unitychina.cn -ads ads.wteam.xyz -ads#collector.xhamster.com -adsad.intl.xiaomi.com -ads ad.mi.com -ads ad.xiaomi.com -adsadmob.xiaomi.com -adsad1.xiaomi.com -adsmistat.xiaomi.com -adstracking.miui.com -adsadv.sec.miui.com -ads"adv.sec.intl.miui.com -ads"misc.in.duokanbox.com -ads ad.hpplay.cn -adsadeng.hpplay.cn -ads atianqi.com -ads kuyun.com -ads umeng.com -ads ads.yahoo.com -adsgemini.yahoo.com -ads ysm.yahoo.com -adsactives.youku.com -ads ad.api.3g.youku.com -ads$ad.api.mobile.youku.com -ads ad.mobile.youku.com -ads(a-dxk.play.api.3g.youku.com -ads atm.youku.com -ads#b.smartvideo.youku.com -adsc.yes.youku.com -adsdas.api.youku.com -ads!das.mobile.youku.com -ads!dev-push.m.youku.com -adsdl.g.youku.com -adsdmapp.youku.com -adse.stat.ykimg.com -ads#gamex.mobile.youku.com -ads!guanggaoad.youku.com -ads hudong.pl.youku.com -ads!huodong.pl.youku.com -ads"huodong.vip.youku.com -ads hz.youku.com -adsiyes.youku.com -ads l.ykimg.com -adslstat.youku.com -ads mobilemsg.youku.com -ads msg.youku.com -adsmyes.youku.com -ads p.l.youku.com -ads pl.youku.com -ads#passport-log.youku.com -adsp-log.ykimg.com -adspush.m.youku.com -ads r.l.youku.com -ads s.p.youku.com -adssdk.m.youku.com -adsstat.youku.com -ads$statis.api.3g.youku.com -ads&store.tv.api.3g.youku.com -ads&store.xl.api.3g.youku.com -adstdrec.youku.com -adstest.ott.youku.com -ads!test.sdk.m.youku.com -ads v.l.youku.com -adsval.api.youku.com -ads wan.youku.com -adsykatr.youku.com -adsykrec.youku.com -ads cvnad.com -ads -iyoowi.com -ads zynga.com -ads#zyngaplayersupport.com -ads 51y5.net a.adtng.com -aaxads.com -ad-srv.netad.api.moji.comad.wang502.com adbutter.netads.trafficjunky.net adtechus.comcfts1tifqr.comcontentabc.comimg-bss.csdn.net imglnkc.com imglnkd.comja2.gamersky.com jl3.yjaxa.topkepler-37b.com -lqc006.coms4yxaqyq95.comshhs-ydd8x2.yjrmss.cnstatic.javhd.comtrafficfactory.biz adx.36kr.comclick.ali213.netpbmp.ali213.net^pinggai\d\.caixin\.com$adq.chinaso.comstat.chinaso.com toboads.comdn-growing.qbox.me ad.unimhk.comdas-rpt-log.ucloud.cn adxprtz.com exoclick.com -exosrv.comcdn.advertserve.comcdn.banclip.comcdn.tsyndicate.com -% -FONTS  fonts.com  fonts.net - -FREENODE freenode.net -1 -JINSHUJU jinshuju.netjinshujucdn.com - - MACRUMORS macrumors.com -# -EDX edx.org edx-cdn.org - - INSTAGRAM!achat-followers-instagram.com#acheter-followers-instagram.com$ acheterdesfollowersinstagram.com!acheterfollowersinstagram.combookstagram.comcarstagram.comcdninstagram.comchickstagram.com ig.me  igcdn.com igsonar.com igtv.com imstagram.com imtagram.cominstaadder.cominstachecker.cominstafallow.cominstafollower.cominstagainer.com instagda.com instagify.cominstagmania.com instagor.cominstagram-brand.cominstagram-engineering.cominstagram-help.cominstagram-press.cominstagram-press.net instagram.cominstagramci.cominstagramcn.cominstagramdi.cominstagramhashtags.netinstagramhilecim.cominstagramhilesi.orginstagramium.cominstagramizlenme.cominstagramkusu.cominstagramlogin.cominstagramm.cominstagramn.cominstagrampartners.cominstagramphoto.cominstagramq.cominstagramsepeti.cominstagramtakipcisatinal.netinstagramtakiphilesi.cominstagramtips.cominstagramtr.com instagran.cominstagranm.com instagrem.com instagrm.cominstagtram.com instagy.cominstamgram.cominstangram.cominstanttelegram.cominstaplayer.net instastyle.tv instgram.com intagram.com intagrm.com intgram.comkingstagram.comlnstagram-help.comtheinstagramhack.comoninstagram.comonline-instagram.comonlineinstagram.comweb-instagram.netwwwinstagram.com - - JFENGTIME jfengtime.com -C -MAOCLOUD -maoyun.commaoyuncloud.cnmaoyuncloud.com -' -ZEPLIN -zeplin.dev  zeplin.io - -ARK -ark.to - -HBO cinemax.comforthethrone.com hbo.com hboasia.com  hbogo.com hbogoasia.com hbogoasia.hk -hbomax.com -hbonow.com  maxgo.com -6 -75TEAM 75.team -75team.com baomitu.com - -KALI kali.org - - SHARETHIS sharethis.com -9 -DOUBAN -douban.com  douban.fm doubanio.com -d -REDDIT -reddit.comredditstatic.comredditmail.comredditmedia.com redd.it - -VMWARE -cfblob.comcloudchoose.comcloudvolumes.com -cmpaas.com -cpedge.comcrit-staging.comexperience-vmware.com gemfire.netgeodesummit.com getboxer.com gitstar.com gitstar.net gopivotal.net greenplum.net hwslabs.com immidio.comitfromtheinside.comlatamvmwareforum.compivotalinitiative.comsnapvolumes.com ssdevrd.com vcanedge.com vcloudair.net vfabric.netvidmpreview.com -virsto.com -virsto.net vmglobal.net -vmmark.comvmtestdrive.com vmw.comvmware-cloudmanagement.comvmware-techcenter.comvmware20mosaic.comvmwareausnews.com!vmwarecertificationvideos.comvmwarecloud.comvmwaredemandcenter.comvmwareemeablog.comvmwaregrid.comvmwarehorizon.comvmwareidentity.comvmwarelearning.comvmwarelearningplatform.comvmwarestuff.comvmwareusergroupstore.comvmwareviewpoint.com vmwarevmc.com vmwdemo.com vmwgcomms.comvmwhorizonair.comvmwidm-ads.com -vmwidm.comvmwlabconnect.comvmwlearningplatform.com vmworld.comvmworld2010.comvmworld2013.comvmwsalesrewards.comvmwservices.com -vnware.netwhychoosehorizon.comwhychooseview.comwhychoosevmwareeuc.comwindowsuem.comworkspaceair.com xlstudio.comavinetworks.com -badaas.com bitnami.combitnamiapp.combitnamistudio.comdockerizer.comcloudcredibility.comcloudhealthtech.com cloudlive.comkubeacademy.com kubeapps.com -nyansa.com velocloud.com gopivotal.com heptio.cn -cn -heptio.com aliveipc.com aliveitsm.comaliveprofiler.com alivercm.comaliverewind.com alivertsm.com alivevm.com alivevmax.com alivevue.com vsphere.com vsphere.net air-watch.comairwatchexpress.comairwatchqa.com -getws1.com getwsone.comwhatisairwatch.comwhatisworkspaceone.comworkspaceone.comvmware.tt.omtrdc.net -u -CREATIVECOMMONS ccstatic.orgcreativecommons.orgcreativecommons.engineeringlicensebuttons.net - - -LANDOFHOPE landofhope.tv -4 -PERL perl.org cpan.org metacpan.org -w -NYTIMES nyt.com nyt.net nytcn.me  nytco.com nytimes.com nytstyle.comtimestalks.com -6 -PROQUESTserialssolutions.com proquest.com -s -BMWmini4myminicard.comaboutyourmini.comatlantaminidealers.comgreatergothammini.com!midatlanticbmwmotorcycles.commini-abudhabi.commini-antilles.frmini-bahrain.commini-bosnia.com mini-clubs-international.commini-connected.atmini-connected.bemini-connected.chmini-connected.co.ukmini-connected.commini-connected.czmini-connected.demini-connected.dkmini-connected.eemini-connected.esmini-connected.fimini-connected.frmini-connected.iemini-connected.itmini-connected.ltmini-connected.lumini-connected.lvmini-connected.nlmini-connected.nomini-connected.plmini-connected.ptmini-connected.semini-corporate-sales.com mini-coupe.camini-dubai.com -mini-e.commini-egypt.commini-georgia.commini-grouparchiv.demini-grouparchive.commini-jordan.com mini-ksa.commini-kuwait.commini-lebanon.com mini-me.com mini-oman.commini-qatar.commini-srilanka.commini-stjohns.camini-stjohns.commini-tahiti.commini-vietnam.commini-windsor.camini-windsor.com mini.am mini.at mini.be mini.bg mini.by mini.ca mini.cc mini.ch mini.cl -mini.co.cr -mini.co.id -mini.co.il -mini.co.kr -mini.co.me -mini.co.th -mini.co.uk -mini.co.za mini.com mini.com.ar mini.com.bn mini.com.br mini.com.co mini.com.cy mini.com.do mini.com.ec mini.com.gr mini.com.gt mini.com.hr mini.com.mk mini.com.mo mini.com.mt mini.com.mx mini.com.pa mini.com.pe mini.com.ph mini.com.pl mini.com.py mini.com.sg mini.com.tr mini.com.tw mini.com.uy mini.cz mini.de mini.dk mini.dz mini.es mini.fi mini.fr mini.gp mini.hu mini.ie mini.in mini.is mini.it mini.jp mini.kz mini.lu mini.ma mini.md mini.mq mini.mu mini.my mini.nc mini.nl mini.no mini.pt mini.re mini.ro mini.rs mini.ru mini.se mini.si mini.sk mini.tm mini.tn mini.ua -mini101.caminiargentina.comminibrossard.caminibrossard.com minicanada.caminicaribbean.com miniccrc.ca minicooper.caminidealer.comminidealernet.comminidowntown.caminidowntown.com minidrivingexperienceusa.com minidurham.caminidurham.com  minie.com -minifs.comminigeorgian.caminigrandriver.comminihalifax.caminihalifax.com -minihk.comminiinvasion.caminiitalianjob.comminikelowna.caminikelowna.comminilangley.caminilangley.com minilat.com minilaval.ca minilaval.com minilondon.ca minilondon.cominimarkham.caminimarkham.comminimoncton.caminimoncton.comminimontrealcentre.caminimontroyal.caminimontroyal.comminimotoringrewards.comminimotoringschool.comminimotorsport.commininanaimo.camininanaimo.comminioakville.comminiofmonrovia.comminipetfriendly.comminirichmond.caminirichmond.comminisaskatoon.caminisaskatoon.com minishop.ca minispace.comminispecialoffers.caminispygear.comministcatharines.caministeagathe.comministjohns.caminitakesthestates.comminitoronto.caminitroisrivieres.ca miniusa.comminiusaservice.comminiusatires.comminivalueservice.comminivancouver.caminivaughanwest.caminivaughanwest.comminivictoria.caminivictoria.comminivilledequebec.caminivilledequebec.comminiwholesaleconnect.com miniwidget.caminiwindsor.comminiworkshop.comminiyaletown.capugetsoundmini.comshopminiusa.comsouthfloridamini.com -trmini.comtroisrivieresmini.comyours-customised.mini.combmwapprovedusedbmw.combaltimorebmw.combayareabmw.combmw-abudhabi.combmw-adventskalender.combmw-albania.combmw-antilles.frbmw-art-journey.combmw-arts-design.com bmw-asia.com bmw-auslieferungszentrum.combmw-authority-vehicles.combmw-bahrain.combmw-businessdrive.combmw-calgary.ca bmw-carit.debmw-classic.combmw-clubs-international.combmw-connected-drive.combmw-connecteddrive.aebmw-connecteddrive.atbmw-connecteddrive.bebmw-connecteddrive.bgbmw-connecteddrive.cabmw-connecteddrive.chbmw-connecteddrive.co.nzbmw-connecteddrive.co.ukbmw-connecteddrive.co.zabmw-connecteddrive.combmw-connecteddrive.com.aubmw-connecteddrive.com.brbmw-connecteddrive.com.cybmw-connecteddrive.com.hrbmw-connecteddrive.com.kwbmw-connecteddrive.com.mtbmw-connecteddrive.czbmw-connecteddrive.debmw-connecteddrive.dkbmw-connecteddrive.eebmw-connecteddrive.esbmw-connecteddrive.fibmw-connecteddrive.frbmw-connecteddrive.grbmw-connecteddrive.hubmw-connecteddrive.iebmw-connecteddrive.itbmw-connecteddrive.jpbmw-connecteddrive.krbmw-connecteddrive.ltbmw-connecteddrive.lubmw-connecteddrive.lvbmw-connecteddrive.mxbmw-connecteddrive.mybmw-connecteddrive.nlbmw-connecteddrive.nobmw-connecteddrive.plbmw-connecteddrive.ptbmw-connecteddrive.robmw-connecteddrive.rubmw-connecteddrive.sebmw-connecteddrive.sgbmw-connecteddrive.sibmw-connecteddrive.skbmw-connecteddrive.twbmw-corporate-sales.combmw-diplomatic-sales.combmw-driving-center.co.krbmw-drivingexperience.com bmw-dubai.com -bmw-eg.com bmw-fleet.net bmw-ghana.combmw-golfsport.com bmw-group.com bmw-group.netbmw-grouparchiv.debmw-grouparchives.com -bmw-gta.cabmw-i-pure-impulse.com bmw-i.jp bmw-int1.com bmw-iraq.combmw-jordan.combmw-konzernarchiv.de bmw-ksa.combmw-kuwait.com -bmw-lao.labmw-lebanon.combmw-m-safetycar.com  bmw-m.combmw-mdrivetour.com -bmw-me.combmw-military-sales.combmw-motorcycle.combmw-motorcycles.vnbmw-motorrad-abudhabi.com bmw-motorrad-authorities.combmw-motorrad-dubai.combmw-motorrad-motorsport.com!bmw-motorrad-now-or-never.com&"bmw-motorrad-service-inclusive.combmw-motorrad-test-ride.combmw-motorrad.atbmw-motorrad.bebmw-motorrad.bgbmw-motorrad.bhbmw-motorrad.bobmw-motorrad.cabmw-motorrad.chbmw-motorrad.clbmw-motorrad.cobmw-motorrad.co.idbmw-motorrad.co.krbmw-motorrad.co.nzbmw-motorrad.co.thbmw-motorrad.co.ukbmw-motorrad.co.zabmw-motorrad.combmw-motorrad.com.arbmw-motorrad.com.aubmw-motorrad.com.brbmw-motorrad.com.dobmw-motorrad.com.hrbmw-motorrad.com.mxbmw-motorrad.com.mybmw-motorrad.com.pebmw-motorrad.com.pybmw-motorrad.com.trbmw-motorrad.crbmw-motorrad.czbmw-motorrad.debmw-motorrad.dkbmw-motorrad.dzbmw-motorrad.ecbmw-motorrad.eebmw-motorrad.esbmw-motorrad.fibmw-motorrad.frbmw-motorrad.grbmw-motorrad.gtbmw-motorrad.hubmw-motorrad.inbmw-motorrad.itbmw-motorrad.jpbmw-motorrad.lubmw-motorrad.mabmw-motorrad.nlbmw-motorrad.nobmw-motorrad.pabmw-motorrad.plbmw-motorrad.ptbmw-motorrad.robmw-motorrad.rsbmw-motorrad.rubmw-motorrad.sabmw-motorrad.sebmw-motorrad.sibmw-motorrad.skbmw-motorrad.svbmw-motorrad.twbmw-motorrad.uabmw-motorrad.uybmw-motorsport.combmw-mountains.combmw-museum.combmw-museum.netbmw-nigeria.com bmw-oman.com bmw-ottawa.cabmw-pakistan.combmw-plant-munich.combmw-pma.com.sgbmw-powertrain.combmw-product-highlights.com bmw-qatar.combmw-routes.com -bmw-rp.combmw-rrdays.combmw-saudiarabia.combmw-security-vehicles.combmw-special-sales.combmw-sports.com bmw-sudan.combmw-tahiti.combmw-tunisia.combmw-vancouver.ca bmw-voli.me bmw-welt.com bmw-welt.net bmw-welt.tvbmw-werk-berlin.de bmw-world.com bmw-world.net bmw-world.tvbmw-worldfinal.combmw-yachtsport.com -bmw-yeg.ca bmw-yemen.com -bmw.am -bmw.at -bmw.az -bmw.ba -bmw.bb -bmw.be -bmw.bg -bmw.bm -bmw.bs -bmw.by -bmw.ca -bmw.cc -bmw.ch -bmw.cl  bmw.co.ao  bmw.co.cr  bmw.co.id  bmw.co.il  bmw.co.jp  bmw.co.ke  bmw.co.kr  bmw.co.nz  bmw.co.th  bmw.co.uk  bmw.co.za bmw.com -bmw.com.ar -bmw.com.au -bmw.com.bd -bmw.com.bn -bmw.com.bo -bmw.com.br -bmw.com.cn -cn -bmw.com.co -bmw.com.cy -bmw.com.do -bmw.com.ec -bmw.com.ge -bmw.com.gt -bmw.com.kh -bmw.com.ky -bmw.com.mk -bmw.com.mo -bmw.com.mt -bmw.com.mx -bmw.com.my -bmw.com.ni -bmw.com.pa -bmw.com.pe -bmw.com.ph -bmw.com.py -bmw.com.sg -bmw.com.sv -bmw.com.tr -bmw.com.tw -bmw.com.uy -bmw.com.ve -bmw.cw -bmw.cz -bmw.de -bmw.dk -bmw.dz -bmw.ee -bmw.es -bmw.fi -bmw.fr -bmw.gp -bmw.gr -bmw.hn -bmw.hr -bmw.ht -bmw.hu -bmw.ie -bmw.in -bmw.is -bmw.it -bmw.kg -bmw.kz -bmw.lc -bmw.lk -bmw.lt -bmw.lu -bmw.lv -bmw.ly -bmw.ma -bmw.md -bmw.mn -bmw.mq -bmw.mu -bmw.nc -bmw.nl -bmw.no -bmw.pl -bmw.ps -bmw.pt -bmw.re -bmw.ro -bmw.rs -bmw.se -bmw.si -bmw.sk -bmw.sn -bmw.tm -bmw.tt -bmw.ua -bmw.uz -bmw.vn bmwarchiv.at bmwarchiv.debmwartjourney.com bmwasia.combmwauslieferungszentrum.com bmwbikes.com  bmwbkk.de -bmwccrc.cabmwcenternet.combmwchampionship.combmwchampionshipusa.combmwcharitygolf.combmwcitychallenge.combmwclassic.combmwcolorado.combmwconnecteddrive.combmwcustomapparel.com bmwdcsnet.netbmwdealercareers.combmwdealerdirect.combmwdelawarevalley.com bmwfilms.combmwgroup-classic-heart.combmwgroup-classic.combmwgroup-gaad.combmwgroup-plants.combmwgroup-posdigital.combmwgroup-werke.com bmwgroup.at bmwgroup.com bmwgroup.net bmwgroup.jobsbmwgroupclassic.combmwgroupdesignworks.combmwgroupdirect.combmwgroupfs.combmwgroupinfobahn.combmwgroupna.com  bmwhk.com bmwi.ca bmwi.jpbmwiventures.combmwjamaica.com -bmwlat.combmwlifestyle.ca bmwm.combmwmagazine.combmwmagazine.de bmwmass.com bmwmass.net  bmwmc.netbmwmontreal.cabmwmotorcycles.combmwmotorcycleusa.combmwmotorrad.co.krbmwmotorrad.com.aubmwmotorrad.com.phbmwmotorrad.com.sgbmwmotorradhk.combmwmotorshowblog.combmwmotorsport.combmwmperformance.com bmwmuseum.netbmwmyanmar.combmwofannapolis.combmwofcentralpa.combmwoftulsa.combmwondemandusa.com bmworegon.combmwperformancecenter.combmwpittsburgh.combmwproductnews.com bmwsafari.com -bmwsfl.com -bmwsfl.net -bmwshop.cabmwspecialoffers.ca bmwsports.combmwstartupgarage.com bmwstep.combmwstepconnections.combmwsummerschool.combmwtampabay.com -bmwusa.combmwusatires.combmwusaservice.combmwusfactory.combmwusrideracademy.combmwvalueservice.combmwwholesaleconnect.com bmwworld.com bmwworld.net bmwworld.tvbmwzentrum.combrand-protection-team.comcencoastbmw.com chargenow.comchargenowusa.comchicagolandbmw.comconnected-drive.com daytonbmw.comdealerspeed.net desertbmw.com dreambmw.ca grupobmw.com guambmw.comhackthedrive.com hawaiibmw.com iaablog.comlasvegasbmw.com m-power.comminneapolisbmw.comminneapolisbmw.netmotorshowblog.com mybmw.ca  mybmw.comnewhampshirebmw.com  nmbmw.comocbmwdealers.comoffresspecialesbmw.ca park-now.com parkinfo.com -pdxbmw.com -phxbmw.compre-bmwgroup.jobspugetsoundbmw.com rentaride.com rentaride.derhodeislandbmw.comsdcountybmw.comshopbmwmotorcycles.comshopbmwusa.com socalbmw.comstlouisbmw.netthe-m-festival.comtristatebmw.comvancouverbmwretailers.cawashingtondcbmw.com alfera.com.hk alfera.com.my  alfera.in  alfera.myalphera-finance.co.inalphera-finance.com.hkalphera-finance.in -alphera.ca alphera.co.in alphera.co.nz alphera.comalphera.com.esalphera.com.hkalphera.com.my -alphera.de -alphera.es -alphera.ie -alphera.in -alphera.my alphera.netalpherafinance.com.hkalpherafinancialservices.esalpherafinancialservices.in alpherafs.caalpherafs.co.nzalpherafs.com.hkalpherafs.com.my alpherafs.ie alpherafs.in alpherafs.my premiumfs.de alphabet.asia alphabet.at alphabet.be alphabet.biz alphabet.chalphabet.co.hualphabet.co.ukalphabet.co.za alphabet.comalphabet.com.cn -cnalphabet.com.esalphabet.com.lvalphabet.com.mxalphabet.com.plalphabet.com.pt alphabet.cz alphabet.de alphabet.es alphabet.eu alphabet.fr alphabet.info alphabet.jp alphabet.lt alphabet.lu alphabet.lv alphabet.mxalphabet.net.cn -cn alphabet.noalphabet.org.uk alphabet.pl alphabet.pt alphabet.uk alphabet.usalphabetfinance.netelectricluxury.comrolls-roycecullinan.comrolls-roycemotorcars.comrolls-roycemotorcarsna.com  rrtis.comspiritofecstasy.com - - INTEL-DEV -01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net -oneapi.comopenvinotoolkit.orgsnap-telemetry.io -acpica.com clearlinux.cn -cnclearlinux.org -ospray.net -ospray.org - -NAVER -lin.ee line.me line.naver.jp line-apps.com line-cdn.net line-scdn.net -nhncorp.jp grafolio.com  naver.com naver.jp  naver.net navercorp.com  plug.game pstatic.net -/ - SNAPCRAFT snapcraft.io snapstore.io -" - ADBLOCKPLUSadblockplus.org -b - -EMOJIPEDIAemojipedia.orgworldemojiawards.comworldemojiday.com xn--yt8h.la - -ORACLE -oracle -oracle.comoraclecloud.comoraclefoundation.org oracleimg.comateam-oracle.com -bronto.comcovid19-rx.org covid19rx.org sun.com addthis.comaddthiscdn.comaddthisedge.comjava java.com java.net -( -CAIJINGLENGYANcaijinglengyan.com -k -SLING dishworld.comslinginternational.com  sling.commovenetworks.com -movetv.com -E -ETHEREUM -devcon.orgethereum.foundation ethereum.org -D -ICBCicbc icbc-ltd.com icbc-us.com icbc.com.cn - -JIYUKOBOjiyu-kobo.co.jp -8 - KINGKONGLIVEkingkong.com.twkingkongapp.com - -SONY playstationplaystation.complaystation.net sonyentertainmentnetwork.comimageworks.commotionpictureser.com playshow.ioplayshowtv.comsonyclassics.comsonypictures.comsonypicturesanimation.comsonypicturesmuseum.comsonypicturesstudios.comsonypicturestelevision.com#sonypicturestelevisiongames.com wheelpop.com -wwtbam.comyourfantasybeginsnow.comsonyginzasonypark.jpsony-africa.com sony-asia.comsony-europe.comsony-hes.co.jpsony-latin.com sony-mea.comsony-olympus-medical.comsony-promotion.eusony-semicon.co.jp sony.at sony.ba sony.be sony.bg sony.ca sony.ch sony.cl -sony.co.cr -sony.co.id -sony.co.in -sony.co.jp -sony.co.kr -sony.co.nz -sony.co.th -sony.co.uk sony.com sony.com.ar sony.com.au sony.com.bo sony.com.br sony.com.co sony.com.do sony.com.ec sony.com.gt sony.com.hk sony.com.hn sony.com.mk sony.com.mx sony.com.my sony.com.ni sony.com.pa sony.com.pe sony.com.ph sony.com.sg sony.com.sv sony.com.tr sony.com.tw sony.com.vn sony.cz sony.de sony.dk sony.ee sony.es sony.eu sony.fi sony.fr sony.gr sony.hr sony.hu sony.ie sony.it sony.kz sony.lt sony.lu sony.lv sony.net sony.nl sony.no sony.pl sony.pt sony.ro sony.rs sony.ru sony.se sony.si sony.sk sony.ua sonybo.co.jp sonybsc.comsonybuilding.jpsonydesign.com sonydna.comsonyglobalsolutions.jp sonykigyo.jpsonylatvija.com -sonypcl.jpsonyprotechnosupport.co.jpsonystoragemedia.co.jp sonytc.co.jp  sovec.net -* -BETTEREXPLAINEDbetterexplained.com - - -CODECADEMYcodecademy.com -3 -ELEME -ele.me elemecdn.com eleme.cn - -VEET veet.at veet.be veet.ca veet.ch veet.clveet.cn -cn -veet.co.id -veet.co.in -veet.co.kr -veet.co.nz -veet.co.uk -veet.co.za veet.com veet.com.ar veet.com.au veet.com.bd veet.com.br veet.com.cn -cn veet.com.co veet.com.hk veet.com.mx veet.com.my veet.com.ph veet.com.pk veet.com.sg veet.com.tr veet.de veet.dk veet.es veet.fi veet.fr veet.hu veet.jp veet.nl veet.no veet.pt veet.ro veet.ru veet.se veet.tv veet.usveetarabia.comveetbangladesh.comveetcentroamerica.com veetclub.it -' -WATCHOUT watchout.tw -waa.tw - -SOFTBANK softbank sb-mobile.jpsb-telecom.netsoftbank-ipo.comsoftbank-jp.comsoftbank-robotics.comsoftbank-telecom.comsoftbank-telecom.net softbank.jp softbank.tvsoftbankbb.comsoftbankbb.netsoftbankci.comsoftbankhawksstore.jpsoftbankmobile.netsoftbankrobotics.comsoftbanktelecom.comsoftbankusa.netsoftbankventuresasia.comsoftbankworld.com -% -ZHIHU  zhihu.com  zhimg.com -+ -AFDIAN -afdian.net afdiancdn.com - -KUAISHOU gifshow.com ksapisrv.com kuaishou.com -yximgs.com log-sdk.gifshow.com -adswlog.kuaishou.com -ads -~ -NEWSCORP newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.com - -GFYCAT -gfycat.com -. -ASPROEX asproex.comasproexapi.com - -CTYUN ctyun.online -n -ESPN espn.com espncdn.com watchespn.comespn.hb.omtrdc.netespndotcom.tt.omtrdc.net - -PINCONG pincong.rocks -+ -TYPEKIT typekit.com typekit.net -7 -VANCL  vancl.com vanclimg.com  vcimg.com - -ALIYUNalibabadns.com -alicdn.com alidayu.com -alidns.comaliyun-inc.comaliyun-iot-share.com -aliyun.com aliyuncdn.com aliyuncs.com hichina.comica-alliance.org mxhichina.com - -CODE code.org -+ - ONESIGNAL-ADS onesignal.com -ads -/ -CLEARBITJS-ADSx.clearbitjs.com -ads -, -DUYAOSS duyaoss.com duyaossr.com - - -FREEBEACONfreebeacon.com - -REMIREPO remirepo.net -" - THEPORNDUDEtheporndude.com - -BLIZZARD blizzard.cn -cn blizzard.comblizzardgearstore.comblz-contentstack.com blzstatic.cn -cn -battle.netbattlenet.com.cn -cn bnet.163.com -cnblizzard.nefficient.co.krblzddist1-a.akamaihd.netblzddistkr1-a.akamaihd.netbnetcmsus-a.akamaihd.netbnetproduct-a.akamaihd.netbnetshopus.akamaized.net diablo3.comdiabloimmortal.comdi.res.netease.com -cn!diablo3.nosdn.127.net -cnfiresidegatherings.complayhearthstone.com%hearthstone.nosdn.127.net -cnheroesofthestorm.com%hearthstone.nosdn.127.net -cn"heroes.nos.netease.com -cnplayoverwatch.com#overwatch.nosdn.127.net -cn starcraft.comstarcraft2.comsc2.nosdn.127.net -cnplaywarcraft3.comworldofwarcraft.com wowchina.com -cnwow.nosdn.127.net -cnblizzcon-a.akamaihd.netblz.nosdn.127.net -cnblzmedia-a.akamaihd.netblznav.akamaized.net - - BLOOMBERG  bloomberg bbgevent.com bbhub.io -bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.brbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweekmag.comlondonmithraeum.comneweconomyforum.comnewenergyfinance.comtechatbloomberg.com - -CAOLIU t66y.com - -XIAOMI -mi.com -mi-img.com  mifile.cn miui.com -miwifi.com  xiaomi.cn -xiaomi.com -xiaomi.netxiaomiyoupin.com -f -PHOENIX  ifeng.com ifengimg.comphoenixcenter.cn fengedu.comifengweekly.com -L -TLD-!CNacadaeafagalamanaoaqaratauawaxazbabgbhbibjbmbnbobrbsbvbwbybzcacdcgclcmcrcucwcxcyczdedkdzecegehereseufifjfkfofrgagbgdgeghgiglgmgngrgsgtgugwgyhkhnhthuieiliniqirjejmjojpkekhkiknkpkrkwkykzlblclilklrlsltlulymamcmdmfmgmhmkmnmompmqmrmtmumwmxmymznancnenfngninlnonpnrnunzompapepfpgphplpnrerorurwsascsdsesgsisjskslsnsrssstsusvsxsysztctdtfthtjtktltmtntotptrtttwtzuaugukumusuyuzvavcvevgvivnvuwfytzazmzwaflmlbnbanflnra averybbbbcgcebcrsdnbdnpdunsdvagerni globalxice locus mckinsey olayangroup -olayan praxisapseek -vistaprint vistawtc xerox athletabananarepublic  bloomberg boots calvinklein cartier chloegap gucci -hermesiwcjlc  lancaster lipsyloft mango  montblanc mrporter -netaporter -nextdirectnextnike oldnavy omega panerai  patagonia -piaget  piperlimepolo redstone -swatchaarp -abbott -abbvie aetna alcon -anthembms -boehringer caremore -cialis dabur  freseniusjnj merck mutuelle -sanofiaeg -airbus -alstom -aramco -blanco bosch -bostik -chesapeakechk crown -doosan -dupontflirfls flsmidth  gecompany grainger hitachi  honeywellifm ipirangajio komatsukoneksb  kuokgroup leclerclidl linde lottemanmtr reliance rexrothril rockwoolrwesandvikcoromant sandvik sapphiresca -schaeffler schmidt schwarzgroup schwarz senersewsncf statoil total -vanish -walter -warman weberweir woodsidezara zippo agakhanakdn -ansons -bharti -extraspace genting glean ikano -imamat  ladbrokes -livestrongmaif -mattel shell transformersvanawme astriumcern -emerck  hisamitsu lilly lundbeck lupin merckmsdmsdmtpc -otsuka -pfizer stadateva toray weather auspost deutschepostdhl epost fedex -pitneyaaa -abarthadac  alfaromeoaudi bentleybmw bridgestone bugatti buick cadillaccase -caseih  chevrolet chevy chrysler -datsun dodge -dunlop ferrarifiat  firestonefordgmc goodyear honda hyundai infiniti iveco -jaguarjeepkia lamborghini -lancia  landrover lexus lincoln maseratimini -mitsubishi mopar -newholland -nissanramseatsrt -suzuki -tatamotors -toyotatvs uconnect -volkswagen volvoaigo android apple bestbuy brother canondell digikey fujitsu  fujixerox  goldpointibm nikon nokia olympus  panasonic philips pioneer samsung sharpsony toshiba  yodobashi  allfinanzallfinanzberaterallfinanzberatungallyamericanexpressamexampanz banamex barclaycard barclaysbbtbbvabnl -bnpparibasbofa bradesco -capitalone cashbackbonuscbacfa chasecimb citadelciti commbank deloitte discover everbank fidelity hdfcbankhdfchsbcitaujcbjll jpmorganchase jpmorgankfhkpmg lacaixa lasalle lixil lplfinanciallplnab nadex netbanknorthwesternmutualopen -pictetpncpohl  pramerica -prudentialprupwcsaxosbiscbscor shriram softbank  statebank temasek -transunion ubankubs vanguardvisa wolterskluwerafamilycompany  aquarellediyduck -finish glade  homedepot  homegoods mrmuscleoffraid rightathome  scjohnsonaig allstateamericanfamily amfam amicaaxa chartis esurance farmers  goodhands guardian guardianlife iselect metlifemma -mutual -nationwide -nissaynorthlandinsurance -onyourside progressive redumbrella  statefarm -swiftcover thehartfordtiaatravelersinsurance  travelers travelguardtrvvig beats blockbusterbway netflix playstation showtimetab williamhillxboxasda bloomingdales -george  homesense justforulego macys  marshallsobiqvc safeway samsclub shopyourway staples -targetthd tiffany -tjmaxxtjx -tkmaxxvons walmartabb  accentureaceraco -active -airtel -amazonandaolawsaxis azure chatr -chrome cisco comcast -connectorscscdclkdish -docomodtvdwg emerson epson ericsson etisalat  fairwindsfido -flickr frogans frontierftrgbizgeaggeegle gmailgmogmx godaddygoog -googlegoogreeguge hangouthkt hotmailhtc -hughesieee iinet infosysinfy intel -intuitjavajcpjmpjprs juniperkddi -kindle -konamikpn lanxess liaison -lockermeo  microsoftmihmiimint mitekmit -mobily -mozaicmtn multichoice naspersnec neustar nexusnico -nortonntt -officeollo -oracle -orangeovh patchpayupccwqtel quest  richardli ricoh -rogers -sakurasaposassessfrshaw skolkovo skydrive skype sling smart stcgroupstc symantectatatcitdk telecity -telefonica terra translations  ultrabook unicornuol verisignvivavivo windows xfinity -xperia yahoo yamaxun -yandex yellowpages youtube -zappos -chanel clinique garnier  kerastase -kiehls lamer lancome -loreal -matrix -maybelline -natura origins -redkensvr barefoot beknown cityeatscookingchannel -cuisinella delmonte edekafage ferrero foodnetworkfood gallo heinz -kindermcd  mcdonalds pamperedchef -rocher -wilmarxn--3oq18vl8pn36axn--55qx5d8y0buji4b870uxn--5su34j936bgsgxn--b4w605ferd xn--cckwcxetd -xn--cg4bkixn--dkwm73cwpn xn--flw351exn--fzys8d69uvgmxn--hxt035cmppuelxn--hxt035czzpfflxn--j6w470d71isscxn--jlq480n2rgxn--jlq61u9w7bxn--kcrx77d1x4axn--kcrx7bb75ajk3bxn--mgba3a3ejtxn--mgba7c0bbn0axn--mgbaakc7dvfxn--mgbb9fbpob xn--ngbe9e0a xn--pgb3ceoj xn--qcka1pmcxn--w4r85el8fhu5dnra xn--w4rs40l avianca caravan changiairport cipriani clubmed delta firmdale -hilton hyatt kerryhotelskerrylogisiticskerryproperties marriott orientexpress  shangrila tradershotelstui -viking -virgin -webjetablecbre chintai  frontdoor -lefrakabc africamagicartebbc  canalpluscbncbsdstv -eurovisionfox -gallup globogotv guardianmediahbohgtvimdbitv -kyknetmnet movistar mzansimagicnhk nowtvsbs sevensky spiegel starhub -supersport theguardian travelchannelweatherchannel bauhaus latrobe -monashrmit - - WIKILEAKS wikileaks.org - -BITQUICK bitquick.co -> - CATEGORY-DEValpinelinux.org anaconda.com anaconda.org conda.io android.comandroidify.com -apache.orgappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cncalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn -cnresearchkit.com.cn -cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io -webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net archlinux.orgarchlinuxarm.org atom.io -badgen.netbootstrapcdn.comgetbootstrap.combraventures.com braveux.com -compass.isfightforux.comforthebadge.comstockagainstphotography.com launchpad.netlaunchpadlibrarian.comlaunchpadlibrarian.netlaunchpadlibrarian.org snapcraft.io snapstore.io -ubuntu.com -ubuntu.netubuntuforums.org canonical.com  cdnjs.com -centos.orgchocolatey.org clojure.org -cnpmjs.org -cygwin.com -cython.org dart.dev dartlang.org dartpad.dev -debian.org -dotdeb.org  deno.landcompose-spec.io -docker.com  docker.ioelixir-lang.org -elrepo.org embed.ly embedly.com playerjs.io -erlang.orgaccountkit.comatscaleconference.com botorch.org -buck.build buckbuild.comcomponentkit.org draftjs.org -f8.comfacebookappcenter.infofacebookappcenter.netfacebookappcenter.orgfacebookconnect.comfacebookdevelopergarage.comfaciometrics.com fasttext.cc fbf8.com fbinfer.com fblitho.com fbredex.com -fbrell.com flow.dev flow.org flowtype.org frescolib.org hacklang.org hhvm.commakeitopen.com mcrouter.net mcrouter.orgmessengerdevelopers.com -ogp.meopengraphprotocol.comopengraphprotocol.org  parse.com pyrobot.org  react.com reactjs.com reactjs.org recoiljs.org rocksdb.com rocksdb.net rocksdb.orgyogalayout.comdevelopers.facebook.com fastlane.cifastlane.tools getfedora.orgfedoraforum.orgfedoraproject.orgfedoramagazine.org -ffmpeg.org flathub.org flatpak.org flutter.devflutterapp.comfontawesome.comfortawesome.com freebsd.org  fury.blog fury.co fury.dev  fury.help fury.io gemfury.com -gentoo.orggetcomposer.org git-scm.com gitbook.com -gitbook.iogitbook.zendesk.com  npmjs.com npm.communitydependabot.com -git.io github.blog -github.comgithub.community  github.io githubapp.comgithubassets.comgithubhackathon.comgithubstatus.comgithubusercontent.com/+github-avatars.oss-cn-hongkong.aliyuncs.comFBgithub-production-release-asset-[0-9a-za-z]{6}\.s3\.amazonaws\.com -gitlab.com  gitlab.io -gitlab.netgitlab-static.net.*gitlab-assets.oss-cn-hongkong.aliyuncs.com gnu.org go-lang.com go-lang.net go-lang.org -go.dev  godoc.org -golang.com -golang.net -golang.org  consul.io hashicorp.comnomadproject.io  packer.io terraform.io vagrantup.comvaultproject.io haskell.orghaskellstack.org stackage.org brew.shhomebrew.bintray.com -01.org hyperscan.iointellinuxgraphics.comintellinuxgraphics.net -oneapi.comopenvinotoolkit.orgsnap-telemetry.io -acpica.com clearlinux.cn -cnclearlinux.org -ospray.net -ospray.org -ius.iojava java.com java.net -jenkins.io jetbrains.com jetbrains.net datalore.iokotlinlang.org  jfrog.com  jfrog.org bintray.com!d29vzk4ow07wi7.cloudfront.net -js.org jsdelivr.net jsdelivr.comcdn.jsdelivr.net -cn jupyter.org kali.org kubernetes.io -k8s.iolinuxfromscratch.org linuxmint.com lua.org macports.org mariadb.orgadaptivecards.ioapi-extractor.com -apisof.net appcenter.ms -blazor.netbotframework.comcodethemicrobit.comdevopsassessment.net dot.netgamesstack.comgraphengine.ioinsiderdevtour.com -jwt.ms microbit.orgmicrosoftadc.commicrosoftgamestack.commicrosoftiotinsiderlabs.commicrosoftreactor.cn -cn#microsoftreactor.com.cn -cnmicrosoftreactor.infomicrosoftreactor.netmicrosoftreactor.orgmicrosoftsilverlight.commicrosoftsilverlight.orgmicrosoftsilverlight.netmicrosoftsqlserver.com  mmdnn.commono-project.com msdn.commsinnovationchallenge.commspairlift.commsropendata.com  nuget.org nugettest.orgopentranslatorstothings.orgposhtestgallery.compwabuilder.comreactorms.com.cn -cn -sankie.netsqlserveronlinux.comtimelinestoryteller.comuwpcommunitytoolkit.comvisualstudio-staging.comvisualstudio.comvisualstudio.covisualstudio.co.ukvisualstudio.euvisualstudio.net vfsforgit.com vfsforgit.org vsassets.io xamarin.comdeveloper.microsoft.comdtlgalleryint.cloudapp.net poshtestgallery.cloudapp.net"psg-int-centralus.cloudapp.netpsg-int-eastus.cloudapp.net  mingw.org mongodb.com mongodb.org  mysql.com  nginx.com  nginx.org  nixos.orgnodesource.comnotepad-plus-plus.org -openai.com openresty.org openssl.org opensuse.org openwrt.orglede-project.org packagist.org pcre.org perl.org cpan.org metacpan.org phantomjs.org php.netpolymer-project.orgpolymerproject.orgpostgresql.org -python.orgpythonhosted.org pypa.io pypi.org qt.ioqt-project.org r-project.orgraspberrypi.org raspbian.orgreadthedocs-hosted.comreadthedocs.comreadthedocs.ioreadthedocs.org redis.io redislabs.com remirepo.net rpmfusion.org ruby-lang.org rubygems.orgscala-lang.org scala-sbt.orgscientificlinux.org scoop.sh -shields.io -sqlite.org askubuntu.comblogoverflow.commathoverflow.netserverfault.com sstatic.net stackapps.com stackauth.comstackexchange.com stackmod.blogstackoverflow.blogstackoverflow.comstackoverflow.emailstackoverflowbusiness.comstacksnippets.net superuser.com tex-talk.netthesffblog.commystrikingly.comstrikingly.comstrikinglycdn.comsublimetext.com -kernel.org  linux.org amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org -cnamp.akamaized.netelectronjs.org -jquery.comjquerymobile.com jqueryui.com mochajs.org -nodejs.org openjsf.orglfai.foundationlinuxfoundation.org  unity.com unity3d.com!unityads.unity3d.com -ads#unityads.unitychina.cn -ads  unpkg.com -v8.dev v8project.org videojs.com videolan.org vim.org wireshark.org x.orgxda-developers.com xda-cdn.com xposed.info yarnpkg.com zsh.org -# - DATFOUNDATIONdat.foundation -, -HITUN hitun.ioxn--90wwvt03e.com -) -NPMJS  npmjs.com npm.community - - SWISSSIGN digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch -swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch -H -ACFUN acfun.cn aixifan.com apilog-web.acfun.cn -ads -. -CABLETVcabletv.com.hk i-cable.com - -FANDOM cursecdn.com -fandom.com  wikia.com  wikia.org dndbeyond.com futhead.com gamepedia.com muthead.comwikia.nocookie.netfandom.zendesk.com - -CHIPHELL chiphell.com - -DMM-ADS bluekai.com -adsfout.jp -ads gmossp-sp.jp -adsi-mobile.co.jp -ads im-apps.net -ads impact-ad.jp -ads ladsp.com -ads microad.co.jp -ads -microad.jp -ads socdm.com -ads - - -JINRISHICIjinrishici.com -q -CATEGORY-MEDIA 9cdn.net9nation.com.au 9news.com.au 9now.com.aufreeviewplus.net.au -mi9.com.au -mi9cdn.com nine.com.aunineentertainment.com.aunineentertainmentco.com.auninemediaroom.com.auninemsn.com.austatic9.net.au yourtv.com.au9to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com afp.com afpforum.com -ajplus.net aljazeera.com aljazeera.netpalestineremix.comsarajevopodopsadom.comsrebrenica360.com syhacked.comamericasvoice.news -ap.org -apnews.comappledaily.comappledaily.com.hkappledaily.com.tw appledaily.hkapplefruity.comapplehealth.com.hk -atnext.combestmallawards.com deluxe.com.hk eracom.com.tw next.hknextdigital.com.hknextdigital.com.twnextfilm.com.hknextmag.com.tw nextmedia.comnextmedia.com.tw nextmgz.comnextplus.com.hk nexttv.com.twnextwork.com.hknextwork.com.tw nextwork.hk nextwork.tw nxtdig.com.hk nxtdig.com.tw omoplanet.com privilege.hk privilege.tw sharpdaily.tw tomonews.nettwnextdigital.comappleinsider.com  asahi.com asahicom.jpasahishimbun.sc.omtrdc.netbbc  bbc.co.uk bbc.com -bbci.co.uk bbgwatch.com  bloomberg bbgevent.com bbhub.io -bbthat.com bgov.com bloomberg.cnbloomberg.co.jpbloomberg.co.kr bloomberg.combloomberg.com.brbloombergapps.combloombergarcade.combloombergbeta.combloombergbna.combloombergbreakaway.combloombergbriefs.combloombergchina.combloombergenvironment.combloombergforeducation.combloomberggovernment.combloombergindices.combloombergindustry.combloomberglabs.combloomberglaw.combloomberglive.combloomberglp.combloombergmedia.combloombergnext.combloombergpolarlake.combloombergprep.combloombergquint.combloombergradio.combloombergsef.combloombergspace.combloombergstatus.combloombergsurvey.combloombergtax.combloombergtax1.combloombergtaxtech.com!bloombergtradingchallenge.combloombergtv.mnbloombergvault.combloombergview.comblpcareers.com blpevents.comblpprofessional.com bmia.org bnef.combusinessweekmag.comlondonmithraeum.comneweconomyforum.comnewenergyfinance.comtechatbloomberg.com  boxun.combowenpress.com breitbart.comcabletv.com.hk i-cable.comcaijinglengyan.comcbs showtime cbs.comcbscorporation.com cbsi.com -cbsi.video -cbsiam.com  cbsig.net -cbsimg.netcbsinteractive.comcbsistatic.com cbsivideo.com cbsnews.comcbspressexpress.com cbssports.com cbsstatic.com cbssvideo.com -viacbs.com -viacom.com viacomcbs.comviacomcbspressexpress.com paramount.comchinadecoding.comchinadigitaltimes.net cnbc.com -cnbcfm.com -nbcuni.comnbcudigitaladops.com cnn.com -cnn.io cnnarabic.com cnnlabs.com cnnmoney.ch cnnmoney.comcnnmoneystream.comcnnpolitics.com -cup.com.hk d100.net  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk -mol.imthisismoney.co.uk -thismon.ee -dw.com dajiyuan.com dajiyuan.euepochmediagroup.comepochstories.com epochtime.comepochtimes-romania.comepochtimes.co.ilepochtimes.co.krepochtimes.co.ukepochtimes.comepochtimes.com.auepochtimes.com.brepochtimes.com.sgepochtimes.com.twepochtimes.com.ua epochtimes.cz epochtimes.de epochtimes.eu epochtimes.fr epochtimes.it epochtimes.jp epochtimes.nl epochtimes.pl epochtimes.ru epochtimes.seepochtimestr.com epochweek.comepochweekly.com erabaru.netlagranepoca.com ntd.com ntdtv.ca ntdtv.co.kr  ntdtv.com ntdtv.com.tw ntdtv.jp ntdtv.kr  ntdtv.org ntdtv.ru ntdtvla.com  ntdvn.comtheepochtimes.comtheepochtimessubscribe.comvelkaepocha.cz -forbes.com forbesimg.comfoxfox-corporation.com fox-news.com fox.com -fox.tv fox10.tv fox10news.comfox10phoenix.com  fox11.comfox13memphis.com fox13news.com  fox23.comfox23maine.com -fox247.com  fox247.tv  fox26.comfox26houston.comfox28media.com  fox29.comfox2detroit.com fox2news.com  fox32.comfox32chicago.comfox35orlando.comfox38corpuschristi.com fox42kptm.com  fox46.comfox46charlotte.com  fox47.com fox49.tv fox4news.com fox51tns.netfox5atlanta.com -fox5dc.com -fox5ny.com fox5storm.com fox6now.com fox7.comfox7austin.com fox9.comfoxacrossamerica.comfoxaffiliateportal.comfoxandfriends.com -foxbet.comfoxbusiness.comfoxbusiness.tvfoxbusinessgo.comfoxcanvasroom.comfoxcareers.comfoxcharlotte.com foxcincy.com foxcincy.jobs foxcincy.netfoxcollegesports.comfoxcorporation.comfoxcreativeuniversity.com foxcredit.com foxcredit.org foxd.tv -foxdcg.comfoxdeportes.comfoxdeportes.netfoxdeportes.tvfoxdigitalmovies.com foxdoua.comfoxentertainment.com -foxest.com -foxfaq.com -foxfdm.com foxfiles.com -foxinc.com foxkansas.com  foxla.com foxla.tvfoxlexington.comfoxmediacloud.com foxnation.comfoxnebraska.com -foxneo.comfoxneodigital.comfoxnetworks.infofoxnetworksinfo.com -foxnews.cc foxnews.com foxnews.net foxnews.org -foxnews.tvfoxnewsaffiliates.comfoxnewsaroundtheworld.comfoxnewsb2b.comfoxnewschannel.com foxnewsgo.net foxnewsgo.org foxnewsgo.tvfoxnewshealth.comfoxnewslatino.comfoxnewsmagazine.comfoxnewsnetwork.comfoxnewsopinion.comfoxnewspodcasts.comfoxnewspolitics.comfoxnewsradio.comfoxnewsrundown.comfoxnewssunday.com  foxon.comfoxphiladelphia.com foxpoker.com  foxrad.io foxredeem.comfoxrelease.comfoxrichmond.com foxrobots.comfoxsmallbusinesscenter.comfoxsmallbusinesscenter.netfoxsmallbusinesscenter.org foxsoccer.net foxsoccer.tvfoxsoccermatchpass.comfoxsoccerplus.comfoxsoccerplus.netfoxsoccerplus.tvfoxsoccershop.comfoxsports-chicago.comfoxsports-newyork.comfoxsports-world.com foxsports.cl foxsports.cofoxsports.co.ve foxsports.comfoxsports.com.arfoxsports.com.bofoxsports.com.brfoxsports.com.cofoxsports.com.ecfoxsports.com.gtfoxsports.com.mxfoxsports.com.pefoxsports.com.pyfoxsports.com.uyfoxsports.com.ve foxsports.gtfoxsports.info foxsports.netfoxsports.net.br foxsports.pe foxsports.sv foxsports.uyfoxsports2.comfoxsportsflorida.comfoxsportsgo.comfoxsportsla.comfoxsportsnetmilwaukee.comfoxsportsneworleans.comfoxsportsracing.comfoxsportssupports.comfoxsportsuniversity.comfoxsportsworld.comfoxstudiolot.com foxsuper6.com -foxtel.com foxtel.com.aufoxtelevisionstations.com  foxtv.com foxtvdvd.com  foxuv.comfoxweatherwatch.com  fssta.com -fxn.ws fxnetwork.comfxnetworks.com bentobox.tv kicu.tv ktvu.commyfoxsanfran.comafewmomentswith.com -anidom.comcasoneexchange.comcoronavirusnow.com -fse.tvgeraldoatlarge.comgooddaychicago.com joeswall.comkilmeadeandfriends.commaskedsingerfox.com -my13la.com -my20dc.commy20houston.com -my29tv.com my45.com  my9nj.commyfoxatlanta.commyfoxaustin.commyfoxboston.commyfoxcharlotte.commyfoxchicago.com myfoxdc.commyfoxdetroit.com myfoxdfw.commyfoxhouston.commyfoxhurricane.com myfoxla.commyfoxlosangeles.commyfoxlubbock.commyfoxmaine.com myfoxny.commyfoxorlando.commyfoxphilly.commyfoxphoenix.commyfoxtampa.commyfoxtampabay.commyfoxtwincities.com myfoxzone.com myq2.comnewsnowfox.comorlandohurricane.comparadisehotelquizfox.com q13.com -q13fox.comrealamericanstories.comrealamericanstories.inforealamericanstories.netrealamericanstories.orgrealamericanstories.tvrealmilwaukeenow.com rprimelab.comshopspeedtv.comsoccermatchpass.comspeeddreamride.comspeedfantasybid.comspeedracegear.com speedxtra.comteenchoice.com testonfox.comtheclasshroom.comthefoxnation.comthegeorgiascene.comwhatthefox.comwhosthehost.com wofl.tvwoflthenewsstation.com wogx.com foxnewsplayer-a.akamaihd.netfreebeacon.comgannett-cdn.com gannett.comgannettdigital.com usatoday.comusatodaynetworkservice.comglobalvoices.orgglobalvoicesonline.org  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com hk01.com hkcnews.com hkopentv.com fantv.hkhongkongfp.comhuffingtonpost.cahuffingtonpost.co.ukhuffingtonpost.co.zahuffingtonpost.comhuffingtonpost.com.auhuffingtonpost.com.mxhuffingtonpost.dehuffingtonpost.eshuffingtonpost.frhuffingtonpost.grhuffingtonpost.inhuffingtonpost.ithuffingtonpost.jphuffingtonpost.kr huffpost.comhuffpostarabi.comhuffpostbrasil.comhuffpostmaghreb.com inmediahk.netbusinessinsider.co.zabusinessinsider.combusinessinsider.com.aubusinessinsider.com.plbusinessinsider.debusinessinsider.esbusinessinsider.frbusinessinsider.inbusinessinsider.jpbusinessinsider.mxbusinessinsider.mybusinessinsider.nlbusinessinsider.sginsider-intelligence.com insider.cominsiderintelligence.com jfengtime.com landofhope.tvlocalpresshk.com -ltn.com.tw yes123.com.tw macrumors.com matters.news matters.one -medium.commedium.systems -myradio.hkmyradio.com.hkdreamworks.com cnbc.com -cnbcfm.com  msnbc.com -nbc.co nbc.com nbcnews.comnbcolympics.com nbcsports.com -nbcuni.comnbcuniversal.com s-nbcnews.com peacocktv.comuniversalorlando.comuniversalpictures.com&"universalpicturesinternational.com!universalstudioshollywood.com newscorp.com dowjones.com dowjones.iodowjoneson.com wsj.com wsj.net barrons.comandysparis.com newsmax.com -newsmax.in newsmaxtv.com newyorker.com -nikkei.com  nikkei.jp nikkei.co.jp now.com -now.com.hk nowe.com -now-tv.comnow-ashare.com nyt.com nyt.net nytcn.me  nytco.com nytimes.com nytstyle.comtimestalks.com aweencore.com  awetv.comherringnetwork.com oanencore.com oann.compassiontimes.hk qmap.pubrealvision.com reuters.com -reuters.tvreutersmedia.net rfa.org -rfi.fr rsf.org -rt.com etvonline.hk rthk.hk -rtings.com scmp.com -i-scmp.comshuziyimin.orgsinoinsider.com slashdot.orgsky sky.com skyassets.comskyoceanrescue.comskyoceanrescue.deskyoceanrescue.it skysports.com skysports.fr skysports.ieskysportsonline.comskysportsracing.comsoundofhope.org theguardiandev-guardianapis.comdev-theguardian.com -gu-web.netguardianapis.comguardianapps.co.uk -guim.co.uktheguardian.comtheguardiandns.comtheinitium.com  init.shopthenationalpulse.comthestandnews.comdreamteamfc.com  page3.comsunbingo.co.uk talksport.comthescottishsun.co.uk thesun.co.uk  thesun.ie thetype.cloud -cn thetype.comtypeisbeautiful.com udn.com -udn.com.twudnfunlife.com  unwire.hkamerikaninsesi.comamerikaninsesi.orgamerikaovozi.comamerikayidzayn.comamerikiskhma.com bbg.govdandalinvoa.com darivoa.comdengeamerika.comdengiamerika.comglasamerike.netgolos-ameriki.ru insidevoa.com pashtovoa.com persagg.comradiyoyacuvoa.com urduvoa.com voa.govvoaafaanoromoo.comvoaafrique.comvoabambara.com voabangla.comvoacambodia.comvoacantonese.comvoachinese.comvoadeewanews.comvoadeewaradio.com voahausa.comvoaindonesia.com voakorea.comvoalingala.comvoandebele.com voanews.com -voanews.euvoanoticias.com voanouvel.comvoaportugues.com voashona.com voasomali.comvoaswahili.com voathai.comvoatibetan.comvoatibetanenglish.comvoatiengviet.com voatour.comvoazimbabwe.comzeriamerikes.com cstatic.net -curbed.com  eater.comfunnyordie.com meridian.net polygon.com -racked.com -recode.net sbnation.com theverge.com vox-cdn.com vox.comvoxcreative.comvoxfieldguide.com voxmedia.com -voxops.net warroom.orgwashingtonpost.com watchout.tw -waa.tw -wenzhao.castartupschool.orgycombinator.com -zaobao.com zaobao.com.sg  zaobao.sg zerohedge.com zoomingin.tv -M - MESSENGERfbmessenger.comm.me messenger.com -nbabot.net -+ - MXPLAYER-ADSevt.mxplay.com -ads -F - -TAGTIC-ADS g1.tagtic.cn -adsxy-log.tagtic.cn -ads -^ - APPLE-ADSiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -ads - -MPV -mpv.io - -NIKEnikeair-nike-shoes.com airmax360.combeijingnike.combetternike.combuynikechina.comcheap-nike.comcheapnikedunks.comcheapnikeoutlet.comclassicnike.comcnnikebrand.comcustomnikeshoes.com easynike.com -eenike.comfashionnike.com finenike.comfoampositeshoes.comgoldnikeclub.com -gonike.comhandbags-nike.comhightopnikes.com -idnike.cominikesneakers.com just-do-it.cn -cn justdoit.uskicksnike1.comkidsnikeshoes.com -mynike.comnike-air-max.comnike-dunksb.com nike-fr.com nike-org.com nike-shox.cn -cn nike-uk.com nike-us.com nike-usa.com nike.cinike.cn -cn nike.com nike.com.br nike.com.hk nike.gy nike.hk  nike.shop nike.usnike.xn--hxt814e nike0594.com -nike23.comnikeadidas.comnikeairhuarache.comnikeairmax.comnikeairmaxs.comnikeairmaxshoes.comnikeairrift.com nikeasia.comnikeaustralia.com nikeaw77.com  nikeb.com nikebbn.comnikebetrue.comnikebetterworld.cn -cnnikebetterworld.com"nikebetterworld.com.cn -cnnikebetterworld.infonikebetterworld.netnikebetterworld.org nikebiz.info nikebuy.com -nikeby.com nikecdn.comnikecompany.comnikeconfluence.com nikechina.cn -cnnikechosen.com nikecloud.com nikeclub.com nikecraft.com nikedawn.com nikedunks.netnikedunksshoes.com nikeelite.comnikefactorystore.com nikefind.com nikefirm.comnikefoamposites.comnikefoampositeshoes.comnikefootballcleats.comnikefootballgloves.comnikefootballjersey.comnikefoundation.org -nikefr.comnikefrance.com nikefree.comnikefreeshoes.comnikefuelband.comnikegadgets.comnikegenealogy.com nikegolf.ca nikegolf.cn -cn nikegrid.com nikehelp.comnikehightops.comnikehyperdunk.com nikeid.cn -cn nikeid.com.cn -cnnikeidshoes.com nikeinc.comnikeinc.com.cn -cnnikeincchemistry.comnikeinstock.com -nikeit.comnikeitalia.com nikeitaly.com -nikekd.com nikekid.com -nikelab.cn -cnnikelab.com.cn -cn nikelink.comnikeliuxiang.cn -cnnikeliuxiang.comnikeliuxiang.com.cn -cn nikelives.comnikelunarglide.com nikemall.cn -cnnikemall.com.cn -cnnikemarketing.com nikenews.com -niken7.comnikeonlinestore.comnikeoutletstore.comnikeoutletstores.comnikepioneer.com nikeplus.com nikeplus.org nikepress.com nikeprice.comnikeproduct.comnikepromax.comnikeresponsibility.comnikereuseashoe.comnikerunclub.cn -cnnikerunclub.com.cn -cnnikerunner.comnikerunning.com.cn -cnnikerunningshoes.com -nikesb.comnikesbdunks.netnikeseason.comnikeselling.comnikesellorder.comnikeshoemarket.comnikeshoes-store.comnikeshoes21.comnikeshoes4u.comnikeshoescity.comnikeshoesgroup.comnikeshoesinc.comnikeshoesmarket.comnikeshoesretro.comnikeshoeswon.comnikeshoponline.comnikeshoxsale.com nikesku.comnikesnowboarding.comnikesoccercleats.comnikesportswear.comnikestares.com nikestore.cn -cn nikestore.comnikestore.com.aunikestyles.com nikeswim.comniketaiwan.netniketracking.comniketradeweb.comniketrainer.comniketrainers.comniketraining.com nikeusa.com nikewear.com  nikey.com nikezoom.com nke6.comoutletnike.com runnike.comrunningnike.comsale-nikeshoes.comstatic-nike.com swoo.sh -swoosh.com  swoosh.tvthedailysnkr.comverygoodnike.comwomensnikeshox.comxn--74q035i.xn--hxt814e - -UN -un.org - -B3LOG  b3log.org -' -HM -hm.com hm.com.cn -cn -A - PINDUODUO -pddpic.com pinduoduo.com yangkeduo.com -% -KUGOU  kgimg.com  kugou.com - - -TYPOGRAPHYtypography.com - -VERCEL -now.shvercel-dns.comvercel-status.com -vercel.app -vercel.comzeit-world.co.ukzeit-world.comzeit-world.netzeit-world.org zeit.co zeit.sh zeitworld.com - -VIDEOJS videojs.com - -AMP amp.devampproject.comampproject.netampproject.orgcdn.ampproject.org -cnamp.akamaized.net - -BBGWATCH bbgwatch.com - - -CITIZENLAB citizenlab.ca -= -LANDIAN -lancdn.comlandiannews.com  wsoso.com - -MOOV moov.hk -Q -WANGSU  8686c.comchinanetcenter.com -wangsu.com ourdvsss.com - -9TO59to5google.com 9to5mac.com9to5terminal.com 9to5toys.com dronedj.com electrek.cospaceexplored.com -7 - BOOTSTRAPbootstrapcdn.comgetbootstrap.com -5 -IMDB imdb.com imdb.tomedia-imdb.com -N -THETYPE thetype.cloud -cn thetype.comtypeisbeautiful.com -s -EHENTAI e-hentai.org ehgt.org ehtracker.org -ehwiki.org exhentai.orghentaiverse.org - -OCULUS binoculus.com buyoculus.com ocul.usoculus-china.com -oculus.comoculus2014.com oculus3d.comoculusblog.comoculusbrand.comoculuscasino.net oculuscdn.comoculusconnect.comoculusdiving.comoculusforbusiness.comoculusrift.com oculusvr.compowersunitedvr.com -{ -QINIUstaticfile.org qbox.me  qiniu.com qiniucdn.com qiniudn.com qiniudns.com  qnssl.com - -OKEX okex.com -- -SURFLITE surflite.co surflite.net - -AMYTELE amytele.com - -CDNJS  cdnjs.com -" - LETSENCRYPTletsencrypt.org -/ -ADGUARDadguard-vpn.com adguard.com - -MAYING  maying.co - - SPANKBANG spankbang.com - -CATEGORY-SCHOLAR-CN -csdl.ac.cn  las.ac.cn cnki.netwanfangdata.com.cn  apabi.comcnthinkers.com  cqvip.com - -STAGE1ST saraba1st.com - - -TORPROJECTtorproject.org -' - UBERADS-ADS uberads.com -ads - -APPLEiadsdk.apple.com -ads iad.apple.com -ads qwapi.com -adscalendarserver.orgapple-cloudkit.com cups.orgdeveloper.apple.comdevimages-cdn.apple.comdevstreaming-cdn.apple.comfoundationdb.orgmacosforge.org macruby.com macruby.net macruby.orgapple-mapkit.complaygrounds-cdn.apple.com carekit.orgresearchandcare.orgresearchkit.cn -cnresearchkit.com.cn -cnresearchkit.hkresearchkit.netresearchkit.orgresearchkit.tvservicetalk.io -webkit.org webkitgtk.org wpewebkit.orgwebobjects.com-)appleworldwidedeveloper.hb-api.omtrdc.net)%appleworldwidedeveloper.sc.omtrdc.net#p-events-delivery.akamaized.net100beatscheap.com1monsterbeatsbydreus.com2013beatsbydrdreonline.com2013beatsbydrdreshop.com2013beatsbydreshop.com2013beatshdcybermonday.com2013cheapestbeats.com2013newbeatsworld.com2013pascherbeatsbydre.com2014cheapbeatsbydre.com 2beatsdre.com2buybeatsbydre.com2drdrebeats.com40shopping.com4beatsbydre.com5beatsbydre.comaaagradeheadphones.com -aanaan.comabcheadphones.comabeatsbydrdre.com aeasyshop.com -airmay.com -ajtalk.com albeats.com annstores.netaokwholesale.netaucheapbeats.comaudiobeatsau.comaudiobeatsbydre.comaudiomonsterbeatsonline.comauricularemonsterbeats.com#auricularesbeatsbaratosshop.comauricularesbeatsmarkt.comausbeatsbydrdre.combag-glasses1.com bandgirlz.com baxsound.com bbestmall.com -beatbd.combeatbydre2013.combeatbydremonster.com!beatbydreheadphonesonsale.combeatbydrekopen.combeatbydreuk2014.combeatdrdres.combeatfactoryoutlets.combeatmonstersaustralia.netbeats-by-dre-australia.combeats-bydrdre.netbeats-bydre-mall.combeats-bydrecheapsale.combeats-bydreoutletonline.combeats-bydreoutletsale.combeats-bydreoutletsale.netbeats-bydreoutletssale.netbeats-bydrestore.combeats-bydreuk.combeats-deal.combeats-dre-us.com"beats-headphones-buy-cheap.combeats-headphones.usbeats-sale.combeats-seller.combeats-soaho.com  beats1.cc beats1.cn -cn  beats1.tv beats1.com.cn -cn beats123.com beats2.com.cn -cn beats4.cn -cn -beats4.netbeats4outlets.combeats4salecheap.combeatsallsale.combeatsaudifonos.combeatsaudiobydre.combeatsaudiobydre.netbeatsaudios.netbeatsbeatsmonster.combeatsbestdeals.combeatsblackfridaydeals.netbeatsblackfridayretails.combeatsboxingdayuksale.combeatsbydrdre-headphones.combeatsbydrdre-officials5.combeatsbydrdre-online.combeatsbydrdre-onsale.combeatsbydrdre-store.combeatsbydrdre-store.usbeatsbydrdre4sale.combeatsbydrdrebiz.combeatsbydrdrecustom.combeatsbydrdredanmark.combeatsbydrdremall.combeatsbydrdreoutlet.combeatsbydrdres.combeatsbydrdresale.netbeatsbydrdrestore.combeatsbydrdreus.com!beatsbydre-beatsheadphone.combeatsbydre-chen.combeatsbydre-club.combeatsbydre-headphones.com!beatsbydre-headphonesshop.combeatsbydre-mall.combeatsbydre-outlet.combeatsbydre-outletsale.netbeatsbydre-outletstore.combeatsbydre-sell.combeatsbydre-store.combeatsbydre-studio.combeatsbydre-us.com beatsbydre.jpbeatsbydre2081.combeatsbydre411.combeatsbydre4usales.combeatsbydreauofficial.combeatsbydreausale.net beatsbydreaustralia-sale.com!beatsbydreaustraliaonline.com"beatsbydreaustraliaonlines.com beatsbydreaustraliasales.combeatsbydrebeatsby.com!beatsbydreblackfriday2013.com beatsbydreblackfridaypro.combeatsbydreboxingdayca.combeatsbydrecasquesfr.com#beatsbydrecheap-outletstore.combeatsbydrecheaper.com"beatsbydrecheaponlinesales.combeatsbydrecolors.com beatsbydrecustomwireless.com&"beatsbydrecybermondaydeals2013.com&"beatsbydrecybermondaydeals2013.netbeatsbydredanmarks.com"beatsbydredealsblackfriday.com"beatsbydredealscybermonday.combeatsbydrediscount.com beatsbydrediscountonline.netbeatsbydredr.combeatsbydreexecutivesale.com beatsbydreformall2013-nl.com beatsbydreforsalesonline.com beatsbydreforshop2013-nl.combeatsbydreforstore.combeatsbydreforyououtlet.combeatsbydrefr.com!beatsbydrefrcasquepascher.combeatsbydrefriday.combeatsbydregot.combeatsbydrehd.combeatsbydrehd.netbeatsbydreheadphones-nz.combeatsbydreheadphonesolo.combeatsbydrehut.combeatsbydreinexpensive.combeatsbydreireland-sales.com beatsbydreirelandonlines.combeatsbydreirelandsale.com beatsbydreirelandsonline.combeatsbydremall2013.com"beatsbydremonsteraustralia.combeatsbydrenls.combeatsbydrenorge1.net!beatsbydreofficialdanmark.combeatsbydreoksale.combeatsbydreol.combeatsbydreonlie2013-nl.com!beatsbydreonlines-ireland.combeatsbydreonlines-uk.combeatsbydreonlinesale-nz.combeatsbydreoordopjes.combeatsbydreoslo.combeatsbydreoutletsale.combeatsbydreoutletscheap.combeatsbydrerealstore.combeatsbydres-shop.combeatsbydresale-uk.combeatsbydresalemall2013.combeatsbydresales.us'#beatsbydresalesonline-australia.com beatsbydresaleonlines-nz.combeatsbydresdanmark.netbeatsbydreshop-uk.combeatsbydreshops.netbeatsbydresingapores.combeatsbydresingaporesale.combeatsbydrespeakers.combeatsbydresold.com%!beatsbydresolohdonline-canada.combeatsbydresonline-nz.combeatsbydrestorevip.combeatsbydressale.combeatsbydressolo.combeatsbydresstudio.com"beatsbydrestudio-australia.combeatsbydrestudio.combeatsbydretoutlet.combeatsbydreuk.combeatsbydreuk.netbeatsbydreus.combeatsbydrevipde.combeatsbydrew.combeatsbydrsmonsterinusa.combeatsbymusic.netbeatsbysdrbre.combeatsbysdrdres.combeatscasque-france.combeatscheap-nz.combeatscheap-uk.combeatscheapforsale.combeatscollection2014.combeatscustomblackfriday.combeatsdanmark2013.combeatsdrdre-headphones.combeatsdrdre-it.combeatsdrdre-solo.combeatsdrdre2014.combeatsdrdrecuffie.netbeatsdrdrekaufenschweiz.netbeatsdrdreneon.combeatsdre-monster.com beatsdre.netbeatsdre4cheap.combeatsdrecheap.combeatsdredreheadphones.combeatsdreforsale.combeatsdreinau.combeatsdremonster-uk.com!beatsdrenewcolorful4usale.combeatsdreoutletsale.combeatsdresale2013.combeatsdresalestore.combeatsdresolo2013.combeatsdreus.combeatsearbudsheadphoness.combeatsfacstore.combeatsfactoroutlets.combeatsfactorycollection.combeatsfactoryoutles.combeatsforcheap-usa.combeatsforme.combeatsfranceofficiel.combeatselectronic.netbeatselectronics.com -beatsep.cn -cn beatsep.com beatsep.net beatsheadphones-discount.combeatsheadphones1.combeatsheadphones2u.combeatsheadphonesale.combeatsheadphonesdealer.combeatsheadphonesforcheap.netbeatsheadphonesonline.combeatsheadphoness.combeatsheadphonestudio.combeatsheadphonesusamall.combestshoesale2014.netbeatshopuk.combeatsincanada.combeatsinsingapore.combeatsireland.net beatsjoy.combeatsmonstersales.combeatsmusic.combeatsmusic.wang beatsneon.combeatsnzsale.com beatsodre.combeatsofdre-usa.combeatsonblackfriday2013.com beatsone.netbeatsoutlet.netbeatsoutletanytime.combeatsoutletonlines.combeatspascher-bydre.combeatspascher-fr.netbeatspascher.netbeatspaschers.netbeatspillnewcolor.combeatspills.combeatspromonsterjp.combeatspromotions.combeatssales.combeatssaleus.combeatssaustraliabuy.combeatssbyaustralia.combeatssbydredanmark.combeatsshop-uk.combeatsshop-usa.combeatsshopstore.combeatssingapores.combeatssingaporeshop.com beatsstudiohodetelefoner.combeatsstudiosite.combeatstoreusa.com beatsua.combeatswholesale.usbeatswirelesscheap.combeatswirelesscuffie.combegin-trade.combestbeats4u.com -biitii.comblackfridaydrebeatsnew.comblackfridaydrebeatsshop.combloommicroventures.com bookonsky.net -bossae.combrandeasygo.combrandelectronic.combrandproducts1688.com brands098.combusinesswebwise.combuy-from-shanghai.combuybeatsbydre-uk.combuybeatsheadphonesbydre.combuycheapbeatsbus.combuycheapbeatsbydre.combuycheapbeatsbydreshop.combuycheapbeatsdreuk.combuydrdrebeatbox.combuyminibeatbox.combuyonlineheadphones.combuyshoponly.combuzzardflapper.combybeatsdre.combydrebeats.comcanada-beatsbydre.com casque-fr.com casquebeatsbydrdresolohd.comcasquebeatsdocteurdre.comcasquebeatsdre2013.comcasquebeatsenligne.comcasquebeatsfracheter.comcasquebeatsmer.netcasquebeatsofficiel-fr.comcasquebeatspascher2013.comcasquebeatssolo.netcasquedrdrebeatssfr.comcasquemonsterbeats.com#casquemonsterbeatsbydre2013.comcasquesbeatsaudio.comcheap-beats-by-dre.netcheap-beatsbydre.comcheapbagshoes.com cheapbeats.uscheapbeats365.comcheapbeats4sale.netcheapbeatsaustraliasale.comcheapbeatsbus.comcheapbeatsbydr.comcheapbeatsbydrdrepro.comcheapbeatsbydre-au.comcheapbeatsbydre99.comcheapbeatsbydrefau.comcheapbeatsbydremall.comcheapbeatsbydremonster.comcheapbeatsbydrenz.netcheapbeatsbydreonsale.com cheapbeatsbydreoutlet-nz.comcheapbeatsbydreoutlet.com"cheapbeatsbydreoutlets2013.comcheapbeatsbydresale.comcheapbeatsbydreshop.comcheapbeatsdrdresolo.com$ cheapbeatsbydrestudioedition.com"cheapbeatsbydrestudioutlet.comcheapbeatsdrestudios.comcheapbeatsheadphone2014.comcheapbeatsheadphones.uscheapbeatsie.comcheapbeatsla.comcheapbeatssale4u.comcheapbeatsshopbydre.comcheapcustombeatsbydre.comcheapdrdrebeats8.comcheapdrdrebeatsca.comcheapdrebeats8.netcheaperbeatsbydresale.comcheapestbeatsdrdre.comcheapheadphonesland.comcheapheadphonessale.comcheapheadsetmall.comcheapheadsetshop.com cheapmonsterbeatsbydrdre.com!cheapmonsterbeatsheadsets.com cheapmonstersbeatsonsale.comcheapmonsterbeatssale.comcheapmonsterbeatsusa.uscheapnewbeatsbydre.comcheapsalemonster.comcheapshoesvip.comcheapwireless04.comcheapwirelessbeats.comcheerwholesale.uschihair-straightener.comchinaclothesstore.comciattackers.com -cmhalq.com cnshopin.comcoolmonster.netcozydrdrebeats.com cqcorea.comcuffiesaldi.comcustombeatsbydrebuy.comcustombeatsdeals.comcustombeatsforcheap.comcustombeatsny.comcustombeatssbydreus.comcustomdrdrebeats.comcustomizedbeatbydre.comcustomizedbeatsbydre.comcustomizedbeatsdre.comcybermondaybeats4sale.comdanemarket.comdanmarkbeatsbydrdre.comdctbeatsbydre.comdealsbeatsblackfriday.comdetaliczny.comdiscountbeatsbydre-us.comdiscountbeatsstore.comdkbeatsbydre.comdrbeatsukmart.comdrdre-beats.comdrdrebeats-chen.comdrdrebeats-headphone.comdrdrebeats-usa.comdrdrebeatsale.comdrdrebeatsbillig.comdrdrebeatsdesale.comdrdrebeatsdiscount.comdrdrebeatsforu.comdrdrebeatsretail2013.comdrdrebeatssale7.comdrdrebeatsuk.comdrdreheadphonebeats.comdrdreheadphonekey.comdrdreheadphonesusstore.comdrdremonster-beats.comdrdremonsterdre.comdrdreprobeatssale.com drdrefnac.comdrebeats-australia.comdrebeats-france.comdrebeats-monster.com!drebeats-monsteraustralia.comdrebeats-monsterusa.comdrebeats-singapore.comdrebeats-singapore.netdrebeats-singaporecheap.comdrebeats-singaporecheap.netdrebeats-solo.comdrebeats-studio.comdrebeatsaustralia-cheap.comdrebeatsaustralia-cheap.netdrebeatsbuy.comdrebeatsbydreoutlet.comdrebeatscanada.comdrebeatsdeutschland.netdrebeatsforsaleus.comdrebeatsheadphones-nz.comdrebeatshome.comdrebeatsoutletstore.comdrebeatsoldes.comdrebeatspill.comdrebeatssite.com#drebeatssolocybermondaysale.comdrebeatsstudio2013.comdrebeatstudio.com drebyby.comdremonsterbeatsoutlets.comdreprobeats.com dreprofy.com -dtsell.comearphonescheapest.comebuyheadphones.comesbeatsbydrebuy.cometheadphones.comfamosascalvas.comfindmybeats.comfr-beatsbydrestore.comfrancecasquebeatssolde.comfrcasquesbeats.com free-aa.com free-sns.com frishoes.comgamebeforethegame.comgetdrebeatssale.comgmnetworks.net gobeatsye.comgobuyonlinestore.net goodsdunk.netheadphonepubs.comheadphones-cool.comheadphones-dre.com headphones-outlet-online.comheadphonesbeatsaudio.comheadphonesbeatsbydre.comheadphoneses.comheadphoneshome.comheadphoneshotsales.comheadphonesol.comheadphonesretailer.comheadphonessupply.comheadphonezip.comheadset987.comhellokittybeats.com highbolt.net highdefinitionbeatsbydre.com hipaa6020.com hipzoom.nethonawalaan.comhotbeatsonsale.comhotmonsterbeats.comhottestheadphonesonline.com  hrsaz.com ibeats-uk.comibeatsbydre.ccibeatsbydre.comigoshopping.net illianacomputerrecycling.comimonsterbeats.comincentivetravelgifts.comioffergift.com islamiccenterofnewlondon.comitaliabeatsbydrdre.com jkbeats.comkickshatchannel.comkobbeatssbydredk.comkopfhorergunstigshop.comleecountytimes.com lexuemei.comlovebeatsdr.com lovemarca.comluckyissue.com -lyzsxx.com mairbeats.com -makeeu.commallheadphone.commbeats-tech.commbheadphone.com -micstl.commmonsterheadphones.netmonbeats2013.commonster-beats-by-dr-dre.com monster-beats-headphones.commonsterbeats-cheap.commonsterbeats-headphone.commonsterbeats-onsale.commonsterbeats-solo.commonsterbeats-solo.netmonsterbeats365buy.commonsterbeats8beatsbydre.commonsterbeatsale.commonsterbeatsalestore.commonsterbeatssalg.commonsterbeatsau.commonsterbeatsbydrdre-nz.commonsterbeatsbydrdre-usa.com!monsterbeatsbydrdrecanada.com!monsterbeatsbydrdrestudio.commonsterbeatsbydre-nz.commonsterbeatsbydre-usa.commonsterbeatsbydre2015.com'#monsterbeatsbydreaustraliacheap.com!monsterbeatsbydrebilligde.com monsterbeatsbydrefactory.commonsterbeatsbydrenew.commonsterbeatsbydres.commonsterbeatsbydreshop.commonsterbeatscasques.commonsterbeatscommunity.commonsterbeatsdrdrecheap.commonsterbeatsfactory.netmonsterbeatsfinland.commonsterbeatsforsale.commonsterbeatsheadphone.commonsterbeatsheadphones.netmonsterbeatshere.commonsterbeatsitaly.commonsterbeatsmall.commonsterbeatsnegozi.netmonsterbeatsok.com!monsterbeatsonlinestoreuk.commonsterbeatsoutlet.usmonsterbeatspascher.netmonsterbeatsru.commonsterbeatssales.commonsterbeatsshops.netmonsterbeatsstore.com#monsterbeatssydneyaustralia.commonsterbeatstang.commonsterbeatstienda.commonsterbeatstudio.commonsterbydrebeat.com!monstercasquebeatspascher.netmonstercheapbeatss.commonsterdrebeats-canada.netmonsterdrebeats-usa.commonsterdrebeats-usa.netmonsterheadphone.netmonsterproduct.netmonstersbeatbydres.commonstersdebea.commonstershopcheapbeats.netmoreheadphones.com -ms4dre.commybeatsbydrestudio.commybeatsbydreuk.commybeatscheapbydre.commyferrariheadphones.comnamemybeats.com neborder.comnegozimonsterbeats.comnegoziomonsterbeats.comnewbeatsblackfriday.com newbemany.comnewdrediscount.comnewestbeatsbydre.comnewlysprung.netnewmonst1erbeatsto1re.com!newmonsterbeatsheadphones.comnewschristmasshopping.comnflhotsalejerseys.com nicesshop.netofferairjordanlebron.comofficialbeatsbydreshop.comofficialbeatsbydrestore.comofficialdrdre.comofficialheadphone.com ogameblog.comonbeatsbydresale.com onlinemonsterbeatsonsale.com onsalekey.comonsaletrend.comoutletbeatsshop.compascherbeatsmonster.compaulsimon-music.comperfectkickz.netpersoneelsland.compicknicekicks.netpickshoesclothes.com pillbeatsblackfridaysale.compocketbiketrader.compowerbeats2wireless.compowerbeatsbydrdre.compowerbeatsbydre.compromonsterbeatsbydre.comprostudiobeatscybersale.com  rbsgr.comrepsneakermall.com repswing.com!salebeatslasteststyle4you.comsaleblackfridaydrebeats.comsalecheaphandbags.com samebags.com sanvaras.com -scnshop.cc -shoers.com shoestop2.comshop-headphones.netshopbeatsdre.com shopbydre.comshopcustomizedbeats.comshopdrebeats.comshopmonsterbeats.comshopping-days.netshoppinguheadphones.comsneaker666.comsneakerpage.netsneakerskick.comsolostudioksale.com soso7778.comspecialtyheadphones.comspiritclubs.comstraightouttasomewhere.comstudiobeatsbydrdre.comsulwerphoto.comsunglassessale2014.comsuperearsenjoy.comsupplybestjerseys.comsustainthesound.comsverigebeatsbydrdre.com szcheapmonsterheadphones.comszwinnertechnology.com takegoto.comthe-monster-beats.comthebeatsbydre.comthebeatsbydre.netthebeatsheadphonesale.com -theuab.nettopbeatsbydrdreoutlet.comtopbeatsdealer.comtopbeatsforsale.com tradevip1.com tteshop.com ubnw.net -unstyle.us&"usa-beatsbydreheadphonesonsale.net  v-has.com vip-beats.comvipbeatsbydre.comvipheadphones.com vipshoes2.com  wasdj.comwholesale-exporter1.comwholesalediscountpurses.comwholesalefine.comwholesaleonlinemart.comworldcoinpay.comyourmonsterbeats.com%!beatselectronicsllc.tt.omtrdc.netapple-icloud.cn -cnappleicloud.cn -cnapplemx-icloud.comicloud-apple.cn -cnicloud-content.comicloud-isupport.com  icloud.ch -icloud.com icloud.com.cn -cn  icloud.de  icloud.ee  icloud.fi  icloud.fr  icloud.hu  icloud.ie  icloud.is  icloud.jp  icloud.lv icloud.net.cn -cn  icloud.om -icloud.org  icloud.pt  icloud.ro  icloud.se  icloud.si  icloud.sk  icloud.vn icloudads.neticloudapple.cn -cn icloudbox.neticloudbrowser.net icloude.comicloudhome.comicloudmail.neticloudmusic.net icloudnet.net icloudpay.net icloudo.com -icloudo.de icloudo.net icloudos.de icloudos.neticloudsecure.neticloudsetup.comios-icloud.com -me.com myicloud.net mylcloud.net wwwicloud.com!www-cdn.icloud.com.akadns.net!12diasdepresentesdeitunes.com12diasderegalosdeitunes.cl12diasderegalosdeitunes.co!12diasderegalosdeitunes.co.cr!12diasderegalosdeitunes.co.ni!12diasderegalosdeitunes.co.ve12diasderegalosdeitunes.com"12diasderegalosdeitunes.com.co"12diasderegalosdeitunes.com.hn"12diasderegalosdeitunes.com.ni"12diasderegalosdeitunes.com.ve12diasderegalosdeitunes.cr12diasderegalosdeitunes.gt12diasderegalosdeitunes.hn12diasderegalosdeitunes.pe 12joursdecadeauxdeitunes.comapple-itunes.cn -cn itun.es itunbes.com ituneas.comitunes-apple.cn -cnitunes-radio.net  itunes.ca  itunes.co itunes.co.th -itunes.com  itunes.hk  itunes.mx -itunes.org -itunes.rio  itunes.usitunes12days.comitunesapple.cn -cnitunesessentials.comitunesfestivals.comitunesiradio.comituneslatino.comituneslogin.netitunesmatch.comitunesparty.comitunesradio.cn -cnitunesradio.comitunesradio.com.cn -cnitunesradio.rioitunesradio.tvitunesradio.twitunesstore.co itunesu.com itunesu.net iutunes.com wwwitunes.comitunes-apple.com.akadns.netappleswift.com  swift.org -swiftui.cn -cnswiftui.com.cn -cn apple apple.ae apple.at apple.be apple.bg apple.bs apple.ca apple.ch apple.cl apple.cmapple.cn -cn apple.co apple.co.cr apple.co.hu apple.co.jp apple.co.kr apple.co.mz apple.co.nz apple.co.th apple.co.uk  apple.com apple.com.af apple.com.au apple.com.bo apple.com.br apple.com.cn -cn apple.com.co apple.com.de apple.com.do apple.com.gr apple.com.gy apple.com.jm apple.com.lk apple.com.mg apple.com.mx apple.com.my apple.com.pa apple.com.pe apple.com.pl apple.com.pr apple.com.pt apple.com.py apple.com.sg apple.com.sv apple.com.tr apple.com.tw apple.com.uy apple.cz apple.de apple.dk apple.ee apple.es apple.eu apple.fi apple.fr apple.hamburg apple.hn apple.hr apple.hu apple.ie apple.in apple.is apple.it apple.jo apple.jp apple.kr apple.lk apple.lt apple.lv apple.me apple.my  apple.net apple.net.gr apple.nl apple.no apple.pk apple.pl apple.pt apple.ro apple.rs apple.ru apple.sa apple.se apple.sg apple.si apple.sk apple.so apple.tt apple.tw apple.uk apple.usapple.xn--czr694bapple.xn--fiqs8s  apple.xyz aplestore.comapple-store.cn -cnapple-store.netapple-store.wang applestor.com applestore.bg applestore.cc applestore.ch applestore.cm applestore.cn -cnapplestore.co.huapplestore.co.jpapplestore.co.ugapplestore.co.ukapplestore.comapplestore.com.auapplestore.com.bnapplestore.com.cn -cnapplestore.com.eeapplestore.com.egapplestore.com.grapplestore.com.hkapplestore.com.hrapplestore.com.joapplestore.com.myapplestore.com.phapplestore.com.plapplestore.com.ptapplestore.com.roapplestore.com.ruapplestore.com.snapplestore.com.tw applestore.de applestore.hk applestore.kr applestore.meapplestore.netapplestore.net.gr applestore.ph applestore.qa applestore.sgapplestore.wangapplestoreonline.comapplestorepro.euonlineapplestore.comapp-store.wangappe-store.comapple-appstore.cn -cnappleappstore.cn -cnappleappstore.netappleappstore.tv  appsto.reappstore.co.id appstore.hk appstore.my appstore.phappstoreapple.cn -cn asto.retvappstore.netapple-imac.com appleimac.comimac-apple.comimac-applecomputer.com imac.co -imac.co.nz imac.com imac.eu imac.gr imac.one imac.rs imacapple.comimacapplecomputer.comebookforipad.com euroipad.comfindmyipad.com indiaipad.com -ipad.co.kr ipad.de  ipad.host  ipad.wang  ipad3.com -ipadair.cl -ipadair.cmipadair.com.bripadair.com.es -ipadair.fr -ipadair.hk -ipadair.ie -ipadair.jp -ipadair.twipadaustralia.com ipadmini.cmipadmini.com.lk ipadmini.lk ipadpro.buzz -ukipad.comappleiphone.huappleiphone.netappleiphonecell.combestiphonestuff.comcooliphonecasesstore.comcustom-iphonecase.comdesigneriphonescases.com dl-iphone.comfundaiphone5s.com hebiphone.com hf-iphone.com -iphine.comiphone-8.com.cn -cn iphone-cd.com iphone-cn.com iphone-sh.comiphone-vip1.comiphone-vip2.comiphone-vip3.comiphone-vip4.comiphone-vip5.com iphone-x.tv iphone-yh.com iphone-zh.com  iphone.cm -iphone.com iphone.com.au iphone.com.gr  iphone.es iphone.host iphone.net.gr  iphone.pt  iphone.rs  iphone.ru iphone.wang iphone4.comiphone4.com.br iphone4s.com iphone5.comiphone5casescovers.comiphone5s5case.comiphoneacessorios.com.briphonecase2013.comiphonecase5.comiphonecases100.comiphonecases5.comiphoneclaro.com.briphonecollcase.com iphonefc.comiphonegermany.comiphonehangzhou.comiphoneimessage.comiphoneplus.wang iphonerip.net iphonese.tviphoneunlockimei.com iphonexs.tvonlyiphone5case.comaplleipods.comappleclassicipod.comdownloadsforipod.com ipod.ca ipod.ch ipod.cm ipod.co -ipod.co.nz -ipod.co.uk -ipod.co.za ipod.com ipod.com.au ipod.com.cn -cn ipod.com.fr ipod.com.hk ipod.com.sg ipod.com.tw ipod.de ipod.es ipod.eu ipod.fr ipod.gr ipod.hk ipod.is ipod.net ipod.no ipod.pk ipod.rs ipod.ru ipod.tw ipodcentre.nlipodcleaner.comipoditouch.com ipodnano.com ipodnano.netipodprices.com -ipodrip.caipodrocks.com.au  ipods.comipodshop.com.au ipodtouch.co ipodtouch.com -myipod.netoffrezdesipods.comsimplyipod.comwwwipodlounge.comimacsources.comlaunchpad.wang mac.wang -macbook.co -macbook.hk -macbook.tw macbook.wang macbookair.cn -cnmacbookair.co.krmacbookair.co.ukmacbookair.commacbookair.com.aumacbookair.com.cn -cnmacbookair.com.es macbookair.es macbookair.hk macbookair.kr macbookair.jpmacbookair.net macbookpro.comacbookpro.commacbookpro.com.aumacbookpro.net macbookpro.usmacbookpros.commacbooksale.comwwwmacbookair.comapple-watch.com.ru applewatch.hk applewatch.tv applewatch.twapplewatch.wangapplewatchedition.comapplewatchseries3.netapplewatchsport.comapplemusic.berlinapplemusic.comapplemusic.com.auapplemusic.hamburgapplemusic.wangapplemusicconnect.comapplemusicfestival.com musickit.netwwwapplemusic.comapple.comscoreresearch.com -apple.newsappleenews.comapplenews.berlinapplenews.hamburg applenews.tvapplenewsformat.com apple-pay.com apple-pay.rsapple-pay.wangapplepay.berlinapplepay.co.rsapplepay.com.twapplepay.hamburg applepay.hk applepay.info applepay.jp applepay.rs applepay.tvapplepaycash.cn -cnapplepaycash.com.cn -cnapplepaycash.netapplepaycash.tv!applepaymerchantsupplies.infoapplepaysupplies.berlinapplepaysupplies.cn -cnapplepaysupplies.com#applepaysupplies.com.cn -cnapplepaysupplies.infoapplepaysupplies.netapplepaysupplies.tvapplewallet.comapplewallet.tv -i-book.com -i-book.net ibook.co.nz  ibook.com ibook.eu  ibook.netibookpartner.comibooksauthor.com  iphoto.eu  iphoto.no  iphoto.se iphoto.wang  imovie.euimoviegallery.comimoviestage.comapplecare.berlin applecare.cc applecare.euapplecare.hamburgapplecare.wangappledarwin.comappledarwin.netdarwinsource.comdarwinsource.orgdarwinsourcecode.comappleaccount.netappleid-applemx.comappleid-applemx.usappleid-iclou.com appleid-uk.usappleid.berlin appleid.comappleid.hamburg -appleid.hk ids-apple.com myappleid.com appletv.com -appletv.fr appletv.wang appletv4.cn -cnappletv4.com.cn -cnappletvapp.appleappleone.audio appleone.blog appleone.chatappleone.cloud appleone.clubappleone.community appleone.filmappleone.guide appleone.hostappleone.space appleone.techappleone.website -shazam.com1to1computing.com.au1to1conference.com.au 5lml.com -a0pple.net aapl.twairport.brussels airport.com -airport.euairsupportapp.com airtunes.com airtunes.info airtunes.netalchemysynth.com  ap0le.com aple.com  apole.com -app0le.com -appl-e.com appl.com -appl4e.com  appla.comapple-darwin.comapple-darwin.netapple-darwin.org apple-dns.cn -cn apple-dns.comapple-dns.com.cn -cn apple-dns.netapple-enews.comapple-expo.com apple-expo.eu apple-hk.comapple-ibooks.cn -cn apple-inc.netapple-livephotoskit.com apple-maps.cn -cnapple-online.com apple-usa.netappleafrica.comappleantilles.comappleaustralia.comappleaustralia.com.auappleaustralia.net.au applebk.netapplecarbon.com applecard.tvapplecentar.co.rsapplecentar.rsapplecenter.cn -cnapplecenter.com.cn -cnapplecentre.com.auapplecentre.infoappleclub.com.hk applecom.comapplecomputer-imac.comapplecomputer.cn -cnapplecomputer.co.inapplecomputer.co.nzapplecomputer.com applecomputer.com.cn -cnapplecomputer.com.hkapplecomputer.com.twapplecomputer.huapplecomputer.krapplecomputerimac.comapplecomputerinc.infoapplecomputers.co.nzapplecoronavirus.com appledns.cn -cnappledns.com.cn -cn appleexpo.euappleexpo.infoapplefilmaker.comapplefilmmaker.comapplefinalcutproworld.comapplefinalcutproworld.netapplefinalcutproworld.orgapplehongkong.comapplehongkong.com.hkappleinclegal.comappleipodsettlement.comappleiservices.com applelink.comapplemagickeyboard.comapplemalaysia.com.myapplemasters.infoappleonline.comappleonline.net appleoriginalproductions.com -appleos.tvapplepencil.netapplepodcasts.comapplepremiumreseller.com.au applepremiumresellers.com.auapplereach.comapplereach.net apples-msk.ruapplescreensavers.comapplescript.infoappleshare.infoappleshop.co.uk applesiri.cn -cnapplesurveys.comappletaiwan.com appletips.net appleweb.net applexpo.net applezh.com  applf.com -applfe.com -applle.com  applw.comappmediagroup.com -appule.com  appye.com  apyle.com  beddit.tvbraeburncapital.com burstly.netburstlyrewards.com buyaapl.com buyaapl.net buyaple.com camelphat.comcamelspaceeffect.com -carbon.com catalina.hk cdn-apple.com  chomp.com -coreml.netdashwood360.comdesktopmovie.comdesktopmovie.netdesktopmovie.orgdesktopmovies.netdesktopmovies.orgdeveloper-advisor.comdevice-manager.usdigitalhub.comdiscussionsapple.com -dot-mac.de  dotmac.dedvdstudiopro.bizdvdstudiopro.comdvdstudiopro.infodvdstudiopro.netdvdstudiopro.orgdvdstudiopro.us -earpod.net ecgapp.com.cn -cn -ecgapp.netedu-research.org -emac.co.in emac.in  emagic.de -eworld.com faceid99.com faceid99.netfaceidglobal.com faceshift.cn -cn facetime.netfinalcutpro.comfind-apple.com firewire.cl firewire.eu geoport.com -homepod.cn -cn -hopstop.tv ichat.co.in idvd.eu  ikids.comilecture.co.nz ilife.eu ilife.gr -ilife.wang imessage.tv insidear.cn -cninsidemacintosh.comiosinthecar.comipa-iphone.net  ipple.com ischool.com itools.info  iwork.com iwork.se -iwork.wangjetfuelapp.comjetfuelapps.comlatticedata.com livephotos.cn -cnlivephotos.com.cn -cn livephotos.tvlojaiphone.com.br mac-mini.com mac.com -mac.com.au -mac.eu -mac.rs macappsto.re macboxset.com mach-os.com mach-os.net -machos.net macintosh.eumacintoshsoftware.com macmini.com macos.com.aumacossierra.com macosx.infomacosxlion.com macpazar.com macreach.com macreach.net mobileme.dkmr-apple.com.tw mzstatic.com -newton.com next.com overapple.com powerbook.eupullstring.netquatrowireless.com quicktime.cc quicktime.comquicktime.com.au quicktime.eu quicktime.net quicktime.tvreform-apple.comservices-apple.net siri.com spektral.cc texture.comthinkdifferent.us -touchid.tv touchid.wangtracking-location.comtruedepth3d.com tryrating.comwebobjects.co.uk webobjects.de webobjects.euwebobjects.net wuxiapple.com wwapple.netwww-sms-apple.com wwwapple.com wwwapple.net wwwlapple.comxn--czrs0t4phtr3a.cnxn--fiqs8sxootzz.cn xn--fiqs8sxootzz.xn--hxt814e!xn--gtvq61aiijy0b.xn--hxt814exn--gtvz22d.wangxn--gtvz22d.xn--hxt814exn--hxtr4rozx.xn--czr694b xn--kput3imi374g.xn--hxt814e#xn--ohq11k7pl25iyo8a.cn -cn xn--ruq8a011kt6y.xn--hxt814e, adcdownload.apple.com.akadns.net -cn!adcdownload.apple.com -cn."amp-api-search-edge.apps.apple.com -cn"amp-api.apps.apple.com -cn aod.itunes.apple.com -cn#api-edge.apps.apple.com -cnappldnld.apple.com -cn"appldnld.g.aaplimg.com -cnapps.apple.com -cnapps.mzstatic.com -cn(apptrailers.itunes.apple.com -cn bag.itunes.apple.com -cn'bookkeeper.itunes.apple.com -cnbooks.apple.com -cn!cds-cdn.v.aaplimg.com -cn$cds.apple.com.akadns.net -cn cds.apple.com -cncl2-cn.apple.com -cn<0cl2.apple.com.edgekey.net.globalredir.akadns.net -cncl4-cn.apple.com -cn'client-api.itunes.apple.com -cn+clientflow.apple.com.akadns.net -cn clientflow.apple.com -cn cma.itunes.apple.com -cn."configuration.apple.com.akadns.net -cn#configuration.apple.com -cn!communities.apple.com -cncstat.apple.com -cn."dd-cdn.origin-apple.com.akadns.net -cn(discussionschinese.apple.com -cn(download.developer.apple.com -cnfides-pol.apple.com -cngs-loc-cn.apple.com -cngs-loc.apple.com -cn%gsp10-ssl-cn.ls.apple.com -cn!gsp11-cn.ls.apple.com -cn!gsp12-cn.ls.apple.com -cn!gsp13-cn.ls.apple.com -cnC7gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net -cn, gsp4-cn.ls.apple.com.edgekey.net -cn gsp4-cn.ls.apple.com -cn gsp5-cn.ls.apple.com -cn(gspe11-2-cn-ssl.ls.apple.com -cn&gspe12-cn-ssl.ls.apple.com -cn&gspe19-cn-ssl.ls.apple.com -cn-!gspe19-cn.ls-apple.com.akadns.net -cn"gspe19-cn.ls.apple.com -cn#gspe21-ssl.ls.apple.com -cngspe21.ls.apple.com -cn#gspe35-ssl.ls.apple.com -cn&gspe85-cn-ssl.ls.apple.com -cniadsdk.apple.com -cn, icloud-cdn.icloud.com.akadns.net -cn icloud.cdn-apple.com -cn'images.apple.com.akadns.net -cn?3images.apple.com.edgekey.net.globalredir.akadns.net -cnimages.apple.com -cn3'init-p01md-lb.push-apple.com.akadns.net -cn init-p01md.apple.com -cn3'init-p01st-lb.push-apple.com.akadns.net -cn%init-p01st.push.apple.com -cn3'init-s01st-lb.push-apple.com.akadns.net -cn%init-s01st.push.apple.com -cn!init.itunes.apple.com -cn$iosapps.itunes.apple.com -cn(iosapps.itunes.g.aaplimg.com -cniphone-ld.apple.com -cn'itunes-apple.com.akadns.net -cnitunes.apple.com -cn#itunesconnect.apple.com -cn"js-cdn.music.apple.com -cn km.support.apple.com -cnmaps.apple.com -cn)mesu-cdn.apple.com.akadns.net -cn+mesu-china.apple.com.akadns.net -cnmesu.apple.com -cnmusic.apple.com -cn(ocsp-lb.apple.com.akadns.net -cnocsp.apple.com -cnoscdn.apple.com -cn-!oscdn.origin-apple.com.akadns.net -cn$osxapps.itunes.apple.com -cnpancake.apple.com -cn, pancake.cdn-apple.com.akadns.net -cnpd.itunes.apple.com -cnphobos.apple.com -cn!play.itunes.apple.com -cn1%prod-support.apple-support.akadns.net -cn$se-edge.itunes.apple.com -cn se2.itunes.apple.com -cn#search.itunes.apple.com -cn1%sf-api-token-service.itunes.apple.com -cnsp.itunes.apple.com -cn4(stocks-sparkline-lb.apple.com.akadns.net -cn&stocks-sparkline.apple.com -cn>2store.apple.com.edgekey.net.globalredir.akadns.net -cn'store.apple.com.edgekey.net -cnstore.apple.com -cn2&store.storeimages.apple.com.akadns.net -cn+store.storeimages.cdn-apple.com -cn+streamingaudio.itunes.apple.com -cnsu.itunes.apple.com -cn2&support-china.apple-support.akadns.net -cnsupport.apple.com -cn."swcatalog-cdn.apple.com.akadns.net -cnswcatalog.apple.com -cnswcdn.apple.com -cnswcdn.g.aaplimg.com -cn'swdist.apple.com.akadns.net -cnswdist.apple.com -cn+swscan-cdn.apple.com.akadns.net -cnswscan.apple.com -cn!sync.itunes.apple.com -cn1%updates-http.cdn-apple.com.akadns.net -cn&updates-http.cdn-apple.com -cn upp.itunes.apple.com -cnvalid.apple.com -cn-!valid.origin-apple.com.akadns.net -cn"weather-data.apple.com -cn<0www.apple.com.edgekey.net.globalredir.akadns.net -cn%www.apple.com.edgekey.net -cn www.apple.com -cn#^a[1-5]\.mzstatic\.com$ -cn0$^cdn(-cn)?[1-4]?\.apple-mapkit\.com$ -cn9-^cl[1-5]-cdn\.origin-apple\.com\.akadns\.net$ -cn!^cl[1-5]\.apple\.com$ -cn+^is[1-5](-ssl)?\.mzstatic\.com$ -cn$^s[1-5]?\.mzstatic\.com$ -cnapple.com.akadns.net%!courier-push-apple.com.akadns.netpush-apple.com.akadns.net - -JAVHD  javhd.com - - STARBUCKS starbucks.castarbucks.co.uk starbucks.comstarbucks.com.cn -cn starbucks.de starbucks.fr starbucks.ie - -SOLIDOT solidot.org -R -UPAI  aicdn.com upai.com upaiyun.com  upcdn.net  upyun.com -: -ZAOBAO -zaobao.com zaobao.com.sg  zaobao.sg - -KINGSOFT cmcm.com cmcmcdn.com  liebao.cn duba.com duba.net ijinshan.comseasungames.com xishanju.com xoyo.com testplus.cn -wps.cn  51dzt.com  iciba.com  docer.com kdocs.cn papocket.com  wpspdf.cn kimg.cn kingsoft.com ksmobile.com -ks-cdn.com  ksyun.com ksyungslb.com -( -LAGOU  lagou.com lgstatic.com - -OPENVPN openvpn.net -2 -YNET ynet.cn ynet.com ynet.com.cn - -IPIP ipip.net - -KRAKEN -kraken.com - - -REALVISIONrealvision.com - -RIXCLOUD rixcloud.com -9 - -ARTSTATIONartstation.comartstationmedia.com - -BITSTAMP bitstamp.net -( -GLOBALSECURITYglobalsecurity.org -Q - SOURCEFORGEsourceforge.comsourceforge.net -sf.net fsdn.com -M - -STRIKINGLYmystrikingly.comstrikingly.comstrikinglycdn.com -0 - MIXPANEL-ADS decide.mixpanel.com -ads -f -ROKU fandango.com mgo.commgo-images.com ravm.tv roku.com rokutime.com - -SCOOP scoop.sh -' -HEYZO heydoga.com  heyzo.com - -DMZJ dmzj.com -. -SXL mysxl.cn -sxl.cn  sxlcdn.cn -/ - -THEINITIUMtheinitium.com  init.shop -# -CATEGORY-SCHOLAR-!CN apa.orgpsyccareers.com cambridge.org"cambridgeschoolshakespeare.comcambridgedigital.netcambridgemaths.orgnewisiknowledge.comisiknowledge.com clarivate.comwebofknowledge.comwebofscience.com doi.org doi.info els-cdn.comelsevier-ae.com elsevier.com elsevier.ioengineeringvillage.com  evise.com -scopus.comscholar.google.aescholar.google.atscholar.google.bescholar.google.bgscholar.google.cascholar.google.catscholar.google.chscholar.google.clscholar.google.cnscholar.google.co.crscholar.google.co.idscholar.google.co.ilscholar.google.co.inscholar.google.co.jpscholar.google.co.krscholar.google.co.nzscholar.google.co.thscholar.google.co.ukscholar.google.co.vescholar.google.co.zascholar.google.comscholar.google.com.arscholar.google.com.auscholar.google.com.boscholar.google.com.brscholar.google.com.coscholar.google.com.cuscholar.google.com.doscholar.google.com.ecscholar.google.com.egscholar.google.com.gtscholar.google.com.hkscholar.google.com.lyscholar.google.com.mxscholar.google.com.myscholar.google.com.nischolar.google.com.pascholar.google.com.pescholar.google.com.phscholar.google.com.pkscholar.google.com.prscholar.google.com.pyscholar.google.com.sgscholar.google.com.svscholar.google.com.trscholar.google.com.twscholar.google.com.uascholar.google.com.uyscholar.google.com.vnscholar.google.czscholar.google.descholar.google.dkscholar.google.esscholar.google.fischolar.google.frscholar.google.grscholar.google.hnscholar.google.hrscholar.google.huscholar.google.isscholar.google.itscholar.google.lischolar.google.ltscholar.google.luscholar.google.lvscholar.google.nlscholar.google.noscholar.google.plscholar.google.ptscholar.google.roscholar.google.ruscholar.google.sescholar.google.sischolar.google.sk ic.ac.ukimperial.ac.ukimperialbusiness.schoolimperial.insendi.com -knovel.commit mit.edu mit.netmitpressjournals.orgamamanualofstyle.com anb.org blackstonespoliceservice.com epigeum.com oed.com  omscr.com oup.com -ouplaw.com ox.ac.ukoxfordaasc.comoxfordartonline.comoxfordbibliographies.comoxfordclinicalpsych.com oxforddnb.comoxfordfirstsource.comoxfordhandbooks.comoxfordlawtrove.comoxfordmedicine.comoxfordmusiconline.comoxfordpoliticstrove.com oxfordre.comoxfordreference.comoxfordscholarlyeditions.comoxfordscholarship.comoxfordwesternmusic.comsipriyearbook.org ukwhoswho.com"universitypressscholarship.comveryshortintroductions.comserialssolutions.com proquest.comsciencedirect.comsciencedirectassets.com -apress.com springer.comspringerlink.comspringernature.com wkap.nl tandf.co.uktandfonline.comtaylorandfrancis.comtaylorfrancis.com -aclweb.org acm.org altmetric.comanalytictech.comannualreviews.org  arxiv.org asha.org berkeley.edubiomedcentral.com biorxiv.org  brill.com cell.comcomputingreviews.com degruyter.comdentalhypotheses.comelifesciences.org europepmc.orgfrontiersin.org gale.com galegroup.com  ggsrv.com hindawi.com informs.orgisca-speech.orgjamanetwork.comjapanknowledge.comjbe-platform.com jmlr.org jneurosci.org  jstor.org kuke.comlawdata.com.twliteratumonline.com mdpi.com -nature.com nejm.org neurology.org ovid.com  peerj.comphysiology.org plos.org pnas.org princeton.eduresearchgate.netroutledgehandbooks.comroyalsocietypublishing.org sagepub.comscholarpedia.orgsciencemag.orgscientificamerican.com scitation.orgsilverchair-cdn.comspiedigitallibrary.orgstatsmakemecry.com thelancet.com uchicago.edu ucla.edu  umass.edu  wiley.com yale.edu - -IINA iina.io -( -WASHINGTONPOSTwashingtonpost.com - -TMTPOST tmtpost.com chaindd.com -72whys.com checkzeit.com -tivitv.com tigeek.net.cntmtsmartlife.comtmtsmartrun.com -* -WIWIDE wamawama.com -wiwide.com -< -ANACONDA anaconda.com anaconda.org conda.io -^ -CTEXCEL -ctexcel.ca ctexcel.comctexcel.com.hk -ctexcel.fr -ctexcel.us - -HANYI hellofont.cnhellowebfont.com0,hellofontpreview.oss-cn-beijing.aliyuncs.com-)hellowebfonts.oss-cn-beijing.aliyuncs.com hanyi.com.cnfontstar.com.cn -H -BLENDERbigbuckbunny.org blender.orgelephantsdream.org - -WHO who.int -" -TED ted.com -tedcdn.com - -UBI ubi.com ubisoft.com  uplay.com,(ubisoft-uplay-savegames.s3.amazonaws.com,(ubisoft-orbit-savegames.s3.amazonaws.com)uplaypc-s-ubisoft.cdn.ubi.com -cn - -UDACITY udacity.com - -SVP svp-team.com -: - ENTERMEDIADBentermediadb.netentermediadb.org - - -GOOGLE-ADS2mdn.net -ads admob.com -ads adsense.com -ads$advertisercommunity.com -ads%advertiserscommunity.com -ads"adwords-community.com -ads adwords.com -adsadwordsexpress.com -ads app-measurement.com -ads&clickserver.googleads.com -adsdoubleclick.com -adsdoubleclick.net -ads!google-analytics.com -adsgoogleadapis.com -ads!googleadservices.com -ads googleanalytics.com -adsgoogleoptimize.com -ads"googlesyndication.com -ads!googletagmanager.com -ads"googletagservices.com -ads'googletraveladservices.com -ads -urchin.com -ads>1^adservice\.google\.([a-z]{2}|com?)(\.[a-z]{2})?$ -ads -4 - KHANACADEMYkhanacademy.org kastatic.org - -ROCKSTARrockstargames.com -rsg.sc1-gamedownloads-rockstargames-com.akamaized.net)%media-rockstargames-com.akamaized.net*&videos-rockstargames-com.akamaized.net -" - GETCOMPOSERgetcomposer.org - - PACKAGIST packagist.org -, -PAOFUYUN paofu.cloud paofuyun.me -$ - THESTANDNEWSthestandnews.com -E -WIX wix.com  wixmp.com wixsite.com wixstatic.com - -AZURE azure-dns.comazure-dns.info azure-dns.net azure-dns.orgazure-mobile.netazure-sphere.comazure-test.netazure.cn -cn  azure.com  azure.netazurecomcdn.netazurecontainer.ioazurecosmos.netazurecosmosdb.comazurecosmosdb.infoazurecosmosdb.netazuredatabricks.netazuredevopslaunch.comazuredigitaltwin.comazuredigitaltwins.comazuredigitaltwins.netazuredns-prd.infoazuredns-prd.orgazureedge-test.net azureedge.netazureiotcentral.comazureiotsolutions.comazureiotsuite.comazureplanetscale.infoazureplanetscale.netazureserviceprofiler.comazuresmartspaces.netazurestackvalidation.comazurewebsites.netchinacloudapi.cn -cnchinacloudapp.cn -cnchinacloudsites.cn -cn cosmosdb.info cosmosdb.net devopsms.com gotcosmos.commicrosofteca.commicrosoftiotcentral.comserverlesslibrary.nettryfunctions.comwindowsazure.cn -cnwindowsazure.comazure.microsoft.com"azuremarketplace.microsoft.com - -BIGHEAD bighead.group - -DOGECOIN dogecoin.com - -RSF rsf.org -> -UBUNTU -ubuntu.com -ubuntu.netubuntuforums.org - -TOR onion - -ENFAbebepremium3.com.bo -enfa.co.id enfa.com.vn enfaaplus.com enfababy.com enfabebe.comenfabebe.com.brenfabebe.com.coenfabebe.com.doenfabebe.com.ecenfabebe.com.mxenfabebe.com.peenfabebe.com.veenfabebe3.com.arenfagrow.co.inenfagrow.com.bnenfagrow.com.myenfagrow.com.phenfagrow.com.sg enfagrow4.comenfamama.com.arenfamama.com.ph -enfamil.ca enfamil.com -enfamil.es -enfamil.pl -enfamil.pt enfasmart.comenspireformula.comnutramigen.net nutramigen.pl -O -GUO  guo.media  gnews.org gtv.org gtv1.org g-tvapp.com -) -KEEP gotokeep.com keepcdn.com - -JS-ORG -js.org -" -LIHKG -lih.kg  lihkg.com - - CATEGORY-CASbuypass-ssl.com buypass.com -buypass.no -buypass.se minid.no -comodo.com comodoca.com comodoca2.com comodoca3.com comodoca4.comcybertrust.co.jpcybertrust.ne.jp digicert.com freessl.com geotrust.com rapidssl.com -thawte.com  thawte.de  thawte.fr entrust.netentrustdatacard.comglobalsign-media.com globalsign.be globalsign.chglobalsign.co.ukglobalsign.comglobalsign.com.auglobalsign.com.hkglobalsign.com.sg globalsign.es globalsign.eu globalsign.frglobalsign.net globalsign.nl!secure.globalsign.com -cnocsp.globalsign.com -cn ocsp2.globalsign.com -cn identrust.comidentrust.co.uk identrust.netletsencrypt.org secom.co.jpsecomtrust.net sectigo.comenterprisessl.comhackerguardian.cominstantssl.comoptimumssl.compositivessl.com digital-id.ch digitalid.chmanaged-pki.chmanaged-pki.de pki-post.ch pki-posta.ch pki-poste.chroot-signing.chrootsigning.comssl-certificate.ch -swissid.ch swissign.com swissign.liswisssign-group.chswisssign-group.comswisssign-group.li swisssign.ch swisssign.com swisssign.li swisssign.net swisssign.orgswisssigner.chswisssigner.comswisssigngroup.chswisssigngroup.comswissstick.com swisstsa.ch swisstsa.li trustdoc.ch trustsign.ch zert.ch telekom.com -telekom.de trustwave.com verisign.asia verisign.biz verisign.chverisign.co.inverisign.co.uk verisign.comverisign.com.auverisign.com.brverisign.com.cnverisign.com.esverisign.com.hkverisign.com.sgverisign.com.twverisign.com.vn verisign.de verisign.dk verisign.es verisign.fr verisign.hk verisign.in verisign.info verisign.jobs verisign.mobi verisign.name verisign.net verisign.org verisign.pro verisign.se verisign.sg verisign.tw verisign.us verisign.vnverisigninc.com - - R-PROJECT r-project.org - -HULU -112263.com callhulu.comfindyourlimits.com freehulu.com  hooloo.tv  hoolu.com hoolu.tv hu1u.com huloo.cc huloo.tv hulu.com hulu.tv hulu.ushuluaction.com -huluad.com huluapp.com huluasks.com hulucall.com hulufree.com hulugans.comhulugermany.com -hulugo.com -huluim.comhuluinstantmessenger.com huluitaly.com hulunet.comhulunetwork.com huluplus.comhulupremium.comhulupurchase.com -huluqa.comhulurussia.com huluspain.comhulusports.comhulustream.com huluteam.com -hulutv.com huluusa.comjoinmaidez.com mushymush.tv -myhulu.comoriginalhulu.com payhulu.comregisterhulu.comthehulubraintrust.comwwwhuluplus.com -a -SSRCLOUDchina-internet-exchange.com cxkcloud.com ssrcloud.com ssrcloud.org -= - TRANSLATEWIKItranslatewiki.nettranslatewiki.org - -X-ORG x.org - -AAEX aaex.uk - - DAILYMAIL  anm.co.uk  dailym.aidailymail.co.uk dailymail.comdailymail.com.au dailymail.dkdailymailonline.comdmgmediaprivacy.co.ukmailhealth.commailonline.co.ukmailonline.commailonsunday.co.ukmailonsunday.ie metro.co.uk -mol.imthisismoney.co.uk -thismon.ee -\ -PRIVATE local  localhostlocalhost.sec.qq.comlocalhost.ptlogin2.qq.com - -GOG gog.comgog-statics.comgog.qtlglb.com -cn$gogalaxy.gog-statics.com -cn'menu-static.gog-statics.com -cn'productcard.gog-statics.com -cn(static-login.gog-statics.com -cn'www4-static.gog-statics.com -cn, ^images(-\d)?\.gog-statics\.com$ -cn -' -928PLUS 928.plus -zind.cloud -C -BOOKING -booking.cn -cn booking.com bstatic.com - -GIGABYTE  aorus.com aoruszone.cn -cn gigabyte.cn -cn gigabyte.comgigabyte2.azureedge.netsa78gs.wpc.edgecastcdn.net"sni1dcb6gl.wpc.edgecastcdn.net -$ - CLOUDCONVERTcloudconvert.com -Q - -DUCKDUCKGOduckduckgo.com duck.com -ddg.ggspreadprivacy.com \ No newline at end of file diff --git a/shadowsocks-csharp/Data/i18n.csv b/shadowsocks-csharp/Data/i18n.csv index c994f65dd..f571c3327 100644 --- a/shadowsocks-csharp/Data/i18n.csv +++ b/shadowsocks-csharp/Data/i18n.csv @@ -27,6 +27,8 @@ Online PAC,Удаленный PAC,使用在线 PAC,使用線上 PAC,オンライ Edit Local PAC File...,Редактировать локальный PAC…,编辑本地 PAC 文件...,編輯本機 PAC 檔案...,ローカル PAC ファイルの編集...,로컬 프록시 자동 구성 파일 수정,Modifier le fichier PAC local ... Update Local PAC from Geosite,Обновить локальный PAC из Geosite,从 Geosite 更新本地 PAC,從 Geosite 更新本機 PAC,Geosite からローカル PAC を更新,Geosite에서 로컬 프록시 자동 구성 파일 업데이트,Mettre à jour le PAC local à partir de Geosite Edit User Rule for Geosite...,Редактировать свои правила для Geosite,编辑 Geosite 的用户规则...,編輯 Geosite 的使用者規則...,ユーザールールの編集...,Geosite 사용자 수정,Modifier la règle utilisateur pour Geosite ... +GeoSite Sources...,Источники GeoSite…,GeoSite 源...,GeoSite 來源...,GeoSite ソース...,GeoSite 소스...,Sources GeoSite… +GeoSite Sources,Источники GeoSite,GeoSite 源,GeoSite 來源,GeoSite ソース,GeoSite 소스,Sources GeoSite Secure Local PAC,Безопасный URL локального PAC,保护本地 PAC,安全本機 PAC,ローカル PAC を保護,로컬 프록시 자동 구성 파일 암호화,Sécuriser PAC local Regenerate local PAC on version update,Пересоздавать локальный PAC после обновления версии,版本更新后重新生成本地 PAC,版本更新後重新生成本地 PAC,,, Copy Local PAC URL,Копировать URL локального PAC,复制本地 PAC 网址,複製本機 PAC 網址,ローカル PAC URL をコピー,로컬 프록시 자동 구성 파일 URL 복사,Copier l'URL du PAC local diff --git a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs index a63cc0419..01a81c3ec 100644 --- a/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs +++ b/shadowsocks-csharp/Encryption/AEAD/AEADEncryptor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Net; diff --git a/shadowsocks-csharp/Encryption/EncryptorBase.cs b/shadowsocks-csharp/Encryption/EncryptorBase.cs index 065007162..86bdb7464 100644 --- a/shadowsocks-csharp/Encryption/EncryptorBase.cs +++ b/shadowsocks-csharp/Encryption/EncryptorBase.cs @@ -1,4 +1,4 @@ -namespace Shadowsocks.Encryption +namespace Shadowsocks.Encryption { public class EncryptorInfo { diff --git a/shadowsocks-csharp/Encryption/EncryptorFactory.cs b/shadowsocks-csharp/Encryption/EncryptorFactory.cs index 217a34730..39b59ab99 100644 --- a/shadowsocks-csharp/Encryption/EncryptorFactory.cs +++ b/shadowsocks-csharp/Encryption/EncryptorFactory.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using System.Text; diff --git a/shadowsocks-csharp/Localization/Strings.fr.resx b/shadowsocks-csharp/Localization/Strings.fr.resx index da708dd24..44bf33bf6 100644 --- a/shadowsocks-csharp/Localization/Strings.fr.resx +++ b/shadowsocks-csharp/Localization/Strings.fr.resx @@ -180,4 +180,22 @@ copie + + Bases GeoSite utilisées par le PAC local. Toutes les sources indiquées sont fusionnées. Pour chaque URL, Shadowsocks essaie automatiquement <URL>.sha256sum ; l’absence de somme de contrôle n’est pas une erreur. + + + Ajoutez une ou plusieurs URL GeoSite (une par ligne) : + + + Monter + + + Descendre + + + Par défaut + + + Enregistrer + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.ja.resx b/shadowsocks-csharp/Localization/Strings.ja.resx index b47f5ba1a..a08538cad 100644 --- a/shadowsocks-csharp/Localization/Strings.ja.resx +++ b/shadowsocks-csharp/Localization/Strings.ja.resx @@ -177,4 +177,25 @@ コピー + + ローカル PAC で使用する GeoSite データベースです。指定したすべてのソースを結合します。各 URL について Shadowsocks は <URL>.sha256sum を自動的に確認し、チェックサムがなくてもエラーにはなりません。 + + + GeoSite URL を 1 つ以上追加します(1 行に 1 URL): + + + 上へ + + + 下へ + + + 既定値 + + + 削除 + + + 保存 + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.ko.resx b/shadowsocks-csharp/Localization/Strings.ko.resx index 65c899e49..39dc23ba7 100644 --- a/shadowsocks-csharp/Localization/Strings.ko.resx +++ b/shadowsocks-csharp/Localization/Strings.ko.resx @@ -177,4 +177,25 @@ + + 로컬 PAC에서 사용하는 GeoSite 데이터베이스입니다. 나열된 모든 소스를 병합합니다. 각 URL에 대해 Shadowsocks가 <URL>.sha256sum을 자동으로 확인하며, 체크섬이 없어도 오류로 처리하지 않습니다. + + + GeoSite URL을 하나 이상 추가하세요(한 줄에 하나씩): + + + 위로 + + + 아래로 + + + 기본값 + + + 제거 + + + 저장 + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.resx b/shadowsocks-csharp/Localization/Strings.resx index a2f4503d8..240d64483 100644 --- a/shadowsocks-csharp/Localization/Strings.resx +++ b/shadowsocks-csharp/Localization/Strings.resx @@ -269,4 +269,19 @@ Failed to get release notes + + GeoSite databases used by Local PAC. All listed sources are merged. For each URL Shadowsocks automatically tries <URL>.sha256sum; a missing checksum is not an error. + + + Add one or more GeoSite URLs (one per line): + + + Move up + + + Move down + + + Default + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.ru.resx b/shadowsocks-csharp/Localization/Strings.ru.resx index 487e5fd43..d5542bae8 100644 --- a/shadowsocks-csharp/Localization/Strings.ru.resx +++ b/shadowsocks-csharp/Localization/Strings.ru.resx @@ -269,4 +269,19 @@ Не удалось получить примечания к выпуску + + Базы GeoSite для локального PAC. Все указанные источники объединяются. Для каждого URL Shadowsocks автоматически проверяет <URL>.sha256sum; отсутствие контрольной суммы не является ошибкой. + + + Добавьте один или несколько URL GeoSite (по одному в строке): + + + Вверх + + + Вниз + + + По умолчанию + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.zh-Hans.resx b/shadowsocks-csharp/Localization/Strings.zh-Hans.resx index f3ef95200..a2f619444 100644 --- a/shadowsocks-csharp/Localization/Strings.zh-Hans.resx +++ b/shadowsocks-csharp/Localization/Strings.zh-Hans.resx @@ -234,4 +234,19 @@ 下列来源更新失败:\n\n + + 用于本地 PAC 的 GeoSite 数据库。所有列出的源都会合并。对于每个 URL,Shadowsocks 会自动尝试读取 <URL>.sha256sum;缺少校验和并不视为错误。 + + + 添加一个或多个 GeoSite URL(每行一个): + + + 上移 + + + 下移 + + + 默认 + \ No newline at end of file diff --git a/shadowsocks-csharp/Localization/Strings.zh-Hant.resx b/shadowsocks-csharp/Localization/Strings.zh-Hant.resx index e52f7e3f0..b96d46076 100644 --- a/shadowsocks-csharp/Localization/Strings.zh-Hant.resx +++ b/shadowsocks-csharp/Localization/Strings.zh-Hant.resx @@ -186,4 +186,25 @@ 複製 + + 用於本機 PAC 的 GeoSite 資料庫。所有列出的來源都會合併。對每個 URL,Shadowsocks 會自動嘗試讀取 <URL>.sha256sum;缺少校驗和不視為錯誤。 + + + 新增一個或多個 GeoSite URL(每行一個): + + + 上移 + + + 下移 + + + 預設 + + + 移除 + + + 儲存 + \ No newline at end of file diff --git a/shadowsocks-csharp/Model/Configuration.cs b/shadowsocks-csharp/Model/Configuration.cs index 04afc9690..de3abe579 100644 --- a/shadowsocks-csharp/Model/Configuration.cs +++ b/shadowsocks-csharp/Model/Configuration.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -7,6 +7,7 @@ using Newtonsoft.Json; using NLog; using Shadowsocks.Controller; +using Shadowsocks.Controller.Service; namespace Shadowsocks.Model { @@ -45,8 +46,15 @@ public class Configuration // hidden options public bool isIPv6Enabled; // for experimental ipv6 support public bool generateLegacyUrl; // for pre-sip002 url compatibility - public string geositeUrl; // for custom geosite source (and rule group) - public string geositeSha256sumUrl; // optional custom sha256sum url, leave empty to disable checksum verification for your custom geosite source + // GeoSite sources are used only by Local PAC. Every source is cached independently + // and all successfully loaded databases are merged. The checksum URL is derived as + // .sha256sum; checksum absence is non-fatal. + public List geositeUrls; + + // Legacy single-source settings kept only for gui-config.json migration. + public string geositeUrl; + public string geositeSha256sumUrl; + public List geositeDirectGroups; // groups of domains that we connect without the proxy public List geositeProxiedGroups; // groups of domains that we connect via the proxy public bool geositePreferDirect; // a.k.a blacklist mode @@ -84,6 +92,10 @@ public Configuration() // hidden options isIPv6Enabled = false; generateLegacyUrl = false; + geositeUrls = new List() + { + GeositeUpdater.DefaultSourceUrl, + }; geositeUrl = ""; geositeSha256sumUrl = ""; geositeDirectGroups = new List() @@ -188,12 +200,7 @@ public static Configuration Load() /// A reference of Configuration object. public static void Process(ref Configuration config) { - // Verify if the configured geosite groups exist. - // Reset to default if ANY one of the configured group doesn't exist. - if (!ValidateGeositeGroupList(config.geositeDirectGroups)) - ResetGeositeDirectGroup(ref config.geositeDirectGroups); - if (!ValidateGeositeGroupList(config.geositeProxiedGroups)) - ResetGeositeProxiedGroup(ref config.geositeProxiedGroups); + NormalizeGeositeSources(config); // Mark the first run of a new version. var appVersion = new Version(UpdateChecker.Version); @@ -299,6 +306,40 @@ public static List SortByOnlineConfig(IEnumerable servers) return ret; } + public static List NormalizeGeositeSourceList(IEnumerable sources) + { + var normalized = (sources ?? Enumerable.Empty()) + .Select(source => source?.Trim()) + .Where(source => !string.IsNullOrWhiteSpace(source)) + .Where(source => Uri.TryCreate(source, UriKind.Absolute, out Uri uri) && + (uri.Scheme == Uri.UriSchemeHttps || uri.Scheme == Uri.UriSchemeHttp)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + if (normalized.Count == 0) + normalized.Add(GeositeUpdater.DefaultSourceUrl); + + return normalized; + } + + private static void NormalizeGeositeSources(Configuration config) + { + if (config == null) + return; + + var sources = config.geositeUrls ?? new List(); + + // fix28 and older supported one custom URL that replaced the built-in source. + // Preserve that behavior during migration rather than silently adding v2fly as + // a second database. Checksum URLs are now discovered automatically. + if (!string.IsNullOrWhiteSpace(config.geositeUrl)) + sources = new List { config.geositeUrl }; + + config.geositeUrls = NormalizeGeositeSourceList(sources); + config.geositeUrl = ""; + config.geositeSha256sumUrl = ""; + } + /// /// Validates if the groups in the list are all valid. /// diff --git a/shadowsocks-csharp/Model/NlogConfig.cs b/shadowsocks-csharp/Model/NlogConfig.cs index 2b8541551..d592fd31a 100644 --- a/shadowsocks-csharp/Model/NlogConfig.cs +++ b/shadowsocks-csharp/Model/NlogConfig.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Xml; using NLog; diff --git a/shadowsocks-csharp/Program.cs b/shadowsocks-csharp/Program.cs index b2f740111..ad92c6909 100755 --- a/shadowsocks-csharp/Program.cs +++ b/shadowsocks-csharp/Program.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Threading; diff --git a/shadowsocks-csharp/Properties/AssemblyInfo.cs b/shadowsocks-csharp/Properties/AssemblyInfo.cs index aee362849..29f383246 100755 --- a/shadowsocks-csharp/Properties/AssemblyInfo.cs +++ b/shadowsocks-csharp/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.Versioning; using Shadowsocks.Controller; diff --git a/shadowsocks-csharp/Properties/Resources.Designer.cs b/shadowsocks-csharp/Properties/Resources.Designer.cs index 5fe8ee762..ad4a988d3 100644 --- a/shadowsocks-csharp/Properties/Resources.Designer.cs +++ b/shadowsocks-csharp/Properties/Resources.Designer.cs @@ -1,225 +1,215 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Shadowsocks.Properties { - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Shadowsocks.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to /* eslint-disable */ - ///// Was generated by gfwlist2pac in precise mode - ///// https://github.com/clowwindy/gfwlist2pac - /// - ///// 2019-10-06: More 'javascript' way to interaction with main program - ///// 2019-02-08: Updated to support shadowsocks-windows user rules. - /// - ///var proxy = __PROXY__; - ///var userrules = []; - ///var rules = []; - /// - ///// convert to abp grammar - ///var re = /^(@@)?\|\|.*?[^\^]$/; - ///for (var i = 0; i < __RULES__.length; i++) { - /// var s = __RULES__[i]; - /// if (s.match(re)) s += "^"; - /// rules.push(s); - ///} - /// - /// [rest of string was truncated]";. - /// - public static string abp_js { - get { - return ResourceManager.GetString("abp_js", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - public static byte[] dlc_dat { - get { - object obj = ResourceManager.GetObject("dlc_dat", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized string similar to en,ru-RU,zh-CN,zh-TW,ja,ko,fr - ///#Restart program to apply translation,,,,,, - ///#This is comment line,,,,,, - ///#Always keep language name at head of file,,,,,, - ///#Language name is output in log,,,,,, - ///"#You can find it by search ""Current language is:""",,,,,, - ///#Please use UTF-8 with BOM encoding so we can edit it in Excel,,,,,, - ///,,,,,, - ///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks - ///,,,,,, - ///#Menu,,,,,, - ///,,,,,, - ///System Proxy,Системный прокси-сервер,系统代理,系統代理,システムプロキシ,시스템 프록시,P [rest of string was truncated]";. - /// - public static string i18n_csv { - get { - return ResourceManager.GetString("i18n_csv", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> - ///<!-- Warning: Configuration may reset after shadowsocks upgrade. --> - ///<!-- If you messed it up, delete this file and Shadowsocks will create a new one. --> - ///<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - /// <targets> - /// <!-- This line is managed by Shadowsocks. Do not modify it unless you know what you are doing.--> - /// <target name="file" xsi:type="File" fileName="ss_win_temp\shadowsocks.log" writ [rest of string was truncated]";. - /// - public static string NLog_config { - get { - return ResourceManager.GetString("NLog_config", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ - ///toggle 0 - ///logfile ss_privoxy.log - ///show-on-task-bar 0 - ///activity-animation 0 - ///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . - ///max-client-connections 2048 - ///hide-console - ///. - /// - public static string privoxy_conf { - get { - return ResourceManager.GetString("privoxy_conf", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Byte[]. - /// - public static byte[] privoxy_exe { - get { - object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap ss32Fill { - get { - object obj = ResourceManager.GetObject("ss32Fill", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap ss32In { - get { - object obj = ResourceManager.GetObject("ss32In", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap ss32Out { - get { - object obj = ResourceManager.GetObject("ss32Out", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap ss32Outline { - get { - object obj = ResourceManager.GetObject("ss32Outline", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - public static System.Drawing.Bitmap ssw128 { - get { - object obj = ResourceManager.GetObject("ssw128", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to ! Put user rules line by line in this file. - ///! See https://adblockplus.org/en/filter-cheatsheet - ///. - /// - public static string user_rule { - get { - return ResourceManager.GetString("user_rule", resourceCulture); - } - } - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Shadowsocks.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Shadowsocks.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to /* eslint-disable */ + ///// Was generated by gfwlist2pac in precise mode + ///// https://github.com/clowwindy/gfwlist2pac + /// + ///// 2019-10-06: More 'javascript' way to interaction with main program + ///// 2019-02-08: Updated to support shadowsocks-windows user rules. + /// + ///var proxy = __PROXY__; + ///var userrules = []; + ///var rules = []; + /// + ///// convert to abp grammar + ///var re = /^(@@)?\|\|.*?[^\^]$/; + ///for (var i = 0; i < __RULES__.length; i++) { + /// var s = __RULES__[i]; + /// if (s.match(re)) s += "^"; + /// rules.push(s); + ///} + /// + /// [rest of string was truncated]";. + /// + public static string abp_js { + get { + return ResourceManager.GetString("abp_js", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to en,ru-RU,zh-CN,zh-TW,ja,ko,fr + ///#Restart program to apply translation,,,,,, + ///#This is comment line,,,,,, + ///#Always keep language name at head of file,,,,,, + ///#Language name is output in log,,,,,, + ///"#You can find it by search ""Current language is:""",,,,,, + ///#Please use UTF-8 with BOM encoding so we can edit it in Excel,,,,,, + ///,,,,,, + ///Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks,Shadowsocks + ///,,,,,, + ///#Menu,,,,,, + ///,,,,,, + ///System Proxy,Системный прокси-сервер,系统代理,系統代理,システムプロキシ,시스템 프록시,P [rest of string was truncated]";. + /// + public static string i18n_csv { + get { + return ResourceManager.GetString("i18n_csv", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8" ?> + ///<!-- Warning: Configuration may reset after shadowsocks upgrade. --> + ///<!-- If you messed it up, delete this file and Shadowsocks will create a new one. --> + ///<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + /// <targets> + /// <!-- This line is managed by Shadowsocks. Do not modify it unless you know what you are doing.--> + /// <target name="file" xsi:type="File" fileName="ss_win_temp\shadowsocks.log" writ [rest of string was truncated]";. + /// + public static string NLog_config { + get { + return ResourceManager.GetString("NLog_config", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listen-address __PRIVOXY_BIND_IP__:__PRIVOXY_BIND_PORT__ + ///toggle 0 + ///logfile ss_privoxy.log + ///show-on-task-bar 0 + ///activity-animation 0 + ///forward-socks5 / __SOCKS_HOST__:__SOCKS_PORT__ . + ///max-client-connections 2048 + ///hide-console + ///. + /// + public static string privoxy_conf { + get { + return ResourceManager.GetString("privoxy_conf", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] privoxy_exe { + get { + object obj = ResourceManager.GetObject("privoxy_exe", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ss32Fill { + get { + object obj = ResourceManager.GetObject("ss32Fill", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ss32In { + get { + object obj = ResourceManager.GetObject("ss32In", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ss32Out { + get { + object obj = ResourceManager.GetObject("ss32Out", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ss32Outline { + get { + object obj = ResourceManager.GetObject("ss32Outline", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap ssw128 { + get { + object obj = ResourceManager.GetObject("ssw128", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to ! Put user rules line by line in this file. + ///! See https://adblockplus.org/en/filter-cheatsheet + ///. + /// + public static string user_rule { + get { + return ResourceManager.GetString("user_rule", resourceCulture); + } + } + } +} diff --git a/shadowsocks-csharp/Properties/Resources.resx b/shadowsocks-csharp/Properties/Resources.resx index 79c1b944c..044c9059a 100755 --- a/shadowsocks-csharp/Properties/Resources.resx +++ b/shadowsocks-csharp/Properties/Resources.resx @@ -1,157 +1,154 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Data\abp.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 - - - ..\data\dlc.dat;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Data\i18n.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - - ..\data\nlog.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - - ..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - - ..\data\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\ss32Fill.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ss32In.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ss32Out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ss32Outline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\ssw128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\data\user-rule.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Data\abp.js;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312 + + + ..\Data\i18n.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\data\nlog.config;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\data\privoxy_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + + ..\data\privoxy.exe.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\ss32Fill.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ss32In.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ss32Out.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ss32Outline.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ssw128.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\data\user-rule.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8 + + diff --git a/shadowsocks-csharp/Proxy/HttpProxy.cs b/shadowsocks-csharp/Proxy/HttpProxy.cs index 4450bca83..570d8b21e 100644 --- a/shadowsocks-csharp/Proxy/HttpProxy.cs +++ b/shadowsocks-csharp/Proxy/HttpProxy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Sockets; using System.Text; diff --git a/shadowsocks-csharp/Proxy/Socks5Proxy.cs b/shadowsocks-csharp/Proxy/Socks5Proxy.cs index 0f4547fb0..d4dff90b9 100644 --- a/shadowsocks-csharp/Proxy/Socks5Proxy.cs +++ b/shadowsocks-csharp/Proxy/Socks5Proxy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Sockets; using System.Text; diff --git a/shadowsocks-csharp/Util/ProcessManagement/Job.cs b/shadowsocks-csharp/Util/ProcessManagement/Job.cs index d0a60da20..82632acaf 100644 --- a/shadowsocks-csharp/Util/ProcessManagement/Job.cs +++ b/shadowsocks-csharp/Util/ProcessManagement/Job.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.InteropServices; using NLog; diff --git a/shadowsocks-csharp/Util/Sockets/SocketUtil.cs b/shadowsocks-csharp/Util/Sockets/SocketUtil.cs index f4818e4f8..08e0fbc28 100644 --- a/shadowsocks-csharp/Util/Sockets/SocketUtil.cs +++ b/shadowsocks-csharp/Util/Sockets/SocketUtil.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Sockets; diff --git a/shadowsocks-csharp/Util/Sockets/WrappedSocket.cs b/shadowsocks-csharp/Util/Sockets/WrappedSocket.cs index 971ebfe68..aaf082e68 100644 --- a/shadowsocks-csharp/Util/Sockets/WrappedSocket.cs +++ b/shadowsocks-csharp/Util/Sockets/WrappedSocket.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Net.Sockets; using System.Threading; diff --git a/shadowsocks-csharp/Util/Util.cs b/shadowsocks-csharp/Util/Util.cs index 718360c61..b57089709 100755 --- a/shadowsocks-csharp/Util/Util.cs +++ b/shadowsocks-csharp/Util/Util.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; using System.IO; using System.IO.Compression; diff --git a/shadowsocks-csharp/View/LogForm.cs b/shadowsocks-csharp/View/LogForm.cs index 0d551c529..d7f8d77ec 100644 --- a/shadowsocks-csharp/View/LogForm.cs +++ b/shadowsocks-csharp/View/LogForm.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.IO; diff --git a/shadowsocks-csharp/View/MenuViewController.cs b/shadowsocks-csharp/View/MenuViewController.cs index 016358b94..0739b98f3 100644 --- a/shadowsocks-csharp/View/MenuViewController.cs +++ b/shadowsocks-csharp/View/MenuViewController.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Drawing; using System.IO; @@ -9,6 +9,7 @@ using System.Windows.Threading; using NLog; using Shadowsocks.Controller; +using Shadowsocks.Controller.Service; using Shadowsocks.Localization; using Shadowsocks.Model; using Shadowsocks.Properties; @@ -44,6 +45,7 @@ public class MenuViewController private ToolStripMenuItem onlinePACItem; private ToolStripMenuItem editLocalPACItem; private ToolStripMenuItem updateFromGeositeItem; + private ToolStripMenuItem geositeSourcesItem; private ToolStripMenuItem editGFWUserRuleItem; private ToolStripMenuItem editOnlinePACItem; private ToolStripMenuItem secureLocalPacUrlToggleItem; @@ -64,6 +66,7 @@ public class MenuViewController private System.Windows.Window hotkeysWindow; private System.Windows.Window forwardProxyWindow; private System.Windows.Window onlineConfigWindow; + private System.Windows.Window geositeSourcesWindow; // color definition for icon color transformation private readonly Color colorMaskBlue = Color.FromArgb(255, 25, 125, 191); @@ -275,6 +278,7 @@ private void LoadMenu() new ToolStripSeparator(), editLocalPACItem = CreateMenuItem("Edit Local PAC File...", EditPACFileItem_Click), updateFromGeositeItem = CreateMenuItem("Update Local PAC from Geosite", UpdatePACFromGeositeItem_Click), + geositeSourcesItem = CreateMenuItem("GeoSite Sources...", GeositeSourcesItem_Click), editGFWUserRuleItem = CreateMenuItem("Edit User Rule for Geosite...", EditUserRuleFileForGeositeItem_Click), secureLocalPacUrlToggleItem = CreateMenuItem("Secure Local PAC", SecureLocalPacUrlToggleItem_Click), regenerateLocalPacOnUpdateItem = CreateMenuItem("Regenerate local PAC on version update", RegenerateLocalPacOnUpdateItem_Click), @@ -532,6 +536,36 @@ private void OnlineConfigWindow_Closed(object sender, EventArgs e) onlineConfigWindow = null; } + private void GeositeSourcesItem_Click(object sender, EventArgs e) + { + if (geositeSourcesWindow == null) + { + geositeSourcesWindow = new System.Windows.Window() + { + Title = I18N.GetString("GeoSite Sources"), + Height = 500, + Width = 740, + MinHeight = 440, + MinWidth = 620, + Content = new GeositeSourcesView() + }; + geositeSourcesWindow.Closed += GeositeSourcesWindow_Closed; + ElementHost.EnableModelessKeyboardInterop(geositeSourcesWindow); + geositeSourcesWindow.Show(); + } + geositeSourcesWindow.Activate(); + } + + private void GeositeSourcesWindow_Closed(object sender, EventArgs e) + { + geositeSourcesWindow = null; + } + + public void CloseGeositeSourcesWindow() + { + geositeSourcesWindow?.Close(); + } + private void hotKeyItem_Click(object sender, EventArgs e) { if (hotkeysWindow == null) @@ -860,6 +894,7 @@ private void UpdatePACItemsEnabledStatus() { this.editLocalPACItem.Enabled = true; this.updateFromGeositeItem.Enabled = true; + this.geositeSourcesItem.Enabled = true; this.editGFWUserRuleItem.Enabled = true; this.editOnlinePACItem.Enabled = false; } @@ -867,6 +902,7 @@ private void UpdatePACItemsEnabledStatus() { this.editLocalPACItem.Enabled = false; this.updateFromGeositeItem.Enabled = false; + this.geositeSourcesItem.Enabled = false; this.editGFWUserRuleItem.Enabled = false; this.editOnlinePACItem.Enabled = true; } diff --git a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs index 12f493fb6..945609190 100644 --- a/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs +++ b/shadowsocks-csharp/ViewModels/ForwardProxyViewModel.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Reactive; using System.Reactive.Linq; using ReactiveUI; diff --git a/shadowsocks-csharp/ViewModels/GeositeSourcesViewModel.cs b/shadowsocks-csharp/ViewModels/GeositeSourcesViewModel.cs new file mode 100644 index 000000000..0e5ebfbd2 --- /dev/null +++ b/shadowsocks-csharp/ViewModels/GeositeSourcesViewModel.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Reactive; +using System.Reactive.Linq; +using ReactiveUI; +using Shadowsocks.Controller; +using Shadowsocks.Controller.Service; +using Shadowsocks.Model; +using Shadowsocks.View; + +namespace Shadowsocks.ViewModels +{ + public class GeositeSourcesViewModel : ReactiveObject + { + private readonly ShadowsocksController _controller; + private readonly MenuViewController _menuViewController; + + public GeositeSourcesViewModel() + { + _controller = Program.MainController; + _menuViewController = Program.MenuController; + + var config = _controller.GetCurrentConfiguration(); + Sources = new ObservableCollection( + Configuration.NormalizeGeositeSourceList(config.geositeUrls)); + SelectedSource = Sources.FirstOrDefault(); + Address = ""; + + var hasSelection = this.WhenAnyValue( + x => x.SelectedSource, + selected => !string.IsNullOrWhiteSpace(selected)); + var canRemove = this.WhenAnyValue( + x => x.SelectedSource, + x => x.Sources.Count, + (selected, count) => !string.IsNullOrWhiteSpace(selected) && count > 1); + var canAdd = this.WhenAnyValue( + x => x.Address, + address => ParseAddresses(address).Count > 0 && ParseAddresses(address).All(IsValidSource)); + + Add = ReactiveCommand.Create(AddSources, canAdd); + Remove = ReactiveCommand.Create(RemoveSelected, canRemove); + MoveUp = ReactiveCommand.Create(MoveSelectedUp, hasSelection); + MoveDown = ReactiveCommand.Create(MoveSelectedDown, hasSelection); + RestoreDefault = ReactiveCommand.Create(RestoreDefaultSource); + Save = ReactiveCommand.Create(() => + { + _controller.SaveGeositeSources(Sources.ToList()); + _menuViewController.CloseGeositeSourcesWindow(); + }); + Cancel = ReactiveCommand.Create(_menuViewController.CloseGeositeSourcesWindow); + } + + public ObservableCollection Sources { get; } + + private string _selectedSource; + public string SelectedSource + { + get => _selectedSource; + set => this.RaiseAndSetIfChanged(ref _selectedSource, value); + } + + private string _address; + public string Address + { + get => _address; + set => this.RaiseAndSetIfChanged(ref _address, value); + } + + public ReactiveCommand Add { get; } + public ReactiveCommand Remove { get; } + public ReactiveCommand MoveUp { get; } + public ReactiveCommand MoveDown { get; } + public ReactiveCommand RestoreDefault { get; } + public ReactiveCommand Save { get; } + public ReactiveCommand Cancel { get; } + + private void AddSources() + { + foreach (string source in ParseAddresses(Address)) + { + if (Sources.Any(existing => string.Equals(existing, source, StringComparison.OrdinalIgnoreCase))) + continue; + + Sources.Add(source); + SelectedSource = source; + } + Address = ""; + } + + private void RemoveSelected() + { + if (string.IsNullOrWhiteSpace(SelectedSource) || Sources.Count <= 1) + return; + + int index = Sources.IndexOf(SelectedSource); + if (index < 0) + return; + + Sources.RemoveAt(index); + SelectedSource = Sources[Math.Min(index, Sources.Count - 1)]; + } + + private void MoveSelectedUp() + { + int index = Sources.IndexOf(SelectedSource); + if (index <= 0) + return; + + Sources.Move(index, index - 1); + } + + private void MoveSelectedDown() + { + int index = Sources.IndexOf(SelectedSource); + if (index < 0 || index >= Sources.Count - 1) + return; + + Sources.Move(index, index + 1); + } + + private void RestoreDefaultSource() + { + Sources.Clear(); + Sources.Add(GeositeUpdater.DefaultSourceUrl); + SelectedSource = Sources[0]; + Address = ""; + } + + private static List ParseAddresses(string value) + => (value ?? "") + .Split(new[] { '\r', '\n', ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(source => source.Trim()) + .Where(source => !string.IsNullOrWhiteSpace(source)) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToList(); + + private static bool IsValidSource(string source) + => Uri.TryCreate(source, UriKind.Absolute, out Uri uri) && + (uri.Scheme == Uri.UriSchemeHttps || uri.Scheme == Uri.UriSchemeHttp); + } +} diff --git a/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs b/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs index aec7c9cbd..4caa6eb14 100644 --- a/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs +++ b/shadowsocks-csharp/ViewModels/HotkeysViewModel.cs @@ -1,4 +1,4 @@ -using System.Reactive; +using System.Reactive; using System.Text; using System.Windows.Input; using ReactiveUI; diff --git a/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs b/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs index 000c1e340..3e3e37723 100644 --- a/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs +++ b/shadowsocks-csharp/ViewModels/OnlineConfigViewModel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; diff --git a/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs b/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs index 1fa97c0fc..894d6d283 100644 --- a/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs +++ b/shadowsocks-csharp/ViewModels/ServerSharingViewModel.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Drawing; using System.IO; diff --git a/shadowsocks-csharp/ViewModels/VersionUpdatePromptViewModel.cs b/shadowsocks-csharp/ViewModels/VersionUpdatePromptViewModel.cs index 6ae88d5a0..88ff8b45f 100644 --- a/shadowsocks-csharp/ViewModels/VersionUpdatePromptViewModel.cs +++ b/shadowsocks-csharp/ViewModels/VersionUpdatePromptViewModel.cs @@ -1,4 +1,4 @@ -using System.Reactive; +using System.Reactive; using Newtonsoft.Json.Linq; using ReactiveUI; using Shadowsocks.Controller; diff --git a/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs b/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs index aa8724585..6950583fb 100644 --- a/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs +++ b/shadowsocks-csharp/Views/ForwardProxyView.xaml.cs @@ -1,4 +1,4 @@ -using System.Reactive.Disposables; +using System.Reactive.Disposables; using ReactiveUI; using Shadowsocks.ViewModels; diff --git a/shadowsocks-csharp/Views/GeositeSourcesView.xaml b/shadowsocks-csharp/Views/GeositeSourcesView.xaml new file mode 100644 index 000000000..7f0239b1b --- /dev/null +++ b/shadowsocks-csharp/Views/GeositeSourcesView.xaml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +

    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