diff --git a/v2rayN/AmazTool/Program.cs b/v2rayN/AmazTool/Program.cs index cbfc1332..eb4b29a4 100644 --- a/v2rayN/AmazTool/Program.cs +++ b/v2rayN/AmazTool/Program.cs @@ -1,29 +1,29 @@ -namespace AmazTool +namespace AmazTool { - internal static class Program - { - /// - /// 应用程序的主入口点。 - /// - [STAThread] - private static void Main(string[] args) - { - if (args.Length == 0) - { - Console.WriteLine(Resx.Resource.Guidelines); - Thread.Sleep(5000); - return; - } + internal static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + private static void Main(string[] args) + { + if (args.Length == 0) + { + Console.WriteLine(Resx.Resource.Guidelines); + Thread.Sleep(5000); + return; + } - var argData = Uri.UnescapeDataString(string.Join(" ", args)); - if (argData.Equals("rebootas")) - { - Thread.Sleep(1000); - Utils.StartV2RayN(); - return; - } + var argData = Uri.UnescapeDataString(string.Join(" ", args)); + if (argData.Equals("rebootas")) + { + Thread.Sleep(1000); + Utils.StartV2RayN(); + return; + } - UpgradeApp.Upgrade(argData); - } - } -} \ No newline at end of file + UpgradeApp.Upgrade(argData); + } + } +} diff --git a/v2rayN/AmazTool/Resx/Resource.Designer.cs b/v2rayN/AmazTool/Resx/Resource.Designer.cs index e13c70b6..62cd075f 100644 --- a/v2rayN/AmazTool/Resx/Resource.Designer.cs +++ b/v2rayN/AmazTool/Resx/Resource.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 @@ -9,163 +9,163 @@ //------------------------------------------------------------------------------ namespace AmazTool.Resx { - using System; - - - /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 - /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resource { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resource() { - } - - /// - /// 返回此类使用的缓存的 ResourceManager 实例。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AmazTool.Resx.Resource", typeof(Resource).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 查找类似 Failed to terminate the v2rayN.Close it manually,or the upgrade may fail. 的本地化字符串。 - /// - internal static string FailedTerminateProcess { - get { - return ResourceManager.GetString("FailedTerminateProcess", resourceCulture); - } - } - - /// - /// 查找类似 Failed to extract the update package. 的本地化字符串。 - /// - internal static string FailedUnzipping { - get { - return ResourceManager.GetString("FailedUnzipping", resourceCulture); - } - } - - /// - /// 查找类似 Upgrade failed. 的本地化字符串。 - /// - internal static string FailedUpgrade { - get { - return ResourceManager.GetString("FailedUpgrade", resourceCulture); - } - } - - /// - /// 查找类似 Please run it from the main application. 的本地化字符串。 - /// - internal static string Guidelines { - get { - return ResourceManager.GetString("Guidelines", resourceCulture); - } - } - - /// - /// 查找类似 Information 的本地化字符串。 - /// - internal static string Information { - get { - return ResourceManager.GetString("Information", resourceCulture); - } - } - - /// - /// 查找类似 In progress, please wait... 的本地化字符串。 - /// - internal static string InProgress { - get { - return ResourceManager.GetString("InProgress", resourceCulture); - } - } - - /// - /// 查找类似 Start v2rayN, please wait... 的本地化字符串。 - /// - internal static string Restartv2rayN { - get { - return ResourceManager.GetString("Restartv2rayN", resourceCulture); - } - } - - /// - /// 查找类似 Start extracting the update package... 的本地化字符串。 - /// - internal static string StartUnzipping { - get { - return ResourceManager.GetString("StartUnzipping", resourceCulture); - } - } - - /// - /// 查找类似 Successfully extracted the update package. 的本地化字符串。 - /// - internal static string SuccessUnzipping { - get { - return ResourceManager.GetString("SuccessUnzipping", resourceCulture); - } - } - - /// - /// 查找类似 Upgrade success. 的本地化字符串。 - /// - internal static string SuccessUpgrade { - get { - return ResourceManager.GetString("SuccessUpgrade", resourceCulture); - } - } - - /// - /// 查找类似 Try to terminate the v2rayN process... 的本地化字符串。 - /// - internal static string TryTerminateProcess { - get { - return ResourceManager.GetString("TryTerminateProcess", resourceCulture); - } - } - - /// - /// 查找类似 Upgrade failed, file not found. 的本地化字符串。 - /// - internal static string UpgradeFileNotFound { - get { - return ResourceManager.GetString("UpgradeFileNotFound", resourceCulture); - } - } - } + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resource() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AmazTool.Resx.Resource", typeof(Resource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 Failed to terminate the v2rayN.Close it manually,or the upgrade may fail. 的本地化字符串。 + /// + internal static string FailedTerminateProcess { + get { + return ResourceManager.GetString("FailedTerminateProcess", resourceCulture); + } + } + + /// + /// 查找类似 Failed to extract the update package. 的本地化字符串。 + /// + internal static string FailedUnzipping { + get { + return ResourceManager.GetString("FailedUnzipping", resourceCulture); + } + } + + /// + /// 查找类似 Upgrade failed. 的本地化字符串。 + /// + internal static string FailedUpgrade { + get { + return ResourceManager.GetString("FailedUpgrade", resourceCulture); + } + } + + /// + /// 查找类似 Please run it from the main application. 的本地化字符串。 + /// + internal static string Guidelines { + get { + return ResourceManager.GetString("Guidelines", resourceCulture); + } + } + + /// + /// 查找类似 Information 的本地化字符串。 + /// + internal static string Information { + get { + return ResourceManager.GetString("Information", resourceCulture); + } + } + + /// + /// 查找类似 In progress, please wait... 的本地化字符串。 + /// + internal static string InProgress { + get { + return ResourceManager.GetString("InProgress", resourceCulture); + } + } + + /// + /// 查找类似 Start v2rayN, please wait... 的本地化字符串。 + /// + internal static string Restartv2rayN { + get { + return ResourceManager.GetString("Restartv2rayN", resourceCulture); + } + } + + /// + /// 查找类似 Start extracting the update package... 的本地化字符串。 + /// + internal static string StartUnzipping { + get { + return ResourceManager.GetString("StartUnzipping", resourceCulture); + } + } + + /// + /// 查找类似 Successfully extracted the update package. 的本地化字符串。 + /// + internal static string SuccessUnzipping { + get { + return ResourceManager.GetString("SuccessUnzipping", resourceCulture); + } + } + + /// + /// 查找类似 Upgrade success. 的本地化字符串。 + /// + internal static string SuccessUpgrade { + get { + return ResourceManager.GetString("SuccessUpgrade", resourceCulture); + } + } + + /// + /// 查找类似 Try to terminate the v2rayN process... 的本地化字符串。 + /// + internal static string TryTerminateProcess { + get { + return ResourceManager.GetString("TryTerminateProcess", resourceCulture); + } + } + + /// + /// 查找类似 Upgrade failed, file not found. 的本地化字符串。 + /// + internal static string UpgradeFileNotFound { + get { + return ResourceManager.GetString("UpgradeFileNotFound", resourceCulture); + } + } + } } diff --git a/v2rayN/AmazTool/UpgradeApp.cs b/v2rayN/AmazTool/UpgradeApp.cs index 03e234a0..96636fe2 100644 --- a/v2rayN/AmazTool/UpgradeApp.cs +++ b/v2rayN/AmazTool/UpgradeApp.cs @@ -1,104 +1,105 @@ -using System.Diagnostics; +using System.Diagnostics; using System.IO.Compression; using System.Text; namespace AmazTool { - internal class UpgradeApp - { - public static void Upgrade(string fileName) - { - Console.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); + internal class UpgradeApp + { + public static void Upgrade(string fileName) + { + Console.WriteLine($"{Resx.Resource.StartUnzipping}\n{fileName}"); - Utils.Waiting(5); + Utils.Waiting(5); - if (!File.Exists(fileName)) - { - Console.WriteLine(Resx.Resource.UpgradeFileNotFound); - return; - } + if (!File.Exists(fileName)) + { + Console.WriteLine(Resx.Resource.UpgradeFileNotFound); + return; + } - Console.WriteLine(Resx.Resource.TryTerminateProcess); - try - { - var existing = Process.GetProcessesByName(Utils.V2rayN); - foreach (var pp in existing) - { - var path = pp.MainModule?.FileName ?? ""; - if (path.StartsWith(Utils.GetPath(Utils.V2rayN))) - { - pp?.Kill(); - pp?.WaitForExit(1000); - } - } - } - catch (Exception ex) - { - // Access may be denied without admin right. The user may not be an administrator. - Console.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); - } + Console.WriteLine(Resx.Resource.TryTerminateProcess); + try + { + var existing = Process.GetProcessesByName(Utils.V2rayN); + foreach (var pp in existing) + { + var path = pp.MainModule?.FileName ?? ""; + if (path.StartsWith(Utils.GetPath(Utils.V2rayN))) + { + pp?.Kill(); + pp?.WaitForExit(1000); + } + } + } + catch (Exception ex) + { + // Access may be denied without admin right. The user may not be an administrator. + Console.WriteLine(Resx.Resource.FailedTerminateProcess + ex.StackTrace); + } - Console.WriteLine(Resx.Resource.StartUnzipping); - StringBuilder sb = new(); - try - { - var thisAppOldFile = $"{Utils.GetExePath()}.tmp"; - File.Delete(thisAppOldFile); - var splitKey = "/"; + Console.WriteLine(Resx.Resource.StartUnzipping); + StringBuilder sb = new(); + try + { + var thisAppOldFile = $"{Utils.GetExePath()}.tmp"; + File.Delete(thisAppOldFile); + var splitKey = "/"; - using var archive = ZipFile.OpenRead(fileName); - foreach (var entry in archive.Entries) - { - try - { - if (entry.Length == 0) - { - continue; - } + using var archive = ZipFile.OpenRead(fileName); + foreach (var entry in archive.Entries) + { + try + { + if (entry.Length == 0) + { + continue; + } - Console.WriteLine(entry.FullName); + Console.WriteLine(entry.FullName); - var lst = entry.FullName.Split(splitKey); - if (lst.Length == 1) continue; - var fullName = string.Join(splitKey, lst[1..lst.Length]); + var lst = entry.FullName.Split(splitKey); + if (lst.Length == 1) + continue; + var fullName = string.Join(splitKey, lst[1..lst.Length]); - if (string.Equals(Utils.GetExePath(), Utils.GetPath(fullName), StringComparison.OrdinalIgnoreCase)) - { - File.Move(Utils.GetExePath(), thisAppOldFile); - } + if (string.Equals(Utils.GetExePath(), Utils.GetPath(fullName), StringComparison.OrdinalIgnoreCase)) + { + File.Move(Utils.GetExePath(), thisAppOldFile); + } - var entryOutputPath = Utils.GetPath(fullName); - Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); - //In the bin folder, if the file already exists, it will be skipped - if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) - { - continue; - } - entry.ExtractToFile(entryOutputPath, true); + var entryOutputPath = Utils.GetPath(fullName); + Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath)!); + //In the bin folder, if the file already exists, it will be skipped + if (fullName.StartsWith("bin") && File.Exists(entryOutputPath)) + { + continue; + } + entry.ExtractToFile(entryOutputPath, true); - Console.WriteLine(entryOutputPath); - } - catch (Exception ex) - { - sb.Append(ex.StackTrace); - } - } - } - catch (Exception ex) - { - Console.WriteLine(Resx.Resource.FailedUpgrade + ex.StackTrace); - //return; - } - if (sb.Length > 0) - { - Console.WriteLine(Resx.Resource.FailedUpgrade + sb.ToString()); - //return; - } + Console.WriteLine(entryOutputPath); + } + catch (Exception ex) + { + sb.Append(ex.StackTrace); + } + } + } + catch (Exception ex) + { + Console.WriteLine(Resx.Resource.FailedUpgrade + ex.StackTrace); + //return; + } + if (sb.Length > 0) + { + Console.WriteLine(Resx.Resource.FailedUpgrade + sb.ToString()); + //return; + } - Console.WriteLine(Resx.Resource.Restartv2rayN); - Utils.Waiting(2); + Console.WriteLine(Resx.Resource.Restartv2rayN); + Utils.Waiting(2); - Utils.StartV2RayN(); - } - } -} \ No newline at end of file + Utils.StartV2RayN(); + } + } +} diff --git a/v2rayN/AmazTool/Utils.cs b/v2rayN/AmazTool/Utils.cs index d4189644..773ee6fb 100644 --- a/v2rayN/AmazTool/Utils.cs +++ b/v2rayN/AmazTool/Utils.cs @@ -1,52 +1,52 @@ -using System.Diagnostics; +using System.Diagnostics; namespace AmazTool { - internal class Utils - { - public static string GetExePath() - { - return Environment.ProcessPath ?? Process.GetCurrentProcess().MainModule?.FileName ?? string.Empty; - } + internal class Utils + { + public static string GetExePath() + { + return Environment.ProcessPath ?? Process.GetCurrentProcess().MainModule?.FileName ?? string.Empty; + } - public static string StartupPath() - { - return AppDomain.CurrentDomain.BaseDirectory; - } + public static string StartupPath() + { + return AppDomain.CurrentDomain.BaseDirectory; + } - public static string GetPath(string fileName) - { - string startupPath = StartupPath(); - if (string.IsNullOrEmpty(fileName)) - { - return startupPath; - } - return Path.Combine(startupPath, fileName); - } + public static string GetPath(string fileName) + { + string startupPath = StartupPath(); + if (string.IsNullOrEmpty(fileName)) + { + return startupPath; + } + return Path.Combine(startupPath, fileName); + } - public static string V2rayN => "v2rayN"; + public static string V2rayN => "v2rayN"; - public static void StartV2RayN() - { - Process process = new() - { - StartInfo = new() - { - UseShellExecute = true, - FileName = V2rayN, - WorkingDirectory = StartupPath() - } - }; - process.Start(); - } + public static void StartV2RayN() + { + Process process = new() + { + StartInfo = new() + { + UseShellExecute = true, + FileName = V2rayN, + WorkingDirectory = StartupPath() + } + }; + process.Start(); + } - public static void Waiting(int second) - { - for (var i = second; i > 0; i--) - { - Console.WriteLine(i); - Thread.Sleep(1000); - } - } - } -} \ No newline at end of file + public static void Waiting(int second) + { + for (var i = second; i > 0; i--) + { + Console.WriteLine(i); + Thread.Sleep(1000); + } + } + } +} diff --git a/v2rayN/ServiceLib/Base/MyReactiveObject.cs b/v2rayN/ServiceLib/Base/MyReactiveObject.cs index 0049429d..7d5cba4c 100644 --- a/v2rayN/ServiceLib/Base/MyReactiveObject.cs +++ b/v2rayN/ServiceLib/Base/MyReactiveObject.cs @@ -1,10 +1,10 @@ -using ReactiveUI; +using ReactiveUI; namespace ServiceLib.Base { - public class MyReactiveObject : ReactiveObject - { - protected static Config? _config; - protected Func>? _updateView; - } -} \ No newline at end of file + public class MyReactiveObject : ReactiveObject + { + protected static Config? _config; + protected Func>? _updateView; + } +} diff --git a/v2rayN/ServiceLib/Common/AesUtils.cs b/v2rayN/ServiceLib/Common/AesUtils.cs index dcd4ac2a..5157d605 100644 --- a/v2rayN/ServiceLib/Common/AesUtils.cs +++ b/v2rayN/ServiceLib/Common/AesUtils.cs @@ -3,99 +3,99 @@ using System.Text; namespace ServiceLib.Common { - public class AesUtils - { - private const int KeySize = 256; // AES-256 - private const int IvSize = 16; // AES block size - private const int Iterations = 10000; - private static readonly byte[] Salt = Encoding.ASCII.GetBytes("saltysalt".PadRight(16, ' ')); // google浏览器默认盐值 - private static readonly string DefaultPassword = Utils.GetMd5(Utils.GetHomePath() + "AesUtils"); + public class AesUtils + { + private const int KeySize = 256; // AES-256 + private const int IvSize = 16; // AES block size + private const int Iterations = 10000; + private static readonly byte[] Salt = Encoding.ASCII.GetBytes("saltysalt".PadRight(16, ' ')); // google浏览器默认盐值 + private static readonly string DefaultPassword = Utils.GetMd5(Utils.GetHomePath() + "AesUtils"); - /// - /// Encrypt - /// - /// Plain text - /// Password for key derivation or direct key in ASCII bytes - /// Base64 encoded cipher text with IV - public static string Encrypt(string text, string? password = null) - { - if (string.IsNullOrEmpty(text)) - return string.Empty; + /// + /// Encrypt + /// + /// Plain text + /// Password for key derivation or direct key in ASCII bytes + /// Base64 encoded cipher text with IV + public static string Encrypt(string text, string? password = null) + { + if (string.IsNullOrEmpty(text)) + return string.Empty; - var plaintext = Encoding.UTF8.GetBytes(text); - var key = GetKey(password); - var iv = GenerateIv(); + var plaintext = Encoding.UTF8.GetBytes(text); + var key = GetKey(password); + var iv = GenerateIv(); - using var aes = Aes.Create(); - aes.Key = key; - aes.IV = iv; + using var aes = Aes.Create(); + aes.Key = key; + aes.IV = iv; - using var ms = new MemoryStream(); - ms.Write(iv, 0, iv.Length); + using var ms = new MemoryStream(); + ms.Write(iv, 0, iv.Length); - using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) - { - cs.Write(plaintext, 0, plaintext.Length); - cs.FlushFinalBlock(); - } + using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)) + { + cs.Write(plaintext, 0, plaintext.Length); + cs.FlushFinalBlock(); + } - var cipherTextWithIv = ms.ToArray(); - return Convert.ToBase64String(cipherTextWithIv); - } + var cipherTextWithIv = ms.ToArray(); + return Convert.ToBase64String(cipherTextWithIv); + } - /// - /// Decrypt - /// - /// Base64 encoded cipher text with IV - /// Password for key derivation or direct key in ASCII bytes - /// Plain text - public static string Decrypt(string cipherTextWithIv, string? password = null) - { - if (string.IsNullOrEmpty(cipherTextWithIv)) - return string.Empty; + /// + /// Decrypt + /// + /// Base64 encoded cipher text with IV + /// Password for key derivation or direct key in ASCII bytes + /// Plain text + public static string Decrypt(string cipherTextWithIv, string? password = null) + { + if (string.IsNullOrEmpty(cipherTextWithIv)) + return string.Empty; - var cipherTextWithIvBytes = Convert.FromBase64String(cipherTextWithIv); - var key = GetKey(password); + var cipherTextWithIvBytes = Convert.FromBase64String(cipherTextWithIv); + var key = GetKey(password); - var iv = new byte[IvSize]; - Buffer.BlockCopy(cipherTextWithIvBytes, 0, iv, 0, IvSize); + var iv = new byte[IvSize]; + Buffer.BlockCopy(cipherTextWithIvBytes, 0, iv, 0, IvSize); - var cipherText = new byte[cipherTextWithIvBytes.Length - IvSize]; - Buffer.BlockCopy(cipherTextWithIvBytes, IvSize, cipherText, 0, cipherText.Length); + var cipherText = new byte[cipherTextWithIvBytes.Length - IvSize]; + Buffer.BlockCopy(cipherTextWithIvBytes, IvSize, cipherText, 0, cipherText.Length); - using var aes = Aes.Create(); - aes.Key = key; - aes.IV = iv; + using var aes = Aes.Create(); + aes.Key = key; + aes.IV = iv; - using var ms = new MemoryStream(); - using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write)) - { - cs.Write(cipherText, 0, cipherText.Length); - cs.FlushFinalBlock(); - } + using var ms = new MemoryStream(); + using (var cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write)) + { + cs.Write(cipherText, 0, cipherText.Length); + cs.FlushFinalBlock(); + } - var plainText = ms.ToArray(); - return Encoding.UTF8.GetString(plainText); - } + var plainText = ms.ToArray(); + return Encoding.UTF8.GetString(plainText); + } - private static byte[] GetKey(string? password) - { - if (password.IsNullOrEmpty()) - { - password = DefaultPassword; - } + private static byte[] GetKey(string? password) + { + if (password.IsNullOrEmpty()) + { + password = DefaultPassword; + } - using var pbkdf2 = new Rfc2898DeriveBytes(password, Salt, Iterations, HashAlgorithmName.SHA256); - return pbkdf2.GetBytes(KeySize / 8); - } + using var pbkdf2 = new Rfc2898DeriveBytes(password, Salt, Iterations, HashAlgorithmName.SHA256); + return pbkdf2.GetBytes(KeySize / 8); + } - private static byte[] GenerateIv() - { - var randomNumber = new byte[IvSize]; + private static byte[] GenerateIv() + { + var randomNumber = new byte[IvSize]; - using var rng = RandomNumberGenerator.Create(); - rng.GetBytes(randomNumber); - return randomNumber; - } - } -} \ No newline at end of file + using var rng = RandomNumberGenerator.Create(); + rng.GetBytes(randomNumber); + return randomNumber; + } + } +} diff --git a/v2rayN/ServiceLib/Common/DesUtils.cs b/v2rayN/ServiceLib/Common/DesUtils.cs index 132fff65..7cf70b0d 100644 --- a/v2rayN/ServiceLib/Common/DesUtils.cs +++ b/v2rayN/ServiceLib/Common/DesUtils.cs @@ -3,73 +3,73 @@ using System.Text; namespace ServiceLib.Common { - public class DesUtils - { - /// - /// Encrypt - /// - /// - /// /// - /// - public static string Encrypt(string? text, string? key = null) - { - if (text.IsNullOrEmpty()) - { - return string.Empty; - } - GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); - var dsp = DES.Create(); - using var memStream = new MemoryStream(); - using var cryStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIv), CryptoStreamMode.Write); - using var sWriter = new StreamWriter(cryStream); - sWriter.Write(text); - sWriter.Flush(); - cryStream.FlushFinalBlock(); - memStream.Flush(); - return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); - } + public class DesUtils + { + /// + /// Encrypt + /// + /// + /// /// + /// + public static string Encrypt(string? text, string? key = null) + { + if (text.IsNullOrEmpty()) + { + return string.Empty; + } + GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); + var dsp = DES.Create(); + using var memStream = new MemoryStream(); + using var cryStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIv), CryptoStreamMode.Write); + using var sWriter = new StreamWriter(cryStream); + sWriter.Write(text); + sWriter.Flush(); + cryStream.FlushFinalBlock(); + memStream.Flush(); + return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length); + } - /// - /// Decrypt - /// - /// - /// - /// - public static string Decrypt(string? encryptText, string? key = null) - { - if (encryptText.IsNullOrEmpty()) - { - return string.Empty; - } - GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); - var dsp = DES.Create(); - var buffer = Convert.FromBase64String(encryptText); + /// + /// Decrypt + /// + /// + /// + /// + public static string Decrypt(string? encryptText, string? key = null) + { + if (encryptText.IsNullOrEmpty()) + { + return string.Empty; + } + GetKeyIv(key ?? GetDefaultKey(), out var rgbKey, out var rgbIv); + var dsp = DES.Create(); + var buffer = Convert.FromBase64String(encryptText); - using var memStream = new MemoryStream(); - using var cryStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIv), CryptoStreamMode.Write); - cryStream.Write(buffer, 0, buffer.Length); - cryStream.FlushFinalBlock(); - return Encoding.UTF8.GetString(memStream.ToArray()); - } + using var memStream = new MemoryStream(); + using var cryStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIv), CryptoStreamMode.Write); + cryStream.Write(buffer, 0, buffer.Length); + cryStream.FlushFinalBlock(); + return Encoding.UTF8.GetString(memStream.ToArray()); + } - private static void GetKeyIv(string key, out byte[] rgbKey, out byte[] rgbIv) - { - if (key.IsNullOrEmpty()) - { - throw new ArgumentNullException("The key cannot be null"); - } - if (key.Length <= 8) - { - throw new ArgumentNullException("The key length cannot be less than 8 characters."); - } + private static void GetKeyIv(string key, out byte[] rgbKey, out byte[] rgbIv) + { + if (key.IsNullOrEmpty()) + { + throw new ArgumentNullException("The key cannot be null"); + } + if (key.Length <= 8) + { + throw new ArgumentNullException("The key length cannot be less than 8 characters."); + } - rgbKey = Encoding.ASCII.GetBytes(key.Substring(0, 8)); - rgbIv = Encoding.ASCII.GetBytes(key.Insert(0, "w").Substring(0, 8)); - } + rgbKey = Encoding.ASCII.GetBytes(key.Substring(0, 8)); + rgbIv = Encoding.ASCII.GetBytes(key.Insert(0, "w").Substring(0, 8)); + } - private static string GetDefaultKey() - { - return Utils.GetMd5(Utils.GetHomePath() + "DesUtils"); - } - } -} \ No newline at end of file + private static string GetDefaultKey() + { + return Utils.GetMd5(Utils.GetHomePath() + "DesUtils"); + } + } +} diff --git a/v2rayN/ServiceLib/Common/DownloaderHelper.cs b/v2rayN/ServiceLib/Common/DownloaderHelper.cs index 2aaa2371..20126ca8 100644 --- a/v2rayN/ServiceLib/Common/DownloaderHelper.cs +++ b/v2rayN/ServiceLib/Common/DownloaderHelper.cs @@ -1,184 +1,184 @@ -using Downloader; +using Downloader; using System.Net; namespace ServiceLib.Common { - public class DownloaderHelper - { - private static readonly Lazy _instance = new(() => new()); - public static DownloaderHelper Instance => _instance.Value; + public class DownloaderHelper + { + private static readonly Lazy _instance = new(() => new()); + public static DownloaderHelper Instance => _instance.Value; - public async Task DownloadStringAsync(IWebProxy? webProxy, string url, string? userAgent, int timeout) - { - if (Utils.IsNullOrEmpty(url)) - { - return null; - } + public async Task DownloadStringAsync(IWebProxy? webProxy, string url, string? userAgent, int timeout) + { + if (Utils.IsNullOrEmpty(url)) + { + return null; + } - Uri uri = new(url); - //Authorization Header - var headers = new WebHeaderCollection(); - if (Utils.IsNotEmpty(uri.UserInfo)) - { - headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo)); - } + Uri uri = new(url); + //Authorization Header + var headers = new WebHeaderCollection(); + if (Utils.IsNotEmpty(uri.UserInfo)) + { + headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo)); + } - var downloadOpt = new DownloadConfiguration() - { - Timeout = timeout * 1000, - MaxTryAgainOnFailover = 2, - RequestConfiguration = - { - Headers = headers, - UserAgent = userAgent, - Timeout = timeout * 1000, - Proxy = webProxy - } - }; + var downloadOpt = new DownloadConfiguration() + { + Timeout = timeout * 1000, + MaxTryAgainOnFailover = 2, + RequestConfiguration = + { + Headers = headers, + UserAgent = userAgent, + Timeout = timeout * 1000, + Proxy = webProxy + } + }; - await using var downloader = new Downloader.DownloadService(downloadOpt); - downloader.DownloadFileCompleted += (sender, value) => - { - if (value.Error != null) - { - throw value.Error; - } - }; + await using var downloader = new Downloader.DownloadService(downloadOpt); + downloader.DownloadFileCompleted += (sender, value) => + { + if (value.Error != null) + { + throw value.Error; + } + }; - using var cts = new CancellationTokenSource(); - await using var stream = await downloader.DownloadFileTaskAsync(address: url, cts.Token).WaitAsync(TimeSpan.FromSeconds(timeout), cts.Token); - using StreamReader reader = new(stream); + using var cts = new CancellationTokenSource(); + await using var stream = await downloader.DownloadFileTaskAsync(address: url, cts.Token).WaitAsync(TimeSpan.FromSeconds(timeout), cts.Token); + using StreamReader reader = new(stream); - downloadOpt = null; + downloadOpt = null; - return await reader.ReadToEndAsync(cts.Token); - } + return await reader.ReadToEndAsync(cts.Token); + } - public async Task DownloadDataAsync4Speed(IWebProxy webProxy, string url, IProgress progress, int timeout) - { - if (Utils.IsNullOrEmpty(url)) - { - throw new ArgumentNullException(nameof(url)); - } + public async Task DownloadDataAsync4Speed(IWebProxy webProxy, string url, IProgress progress, int timeout) + { + if (Utils.IsNullOrEmpty(url)) + { + throw new ArgumentNullException(nameof(url)); + } - var downloadOpt = new DownloadConfiguration() - { - Timeout = timeout * 1000, - MaxTryAgainOnFailover = 2, - RequestConfiguration = - { - Timeout= timeout * 1000, - Proxy = webProxy - } - }; + var downloadOpt = new DownloadConfiguration() + { + Timeout = timeout * 1000, + MaxTryAgainOnFailover = 2, + RequestConfiguration = + { + Timeout= timeout * 1000, + Proxy = webProxy + } + }; - var totalDatetime = DateTime.Now; - var totalSecond = 0; - var hasValue = false; - double maxSpeed = 0; - await using var downloader = new Downloader.DownloadService(downloadOpt); - //downloader.DownloadStarted += (sender, value) => - //{ - // if (progress != null) - // { - // progress.Report("Start download data..."); - // } - //}; - downloader.DownloadProgressChanged += (sender, value) => - { - var ts = (DateTime.Now - totalDatetime); - if (progress != null && ts.Seconds > totalSecond) - { - hasValue = true; - totalSecond = ts.Seconds; - if (value.BytesPerSecondSpeed > maxSpeed) - { - maxSpeed = value.BytesPerSecondSpeed; - var speed = (maxSpeed / 1000 / 1000).ToString("#0.0"); - progress.Report(speed); - } - } - }; - downloader.DownloadFileCompleted += (sender, value) => - { - if (progress != null) - { - if (!hasValue && value.Error != null) - { - progress.Report(value.Error?.Message); - } - } - }; - //progress.Report("......"); - using var cts = new CancellationTokenSource(); - cts.CancelAfter(timeout * 1000); - await using var stream = await downloader.DownloadFileTaskAsync(address: url, cts.Token); + var totalDatetime = DateTime.Now; + var totalSecond = 0; + var hasValue = false; + double maxSpeed = 0; + await using var downloader = new Downloader.DownloadService(downloadOpt); + //downloader.DownloadStarted += (sender, value) => + //{ + // if (progress != null) + // { + // progress.Report("Start download data..."); + // } + //}; + downloader.DownloadProgressChanged += (sender, value) => + { + var ts = (DateTime.Now - totalDatetime); + if (progress != null && ts.Seconds > totalSecond) + { + hasValue = true; + totalSecond = ts.Seconds; + if (value.BytesPerSecondSpeed > maxSpeed) + { + maxSpeed = value.BytesPerSecondSpeed; + var speed = (maxSpeed / 1000 / 1000).ToString("#0.0"); + progress.Report(speed); + } + } + }; + downloader.DownloadFileCompleted += (sender, value) => + { + if (progress != null) + { + if (!hasValue && value.Error != null) + { + progress.Report(value.Error?.Message); + } + } + }; + //progress.Report("......"); + using var cts = new CancellationTokenSource(); + cts.CancelAfter(timeout * 1000); + await using var stream = await downloader.DownloadFileTaskAsync(address: url, cts.Token); - downloadOpt = null; - } + downloadOpt = null; + } - public async Task DownloadFileAsync(IWebProxy? webProxy, string url, string fileName, IProgress progress, int timeout) - { - if (Utils.IsNullOrEmpty(url)) - { - throw new ArgumentNullException(nameof(url)); - } - if (Utils.IsNullOrEmpty(fileName)) - { - throw new ArgumentNullException(nameof(fileName)); - } - if (File.Exists(fileName)) - { - File.Delete(fileName); - } + public async Task DownloadFileAsync(IWebProxy? webProxy, string url, string fileName, IProgress progress, int timeout) + { + if (Utils.IsNullOrEmpty(url)) + { + throw new ArgumentNullException(nameof(url)); + } + if (Utils.IsNullOrEmpty(fileName)) + { + throw new ArgumentNullException(nameof(fileName)); + } + if (File.Exists(fileName)) + { + File.Delete(fileName); + } - var downloadOpt = new DownloadConfiguration() - { - Timeout = timeout * 1000, - MaxTryAgainOnFailover = 2, - RequestConfiguration = - { - Timeout= timeout * 1000, - Proxy = webProxy - } - }; + var downloadOpt = new DownloadConfiguration() + { + Timeout = timeout * 1000, + MaxTryAgainOnFailover = 2, + RequestConfiguration = + { + Timeout= timeout * 1000, + Proxy = webProxy + } + }; - var progressPercentage = 0; - var hasValue = false; - await using var downloader = new Downloader.DownloadService(downloadOpt); - downloader.DownloadStarted += (sender, value) => - { - progress?.Report(0); - }; - downloader.DownloadProgressChanged += (sender, value) => - { - hasValue = true; - var percent = (int)value.ProgressPercentage;// Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); - if (progressPercentage != percent && percent % 10 == 0) - { - progressPercentage = percent; - progress.Report(percent); - } - }; - downloader.DownloadFileCompleted += (sender, value) => - { - if (progress != null) - { - if (hasValue && value.Error == null) - { - progress.Report(101); - } - else if (value.Error != null) - { - throw value.Error; - } - } - }; + var progressPercentage = 0; + var hasValue = false; + await using var downloader = new Downloader.DownloadService(downloadOpt); + downloader.DownloadStarted += (sender, value) => + { + progress?.Report(0); + }; + downloader.DownloadProgressChanged += (sender, value) => + { + hasValue = true; + var percent = (int)value.ProgressPercentage;// Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100); + if (progressPercentage != percent && percent % 10 == 0) + { + progressPercentage = percent; + progress.Report(percent); + } + }; + downloader.DownloadFileCompleted += (sender, value) => + { + if (progress != null) + { + if (hasValue && value.Error == null) + { + progress.Report(101); + } + else if (value.Error != null) + { + throw value.Error; + } + } + }; - using var cts = new CancellationTokenSource(); - await downloader.DownloadFileTaskAsync(url, fileName, cts.Token); + using var cts = new CancellationTokenSource(); + await downloader.DownloadFileTaskAsync(url, fileName, cts.Token); - downloadOpt = null; - } - } -} \ No newline at end of file + downloadOpt = null; + } + } +} diff --git a/v2rayN/ServiceLib/Common/FileManager.cs b/v2rayN/ServiceLib/Common/FileManager.cs index 4431fbea..5131ecfc 100644 --- a/v2rayN/ServiceLib/Common/FileManager.cs +++ b/v2rayN/ServiceLib/Common/FileManager.cs @@ -1,225 +1,225 @@ -using System.Formats.Tar; +using System.Formats.Tar; using System.IO.Compression; using System.Text; namespace ServiceLib.Common { - public static class FileManager - { - private static readonly string _tag = "FileManager"; + public static class FileManager + { + private static readonly string _tag = "FileManager"; - public static bool ByteArrayToFile(string fileName, byte[] content) - { - try - { - File.WriteAllBytes(fileName, content); - return true; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return false; - } + public static bool ByteArrayToFile(string fileName, byte[] content) + { + try + { + File.WriteAllBytes(fileName, content); + return true; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return false; + } - public static void DecompressFile(string fileName, byte[] content) - { - try - { - using var fs = File.Create(fileName); - using GZipStream input = new(new MemoryStream(content), CompressionMode.Decompress, false); - input.CopyTo(fs); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public static void DecompressFile(string fileName, byte[] content) + { + try + { + using var fs = File.Create(fileName); + using GZipStream input = new(new MemoryStream(content), CompressionMode.Decompress, false); + input.CopyTo(fs); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public static void DecompressFile(string fileName, string toPath, string? toName) - { - try - { - FileInfo fileInfo = new(fileName); - using var originalFileStream = fileInfo.OpenRead(); - using var decompressedFileStream = File.Create(toName != null ? Path.Combine(toPath, toName) : toPath); - using GZipStream decompressionStream = new(originalFileStream, CompressionMode.Decompress); - decompressionStream.CopyTo(decompressedFileStream); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public static void DecompressFile(string fileName, string toPath, string? toName) + { + try + { + FileInfo fileInfo = new(fileName); + using var originalFileStream = fileInfo.OpenRead(); + using var decompressedFileStream = File.Create(toName != null ? Path.Combine(toPath, toName) : toPath); + using GZipStream decompressionStream = new(originalFileStream, CompressionMode.Decompress); + decompressionStream.CopyTo(decompressedFileStream); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public static void DecompressTarFile(string fileName, string toPath) - { - try - { - using var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); - using var gz = new GZipStream(fs, CompressionMode.Decompress, leaveOpen: true); - TarFile.ExtractToDirectory(gz, toPath, overwriteFiles: true); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public static void DecompressTarFile(string fileName, string toPath) + { + try + { + using var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); + using var gz = new GZipStream(fs, CompressionMode.Decompress, leaveOpen: true); + TarFile.ExtractToDirectory(gz, toPath, overwriteFiles: true); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public static string NonExclusiveReadAllText(string path) - { - return NonExclusiveReadAllText(path, Encoding.Default); - } + public static string NonExclusiveReadAllText(string path) + { + return NonExclusiveReadAllText(path, Encoding.Default); + } - private static string NonExclusiveReadAllText(string path, Encoding encoding) - { - try - { - using FileStream fs = new(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); - using StreamReader sr = new(fs, encoding); - return sr.ReadToEnd(); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - throw; - } - } + private static string NonExclusiveReadAllText(string path, Encoding encoding) + { + try + { + using FileStream fs = new(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using StreamReader sr = new(fs, encoding); + return sr.ReadToEnd(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + throw; + } + } - public static bool ZipExtractToFile(string fileName, string toPath, string ignoredName) - { - try - { - using var archive = ZipFile.OpenRead(fileName); - foreach (var entry in archive.Entries) - { - if (entry.Length == 0) - { - continue; - } - try - { - if (Utils.IsNotEmpty(ignoredName) && entry.Name.Contains(ignoredName)) - { - continue; - } - entry.ExtractToFile(Path.Combine(toPath, entry.Name), true); - } - catch (IOException ex) - { - Logging.SaveLog(_tag, ex); - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return false; - } - return true; - } + public static bool ZipExtractToFile(string fileName, string toPath, string ignoredName) + { + try + { + using var archive = ZipFile.OpenRead(fileName); + foreach (var entry in archive.Entries) + { + if (entry.Length == 0) + { + continue; + } + try + { + if (Utils.IsNotEmpty(ignoredName) && entry.Name.Contains(ignoredName)) + { + continue; + } + entry.ExtractToFile(Path.Combine(toPath, entry.Name), true); + } + catch (IOException ex) + { + Logging.SaveLog(_tag, ex); + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return false; + } + return true; + } - public static List? GetFilesFromZip(string fileName) - { - if (!File.Exists(fileName)) - { - return null; - } - try - { - using var archive = ZipFile.OpenRead(fileName); - return archive.Entries.Select(entry => entry.FullName).ToList(); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return null; - } - } + public static List? GetFilesFromZip(string fileName) + { + if (!File.Exists(fileName)) + { + return null; + } + try + { + using var archive = ZipFile.OpenRead(fileName); + return archive.Entries.Select(entry => entry.FullName).ToList(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return null; + } + } - public static bool CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName) - { - try - { - if (File.Exists(destinationArchiveFileName)) - { - File.Delete(destinationArchiveFileName); - } + public static bool CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName) + { + try + { + if (File.Exists(destinationArchiveFileName)) + { + File.Delete(destinationArchiveFileName); + } - ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, CompressionLevel.SmallestSize, true); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return false; - } - return true; - } + ZipFile.CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, CompressionLevel.SmallestSize, true); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return false; + } + return true; + } - public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive, bool overwrite, string? ignoredName = null) - { - // Get information about the source directory - var dir = new DirectoryInfo(sourceDir); + public static void CopyDirectory(string sourceDir, string destinationDir, bool recursive, bool overwrite, string? ignoredName = null) + { + // Get information about the source directory + var dir = new DirectoryInfo(sourceDir); - // Check if the source directory exists - if (!dir.Exists) - throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}"); + // Check if the source directory exists + if (!dir.Exists) + throw new DirectoryNotFoundException($"Source directory not found: {dir.FullName}"); - // Cache directories before we start copying - var dirs = dir.GetDirectories(); + // Cache directories before we start copying + var dirs = dir.GetDirectories(); - // Create the destination directory - Directory.CreateDirectory(destinationDir); + // Create the destination directory + Directory.CreateDirectory(destinationDir); - // Get the files in the source directory and copy to the destination directory - foreach (var file in dir.GetFiles()) - { - if (Utils.IsNotEmpty(ignoredName) && file.Name.Contains(ignoredName)) - { - continue; - } - if (file.Extension == file.Name) - { - continue; - } - var targetFilePath = Path.Combine(destinationDir, file.Name); - if (!overwrite && File.Exists(targetFilePath)) - { - continue; - } - file.CopyTo(targetFilePath, overwrite); - } + // Get the files in the source directory and copy to the destination directory + foreach (var file in dir.GetFiles()) + { + if (Utils.IsNotEmpty(ignoredName) && file.Name.Contains(ignoredName)) + { + continue; + } + if (file.Extension == file.Name) + { + continue; + } + var targetFilePath = Path.Combine(destinationDir, file.Name); + if (!overwrite && File.Exists(targetFilePath)) + { + continue; + } + file.CopyTo(targetFilePath, overwrite); + } - // If recursive and copying subdirectories, recursively call this method - if (recursive) - { - foreach (var subDir in dirs) - { - var newDestinationDir = Path.Combine(destinationDir, subDir.Name); - CopyDirectory(subDir.FullName, newDestinationDir, true, overwrite, ignoredName); - } - } - } + // If recursive and copying subdirectories, recursively call this method + if (recursive) + { + foreach (var subDir in dirs) + { + var newDestinationDir = Path.Combine(destinationDir, subDir.Name); + CopyDirectory(subDir.FullName, newDestinationDir, true, overwrite, ignoredName); + } + } + } - public static void DeleteExpiredFiles(string sourceDir, DateTime dtLine) - { - try - { - var files = Directory.GetFiles(sourceDir, "*.*"); - foreach (var filePath in files) - { - var file = new FileInfo(filePath); - if (file.CreationTime >= dtLine) - { - continue; - } - file.Delete(); - } - } - catch - { - // ignored - } - } - } -} \ No newline at end of file + public static void DeleteExpiredFiles(string sourceDir, DateTime dtLine) + { + try + { + var files = Directory.GetFiles(sourceDir, "*.*"); + foreach (var filePath in files) + { + var file = new FileInfo(filePath); + if (file.CreationTime >= dtLine) + { + continue; + } + file.Delete(); + } + } + catch + { + // ignored + } + } + } +} diff --git a/v2rayN/ServiceLib/Common/HttpClientHelper.cs b/v2rayN/ServiceLib/Common/HttpClientHelper.cs index 2959875b..4eb768c6 100644 --- a/v2rayN/ServiceLib/Common/HttpClientHelper.cs +++ b/v2rayN/ServiceLib/Common/HttpClientHelper.cs @@ -4,183 +4,188 @@ using System.Text; namespace ServiceLib.Common { - /// - /// - public class HttpClientHelper - { - private static readonly Lazy _instance = new(() => - { - SocketsHttpHandler handler = new() { UseCookies = false }; - HttpClientHelper helper = new(new HttpClient(handler)); - return helper; - }); + /// + /// + public class HttpClientHelper + { + private static readonly Lazy _instance = new(() => + { + SocketsHttpHandler handler = new() { UseCookies = false }; + HttpClientHelper helper = new(new HttpClient(handler)); + return helper; + }); - public static HttpClientHelper Instance => _instance.Value; - private readonly HttpClient httpClient; + public static HttpClientHelper Instance => _instance.Value; + private readonly HttpClient httpClient; - private HttpClientHelper(HttpClient httpClient) => this.httpClient = httpClient; + private HttpClientHelper(HttpClient httpClient) => this.httpClient = httpClient; - public async Task TryGetAsync(string url) - { - if (Utils.IsNullOrEmpty(url)) - return null; + public async Task TryGetAsync(string url) + { + if (Utils.IsNullOrEmpty(url)) + return null; - try - { - var response = await httpClient.GetAsync(url); - return await response.Content.ReadAsStringAsync(); - } - catch - { - return null; - } - } + try + { + var response = await httpClient.GetAsync(url); + return await response.Content.ReadAsStringAsync(); + } + catch + { + return null; + } + } - public async Task GetAsync(string url) - { - if (Utils.IsNullOrEmpty(url)) return null; - return await httpClient.GetStringAsync(url); - } + public async Task GetAsync(string url) + { + if (Utils.IsNullOrEmpty(url)) + return null; + return await httpClient.GetStringAsync(url); + } - public async Task GetAsync(HttpClient client, string url, CancellationToken token = default) - { - if (Utils.IsNullOrEmpty(url)) return null; - return await client.GetStringAsync(url, token); - } + public async Task GetAsync(HttpClient client, string url, CancellationToken token = default) + { + if (Utils.IsNullOrEmpty(url)) + return null; + return await client.GetStringAsync(url, token); + } - public async Task PutAsync(string url, Dictionary headers) - { - var jsonContent = JsonUtils.Serialize(headers); - var content = new StringContent(jsonContent, Encoding.UTF8, MediaTypeNames.Application.Json); + public async Task PutAsync(string url, Dictionary headers) + { + var jsonContent = JsonUtils.Serialize(headers); + var content = new StringContent(jsonContent, Encoding.UTF8, MediaTypeNames.Application.Json); - var result = await httpClient.PutAsync(url, content); - } + var result = await httpClient.PutAsync(url, content); + } - public async Task PatchAsync(string url, Dictionary headers) - { - var myContent = JsonUtils.Serialize(headers); - var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); - var byteContent = new ByteArrayContent(buffer); - byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + public async Task PatchAsync(string url, Dictionary headers) + { + var myContent = JsonUtils.Serialize(headers); + var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); + var byteContent = new ByteArrayContent(buffer); + byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); - await httpClient.PatchAsync(url, byteContent); - } + await httpClient.PatchAsync(url, byteContent); + } - public async Task DeleteAsync(string url) - { - await httpClient.DeleteAsync(url); - } + public async Task DeleteAsync(string url) + { + await httpClient.DeleteAsync(url); + } - public static async Task DownloadFileAsync(HttpClient client, string url, string fileName, IProgress? progress, CancellationToken token = default) - { - ArgumentNullException.ThrowIfNull(url); - ArgumentNullException.ThrowIfNull(fileName); - if (File.Exists(fileName)) File.Delete(fileName); + public static async Task DownloadFileAsync(HttpClient client, string url, string fileName, IProgress? progress, CancellationToken token = default) + { + ArgumentNullException.ThrowIfNull(url); + ArgumentNullException.ThrowIfNull(fileName); + if (File.Exists(fileName)) + File.Delete(fileName); - using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); - if (!response.IsSuccessStatusCode) throw new Exception(response.StatusCode.ToString()); + if (!response.IsSuccessStatusCode) + throw new Exception(response.StatusCode.ToString()); - var total = response.Content.Headers.ContentLength ?? -1L; - var canReportProgress = total != -1 && progress != null; + var total = response.Content.Headers.ContentLength ?? -1L; + var canReportProgress = total != -1 && progress != null; - await using var stream = await response.Content.ReadAsStreamAsync(token); - await using var file = File.Create(fileName); - var totalRead = 0L; - var buffer = new byte[1024 * 1024]; - var progressPercentage = 0; + await using var stream = await response.Content.ReadAsStreamAsync(token); + await using var file = File.Create(fileName); + var totalRead = 0L; + var buffer = new byte[1024 * 1024]; + var progressPercentage = 0; - while (true) - { - token.ThrowIfCancellationRequested(); + while (true) + { + token.ThrowIfCancellationRequested(); - var read = await stream.ReadAsync(buffer, token); - totalRead += read; + var read = await stream.ReadAsync(buffer, token); + totalRead += read; - if (read == 0) break; - await file.WriteAsync(buffer.AsMemory(0, read), token); + if (read == 0) + break; + await file.WriteAsync(buffer.AsMemory(0, read), token); - if (canReportProgress) - { - var percent = (int)(100.0 * totalRead / total); - //if (progressPercentage != percent && percent % 10 == 0) - { - progressPercentage = percent; - progress?.Report(percent); - } - } - } - if (canReportProgress) - { - progress?.Report(101); - } - } + if (canReportProgress) + { + var percent = (int)(100.0 * totalRead / total); + //if (progressPercentage != percent && percent % 10 == 0) + { + progressPercentage = percent; + progress?.Report(percent); + } + } + } + if (canReportProgress) + { + progress?.Report(101); + } + } - public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token = default) - { - if (Utils.IsNullOrEmpty(url)) - { - throw new ArgumentNullException(nameof(url)); - } + public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress progress, CancellationToken token = default) + { + if (Utils.IsNullOrEmpty(url)) + { + throw new ArgumentNullException(nameof(url)); + } - var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); + var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token); - if (!response.IsSuccessStatusCode) - { - throw new Exception(response.StatusCode.ToString()); - } + if (!response.IsSuccessStatusCode) + { + throw new Exception(response.StatusCode.ToString()); + } - //var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; - //var canReportProgress = total != -1 && progress != null; + //var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L; + //var canReportProgress = total != -1 && progress != null; - await using var stream = await response.Content.ReadAsStreamAsync(token); - var totalRead = 0L; - var buffer = new byte[1024 * 64]; - var isMoreToRead = true; - var progressSpeed = string.Empty; - var totalDatetime = DateTime.Now; - var totalSecond = 0; + await using var stream = await response.Content.ReadAsStreamAsync(token); + var totalRead = 0L; + var buffer = new byte[1024 * 64]; + var isMoreToRead = true; + var progressSpeed = string.Empty; + var totalDatetime = DateTime.Now; + var totalSecond = 0; - do - { - if (token.IsCancellationRequested) - { - if (totalRead > 0) - { - return; - } - else - { - token.ThrowIfCancellationRequested(); - } - } + do + { + if (token.IsCancellationRequested) + { + if (totalRead > 0) + { + return; + } + else + { + token.ThrowIfCancellationRequested(); + } + } - var read = await stream.ReadAsync(buffer, token); + var read = await stream.ReadAsync(buffer, token); - if (read == 0) - { - isMoreToRead = false; - } - else - { - var data = new byte[read]; - buffer.ToList().CopyTo(0, data, 0, read); + if (read == 0) + { + isMoreToRead = false; + } + else + { + var data = new byte[read]; + buffer.ToList().CopyTo(0, data, 0, read); - totalRead += read; + totalRead += read; - var ts = (DateTime.Now - totalDatetime); - if (progress != null && ts.Seconds > totalSecond) - { - totalSecond = ts.Seconds; - var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0"); - if (progressSpeed != speed) - { - progressSpeed = speed; - progress.Report(speed); - } - } - } - } while (isMoreToRead); - } - } -} \ No newline at end of file + var ts = DateTime.Now - totalDatetime; + if (progress != null && ts.Seconds > totalSecond) + { + totalSecond = ts.Seconds; + var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0"); + if (progressSpeed != speed) + { + progressSpeed = speed; + progress.Report(speed); + } + } + } + } while (isMoreToRead); + } + } +} diff --git a/v2rayN/ServiceLib/Common/Job.cs b/v2rayN/ServiceLib/Common/Job.cs index 4acf7520..5f82a09c 100644 --- a/v2rayN/ServiceLib/Common/Job.cs +++ b/v2rayN/ServiceLib/Common/Job.cs @@ -1,176 +1,177 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Runtime.InteropServices; namespace ServiceLib.Common { - /* + /* * See: * http://stackoverflow.com/questions/6266820/working-example-of-createjobobject-setinformationjobobject-pinvoke-in-net */ - public sealed class Job : IDisposable - { - private IntPtr handle = IntPtr.Zero; + public sealed class Job : IDisposable + { + private IntPtr handle = IntPtr.Zero; - public Job() - { - handle = CreateJobObject(IntPtr.Zero, null); - IntPtr extendedInfoPtr = IntPtr.Zero; - JOBOBJECT_BASIC_LIMIT_INFORMATION info = new() - { - LimitFlags = 0x2000 - }; + public Job() + { + handle = CreateJobObject(IntPtr.Zero, null); + IntPtr extendedInfoPtr = IntPtr.Zero; + JOBOBJECT_BASIC_LIMIT_INFORMATION info = new() + { + LimitFlags = 0x2000 + }; - JOBOBJECT_EXTENDED_LIMIT_INFORMATION extendedInfo = new() - { - BasicLimitInformation = info - }; + JOBOBJECT_EXTENDED_LIMIT_INFORMATION extendedInfo = new() + { + BasicLimitInformation = info + }; - try - { - int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); - extendedInfoPtr = Marshal.AllocHGlobal(length); - Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); + try + { + int length = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); + extendedInfoPtr = Marshal.AllocHGlobal(length); + Marshal.StructureToPtr(extendedInfo, extendedInfoPtr, false); - if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, - (uint)length)) - throw new Exception(string.Format("Unable to set information. Error: {0}", - Marshal.GetLastWin32Error())); - } - finally - { - if (extendedInfoPtr != IntPtr.Zero) - { - Marshal.FreeHGlobal(extendedInfoPtr); - } - } - } + if (!SetInformationJobObject(handle, JobObjectInfoType.ExtendedLimitInformation, extendedInfoPtr, + (uint)length)) + throw new Exception(string.Format("Unable to set information. Error: {0}", + Marshal.GetLastWin32Error())); + } + finally + { + if (extendedInfoPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(extendedInfoPtr); + } + } + } - public bool AddProcess(IntPtr processHandle) - { - bool succ = AssignProcessToJobObject(handle, processHandle); + public bool AddProcess(IntPtr processHandle) + { + bool succ = AssignProcessToJobObject(handle, processHandle); - if (!succ) - { - Logging.SaveLog("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); - } + if (!succ) + { + Logging.SaveLog("Failed to call AssignProcessToJobObject! GetLastError=" + Marshal.GetLastWin32Error()); + } - return succ; - } + return succ; + } - public bool AddProcess(int processId) - { - return AddProcess(Process.GetProcessById(processId).Handle); - } + public bool AddProcess(int processId) + { + return AddProcess(Process.GetProcessById(processId).Handle); + } - #region IDisposable + #region IDisposable - private bool disposed; + private bool disposed; - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } - private void Dispose(bool disposing) - { - if (disposed) return; - disposed = true; + private void Dispose(bool disposing) + { + if (disposed) + return; + disposed = true; - if (disposing) - { - // no managed objects to free - } + if (disposing) + { + // no managed objects to free + } - if (handle != IntPtr.Zero) - { - CloseHandle(handle); - handle = IntPtr.Zero; - } - } + if (handle != IntPtr.Zero) + { + CloseHandle(handle); + handle = IntPtr.Zero; + } + } - ~Job() - { - Dispose(false); - } + ~Job() + { + Dispose(false); + } - #endregion IDisposable + #endregion IDisposable - #region Interop + #region Interop - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - private static extern IntPtr CreateJobObject(IntPtr a, string? lpName); + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + private static extern IntPtr CreateJobObject(IntPtr a, string? lpName); - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength); - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process); - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool CloseHandle(IntPtr hObject); + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool CloseHandle(IntPtr hObject); - #endregion Interop - } + #endregion Interop + } - #region Helper classes + #region Helper classes - [StructLayout(LayoutKind.Sequential)] - internal struct IO_COUNTERS - { - public UInt64 ReadOperationCount; - public UInt64 WriteOperationCount; - public UInt64 OtherOperationCount; - public UInt64 ReadTransferCount; - public UInt64 WriteTransferCount; - public UInt64 OtherTransferCount; - } + [StructLayout(LayoutKind.Sequential)] + internal struct IO_COUNTERS + { + public UInt64 ReadOperationCount; + public UInt64 WriteOperationCount; + public UInt64 OtherOperationCount; + public UInt64 ReadTransferCount; + public UInt64 WriteTransferCount; + public UInt64 OtherTransferCount; + } - [StructLayout(LayoutKind.Sequential)] - internal struct JOBOBJECT_BASIC_LIMIT_INFORMATION - { - public Int64 PerProcessUserTimeLimit; - public Int64 PerJobUserTimeLimit; - public UInt32 LimitFlags; - public UIntPtr MinimumWorkingSetSize; - public UIntPtr MaximumWorkingSetSize; - public UInt32 ActiveProcessLimit; - public UIntPtr Affinity; - public UInt32 PriorityClass; - public UInt32 SchedulingClass; - } + [StructLayout(LayoutKind.Sequential)] + internal struct JOBOBJECT_BASIC_LIMIT_INFORMATION + { + public Int64 PerProcessUserTimeLimit; + public Int64 PerJobUserTimeLimit; + public UInt32 LimitFlags; + public UIntPtr MinimumWorkingSetSize; + public UIntPtr MaximumWorkingSetSize; + public UInt32 ActiveProcessLimit; + public UIntPtr Affinity; + public UInt32 PriorityClass; + public UInt32 SchedulingClass; + } - [StructLayout(LayoutKind.Sequential)] - public struct SECURITY_ATTRIBUTES - { - public UInt32 nLength; - public IntPtr lpSecurityDescriptor; - public Int32 bInheritHandle; - } + [StructLayout(LayoutKind.Sequential)] + public struct SECURITY_ATTRIBUTES + { + public UInt32 nLength; + public IntPtr lpSecurityDescriptor; + public Int32 bInheritHandle; + } - [StructLayout(LayoutKind.Sequential)] - internal struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION - { - public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; - public IO_COUNTERS IoInfo; - public UIntPtr ProcessMemoryLimit; - public UIntPtr JobMemoryLimit; - public UIntPtr PeakProcessMemoryUsed; - public UIntPtr PeakJobMemoryUsed; - } + [StructLayout(LayoutKind.Sequential)] + internal struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION + { + public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; + public IO_COUNTERS IoInfo; + public UIntPtr ProcessMemoryLimit; + public UIntPtr JobMemoryLimit; + public UIntPtr PeakProcessMemoryUsed; + public UIntPtr PeakJobMemoryUsed; + } - public enum JobObjectInfoType - { - AssociateCompletionPortInformation = 7, - BasicLimitInformation = 2, - BasicUIRestrictions = 4, - EndOfJobTimeInformation = 6, - ExtendedLimitInformation = 9, - SecurityLimitInformation = 5, - GroupInformation = 11 - } + public enum JobObjectInfoType + { + AssociateCompletionPortInformation = 7, + BasicLimitInformation = 2, + BasicUIRestrictions = 4, + EndOfJobTimeInformation = 6, + ExtendedLimitInformation = 9, + SecurityLimitInformation = 5, + GroupInformation = 11 + } - #endregion Helper classes -} \ No newline at end of file + #endregion Helper classes +} diff --git a/v2rayN/ServiceLib/Common/JsonUtils.cs b/v2rayN/ServiceLib/Common/JsonUtils.cs index 7d427f74..2c66b429 100644 --- a/v2rayN/ServiceLib/Common/JsonUtils.cs +++ b/v2rayN/ServiceLib/Common/JsonUtils.cs @@ -1,131 +1,131 @@ -using System.Text.Json; +using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; namespace ServiceLib.Common { - public class JsonUtils - { - private static readonly string _tag = "JsonUtils"; + public class JsonUtils + { + private static readonly string _tag = "JsonUtils"; - /// - /// DeepCopy - /// - /// - /// - /// - public static T DeepCopy(T obj) - { - return Deserialize(Serialize(obj, false))!; - } + /// + /// DeepCopy + /// + /// + /// + /// + public static T DeepCopy(T obj) + { + return Deserialize(Serialize(obj, false))!; + } - /// - /// Deserialize to object - /// - /// - /// - /// - public static T? Deserialize(string? strJson) - { - try - { - if (string.IsNullOrWhiteSpace(strJson)) - { - return default; - } - var options = new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - }; - return JsonSerializer.Deserialize(strJson, options); - } - catch - { - return default; - } - } + /// + /// Deserialize to object + /// + /// + /// + /// + public static T? Deserialize(string? strJson) + { + try + { + if (string.IsNullOrWhiteSpace(strJson)) + { + return default; + } + var options = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + return JsonSerializer.Deserialize(strJson, options); + } + catch + { + return default; + } + } - /// - /// parse - /// - /// - /// - public static JsonNode? ParseJson(string strJson) - { - try - { - if (string.IsNullOrWhiteSpace(strJson)) - { - return null; - } - return JsonNode.Parse(strJson); - } - catch - { - //SaveLog(ex.Message, ex); - return null; - } - } + /// + /// parse + /// + /// + /// + public static JsonNode? ParseJson(string strJson) + { + try + { + if (string.IsNullOrWhiteSpace(strJson)) + { + return null; + } + return JsonNode.Parse(strJson); + } + catch + { + //SaveLog(ex.Message, ex); + return null; + } + } - /// - /// Serialize Object to Json string - /// - /// - /// - /// - /// - public static string Serialize(object? obj, bool indented = true, bool nullValue = false) - { - var result = string.Empty; - try - { - if (obj == null) - { - return result; - } - var options = new JsonSerializerOptions - { - WriteIndented = indented, - DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull - }; - result = JsonSerializer.Serialize(obj, options); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return result; - } + /// + /// Serialize Object to Json string + /// + /// + /// + /// + /// + public static string Serialize(object? obj, bool indented = true, bool nullValue = false) + { + var result = string.Empty; + try + { + if (obj == null) + { + return result; + } + var options = new JsonSerializerOptions + { + WriteIndented = indented, + DefaultIgnoreCondition = nullValue ? JsonIgnoreCondition.Never : JsonIgnoreCondition.WhenWritingNull + }; + result = JsonSerializer.Serialize(obj, options); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return result; + } - /// - /// Serialize Object to Json string - /// - /// - /// - /// - public static string Serialize(object? obj, JsonSerializerOptions options) - { - var result = string.Empty; - try - { - if (obj == null) - { - return result; - } - result = JsonSerializer.Serialize(obj, options); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return result; - } + /// + /// Serialize Object to Json string + /// + /// + /// + /// + public static string Serialize(object? obj, JsonSerializerOptions options) + { + var result = string.Empty; + try + { + if (obj == null) + { + return result; + } + result = JsonSerializer.Serialize(obj, options); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return result; + } - /// - /// SerializeToNode - /// - /// - /// - public static JsonNode? SerializeToNode(object? obj) => JsonSerializer.SerializeToNode(obj); - } -} \ No newline at end of file + /// + /// SerializeToNode + /// + /// + /// + public static JsonNode? SerializeToNode(object? obj) => JsonSerializer.SerializeToNode(obj); + } +} diff --git a/v2rayN/ServiceLib/Common/Logging.cs b/v2rayN/ServiceLib/Common/Logging.cs index 7031260f..365eab41 100644 --- a/v2rayN/ServiceLib/Common/Logging.cs +++ b/v2rayN/ServiceLib/Common/Logging.cs @@ -1,48 +1,50 @@ -using NLog; +using NLog; using NLog.Config; using NLog.Targets; namespace ServiceLib.Common { - public class Logging - { - public static void Setup() - { - LoggingConfiguration config = new(); - FileTarget fileTarget = new(); - config.AddTarget("file", fileTarget); - fileTarget.Layout = "${longdate}-${level:uppercase=true} ${message}"; - fileTarget.FileName = Utils.GetLogPath("${shortdate}.txt"); - config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget)); - LogManager.Configuration = config; - } + public class Logging + { + public static void Setup() + { + LoggingConfiguration config = new(); + FileTarget fileTarget = new(); + config.AddTarget("file", fileTarget); + fileTarget.Layout = "${longdate}-${level:uppercase=true} ${message}"; + fileTarget.FileName = Utils.GetLogPath("${shortdate}.txt"); + config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget)); + LogManager.Configuration = config; + } - public static void LoggingEnabled(bool enable) - { - if (!enable) - { - LogManager.SuspendLogging(); - } - } + public static void LoggingEnabled(bool enable) + { + if (!enable) + { + LogManager.SuspendLogging(); + } + } - public static void SaveLog(string strContent) - { - if (!LogManager.IsLoggingEnabled()) return; + public static void SaveLog(string strContent) + { + if (!LogManager.IsLoggingEnabled()) + return; - LogManager.GetLogger("Log1").Info(strContent); - } + LogManager.GetLogger("Log1").Info(strContent); + } - public static void SaveLog(string strTitle, Exception ex) - { - if (!LogManager.IsLoggingEnabled()) return; + public static void SaveLog(string strTitle, Exception ex) + { + if (!LogManager.IsLoggingEnabled()) + return; - var logger = LogManager.GetLogger("Log2"); - logger.Debug($"{strTitle},{ex.Message}"); - logger.Debug(ex.StackTrace); - if (ex?.InnerException != null) - { - logger.Error(ex.InnerException); - } - } - } -} \ No newline at end of file + var logger = LogManager.GetLogger("Log2"); + logger.Debug($"{strTitle},{ex.Message}"); + logger.Debug(ex.StackTrace); + if (ex?.InnerException != null) + { + logger.Error(ex.InnerException); + } + } + } +} diff --git a/v2rayN/ServiceLib/Common/ProcUtils.cs b/v2rayN/ServiceLib/Common/ProcUtils.cs index b58ca41c..d82d4ebb 100644 --- a/v2rayN/ServiceLib/Common/ProcUtils.cs +++ b/v2rayN/ServiceLib/Common/ProcUtils.cs @@ -4,136 +4,147 @@ namespace ServiceLib.Common; public static class ProcUtils { - private static readonly string _tag = "ProcUtils"; + private static readonly string _tag = "ProcUtils"; - public static void ProcessStart(string? fileName, string arguments = "") - { - ProcessStart(fileName, arguments, null); - } + public static void ProcessStart(string? fileName, string arguments = "") + { + ProcessStart(fileName, arguments, null); + } - public static int? ProcessStart(string? fileName, string arguments, string? dir) - { - if (fileName.IsNullOrEmpty()) - { - return null; - } - try - { - if (fileName.Contains(' ')) fileName = fileName.AppendQuotes(); - if (arguments.Contains(' ')) arguments = arguments.AppendQuotes(); + public static int? ProcessStart(string? fileName, string arguments, string? dir) + { + if (fileName.IsNullOrEmpty()) + { + return null; + } + try + { + if (fileName.Contains(' ')) + fileName = fileName.AppendQuotes(); + if (arguments.Contains(' ')) + arguments = arguments.AppendQuotes(); - Process process = new() - { - StartInfo = new ProcessStartInfo - { - UseShellExecute = true, - FileName = fileName, - Arguments = arguments, - WorkingDirectory = dir - } - }; - process.Start(); - return process.Id; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return null; - } + Process process = new() + { + StartInfo = new ProcessStartInfo + { + UseShellExecute = true, + FileName = fileName, + Arguments = arguments, + WorkingDirectory = dir + } + }; + process.Start(); + return process.Id; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return null; + } - public static void RebootAsAdmin(bool blAdmin = true) - { - try - { - ProcessStartInfo startInfo = new() - { - UseShellExecute = true, - Arguments = Global.RebootAs, - WorkingDirectory = Utils.StartupPath(), - FileName = Utils.GetExePath().AppendQuotes(), - Verb = blAdmin ? "runas" : null, - }; - Process.Start(startInfo); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public static void RebootAsAdmin(bool blAdmin = true) + { + try + { + ProcessStartInfo startInfo = new() + { + UseShellExecute = true, + Arguments = Global.RebootAs, + WorkingDirectory = Utils.StartupPath(), + FileName = Utils.GetExePath().AppendQuotes(), + Verb = blAdmin ? "runas" : null, + }; + Process.Start(startInfo); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public static async Task ProcessKill(int pid) - { - try - { - await ProcessKill(Process.GetProcessById(pid), false); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public static async Task ProcessKill(int pid) + { + try + { + await ProcessKill(Process.GetProcessById(pid), false); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public static async Task ProcessKill(Process? proc, bool review) - { - if (proc is null) - { - return; - } + public static async Task ProcessKill(Process? proc, bool review) + { + if (proc is null) + { + return; + } - GetProcessKeyInfo(proc, review, out var procId, out var fileName, out var processName); + GetProcessKeyInfo(proc, review, out var procId, out var fileName, out var processName); - try { proc?.Kill(true); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } - try { proc?.Kill(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } - try { proc?.Close(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } - try { proc?.Dispose(); } catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try + { proc?.Kill(true); } + catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try + { proc?.Kill(); } + catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try + { proc?.Close(); } + catch (Exception ex) { Logging.SaveLog(_tag, ex); } + try + { proc?.Dispose(); } + catch (Exception ex) { Logging.SaveLog(_tag, ex); } - await Task.Delay(300); - await ProcessKillByKeyInfo(review, procId, fileName, processName); - } + await Task.Delay(300); + await ProcessKillByKeyInfo(review, procId, fileName, processName); + } - private static void GetProcessKeyInfo(Process? proc, bool review, out int? procId, out string? fileName, out string? processName) - { - procId = null; - fileName = null; - processName = null; - if (!review) return; - try - { - procId = proc?.Id; - fileName = proc?.MainModule?.FileName; - processName = proc?.ProcessName; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + private static void GetProcessKeyInfo(Process? proc, bool review, out int? procId, out string? fileName, out string? processName) + { + procId = null; + fileName = null; + processName = null; + if (!review) + return; + try + { + procId = proc?.Id; + fileName = proc?.MainModule?.FileName; + processName = proc?.ProcessName; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - private static async Task ProcessKillByKeyInfo(bool review, int? procId, string? fileName, string? processName) - { - if (review && procId != null && fileName != null) - { - try - { - var lstProc = Process.GetProcessesByName(processName); - foreach (var proc2 in lstProc) - { - if (proc2.Id == procId) - { - Logging.SaveLog($"{_tag}, KillProcess not completing the job, procId"); - await ProcessKill(proc2, false); - } - if (proc2.MainModule != null && proc2.MainModule?.FileName == fileName) - { - Logging.SaveLog($"{_tag}, KillProcess not completing the job, fileName"); - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } - } -} \ No newline at end of file + private static async Task ProcessKillByKeyInfo(bool review, int? procId, string? fileName, string? processName) + { + if (review && procId != null && fileName != null) + { + try + { + var lstProc = Process.GetProcessesByName(processName); + foreach (var proc2 in lstProc) + { + if (proc2.Id == procId) + { + Logging.SaveLog($"{_tag}, KillProcess not completing the job, procId"); + await ProcessKill(proc2, false); + } + if (proc2.MainModule != null && proc2.MainModule?.FileName == fileName) + { + Logging.SaveLog($"{_tag}, KillProcess not completing the job, fileName"); + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } + } +} diff --git a/v2rayN/ServiceLib/Common/QRCodeHelper.cs b/v2rayN/ServiceLib/Common/QRCodeHelper.cs index 7a024a3e..b65c93af 100644 --- a/v2rayN/ServiceLib/Common/QRCodeHelper.cs +++ b/v2rayN/ServiceLib/Common/QRCodeHelper.cs @@ -1,90 +1,90 @@ -using QRCoder; +using QRCoder; using SkiaSharp; using ZXing.SkiaSharp; namespace ServiceLib.Common { - public class QRCodeHelper - { - public static byte[]? GenQRCode(string? url) - { - using QRCodeGenerator qrGenerator = new(); - using var qrCodeData = qrGenerator.CreateQrCode(url ?? string.Empty, QRCodeGenerator.ECCLevel.Q); - using PngByteQRCode qrCode = new(qrCodeData); - return qrCode.GetGraphic(20); - } + public class QRCodeHelper + { + public static byte[]? GenQRCode(string? url) + { + using QRCodeGenerator qrGenerator = new(); + using var qrCodeData = qrGenerator.CreateQrCode(url ?? string.Empty, QRCodeGenerator.ECCLevel.Q); + using PngByteQRCode qrCode = new(qrCodeData); + return qrCode.GetGraphic(20); + } - public static string? ParseBarcode(string? fileName) - { - if (fileName == null || !File.Exists(fileName)) - { - return null; - } + public static string? ParseBarcode(string? fileName) + { + if (fileName == null || !File.Exists(fileName)) + { + return null; + } - try - { - var image = SKImage.FromEncodedData(fileName); - var bitmap = SKBitmap.FromImage(image); + try + { + var image = SKImage.FromEncodedData(fileName); + var bitmap = SKBitmap.FromImage(image); - return ReaderBarcode(bitmap); - } - catch - { - // ignored - } + return ReaderBarcode(bitmap); + } + catch + { + // ignored + } - return null; - } + return null; + } - public static string? ParseBarcode(byte[]? bytes) - { - try - { - var bitmap = SKBitmap.Decode(bytes); - //using var stream = new FileStream("test2.png", FileMode.Create, FileAccess.Write); - //using var image = SKImage.FromBitmap(bitmap); - //using var encodedImage = image.Encode(); - //encodedImage.SaveTo(stream); - return ReaderBarcode(bitmap); - } - catch - { - // ignored - } + public static string? ParseBarcode(byte[]? bytes) + { + try + { + var bitmap = SKBitmap.Decode(bytes); + //using var stream = new FileStream("test2.png", FileMode.Create, FileAccess.Write); + //using var image = SKImage.FromBitmap(bitmap); + //using var encodedImage = image.Encode(); + //encodedImage.SaveTo(stream); + return ReaderBarcode(bitmap); + } + catch + { + // ignored + } - return null; - } + return null; + } - private static string? ReaderBarcode(SKBitmap? bitmap) - { - var reader = new BarcodeReader(); - var result = reader.Decode(bitmap); + private static string? ReaderBarcode(SKBitmap? bitmap) + { + var reader = new BarcodeReader(); + var result = reader.Decode(bitmap); - if (result != null && Utils.IsNotEmpty(result.Text)) - { - return result.Text; - } + if (result != null && Utils.IsNotEmpty(result.Text)) + { + return result.Text; + } - //FlipBitmap - var result2 = reader.Decode(FlipBitmap(bitmap)); - return result2?.Text; - } + //FlipBitmap + var result2 = reader.Decode(FlipBitmap(bitmap)); + return result2?.Text; + } - private static SKBitmap FlipBitmap(SKBitmap bmp) - { - // Create a bitmap (to return) - var flipped = new SKBitmap(bmp.Width, bmp.Height, bmp.Info.ColorType, bmp.Info.AlphaType); + private static SKBitmap FlipBitmap(SKBitmap bmp) + { + // Create a bitmap (to return) + var flipped = new SKBitmap(bmp.Width, bmp.Height, bmp.Info.ColorType, bmp.Info.AlphaType); - // Create a canvas to draw into the bitmap - using var canvas = new SKCanvas(flipped); + // Create a canvas to draw into the bitmap + using var canvas = new SKCanvas(flipped); - // Set a transform matrix which moves the bitmap to the right, - // and then "scales" it by -1, which just flips the pixels - // horizontally - canvas.Translate(bmp.Width, 0); - canvas.Scale(-1, 1); - canvas.DrawBitmap(bmp, 0, 0); - return flipped; - } - } -} \ No newline at end of file + // Set a transform matrix which moves the bitmap to the right, + // and then "scales" it by -1, which just flips the pixels + // horizontally + canvas.Translate(bmp.Width, 0); + canvas.Scale(-1, 1); + canvas.DrawBitmap(bmp, 0, 0); + return flipped; + } + } +} diff --git a/v2rayN/ServiceLib/Common/SemanticVersion.cs b/v2rayN/ServiceLib/Common/SemanticVersion.cs index 0a5bd5b9..2ee8922f 100644 --- a/v2rayN/ServiceLib/Common/SemanticVersion.cs +++ b/v2rayN/ServiceLib/Common/SemanticVersion.cs @@ -1,187 +1,187 @@ -namespace ServiceLib.Common +namespace ServiceLib.Common { - public class SemanticVersion - { - private int major; - private int minor; - private int patch; - private string version; + public class SemanticVersion + { + private int major; + private int minor; + private int patch; + private string version; - public SemanticVersion(int major, int minor, int patch) - { - this.major = major; - this.minor = minor; - this.patch = patch; - this.version = $"{major}.{minor}.{patch}"; - } + public SemanticVersion(int major, int minor, int patch) + { + this.major = major; + this.minor = minor; + this.patch = patch; + this.version = $"{major}.{minor}.{patch}"; + } - public SemanticVersion(string? version) - { - try - { - if (version.IsNullOrEmpty()) - { - this.major = 0; - this.minor = 0; - this.patch = 0; - return; - } - this.version = version.RemovePrefix('v'); + public SemanticVersion(string? version) + { + try + { + if (version.IsNullOrEmpty()) + { + this.major = 0; + this.minor = 0; + this.patch = 0; + return; + } + this.version = version.RemovePrefix('v'); - var parts = this.version.Split('.'); - if (parts.Length == 2) - { - this.major = int.Parse(parts.First()); - this.minor = int.Parse(parts.Last()); - this.patch = 0; - } - else if (parts.Length is 3 or 4) - { - this.major = int.Parse(parts[0]); - this.minor = int.Parse(parts[1]); - this.patch = int.Parse(parts[2]); - } - else - { - throw new ArgumentException("Invalid version string"); - } - } - catch - { - this.major = 0; - this.minor = 0; - this.patch = 0; - } - } + var parts = this.version.Split('.'); + if (parts.Length == 2) + { + this.major = int.Parse(parts.First()); + this.minor = int.Parse(parts.Last()); + this.patch = 0; + } + else if (parts.Length is 3 or 4) + { + this.major = int.Parse(parts[0]); + this.minor = int.Parse(parts[1]); + this.patch = int.Parse(parts[2]); + } + else + { + throw new ArgumentException("Invalid version string"); + } + } + catch + { + this.major = 0; + this.minor = 0; + this.patch = 0; + } + } - public override bool Equals(object? obj) - { - if (obj is SemanticVersion other) - { - return this.major == other.major && this.minor == other.minor && this.patch == other.patch; - } - else - { - return false; - } - } + public override bool Equals(object? obj) + { + if (obj is SemanticVersion other) + { + return this.major == other.major && this.minor == other.minor && this.patch == other.patch; + } + else + { + return false; + } + } - public override int GetHashCode() - { - return this.major.GetHashCode() ^ this.minor.GetHashCode() ^ this.patch.GetHashCode(); - } + public override int GetHashCode() + { + return this.major.GetHashCode() ^ this.minor.GetHashCode() ^ this.patch.GetHashCode(); + } - /// - /// Use ToVersionString(string? prefix) instead if possible. - /// - /// major.minor.patch - public override string ToString() - { - return this.version; - } + /// + /// Use ToVersionString(string? prefix) instead if possible. + /// + /// major.minor.patch + public override string ToString() + { + return this.version; + } - public string ToVersionString(string? prefix = null) - { - if (prefix == null) - { - return this.version; - } - else - { - return $"{prefix}{this.version}"; - } - } + public string ToVersionString(string? prefix = null) + { + if (prefix == null) + { + return this.version; + } + else + { + return $"{prefix}{this.version}"; + } + } - public static bool operator ==(SemanticVersion v1, SemanticVersion v2) - { return v1.Equals(v2); } + public static bool operator ==(SemanticVersion v1, SemanticVersion v2) + { return v1.Equals(v2); } - public static bool operator !=(SemanticVersion v1, SemanticVersion v2) - { return !v1.Equals(v2); } + public static bool operator !=(SemanticVersion v1, SemanticVersion v2) + { return !v1.Equals(v2); } - public static bool operator >=(SemanticVersion v1, SemanticVersion v2) - { return v1.GreaterEquals(v2); } + public static bool operator >=(SemanticVersion v1, SemanticVersion v2) + { return v1.GreaterEquals(v2); } - public static bool operator <=(SemanticVersion v1, SemanticVersion v2) - { return v1.LessEquals(v2); } + public static bool operator <=(SemanticVersion v1, SemanticVersion v2) + { return v1.LessEquals(v2); } - #region Private + #region Private - private bool GreaterEquals(SemanticVersion other) - { - if (this.major < other.major) - { - return false; - } - else if (this.major > other.major) - { - return true; - } - else - { - if (this.minor < other.minor) - { - return false; - } - else if (this.minor > other.minor) - { - return true; - } - else - { - if (this.patch < other.patch) - { - return false; - } - else if (this.patch > other.patch) - { - return true; - } - else - { - return true; - } - } - } - } + private bool GreaterEquals(SemanticVersion other) + { + if (this.major < other.major) + { + return false; + } + else if (this.major > other.major) + { + return true; + } + else + { + if (this.minor < other.minor) + { + return false; + } + else if (this.minor > other.minor) + { + return true; + } + else + { + if (this.patch < other.patch) + { + return false; + } + else if (this.patch > other.patch) + { + return true; + } + else + { + return true; + } + } + } + } - private bool LessEquals(SemanticVersion other) - { - if (this.major < other.major) - { - return true; - } - else if (this.major > other.major) - { - return false; - } - else - { - if (this.minor < other.minor) - { - return true; - } - else if (this.minor > other.minor) - { - return false; - } - else - { - if (this.patch < other.patch) - { - return true; - } - else if (this.patch > other.patch) - { - return false; - } - else - { - return true; - } - } - } - } + private bool LessEquals(SemanticVersion other) + { + if (this.major < other.major) + { + return true; + } + else if (this.major > other.major) + { + return false; + } + else + { + if (this.minor < other.minor) + { + return true; + } + else if (this.minor > other.minor) + { + return false; + } + else + { + if (this.patch < other.patch) + { + return true; + } + else if (this.patch > other.patch) + { + return false; + } + else + { + return true; + } + } + } + } - #endregion Private - } -} \ No newline at end of file + #endregion Private + } +} diff --git a/v2rayN/ServiceLib/Common/SqliteHelper.cs b/v2rayN/ServiceLib/Common/SqliteHelper.cs index 3a8946bf..6195ed57 100644 --- a/v2rayN/ServiceLib/Common/SqliteHelper.cs +++ b/v2rayN/ServiceLib/Common/SqliteHelper.cs @@ -1,91 +1,91 @@ -using SQLite; using System.Collections; +using SQLite; namespace ServiceLib.Common { - public sealed class SQLiteHelper - { - private static readonly Lazy _instance = new(() => new()); - public static SQLiteHelper Instance => _instance.Value; - private string _connstr; - private SQLiteConnection _db; - private SQLiteAsyncConnection _dbAsync; - private readonly string _configDB = "guiNDB.db"; + public sealed class SQLiteHelper + { + private static readonly Lazy _instance = new(() => new()); + public static SQLiteHelper Instance => _instance.Value; + private string _connstr; + private SQLiteConnection _db; + private SQLiteAsyncConnection _dbAsync; + private readonly string _configDB = "guiNDB.db"; - public SQLiteHelper() - { - _connstr = Utils.GetConfigPath(_configDB); - _db = new SQLiteConnection(_connstr, false); - _dbAsync = new SQLiteAsyncConnection(_connstr, false); - } + public SQLiteHelper() + { + _connstr = Utils.GetConfigPath(_configDB); + _db = new SQLiteConnection(_connstr, false); + _dbAsync = new SQLiteAsyncConnection(_connstr, false); + } - public CreateTableResult CreateTable() - { - return _db.CreateTable(); - } + public CreateTableResult CreateTable() + { + return _db.CreateTable(); + } - public async Task InsertAllAsync(IEnumerable models) - { - return await _dbAsync.InsertAllAsync(models); - } + public async Task InsertAllAsync(IEnumerable models) + { + return await _dbAsync.InsertAllAsync(models); + } - public async Task InsertAsync(object model) - { - return await _dbAsync.InsertAsync(model); - } + public async Task InsertAsync(object model) + { + return await _dbAsync.InsertAsync(model); + } - public async Task ReplaceAsync(object model) - { - return await _dbAsync.InsertOrReplaceAsync(model); - } + public async Task ReplaceAsync(object model) + { + return await _dbAsync.InsertOrReplaceAsync(model); + } - public async Task UpdateAsync(object model) - { - return await _dbAsync.UpdateAsync(model); - } + public async Task UpdateAsync(object model) + { + return await _dbAsync.UpdateAsync(model); + } - public async Task UpdateAllAsync(IEnumerable models) - { - return await _dbAsync.UpdateAllAsync(models); - } + public async Task UpdateAllAsync(IEnumerable models) + { + return await _dbAsync.UpdateAllAsync(models); + } - public async Task DeleteAsync(object model) - { - return await _dbAsync.DeleteAsync(model); - } + public async Task DeleteAsync(object model) + { + return await _dbAsync.DeleteAsync(model); + } - public async Task DeleteAllAsync() - { - return await _dbAsync.DeleteAllAsync(); - } + public async Task DeleteAllAsync() + { + return await _dbAsync.DeleteAllAsync(); + } - public async Task ExecuteAsync(string sql) - { - return await _dbAsync.ExecuteAsync(sql); - } + public async Task ExecuteAsync(string sql) + { + return await _dbAsync.ExecuteAsync(sql); + } - public async Task> QueryAsync(string sql) where T : new() - { - return await _dbAsync.QueryAsync(sql); - } + public async Task> QueryAsync(string sql) where T : new() + { + return await _dbAsync.QueryAsync(sql); + } - public AsyncTableQuery TableAsync() where T : new() - { - return _dbAsync.Table(); - } + public AsyncTableQuery TableAsync() where T : new() + { + return _dbAsync.Table(); + } - public async Task DisposeDbConnectionAsync() - { - await Task.Factory.StartNew(() => - { - _db?.Close(); - _db?.Dispose(); - _db = null; + public async Task DisposeDbConnectionAsync() + { + await Task.Factory.StartNew(() => + { + _db?.Close(); + _db?.Dispose(); + _db = null; - _dbAsync?.GetConnection()?.Close(); - _dbAsync?.GetConnection()?.Dispose(); - _dbAsync = null; - }); - } - } -} \ No newline at end of file + _dbAsync?.GetConnection()?.Close(); + _dbAsync?.GetConnection()?.Dispose(); + _dbAsync = null; + }); + } + } +} diff --git a/v2rayN/ServiceLib/Common/StringEx.cs b/v2rayN/ServiceLib/Common/StringEx.cs index c0d0a8cc..a611a215 100644 --- a/v2rayN/ServiceLib/Common/StringEx.cs +++ b/v2rayN/ServiceLib/Common/StringEx.cs @@ -1,72 +1,74 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; namespace ServiceLib.Common { - public static class StringEx - { - public static bool IsNullOrEmpty([NotNullWhen(false)] this string? value) - { - return string.IsNullOrEmpty(value); - } + public static class StringEx + { + public static bool IsNullOrEmpty([NotNullWhen(false)] this string? value) + { + return string.IsNullOrEmpty(value); + } - public static bool IsNullOrWhiteSpace([NotNullWhen(false)] this string? value) - { - return string.IsNullOrWhiteSpace(value); - } + public static bool IsNullOrWhiteSpace([NotNullWhen(false)] this string? value) + { + return string.IsNullOrWhiteSpace(value); + } - public static bool IsNotEmpty([NotNullWhen(false)] this string? value) - { - return !string.IsNullOrEmpty(value); - } + public static bool IsNotEmpty([NotNullWhen(false)] this string? value) + { + return !string.IsNullOrEmpty(value); + } - public static bool BeginWithAny(this string s, IEnumerable chars) - { - if (s.IsNullOrEmpty()) return false; - return chars.Contains(s.First()); - } + public static bool BeginWithAny(this string s, IEnumerable chars) + { + if (s.IsNullOrEmpty()) + return false; + return chars.Contains(s.First()); + } - private static bool IsWhiteSpace(this string value) - { - return value.All(char.IsWhiteSpace); - } + private static bool IsWhiteSpace(this string value) + { + return value.All(char.IsWhiteSpace); + } - public static IEnumerable NonWhiteSpaceLines(this TextReader reader) - { - while (reader.ReadLine() is { } line) - { - if (line.IsWhiteSpace()) continue; - yield return line; - } - } + public static IEnumerable NonWhiteSpaceLines(this TextReader reader) + { + while (reader.ReadLine() is { } line) + { + if (line.IsWhiteSpace()) + continue; + yield return line; + } + } - public static string TrimEx(this string? value) - { - return value == null ? string.Empty : value.Trim(); - } + public static string TrimEx(this string? value) + { + return value == null ? string.Empty : value.Trim(); + } - public static string RemovePrefix(this string value, char prefix) - { - return value.StartsWith(prefix) ? value[1..] : value; - } + public static string RemovePrefix(this string value, char prefix) + { + return value.StartsWith(prefix) ? value[1..] : value; + } - public static string RemovePrefix(this string value, string prefix) - { - return value.StartsWith(prefix) ? value[prefix.Length..] : value; - } + public static string RemovePrefix(this string value, string prefix) + { + return value.StartsWith(prefix) ? value[prefix.Length..] : value; + } - public static string UpperFirstChar(this string value) - { - if (string.IsNullOrEmpty(value)) - { - return string.Empty; - } + public static string UpperFirstChar(this string value) + { + if (string.IsNullOrEmpty(value)) + { + return string.Empty; + } - return char.ToUpper(value.First()) + value[1..]; - } + return char.ToUpper(value.First()) + value[1..]; + } - public static string AppendQuotes(this string value) - { - return string.IsNullOrEmpty(value) ? string.Empty : $"\"{value}\""; - } - } -} \ No newline at end of file + public static string AppendQuotes(this string value) + { + return string.IsNullOrEmpty(value) ? string.Empty : $"\"{value}\""; + } + } +} diff --git a/v2rayN/ServiceLib/Common/Utils.cs b/v2rayN/ServiceLib/Common/Utils.cs index f158097b..67a904c6 100644 --- a/v2rayN/ServiceLib/Common/Utils.cs +++ b/v2rayN/ServiceLib/Common/Utils.cs @@ -1,5 +1,3 @@ -using CliWrap; -using CliWrap.Buffered; using System.Collections.Specialized; using System.Diagnostics; using System.Net; @@ -10,898 +8,909 @@ using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Security.Principal; using System.Text; +using CliWrap; +using CliWrap.Buffered; namespace ServiceLib.Common { - public class Utils - { - private static readonly string _tag = "Utils"; - - #region 资源操作 - - /// - /// 获取嵌入文本资源 - /// - /// - /// - public static string GetEmbedText(string res) - { - var result = string.Empty; - - try - { - var assembly = Assembly.GetExecutingAssembly(); - using var stream = assembly.GetManifestResourceStream(res); - ArgumentNullException.ThrowIfNull(stream); - using StreamReader reader = new(stream); - result = reader.ReadToEnd(); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return result; - } - - /// - /// 取得存储资源 - /// - /// - public static string? LoadResource(string? res) - { - try - { - if (File.Exists(res)) - { - return File.ReadAllText(res); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return null; - } - - #endregion 资源操作 - - #region 转换函数 - - /// - /// 转逗号分隔的字符串 - /// - /// - /// - /// - public static string List2String(List? lst, bool wrap = false) - { - try - { - if (lst == null) - { - return string.Empty; - } - if (wrap) - { - return string.Join("," + Environment.NewLine, lst); - } - else - { - return string.Join(",", lst); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return string.Empty; - } - - /// - /// 逗号分隔的字符串 - /// - /// - /// - public static List? String2List(string? str) - { - try - { - if (str == null) - { - return null; - } - - str = str.Replace(Environment.NewLine, ""); - return new List(str.Split(',', StringSplitOptions.RemoveEmptyEntries)); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return null; - } - - /// - /// 逗号分隔的字符串,先排序后转List - /// - /// - /// - public static List? String2ListSorted(string str) - { - try - { - str = str.Replace(Environment.NewLine, ""); - List list = new(str.Split(',', StringSplitOptions.RemoveEmptyEntries)); - list.Sort(); - return list; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return null; - } - - /// - /// Base64编码 - /// - /// - /// - public static string Base64Encode(string plainText) - { - try - { - var plainTextBytes = Encoding.UTF8.GetBytes(plainText); - return Convert.ToBase64String(plainTextBytes); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return string.Empty; - } - - /// - /// Base64解码 - /// - /// - /// - public static string Base64Decode(string? plainText) - { - try - { - if (plainText.IsNullOrEmpty()) return ""; - plainText = plainText.Trim() - .Replace(Environment.NewLine, "") - .Replace("\n", "") - .Replace("\r", "") - .Replace('_', '/') - .Replace('-', '+') - .Replace(" ", ""); - - if (plainText.Length % 4 > 0) - { - plainText = plainText.PadRight(plainText.Length + 4 - (plainText.Length % 4), '='); - } - - var data = Convert.FromBase64String(plainText); - return Encoding.UTF8.GetString(data); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return string.Empty; - } - - public static int ToInt(object? obj) - { - try - { - return Convert.ToInt32(obj ?? string.Empty); - } - catch - { - return 0; - } - } - - public static bool ToBool(object obj) - { - try - { - return Convert.ToBoolean(obj); - } - catch - { - return false; - } - } - - public static string ToString(object? obj) - { - try - { - return obj?.ToString() ?? string.Empty; - } - catch - { - return string.Empty; - } - } - - private static void ToHumanReadable(long amount, out double result, out string unit) - { - var factor = 1024u; - //long KBs = amount / factor; - var KBs = amount; - if (KBs > 0) - { - // multi KB - var MBs = KBs / factor; - if (MBs > 0) - { - // multi MB - var GBs = MBs / factor; - if (GBs > 0) - { - // multi GB - var TBs = GBs / factor; - if (TBs > 0) - { - result = TBs + ((GBs % factor) / (factor + 0.0)); - unit = "TB"; - return; - } - - result = GBs + ((MBs % factor) / (factor + 0.0)); - unit = "GB"; - return; - } - - result = MBs + ((KBs % factor) / (factor + 0.0)); - unit = "MB"; - return; - } - - result = KBs + ((amount % factor) / (factor + 0.0)); - unit = "KB"; - return; - } - else - { - result = amount; - unit = "B"; - } - } - - public static string HumanFy(long amount) - { - ToHumanReadable(amount, out var result, out var unit); - return $"{result:f1} {unit}"; - } - - public static string UrlEncode(string url) - { - return Uri.EscapeDataString(url); - } - - public static string UrlDecode(string url) - { - return Uri.UnescapeDataString(url); - } - - public static NameValueCollection ParseQueryString(string query) - { - var result = new NameValueCollection(StringComparer.OrdinalIgnoreCase); - if (IsNullOrEmpty(query)) - { - return result; - } - - var parts = query[1..].Split('&', StringSplitOptions.RemoveEmptyEntries); - foreach (var part in parts) - { - var keyValue = part.Split('='); - if (keyValue.Length != 2) - { - continue; - } - - var key = Uri.UnescapeDataString(keyValue.First()); - var val = Uri.UnescapeDataString(keyValue.Last()); - - if (result[key] is null) - { - result.Add(key, val); - } - } - - return result; - } - - public static string GetMd5(string str) - { - var byteOld = Encoding.UTF8.GetBytes(str); - var byteNew = MD5.HashData(byteOld); - StringBuilder sb = new(32); - foreach (var b in byteNew) - { - sb.Append(b.ToString("x2")); - } - - return sb.ToString(); - } - - /// - /// idn to idc - /// - /// - /// - public static string GetPunycode(string url) - { - if (Utils.IsNullOrEmpty(url)) - { - return url; - } - - try - { - Uri uri = new(url); - if (uri.Host == uri.IdnHost || uri.Host == $"[{uri.IdnHost}]") - { - return url; - } - else - { - return url.Replace(uri.Host, uri.IdnHost); - } - } - catch - { - return url; - } - } - - public static bool IsBase64String(string? plainText) - { - if (plainText.IsNullOrEmpty()) return false; - var buffer = new Span(new byte[plainText.Length]); - return Convert.TryFromBase64String(plainText, buffer, out var _); - } - - public static string Convert2Comma(string text) - { - if (IsNullOrEmpty(text)) - { - return text; - } - - return text.Replace(",", ",").Replace(Environment.NewLine, ","); - } - - #endregion 转换函数 - - #region 数据检查 - - /// - /// 判断输入的是否是数字 - /// - /// - /// - public static bool IsNumeric(string oText) - { - return oText.All(char.IsNumber); - } - - public static bool IsNullOrEmpty(string? text) - { - if (string.IsNullOrWhiteSpace(text)) - { - return true; - } - - return text == "null"; - } - - public static bool IsNotEmpty(string? text) - { - return !string.IsNullOrEmpty(text); - } - - /// - /// 验证Domain地址是否合法 - /// - /// - public static bool IsDomain(string? domain) - { - if (IsNullOrEmpty(domain)) - { - return false; - } - - return Uri.CheckHostName(domain) == UriHostNameType.Dns; - } - - public static bool IsIpv6(string ip) - { - if (IPAddress.TryParse(ip, out var address)) - { - return address.AddressFamily switch - { - AddressFamily.InterNetwork => false, - AddressFamily.InterNetworkV6 => true, - _ => false, - }; - } - - return false; - } - - public static Uri? TryUri(string url) - { - try - { - return new Uri(url); - } - catch (UriFormatException) - { - return null; - } - } - - public static bool IsPrivateNetwork(string ip) - { - if (IPAddress.TryParse(ip, out var address)) - { - var ipBytes = address.GetAddressBytes(); - if (ipBytes[0] == 10) return true; - if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) return true; - if (ipBytes[0] == 192 && ipBytes[1] == 168) return true; - } - - return false; - } - - #endregion 数据检查 - - #region 测速 - - private static bool PortInUse(int port) - { - try - { - var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); - var ipEndPoints = ipProperties.GetActiveTcpListeners(); - //var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); - return ipEndPoints.Any(endPoint => endPoint.Port == port); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return false; - } - - public static int GetFreePort(int defaultPort = 9090) - { - try - { - if (!Utils.PortInUse(defaultPort)) - { - return defaultPort; - } - - TcpListener l = new(IPAddress.Loopback, 0); - l.Start(); - var port = ((IPEndPoint)l.LocalEndpoint).Port; - l.Stop(); - return port; - } - catch - { - } - - return 59090; - } - - #endregion 测速 - - #region 杂项 - - public static bool UpgradeAppExists(out string upgradeFileName) - { - upgradeFileName = Path.Combine(GetBaseDirectory(), GetExeName("AmazTool")); - return File.Exists(upgradeFileName); - } - - /// - /// 取得版本 - /// - /// - public static string GetVersion(bool blFull = true) - { - try - { - return blFull - ? $"{Global.AppName} - V{GetVersionInfo()} - {RuntimeInformation.ProcessArchitecture}" - : $"{Global.AppName}/{GetVersionInfo()}"; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return Global.AppName; - } - - public static string GetVersionInfo() - { - try - { - return Assembly.GetExecutingAssembly()?.GetName()?.Version?.ToString(3) ?? "0.0"; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return "0.0"; - } - } - - public static string GetRuntimeInfo() - { - return $"{Utils.GetVersion()} | {Utils.StartupPath()} | {Utils.GetExePath()} | {Environment.OSVersion}"; - } - - /// - /// 取得GUID - /// - /// - public static string GetGuid(bool full = true) - { - try - { - if (full) - { - return Guid.NewGuid().ToString("D"); - } - else - { - return BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0).ToString(); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return string.Empty; - } - - public static bool IsGuidByParse(string strSrc) - { - return Guid.TryParse(strSrc, out _); - } - - public static Dictionary GetSystemHosts() - { - var systemHosts = new Dictionary(); - var hostFile = @"C:\Windows\System32\drivers\etc\hosts"; - try - { - if (File.Exists(hostFile)) - { - var hosts = File.ReadAllText(hostFile).Replace("\r", ""); - var hostsList = hosts.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); - - foreach (var host in hostsList) - { - if (host.StartsWith("#")) continue; - var hostItem = host.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); - if (hostItem.Length != 2) continue; - systemHosts.Add(hostItem.Last(), hostItem.First()); - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return systemHosts; - } - - public static async Task GetCliWrapOutput(string filePath, string? arg) - { - return await GetCliWrapOutput(filePath, arg != null ? new List() { arg } : null); - } - - public static async Task GetCliWrapOutput(string filePath, IEnumerable? args) - { - try - { - var cmd = Cli.Wrap(filePath); - if (args != null) - { - if (args.Count() == 1) - { - cmd = cmd.WithArguments(args.First()); - } - else - { - cmd = cmd.WithArguments(args); - } - } - - var result = await cmd.ExecuteBufferedAsync(); - if (result.IsSuccess) - { - return result.StandardOutput.ToString(); - } - - Logging.SaveLog(result.ToString() ?? ""); - } - catch (Exception ex) - { - Logging.SaveLog("GetCliWrapOutput", ex); - } - - return null; - } - - #endregion 杂项 - - #region TempPath - - public static bool HasWritePermission() - { - try - { - //When this file exists, it is equivalent to having no permission to read and write - if (File.Exists(Path.Combine(GetBaseDirectory(), "NotStoreConfigHere.txt"))) - { - return false; - } - - var tempPath = Path.Combine(GetBaseDirectory(), "guiTemps"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - var fileName = Path.Combine(tempPath, GetGuid()); - File.Create(fileName).Close(); - File.Delete(fileName); - } - catch (Exception) - { - return false; - } - - return true; - } - - public static string GetPath(string fileName) - { - var startupPath = StartupPath(); - if (IsNullOrEmpty(fileName)) - { - return startupPath; - } - - return Path.Combine(startupPath, fileName); - } - - public static string GetBaseDirectory(string fileName = "") - { - return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); - } - - public static string GetExePath() - { - return Environment.ProcessPath ?? Process.GetCurrentProcess().MainModule?.FileName ?? string.Empty; - } - - public static string StartupPath() - { - if (Environment.GetEnvironmentVariable(Global.LocalAppData) == "1") - { - return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "v2rayN"); - } - - return GetBaseDirectory(); - } - - public static string GetTempPath(string filename = "") - { - var tempPath = Path.Combine(StartupPath(), "guiTemps"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - if (IsNullOrEmpty(filename)) - { - return tempPath; - } - else - { - return Path.Combine(tempPath, filename); - } - } - - public static string GetBackupPath(string filename) - { - var tempPath = Path.Combine(StartupPath(), "guiBackups"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - return Path.Combine(tempPath, filename); - } - - public static string GetConfigPath(string filename = "") - { - var tempPath = Path.Combine(StartupPath(), "guiConfigs"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - if (Utils.IsNullOrEmpty(filename)) - { - return tempPath; - } - else - { - return Path.Combine(tempPath, filename); - } - } - - public static string GetBinPath(string filename, string? coreType = null) - { - var tempPath = Path.Combine(StartupPath(), "bin"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - if (coreType != null) - { - tempPath = Path.Combine(tempPath, coreType.ToLower().ToString()); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - } - - if (IsNullOrEmpty(filename)) - { - return tempPath; - } - else - { - return Path.Combine(tempPath, filename); - } - } - - public static string GetLogPath(string filename = "") - { - var tempPath = Path.Combine(StartupPath(), "guiLogs"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - if (Utils.IsNullOrEmpty(filename)) - { - return tempPath; - } - else - { - return Path.Combine(tempPath, filename); - } - } - - public static string GetFontsPath(string filename = "") - { - var tempPath = Path.Combine(StartupPath(), "guiFonts"); - if (!Directory.Exists(tempPath)) - { - Directory.CreateDirectory(tempPath); - } - - if (Utils.IsNullOrEmpty(filename)) - { - return tempPath; - } - else - { - return Path.Combine(tempPath, filename); - } - } - - #endregion TempPath - - #region Platform - - public static bool IsWindows() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - - public static bool IsLinux() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - - public static bool IsOSX() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - - public static bool IsNonWindows() => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - - public static string GetExeName(string name) - { - return IsWindows() ? $"{name}.exe" : name; - } - - public static bool IsAdministrator() - { - if (IsWindows()) - { - return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); - } - return false; - //else - //{ - // var id = GetLinuxUserId().Result ?? "1000"; - // if (int.TryParse(id, out var userId)) - // { - // return userId == 0; - // } - // else - // { - // return false; - // } - //} - } - - private static async Task GetLinuxUserId() - { - var arg = new List() { "-c", "id -u" }; - return await GetCliWrapOutput("/bin/bash", arg); - } - - public static async Task SetLinuxChmod(string? fileName) - { - if (fileName.IsNullOrEmpty()) return null; - if (fileName.Contains(' ')) fileName = fileName.AppendQuotes(); - //File.SetUnixFileMode(fileName, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute); - var arg = new List() { "-c", $"chmod +x {fileName}" }; - return await GetCliWrapOutput("/bin/bash", arg); - } - - public static async Task GetLinuxFontFamily(string lang) - { - // var arg = new List() { "-c", $"fc-list :lang={lang} family" }; - var arg = new List() { "-c", $"fc-list : family" }; - return await GetCliWrapOutput("/bin/bash", arg); - } - - public static string? GetHomePath() - { - return IsWindows() - ? Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%") - : Environment.GetEnvironmentVariable("HOME"); - } - - public static async Task GetListNetworkServices() - { - var arg = new List() { "-c", $"networksetup -listallnetworkservices" }; - return await GetCliWrapOutput("/bin/bash", arg); - } - - #endregion Platform - } -} \ No newline at end of file + public class Utils + { + private static readonly string _tag = "Utils"; + + #region 资源操作 + + /// + /// 获取嵌入文本资源 + /// + /// + /// + public static string GetEmbedText(string res) + { + var result = string.Empty; + + try + { + var assembly = Assembly.GetExecutingAssembly(); + using var stream = assembly.GetManifestResourceStream(res); + ArgumentNullException.ThrowIfNull(stream); + using StreamReader reader = new(stream); + result = reader.ReadToEnd(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return result; + } + + /// + /// 取得存储资源 + /// + /// + public static string? LoadResource(string? res) + { + try + { + if (File.Exists(res)) + { + return File.ReadAllText(res); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return null; + } + + #endregion 资源操作 + + #region 转换函数 + + /// + /// 转逗号分隔的字符串 + /// + /// + /// + /// + public static string List2String(List? lst, bool wrap = false) + { + try + { + if (lst == null) + { + return string.Empty; + } + if (wrap) + { + return string.Join("," + Environment.NewLine, lst); + } + else + { + return string.Join(",", lst); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return string.Empty; + } + + /// + /// 逗号分隔的字符串 + /// + /// + /// + public static List? String2List(string? str) + { + try + { + if (str == null) + { + return null; + } + + str = str.Replace(Environment.NewLine, ""); + return new List(str.Split(',', StringSplitOptions.RemoveEmptyEntries)); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return null; + } + + /// + /// 逗号分隔的字符串,先排序后转List + /// + /// + /// + public static List? String2ListSorted(string str) + { + try + { + str = str.Replace(Environment.NewLine, ""); + List list = new(str.Split(',', StringSplitOptions.RemoveEmptyEntries)); + list.Sort(); + return list; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return null; + } + + /// + /// Base64编码 + /// + /// + /// + public static string Base64Encode(string plainText) + { + try + { + var plainTextBytes = Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return string.Empty; + } + + /// + /// Base64解码 + /// + /// + /// + public static string Base64Decode(string? plainText) + { + try + { + if (plainText.IsNullOrEmpty()) + return ""; + plainText = plainText.Trim() + .Replace(Environment.NewLine, "") + .Replace("\n", "") + .Replace("\r", "") + .Replace('_', '/') + .Replace('-', '+') + .Replace(" ", ""); + + if (plainText.Length % 4 > 0) + { + plainText = plainText.PadRight(plainText.Length + 4 - (plainText.Length % 4), '='); + } + + var data = Convert.FromBase64String(plainText); + return Encoding.UTF8.GetString(data); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return string.Empty; + } + + public static int ToInt(object? obj) + { + try + { + return Convert.ToInt32(obj ?? string.Empty); + } + catch + { + return 0; + } + } + + public static bool ToBool(object obj) + { + try + { + return Convert.ToBoolean(obj); + } + catch + { + return false; + } + } + + public static string ToString(object? obj) + { + try + { + return obj?.ToString() ?? string.Empty; + } + catch + { + return string.Empty; + } + } + + private static void ToHumanReadable(long amount, out double result, out string unit) + { + var factor = 1024u; + //long KBs = amount / factor; + var KBs = amount; + if (KBs > 0) + { + // multi KB + var MBs = KBs / factor; + if (MBs > 0) + { + // multi MB + var GBs = MBs / factor; + if (GBs > 0) + { + // multi GB + var TBs = GBs / factor; + if (TBs > 0) + { + result = TBs + (GBs % factor / (factor + 0.0)); + unit = "TB"; + return; + } + + result = GBs + (MBs % factor / (factor + 0.0)); + unit = "GB"; + return; + } + + result = MBs + (KBs % factor / (factor + 0.0)); + unit = "MB"; + return; + } + + result = KBs + (amount % factor / (factor + 0.0)); + unit = "KB"; + return; + } + else + { + result = amount; + unit = "B"; + } + } + + public static string HumanFy(long amount) + { + ToHumanReadable(amount, out var result, out var unit); + return $"{result:f1} {unit}"; + } + + public static string UrlEncode(string url) + { + return Uri.EscapeDataString(url); + } + + public static string UrlDecode(string url) + { + return Uri.UnescapeDataString(url); + } + + public static NameValueCollection ParseQueryString(string query) + { + var result = new NameValueCollection(StringComparer.OrdinalIgnoreCase); + if (IsNullOrEmpty(query)) + { + return result; + } + + var parts = query[1..].Split('&', StringSplitOptions.RemoveEmptyEntries); + foreach (var part in parts) + { + var keyValue = part.Split('='); + if (keyValue.Length != 2) + { + continue; + } + + var key = Uri.UnescapeDataString(keyValue.First()); + var val = Uri.UnescapeDataString(keyValue.Last()); + + if (result[key] is null) + { + result.Add(key, val); + } + } + + return result; + } + + public static string GetMd5(string str) + { + var byteOld = Encoding.UTF8.GetBytes(str); + var byteNew = MD5.HashData(byteOld); + StringBuilder sb = new(32); + foreach (var b in byteNew) + { + sb.Append(b.ToString("x2")); + } + + return sb.ToString(); + } + + /// + /// idn to idc + /// + /// + /// + public static string GetPunycode(string url) + { + if (Utils.IsNullOrEmpty(url)) + { + return url; + } + + try + { + Uri uri = new(url); + if (uri.Host == uri.IdnHost || uri.Host == $"[{uri.IdnHost}]") + { + return url; + } + else + { + return url.Replace(uri.Host, uri.IdnHost); + } + } + catch + { + return url; + } + } + + public static bool IsBase64String(string? plainText) + { + if (plainText.IsNullOrEmpty()) + return false; + var buffer = new Span(new byte[plainText.Length]); + return Convert.TryFromBase64String(plainText, buffer, out var _); + } + + public static string Convert2Comma(string text) + { + if (IsNullOrEmpty(text)) + { + return text; + } + + return text.Replace(",", ",").Replace(Environment.NewLine, ","); + } + + #endregion 转换函数 + + #region 数据检查 + + /// + /// 判断输入的是否是数字 + /// + /// + /// + public static bool IsNumeric(string oText) + { + return oText.All(char.IsNumber); + } + + public static bool IsNullOrEmpty(string? text) + { + if (string.IsNullOrWhiteSpace(text)) + { + return true; + } + + return text == "null"; + } + + public static bool IsNotEmpty(string? text) + { + return !string.IsNullOrEmpty(text); + } + + /// + /// 验证Domain地址是否合法 + /// + /// + public static bool IsDomain(string? domain) + { + if (IsNullOrEmpty(domain)) + { + return false; + } + + return Uri.CheckHostName(domain) == UriHostNameType.Dns; + } + + public static bool IsIpv6(string ip) + { + if (IPAddress.TryParse(ip, out var address)) + { + return address.AddressFamily switch + { + AddressFamily.InterNetwork => false, + AddressFamily.InterNetworkV6 => true, + _ => false, + }; + } + + return false; + } + + public static Uri? TryUri(string url) + { + try + { + return new Uri(url); + } + catch (UriFormatException) + { + return null; + } + } + + public static bool IsPrivateNetwork(string ip) + { + if (IPAddress.TryParse(ip, out var address)) + { + var ipBytes = address.GetAddressBytes(); + if (ipBytes[0] == 10) + return true; + if (ipBytes[0] == 172 && ipBytes[1] >= 16 && ipBytes[1] <= 31) + return true; + if (ipBytes[0] == 192 && ipBytes[1] == 168) + return true; + } + + return false; + } + + #endregion 数据检查 + + #region 测速 + + private static bool PortInUse(int port) + { + try + { + var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + var ipEndPoints = ipProperties.GetActiveTcpListeners(); + //var lstIpEndPoints = new List(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + return ipEndPoints.Any(endPoint => endPoint.Port == port); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return false; + } + + public static int GetFreePort(int defaultPort = 9090) + { + try + { + if (!Utils.PortInUse(defaultPort)) + { + return defaultPort; + } + + TcpListener l = new(IPAddress.Loopback, 0); + l.Start(); + var port = ((IPEndPoint)l.LocalEndpoint).Port; + l.Stop(); + return port; + } + catch + { + } + + return 59090; + } + + #endregion 测速 + + #region 杂项 + + public static bool UpgradeAppExists(out string upgradeFileName) + { + upgradeFileName = Path.Combine(GetBaseDirectory(), GetExeName("AmazTool")); + return File.Exists(upgradeFileName); + } + + /// + /// 取得版本 + /// + /// + public static string GetVersion(bool blFull = true) + { + try + { + return blFull + ? $"{Global.AppName} - V{GetVersionInfo()} - {RuntimeInformation.ProcessArchitecture}" + : $"{Global.AppName}/{GetVersionInfo()}"; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return Global.AppName; + } + + public static string GetVersionInfo() + { + try + { + return Assembly.GetExecutingAssembly()?.GetName()?.Version?.ToString(3) ?? "0.0"; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return "0.0"; + } + } + + public static string GetRuntimeInfo() + { + return $"{Utils.GetVersion()} | {Utils.StartupPath()} | {Utils.GetExePath()} | {Environment.OSVersion}"; + } + + /// + /// 取得GUID + /// + /// + public static string GetGuid(bool full = true) + { + try + { + if (full) + { + return Guid.NewGuid().ToString("D"); + } + else + { + return BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0).ToString(); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return string.Empty; + } + + public static bool IsGuidByParse(string strSrc) + { + return Guid.TryParse(strSrc, out _); + } + + public static Dictionary GetSystemHosts() + { + var systemHosts = new Dictionary(); + var hostFile = @"C:\Windows\System32\drivers\etc\hosts"; + try + { + if (File.Exists(hostFile)) + { + var hosts = File.ReadAllText(hostFile).Replace("\r", ""); + var hostsList = hosts.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); + + foreach (var host in hostsList) + { + if (host.StartsWith("#")) + continue; + var hostItem = host.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); + if (hostItem.Length != 2) + continue; + systemHosts.Add(hostItem.Last(), hostItem.First()); + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return systemHosts; + } + + public static async Task GetCliWrapOutput(string filePath, string? arg) + { + return await GetCliWrapOutput(filePath, arg != null ? new List() { arg } : null); + } + + public static async Task GetCliWrapOutput(string filePath, IEnumerable? args) + { + try + { + var cmd = Cli.Wrap(filePath); + if (args != null) + { + if (args.Count() == 1) + { + cmd = cmd.WithArguments(args.First()); + } + else + { + cmd = cmd.WithArguments(args); + } + } + + var result = await cmd.ExecuteBufferedAsync(); + if (result.IsSuccess) + { + return result.StandardOutput.ToString(); + } + + Logging.SaveLog(result.ToString() ?? ""); + } + catch (Exception ex) + { + Logging.SaveLog("GetCliWrapOutput", ex); + } + + return null; + } + + #endregion 杂项 + + #region TempPath + + public static bool HasWritePermission() + { + try + { + //When this file exists, it is equivalent to having no permission to read and write + if (File.Exists(Path.Combine(GetBaseDirectory(), "NotStoreConfigHere.txt"))) + { + return false; + } + + var tempPath = Path.Combine(GetBaseDirectory(), "guiTemps"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + var fileName = Path.Combine(tempPath, GetGuid()); + File.Create(fileName).Close(); + File.Delete(fileName); + } + catch (Exception) + { + return false; + } + + return true; + } + + public static string GetPath(string fileName) + { + var startupPath = StartupPath(); + if (IsNullOrEmpty(fileName)) + { + return startupPath; + } + + return Path.Combine(startupPath, fileName); + } + + public static string GetBaseDirectory(string fileName = "") + { + return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); + } + + public static string GetExePath() + { + return Environment.ProcessPath ?? Process.GetCurrentProcess().MainModule?.FileName ?? string.Empty; + } + + public static string StartupPath() + { + if (Environment.GetEnvironmentVariable(Global.LocalAppData) == "1") + { + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "v2rayN"); + } + + return GetBaseDirectory(); + } + + public static string GetTempPath(string filename = "") + { + var tempPath = Path.Combine(StartupPath(), "guiTemps"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + if (IsNullOrEmpty(filename)) + { + return tempPath; + } + else + { + return Path.Combine(tempPath, filename); + } + } + + public static string GetBackupPath(string filename) + { + var tempPath = Path.Combine(StartupPath(), "guiBackups"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + return Path.Combine(tempPath, filename); + } + + public static string GetConfigPath(string filename = "") + { + var tempPath = Path.Combine(StartupPath(), "guiConfigs"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + if (Utils.IsNullOrEmpty(filename)) + { + return tempPath; + } + else + { + return Path.Combine(tempPath, filename); + } + } + + public static string GetBinPath(string filename, string? coreType = null) + { + var tempPath = Path.Combine(StartupPath(), "bin"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + if (coreType != null) + { + tempPath = Path.Combine(tempPath, coreType.ToLower().ToString()); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + } + + if (IsNullOrEmpty(filename)) + { + return tempPath; + } + else + { + return Path.Combine(tempPath, filename); + } + } + + public static string GetLogPath(string filename = "") + { + var tempPath = Path.Combine(StartupPath(), "guiLogs"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + if (Utils.IsNullOrEmpty(filename)) + { + return tempPath; + } + else + { + return Path.Combine(tempPath, filename); + } + } + + public static string GetFontsPath(string filename = "") + { + var tempPath = Path.Combine(StartupPath(), "guiFonts"); + if (!Directory.Exists(tempPath)) + { + Directory.CreateDirectory(tempPath); + } + + if (Utils.IsNullOrEmpty(filename)) + { + return tempPath; + } + else + { + return Path.Combine(tempPath, filename); + } + } + + #endregion TempPath + + #region Platform + + public static bool IsWindows() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + + public static bool IsLinux() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + + public static bool IsOSX() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + + public static bool IsNonWindows() => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + + public static string GetExeName(string name) + { + return IsWindows() ? $"{name}.exe" : name; + } + + public static bool IsAdministrator() + { + if (IsWindows()) + { + return new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator); + } + return false; + //else + //{ + // var id = GetLinuxUserId().Result ?? "1000"; + // if (int.TryParse(id, out var userId)) + // { + // return userId == 0; + // } + // else + // { + // return false; + // } + //} + } + + private static async Task GetLinuxUserId() + { + var arg = new List() { "-c", "id -u" }; + return await GetCliWrapOutput("/bin/bash", arg); + } + + public static async Task SetLinuxChmod(string? fileName) + { + if (fileName.IsNullOrEmpty()) + return null; + if (fileName.Contains(' ')) + fileName = fileName.AppendQuotes(); + //File.SetUnixFileMode(fileName, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute); + var arg = new List() { "-c", $"chmod +x {fileName}" }; + return await GetCliWrapOutput("/bin/bash", arg); + } + + public static async Task GetLinuxFontFamily(string lang) + { + // var arg = new List() { "-c", $"fc-list :lang={lang} family" }; + var arg = new List() { "-c", $"fc-list : family" }; + return await GetCliWrapOutput("/bin/bash", arg); + } + + public static string? GetHomePath() + { + return IsWindows() + ? Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%") + : Environment.GetEnvironmentVariable("HOME"); + } + + public static async Task GetListNetworkServices() + { + var arg = new List() { "-c", $"networksetup -listallnetworkservices" }; + return await GetCliWrapOutput("/bin/bash", arg); + } + + #endregion Platform + } +} diff --git a/v2rayN/ServiceLib/Common/WindowsUtils.cs b/v2rayN/ServiceLib/Common/WindowsUtils.cs index 83e2ee57..aa7836ad 100644 --- a/v2rayN/ServiceLib/Common/WindowsUtils.cs +++ b/v2rayN/ServiceLib/Common/WindowsUtils.cs @@ -1,54 +1,54 @@ -using Microsoft.Win32; +using Microsoft.Win32; namespace ServiceLib.Common { - internal static class WindowsUtils - { - private static readonly string _tag = "WindowsUtils"; + internal static class WindowsUtils + { + private static readonly string _tag = "WindowsUtils"; - public static string? RegReadValue(string path, string name, string def) - { - RegistryKey? regKey = null; - try - { - regKey = Registry.CurrentUser.OpenSubKey(path, false); - var value = regKey?.GetValue(name) as string; - return Utils.IsNullOrEmpty(value) ? def : value; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - finally - { - regKey?.Close(); - } - return def; - } + public static string? RegReadValue(string path, string name, string def) + { + RegistryKey? regKey = null; + try + { + regKey = Registry.CurrentUser.OpenSubKey(path, false); + var value = regKey?.GetValue(name) as string; + return Utils.IsNullOrEmpty(value) ? def : value; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + finally + { + regKey?.Close(); + } + return def; + } - public static void RegWriteValue(string path, string name, object value) - { - RegistryKey? regKey = null; - try - { - regKey = Registry.CurrentUser.CreateSubKey(path); - if (Utils.IsNullOrEmpty(value.ToString())) - { - regKey?.DeleteValue(name, false); - } - else - { - regKey?.SetValue(name, value); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - finally - { - regKey?.Close(); - } - } - } -} \ No newline at end of file + public static void RegWriteValue(string path, string name, object value) + { + RegistryKey? regKey = null; + try + { + regKey = Registry.CurrentUser.CreateSubKey(path); + if (Utils.IsNullOrEmpty(value.ToString())) + { + regKey?.DeleteValue(name, false); + } + else + { + regKey?.SetValue(name, value); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + finally + { + regKey?.Close(); + } + } + } +} diff --git a/v2rayN/ServiceLib/Common/YamlUtils.cs b/v2rayN/ServiceLib/Common/YamlUtils.cs index 13ad2d78..8b7f7bea 100644 --- a/v2rayN/ServiceLib/Common/YamlUtils.cs +++ b/v2rayN/ServiceLib/Common/YamlUtils.cs @@ -1,83 +1,83 @@ -using YamlDotNet.Core; +using YamlDotNet.Core; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; namespace ServiceLib.Common { - public class YamlUtils - { - private static readonly string _tag = "YamlUtils"; + public class YamlUtils + { + private static readonly string _tag = "YamlUtils"; - #region YAML + #region YAML - /// - /// 反序列化成对象 - /// - /// - /// - /// - public static T FromYaml(string str) - { - var deserializer = new DeserializerBuilder() - .WithNamingConvention(PascalCaseNamingConvention.Instance) - .Build(); - try - { - var obj = deserializer.Deserialize(str); - return obj; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return deserializer.Deserialize(""); - } - } + /// + /// 反序列化成对象 + /// + /// + /// + /// + public static T FromYaml(string str) + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(PascalCaseNamingConvention.Instance) + .Build(); + try + { + var obj = deserializer.Deserialize(str); + return obj; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return deserializer.Deserialize(""); + } + } - /// - /// 序列化 - /// - /// - /// - public static string ToYaml(object? obj) - { - var result = string.Empty; - if (obj == null) - { - return result; - } - var serializer = new SerializerBuilder() - .WithNamingConvention(HyphenatedNamingConvention.Instance) - .Build(); + /// + /// 序列化 + /// + /// + /// + public static string ToYaml(object? obj) + { + var result = string.Empty; + if (obj == null) + { + return result; + } + var serializer = new SerializerBuilder() + .WithNamingConvention(HyphenatedNamingConvention.Instance) + .Build(); - try - { - result = serializer.Serialize(obj); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return result; - } + try + { + result = serializer.Serialize(obj); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return result; + } - public static string? PreprocessYaml(string str) - { - var deserializer = new DeserializerBuilder() - .WithNamingConvention(PascalCaseNamingConvention.Instance) - .Build(); - try - { - var mergingParser = new MergingParser(new Parser(new StringReader(str))); - var obj = new DeserializerBuilder().Build().Deserialize(mergingParser); - return ToYaml(obj); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return null; - } - } + public static string? PreprocessYaml(string str) + { + var deserializer = new DeserializerBuilder() + .WithNamingConvention(PascalCaseNamingConvention.Instance) + .Build(); + try + { + var mergingParser = new MergingParser(new Parser(new StringReader(str))); + var obj = new DeserializerBuilder().Build().Deserialize(mergingParser); + return ToYaml(obj); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return null; + } + } - #endregion YAML - } -} \ No newline at end of file + #endregion YAML + } +} diff --git a/v2rayN/ServiceLib/Enums/EConfigType.cs b/v2rayN/ServiceLib/Enums/EConfigType.cs index 5c73e728..48cc9204 100644 --- a/v2rayN/ServiceLib/Enums/EConfigType.cs +++ b/v2rayN/ServiceLib/Enums/EConfigType.cs @@ -1,16 +1,16 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EConfigType - { - VMess = 1, - Custom = 2, - Shadowsocks = 3, - SOCKS = 4, - VLESS = 5, - Trojan = 6, - Hysteria2 = 7, - TUIC = 8, - WireGuard = 9, - HTTP = 10 - } -} \ No newline at end of file + public enum EConfigType + { + VMess = 1, + Custom = 2, + Shadowsocks = 3, + SOCKS = 4, + VLESS = 5, + Trojan = 6, + Hysteria2 = 7, + TUIC = 8, + WireGuard = 9, + HTTP = 10 + } +} diff --git a/v2rayN/ServiceLib/Enums/ECoreType.cs b/v2rayN/ServiceLib/Enums/ECoreType.cs index cd93e7b9..ce8cf46e 100644 --- a/v2rayN/ServiceLib/Enums/ECoreType.cs +++ b/v2rayN/ServiceLib/Enums/ECoreType.cs @@ -1,17 +1,17 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ECoreType - { - v2fly = 1, - Xray = 2, - v2fly_v5 = 4, - mihomo = 13, - hysteria = 21, - naiveproxy = 22, - tuic = 23, - sing_box = 24, - juicity = 25, - hysteria2 = 26, - v2rayN = 99 - } -} \ No newline at end of file + public enum ECoreType + { + v2fly = 1, + Xray = 2, + v2fly_v5 = 4, + mihomo = 13, + hysteria = 21, + naiveproxy = 22, + tuic = 23, + sing_box = 24, + juicity = 25, + hysteria2 = 26, + v2rayN = 99 + } +} diff --git a/v2rayN/ServiceLib/Enums/EGirdOrientation.cs b/v2rayN/ServiceLib/Enums/EGirdOrientation.cs index 1a62c7bb..0d57b4f9 100644 --- a/v2rayN/ServiceLib/Enums/EGirdOrientation.cs +++ b/v2rayN/ServiceLib/Enums/EGirdOrientation.cs @@ -1,9 +1,9 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EGirdOrientation - { - Horizontal, - Vertical, - Tab, - } -} \ No newline at end of file + public enum EGirdOrientation + { + Horizontal, + Vertical, + Tab, + } +} diff --git a/v2rayN/ServiceLib/Enums/EGlobalHotkey.cs b/v2rayN/ServiceLib/Enums/EGlobalHotkey.cs index 328bf36e..b78efd31 100644 --- a/v2rayN/ServiceLib/Enums/EGlobalHotkey.cs +++ b/v2rayN/ServiceLib/Enums/EGlobalHotkey.cs @@ -1,11 +1,11 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EGlobalHotkey - { - ShowForm = 0, - SystemProxyClear = 1, - SystemProxySet = 2, - SystemProxyUnchanged = 3, - SystemProxyPac = 4, - } -} \ No newline at end of file + public enum EGlobalHotkey + { + ShowForm = 0, + SystemProxyClear = 1, + SystemProxySet = 2, + SystemProxyUnchanged = 3, + SystemProxyPac = 4, + } +} diff --git a/v2rayN/ServiceLib/Enums/EInboundProtocol.cs b/v2rayN/ServiceLib/Enums/EInboundProtocol.cs index 6da9d1da..75b86f7b 100644 --- a/v2rayN/ServiceLib/Enums/EInboundProtocol.cs +++ b/v2rayN/ServiceLib/Enums/EInboundProtocol.cs @@ -1,14 +1,14 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EInboundProtocol - { - socks = 0, - socks2, - socks3, - pac, - api, - api2, - mixed, - speedtest = 21 - } -} \ No newline at end of file + public enum EInboundProtocol + { + socks = 0, + socks2, + socks3, + pac, + api, + api2, + mixed, + speedtest = 21 + } +} diff --git a/v2rayN/ServiceLib/Enums/EMove.cs b/v2rayN/ServiceLib/Enums/EMove.cs index ced5a4e6..f74d9e5f 100644 --- a/v2rayN/ServiceLib/Enums/EMove.cs +++ b/v2rayN/ServiceLib/Enums/EMove.cs @@ -1,11 +1,11 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EMove - { - Top = 1, - Up = 2, - Down = 3, - Bottom = 4, - Position = 5 - } -} \ No newline at end of file + public enum EMove + { + Top = 1, + Up = 2, + Down = 3, + Bottom = 4, + Position = 5 + } +} diff --git a/v2rayN/ServiceLib/Enums/EMsgCommand.cs b/v2rayN/ServiceLib/Enums/EMsgCommand.cs index 86d5213e..1ddfe512 100644 --- a/v2rayN/ServiceLib/Enums/EMsgCommand.cs +++ b/v2rayN/ServiceLib/Enums/EMsgCommand.cs @@ -1,12 +1,12 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EMsgCommand - { - ClearMsg, - SendMsgView, - SendSnackMsg, - RefreshProfiles, - StopSpeedtest, - AppExit - } -} \ No newline at end of file + public enum EMsgCommand + { + ClearMsg, + SendMsgView, + SendSnackMsg, + RefreshProfiles, + StopSpeedtest, + AppExit + } +} diff --git a/v2rayN/ServiceLib/Enums/EPresetType.cs b/v2rayN/ServiceLib/Enums/EPresetType.cs index 855b10a1..55c2c996 100644 --- a/v2rayN/ServiceLib/Enums/EPresetType.cs +++ b/v2rayN/ServiceLib/Enums/EPresetType.cs @@ -1,9 +1,9 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EPresetType - { - Default = 0, - Russia = 1, - Iran = 2, - } -} \ No newline at end of file + public enum EPresetType + { + Default = 0, + Russia = 1, + Iran = 2, + } +} diff --git a/v2rayN/ServiceLib/Enums/ERuleMode.cs b/v2rayN/ServiceLib/Enums/ERuleMode.cs index 179384d5..f2534ea8 100644 --- a/v2rayN/ServiceLib/Enums/ERuleMode.cs +++ b/v2rayN/ServiceLib/Enums/ERuleMode.cs @@ -1,10 +1,10 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ERuleMode - { - Rule = 0, - Global = 1, - Direct = 2, - Unchanged = 3 - } -} \ No newline at end of file + public enum ERuleMode + { + Rule = 0, + Global = 1, + Direct = 2, + Unchanged = 3 + } +} diff --git a/v2rayN/ServiceLib/Enums/EServerColName.cs b/v2rayN/ServiceLib/Enums/EServerColName.cs index ef981b74..11cb57f3 100644 --- a/v2rayN/ServiceLib/Enums/EServerColName.cs +++ b/v2rayN/ServiceLib/Enums/EServerColName.cs @@ -1,21 +1,21 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EServerColName - { - Def = 0, - ConfigType, - Remarks, - Address, - Port, - Network, - StreamSecurity, - SubRemarks, - DelayVal, - SpeedVal, + public enum EServerColName + { + Def = 0, + ConfigType, + Remarks, + Address, + Port, + Network, + StreamSecurity, + SubRemarks, + DelayVal, + SpeedVal, - TodayDown, - TodayUp, - TotalDown, - TotalUp - } -} \ No newline at end of file + TodayDown, + TodayUp, + TotalDown, + TotalUp + } +} diff --git a/v2rayN/ServiceLib/Enums/ESpeedActionType.cs b/v2rayN/ServiceLib/Enums/ESpeedActionType.cs index 63f13919..200c3595 100644 --- a/v2rayN/ServiceLib/Enums/ESpeedActionType.cs +++ b/v2rayN/ServiceLib/Enums/ESpeedActionType.cs @@ -1,10 +1,10 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ESpeedActionType - { - Tcping, - Realping, - Speedtest, - Mixedtest - } -} \ No newline at end of file + public enum ESpeedActionType + { + Tcping, + Realping, + Speedtest, + Mixedtest + } +} diff --git a/v2rayN/ServiceLib/Enums/ESysProxyType.cs b/v2rayN/ServiceLib/Enums/ESysProxyType.cs index 84beaffe..7beb225c 100644 --- a/v2rayN/ServiceLib/Enums/ESysProxyType.cs +++ b/v2rayN/ServiceLib/Enums/ESysProxyType.cs @@ -1,10 +1,10 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ESysProxyType - { - ForcedClear = 0, - ForcedChange = 1, - Unchanged = 2, - Pac = 3 - } -} \ No newline at end of file + public enum ESysProxyType + { + ForcedClear = 0, + ForcedChange = 1, + Unchanged = 2, + Pac = 3 + } +} diff --git a/v2rayN/ServiceLib/Enums/ETheme.cs b/v2rayN/ServiceLib/Enums/ETheme.cs index 7701ae8f..32bb671f 100644 --- a/v2rayN/ServiceLib/Enums/ETheme.cs +++ b/v2rayN/ServiceLib/Enums/ETheme.cs @@ -1,13 +1,13 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ETheme - { - FollowSystem, - Dark, - Light, - Aquatic, - Desert, - Dusk, - NightSky - } -} \ No newline at end of file + public enum ETheme + { + FollowSystem, + Dark, + Light, + Aquatic, + Desert, + Dusk, + NightSky + } +} diff --git a/v2rayN/ServiceLib/Enums/ETransport.cs b/v2rayN/ServiceLib/Enums/ETransport.cs index 2cd43821..04c13c73 100644 --- a/v2rayN/ServiceLib/Enums/ETransport.cs +++ b/v2rayN/ServiceLib/Enums/ETransport.cs @@ -1,15 +1,15 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum ETransport - { - tcp, - kcp, - ws, - httpupgrade, - xhttp, - h2, - http, - quic, - grpc - } -} \ No newline at end of file + public enum ETransport + { + tcp, + kcp, + ws, + httpupgrade, + xhttp, + h2, + http, + quic, + grpc + } +} diff --git a/v2rayN/ServiceLib/Enums/EViewAction.cs b/v2rayN/ServiceLib/Enums/EViewAction.cs index c37e1212..8508ea13 100644 --- a/v2rayN/ServiceLib/Enums/EViewAction.cs +++ b/v2rayN/ServiceLib/Enums/EViewAction.cs @@ -1,46 +1,46 @@ -namespace ServiceLib.Enums +namespace ServiceLib.Enums { - public enum EViewAction - { - CloseWindow, - ShowYesNo, - SaveFileDialog, - AddBatchRoutingRulesYesNo, - AdjustMainLvColWidth, - SetClipboardData, - AddServerViaClipboard, - ImportRulesFromClipboard, - ProfilesFocus, - ShareSub, - ShareServer, - ShowHideWindow, - ScanScreenTask, - ScanImageTask, - Shutdown, - BrowseServer, - ImportRulesFromFile, - InitSettingFont, - SubEditWindow, - RoutingRuleSettingWindow, - RoutingRuleDetailsWindow, - AddServerWindow, - AddServer2Window, - DNSSettingWindow, - RoutingSettingWindow, - OptionSettingWindow, - GlobalHotkeySettingWindow, - SubSettingWindow, - DispatcherSpeedTest, - DispatcherRefreshConnections, - DispatcherRefreshProxyGroups, - DispatcherProxiesDelayTest, - DispatcherStatistics, - DispatcherServerAvailability, - DispatcherReload, - DispatcherRefreshServersBiz, - DispatcherRefreshIcon, - DispatcherCheckUpdate, - DispatcherCheckUpdateFinished, - DispatcherShowMsg, - } -} \ No newline at end of file + public enum EViewAction + { + CloseWindow, + ShowYesNo, + SaveFileDialog, + AddBatchRoutingRulesYesNo, + AdjustMainLvColWidth, + SetClipboardData, + AddServerViaClipboard, + ImportRulesFromClipboard, + ProfilesFocus, + ShareSub, + ShareServer, + ShowHideWindow, + ScanScreenTask, + ScanImageTask, + Shutdown, + BrowseServer, + ImportRulesFromFile, + InitSettingFont, + SubEditWindow, + RoutingRuleSettingWindow, + RoutingRuleDetailsWindow, + AddServerWindow, + AddServer2Window, + DNSSettingWindow, + RoutingSettingWindow, + OptionSettingWindow, + GlobalHotkeySettingWindow, + SubSettingWindow, + DispatcherSpeedTest, + DispatcherRefreshConnections, + DispatcherRefreshProxyGroups, + DispatcherProxiesDelayTest, + DispatcherStatistics, + DispatcherServerAvailability, + DispatcherReload, + DispatcherRefreshServersBiz, + DispatcherRefreshIcon, + DispatcherCheckUpdate, + DispatcherCheckUpdateFinished, + DispatcherShowMsg, + } +} diff --git a/v2rayN/ServiceLib/FodyWeavers.xml b/v2rayN/ServiceLib/FodyWeavers.xml index 63fc1484..af4b7300 100644 --- a/v2rayN/ServiceLib/FodyWeavers.xml +++ b/v2rayN/ServiceLib/FodyWeavers.xml @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/v2rayN/ServiceLib/Global.cs b/v2rayN/ServiceLib/Global.cs index 9ea41964..7f7a45b9 100644 --- a/v2rayN/ServiceLib/Global.cs +++ b/v2rayN/ServiceLib/Global.cs @@ -1,505 +1,505 @@ -namespace ServiceLib +namespace ServiceLib { - public class Global - { - #region const + public class Global + { + #region const - public const string AppName = "v2rayN"; - public const string GithubUrl = "https://github.com"; - public const string GithubApiUrl = "https://api.github.com/repos"; - public const string V2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases"; - public const string XrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; - public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; - public const string MihomoCoreUrl = "https://github.com/MetaCubeX/mihomo/releases"; - public const string HysteriaCoreUrl = "https://github.com/apernet/hysteria/releases"; - public const string NaiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases"; - public const string TuicCoreUrl = "https://github.com/EAimTY/tuic/releases"; - public const string SingboxCoreUrl = "https://github.com/SagerNet/sing-box/releases"; - public const string GeoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; - public const string SpeedPingTestUrl = @"https://www.google.com/generate_204"; - public const string JuicityCoreUrl = "https://github.com/juicity/juicity/releases"; - public const string SingboxRulesetUrl = @"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-{0}/{1}.srs"; - public const string IPAPIUrl = "https://api.ip.sb/geoip"; + public const string AppName = "v2rayN"; + public const string GithubUrl = "https://github.com"; + public const string GithubApiUrl = "https://api.github.com/repos"; + public const string V2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases"; + public const string XrayCoreUrl = "https://github.com/XTLS/Xray-core/releases"; + public const string NUrl = @"https://github.com/2dust/v2rayN/releases"; + public const string MihomoCoreUrl = "https://github.com/MetaCubeX/mihomo/releases"; + public const string HysteriaCoreUrl = "https://github.com/apernet/hysteria/releases"; + public const string NaiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases"; + public const string TuicCoreUrl = "https://github.com/EAimTY/tuic/releases"; + public const string SingboxCoreUrl = "https://github.com/SagerNet/sing-box/releases"; + public const string GeoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat"; + public const string SpeedPingTestUrl = @"https://www.google.com/generate_204"; + public const string JuicityCoreUrl = "https://github.com/juicity/juicity/releases"; + public const string SingboxRulesetUrl = @"https://raw.githubusercontent.com/2dust/sing-box-rules/rule-set-{0}/{1}.srs"; + public const string IPAPIUrl = "https://api.ip.sb/geoip"; - public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw="; - public const string ConfigFileName = "guiNConfig.json"; - public const string CoreConfigFileName = "config.json"; - public const string CorePreConfigFileName = "configPre.json"; - public const string CoreSpeedtestConfigFileName = "configSpeedtest.json"; - public const string CoreMultipleLoadConfigFileName = "configMultipleLoad.json"; - public const string ClashMixinConfigFileName = "Mixin.yaml"; + public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw="; + public const string ConfigFileName = "guiNConfig.json"; + public const string CoreConfigFileName = "config.json"; + public const string CorePreConfigFileName = "configPre.json"; + public const string CoreSpeedtestConfigFileName = "configSpeedtest.json"; + public const string CoreMultipleLoadConfigFileName = "configMultipleLoad.json"; + public const string ClashMixinConfigFileName = "Mixin.yaml"; - public const string NamespaceSample = "ServiceLib.Sample."; - public const string V2raySampleClient = NamespaceSample + "SampleClientConfig"; - public const string SingboxSampleClient = NamespaceSample + "SingboxSampleClientConfig"; - public const string V2raySampleHttpRequestFileName = NamespaceSample + "SampleHttpRequest"; - public const string V2raySampleHttpResponseFileName = NamespaceSample + "SampleHttpResponse"; - public const string V2raySampleInbound = NamespaceSample + "SampleInbound"; - public const string V2raySampleOutbound = NamespaceSample + "SampleOutbound"; - public const string SingboxSampleOutbound = NamespaceSample + "SingboxSampleOutbound"; - public const string CustomRoutingFileName = NamespaceSample + "custom_routing_"; - public const string TunSingboxDNSFileName = NamespaceSample + "tun_singbox_dns"; - public const string TunSingboxInboundFileName = NamespaceSample + "tun_singbox_inbound"; - public const string TunSingboxRulesFileName = NamespaceSample + "tun_singbox_rules"; - public const string DNSV2rayNormalFileName = NamespaceSample + "dns_v2ray_normal"; - public const string DNSSingboxNormalFileName = NamespaceSample + "dns_singbox_normal"; - public const string ClashMixinYaml = NamespaceSample + "clash_mixin_yaml"; - public const string ClashTunYaml = NamespaceSample + "clash_tun_yaml"; - public const string LinuxAutostartConfig = NamespaceSample + "linux_autostart_config"; - public const string PacFileName = NamespaceSample + "pac"; + public const string NamespaceSample = "ServiceLib.Sample."; + public const string V2raySampleClient = NamespaceSample + "SampleClientConfig"; + public const string SingboxSampleClient = NamespaceSample + "SingboxSampleClientConfig"; + public const string V2raySampleHttpRequestFileName = NamespaceSample + "SampleHttpRequest"; + public const string V2raySampleHttpResponseFileName = NamespaceSample + "SampleHttpResponse"; + public const string V2raySampleInbound = NamespaceSample + "SampleInbound"; + public const string V2raySampleOutbound = NamespaceSample + "SampleOutbound"; + public const string SingboxSampleOutbound = NamespaceSample + "SingboxSampleOutbound"; + public const string CustomRoutingFileName = NamespaceSample + "custom_routing_"; + public const string TunSingboxDNSFileName = NamespaceSample + "tun_singbox_dns"; + public const string TunSingboxInboundFileName = NamespaceSample + "tun_singbox_inbound"; + public const string TunSingboxRulesFileName = NamespaceSample + "tun_singbox_rules"; + public const string DNSV2rayNormalFileName = NamespaceSample + "dns_v2ray_normal"; + public const string DNSSingboxNormalFileName = NamespaceSample + "dns_singbox_normal"; + public const string ClashMixinYaml = NamespaceSample + "clash_mixin_yaml"; + public const string ClashTunYaml = NamespaceSample + "clash_tun_yaml"; + public const string LinuxAutostartConfig = NamespaceSample + "linux_autostart_config"; + public const string PacFileName = NamespaceSample + "pac"; - public const string DefaultSecurity = "auto"; - public const string DefaultNetwork = "tcp"; - public const string TcpHeaderHttp = "http"; - public const string None = "none"; - public const string ProxyTag = "proxy"; - public const string DirectTag = "direct"; - public const string BlockTag = "block"; - public const string StreamSecurity = "tls"; - public const string StreamSecurityReality = "reality"; - public const string Loopback = "127.0.0.1"; - public const string InboundAPIProtocol = "dokodemo-door"; - public const string HttpProtocol = "http://"; - public const string HttpsProtocol = "https://"; - public const string SocksProtocol = "socks://"; - public const string Socks5Protocol = "socks5://"; + public const string DefaultSecurity = "auto"; + public const string DefaultNetwork = "tcp"; + public const string TcpHeaderHttp = "http"; + public const string None = "none"; + public const string ProxyTag = "proxy"; + public const string DirectTag = "direct"; + public const string BlockTag = "block"; + public const string StreamSecurity = "tls"; + public const string StreamSecurityReality = "reality"; + public const string Loopback = "127.0.0.1"; + public const string InboundAPIProtocol = "dokodemo-door"; + public const string HttpProtocol = "http://"; + public const string HttpsProtocol = "https://"; + public const string SocksProtocol = "socks://"; + public const string Socks5Protocol = "socks5://"; - public const string UserEMail = "t@t.tt"; - public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run"; - public const string AutoRunName = "v2rayNAutoRun"; - public const string SystemProxyExceptionsWindows = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; - public const string SystemProxyExceptionsLinux = "localhost,127.0.0.0/8,::1"; - public const string RoutingRuleComma = ""; - public const string GrpcGunMode = "gun"; - public const string GrpcMultiMode = "multi"; - public const int MaxPort = 65536; - public const string DelayUnit = ""; - public const string SpeedUnit = ""; - public const int MinFontSize = 8; - public const string RebootAs = "rebootas"; - public const string AvaAssets = "avares://v2rayN/Assets/"; - public const string LocalAppData = "V2RAYN_LOCAL_APPLICATION_DATA"; - public const string V2RayLocalAsset = "V2RAY_LOCATION_ASSET"; - public const string XrayLocalAsset = "XRAY_LOCATION_ASSET"; + public const string UserEMail = "t@t.tt"; + public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run"; + public const string AutoRunName = "v2rayNAutoRun"; + public const string SystemProxyExceptionsWindows = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; + public const string SystemProxyExceptionsLinux = "localhost,127.0.0.0/8,::1"; + public const string RoutingRuleComma = ""; + public const string GrpcGunMode = "gun"; + public const string GrpcMultiMode = "multi"; + public const int MaxPort = 65536; + public const string DelayUnit = ""; + public const string SpeedUnit = ""; + public const int MinFontSize = 8; + public const string RebootAs = "rebootas"; + public const string AvaAssets = "avares://v2rayN/Assets/"; + public const string LocalAppData = "V2RAYN_LOCAL_APPLICATION_DATA"; + public const string V2RayLocalAsset = "V2RAY_LOCATION_ASSET"; + public const string XrayLocalAsset = "XRAY_LOCATION_ASSET"; - public static readonly List IEProxyProtocols = - [ - "{ip}:{http_port}", - "socks={ip}:{socks_port}", - "http={ip}:{http_port};https={ip}:{http_port};ftp={ip}:{http_port};socks={ip}:{socks_port}", - "http=http://{ip}:{http_port};https=http://{ip}:{http_port}", - "" - ]; + public static readonly List IEProxyProtocols = + [ + "{ip}:{http_port}", + "socks={ip}:{socks_port}", + "http={ip}:{http_port};https={ip}:{http_port};ftp={ip}:{http_port};socks={ip}:{socks_port}", + "http=http://{ip}:{http_port};https=http://{ip}:{http_port}", + "" + ]; - public static readonly List SubConvertUrls = - [ - @"https://sub.xeton.dev/sub?url={0}", - @"https://api.dler.io/sub?url={0}", - @"http://127.0.0.1:25500/sub?url={0}", - "" - ]; + public static readonly List SubConvertUrls = + [ + @"https://sub.xeton.dev/sub?url={0}", + @"https://api.dler.io/sub?url={0}", + @"http://127.0.0.1:25500/sub?url={0}", + "" + ]; - public static readonly List SubConvertConfig = - [@"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/config/ACL4SSR_Online.ini"]; + public static readonly List SubConvertConfig = + [@"https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/config/ACL4SSR_Online.ini"]; - public static readonly List SubConvertTargets = - [ - "", - "mixed", - "v2ray", - "clash", - "ss" - ]; + public static readonly List SubConvertTargets = + [ + "", + "mixed", + "v2ray", + "clash", + "ss" + ]; - public static readonly List SpeedTestUrls = - [ - @"https://speed.cloudflare.com/__down?bytes=100000000", - @"https://speed.cloudflare.com/__down?bytes=50000000", - @"https://speed.cloudflare.com/__down?bytes=10000000", - @"https://cachefly.cachefly.net/50mb.test" - ]; + public static readonly List SpeedTestUrls = + [ + @"https://speed.cloudflare.com/__down?bytes=100000000", + @"https://speed.cloudflare.com/__down?bytes=50000000", + @"https://speed.cloudflare.com/__down?bytes=10000000", + @"https://cachefly.cachefly.net/50mb.test" + ]; - public static readonly List SpeedPingTestUrls = - [ - @"https://www.google.com/generate_204", - @"https://www.gstatic.com/generate_204", - @"https://www.apple.com/library/test/success.html", - @"http://www.msftconnecttest.com/connecttest.txt" - ]; + public static readonly List SpeedPingTestUrls = + [ + @"https://www.google.com/generate_204", + @"https://www.gstatic.com/generate_204", + @"https://www.apple.com/library/test/success.html", + @"http://www.msftconnecttest.com/connecttest.txt" + ]; - public static readonly List GeoFilesSources = - [ - "", - @"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/{0}.dat", - @"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-v2ray-rules@release/{0}.dat" - ]; + public static readonly List GeoFilesSources = + [ + "", + @"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/{0}.dat", + @"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-v2ray-rules@release/{0}.dat" + ]; - public static readonly List SingboxRulesetSources = - [ - "", - @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-rules-dat@release/sing-box/rule-set-{0}/{1}.srs", - @"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-sing-box-rules@rule-set/{1}.srs" - ]; + public static readonly List SingboxRulesetSources = + [ + "", + @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-rules-dat@release/sing-box/rule-set-{0}/{1}.srs", + @"https://cdn.jsdelivr.net/gh/chocolate4u/Iran-sing-box-rules@rule-set/{1}.srs" + ]; - public static readonly List RoutingRulesSources = - [ - "", - @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/template.json", - @"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/template.json" - ]; + public static readonly List RoutingRulesSources = + [ + "", + @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/template.json", + @"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/template.json" + ]; - public static readonly List DNSTemplateSources = - [ - "", - @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/", - @"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/" - ]; + public static readonly List DNSTemplateSources = + [ + "", + @"https://cdn.jsdelivr.net/gh/runetfreedom/russia-v2ray-custom-routing-list@main/v2rayN/", + @"https://cdn.jsdelivr.net/gh/Chocolate4U/Iran-v2ray-rules@main/v2rayN/" + ]; - public static readonly Dictionary UserAgentTexts = new() - { - {"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" }, - {"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" }, - {"safari","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" }, - {"edge","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70" }, - {"none",""} - }; + public static readonly Dictionary UserAgentTexts = new() + { + {"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" }, + {"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" }, + {"safari","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" }, + {"edge","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70" }, + {"none",""} + }; - public const string Hysteria2ProtocolShare = "hy2://"; + public const string Hysteria2ProtocolShare = "hy2://"; - public static readonly Dictionary ProtocolShares = new() - { - {EConfigType.VMess,"vmess://"}, - {EConfigType.Shadowsocks,"ss://"}, - {EConfigType.SOCKS,"socks://"}, - {EConfigType.VLESS,"vless://"}, - {EConfigType.Trojan,"trojan://"}, - {EConfigType.Hysteria2,"hysteria2://"}, - {EConfigType.TUIC,"tuic://"}, - {EConfigType.WireGuard,"wireguard://"} - }; + public static readonly Dictionary ProtocolShares = new() + { + {EConfigType.VMess,"vmess://"}, + {EConfigType.Shadowsocks,"ss://"}, + {EConfigType.SOCKS,"socks://"}, + {EConfigType.VLESS,"vless://"}, + {EConfigType.Trojan,"trojan://"}, + {EConfigType.Hysteria2,"hysteria2://"}, + {EConfigType.TUIC,"tuic://"}, + {EConfigType.WireGuard,"wireguard://"} + }; - public static readonly Dictionary ProtocolTypes = new() - { - {EConfigType.VMess,"vmess"}, - {EConfigType.Shadowsocks,"shadowsocks"}, - {EConfigType.SOCKS,"socks"}, - {EConfigType.HTTP,"http"}, - {EConfigType.VLESS,"vless"}, - {EConfigType.Trojan,"trojan"}, - {EConfigType.Hysteria2,"hysteria2"}, - {EConfigType.TUIC,"tuic"}, - {EConfigType.WireGuard,"wireguard"} - }; + public static readonly Dictionary ProtocolTypes = new() + { + {EConfigType.VMess,"vmess"}, + {EConfigType.Shadowsocks,"shadowsocks"}, + {EConfigType.SOCKS,"socks"}, + {EConfigType.HTTP,"http"}, + {EConfigType.VLESS,"vless"}, + {EConfigType.Trojan,"trojan"}, + {EConfigType.Hysteria2,"hysteria2"}, + {EConfigType.TUIC,"tuic"}, + {EConfigType.WireGuard,"wireguard"} + }; - public static readonly List VmessSecurities = - [ - "aes-128-gcm", - "chacha20-poly1305", - "auto", - "none", - "zero" - ]; + public static readonly List VmessSecurities = + [ + "aes-128-gcm", + "chacha20-poly1305", + "auto", + "none", + "zero" + ]; - public static readonly List SsSecurities = - [ - "aes-256-gcm", - "aes-128-gcm", - "chacha20-poly1305", - "chacha20-ietf-poly1305", - "none", - "plain" - ]; + public static readonly List SsSecurities = + [ + "aes-256-gcm", + "aes-128-gcm", + "chacha20-poly1305", + "chacha20-ietf-poly1305", + "none", + "plain" + ]; - public static readonly List SsSecuritiesInXray = - [ - "aes-256-gcm", - "aes-128-gcm", - "chacha20-poly1305", - "chacha20-ietf-poly1305", - "xchacha20-poly1305", - "xchacha20-ietf-poly1305", - "none", - "plain", - "2022-blake3-aes-128-gcm", - "2022-blake3-aes-256-gcm", - "2022-blake3-chacha20-poly1305" - ]; + public static readonly List SsSecuritiesInXray = + [ + "aes-256-gcm", + "aes-128-gcm", + "chacha20-poly1305", + "chacha20-ietf-poly1305", + "xchacha20-poly1305", + "xchacha20-ietf-poly1305", + "none", + "plain", + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305" + ]; - public static readonly List SsSecuritiesInSingbox = - [ - "aes-256-gcm", - "aes-192-gcm", - "aes-128-gcm", - "chacha20-ietf-poly1305", - "xchacha20-ietf-poly1305", - "none", - "2022-blake3-aes-128-gcm", - "2022-blake3-aes-256-gcm", - "2022-blake3-chacha20-poly1305", - "aes-128-ctr", - "aes-192-ctr", - "aes-256-ctr", - "aes-128-cfb", - "aes-192-cfb", - "aes-256-cfb", - "rc4-md5", - "chacha20-ietf", - "xchacha20" - ]; + public static readonly List SsSecuritiesInSingbox = + [ + "aes-256-gcm", + "aes-192-gcm", + "aes-128-gcm", + "chacha20-ietf-poly1305", + "xchacha20-ietf-poly1305", + "none", + "2022-blake3-aes-128-gcm", + "2022-blake3-aes-256-gcm", + "2022-blake3-chacha20-poly1305", + "aes-128-ctr", + "aes-192-ctr", + "aes-256-ctr", + "aes-128-cfb", + "aes-192-cfb", + "aes-256-cfb", + "rc4-md5", + "chacha20-ietf", + "xchacha20" + ]; - public static readonly List Flows = - [ - "", - "xtls-rprx-vision", - "xtls-rprx-vision-udp443" - ]; + public static readonly List Flows = + [ + "", + "xtls-rprx-vision", + "xtls-rprx-vision-udp443" + ]; - public static readonly List Networks = - [ - "tcp", - "kcp", - "ws", - "httpupgrade", - "xhttp", - "h2", - "quic", - "grpc" - ]; + public static readonly List Networks = + [ + "tcp", + "kcp", + "ws", + "httpupgrade", + "xhttp", + "h2", + "quic", + "grpc" + ]; - public static readonly List KcpHeaderTypes = - [ - "srtp", - "utp", - "wechat-video", - "dtls", - "wireguard" - ]; + public static readonly List KcpHeaderTypes = + [ + "srtp", + "utp", + "wechat-video", + "dtls", + "wireguard" + ]; - public static readonly List CoreTypes = - [ - "Xray", - "sing_box" - ]; + public static readonly List CoreTypes = + [ + "Xray", + "sing_box" + ]; - public static readonly List DomainStrategies = - [ - "AsIs", - "IPIfNonMatch", - "IPOnDemand" - ]; + public static readonly List DomainStrategies = + [ + "AsIs", + "IPIfNonMatch", + "IPOnDemand" + ]; - public static readonly List DomainStrategies4Singbox = - [ - "ipv4_only", - "ipv6_only", - "prefer_ipv4", - "prefer_ipv6", - "" - ]; + public static readonly List DomainStrategies4Singbox = + [ + "ipv4_only", + "ipv6_only", + "prefer_ipv4", + "prefer_ipv6", + "" + ]; - public static readonly List DomainMatchers = - [ - "linear", - "mph", - "" - ]; + public static readonly List DomainMatchers = + [ + "linear", + "mph", + "" + ]; - public static readonly List Fingerprints = - [ - "chrome", - "firefox", - "safari", - "ios", - "android", - "edge", - "360", - "qq", - "random", - "randomized", - "" - ]; + public static readonly List Fingerprints = + [ + "chrome", + "firefox", + "safari", + "ios", + "android", + "edge", + "360", + "qq", + "random", + "randomized", + "" + ]; - public static readonly List UserAgent = - [ - "chrome", - "firefox", - "safari", - "edge", - "none" - ]; + public static readonly List UserAgent = + [ + "chrome", + "firefox", + "safari", + "edge", + "none" + ]; - public static readonly List XhttpMode = - [ - "auto", - "packet-up", - "stream-up", - "stream-one" - ]; + public static readonly List XhttpMode = + [ + "auto", + "packet-up", + "stream-up", + "stream-one" + ]; - public static readonly List AllowInsecure = - [ - "true", - "false", - "" - ]; + public static readonly List AllowInsecure = + [ + "true", + "false", + "" + ]; - public static readonly List DomainStrategy4Freedoms = - [ - "AsIs", - "UseIP", - "UseIPv4", - "UseIPv6", - "" - ]; + public static readonly List DomainStrategy4Freedoms = + [ + "AsIs", + "UseIP", + "UseIPv4", + "UseIPv6", + "" + ]; - public static readonly List SingboxDomainStrategy4Out = - [ - "ipv4_only", - "prefer_ipv4", - "prefer_ipv6", - "ipv6_only", - "" - ]; + public static readonly List SingboxDomainStrategy4Out = + [ + "ipv4_only", + "prefer_ipv4", + "prefer_ipv6", + "ipv6_only", + "" + ]; - public static readonly List DomainDNSAddress = - [ - "223.5.5.5", - "223.6.6.6", - "localhost" - ]; + public static readonly List DomainDNSAddress = + [ + "223.5.5.5", + "223.6.6.6", + "localhost" + ]; - public static readonly List SingboxDomainDNSAddress = - [ - "223.5.5.5", - "223.6.6.6", - "dhcp://auto" - ]; + public static readonly List SingboxDomainDNSAddress = + [ + "223.5.5.5", + "223.6.6.6", + "dhcp://auto" + ]; - public static readonly List Languages = - [ - "zh-Hans", - "zh-Hant", - "en", - "fa-Ir", - "ru", - "hu" - ]; + public static readonly List Languages = + [ + "zh-Hans", + "zh-Hant", + "en", + "fa-Ir", + "ru", + "hu" + ]; - public static readonly List Alpns = - [ - "h3", - "h2", - "http/1.1", - "h3,h2", - "h2,http/1.1", - "h3,h2,http/1.1", - "" - ]; + public static readonly List Alpns = + [ + "h3", + "h2", + "http/1.1", + "h3,h2", + "h2,http/1.1", + "h3,h2,http/1.1", + "" + ]; - public static readonly List LogLevels = - [ - "debug", - "info", - "warning", - "error", - "none" - ]; + public static readonly List LogLevels = + [ + "debug", + "info", + "warning", + "error", + "none" + ]; - public static readonly List InboundTags = - [ - "socks", - "socks2", - "socks3" - ]; + public static readonly List InboundTags = + [ + "socks", + "socks2", + "socks3" + ]; - public static readonly List RuleProtocols = - [ - "http", - "tls", - "bittorrent" - ]; + public static readonly List RuleProtocols = + [ + "http", + "tls", + "bittorrent" + ]; - public static readonly List RuleNetworks = - [ - "", - "tcp", - "udp", - "tcp,udp" - ]; + public static readonly List RuleNetworks = + [ + "", + "tcp", + "udp", + "tcp,udp" + ]; - public static readonly List destOverrideProtocols = - [ - "http", - "tls", - "quic", - "fakedns", - "fakedns+others" - ]; + public static readonly List destOverrideProtocols = + [ + "http", + "tls", + "quic", + "fakedns", + "fakedns+others" + ]; - public static readonly List TunMtus = - [ - "1280", - "1408", - "1500", - "9000" - ]; + public static readonly List TunMtus = + [ + "1280", + "1408", + "1500", + "9000" + ]; - public static readonly List TunStacks = - [ - "gvisor", - "system", - "mixed" - ]; + public static readonly List TunStacks = + [ + "gvisor", + "system", + "mixed" + ]; - public static readonly List PresetMsgFilters = - [ - "proxy", - "direct", - "block", - "" - ]; + public static readonly List PresetMsgFilters = + [ + "proxy", + "direct", + "block", + "" + ]; - public static readonly List SingboxMuxs = - [ - "h2mux", - "smux", - "yamux", - "" - ]; + public static readonly List SingboxMuxs = + [ + "h2mux", + "smux", + "yamux", + "" + ]; - public static readonly List TuicCongestionControls = - [ - "cubic", - "new_reno", - "bbr" - ]; + public static readonly List TuicCongestionControls = + [ + "cubic", + "new_reno", + "bbr" + ]; - public static readonly List allowSelectType = - [ - "selector", - "urltest", - "loadbalance", - "fallback" - ]; + public static readonly List allowSelectType = + [ + "selector", + "urltest", + "loadbalance", + "fallback" + ]; - public static readonly List notAllowTestType = - [ - "selector", - "urltest", - "direct", - "reject", - "compatible", - "pass", - "loadbalance", - "fallback" - ]; + public static readonly List notAllowTestType = + [ + "selector", + "urltest", + "direct", + "reject", + "compatible", + "pass", + "loadbalance", + "fallback" + ]; - public static readonly List proxyVehicleType = - [ - "file", - "http" - ]; + public static readonly List proxyVehicleType = + [ + "file", + "http" + ]; - #endregion const - } -} \ No newline at end of file + #endregion const + } +} diff --git a/v2rayN/ServiceLib/GlobalUsings.cs b/v2rayN/ServiceLib/GlobalUsings.cs index a4bf3ccd..98014d8e 100644 --- a/v2rayN/ServiceLib/GlobalUsings.cs +++ b/v2rayN/ServiceLib/GlobalUsings.cs @@ -1,11 +1,11 @@ -global using ServiceLib.Base; +global using ServiceLib.Base; global using ServiceLib.Common; global using ServiceLib.Enums; global using ServiceLib.Handler; global using ServiceLib.Handler.Fmt; -global using ServiceLib.Services; -global using ServiceLib.Services.Statistics; -global using ServiceLib.Services.CoreConfig; +global using ServiceLib.Handler.SysProxy; global using ServiceLib.Models; global using ServiceLib.Resx; -global using ServiceLib.Handler.SysProxy; \ No newline at end of file +global using ServiceLib.Services; +global using ServiceLib.Services.CoreConfig; +global using ServiceLib.Services.Statistics; diff --git a/v2rayN/ServiceLib/Handler/AppHandler.cs b/v2rayN/ServiceLib/Handler/AppHandler.cs index 72a080e8..33ef61c7 100644 --- a/v2rayN/ServiceLib/Handler/AppHandler.cs +++ b/v2rayN/ServiceLib/Handler/AppHandler.cs @@ -1,255 +1,255 @@ -namespace ServiceLib.Handler +namespace ServiceLib.Handler { - public sealed class AppHandler - { - #region Property + public sealed class AppHandler + { + #region Property - private static readonly Lazy _instance = new(() => new()); - private Config _config; - private int? _statePort; - private int? _statePort2; - private Job? _processJob; - private bool? _isAdministrator; - public static AppHandler Instance => _instance.Value; - public Config Config => _config; + private static readonly Lazy _instance = new(() => new()); + private Config _config; + private int? _statePort; + private int? _statePort2; + private Job? _processJob; + private bool? _isAdministrator; + public static AppHandler Instance => _instance.Value; + public Config Config => _config; - public int StatePort - { - get - { - _statePort ??= Utils.GetFreePort(GetLocalPort(EInboundProtocol.api)); - return _statePort.Value; - } - } + public int StatePort + { + get + { + _statePort ??= Utils.GetFreePort(GetLocalPort(EInboundProtocol.api)); + return _statePort.Value; + } + } - public int StatePort2 - { - get - { - _statePort2 ??= Utils.GetFreePort(GetLocalPort(EInboundProtocol.api2)); - return _statePort2.Value + (_config.TunModeItem.EnableTun ? 1 : 0); - } - } + public int StatePort2 + { + get + { + _statePort2 ??= Utils.GetFreePort(GetLocalPort(EInboundProtocol.api2)); + return _statePort2.Value + (_config.TunModeItem.EnableTun ? 1 : 0); + } + } - public bool IsAdministrator - { - get - { - _isAdministrator ??= Utils.IsAdministrator(); - return _isAdministrator.Value; - } - } + public bool IsAdministrator + { + get + { + _isAdministrator ??= Utils.IsAdministrator(); + return _isAdministrator.Value; + } + } - #endregion Property + #endregion Property - #region Init + #region Init - public bool InitApp() - { - if (Utils.HasWritePermission() == false) - { - Environment.SetEnvironmentVariable(Global.LocalAppData, "1", EnvironmentVariableTarget.Process); - } + public bool InitApp() + { + if (Utils.HasWritePermission() == false) + { + Environment.SetEnvironmentVariable(Global.LocalAppData, "1", EnvironmentVariableTarget.Process); + } - Logging.Setup(); - var config = ConfigHandler.LoadConfig(); - if (config == null) - { - return false; - } - _config = config; - Thread.CurrentThread.CurrentUICulture = new(_config.UiItem.CurrentLanguage); + Logging.Setup(); + var config = ConfigHandler.LoadConfig(); + if (config == null) + { + return false; + } + _config = config; + Thread.CurrentThread.CurrentUICulture = new(_config.UiItem.CurrentLanguage); - //Under Win10 - if (Utils.IsWindows() && Environment.OSVersion.Version.Major < 10) - { - Environment.SetEnvironmentVariable("DOTNET_EnableWriteXorExecute", "0", EnvironmentVariableTarget.User); - } + //Under Win10 + if (Utils.IsWindows() && Environment.OSVersion.Version.Major < 10) + { + Environment.SetEnvironmentVariable("DOTNET_EnableWriteXorExecute", "0", EnvironmentVariableTarget.User); + } - SQLiteHelper.Instance.CreateTable(); - SQLiteHelper.Instance.CreateTable(); - SQLiteHelper.Instance.CreateTable(); - SQLiteHelper.Instance.CreateTable(); - SQLiteHelper.Instance.CreateTable(); - SQLiteHelper.Instance.CreateTable(); - return true; - } + SQLiteHelper.Instance.CreateTable(); + SQLiteHelper.Instance.CreateTable(); + SQLiteHelper.Instance.CreateTable(); + SQLiteHelper.Instance.CreateTable(); + SQLiteHelper.Instance.CreateTable(); + SQLiteHelper.Instance.CreateTable(); + return true; + } - public bool InitComponents() - { - Logging.SaveLog($"v2rayN start up | {Utils.GetRuntimeInfo()}"); - Logging.LoggingEnabled(_config.GuiItem.EnableLog); + public bool InitComponents() + { + Logging.SaveLog($"v2rayN start up | {Utils.GetRuntimeInfo()}"); + Logging.LoggingEnabled(_config.GuiItem.EnableLog); - ClearExpiredFiles(); + ClearExpiredFiles(); - return true; - } + return true; + } - public bool Reset() - { - _statePort = null; - _statePort2 = null; - return true; - } + public bool Reset() + { + _statePort = null; + _statePort2 = null; + return true; + } - private void ClearExpiredFiles() - { - Task.Run(() => - { - FileManager.DeleteExpiredFiles(Utils.GetLogPath(), DateTime.Now.AddMonths(-1)); - FileManager.DeleteExpiredFiles(Utils.GetTempPath(), DateTime.Now.AddMonths(-1)); - }); - } + private void ClearExpiredFiles() + { + Task.Run(() => + { + FileManager.DeleteExpiredFiles(Utils.GetLogPath(), DateTime.Now.AddMonths(-1)); + FileManager.DeleteExpiredFiles(Utils.GetTempPath(), DateTime.Now.AddMonths(-1)); + }); + } - #endregion Init + #endregion Init - #region Config + #region Config - public int GetLocalPort(EInboundProtocol protocol) - { - var localPort = _config.Inbound.FirstOrDefault(t => t.Protocol == nameof(EInboundProtocol.socks))?.LocalPort ?? 10808; - return localPort + (int)protocol; - } + public int GetLocalPort(EInboundProtocol protocol) + { + var localPort = _config.Inbound.FirstOrDefault(t => t.Protocol == nameof(EInboundProtocol.socks))?.LocalPort ?? 10808; + return localPort + (int)protocol; + } - public void AddProcess(IntPtr processHandle) - { - if (Utils.IsWindows()) - { - _processJob ??= new(); - try - { - _processJob?.AddProcess(processHandle); - } - catch - { - } - } - } + public void AddProcess(IntPtr processHandle) + { + if (Utils.IsWindows()) + { + _processJob ??= new(); + try + { + _processJob?.AddProcess(processHandle); + } + catch + { + } + } + } - #endregion Config + #endregion Config - #region SqliteHelper + #region SqliteHelper - public async Task?> SubItems() - { - return await SQLiteHelper.Instance.TableAsync().OrderBy(t => t.Sort).ToListAsync(); - } + public async Task?> SubItems() + { + return await SQLiteHelper.Instance.TableAsync().OrderBy(t => t.Sort).ToListAsync(); + } - public async Task GetSubItem(string? subid) - { - return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.Id == subid); - } + public async Task GetSubItem(string? subid) + { + return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.Id == subid); + } - public async Task?> ProfileItems(string subid) - { - if (Utils.IsNullOrEmpty(subid)) - { - return await SQLiteHelper.Instance.TableAsync().ToListAsync(); - } - else - { - return await SQLiteHelper.Instance.TableAsync().Where(t => t.Subid == subid).ToListAsync(); - } - } + public async Task?> ProfileItems(string subid) + { + if (Utils.IsNullOrEmpty(subid)) + { + return await SQLiteHelper.Instance.TableAsync().ToListAsync(); + } + else + { + return await SQLiteHelper.Instance.TableAsync().Where(t => t.Subid == subid).ToListAsync(); + } + } - public async Task?> ProfileItemIndexes(string subid) - { - return (await ProfileItems(subid))?.Select(t => t.IndexId)?.ToList(); - } + public async Task?> ProfileItemIndexes(string subid) + { + return (await ProfileItems(subid))?.Select(t => t.IndexId)?.ToList(); + } - public async Task?> ProfileItems(string subid, string filter) - { - var sql = @$"select a.* + public async Task?> ProfileItems(string subid, string filter) + { + var sql = @$"select a.* ,b.remarks subRemarks from ProfileItem a left join SubItem b on a.subid = b.id where 1=1 "; - if (Utils.IsNotEmpty(subid)) - { - sql += $" and a.subid = '{subid}'"; - } - if (Utils.IsNotEmpty(filter)) - { - if (filter.Contains('\'')) - { - filter = filter.Replace("'", ""); - } - sql += string.Format(" and (a.remarks like '%{0}%' or a.address like '%{0}%') ", filter); - } + if (Utils.IsNotEmpty(subid)) + { + sql += $" and a.subid = '{subid}'"; + } + if (Utils.IsNotEmpty(filter)) + { + if (filter.Contains('\'')) + { + filter = filter.Replace("'", ""); + } + sql += string.Format(" and (a.remarks like '%{0}%' or a.address like '%{0}%') ", filter); + } - return await SQLiteHelper.Instance.QueryAsync(sql); - } + return await SQLiteHelper.Instance.QueryAsync(sql); + } - public async Task GetProfileItem(string indexId) - { - if (Utils.IsNullOrEmpty(indexId)) - { - return null; - } - return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.IndexId == indexId); - } + public async Task GetProfileItem(string indexId) + { + if (Utils.IsNullOrEmpty(indexId)) + { + return null; + } + return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.IndexId == indexId); + } - public async Task GetProfileItemViaRemarks(string? remarks) - { - if (Utils.IsNullOrEmpty(remarks)) - { - return null; - } - return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.Remarks == remarks); - } + public async Task GetProfileItemViaRemarks(string? remarks) + { + if (Utils.IsNullOrEmpty(remarks)) + { + return null; + } + return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.Remarks == remarks); + } - public async Task?> RoutingItems() - { - return await SQLiteHelper.Instance.TableAsync().OrderBy(t => t.Sort).ToListAsync(); - } + public async Task?> RoutingItems() + { + return await SQLiteHelper.Instance.TableAsync().OrderBy(t => t.Sort).ToListAsync(); + } - public async Task GetRoutingItem(string id) - { - return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.Id == id); - } + public async Task GetRoutingItem(string id) + { + return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.Id == id); + } - public async Task?> DNSItems() - { - return await SQLiteHelper.Instance.TableAsync().ToListAsync(); - } + public async Task?> DNSItems() + { + return await SQLiteHelper.Instance.TableAsync().ToListAsync(); + } - public async Task GetDNSItem(ECoreType eCoreType) - { - return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.CoreType == eCoreType); - } + public async Task GetDNSItem(ECoreType eCoreType) + { + return await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(it => it.CoreType == eCoreType); + } - #endregion SqliteHelper + #endregion SqliteHelper - #region Core Type + #region Core Type - public List GetShadowsocksSecurities(ProfileItem profileItem) - { - var coreType = GetCoreType(profileItem, EConfigType.Shadowsocks); - switch (coreType) - { - case ECoreType.v2fly: - return Global.SsSecurities; + public List GetShadowsocksSecurities(ProfileItem profileItem) + { + var coreType = GetCoreType(profileItem, EConfigType.Shadowsocks); + switch (coreType) + { + case ECoreType.v2fly: + return Global.SsSecurities; - case ECoreType.Xray: - return Global.SsSecuritiesInXray; + case ECoreType.Xray: + return Global.SsSecuritiesInXray; - case ECoreType.sing_box: - return Global.SsSecuritiesInSingbox; - } - return Global.SsSecuritiesInSingbox; - } + case ECoreType.sing_box: + return Global.SsSecuritiesInSingbox; + } + return Global.SsSecuritiesInSingbox; + } - public ECoreType GetCoreType(ProfileItem profileItem, EConfigType eConfigType) - { - if (profileItem?.CoreType != null) - { - return (ECoreType)profileItem.CoreType; - } + public ECoreType GetCoreType(ProfileItem profileItem, EConfigType eConfigType) + { + if (profileItem?.CoreType != null) + { + return (ECoreType)profileItem.CoreType; + } - var item = _config.CoreTypeItem?.FirstOrDefault(it => it.ConfigType == eConfigType); - return item?.CoreType ?? ECoreType.Xray; - } + var item = _config.CoreTypeItem?.FirstOrDefault(it => it.ConfigType == eConfigType); + return item?.CoreType ?? ECoreType.Xray; + } - #endregion Core Type - } -} \ No newline at end of file + #endregion Core Type + } +} diff --git a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs index e6ac42d3..768454e7 100644 --- a/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs +++ b/v2rayN/ServiceLib/Handler/AutoStartupHandler.cs @@ -1,165 +1,165 @@ -using System.Security.Principal; +using System.Security.Principal; using System.Text.RegularExpressions; namespace ServiceLib.Handler { - public static class AutoStartupHandler - { - private static readonly string _tag = "AutoStartupHandler"; + public static class AutoStartupHandler + { + private static readonly string _tag = "AutoStartupHandler"; - public static async Task UpdateTask(Config config) - { - if (Utils.IsWindows()) - { - await ClearTaskWindows(); + public static async Task UpdateTask(Config config) + { + if (Utils.IsWindows()) + { + await ClearTaskWindows(); - if (config.GuiItem.AutoRun) - { - await SetTaskWindows(); - } - } - else if (Utils.IsLinux()) - { - await ClearTaskLinux(); + if (config.GuiItem.AutoRun) + { + await SetTaskWindows(); + } + } + else if (Utils.IsLinux()) + { + await ClearTaskLinux(); - if (config.GuiItem.AutoRun) - { - await SetTaskLinux(); - } - } - else if (Utils.IsOSX()) - { - //TODO - } + if (config.GuiItem.AutoRun) + { + await SetTaskLinux(); + } + } + else if (Utils.IsOSX()) + { + //TODO + } - return true; - } + return true; + } - #region Windows + #region Windows - private static async Task ClearTaskWindows() - { - var autoRunName = GetAutoRunNameWindows(); - WindowsUtils.RegWriteValue(Global.AutoRunRegPath, autoRunName, ""); - if (Utils.IsAdministrator()) - { - AutoStartTaskService(autoRunName, "", ""); - } + private static async Task ClearTaskWindows() + { + var autoRunName = GetAutoRunNameWindows(); + WindowsUtils.RegWriteValue(Global.AutoRunRegPath, autoRunName, ""); + if (Utils.IsAdministrator()) + { + AutoStartTaskService(autoRunName, "", ""); + } - await Task.CompletedTask; - } + await Task.CompletedTask; + } - private static async Task SetTaskWindows() - { - try - { - var autoRunName = GetAutoRunNameWindows(); - var exePath = Utils.GetExePath(); - if (Utils.IsAdministrator()) - { - AutoStartTaskService(autoRunName, exePath, ""); - } - else - { - WindowsUtils.RegWriteValue(Global.AutoRunRegPath, autoRunName, exePath.AppendQuotes()); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - await Task.CompletedTask; - } + private static async Task SetTaskWindows() + { + try + { + var autoRunName = GetAutoRunNameWindows(); + var exePath = Utils.GetExePath(); + if (Utils.IsAdministrator()) + { + AutoStartTaskService(autoRunName, exePath, ""); + } + else + { + WindowsUtils.RegWriteValue(Global.AutoRunRegPath, autoRunName, exePath.AppendQuotes()); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + await Task.CompletedTask; + } - /// - /// Auto Start via TaskService - /// - /// - /// - /// - /// - public static void AutoStartTaskService(string taskName, string fileName, string description) - { - if (Utils.IsNullOrEmpty(taskName)) - { - return; - } + /// + /// Auto Start via TaskService + /// + /// + /// + /// + /// + public static void AutoStartTaskService(string taskName, string fileName, string description) + { + if (Utils.IsNullOrEmpty(taskName)) + { + return; + } - var logonUser = WindowsIdentity.GetCurrent().Name; - using var taskService = new Microsoft.Win32.TaskScheduler.TaskService(); - var tasks = taskService.RootFolder.GetTasks(new Regex(taskName)); - if (Utils.IsNullOrEmpty(fileName)) - { - foreach (var t in tasks) - { - taskService.RootFolder.DeleteTask(t.Name); - } - return; - } + var logonUser = WindowsIdentity.GetCurrent().Name; + using var taskService = new Microsoft.Win32.TaskScheduler.TaskService(); + var tasks = taskService.RootFolder.GetTasks(new Regex(taskName)); + if (Utils.IsNullOrEmpty(fileName)) + { + foreach (var t in tasks) + { + taskService.RootFolder.DeleteTask(t.Name); + } + return; + } - var task = taskService.NewTask(); - task.RegistrationInfo.Description = description; - task.Settings.DisallowStartIfOnBatteries = false; - task.Settings.StopIfGoingOnBatteries = false; - task.Settings.RunOnlyIfIdle = false; - task.Settings.IdleSettings.StopOnIdleEnd = false; - task.Settings.ExecutionTimeLimit = TimeSpan.Zero; - task.Triggers.Add(new Microsoft.Win32.TaskScheduler.LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromSeconds(10) }); - task.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest; - task.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(fileName.AppendQuotes(), null, Path.GetDirectoryName(fileName))); + var task = taskService.NewTask(); + task.RegistrationInfo.Description = description; + task.Settings.DisallowStartIfOnBatteries = false; + task.Settings.StopIfGoingOnBatteries = false; + task.Settings.RunOnlyIfIdle = false; + task.Settings.IdleSettings.StopOnIdleEnd = false; + task.Settings.ExecutionTimeLimit = TimeSpan.Zero; + task.Triggers.Add(new Microsoft.Win32.TaskScheduler.LogonTrigger { UserId = logonUser, Delay = TimeSpan.FromSeconds(10) }); + task.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest; + task.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(fileName.AppendQuotes(), null, Path.GetDirectoryName(fileName))); - taskService.RootFolder.RegisterTaskDefinition(taskName, task); - } + taskService.RootFolder.RegisterTaskDefinition(taskName, task); + } - private static string GetAutoRunNameWindows() - { - return $"{Global.AutoRunName}_{Utils.GetMd5(Utils.StartupPath())}"; - } + private static string GetAutoRunNameWindows() + { + return $"{Global.AutoRunName}_{Utils.GetMd5(Utils.StartupPath())}"; + } - #endregion Windows + #endregion Windows - #region Linux + #region Linux - private static async Task ClearTaskLinux() - { - try - { - File.Delete(GetHomePathLinux()); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - await Task.CompletedTask; - } + private static async Task ClearTaskLinux() + { + try + { + File.Delete(GetHomePathLinux()); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + await Task.CompletedTask; + } - private static async Task SetTaskLinux() - { - try - { - var linuxConfig = Utils.GetEmbedText(Global.LinuxAutostartConfig); - if (linuxConfig.IsNotEmpty()) - { - linuxConfig = linuxConfig.Replace("$ExecPath$", Utils.GetExePath()); - Logging.SaveLog(linuxConfig); + private static async Task SetTaskLinux() + { + try + { + var linuxConfig = Utils.GetEmbedText(Global.LinuxAutostartConfig); + if (linuxConfig.IsNotEmpty()) + { + linuxConfig = linuxConfig.Replace("$ExecPath$", Utils.GetExePath()); + Logging.SaveLog(linuxConfig); - var homePath = GetHomePathLinux(); - await File.WriteAllTextAsync(homePath, linuxConfig); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + var homePath = GetHomePathLinux(); + await File.WriteAllTextAsync(homePath, linuxConfig); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - private static string GetHomePathLinux() - { - var homePath = Path.Combine(Utils.GetHomePath(), ".config", "autostart", $"{Global.AppName}.desktop"); - Directory.CreateDirectory(Path.GetDirectoryName(homePath)); - return homePath; - } + private static string GetHomePathLinux() + { + var homePath = Path.Combine(Utils.GetHomePath(), ".config", "autostart", $"{Global.AppName}.desktop"); + Directory.CreateDirectory(Path.GetDirectoryName(homePath)); + return homePath; + } - #endregion Linux - } -} \ No newline at end of file + #endregion Linux + } +} diff --git a/v2rayN/ServiceLib/Handler/ClashApiHandler.cs b/v2rayN/ServiceLib/Handler/ClashApiHandler.cs index 81d92b04..0ffd62b4 100644 --- a/v2rayN/ServiceLib/Handler/ClashApiHandler.cs +++ b/v2rayN/ServiceLib/Handler/ClashApiHandler.cs @@ -1,197 +1,197 @@ -using static ServiceLib.Models.ClashProxies; +using static ServiceLib.Models.ClashProxies; namespace ServiceLib.Handler { - public sealed class ClashApiHandler - { - private static readonly Lazy instance = new(() => new()); - public static ClashApiHandler Instance => instance.Value; + public sealed class ClashApiHandler + { + private static readonly Lazy instance = new(() => new()); + public static ClashApiHandler Instance => instance.Value; - private Dictionary? _proxies; - public Dictionary ProfileContent { get; set; } - private static readonly string _tag = "ClashApiHandler"; + private Dictionary? _proxies; + public Dictionary ProfileContent { get; set; } + private static readonly string _tag = "ClashApiHandler"; - public async Task?> GetClashProxiesAsync(Config config) - { - for (var i = 0; i < 5; i++) - { - var url = $"{GetApiUrl()}/proxies"; - var result = await HttpClientHelper.Instance.TryGetAsync(url); - var clashProxies = JsonUtils.Deserialize(result); + public async Task?> GetClashProxiesAsync(Config config) + { + for (var i = 0; i < 5; i++) + { + var url = $"{GetApiUrl()}/proxies"; + var result = await HttpClientHelper.Instance.TryGetAsync(url); + var clashProxies = JsonUtils.Deserialize(result); - var url2 = $"{GetApiUrl()}/providers/proxies"; - var result2 = await HttpClientHelper.Instance.TryGetAsync(url2); - var clashProviders = JsonUtils.Deserialize(result2); + var url2 = $"{GetApiUrl()}/providers/proxies"; + var result2 = await HttpClientHelper.Instance.TryGetAsync(url2); + var clashProviders = JsonUtils.Deserialize(result2); - if (clashProxies != null || clashProviders != null) - { - _proxies = clashProxies?.proxies; - return new Tuple(clashProxies, clashProviders); - } + if (clashProxies != null || clashProviders != null) + { + _proxies = clashProxies?.proxies; + return new Tuple(clashProxies, clashProviders); + } - await Task.Delay(2000); - } + await Task.Delay(2000); + } - return null; - } + return null; + } - public void ClashProxiesDelayTest(bool blAll, List lstProxy, Action updateFunc) - { - Task.Run(() => - { - if (blAll) - { - for (int i = 0; i < 5; i++) - { - if (_proxies != null) - { - break; - } - Task.Delay(5000).Wait(); - } - if (_proxies == null) - { - return; - } - lstProxy = new List(); - foreach (KeyValuePair kv in _proxies) - { - if (Global.notAllowTestType.Contains(kv.Value.type.ToLower())) - { - continue; - } - lstProxy.Add(new ClashProxyModel() - { - Name = kv.Value.name, - Type = kv.Value.type.ToLower(), - }); - } - } + public void ClashProxiesDelayTest(bool blAll, List lstProxy, Action updateFunc) + { + Task.Run(() => + { + if (blAll) + { + for (int i = 0; i < 5; i++) + { + if (_proxies != null) + { + break; + } + Task.Delay(5000).Wait(); + } + if (_proxies == null) + { + return; + } + lstProxy = new List(); + foreach (KeyValuePair kv in _proxies) + { + if (Global.notAllowTestType.Contains(kv.Value.type.ToLower())) + { + continue; + } + lstProxy.Add(new ClashProxyModel() + { + Name = kv.Value.name, + Type = kv.Value.type.ToLower(), + }); + } + } - if (lstProxy == null) - { - return; - } - var urlBase = $"{GetApiUrl()}/proxies"; - urlBase += @"/{0}/delay?timeout=10000&url=" + AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl; + if (lstProxy == null) + { + return; + } + var urlBase = $"{GetApiUrl()}/proxies"; + urlBase += @"/{0}/delay?timeout=10000&url=" + AppHandler.Instance.Config.SpeedTestItem.SpeedPingTestUrl; - List tasks = new List(); - foreach (var it in lstProxy) - { - if (Global.notAllowTestType.Contains(it.Type.ToLower())) - { - continue; - } - var name = it.Name; - var url = string.Format(urlBase, name); - tasks.Add(Task.Run(async () => - { - var result = await HttpClientHelper.Instance.TryGetAsync(url); - updateFunc?.Invoke(it, result); - })); - } - Task.WaitAll(tasks.ToArray()); + List tasks = new List(); + foreach (var it in lstProxy) + { + if (Global.notAllowTestType.Contains(it.Type.ToLower())) + { + continue; + } + var name = it.Name; + var url = string.Format(urlBase, name); + tasks.Add(Task.Run(async () => + { + var result = await HttpClientHelper.Instance.TryGetAsync(url); + updateFunc?.Invoke(it, result); + })); + } + Task.WaitAll(tasks.ToArray()); - Task.Delay(1000).Wait(); - updateFunc?.Invoke(null, ""); - }); - } + Task.Delay(1000).Wait(); + updateFunc?.Invoke(null, ""); + }); + } - public List? GetClashProxyGroups() - { - try - { - var fileContent = ProfileContent; - if (fileContent is null || fileContent?.ContainsKey("proxy-groups") == false) - { - return null; - } - return JsonUtils.Deserialize>(JsonUtils.Serialize(fileContent["proxy-groups"])); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return null; - } - } + public List? GetClashProxyGroups() + { + try + { + var fileContent = ProfileContent; + if (fileContent is null || fileContent?.ContainsKey("proxy-groups") == false) + { + return null; + } + return JsonUtils.Deserialize>(JsonUtils.Serialize(fileContent["proxy-groups"])); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return null; + } + } - public async Task ClashSetActiveProxy(string name, string nameNode) - { - try - { - var url = $"{GetApiUrl()}/proxies/{name}"; - Dictionary headers = new Dictionary(); - headers.Add("name", nameNode); - await HttpClientHelper.Instance.PutAsync(url, headers); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public async Task ClashSetActiveProxy(string name, string nameNode) + { + try + { + var url = $"{GetApiUrl()}/proxies/{name}"; + Dictionary headers = new Dictionary(); + headers.Add("name", nameNode); + await HttpClientHelper.Instance.PutAsync(url, headers); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public async Task ClashConfigUpdate(Dictionary headers) - { - if (_proxies == null) - { - return; - } + public async Task ClashConfigUpdate(Dictionary headers) + { + if (_proxies == null) + { + return; + } - var urlBase = $"{GetApiUrl()}/configs"; + var urlBase = $"{GetApiUrl()}/configs"; - await HttpClientHelper.Instance.PatchAsync(urlBase, headers); - } + await HttpClientHelper.Instance.PatchAsync(urlBase, headers); + } - public async Task ClashConfigReload(string filePath) - { - await ClashConnectionClose(""); - try - { - var url = $"{GetApiUrl()}/configs?force=true"; - Dictionary headers = new Dictionary(); - headers.Add("path", filePath); - await HttpClientHelper.Instance.PutAsync(url, headers); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public async Task ClashConfigReload(string filePath) + { + await ClashConnectionClose(""); + try + { + var url = $"{GetApiUrl()}/configs?force=true"; + Dictionary headers = new Dictionary(); + headers.Add("path", filePath); + await HttpClientHelper.Instance.PutAsync(url, headers); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public async Task GetClashConnectionsAsync(Config config) - { - try - { - var url = $"{GetApiUrl()}/connections"; - var result = await HttpClientHelper.Instance.TryGetAsync(url); - var clashConnections = JsonUtils.Deserialize(result); + public async Task GetClashConnectionsAsync(Config config) + { + try + { + var url = $"{GetApiUrl()}/connections"; + var result = await HttpClientHelper.Instance.TryGetAsync(url); + var clashConnections = JsonUtils.Deserialize(result); - return clashConnections; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } + return clashConnections; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } - return null; - } + return null; + } - public async Task ClashConnectionClose(string id) - { - try - { - var url = $"{GetApiUrl()}/connections/{id}"; - await HttpClientHelper.Instance.DeleteAsync(url); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public async Task ClashConnectionClose(string id) + { + try + { + var url = $"{GetApiUrl()}/connections/{id}"; + await HttpClientHelper.Instance.DeleteAsync(url); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - private string GetApiUrl() - { - return $"{Global.HttpProtocol}{Global.Loopback}:{AppHandler.Instance.StatePort2}"; - } - } -} \ No newline at end of file + private string GetApiUrl() + { + return $"{Global.HttpProtocol}{Global.Loopback}:{AppHandler.Instance.StatePort2}"; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 5142f37c..caad1235 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -3,1886 +3,1888 @@ using System.Text.RegularExpressions; namespace ServiceLib.Handler { - /// - /// 本软件配置文件处理类 - /// - public class ConfigHandler - { - private static readonly string _configRes = Global.ConfigFileName; - private static readonly string _tag = "ConfigHandler"; - - #region ConfigHandler - - /// - /// 载入配置文件 - /// - /// - /// - public static Config? LoadConfig() - { - Config? config = null; - var result = Utils.LoadResource(Utils.GetConfigPath(_configRes)); - if (Utils.IsNotEmpty(result)) - { - config = JsonUtils.Deserialize(result); - } - else - { - if (File.Exists(Utils.GetConfigPath(_configRes))) - { - Logging.SaveLog("LoadConfig Exception"); - return null; - } - } - - config ??= new Config(); - - config.CoreBasicItem ??= new() - { - LogEnabled = false, - Loglevel = "warning", - MuxEnabled = false, - }; - - if (config.Inbound == null) - { - config.Inbound = new List(); - InItem inItem = new() - { - Protocol = EInboundProtocol.socks.ToString(), - LocalPort = 10808, - UdpEnabled = true, - SniffingEnabled = true, - RouteOnly = false, - }; - - config.Inbound.Add(inItem); - } - else - { - if (config.Inbound.Count > 0) - { - config.Inbound.First().Protocol = EInboundProtocol.socks.ToString(); - } - } - - config.RoutingBasicItem ??= new(); - if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy)) - { - config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First(); - } - - config.KcpItem ??= new KcpItem - { - Mtu = 1350, - Tti = 50, - UplinkCapacity = 12, - DownlinkCapacity = 100, - ReadBufferSize = 2, - WriteBufferSize = 2, - Congestion = false - }; - config.GrpcItem ??= new GrpcItem - { - IdleTimeout = 60, - HealthCheckTimeout = 20, - PermitWithoutStream = false, - InitialWindowsSize = 0, - }; - config.TunModeItem ??= new TunModeItem - { - EnableTun = false, - Mtu = 9000, - }; - config.GuiItem ??= new(); - config.MsgUIItem ??= new(); - - config.UiItem ??= new UIItem() - { - EnableAutoAdjustMainLvColWidth = true - }; - config.UiItem.MainColumnItem ??= new(); - - if (Utils.IsNullOrEmpty(config.UiItem.CurrentLanguage)) - { - if (Thread.CurrentThread.CurrentCulture.Name.Equals("zh-cn", StringComparison.CurrentCultureIgnoreCase)) - { - config.UiItem.CurrentLanguage = Global.Languages.First(); - } - else - { - config.UiItem.CurrentLanguage = Global.Languages[2]; - } - } - - config.ConstItem ??= new ConstItem(); - - config.SpeedTestItem ??= new(); - if (config.SpeedTestItem.SpeedTestTimeout < 10) - { - config.SpeedTestItem.SpeedTestTimeout = 10; - } - if (Utils.IsNullOrEmpty(config.SpeedTestItem.SpeedTestUrl)) - { - config.SpeedTestItem.SpeedTestUrl = Global.SpeedTestUrls.First(); - } - if (Utils.IsNullOrEmpty(config.SpeedTestItem.SpeedPingTestUrl)) - { - config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrl; - } - - config.Mux4RayItem ??= new() - { - Concurrency = 8, - XudpConcurrency = 16, - XudpProxyUDP443 = "reject" - }; - - config.Mux4SboxItem ??= new() - { - Protocol = Global.SingboxMuxs.First(), - MaxConnections = 8 - }; - - config.HysteriaItem ??= new() - { - UpMbps = 100, - DownMbps = 100 - }; - config.ClashUIItem ??= new(); - config.SystemProxyItem ??= new(); - config.WebDavItem ??= new(); - config.CheckUpdateItem ??= new(); - config.Fragment4RayItem ??= new() - { - Packets = "tlshello", - Length = "100-200", - Interval = "10-20" - }; - - if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty()) - { - config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux; - } - - return config; - } - - /// - /// 保参数 - /// - /// - /// - public static async Task SaveConfig(Config config) - { - try - { - //save temp file - var resPath = Utils.GetConfigPath(_configRes); - var tempPath = $"{resPath}_temp"; - - var content = JsonUtils.Serialize(config, true, true); - if (content.IsNullOrEmpty()) - { - return -1; - } - await File.WriteAllTextAsync(tempPath, content); - - //rename - File.Move(tempPath, resPath, true); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return -1; - } - - return 0; - } - - #endregion ConfigHandler - - #region Server - - public static async Task AddServer(Config config, ProfileItem profileItem) - { - var item = await AppHandler.Instance.GetProfileItem(profileItem.IndexId); - if (item is null) - { - item = profileItem; - } - else - { - item.CoreType = profileItem.CoreType; - item.Remarks = profileItem.Remarks; - item.Address = profileItem.Address; - item.Port = profileItem.Port; - - item.Id = profileItem.Id; - item.AlterId = profileItem.AlterId; - item.Security = profileItem.Security; - item.Flow = profileItem.Flow; - - item.Network = profileItem.Network; - item.HeaderType = profileItem.HeaderType; - item.RequestHost = profileItem.RequestHost; - item.Path = profileItem.Path; - - item.StreamSecurity = profileItem.StreamSecurity; - item.Sni = profileItem.Sni; - item.AllowInsecure = profileItem.AllowInsecure; - item.Fingerprint = profileItem.Fingerprint; - item.Alpn = profileItem.Alpn; - - item.PublicKey = profileItem.PublicKey; - item.ShortId = profileItem.ShortId; - item.SpiderX = profileItem.SpiderX; - item.Extra = profileItem.Extra; - } - - var ret = item.ConfigType switch - { - EConfigType.VMess => await AddVMessServer(config, item), - EConfigType.Shadowsocks => await AddShadowsocksServer(config, item), - EConfigType.SOCKS => await AddSocksServer(config, item), - EConfigType.HTTP => await AddHttpServer(config, item), - EConfigType.Trojan => await AddTrojanServer(config, item), - EConfigType.VLESS => await AddVlessServer(config, item), - EConfigType.Hysteria2 => await AddHysteria2Server(config, item), - EConfigType.TUIC => await AddTuicServer(config, item), - EConfigType.WireGuard => await AddWireguardServer(config, item), - _ => -1, - }; - return ret; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddVMessServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.VMess; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.Security = profileItem.Security.TrimEx(); - profileItem.Network = profileItem.Network.TrimEx(); - profileItem.HeaderType = profileItem.HeaderType.TrimEx(); - profileItem.RequestHost = profileItem.RequestHost.TrimEx(); - profileItem.Path = profileItem.Path.TrimEx(); - profileItem.StreamSecurity = profileItem.StreamSecurity.TrimEx(); - - if (!Global.VmessSecurities.Contains(profileItem.Security)) - { - return -1; - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// 移除服务器 - /// - /// - /// - /// - public static async Task RemoveServer(Config config, List indexes) - { - var subid = "TempRemoveSubId"; - foreach (var item in indexes) - { - item.Subid = subid; - } - - await SQLiteHelper.Instance.UpdateAllAsync(indexes); - await RemoveServerViaSubid(config, subid, false); - - return 0; - } - - /// - /// 克隆服务器 - /// - /// - /// - /// - public static async Task CopyServer(Config config, List indexes) - { - foreach (var it in indexes) - { - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - - var profileItem = JsonUtils.DeepCopy(item); - profileItem.IndexId = string.Empty; - profileItem.Remarks = $"{item.Remarks}-clone"; - - if (profileItem.ConfigType == EConfigType.Custom) - { - profileItem.Address = Utils.GetConfigPath(profileItem.Address); - if (await AddCustomServer(config, profileItem, false) == 0) - { - } - } - else - { - await AddServerCommon(config, profileItem, true); - } - } - - return 0; - } - - /// - /// 设置活动服务器 - /// - /// - /// - /// - public static async Task SetDefaultServerIndex(Config config, string? indexId) - { - if (Utils.IsNullOrEmpty(indexId)) - { - return -1; - } - - config.IndexId = indexId; - - await SaveConfig(config); - - return 0; - } - - public static async Task SetDefaultServer(Config config, List lstProfile) - { - if (lstProfile.Exists(t => t.IndexId == config.IndexId)) - { - return 0; - } - - if (await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.IndexId == config.IndexId) != null) - { - return 0; - } - if (lstProfile.Count > 0) - { - return await SetDefaultServerIndex(config, lstProfile.FirstOrDefault(t => t.Port > 0)?.IndexId); - } - - var item = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.Port > 0); - return await SetDefaultServerIndex(config, item?.IndexId); - } - - public static async Task GetDefaultServer(Config config) - { - var item = await AppHandler.Instance.GetProfileItem(config.IndexId); - if (item is null) - { - var item2 = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(); - await SetDefaultServerIndex(config, item2?.IndexId); - return item2; - } - - return item; - } - - /// - /// 移动服务器 - /// - /// - /// - /// - /// - /// - public static async Task MoveServer(Config config, List lstProfile, int index, EMove eMove, int pos = -1) - { - int count = lstProfile.Count; - if (index < 0 || index > lstProfile.Count - 1) - { - return -1; - } - - for (int i = 0; i < lstProfile.Count; i++) - { - ProfileExHandler.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10); - } - - var sort = 0; - switch (eMove) - { - case EMove.Top: - { - if (index == 0) - { - return 0; - } - sort = ProfileExHandler.Instance.GetSort(lstProfile.First().IndexId) - 1; - - break; - } - case EMove.Up: - { - if (index == 0) - { - return 0; - } - sort = ProfileExHandler.Instance.GetSort(lstProfile[index - 1].IndexId) - 1; - - break; - } - - case EMove.Down: - { - if (index == count - 1) - { - return 0; - } - sort = ProfileExHandler.Instance.GetSort(lstProfile[index + 1].IndexId) + 1; - - break; - } - case EMove.Bottom: - { - if (index == count - 1) - { - return 0; - } - sort = ProfileExHandler.Instance.GetSort(lstProfile[^1].IndexId) + 1; - - break; - } - case EMove.Position: - sort = (pos * 10) + 1; - break; - } - - ProfileExHandler.Instance.SetSort(lstProfile[index].IndexId, sort); - return await Task.FromResult(0); - } - - /// - /// 添加自定义服务器 - /// - /// - /// - /// - public static async Task AddCustomServer(Config config, ProfileItem profileItem, bool blDelete) - { - var fileName = profileItem.Address; - if (!File.Exists(fileName)) - { - return -1; - } - var ext = Path.GetExtension(fileName); - string newFileName = $"{Utils.GetGuid()}{ext}"; - //newFileName = Path.Combine(Utile.GetTempPath(), newFileName); - - try - { - File.Copy(fileName, Utils.GetConfigPath(newFileName)); - if (blDelete) - { - File.Delete(fileName); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return -1; - } - - profileItem.Address = newFileName; - profileItem.ConfigType = EConfigType.Custom; - if (Utils.IsNullOrEmpty(profileItem.Remarks)) - { - profileItem.Remarks = $"import custom@{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"; - } - - await AddServerCommon(config, profileItem, true); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task EditCustomServer(Config config, ProfileItem profileItem) - { - var item = await AppHandler.Instance.GetProfileItem(profileItem.IndexId); - if (item is null) - { - item = profileItem; - } - else - { - item.Remarks = profileItem.Remarks; - item.Address = profileItem.Address; - item.CoreType = profileItem.CoreType; - item.DisplayLog = profileItem.DisplayLog; - item.PreSocksPort = profileItem.PreSocksPort; - } - - if (await SQLiteHelper.Instance.UpdateAsync(item) > 0) - { - return 0; - } - else - { - return -1; - } - - //ToJsonFile(config); - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddShadowsocksServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.Shadowsocks; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.Security = profileItem.Security.TrimEx(); - - if (!AppHandler.Instance.GetShadowsocksSecurities(profileItem).Contains(profileItem.Security)) - { - return -1; - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddSocksServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.SOCKS; - - profileItem.Address = profileItem.Address.TrimEx(); - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddHttpServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.HTTP; - - profileItem.Address = profileItem.Address.TrimEx(); - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddTrojanServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.Trojan; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) - { - profileItem.StreamSecurity = Global.StreamSecurity; - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddHysteria2Server(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.Hysteria2; - profileItem.CoreType = ECoreType.sing_box; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.Path = profileItem.Path.TrimEx(); - profileItem.Network = string.Empty; - - if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) - { - profileItem.StreamSecurity = Global.StreamSecurity; - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddTuicServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.TUIC; - profileItem.CoreType = ECoreType.sing_box; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.Security = profileItem.Security.TrimEx(); - profileItem.Network = string.Empty; - - if (!Global.TuicCongestionControls.Contains(profileItem.HeaderType)) - { - profileItem.HeaderType = Global.TuicCongestionControls.FirstOrDefault()!; - } - - if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) - { - profileItem.StreamSecurity = Global.StreamSecurity; - } - if (Utils.IsNullOrEmpty(profileItem.Alpn)) - { - profileItem.Alpn = "h3"; - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddWireguardServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.WireGuard; - profileItem.CoreType = ECoreType.sing_box; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.PublicKey = profileItem.PublicKey.TrimEx(); - profileItem.Path = profileItem.Path.TrimEx(); - profileItem.RequestHost = profileItem.RequestHost.TrimEx(); - profileItem.Network = string.Empty; - if (profileItem.ShortId.IsNullOrEmpty()) - { - profileItem.ShortId = Global.TunMtus.FirstOrDefault(); - } - - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - public static async Task SortServers(Config config, string subId, string colName, bool asc) - { - var lstModel = await AppHandler.Instance.ProfileItems(subId, ""); - if (lstModel.Count <= 0) - { - return -1; - } - var lstProfileExs = await ProfileExHandler.Instance.GetProfileExs(); - var lstProfile = (from t in lstModel - join t3 in lstProfileExs on t.IndexId equals t3.IndexId into t3b - from t33 in t3b.DefaultIfEmpty() - select new ProfileItemModel - { - IndexId = t.IndexId, - ConfigType = t.ConfigType, - Remarks = t.Remarks, - Address = t.Address, - Port = t.Port, - Security = t.Security, - Network = t.Network, - StreamSecurity = t.StreamSecurity, - Delay = t33 == null ? 0 : t33.Delay, - Speed = t33 == null ? 0 : t33.Speed, - Sort = t33 == null ? 0 : t33.Sort - }).ToList(); - - Enum.TryParse(colName, true, out EServerColName name); - - if (asc) - { - lstProfile = name switch - { - EServerColName.ConfigType => lstProfile.OrderBy(t => t.ConfigType).ToList(), - EServerColName.Remarks => lstProfile.OrderBy(t => t.Remarks).ToList(), - EServerColName.Address => lstProfile.OrderBy(t => t.Address).ToList(), - EServerColName.Port => lstProfile.OrderBy(t => t.Port).ToList(), - EServerColName.Network => lstProfile.OrderBy(t => t.Network).ToList(), - EServerColName.StreamSecurity => lstProfile.OrderBy(t => t.StreamSecurity).ToList(), - EServerColName.DelayVal => lstProfile.OrderBy(t => t.Delay).ToList(), - EServerColName.SpeedVal => lstProfile.OrderBy(t => t.Speed).ToList(), - EServerColName.SubRemarks => lstProfile.OrderBy(t => t.Subid).ToList(), - _ => lstProfile - }; - } - else - { - lstProfile = name switch - { - EServerColName.ConfigType => lstProfile.OrderByDescending(t => t.ConfigType).ToList(), - EServerColName.Remarks => lstProfile.OrderByDescending(t => t.Remarks).ToList(), - EServerColName.Address => lstProfile.OrderByDescending(t => t.Address).ToList(), - EServerColName.Port => lstProfile.OrderByDescending(t => t.Port).ToList(), - EServerColName.Network => lstProfile.OrderByDescending(t => t.Network).ToList(), - EServerColName.StreamSecurity => lstProfile.OrderByDescending(t => t.StreamSecurity).ToList(), - EServerColName.DelayVal => lstProfile.OrderByDescending(t => t.Delay).ToList(), - EServerColName.SpeedVal => lstProfile.OrderByDescending(t => t.Speed).ToList(), - EServerColName.SubRemarks => lstProfile.OrderByDescending(t => t.Subid).ToList(), - _ => lstProfile - }; - } - - for (var i = 0; i < lstProfile.Count; i++) - { - ProfileExHandler.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10); - } - switch (name) - { - case EServerColName.DelayVal: - { - var maxSort = lstProfile.Max(t => t.Sort) + 10; - foreach (var item in lstProfile.Where(item => item.Delay <= 0)) - { - ProfileExHandler.Instance.SetSort(item.IndexId, maxSort); - } - - break; - } - case EServerColName.SpeedVal: - { - var maxSort = lstProfile.Max(t => t.Sort) + 10; - foreach (var item in lstProfile.Where(item => item.Speed <= 0)) - { - ProfileExHandler.Instance.SetSort(item.IndexId, maxSort); - } - - break; - } - } - - return 0; - } - - /// - /// Add or edit server - /// - /// - /// - /// - public static async Task AddVlessServer(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigType = EConfigType.VLESS; - - profileItem.Address = profileItem.Address.TrimEx(); - profileItem.Id = profileItem.Id.TrimEx(); - profileItem.Security = profileItem.Security.TrimEx(); - profileItem.Network = profileItem.Network.TrimEx(); - profileItem.HeaderType = profileItem.HeaderType.TrimEx(); - profileItem.RequestHost = profileItem.RequestHost.TrimEx(); - profileItem.Path = profileItem.Path.TrimEx(); - profileItem.StreamSecurity = profileItem.StreamSecurity.TrimEx(); - - if (!Global.Flows.Contains(profileItem.Flow)) - { - profileItem.Flow = Global.Flows.First(); - } - if (profileItem.Id.IsNullOrEmpty()) - { - return -1; - } - if (Utils.IsNotEmpty(profileItem.Security) && profileItem.Security != Global.None) - { - profileItem.Security = Global.None; - } - - await AddServerCommon(config, profileItem, toFile); - - return 0; - } - - public static async Task> DedupServerList(Config config, string subId) - { - var lstProfile = await AppHandler.Instance.ProfileItems(subId); - - List lstKeep = new(); - List lstRemove = new(); - if (!config.GuiItem.KeepOlderDedupl) lstProfile.Reverse(); - - foreach (ProfileItem item in lstProfile) - { - if (!lstKeep.Exists(i => CompareProfileItem(i, item, false))) - { - lstKeep.Add(item); - } - else - { - lstRemove.Add(item); - } - } - await RemoveServer(config, lstRemove); - - return new Tuple(lstProfile.Count, lstKeep.Count); - } - - public static async Task AddServerCommon(Config config, ProfileItem profileItem, bool toFile = true) - { - profileItem.ConfigVersion = 2; - - if (Utils.IsNotEmpty(profileItem.StreamSecurity)) - { - if (profileItem.StreamSecurity != Global.StreamSecurity - && profileItem.StreamSecurity != Global.StreamSecurityReality) - { - profileItem.StreamSecurity = string.Empty; - } - else - { - if (Utils.IsNullOrEmpty(profileItem.AllowInsecure)) - { - profileItem.AllowInsecure = config.CoreBasicItem.DefAllowInsecure.ToString().ToLower(); - } - if (Utils.IsNullOrEmpty(profileItem.Fingerprint) && profileItem.StreamSecurity == Global.StreamSecurityReality) - { - profileItem.Fingerprint = config.CoreBasicItem.DefFingerprint; - } - } - } - - if (Utils.IsNotEmpty(profileItem.Network) && !Global.Networks.Contains(profileItem.Network)) - { - profileItem.Network = Global.DefaultNetwork; - } - - var maxSort = -1; - if (Utils.IsNullOrEmpty(profileItem.IndexId)) - { - profileItem.IndexId = Utils.GetGuid(false); - maxSort = ProfileExHandler.Instance.GetMaxSort(); - } - if (!toFile && maxSort < 0) - { - maxSort = ProfileExHandler.Instance.GetMaxSort(); - } - if (maxSort > 0) - { - ProfileExHandler.Instance.SetSort(profileItem.IndexId, maxSort + 1); - } - - if (toFile) - { - await SQLiteHelper.Instance.ReplaceAsync(profileItem); - } - return 0; - } - - private static bool CompareProfileItem(ProfileItem o, ProfileItem n, bool remarks) - { - if (o == null || n == null) - { - return false; - } - - return o.ConfigType == n.ConfigType - && o.Address == n.Address - && o.Port == n.Port - && o.Id == n.Id - && o.Security == n.Security - && o.Network == n.Network - && o.HeaderType == n.HeaderType - && o.RequestHost == n.RequestHost - && o.Path == n.Path - && (o.ConfigType == EConfigType.Trojan || o.StreamSecurity == n.StreamSecurity) - && o.Flow == n.Flow - && o.Sni == n.Sni - && o.Alpn == n.Alpn - && o.Fingerprint == n.Fingerprint - && o.PublicKey == n.PublicKey - && o.ShortId == n.ShortId - && (!remarks || o.Remarks == n.Remarks); - } - - private static async Task RemoveProfileItem(Config config, string indexId) - { - try - { - var item = await AppHandler.Instance.GetProfileItem(indexId); - if (item == null) - { - return 0; - } - if (item.ConfigType == EConfigType.Custom) - { - File.Delete(Utils.GetConfigPath(item.Address)); - } - - await SQLiteHelper.Instance.DeleteAsync(item); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return 0; - } - - public static async Task AddCustomServer4Multiple(Config config, List selecteds, ECoreType coreType) - { - var indexId = Utils.GetMd5(Global.CoreMultipleLoadConfigFileName); - var configPath = Utils.GetConfigPath(Global.CoreMultipleLoadConfigFileName); - - var result = await CoreConfigHandler.GenerateClientMultipleLoadConfig(config, configPath, selecteds, coreType); - if (result.Success != true) - { - return result; - } - - var fileName = configPath; - if (!File.Exists(fileName)) - { - return result; - } - - var profileItem = await AppHandler.Instance.GetProfileItem(indexId) ?? new(); - profileItem.IndexId = indexId; - profileItem.Remarks = coreType == ECoreType.sing_box ? ResUI.menuSetDefaultMultipleServer : ResUI.menuSetDefaultLoadBalanceServer; - profileItem.Address = Global.CoreMultipleLoadConfigFileName; - profileItem.ConfigType = EConfigType.Custom; - profileItem.CoreType = coreType; - - await AddServerCommon(config, profileItem, true); - - result.Data = indexId; - return result; - } - - public static async Task GetPreSocksItem(Config config, ProfileItem node, ECoreType coreType) - { - ProfileItem? itemSocks = null; - if (node.ConfigType != EConfigType.Custom && coreType != ECoreType.sing_box && config.TunModeItem.EnableTun) - { - itemSocks = new ProfileItem() - { - CoreType = ECoreType.sing_box, - ConfigType = EConfigType.SOCKS, - Address = Global.Loopback, - Sni = node.Address, //Tun2SocksAddress - Port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks) - }; - } - else if ((node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0)) - { - var preCoreType = config.RunningCoreType = config.TunModeItem.EnableTun ? ECoreType.sing_box : ECoreType.Xray; - itemSocks = new ProfileItem() - { - CoreType = preCoreType, - ConfigType = EConfigType.SOCKS, - Address = Global.Loopback, - Port = node.PreSocksPort.Value, - }; - } - await Task.CompletedTask; - return itemSocks; - } - - #endregion Server - - #region Batch add servers - - /// - /// 批量添加服务器 - /// - /// - /// - /// - /// 成功导入的数量 - private static async Task AddBatchServersCommon(Config config, string strData, string subid, bool isSub) - { - if (Utils.IsNullOrEmpty(strData)) - { - return -1; - } - - var subFilter = string.Empty; - //remove sub items - if (isSub && Utils.IsNotEmpty(subid)) - { - await RemoveServerViaSubid(config, subid, isSub); - subFilter = (await AppHandler.Instance.GetSubItem(subid))?.Filter ?? ""; - } - - var countServers = 0; - List lstAdd = new(); - var arrData = strData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty()); - if (isSub) - { - arrData = arrData.Distinct(); - } - foreach (var str in arrData) - { - //maybe sub - if (!isSub && (str.StartsWith(Global.HttpsProtocol) || str.StartsWith(Global.HttpProtocol))) - { - if (await AddSubItem(config, str) == 0) - { - countServers++; - } - continue; - } - var profileItem = FmtHandler.ResolveConfig(str, out string msg); - if (profileItem is null) - { - continue; - } - - //exist sub items //filter - if (isSub && Utils.IsNotEmpty(subid) && Utils.IsNotEmpty(subFilter)) - { - if (!Regex.IsMatch(profileItem.Remarks, subFilter)) - { - continue; - } - } - profileItem.Subid = subid; - profileItem.IsSub = isSub; - - var addStatus = profileItem.ConfigType switch - { - EConfigType.VMess => await AddVMessServer(config, profileItem, false), - EConfigType.Shadowsocks => await AddShadowsocksServer(config, profileItem, false), - EConfigType.SOCKS => await AddSocksServer(config, profileItem, false), - EConfigType.Trojan => await AddTrojanServer(config, profileItem, false), - EConfigType.VLESS => await AddVlessServer(config, profileItem, false), - EConfigType.Hysteria2 => await AddHysteria2Server(config, profileItem, false), - EConfigType.TUIC => await AddTuicServer(config, profileItem, false), - EConfigType.WireGuard => await AddWireguardServer(config, profileItem, false), - _ => -1, - }; - - if (addStatus == 0) - { - countServers++; - lstAdd.Add(profileItem); - } - } - - if (lstAdd.Count > 0) - { - await SQLiteHelper.Instance.InsertAllAsync(lstAdd); - } - - await SaveConfig(config); - return countServers; - } - - private static async Task AddBatchServers4Custom(Config config, string strData, string subid, bool isSub) - { - if (Utils.IsNullOrEmpty(strData)) - { - return -1; - } - - var subItem = await AppHandler.Instance.GetSubItem(subid); - var subRemarks = subItem?.Remarks; - var preSocksPort = subItem?.PreSocksPort; - - List? lstProfiles = null; - //Is sing-box array configuration - if (lstProfiles is null || lstProfiles.Count <= 0) - { - lstProfiles = SingboxFmt.ResolveFullArray(strData, subRemarks); - } - //Is v2ray array configuration - if (lstProfiles is null || lstProfiles.Count <= 0) - { - lstProfiles = V2rayFmt.ResolveFullArray(strData, subRemarks); - } - if (lstProfiles != null && lstProfiles.Count > 0) - { - if (isSub && Utils.IsNotEmpty(subid)) - { - await RemoveServerViaSubid(config, subid, isSub); - } - int count = 0; - foreach (var it in lstProfiles) - { - it.Subid = subid; - it.IsSub = isSub; - it.PreSocksPort = preSocksPort; - if (await AddCustomServer(config, it, true) == 0) - { - count++; - } - } - if (count > 0) - { - return count; - } - } - - ProfileItem? profileItem = null; - //Is sing-box configuration - if (profileItem is null) - { - profileItem = SingboxFmt.ResolveFull(strData, subRemarks); - } - //Is v2ray configuration - if (profileItem is null) - { - profileItem = V2rayFmt.ResolveFull(strData, subRemarks); - } - //Is Clash configuration - if (profileItem is null) - { - profileItem = ClashFmt.ResolveFull(strData, subRemarks); - } - //Is hysteria configuration - if (profileItem is null) - { - profileItem = Hysteria2Fmt.ResolveFull2(strData, subRemarks); - } - if (profileItem is null) - { - profileItem = Hysteria2Fmt.ResolveFull(strData, subRemarks); - } - //Is naiveproxy configuration - if (profileItem is null) - { - profileItem = NaiveproxyFmt.ResolveFull(strData, subRemarks); - } - if (profileItem is null || Utils.IsNullOrEmpty(profileItem.Address)) - { - return -1; - } - - if (isSub && Utils.IsNotEmpty(subid)) - { - await RemoveServerViaSubid(config, subid, isSub); - } - - profileItem.Subid = subid; - profileItem.IsSub = isSub; - profileItem.PreSocksPort = preSocksPort; - if (await AddCustomServer(config, profileItem, true) == 0) - { - return 1; - } - else - { - return -1; - } - } - - private static async Task AddBatchServers4SsSIP008(Config config, string strData, string subid, bool isSub) - { - if (Utils.IsNullOrEmpty(strData)) - { - return -1; - } - - if (isSub && Utils.IsNotEmpty(subid)) - { - await RemoveServerViaSubid(config, subid, isSub); - } - - var lstSsServer = ShadowsocksFmt.ResolveSip008(strData); - if (lstSsServer?.Count > 0) - { - int counter = 0; - foreach (var ssItem in lstSsServer) - { - ssItem.Subid = subid; - ssItem.IsSub = isSub; - if (await AddShadowsocksServer(config, ssItem) == 0) - { - counter++; - } - } - await SaveConfig(config); - return counter; - } - - return -1; - } - - public static async Task AddBatchServers(Config config, string strData, string subid, bool isSub) - { - if (Utils.IsNullOrEmpty(strData)) - { - return -1; - } - List? lstOriSub = null; - ProfileItem? activeProfile = null; - if (isSub && Utils.IsNotEmpty(subid)) - { - lstOriSub = await AppHandler.Instance.ProfileItems(subid); - activeProfile = lstOriSub?.FirstOrDefault(t => t.IndexId == config.IndexId); - } - - var counter = 0; - if (Utils.IsBase64String(strData)) - { - counter = await AddBatchServersCommon(config, Utils.Base64Decode(strData), subid, isSub); - } - if (counter < 1) - { - counter = await AddBatchServersCommon(config, strData, subid, isSub); - } - if (counter < 1) - { - counter = await AddBatchServersCommon(config, Utils.Base64Decode(strData), subid, isSub); - } - - if (counter < 1) - { - counter = await AddBatchServers4SsSIP008(config, strData, subid, isSub); - } - - //maybe other sub - if (counter < 1) - { - counter = await AddBatchServers4Custom(config, strData, subid, isSub); - } - - //Select active node - if (activeProfile != null) - { - var lstSub = await AppHandler.Instance.ProfileItems(subid); - var existItem = lstSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == activeProfile.Remarks : CompareProfileItem(t, activeProfile, true)); - if (existItem != null) - { - await ConfigHandler.SetDefaultServerIndex(config, existItem.IndexId); - } - } - - //Keep the last traffic statistics - if (lstOriSub != null) - { - var lstSub = await AppHandler.Instance.ProfileItems(subid); - foreach (var item in lstSub) - { - var existItem = lstOriSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == item.Remarks : CompareProfileItem(t, item, true)); - if (existItem != null) - { - await StatisticsHandler.Instance.CloneServerStatItem(existItem.IndexId, item.IndexId); - } - } - } - - return counter; - } - - #endregion Batch add servers - - #region Sub & Group - - /// - /// add sub - /// - /// - /// - /// - public static async Task AddSubItem(Config config, string url) - { - //already exists - var count = await SQLiteHelper.Instance.TableAsync().CountAsync(e => e.Url == url); - if (count > 0) - { - return 0; - } - SubItem subItem = new() - { - Id = string.Empty, - Url = url - }; - - var uri = Utils.TryUri(url); - if (uri == null) return -1; - //Do not allow http protocol - if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) - { - //TODO Temporary reminder to be removed later - NoticeHandler.Instance.Enqueue(ResUI.InsecureUrlProtocol); - //return -1; - } - - var queryVars = Utils.ParseQueryString(uri.Query); - subItem.Remarks = queryVars["remarks"] ?? "import_sub"; - - return await AddSubItem(config, subItem); - } - - public static async Task AddSubItem(Config config, SubItem subItem) - { - var item = await AppHandler.Instance.GetSubItem(subItem.Id); - if (item is null) - { - item = subItem; - } - else - { - item.Remarks = subItem.Remarks; - item.Url = subItem.Url; - item.MoreUrl = subItem.MoreUrl; - item.Enabled = subItem.Enabled; - item.AutoUpdateInterval = subItem.AutoUpdateInterval; - item.UserAgent = subItem.UserAgent; - item.Sort = subItem.Sort; - item.Filter = subItem.Filter; - item.UpdateTime = subItem.UpdateTime; - item.ConvertTarget = subItem.ConvertTarget; - item.PrevProfile = subItem.PrevProfile; - item.NextProfile = subItem.NextProfile; - item.PreSocksPort = subItem.PreSocksPort; - item.Memo = subItem.Memo; - } - - if (Utils.IsNullOrEmpty(item.Id)) - { - item.Id = Utils.GetGuid(false); - - if (item.Sort <= 0) - { - var maxSort = 0; - if (await SQLiteHelper.Instance.TableAsync().CountAsync() > 0) - { - var lstSubs = (await AppHandler.Instance.SubItems()); - maxSort = lstSubs.LastOrDefault()?.Sort ?? 0; - } - item.Sort = maxSort + 1; - } - } - if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) - { - return 0; - } - else - { - return -1; - } - } - - /// - /// 移除服务器 - /// - /// - /// - /// - public static async Task RemoveServerViaSubid(Config config, string subid, bool isSub) - { - if (Utils.IsNullOrEmpty(subid)) - { - return -1; - } - var customProfile = await SQLiteHelper.Instance.TableAsync().Where(t => t.Subid == subid && t.ConfigType == EConfigType.Custom).ToListAsync(); - if (isSub) - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileItem where isSub = 1 and subid = '{subid}'"); - } - else - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileItem where subid = '{subid}'"); - } - foreach (var item in customProfile) - { - File.Delete(Utils.GetConfigPath(item.Address)); - } - - return 0; - } - - public static async Task DeleteSubItem(Config config, string id) - { - var item = await AppHandler.Instance.GetSubItem(id); - if (item is null) - { - return 0; - } - await SQLiteHelper.Instance.DeleteAsync(item); - await RemoveServerViaSubid(config, id, false); - - return 0; - } - - public static async Task MoveToGroup(Config config, List lstProfile, string subid) - { - foreach (var item in lstProfile) - { - item.Subid = subid; - } - await SQLiteHelper.Instance.UpdateAllAsync(lstProfile); - - return 0; - } - - #endregion Sub & Group - - #region Routing - - public static async Task SaveRoutingItem(Config config, RoutingItem item) - { - if (Utils.IsNullOrEmpty(item.Id)) - { - item.Id = Utils.GetGuid(false); - } - - if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) - { - return 0; - } - else - { - return -1; - } - } - - /// - /// AddBatchRoutingRules - /// - /// - /// - /// - public static async Task AddBatchRoutingRules(RoutingItem routingItem, string strData) - { - if (Utils.IsNullOrEmpty(strData)) - { - return -1; - } - - var lstRules = JsonUtils.Deserialize>(strData); - if (lstRules == null) - { - return -1; - } - - foreach (var item in lstRules) - { - item.Id = Utils.GetGuid(false); - } - routingItem.RuleNum = lstRules.Count; - routingItem.RuleSet = JsonUtils.Serialize(lstRules, false); - - if (Utils.IsNullOrEmpty(routingItem.Id)) - { - routingItem.Id = Utils.GetGuid(false); - } - - if (await SQLiteHelper.Instance.ReplaceAsync(routingItem) > 0) - { - return 0; - } - else - { - return -1; - } - } - - /// - /// MoveRoutingRule - /// - /// - /// - /// - /// - public static async Task MoveRoutingRule(List rules, int index, EMove eMove, int pos = -1) - { - int count = rules.Count; - if (index < 0 || index > rules.Count - 1) - { - return -1; - } - switch (eMove) - { - case EMove.Top: - { - if (index == 0) - { - return 0; - } - var item = JsonUtils.DeepCopy(rules[index]); - rules.RemoveAt(index); - rules.Insert(0, item); - - break; - } - case EMove.Up: - { - if (index == 0) - { - return 0; - } - var item = JsonUtils.DeepCopy(rules[index]); - rules.RemoveAt(index); - rules.Insert(index - 1, item); - - break; - } - - case EMove.Down: - { - if (index == count - 1) - { - return 0; - } - var item = JsonUtils.DeepCopy(rules[index]); - rules.RemoveAt(index); - rules.Insert(index + 1, item); - - break; - } - case EMove.Bottom: - { - if (index == count - 1) - { - return 0; - } - var item = JsonUtils.DeepCopy(rules[index]); - rules.RemoveAt(index); - rules.Add(item); - - break; - } - case EMove.Position: - { - var removeItem = rules[index]; - var item = JsonUtils.DeepCopy(rules[index]); - rules.Insert(pos, item); - rules.Remove(removeItem); - break; - } - } - return await Task.FromResult(0); - } - - public static async Task SetDefaultRouting(Config config, RoutingItem routingItem) - { - if (await SQLiteHelper.Instance.TableAsync().Where(t => t.Id == routingItem.Id).CountAsync() > 0) - { - config.RoutingBasicItem.RoutingIndexId = routingItem.Id; - } - - await SaveConfig(config); - - return 0; - } - - public static async Task GetDefaultRouting(Config config) - { - var item = await AppHandler.Instance.GetRoutingItem(config.RoutingBasicItem.RoutingIndexId); - if (item is null) - { - var item2 = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(); - await SetDefaultRouting(config, item2); - return item2; - } - - return item; - } - - public static async Task InitRouting(Config config, bool blImportAdvancedRules = false) - { - if (string.IsNullOrEmpty(config.ConstItem.RouteRulesTemplateSourceUrl)) - { - await InitBuiltinRouting(config, blImportAdvancedRules); - } - else - { - await InitExternalRouting(config, blImportAdvancedRules); - } - - return 0; - } - - public static async Task InitExternalRouting(Config config, bool blImportAdvancedRules = false) - { - var downloadHandle = new DownloadService(); - var templateContent = await downloadHandle.TryDownloadString(config.ConstItem.RouteRulesTemplateSourceUrl, true, ""); - if (string.IsNullOrEmpty(templateContent)) - return await InitBuiltinRouting(config, blImportAdvancedRules); // fallback - - var template = JsonUtils.Deserialize(templateContent); - if (template == null) - return await InitBuiltinRouting(config, blImportAdvancedRules); // fallback - - var items = await AppHandler.Instance.RoutingItems(); - var maxSort = items.Count; - if (!blImportAdvancedRules && items.Where(t => t.Remarks.StartsWith(template.Version)).ToList().Count > 0) - { - return 0; - } - for (var i = 0; i < template.RoutingItems.Length; i++) - { - var item = template.RoutingItems[i]; - - if (string.IsNullOrEmpty(item.Url) && string.IsNullOrEmpty(item.RuleSet)) - continue; - - var ruleSetsString = !string.IsNullOrEmpty(item.RuleSet) - ? item.RuleSet - : await downloadHandle.TryDownloadString(item.Url, true, ""); - - if (string.IsNullOrEmpty(ruleSetsString)) - continue; - - item.Remarks = $"{template.Version}-{item.Remarks}"; - item.Enabled = true; - item.Sort = ++maxSort; - item.Url = string.Empty; - - await AddBatchRoutingRules(item, ruleSetsString); - - //first rule as default at first startup - if (!blImportAdvancedRules && i == 0) - { - await SetDefaultRouting(config, item); - } - } - - return 0; - } - - public static async Task InitBuiltinRouting(Config config, bool blImportAdvancedRules = false) - { - var ver = "V3-"; - var items = await AppHandler.Instance.RoutingItems(); - - //TODO Temporary code to be removed later - var lockItem = items?.FirstOrDefault(t => t.Locked == true); - if (lockItem != null) - { - await ConfigHandler.RemoveRoutingItem(lockItem); - items = await AppHandler.Instance.RoutingItems(); - } - - if (!blImportAdvancedRules && items.Where(t => t.Remarks.StartsWith(ver)).ToList().Count > 0) - { - return 0; - } - - var maxSort = items.Count; - //Bypass the mainland - var item2 = new RoutingItem() - { - Remarks = $"{ver}绕过大陆(Whitelist)", - Url = string.Empty, - Sort = maxSort + 1, - }; - await AddBatchRoutingRules(item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white")); - - //Blacklist - var item3 = new RoutingItem() - { - Remarks = $"{ver}黑名单(Blacklist)", - Url = string.Empty, - Sort = maxSort + 2, - }; - await AddBatchRoutingRules(item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); - - //Global - var item1 = new RoutingItem() - { - Remarks = $"{ver}全局(Global)", - Url = string.Empty, - Sort = maxSort + 3, - }; - await AddBatchRoutingRules(item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); - - if (!blImportAdvancedRules) - { - await SetDefaultRouting(config, item2); - } - return 0; - } - - public static async Task RemoveRoutingItem(RoutingItem routingItem) - { - await SQLiteHelper.Instance.DeleteAsync(routingItem); - } - - #endregion Routing - - #region DNS - - public static async Task InitBuiltinDNS(Config config) - { - var items = await AppHandler.Instance.DNSItems(); - if (items.Count <= 0) - { - var item = new DNSItem() - { - Remarks = "V2ray", - CoreType = ECoreType.Xray, - }; - await SaveDNSItems(config, item); - - var item2 = new DNSItem() - { - Remarks = "sing-box", - CoreType = ECoreType.sing_box, - }; - await SaveDNSItems(config, item2); - } - - return 0; - } - - public static async Task SaveDNSItems(Config config, DNSItem item) - { - if (item == null) - { - return -1; - } - - if (Utils.IsNullOrEmpty(item.Id)) - { - item.Id = Utils.GetGuid(false); - } - - if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) - { - return 0; - } - else - { - return -1; - } - } - - public static async Task GetExternalDNSItem(ECoreType type, string url) - { - var currentItem = await AppHandler.Instance.GetDNSItem(type); - - var downloadHandle = new DownloadService(); - var templateContent = await downloadHandle.TryDownloadString(url, true, ""); - if (string.IsNullOrEmpty(templateContent)) - return currentItem; - - var template = JsonUtils.Deserialize(templateContent); - if (template == null) - return currentItem; - - if (!string.IsNullOrEmpty(template.NormalDNS)) - template.NormalDNS = await downloadHandle.TryDownloadString(template.NormalDNS, true, ""); - - if (!string.IsNullOrEmpty(template.TunDNS)) - template.TunDNS = await downloadHandle.TryDownloadString(template.TunDNS, true, ""); - - template.Id = currentItem.Id; - template.Enabled = currentItem.Enabled; - template.Remarks = currentItem.Remarks; - template.CoreType = type; - - return template; - } - - #endregion DNS - - #region Regional Presets - - public static async Task ApplyRegionalPreset(Config config, EPresetType type) - { - switch (type) - { - case EPresetType.Default: - config.ConstItem.GeoSourceUrl = ""; - config.ConstItem.SrsSourceUrl = ""; - config.ConstItem.RouteRulesTemplateSourceUrl = ""; - - await SQLiteHelper.Instance.DeleteAllAsync(); - await InitBuiltinDNS(config); - - return true; - - case EPresetType.Russia: - config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[1]; - config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[1]; - config.ConstItem.RouteRulesTemplateSourceUrl = Global.RoutingRulesSources[1]; - - await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[1] + "v2ray.json")); - await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[1] + "sing_box.json")); - - return true; - - case EPresetType.Iran: - config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[2]; - config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[2]; - config.ConstItem.RouteRulesTemplateSourceUrl = Global.RoutingRulesSources[2]; - - await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[2] + "v2ray.json")); - await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[2] + "sing_box.json")); - - return true; - } - - return false; - } - - #endregion Regional Presets - } -} \ No newline at end of file + /// + /// 本软件配置文件处理类 + /// + public class ConfigHandler + { + private static readonly string _configRes = Global.ConfigFileName; + private static readonly string _tag = "ConfigHandler"; + + #region ConfigHandler + + /// + /// 载入配置文件 + /// + /// + /// + public static Config? LoadConfig() + { + Config? config = null; + var result = Utils.LoadResource(Utils.GetConfigPath(_configRes)); + if (Utils.IsNotEmpty(result)) + { + config = JsonUtils.Deserialize(result); + } + else + { + if (File.Exists(Utils.GetConfigPath(_configRes))) + { + Logging.SaveLog("LoadConfig Exception"); + return null; + } + } + + config ??= new Config(); + + config.CoreBasicItem ??= new() + { + LogEnabled = false, + Loglevel = "warning", + MuxEnabled = false, + }; + + if (config.Inbound == null) + { + config.Inbound = new List(); + InItem inItem = new() + { + Protocol = EInboundProtocol.socks.ToString(), + LocalPort = 10808, + UdpEnabled = true, + SniffingEnabled = true, + RouteOnly = false, + }; + + config.Inbound.Add(inItem); + } + else + { + if (config.Inbound.Count > 0) + { + config.Inbound.First().Protocol = EInboundProtocol.socks.ToString(); + } + } + + config.RoutingBasicItem ??= new(); + if (Utils.IsNullOrEmpty(config.RoutingBasicItem.DomainStrategy)) + { + config.RoutingBasicItem.DomainStrategy = Global.DomainStrategies.First(); + } + + config.KcpItem ??= new KcpItem + { + Mtu = 1350, + Tti = 50, + UplinkCapacity = 12, + DownlinkCapacity = 100, + ReadBufferSize = 2, + WriteBufferSize = 2, + Congestion = false + }; + config.GrpcItem ??= new GrpcItem + { + IdleTimeout = 60, + HealthCheckTimeout = 20, + PermitWithoutStream = false, + InitialWindowsSize = 0, + }; + config.TunModeItem ??= new TunModeItem + { + EnableTun = false, + Mtu = 9000, + }; + config.GuiItem ??= new(); + config.MsgUIItem ??= new(); + + config.UiItem ??= new UIItem() + { + EnableAutoAdjustMainLvColWidth = true + }; + config.UiItem.MainColumnItem ??= new(); + + if (Utils.IsNullOrEmpty(config.UiItem.CurrentLanguage)) + { + if (Thread.CurrentThread.CurrentCulture.Name.Equals("zh-cn", StringComparison.CurrentCultureIgnoreCase)) + { + config.UiItem.CurrentLanguage = Global.Languages.First(); + } + else + { + config.UiItem.CurrentLanguage = Global.Languages[2]; + } + } + + config.ConstItem ??= new ConstItem(); + + config.SpeedTestItem ??= new(); + if (config.SpeedTestItem.SpeedTestTimeout < 10) + { + config.SpeedTestItem.SpeedTestTimeout = 10; + } + if (Utils.IsNullOrEmpty(config.SpeedTestItem.SpeedTestUrl)) + { + config.SpeedTestItem.SpeedTestUrl = Global.SpeedTestUrls.First(); + } + if (Utils.IsNullOrEmpty(config.SpeedTestItem.SpeedPingTestUrl)) + { + config.SpeedTestItem.SpeedPingTestUrl = Global.SpeedPingTestUrl; + } + + config.Mux4RayItem ??= new() + { + Concurrency = 8, + XudpConcurrency = 16, + XudpProxyUDP443 = "reject" + }; + + config.Mux4SboxItem ??= new() + { + Protocol = Global.SingboxMuxs.First(), + MaxConnections = 8 + }; + + config.HysteriaItem ??= new() + { + UpMbps = 100, + DownMbps = 100 + }; + config.ClashUIItem ??= new(); + config.SystemProxyItem ??= new(); + config.WebDavItem ??= new(); + config.CheckUpdateItem ??= new(); + config.Fragment4RayItem ??= new() + { + Packets = "tlshello", + Length = "100-200", + Interval = "10-20" + }; + + if (config.SystemProxyItem.SystemProxyExceptions.IsNullOrEmpty()) + { + config.SystemProxyItem.SystemProxyExceptions = Utils.IsWindows() ? Global.SystemProxyExceptionsWindows : Global.SystemProxyExceptionsLinux; + } + + return config; + } + + /// + /// 保参数 + /// + /// + /// + public static async Task SaveConfig(Config config) + { + try + { + //save temp file + var resPath = Utils.GetConfigPath(_configRes); + var tempPath = $"{resPath}_temp"; + + var content = JsonUtils.Serialize(config, true, true); + if (content.IsNullOrEmpty()) + { + return -1; + } + await File.WriteAllTextAsync(tempPath, content); + + //rename + File.Move(tempPath, resPath, true); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return -1; + } + + return 0; + } + + #endregion ConfigHandler + + #region Server + + public static async Task AddServer(Config config, ProfileItem profileItem) + { + var item = await AppHandler.Instance.GetProfileItem(profileItem.IndexId); + if (item is null) + { + item = profileItem; + } + else + { + item.CoreType = profileItem.CoreType; + item.Remarks = profileItem.Remarks; + item.Address = profileItem.Address; + item.Port = profileItem.Port; + + item.Id = profileItem.Id; + item.AlterId = profileItem.AlterId; + item.Security = profileItem.Security; + item.Flow = profileItem.Flow; + + item.Network = profileItem.Network; + item.HeaderType = profileItem.HeaderType; + item.RequestHost = profileItem.RequestHost; + item.Path = profileItem.Path; + + item.StreamSecurity = profileItem.StreamSecurity; + item.Sni = profileItem.Sni; + item.AllowInsecure = profileItem.AllowInsecure; + item.Fingerprint = profileItem.Fingerprint; + item.Alpn = profileItem.Alpn; + + item.PublicKey = profileItem.PublicKey; + item.ShortId = profileItem.ShortId; + item.SpiderX = profileItem.SpiderX; + item.Extra = profileItem.Extra; + } + + var ret = item.ConfigType switch + { + EConfigType.VMess => await AddVMessServer(config, item), + EConfigType.Shadowsocks => await AddShadowsocksServer(config, item), + EConfigType.SOCKS => await AddSocksServer(config, item), + EConfigType.HTTP => await AddHttpServer(config, item), + EConfigType.Trojan => await AddTrojanServer(config, item), + EConfigType.VLESS => await AddVlessServer(config, item), + EConfigType.Hysteria2 => await AddHysteria2Server(config, item), + EConfigType.TUIC => await AddTuicServer(config, item), + EConfigType.WireGuard => await AddWireguardServer(config, item), + _ => -1, + }; + return ret; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddVMessServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.VMess; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.Security = profileItem.Security.TrimEx(); + profileItem.Network = profileItem.Network.TrimEx(); + profileItem.HeaderType = profileItem.HeaderType.TrimEx(); + profileItem.RequestHost = profileItem.RequestHost.TrimEx(); + profileItem.Path = profileItem.Path.TrimEx(); + profileItem.StreamSecurity = profileItem.StreamSecurity.TrimEx(); + + if (!Global.VmessSecurities.Contains(profileItem.Security)) + { + return -1; + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static async Task RemoveServer(Config config, List indexes) + { + var subid = "TempRemoveSubId"; + foreach (var item in indexes) + { + item.Subid = subid; + } + + await SQLiteHelper.Instance.UpdateAllAsync(indexes); + await RemoveServerViaSubid(config, subid, false); + + return 0; + } + + /// + /// 克隆服务器 + /// + /// + /// + /// + public static async Task CopyServer(Config config, List indexes) + { + foreach (var it in indexes) + { + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (item is null) + { + continue; + } + + var profileItem = JsonUtils.DeepCopy(item); + profileItem.IndexId = string.Empty; + profileItem.Remarks = $"{item.Remarks}-clone"; + + if (profileItem.ConfigType == EConfigType.Custom) + { + profileItem.Address = Utils.GetConfigPath(profileItem.Address); + if (await AddCustomServer(config, profileItem, false) == 0) + { + } + } + else + { + await AddServerCommon(config, profileItem, true); + } + } + + return 0; + } + + /// + /// 设置活动服务器 + /// + /// + /// + /// + public static async Task SetDefaultServerIndex(Config config, string? indexId) + { + if (Utils.IsNullOrEmpty(indexId)) + { + return -1; + } + + config.IndexId = indexId; + + await SaveConfig(config); + + return 0; + } + + public static async Task SetDefaultServer(Config config, List lstProfile) + { + if (lstProfile.Exists(t => t.IndexId == config.IndexId)) + { + return 0; + } + + if (await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.IndexId == config.IndexId) != null) + { + return 0; + } + if (lstProfile.Count > 0) + { + return await SetDefaultServerIndex(config, lstProfile.FirstOrDefault(t => t.Port > 0)?.IndexId); + } + + var item = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(t => t.Port > 0); + return await SetDefaultServerIndex(config, item?.IndexId); + } + + public static async Task GetDefaultServer(Config config) + { + var item = await AppHandler.Instance.GetProfileItem(config.IndexId); + if (item is null) + { + var item2 = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(); + await SetDefaultServerIndex(config, item2?.IndexId); + return item2; + } + + return item; + } + + /// + /// 移动服务器 + /// + /// + /// + /// + /// + /// + public static async Task MoveServer(Config config, List lstProfile, int index, EMove eMove, int pos = -1) + { + int count = lstProfile.Count; + if (index < 0 || index > lstProfile.Count - 1) + { + return -1; + } + + for (int i = 0; i < lstProfile.Count; i++) + { + ProfileExHandler.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10); + } + + var sort = 0; + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + sort = ProfileExHandler.Instance.GetSort(lstProfile.First().IndexId) - 1; + + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + sort = ProfileExHandler.Instance.GetSort(lstProfile[index - 1].IndexId) - 1; + + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + sort = ProfileExHandler.Instance.GetSort(lstProfile[index + 1].IndexId) + 1; + + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + sort = ProfileExHandler.Instance.GetSort(lstProfile[^1].IndexId) + 1; + + break; + } + case EMove.Position: + sort = (pos * 10) + 1; + break; + } + + ProfileExHandler.Instance.SetSort(lstProfile[index].IndexId, sort); + return await Task.FromResult(0); + } + + /// + /// 添加自定义服务器 + /// + /// + /// + /// + public static async Task AddCustomServer(Config config, ProfileItem profileItem, bool blDelete) + { + var fileName = profileItem.Address; + if (!File.Exists(fileName)) + { + return -1; + } + var ext = Path.GetExtension(fileName); + string newFileName = $"{Utils.GetGuid()}{ext}"; + //newFileName = Path.Combine(Utile.GetTempPath(), newFileName); + + try + { + File.Copy(fileName, Utils.GetConfigPath(newFileName)); + if (blDelete) + { + File.Delete(fileName); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return -1; + } + + profileItem.Address = newFileName; + profileItem.ConfigType = EConfigType.Custom; + if (Utils.IsNullOrEmpty(profileItem.Remarks)) + { + profileItem.Remarks = $"import custom@{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"; + } + + await AddServerCommon(config, profileItem, true); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task EditCustomServer(Config config, ProfileItem profileItem) + { + var item = await AppHandler.Instance.GetProfileItem(profileItem.IndexId); + if (item is null) + { + item = profileItem; + } + else + { + item.Remarks = profileItem.Remarks; + item.Address = profileItem.Address; + item.CoreType = profileItem.CoreType; + item.DisplayLog = profileItem.DisplayLog; + item.PreSocksPort = profileItem.PreSocksPort; + } + + if (await SQLiteHelper.Instance.UpdateAsync(item) > 0) + { + return 0; + } + else + { + return -1; + } + + //ToJsonFile(config); + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddShadowsocksServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.Shadowsocks; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.Security = profileItem.Security.TrimEx(); + + if (!AppHandler.Instance.GetShadowsocksSecurities(profileItem).Contains(profileItem.Security)) + { + return -1; + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddSocksServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.SOCKS; + + profileItem.Address = profileItem.Address.TrimEx(); + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddHttpServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.HTTP; + + profileItem.Address = profileItem.Address.TrimEx(); + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddTrojanServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.Trojan; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) + { + profileItem.StreamSecurity = Global.StreamSecurity; + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddHysteria2Server(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.Hysteria2; + profileItem.CoreType = ECoreType.sing_box; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.Path = profileItem.Path.TrimEx(); + profileItem.Network = string.Empty; + + if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) + { + profileItem.StreamSecurity = Global.StreamSecurity; + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddTuicServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.TUIC; + profileItem.CoreType = ECoreType.sing_box; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.Security = profileItem.Security.TrimEx(); + profileItem.Network = string.Empty; + + if (!Global.TuicCongestionControls.Contains(profileItem.HeaderType)) + { + profileItem.HeaderType = Global.TuicCongestionControls.FirstOrDefault()!; + } + + if (Utils.IsNullOrEmpty(profileItem.StreamSecurity)) + { + profileItem.StreamSecurity = Global.StreamSecurity; + } + if (Utils.IsNullOrEmpty(profileItem.Alpn)) + { + profileItem.Alpn = "h3"; + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddWireguardServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.WireGuard; + profileItem.CoreType = ECoreType.sing_box; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.PublicKey = profileItem.PublicKey.TrimEx(); + profileItem.Path = profileItem.Path.TrimEx(); + profileItem.RequestHost = profileItem.RequestHost.TrimEx(); + profileItem.Network = string.Empty; + if (profileItem.ShortId.IsNullOrEmpty()) + { + profileItem.ShortId = Global.TunMtus.FirstOrDefault(); + } + + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + public static async Task SortServers(Config config, string subId, string colName, bool asc) + { + var lstModel = await AppHandler.Instance.ProfileItems(subId, ""); + if (lstModel.Count <= 0) + { + return -1; + } + var lstProfileExs = await ProfileExHandler.Instance.GetProfileExs(); + var lstProfile = (from t in lstModel + join t3 in lstProfileExs on t.IndexId equals t3.IndexId into t3b + from t33 in t3b.DefaultIfEmpty() + select new ProfileItemModel + { + IndexId = t.IndexId, + ConfigType = t.ConfigType, + Remarks = t.Remarks, + Address = t.Address, + Port = t.Port, + Security = t.Security, + Network = t.Network, + StreamSecurity = t.StreamSecurity, + Delay = t33 == null ? 0 : t33.Delay, + Speed = t33 == null ? 0 : t33.Speed, + Sort = t33 == null ? 0 : t33.Sort + }).ToList(); + + Enum.TryParse(colName, true, out EServerColName name); + + if (asc) + { + lstProfile = name switch + { + EServerColName.ConfigType => lstProfile.OrderBy(t => t.ConfigType).ToList(), + EServerColName.Remarks => lstProfile.OrderBy(t => t.Remarks).ToList(), + EServerColName.Address => lstProfile.OrderBy(t => t.Address).ToList(), + EServerColName.Port => lstProfile.OrderBy(t => t.Port).ToList(), + EServerColName.Network => lstProfile.OrderBy(t => t.Network).ToList(), + EServerColName.StreamSecurity => lstProfile.OrderBy(t => t.StreamSecurity).ToList(), + EServerColName.DelayVal => lstProfile.OrderBy(t => t.Delay).ToList(), + EServerColName.SpeedVal => lstProfile.OrderBy(t => t.Speed).ToList(), + EServerColName.SubRemarks => lstProfile.OrderBy(t => t.Subid).ToList(), + _ => lstProfile + }; + } + else + { + lstProfile = name switch + { + EServerColName.ConfigType => lstProfile.OrderByDescending(t => t.ConfigType).ToList(), + EServerColName.Remarks => lstProfile.OrderByDescending(t => t.Remarks).ToList(), + EServerColName.Address => lstProfile.OrderByDescending(t => t.Address).ToList(), + EServerColName.Port => lstProfile.OrderByDescending(t => t.Port).ToList(), + EServerColName.Network => lstProfile.OrderByDescending(t => t.Network).ToList(), + EServerColName.StreamSecurity => lstProfile.OrderByDescending(t => t.StreamSecurity).ToList(), + EServerColName.DelayVal => lstProfile.OrderByDescending(t => t.Delay).ToList(), + EServerColName.SpeedVal => lstProfile.OrderByDescending(t => t.Speed).ToList(), + EServerColName.SubRemarks => lstProfile.OrderByDescending(t => t.Subid).ToList(), + _ => lstProfile + }; + } + + for (var i = 0; i < lstProfile.Count; i++) + { + ProfileExHandler.Instance.SetSort(lstProfile[i].IndexId, (i + 1) * 10); + } + switch (name) + { + case EServerColName.DelayVal: + { + var maxSort = lstProfile.Max(t => t.Sort) + 10; + foreach (var item in lstProfile.Where(item => item.Delay <= 0)) + { + ProfileExHandler.Instance.SetSort(item.IndexId, maxSort); + } + + break; + } + case EServerColName.SpeedVal: + { + var maxSort = lstProfile.Max(t => t.Sort) + 10; + foreach (var item in lstProfile.Where(item => item.Speed <= 0)) + { + ProfileExHandler.Instance.SetSort(item.IndexId, maxSort); + } + + break; + } + } + + return 0; + } + + /// + /// Add or edit server + /// + /// + /// + /// + public static async Task AddVlessServer(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigType = EConfigType.VLESS; + + profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Id = profileItem.Id.TrimEx(); + profileItem.Security = profileItem.Security.TrimEx(); + profileItem.Network = profileItem.Network.TrimEx(); + profileItem.HeaderType = profileItem.HeaderType.TrimEx(); + profileItem.RequestHost = profileItem.RequestHost.TrimEx(); + profileItem.Path = profileItem.Path.TrimEx(); + profileItem.StreamSecurity = profileItem.StreamSecurity.TrimEx(); + + if (!Global.Flows.Contains(profileItem.Flow)) + { + profileItem.Flow = Global.Flows.First(); + } + if (profileItem.Id.IsNullOrEmpty()) + { + return -1; + } + if (Utils.IsNotEmpty(profileItem.Security) && profileItem.Security != Global.None) + { + profileItem.Security = Global.None; + } + + await AddServerCommon(config, profileItem, toFile); + + return 0; + } + + public static async Task> DedupServerList(Config config, string subId) + { + var lstProfile = await AppHandler.Instance.ProfileItems(subId); + + List lstKeep = new(); + List lstRemove = new(); + if (!config.GuiItem.KeepOlderDedupl) + lstProfile.Reverse(); + + foreach (ProfileItem item in lstProfile) + { + if (!lstKeep.Exists(i => CompareProfileItem(i, item, false))) + { + lstKeep.Add(item); + } + else + { + lstRemove.Add(item); + } + } + await RemoveServer(config, lstRemove); + + return new Tuple(lstProfile.Count, lstKeep.Count); + } + + public static async Task AddServerCommon(Config config, ProfileItem profileItem, bool toFile = true) + { + profileItem.ConfigVersion = 2; + + if (Utils.IsNotEmpty(profileItem.StreamSecurity)) + { + if (profileItem.StreamSecurity != Global.StreamSecurity + && profileItem.StreamSecurity != Global.StreamSecurityReality) + { + profileItem.StreamSecurity = string.Empty; + } + else + { + if (Utils.IsNullOrEmpty(profileItem.AllowInsecure)) + { + profileItem.AllowInsecure = config.CoreBasicItem.DefAllowInsecure.ToString().ToLower(); + } + if (Utils.IsNullOrEmpty(profileItem.Fingerprint) && profileItem.StreamSecurity == Global.StreamSecurityReality) + { + profileItem.Fingerprint = config.CoreBasicItem.DefFingerprint; + } + } + } + + if (Utils.IsNotEmpty(profileItem.Network) && !Global.Networks.Contains(profileItem.Network)) + { + profileItem.Network = Global.DefaultNetwork; + } + + var maxSort = -1; + if (Utils.IsNullOrEmpty(profileItem.IndexId)) + { + profileItem.IndexId = Utils.GetGuid(false); + maxSort = ProfileExHandler.Instance.GetMaxSort(); + } + if (!toFile && maxSort < 0) + { + maxSort = ProfileExHandler.Instance.GetMaxSort(); + } + if (maxSort > 0) + { + ProfileExHandler.Instance.SetSort(profileItem.IndexId, maxSort + 1); + } + + if (toFile) + { + await SQLiteHelper.Instance.ReplaceAsync(profileItem); + } + return 0; + } + + private static bool CompareProfileItem(ProfileItem o, ProfileItem n, bool remarks) + { + if (o == null || n == null) + { + return false; + } + + return o.ConfigType == n.ConfigType + && o.Address == n.Address + && o.Port == n.Port + && o.Id == n.Id + && o.Security == n.Security + && o.Network == n.Network + && o.HeaderType == n.HeaderType + && o.RequestHost == n.RequestHost + && o.Path == n.Path + && (o.ConfigType == EConfigType.Trojan || o.StreamSecurity == n.StreamSecurity) + && o.Flow == n.Flow + && o.Sni == n.Sni + && o.Alpn == n.Alpn + && o.Fingerprint == n.Fingerprint + && o.PublicKey == n.PublicKey + && o.ShortId == n.ShortId + && (!remarks || o.Remarks == n.Remarks); + } + + private static async Task RemoveProfileItem(Config config, string indexId) + { + try + { + var item = await AppHandler.Instance.GetProfileItem(indexId); + if (item == null) + { + return 0; + } + if (item.ConfigType == EConfigType.Custom) + { + File.Delete(Utils.GetConfigPath(item.Address)); + } + + await SQLiteHelper.Instance.DeleteAsync(item); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return 0; + } + + public static async Task AddCustomServer4Multiple(Config config, List selecteds, ECoreType coreType) + { + var indexId = Utils.GetMd5(Global.CoreMultipleLoadConfigFileName); + var configPath = Utils.GetConfigPath(Global.CoreMultipleLoadConfigFileName); + + var result = await CoreConfigHandler.GenerateClientMultipleLoadConfig(config, configPath, selecteds, coreType); + if (result.Success != true) + { + return result; + } + + var fileName = configPath; + if (!File.Exists(fileName)) + { + return result; + } + + var profileItem = await AppHandler.Instance.GetProfileItem(indexId) ?? new(); + profileItem.IndexId = indexId; + profileItem.Remarks = coreType == ECoreType.sing_box ? ResUI.menuSetDefaultMultipleServer : ResUI.menuSetDefaultLoadBalanceServer; + profileItem.Address = Global.CoreMultipleLoadConfigFileName; + profileItem.ConfigType = EConfigType.Custom; + profileItem.CoreType = coreType; + + await AddServerCommon(config, profileItem, true); + + result.Data = indexId; + return result; + } + + public static async Task GetPreSocksItem(Config config, ProfileItem node, ECoreType coreType) + { + ProfileItem? itemSocks = null; + if (node.ConfigType != EConfigType.Custom && coreType != ECoreType.sing_box && config.TunModeItem.EnableTun) + { + itemSocks = new ProfileItem() + { + CoreType = ECoreType.sing_box, + ConfigType = EConfigType.SOCKS, + Address = Global.Loopback, + Sni = node.Address, //Tun2SocksAddress + Port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks) + }; + } + else if ((node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0)) + { + var preCoreType = config.RunningCoreType = config.TunModeItem.EnableTun ? ECoreType.sing_box : ECoreType.Xray; + itemSocks = new ProfileItem() + { + CoreType = preCoreType, + ConfigType = EConfigType.SOCKS, + Address = Global.Loopback, + Port = node.PreSocksPort.Value, + }; + } + await Task.CompletedTask; + return itemSocks; + } + + #endregion Server + + #region Batch add servers + + /// + /// 批量添加服务器 + /// + /// + /// + /// + /// 成功导入的数量 + private static async Task AddBatchServersCommon(Config config, string strData, string subid, bool isSub) + { + if (Utils.IsNullOrEmpty(strData)) + { + return -1; + } + + var subFilter = string.Empty; + //remove sub items + if (isSub && Utils.IsNotEmpty(subid)) + { + await RemoveServerViaSubid(config, subid, isSub); + subFilter = (await AppHandler.Instance.GetSubItem(subid))?.Filter ?? ""; + } + + var countServers = 0; + List lstAdd = new(); + var arrData = strData.Split(Environment.NewLine.ToCharArray()).Where(t => !t.IsNullOrEmpty()); + if (isSub) + { + arrData = arrData.Distinct(); + } + foreach (var str in arrData) + { + //maybe sub + if (!isSub && (str.StartsWith(Global.HttpsProtocol) || str.StartsWith(Global.HttpProtocol))) + { + if (await AddSubItem(config, str) == 0) + { + countServers++; + } + continue; + } + var profileItem = FmtHandler.ResolveConfig(str, out string msg); + if (profileItem is null) + { + continue; + } + + //exist sub items //filter + if (isSub && Utils.IsNotEmpty(subid) && Utils.IsNotEmpty(subFilter)) + { + if (!Regex.IsMatch(profileItem.Remarks, subFilter)) + { + continue; + } + } + profileItem.Subid = subid; + profileItem.IsSub = isSub; + + var addStatus = profileItem.ConfigType switch + { + EConfigType.VMess => await AddVMessServer(config, profileItem, false), + EConfigType.Shadowsocks => await AddShadowsocksServer(config, profileItem, false), + EConfigType.SOCKS => await AddSocksServer(config, profileItem, false), + EConfigType.Trojan => await AddTrojanServer(config, profileItem, false), + EConfigType.VLESS => await AddVlessServer(config, profileItem, false), + EConfigType.Hysteria2 => await AddHysteria2Server(config, profileItem, false), + EConfigType.TUIC => await AddTuicServer(config, profileItem, false), + EConfigType.WireGuard => await AddWireguardServer(config, profileItem, false), + _ => -1, + }; + + if (addStatus == 0) + { + countServers++; + lstAdd.Add(profileItem); + } + } + + if (lstAdd.Count > 0) + { + await SQLiteHelper.Instance.InsertAllAsync(lstAdd); + } + + await SaveConfig(config); + return countServers; + } + + private static async Task AddBatchServers4Custom(Config config, string strData, string subid, bool isSub) + { + if (Utils.IsNullOrEmpty(strData)) + { + return -1; + } + + var subItem = await AppHandler.Instance.GetSubItem(subid); + var subRemarks = subItem?.Remarks; + var preSocksPort = subItem?.PreSocksPort; + + List? lstProfiles = null; + //Is sing-box array configuration + if (lstProfiles is null || lstProfiles.Count <= 0) + { + lstProfiles = SingboxFmt.ResolveFullArray(strData, subRemarks); + } + //Is v2ray array configuration + if (lstProfiles is null || lstProfiles.Count <= 0) + { + lstProfiles = V2rayFmt.ResolveFullArray(strData, subRemarks); + } + if (lstProfiles != null && lstProfiles.Count > 0) + { + if (isSub && Utils.IsNotEmpty(subid)) + { + await RemoveServerViaSubid(config, subid, isSub); + } + int count = 0; + foreach (var it in lstProfiles) + { + it.Subid = subid; + it.IsSub = isSub; + it.PreSocksPort = preSocksPort; + if (await AddCustomServer(config, it, true) == 0) + { + count++; + } + } + if (count > 0) + { + return count; + } + } + + ProfileItem? profileItem = null; + //Is sing-box configuration + if (profileItem is null) + { + profileItem = SingboxFmt.ResolveFull(strData, subRemarks); + } + //Is v2ray configuration + if (profileItem is null) + { + profileItem = V2rayFmt.ResolveFull(strData, subRemarks); + } + //Is Clash configuration + if (profileItem is null) + { + profileItem = ClashFmt.ResolveFull(strData, subRemarks); + } + //Is hysteria configuration + if (profileItem is null) + { + profileItem = Hysteria2Fmt.ResolveFull2(strData, subRemarks); + } + if (profileItem is null) + { + profileItem = Hysteria2Fmt.ResolveFull(strData, subRemarks); + } + //Is naiveproxy configuration + if (profileItem is null) + { + profileItem = NaiveproxyFmt.ResolveFull(strData, subRemarks); + } + if (profileItem is null || Utils.IsNullOrEmpty(profileItem.Address)) + { + return -1; + } + + if (isSub && Utils.IsNotEmpty(subid)) + { + await RemoveServerViaSubid(config, subid, isSub); + } + + profileItem.Subid = subid; + profileItem.IsSub = isSub; + profileItem.PreSocksPort = preSocksPort; + if (await AddCustomServer(config, profileItem, true) == 0) + { + return 1; + } + else + { + return -1; + } + } + + private static async Task AddBatchServers4SsSIP008(Config config, string strData, string subid, bool isSub) + { + if (Utils.IsNullOrEmpty(strData)) + { + return -1; + } + + if (isSub && Utils.IsNotEmpty(subid)) + { + await RemoveServerViaSubid(config, subid, isSub); + } + + var lstSsServer = ShadowsocksFmt.ResolveSip008(strData); + if (lstSsServer?.Count > 0) + { + int counter = 0; + foreach (var ssItem in lstSsServer) + { + ssItem.Subid = subid; + ssItem.IsSub = isSub; + if (await AddShadowsocksServer(config, ssItem) == 0) + { + counter++; + } + } + await SaveConfig(config); + return counter; + } + + return -1; + } + + public static async Task AddBatchServers(Config config, string strData, string subid, bool isSub) + { + if (Utils.IsNullOrEmpty(strData)) + { + return -1; + } + List? lstOriSub = null; + ProfileItem? activeProfile = null; + if (isSub && Utils.IsNotEmpty(subid)) + { + lstOriSub = await AppHandler.Instance.ProfileItems(subid); + activeProfile = lstOriSub?.FirstOrDefault(t => t.IndexId == config.IndexId); + } + + var counter = 0; + if (Utils.IsBase64String(strData)) + { + counter = await AddBatchServersCommon(config, Utils.Base64Decode(strData), subid, isSub); + } + if (counter < 1) + { + counter = await AddBatchServersCommon(config, strData, subid, isSub); + } + if (counter < 1) + { + counter = await AddBatchServersCommon(config, Utils.Base64Decode(strData), subid, isSub); + } + + if (counter < 1) + { + counter = await AddBatchServers4SsSIP008(config, strData, subid, isSub); + } + + //maybe other sub + if (counter < 1) + { + counter = await AddBatchServers4Custom(config, strData, subid, isSub); + } + + //Select active node + if (activeProfile != null) + { + var lstSub = await AppHandler.Instance.ProfileItems(subid); + var existItem = lstSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == activeProfile.Remarks : CompareProfileItem(t, activeProfile, true)); + if (existItem != null) + { + await ConfigHandler.SetDefaultServerIndex(config, existItem.IndexId); + } + } + + //Keep the last traffic statistics + if (lstOriSub != null) + { + var lstSub = await AppHandler.Instance.ProfileItems(subid); + foreach (var item in lstSub) + { + var existItem = lstOriSub?.FirstOrDefault(t => config.UiItem.EnableUpdateSubOnlyRemarksExist ? t.Remarks == item.Remarks : CompareProfileItem(t, item, true)); + if (existItem != null) + { + await StatisticsHandler.Instance.CloneServerStatItem(existItem.IndexId, item.IndexId); + } + } + } + + return counter; + } + + #endregion Batch add servers + + #region Sub & Group + + /// + /// add sub + /// + /// + /// + /// + public static async Task AddSubItem(Config config, string url) + { + //already exists + var count = await SQLiteHelper.Instance.TableAsync().CountAsync(e => e.Url == url); + if (count > 0) + { + return 0; + } + SubItem subItem = new() + { + Id = string.Empty, + Url = url + }; + + var uri = Utils.TryUri(url); + if (uri == null) + return -1; + //Do not allow http protocol + if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) + { + //TODO Temporary reminder to be removed later + NoticeHandler.Instance.Enqueue(ResUI.InsecureUrlProtocol); + //return -1; + } + + var queryVars = Utils.ParseQueryString(uri.Query); + subItem.Remarks = queryVars["remarks"] ?? "import_sub"; + + return await AddSubItem(config, subItem); + } + + public static async Task AddSubItem(Config config, SubItem subItem) + { + var item = await AppHandler.Instance.GetSubItem(subItem.Id); + if (item is null) + { + item = subItem; + } + else + { + item.Remarks = subItem.Remarks; + item.Url = subItem.Url; + item.MoreUrl = subItem.MoreUrl; + item.Enabled = subItem.Enabled; + item.AutoUpdateInterval = subItem.AutoUpdateInterval; + item.UserAgent = subItem.UserAgent; + item.Sort = subItem.Sort; + item.Filter = subItem.Filter; + item.UpdateTime = subItem.UpdateTime; + item.ConvertTarget = subItem.ConvertTarget; + item.PrevProfile = subItem.PrevProfile; + item.NextProfile = subItem.NextProfile; + item.PreSocksPort = subItem.PreSocksPort; + item.Memo = subItem.Memo; + } + + if (Utils.IsNullOrEmpty(item.Id)) + { + item.Id = Utils.GetGuid(false); + + if (item.Sort <= 0) + { + var maxSort = 0; + if (await SQLiteHelper.Instance.TableAsync().CountAsync() > 0) + { + var lstSubs = (await AppHandler.Instance.SubItems()); + maxSort = lstSubs.LastOrDefault()?.Sort ?? 0; + } + item.Sort = maxSort + 1; + } + } + if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) + { + return 0; + } + else + { + return -1; + } + } + + /// + /// 移除服务器 + /// + /// + /// + /// + public static async Task RemoveServerViaSubid(Config config, string subid, bool isSub) + { + if (Utils.IsNullOrEmpty(subid)) + { + return -1; + } + var customProfile = await SQLiteHelper.Instance.TableAsync().Where(t => t.Subid == subid && t.ConfigType == EConfigType.Custom).ToListAsync(); + if (isSub) + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileItem where isSub = 1 and subid = '{subid}'"); + } + else + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileItem where subid = '{subid}'"); + } + foreach (var item in customProfile) + { + File.Delete(Utils.GetConfigPath(item.Address)); + } + + return 0; + } + + public static async Task DeleteSubItem(Config config, string id) + { + var item = await AppHandler.Instance.GetSubItem(id); + if (item is null) + { + return 0; + } + await SQLiteHelper.Instance.DeleteAsync(item); + await RemoveServerViaSubid(config, id, false); + + return 0; + } + + public static async Task MoveToGroup(Config config, List lstProfile, string subid) + { + foreach (var item in lstProfile) + { + item.Subid = subid; + } + await SQLiteHelper.Instance.UpdateAllAsync(lstProfile); + + return 0; + } + + #endregion Sub & Group + + #region Routing + + public static async Task SaveRoutingItem(Config config, RoutingItem item) + { + if (Utils.IsNullOrEmpty(item.Id)) + { + item.Id = Utils.GetGuid(false); + } + + if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) + { + return 0; + } + else + { + return -1; + } + } + + /// + /// AddBatchRoutingRules + /// + /// + /// + /// + public static async Task AddBatchRoutingRules(RoutingItem routingItem, string strData) + { + if (Utils.IsNullOrEmpty(strData)) + { + return -1; + } + + var lstRules = JsonUtils.Deserialize>(strData); + if (lstRules == null) + { + return -1; + } + + foreach (var item in lstRules) + { + item.Id = Utils.GetGuid(false); + } + routingItem.RuleNum = lstRules.Count; + routingItem.RuleSet = JsonUtils.Serialize(lstRules, false); + + if (Utils.IsNullOrEmpty(routingItem.Id)) + { + routingItem.Id = Utils.GetGuid(false); + } + + if (await SQLiteHelper.Instance.ReplaceAsync(routingItem) > 0) + { + return 0; + } + else + { + return -1; + } + } + + /// + /// MoveRoutingRule + /// + /// + /// + /// + /// + public static async Task MoveRoutingRule(List rules, int index, EMove eMove, int pos = -1) + { + int count = rules.Count; + if (index < 0 || index > rules.Count - 1) + { + return -1; + } + switch (eMove) + { + case EMove.Top: + { + if (index == 0) + { + return 0; + } + var item = JsonUtils.DeepCopy(rules[index]); + rules.RemoveAt(index); + rules.Insert(0, item); + + break; + } + case EMove.Up: + { + if (index == 0) + { + return 0; + } + var item = JsonUtils.DeepCopy(rules[index]); + rules.RemoveAt(index); + rules.Insert(index - 1, item); + + break; + } + + case EMove.Down: + { + if (index == count - 1) + { + return 0; + } + var item = JsonUtils.DeepCopy(rules[index]); + rules.RemoveAt(index); + rules.Insert(index + 1, item); + + break; + } + case EMove.Bottom: + { + if (index == count - 1) + { + return 0; + } + var item = JsonUtils.DeepCopy(rules[index]); + rules.RemoveAt(index); + rules.Add(item); + + break; + } + case EMove.Position: + { + var removeItem = rules[index]; + var item = JsonUtils.DeepCopy(rules[index]); + rules.Insert(pos, item); + rules.Remove(removeItem); + break; + } + } + return await Task.FromResult(0); + } + + public static async Task SetDefaultRouting(Config config, RoutingItem routingItem) + { + if (await SQLiteHelper.Instance.TableAsync().Where(t => t.Id == routingItem.Id).CountAsync() > 0) + { + config.RoutingBasicItem.RoutingIndexId = routingItem.Id; + } + + await SaveConfig(config); + + return 0; + } + + public static async Task GetDefaultRouting(Config config) + { + var item = await AppHandler.Instance.GetRoutingItem(config.RoutingBasicItem.RoutingIndexId); + if (item is null) + { + var item2 = await SQLiteHelper.Instance.TableAsync().FirstOrDefaultAsync(); + await SetDefaultRouting(config, item2); + return item2; + } + + return item; + } + + public static async Task InitRouting(Config config, bool blImportAdvancedRules = false) + { + if (string.IsNullOrEmpty(config.ConstItem.RouteRulesTemplateSourceUrl)) + { + await InitBuiltinRouting(config, blImportAdvancedRules); + } + else + { + await InitExternalRouting(config, blImportAdvancedRules); + } + + return 0; + } + + public static async Task InitExternalRouting(Config config, bool blImportAdvancedRules = false) + { + var downloadHandle = new DownloadService(); + var templateContent = await downloadHandle.TryDownloadString(config.ConstItem.RouteRulesTemplateSourceUrl, true, ""); + if (string.IsNullOrEmpty(templateContent)) + return await InitBuiltinRouting(config, blImportAdvancedRules); // fallback + + var template = JsonUtils.Deserialize(templateContent); + if (template == null) + return await InitBuiltinRouting(config, blImportAdvancedRules); // fallback + + var items = await AppHandler.Instance.RoutingItems(); + var maxSort = items.Count; + if (!blImportAdvancedRules && items.Where(t => t.Remarks.StartsWith(template.Version)).ToList().Count > 0) + { + return 0; + } + for (var i = 0; i < template.RoutingItems.Length; i++) + { + var item = template.RoutingItems[i]; + + if (string.IsNullOrEmpty(item.Url) && string.IsNullOrEmpty(item.RuleSet)) + continue; + + var ruleSetsString = !string.IsNullOrEmpty(item.RuleSet) + ? item.RuleSet + : await downloadHandle.TryDownloadString(item.Url, true, ""); + + if (string.IsNullOrEmpty(ruleSetsString)) + continue; + + item.Remarks = $"{template.Version}-{item.Remarks}"; + item.Enabled = true; + item.Sort = ++maxSort; + item.Url = string.Empty; + + await AddBatchRoutingRules(item, ruleSetsString); + + //first rule as default at first startup + if (!blImportAdvancedRules && i == 0) + { + await SetDefaultRouting(config, item); + } + } + + return 0; + } + + public static async Task InitBuiltinRouting(Config config, bool blImportAdvancedRules = false) + { + var ver = "V3-"; + var items = await AppHandler.Instance.RoutingItems(); + + //TODO Temporary code to be removed later + var lockItem = items?.FirstOrDefault(t => t.Locked == true); + if (lockItem != null) + { + await ConfigHandler.RemoveRoutingItem(lockItem); + items = await AppHandler.Instance.RoutingItems(); + } + + if (!blImportAdvancedRules && items.Where(t => t.Remarks.StartsWith(ver)).ToList().Count > 0) + { + return 0; + } + + var maxSort = items.Count; + //Bypass the mainland + var item2 = new RoutingItem() + { + Remarks = $"{ver}绕过大陆(Whitelist)", + Url = string.Empty, + Sort = maxSort + 1, + }; + await AddBatchRoutingRules(item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white")); + + //Blacklist + var item3 = new RoutingItem() + { + Remarks = $"{ver}黑名单(Blacklist)", + Url = string.Empty, + Sort = maxSort + 2, + }; + await AddBatchRoutingRules(item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); + + //Global + var item1 = new RoutingItem() + { + Remarks = $"{ver}全局(Global)", + Url = string.Empty, + Sort = maxSort + 3, + }; + await AddBatchRoutingRules(item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); + + if (!blImportAdvancedRules) + { + await SetDefaultRouting(config, item2); + } + return 0; + } + + public static async Task RemoveRoutingItem(RoutingItem routingItem) + { + await SQLiteHelper.Instance.DeleteAsync(routingItem); + } + + #endregion Routing + + #region DNS + + public static async Task InitBuiltinDNS(Config config) + { + var items = await AppHandler.Instance.DNSItems(); + if (items.Count <= 0) + { + var item = new DNSItem() + { + Remarks = "V2ray", + CoreType = ECoreType.Xray, + }; + await SaveDNSItems(config, item); + + var item2 = new DNSItem() + { + Remarks = "sing-box", + CoreType = ECoreType.sing_box, + }; + await SaveDNSItems(config, item2); + } + + return 0; + } + + public static async Task SaveDNSItems(Config config, DNSItem item) + { + if (item == null) + { + return -1; + } + + if (Utils.IsNullOrEmpty(item.Id)) + { + item.Id = Utils.GetGuid(false); + } + + if (await SQLiteHelper.Instance.ReplaceAsync(item) > 0) + { + return 0; + } + else + { + return -1; + } + } + + public static async Task GetExternalDNSItem(ECoreType type, string url) + { + var currentItem = await AppHandler.Instance.GetDNSItem(type); + + var downloadHandle = new DownloadService(); + var templateContent = await downloadHandle.TryDownloadString(url, true, ""); + if (string.IsNullOrEmpty(templateContent)) + return currentItem; + + var template = JsonUtils.Deserialize(templateContent); + if (template == null) + return currentItem; + + if (!string.IsNullOrEmpty(template.NormalDNS)) + template.NormalDNS = await downloadHandle.TryDownloadString(template.NormalDNS, true, ""); + + if (!string.IsNullOrEmpty(template.TunDNS)) + template.TunDNS = await downloadHandle.TryDownloadString(template.TunDNS, true, ""); + + template.Id = currentItem.Id; + template.Enabled = currentItem.Enabled; + template.Remarks = currentItem.Remarks; + template.CoreType = type; + + return template; + } + + #endregion DNS + + #region Regional Presets + + public static async Task ApplyRegionalPreset(Config config, EPresetType type) + { + switch (type) + { + case EPresetType.Default: + config.ConstItem.GeoSourceUrl = ""; + config.ConstItem.SrsSourceUrl = ""; + config.ConstItem.RouteRulesTemplateSourceUrl = ""; + + await SQLiteHelper.Instance.DeleteAllAsync(); + await InitBuiltinDNS(config); + + return true; + + case EPresetType.Russia: + config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[1]; + config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[1]; + config.ConstItem.RouteRulesTemplateSourceUrl = Global.RoutingRulesSources[1]; + + await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[1] + "v2ray.json")); + await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[1] + "sing_box.json")); + + return true; + + case EPresetType.Iran: + config.ConstItem.GeoSourceUrl = Global.GeoFilesSources[2]; + config.ConstItem.SrsSourceUrl = Global.SingboxRulesetSources[2]; + config.ConstItem.RouteRulesTemplateSourceUrl = Global.RoutingRulesSources[2]; + + await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.Xray, Global.DNSTemplateSources[2] + "v2ray.json")); + await SaveDNSItems(config, await GetExternalDNSItem(ECoreType.sing_box, Global.DNSTemplateSources[2] + "sing_box.json")); + + return true; + } + + return false; + } + + #endregion Regional Presets + } +} diff --git a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs index 8713b8dd..0be5f70f 100644 --- a/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreConfigHandler.cs @@ -1,132 +1,132 @@ -namespace ServiceLib.Handler +namespace ServiceLib.Handler { - /// - /// Core configuration file processing class - /// - public class CoreConfigHandler - { - private static readonly string _tag = "CoreConfigHandler"; + /// + /// Core configuration file processing class + /// + public class CoreConfigHandler + { + private static readonly string _tag = "CoreConfigHandler"; - public static async Task GenerateClientConfig(ProfileItem node, string? fileName) - { - var config = AppHandler.Instance.Config; - var result = new RetResult(); + public static async Task GenerateClientConfig(ProfileItem node, string? fileName) + { + var config = AppHandler.Instance.Config; + var result = new RetResult(); - if (node.ConfigType == EConfigType.Custom) - { - result = node.CoreType switch - { - ECoreType.mihomo => await new CoreConfigClashService(config).GenerateClientCustomConfig(node, fileName), - ECoreType.sing_box => await new CoreConfigSingboxService(config).GenerateClientCustomConfig(node, fileName), - _ => await GenerateClientCustomConfig(node, fileName) - }; - } - else if (AppHandler.Instance.GetCoreType(node, node.ConfigType) == ECoreType.sing_box) - { - result = await new CoreConfigSingboxService(config).GenerateClientConfigContent(node); - } - else - { - result = await new CoreConfigV2rayService(config).GenerateClientConfigContent(node); - } - if (result.Success != true) - { - return result; - } - if (Utils.IsNotEmpty(fileName) && result.Data != null) - { - await File.WriteAllTextAsync(fileName, result.Data.ToString()); - } + if (node.ConfigType == EConfigType.Custom) + { + result = node.CoreType switch + { + ECoreType.mihomo => await new CoreConfigClashService(config).GenerateClientCustomConfig(node, fileName), + ECoreType.sing_box => await new CoreConfigSingboxService(config).GenerateClientCustomConfig(node, fileName), + _ => await GenerateClientCustomConfig(node, fileName) + }; + } + else if (AppHandler.Instance.GetCoreType(node, node.ConfigType) == ECoreType.sing_box) + { + result = await new CoreConfigSingboxService(config).GenerateClientConfigContent(node); + } + else + { + result = await new CoreConfigV2rayService(config).GenerateClientConfigContent(node); + } + if (result.Success != true) + { + return result; + } + if (Utils.IsNotEmpty(fileName) && result.Data != null) + { + await File.WriteAllTextAsync(fileName, result.Data.ToString()); + } - return result; - } + return result; + } - private static async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) - { - var ret = new RetResult(); - try - { - if (node == null || fileName is null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } + private static async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) + { + var ret = new RetResult(); + try + { + if (node == null || fileName is null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } - if (File.Exists(fileName)) - { - File.SetAttributes(fileName, FileAttributes.Normal); //If the file has a read-only attribute, direct deletion will fail - File.Delete(fileName); - } + if (File.Exists(fileName)) + { + File.SetAttributes(fileName, FileAttributes.Normal); //If the file has a read-only attribute, direct deletion will fail + File.Delete(fileName); + } - string addressFileName = node.Address; - if (!File.Exists(addressFileName)) - { - addressFileName = Utils.GetConfigPath(addressFileName); - } - if (!File.Exists(addressFileName)) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - File.Copy(addressFileName, fileName); - File.SetAttributes(fileName, FileAttributes.Normal); //Copy will keep the attributes of addressFileName, so we need to add write permissions to fileName just in case of addressFileName is a read-only file. + string addressFileName = node.Address; + if (!File.Exists(addressFileName)) + { + addressFileName = Utils.GetConfigPath(addressFileName); + } + if (!File.Exists(addressFileName)) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + File.Copy(addressFileName, fileName); + File.SetAttributes(fileName, FileAttributes.Normal); //Copy will keep the attributes of addressFileName, so we need to add write permissions to fileName just in case of addressFileName is a read-only file. - //check again - if (!File.Exists(fileName)) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } + //check again + if (!File.Exists(fileName)) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } - ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); - ret.Success = true; - return await Task.FromResult(ret); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } + ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); + ret.Success = true; + return await Task.FromResult(ret); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } - public static async Task GenerateClientSpeedtestConfig(Config config, string fileName, List selecteds, ECoreType coreType) - { - var result = new RetResult(); - if (coreType == ECoreType.sing_box) - { - result = await new CoreConfigSingboxService(config).GenerateClientSpeedtestConfig(selecteds); - } - else if (coreType == ECoreType.Xray) - { - result = await new CoreConfigV2rayService(config).GenerateClientSpeedtestConfig(selecteds); - } - if (result.Success != true) - { - return result; - } - await File.WriteAllTextAsync(fileName, result.Data.ToString()); - return result; - } + public static async Task GenerateClientSpeedtestConfig(Config config, string fileName, List selecteds, ECoreType coreType) + { + var result = new RetResult(); + if (coreType == ECoreType.sing_box) + { + result = await new CoreConfigSingboxService(config).GenerateClientSpeedtestConfig(selecteds); + } + else if (coreType == ECoreType.Xray) + { + result = await new CoreConfigV2rayService(config).GenerateClientSpeedtestConfig(selecteds); + } + if (result.Success != true) + { + return result; + } + await File.WriteAllTextAsync(fileName, result.Data.ToString()); + return result; + } - public static async Task GenerateClientMultipleLoadConfig(Config config, string fileName, List selecteds, ECoreType coreType) - { - var result = new RetResult(); - if (coreType == ECoreType.sing_box) - { - result = await new CoreConfigSingboxService(config).GenerateClientMultipleLoadConfig(selecteds); - } - else if (coreType == ECoreType.Xray) - { - result = await new CoreConfigV2rayService(config).GenerateClientMultipleLoadConfig(selecteds); - } + public static async Task GenerateClientMultipleLoadConfig(Config config, string fileName, List selecteds, ECoreType coreType) + { + var result = new RetResult(); + if (coreType == ECoreType.sing_box) + { + result = await new CoreConfigSingboxService(config).GenerateClientMultipleLoadConfig(selecteds); + } + else if (coreType == ECoreType.Xray) + { + result = await new CoreConfigV2rayService(config).GenerateClientMultipleLoadConfig(selecteds); + } - if (result.Success != true) - { - return result; - } - await File.WriteAllTextAsync(fileName, result.Data.ToString()); - return result; - } - } -} \ No newline at end of file + if (result.Success != true) + { + return result; + } + await File.WriteAllTextAsync(fileName, result.Data.ToString()); + return result; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/CoreHandler.cs b/v2rayN/ServiceLib/Handler/CoreHandler.cs index 44215204..19d6163f 100644 --- a/v2rayN/ServiceLib/Handler/CoreHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreHandler.cs @@ -1,371 +1,374 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Text; namespace ServiceLib.Handler { - /// - /// Core process processing class - /// - public class CoreHandler - { - private static readonly Lazy _instance = new(() => new()); - public static CoreHandler Instance => _instance.Value; - private Config _config; - private Process? _process; - private Process? _processPre; - private int _linuxSudoPid = -1; - private Action? _updateFunc; - private const string _tag = "CoreHandler"; + /// + /// Core process processing class + /// + public class CoreHandler + { + private static readonly Lazy _instance = new(() => new()); + public static CoreHandler Instance => _instance.Value; + private Config _config; + private Process? _process; + private Process? _processPre; + private int _linuxSudoPid = -1; + private Action? _updateFunc; + private const string _tag = "CoreHandler"; - public async Task Init(Config config, Action updateFunc) - { - _config = config; - _updateFunc = updateFunc; + public async Task Init(Config config, Action updateFunc) + { + _config = config; + _updateFunc = updateFunc; - Environment.SetEnvironmentVariable(Global.V2RayLocalAsset, Utils.GetBinPath(""), EnvironmentVariableTarget.Process); - Environment.SetEnvironmentVariable(Global.XrayLocalAsset, Utils.GetBinPath(""), EnvironmentVariableTarget.Process); + Environment.SetEnvironmentVariable(Global.V2RayLocalAsset, Utils.GetBinPath(""), EnvironmentVariableTarget.Process); + Environment.SetEnvironmentVariable(Global.XrayLocalAsset, Utils.GetBinPath(""), EnvironmentVariableTarget.Process); - //Copy the bin folder to the storage location (for init) - if (Environment.GetEnvironmentVariable(Global.LocalAppData) == "1") - { - var fromPath = Utils.GetBaseDirectory("bin"); - var toPath = Utils.GetBinPath(""); - if (fromPath != toPath) - { - FileManager.CopyDirectory(fromPath, toPath, true, false); - } - } + //Copy the bin folder to the storage location (for init) + if (Environment.GetEnvironmentVariable(Global.LocalAppData) == "1") + { + var fromPath = Utils.GetBaseDirectory("bin"); + var toPath = Utils.GetBinPath(""); + if (fromPath != toPath) + { + FileManager.CopyDirectory(fromPath, toPath, true, false); + } + } - if (Utils.IsNonWindows()) - { - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(); - foreach (var it in coreInfo) - { - if (it.CoreType == ECoreType.v2rayN) - { - if (Utils.UpgradeAppExists(out var upgradeFileName)) - { - await Utils.SetLinuxChmod(upgradeFileName); - } - continue; - } + if (Utils.IsNonWindows()) + { + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(); + foreach (var it in coreInfo) + { + if (it.CoreType == ECoreType.v2rayN) + { + if (Utils.UpgradeAppExists(out var upgradeFileName)) + { + await Utils.SetLinuxChmod(upgradeFileName); + } + continue; + } - foreach (var name in it.CoreExes) - { - var exe = Utils.GetBinPath(Utils.GetExeName(name), it.CoreType.ToString()); - if (File.Exists(exe)) - { - await Utils.SetLinuxChmod(exe); - } - } - } - } - } + foreach (var name in it.CoreExes) + { + var exe = Utils.GetBinPath(Utils.GetExeName(name), it.CoreType.ToString()); + if (File.Exists(exe)) + { + await Utils.SetLinuxChmod(exe); + } + } + } + } + } - public async Task LoadCore(ProfileItem? node) - { - if (node == null) - { - UpdateFunc(false, ResUI.CheckServerSettings); - return; - } + public async Task LoadCore(ProfileItem? node) + { + if (node == null) + { + UpdateFunc(false, ResUI.CheckServerSettings); + return; + } - var fileName = Utils.GetConfigPath(Global.CoreConfigFileName); - var result = await CoreConfigHandler.GenerateClientConfig(node, fileName); - if (result.Success != true) - { - UpdateFunc(true, result.Msg); - return; - } + var fileName = Utils.GetConfigPath(Global.CoreConfigFileName); + var result = await CoreConfigHandler.GenerateClientConfig(node, fileName); + if (result.Success != true) + { + UpdateFunc(true, result.Msg); + return; + } - UpdateFunc(false, $"{node.GetSummary()}"); - UpdateFunc(false, $"{Utils.GetRuntimeInfo()}"); - UpdateFunc(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"))); - await CoreStop(); - await Task.Delay(100); - await CoreStart(node); - await CoreStartPreService(node); - if (_process != null) - { - UpdateFunc(true, $"{node.GetSummary()}"); - } - } + UpdateFunc(false, $"{node.GetSummary()}"); + UpdateFunc(false, $"{Utils.GetRuntimeInfo()}"); + UpdateFunc(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"))); + await CoreStop(); + await Task.Delay(100); + await CoreStart(node); + await CoreStartPreService(node); + if (_process != null) + { + UpdateFunc(true, $"{node.GetSummary()}"); + } + } - public async Task LoadCoreConfigSpeedtest(List selecteds) - { - var coreType = selecteds.Exists(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard) ? ECoreType.sing_box : ECoreType.Xray; - var configPath = Utils.GetConfigPath(Global.CoreSpeedtestConfigFileName); - var result = await CoreConfigHandler.GenerateClientSpeedtestConfig(_config, configPath, selecteds, coreType); - UpdateFunc(false, result.Msg); - if (result.Success != true) - { - return -1; - } + public async Task LoadCoreConfigSpeedtest(List selecteds) + { + var coreType = selecteds.Exists(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard) ? ECoreType.sing_box : ECoreType.Xray; + var configPath = Utils.GetConfigPath(Global.CoreSpeedtestConfigFileName); + var result = await CoreConfigHandler.GenerateClientSpeedtestConfig(_config, configPath, selecteds, coreType); + UpdateFunc(false, result.Msg); + if (result.Success != true) + { + return -1; + } - UpdateFunc(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"))); - UpdateFunc(false, configPath); + UpdateFunc(false, string.Format(ResUI.StartService, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"))); + UpdateFunc(false, configPath); - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); - var proc = await RunProcess(coreInfo, Global.CoreSpeedtestConfigFileName, true, false); - if (proc is null) - { - return -1; - } + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); + var proc = await RunProcess(coreInfo, Global.CoreSpeedtestConfigFileName, true, false); + if (proc is null) + { + return -1; + } - return proc.Id; - } + return proc.Id; + } - public async Task CoreStop() - { - try - { - if (_process != null) - { - await ProcUtils.ProcessKill(_process, true); - _process = null; - } + public async Task CoreStop() + { + try + { + if (_process != null) + { + await ProcUtils.ProcessKill(_process, true); + _process = null; + } - if (_processPre != null) - { - await ProcUtils.ProcessKill(_processPre, true); - _processPre = null; - } + if (_processPre != null) + { + await ProcUtils.ProcessKill(_processPre, true); + _processPre = null; + } - if (_linuxSudoPid > 0) - { - await KillProcessAsLinuxSudo(); - } - _linuxSudoPid = -1; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + if (_linuxSudoPid > 0) + { + await KillProcessAsLinuxSudo(); + } + _linuxSudoPid = -1; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - #region Private + #region Private - private async Task CoreStart(ProfileItem node) - { - var coreType = _config.RunningCoreType = AppHandler.Instance.GetCoreType(node, node.ConfigType); - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); + private async Task CoreStart(ProfileItem node) + { + var coreType = _config.RunningCoreType = AppHandler.Instance.GetCoreType(node, node.ConfigType); + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(coreType); - var displayLog = node.ConfigType != EConfigType.Custom || node.DisplayLog; - var proc = await RunProcess(coreInfo, Global.CoreConfigFileName, displayLog, true); - if (proc is null) - { - return; - } - _process = proc; - } + var displayLog = node.ConfigType != EConfigType.Custom || node.DisplayLog; + var proc = await RunProcess(coreInfo, Global.CoreConfigFileName, displayLog, true); + if (proc is null) + { + return; + } + _process = proc; + } - private async Task CoreStartPreService(ProfileItem node) - { - if (_process != null && !_process.HasExited) - { - var coreType = AppHandler.Instance.GetCoreType(node, node.ConfigType); - var itemSocks = await ConfigHandler.GetPreSocksItem(_config, node, coreType); - if (itemSocks != null) - { - var preCoreType = itemSocks.CoreType ?? ECoreType.sing_box; - var fileName = Utils.GetConfigPath(Global.CorePreConfigFileName); - var result = await CoreConfigHandler.GenerateClientConfig(itemSocks, fileName); - if (result.Success) - { - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(preCoreType); - var proc = await RunProcess(coreInfo, Global.CorePreConfigFileName, true, true); - if (proc is null) - { - return; - } - _processPre = proc; - } - } - } - } + private async Task CoreStartPreService(ProfileItem node) + { + if (_process != null && !_process.HasExited) + { + var coreType = AppHandler.Instance.GetCoreType(node, node.ConfigType); + var itemSocks = await ConfigHandler.GetPreSocksItem(_config, node, coreType); + if (itemSocks != null) + { + var preCoreType = itemSocks.CoreType ?? ECoreType.sing_box; + var fileName = Utils.GetConfigPath(Global.CorePreConfigFileName); + var result = await CoreConfigHandler.GenerateClientConfig(itemSocks, fileName); + if (result.Success) + { + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(preCoreType); + var proc = await RunProcess(coreInfo, Global.CorePreConfigFileName, true, true); + if (proc is null) + { + return; + } + _processPre = proc; + } + } + } + } - private void UpdateFunc(bool notify, string msg) - { - _updateFunc?.Invoke(notify, msg); - } + private void UpdateFunc(bool notify, string msg) + { + _updateFunc?.Invoke(notify, msg); + } - private bool IsNeedSudo(ECoreType eCoreType) - { - return _config.TunModeItem.EnableTun - && eCoreType == ECoreType.sing_box - && (Utils.IsNonWindows()) - //&& _config.TunModeItem.LinuxSudoPwd.IsNotEmpty() - ; - } + private bool IsNeedSudo(ECoreType eCoreType) + { + return _config.TunModeItem.EnableTun + && eCoreType == ECoreType.sing_box + && Utils.IsNonWindows() + //&& _config.TunModeItem.LinuxSudoPwd.IsNotEmpty() + ; + } - #endregion Private + #endregion Private - #region Process + #region Process - private async Task RunProcess(CoreInfo? coreInfo, string configPath, bool displayLog, bool mayNeedSudo) - { - var fileName = CoreInfoHandler.Instance.GetCoreExecFile(coreInfo, out var msg); - if (Utils.IsNullOrEmpty(fileName)) - { - UpdateFunc(false, msg); - return null; - } + private async Task RunProcess(CoreInfo? coreInfo, string configPath, bool displayLog, bool mayNeedSudo) + { + var fileName = CoreInfoHandler.Instance.GetCoreExecFile(coreInfo, out var msg); + if (Utils.IsNullOrEmpty(fileName)) + { + UpdateFunc(false, msg); + return null; + } - try - { - Process proc = new() - { - StartInfo = new() - { - FileName = fileName, - Arguments = string.Format(coreInfo.Arguments, configPath), - WorkingDirectory = Utils.GetConfigPath(), - UseShellExecute = false, - RedirectStandardOutput = displayLog, - RedirectStandardError = displayLog, - CreateNoWindow = true, - StandardOutputEncoding = displayLog ? Encoding.UTF8 : null, - StandardErrorEncoding = displayLog ? Encoding.UTF8 : null, - } - }; + try + { + Process proc = new() + { + StartInfo = new() + { + FileName = fileName, + Arguments = string.Format(coreInfo.Arguments, configPath), + WorkingDirectory = Utils.GetConfigPath(), + UseShellExecute = false, + RedirectStandardOutput = displayLog, + RedirectStandardError = displayLog, + CreateNoWindow = true, + StandardOutputEncoding = displayLog ? Encoding.UTF8 : null, + StandardErrorEncoding = displayLog ? Encoding.UTF8 : null, + } + }; - var isNeedSudo = mayNeedSudo && IsNeedSudo(coreInfo.CoreType); - if (isNeedSudo) - { - await RunProcessAsLinuxSudo(proc, fileName, coreInfo, configPath); - } + var isNeedSudo = mayNeedSudo && IsNeedSudo(coreInfo.CoreType); + if (isNeedSudo) + { + await RunProcessAsLinuxSudo(proc, fileName, coreInfo, configPath); + } - if (displayLog) - { - proc.OutputDataReceived += (sender, e) => - { - if (Utils.IsNullOrEmpty(e.Data)) return; - UpdateFunc(false, e.Data + Environment.NewLine); - }; - proc.ErrorDataReceived += (sender, e) => - { - if (Utils.IsNullOrEmpty(e.Data)) return; - UpdateFunc(false, e.Data + Environment.NewLine); - }; - } - proc.Start(); + if (displayLog) + { + proc.OutputDataReceived += (sender, e) => + { + if (Utils.IsNullOrEmpty(e.Data)) + return; + UpdateFunc(false, e.Data + Environment.NewLine); + }; + proc.ErrorDataReceived += (sender, e) => + { + if (Utils.IsNullOrEmpty(e.Data)) + return; + UpdateFunc(false, e.Data + Environment.NewLine); + }; + } + proc.Start(); - if (isNeedSudo && _config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) - { - var pwd = DesUtils.Decrypt(_config.TunModeItem.LinuxSudoPwd); - await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(pwd); - await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(pwd); - } - if (isNeedSudo) _linuxSudoPid = proc.Id; + if (isNeedSudo && _config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) + { + var pwd = DesUtils.Decrypt(_config.TunModeItem.LinuxSudoPwd); + await Task.Delay(10); + await proc.StandardInput.WriteLineAsync(pwd); + await Task.Delay(10); + await proc.StandardInput.WriteLineAsync(pwd); + } + if (isNeedSudo) + _linuxSudoPid = proc.Id; - if (displayLog) - { - proc.BeginOutputReadLine(); - proc.BeginErrorReadLine(); - } + if (displayLog) + { + proc.BeginOutputReadLine(); + proc.BeginErrorReadLine(); + } - await Task.Delay(500); - AppHandler.Instance.AddProcess(proc.Handle); - if (proc is null or { HasExited: true }) - { - throw new Exception(ResUI.FailedToRunCore); - } - return proc; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - UpdateFunc(true, ex.Message); - return null; - } - } + await Task.Delay(500); + AppHandler.Instance.AddProcess(proc.Handle); + if (proc is null or { HasExited: true }) + { + throw new Exception(ResUI.FailedToRunCore); + } + return proc; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + UpdateFunc(true, ex.Message); + return null; + } + } - #endregion Process + #endregion Process - #region Linux + #region Linux - private async Task RunProcessAsLinuxSudo(Process proc, string fileName, CoreInfo coreInfo, string configPath) - { - var cmdLine = $"{fileName.AppendQuotes()} {string.Format(coreInfo.Arguments, Utils.GetConfigPath(configPath).AppendQuotes())}"; + private async Task RunProcessAsLinuxSudo(Process proc, string fileName, CoreInfo coreInfo, string configPath) + { + var cmdLine = $"{fileName.AppendQuotes()} {string.Format(coreInfo.Arguments, Utils.GetConfigPath(configPath).AppendQuotes())}"; - var shFilePath = await CreateLinuxShellFile(cmdLine, "run_as_sudo.sh"); - proc.StartInfo.FileName = shFilePath; - proc.StartInfo.Arguments = ""; - proc.StartInfo.WorkingDirectory = ""; - if (_config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) - { - proc.StartInfo.StandardInputEncoding = Encoding.UTF8; - proc.StartInfo.RedirectStandardInput = true; - } - } + var shFilePath = await CreateLinuxShellFile(cmdLine, "run_as_sudo.sh"); + proc.StartInfo.FileName = shFilePath; + proc.StartInfo.Arguments = ""; + proc.StartInfo.WorkingDirectory = ""; + if (_config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) + { + proc.StartInfo.StandardInputEncoding = Encoding.UTF8; + proc.StartInfo.RedirectStandardInput = true; + } + } - private async Task KillProcessAsLinuxSudo() - { - var cmdLine = $"kill {_linuxSudoPid}"; - var shFilePath = await CreateLinuxShellFile(cmdLine, "kill_as_sudo.sh"); - Process proc = new() - { - StartInfo = new() - { - FileName = shFilePath, - UseShellExecute = false, - CreateNoWindow = true, - StandardInputEncoding = Encoding.UTF8, - RedirectStandardInput = true - } - }; - proc.Start(); + private async Task KillProcessAsLinuxSudo() + { + var cmdLine = $"kill {_linuxSudoPid}"; + var shFilePath = await CreateLinuxShellFile(cmdLine, "kill_as_sudo.sh"); + Process proc = new() + { + StartInfo = new() + { + FileName = shFilePath, + UseShellExecute = false, + CreateNoWindow = true, + StandardInputEncoding = Encoding.UTF8, + RedirectStandardInput = true + } + }; + proc.Start(); - if (_config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) - { - try - { - var pwd = DesUtils.Decrypt(_config.TunModeItem.LinuxSudoPwd); - await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(pwd); - await Task.Delay(10); - await proc.StandardInput.WriteLineAsync(pwd); - } - catch (Exception) - { - // ignored - } - } + if (_config.TunModeItem.LinuxSudoPwd.IsNotEmpty()) + { + try + { + var pwd = DesUtils.Decrypt(_config.TunModeItem.LinuxSudoPwd); + await Task.Delay(10); + await proc.StandardInput.WriteLineAsync(pwd); + await Task.Delay(10); + await proc.StandardInput.WriteLineAsync(pwd); + } + catch (Exception) + { + // ignored + } + } - var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(10)); - await proc.WaitForExitAsync(timeout.Token); - await Task.Delay(3000); - } + var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + await proc.WaitForExitAsync(timeout.Token); + await Task.Delay(3000); + } - private async Task CreateLinuxShellFile(string cmdLine, string fileName) - { - //Shell scripts - var shFilePath = Utils.GetBinPath(AppHandler.Instance.IsAdministrator ? "root_" + fileName : fileName); - File.Delete(shFilePath); - var sb = new StringBuilder(); - sb.AppendLine("#!/bin/sh"); - if (AppHandler.Instance.IsAdministrator) - { - sb.AppendLine($"{cmdLine}"); - } - else if (_config.TunModeItem.LinuxSudoPwd.IsNullOrEmpty()) - { - sb.AppendLine($"pkexec {cmdLine}"); - } - else - { - sb.AppendLine($"sudo -S {cmdLine}"); - } + private async Task CreateLinuxShellFile(string cmdLine, string fileName) + { + //Shell scripts + var shFilePath = Utils.GetBinPath(AppHandler.Instance.IsAdministrator ? "root_" + fileName : fileName); + File.Delete(shFilePath); + var sb = new StringBuilder(); + sb.AppendLine("#!/bin/sh"); + if (AppHandler.Instance.IsAdministrator) + { + sb.AppendLine($"{cmdLine}"); + } + else if (_config.TunModeItem.LinuxSudoPwd.IsNullOrEmpty()) + { + sb.AppendLine($"pkexec {cmdLine}"); + } + else + { + sb.AppendLine($"sudo -S {cmdLine}"); + } - await File.WriteAllTextAsync(shFilePath, sb.ToString()); - await Utils.SetLinuxChmod(shFilePath); - Logging.SaveLog(shFilePath); + await File.WriteAllTextAsync(shFilePath, sb.ToString()); + await Utils.SetLinuxChmod(shFilePath); + Logging.SaveLog(shFilePath); - return shFilePath; - } + return shFilePath; + } - #endregion Linux - } -} \ No newline at end of file + #endregion Linux + } +} diff --git a/v2rayN/ServiceLib/Handler/CoreInfoHandler.cs b/v2rayN/ServiceLib/Handler/CoreInfoHandler.cs index 1fa073f8..f99a9de2 100644 --- a/v2rayN/ServiceLib/Handler/CoreInfoHandler.cs +++ b/v2rayN/ServiceLib/Handler/CoreInfoHandler.cs @@ -1,202 +1,202 @@ -namespace ServiceLib.Handler +namespace ServiceLib.Handler { - public sealed class CoreInfoHandler - { - private static readonly Lazy _instance = new(() => new()); - private List? _coreInfo; - public static CoreInfoHandler Instance => _instance.Value; + public sealed class CoreInfoHandler + { + private static readonly Lazy _instance = new(() => new()); + private List? _coreInfo; + public static CoreInfoHandler Instance => _instance.Value; - public CoreInfoHandler() - { - InitCoreInfo(); - } + public CoreInfoHandler() + { + InitCoreInfo(); + } - public CoreInfo? GetCoreInfo(ECoreType coreType) - { - if (_coreInfo == null) - { - InitCoreInfo(); - } - return _coreInfo?.FirstOrDefault(t => t.CoreType == coreType); - } + public CoreInfo? GetCoreInfo(ECoreType coreType) + { + if (_coreInfo == null) + { + InitCoreInfo(); + } + return _coreInfo?.FirstOrDefault(t => t.CoreType == coreType); + } - public List GetCoreInfo() - { - if (_coreInfo == null) - { - InitCoreInfo(); - } - return _coreInfo ?? []; - } + public List GetCoreInfo() + { + if (_coreInfo == null) + { + InitCoreInfo(); + } + return _coreInfo ?? []; + } - public string GetCoreExecFile(CoreInfo? coreInfo, out string msg) - { - var fileName = string.Empty; - msg = string.Empty; - foreach (var name in coreInfo?.CoreExes) - { - var vName = Utils.GetBinPath(Utils.GetExeName(name), coreInfo.CoreType.ToString()); - if (File.Exists(vName)) - { - fileName = vName; - break; - } - } - if (fileName.IsNullOrEmpty()) - { - msg = string.Format(ResUI.NotFoundCore, Utils.GetBinPath("", coreInfo.CoreType.ToString()), string.Join(", ", coreInfo.CoreExes.ToArray()), coreInfo.Url); - Logging.SaveLog(msg); - } - return fileName; - } + public string GetCoreExecFile(CoreInfo? coreInfo, out string msg) + { + var fileName = string.Empty; + msg = string.Empty; + foreach (var name in coreInfo?.CoreExes) + { + var vName = Utils.GetBinPath(Utils.GetExeName(name), coreInfo.CoreType.ToString()); + if (File.Exists(vName)) + { + fileName = vName; + break; + } + } + if (fileName.IsNullOrEmpty()) + { + msg = string.Format(ResUI.NotFoundCore, Utils.GetBinPath("", coreInfo.CoreType.ToString()), string.Join(", ", coreInfo.CoreExes.ToArray()), coreInfo.Url); + Logging.SaveLog(msg); + } + return fileName; + } - private void InitCoreInfo() - { - _coreInfo = - [ - new CoreInfo - { - CoreType = ECoreType.v2rayN, - Url = Global.NUrl, - ReleaseApiUrl = Global.NUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - DownloadUrlWin64 = Global.NUrl + "/download/{0}/v2rayN-windows-64.zip", - DownloadUrlWinArm64 = Global.NUrl + "/download/{0}/v2rayN-windows-arm64.zip", - DownloadUrlLinux64 = Global.NUrl + "/download/{0}/v2rayN-linux-64.zip", - DownloadUrlLinuxArm64 = Global.NUrl + "/download/{0}/v2rayN-linux-arm64.zip", - DownloadUrlOSX64 = Global.NUrl + "/download/{0}/v2rayN-macos-64.zip", - DownloadUrlOSXArm64 = Global.NUrl + "/download/{0}/v2rayN-macos-arm64.zip", - }, + private void InitCoreInfo() + { + _coreInfo = + [ + new CoreInfo + { + CoreType = ECoreType.v2rayN, + Url = Global.NUrl, + ReleaseApiUrl = Global.NUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + DownloadUrlWin64 = Global.NUrl + "/download/{0}/v2rayN-windows-64.zip", + DownloadUrlWinArm64 = Global.NUrl + "/download/{0}/v2rayN-windows-arm64.zip", + DownloadUrlLinux64 = Global.NUrl + "/download/{0}/v2rayN-linux-64.zip", + DownloadUrlLinuxArm64 = Global.NUrl + "/download/{0}/v2rayN-linux-arm64.zip", + DownloadUrlOSX64 = Global.NUrl + "/download/{0}/v2rayN-macos-64.zip", + DownloadUrlOSXArm64 = Global.NUrl + "/download/{0}/v2rayN-macos-arm64.zip", + }, - new CoreInfo - { - CoreType = ECoreType.v2fly, - CoreExes = ["wv2ray", "v2ray"], - Arguments = "", - Url = Global.V2flyCoreUrl, - ReleaseApiUrl = Global.V2flyCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - Match = "V2Ray", - VersionArg = "-version", - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.v2fly, + CoreExes = ["wv2ray", "v2ray"], + Arguments = "", + Url = Global.V2flyCoreUrl, + ReleaseApiUrl = Global.V2flyCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + Match = "V2Ray", + VersionArg = "-version", + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.v2fly_v5, - CoreExes = ["v2ray"], - Arguments = "run -c config.json -format jsonv5", - Url = Global.V2flyCoreUrl, - ReleaseApiUrl = Global.V2flyCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - Match = "V2Ray", - VersionArg = "version", - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.v2fly_v5, + CoreExes = ["v2ray"], + Arguments = "run -c config.json -format jsonv5", + Url = Global.V2flyCoreUrl, + ReleaseApiUrl = Global.V2flyCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + Match = "V2Ray", + VersionArg = "version", + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.Xray, - CoreExes = ["xray", "wxray"], - Arguments = "run -c {0}", - Url = Global.XrayCoreUrl, - ReleaseApiUrl = Global.XrayCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - DownloadUrlWin64 = Global.XrayCoreUrl + "/download/{0}/Xray-windows-64.zip", - DownloadUrlWinArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-windows-arm64-v8a.zip", - DownloadUrlLinux64 = Global.XrayCoreUrl + "/download/{0}/Xray-linux-64.zip", - DownloadUrlLinuxArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-linux-arm64-v8a.zip", - DownloadUrlOSX64 = Global.XrayCoreUrl + "/download/{0}/Xray-macos-64.zip", - DownloadUrlOSXArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-macos-arm64-v8a.zip", - Match = "Xray", - VersionArg = "-version", - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.Xray, + CoreExes = ["xray", "wxray"], + Arguments = "run -c {0}", + Url = Global.XrayCoreUrl, + ReleaseApiUrl = Global.XrayCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + DownloadUrlWin64 = Global.XrayCoreUrl + "/download/{0}/Xray-windows-64.zip", + DownloadUrlWinArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-windows-arm64-v8a.zip", + DownloadUrlLinux64 = Global.XrayCoreUrl + "/download/{0}/Xray-linux-64.zip", + DownloadUrlLinuxArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-linux-arm64-v8a.zip", + DownloadUrlOSX64 = Global.XrayCoreUrl + "/download/{0}/Xray-macos-64.zip", + DownloadUrlOSXArm64 = Global.XrayCoreUrl + "/download/{0}/Xray-macos-arm64-v8a.zip", + Match = "Xray", + VersionArg = "-version", + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.mihomo, - CoreExes = ["mihomo-windows-amd64-compatible", "mihomo-windows-amd64", "mihomo-linux-amd64", "mihomo", "clash"], - Arguments = "-f config.json" + PortableMode(), - Url = Global.MihomoCoreUrl, - ReleaseApiUrl = Global.MihomoCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - DownloadUrlWin64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-windows-amd64-compatible-{0}.zip", - DownloadUrlWinArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-windows-arm64-{0}.zip", - DownloadUrlLinux64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-linux-amd64-compatible-{0}.gz", - DownloadUrlLinuxArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-linux-arm64-{0}.gz", - DownloadUrlOSX64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-darwin-amd64-compatible-{0}.gz", - DownloadUrlOSXArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-darwin-arm64-{0}.gz", - Match = "Mihomo", - VersionArg = "-v", - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.mihomo, + CoreExes = ["mihomo-windows-amd64-compatible", "mihomo-windows-amd64", "mihomo-linux-amd64", "mihomo", "clash"], + Arguments = "-f config.json" + PortableMode(), + Url = Global.MihomoCoreUrl, + ReleaseApiUrl = Global.MihomoCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + DownloadUrlWin64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-windows-amd64-compatible-{0}.zip", + DownloadUrlWinArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-windows-arm64-{0}.zip", + DownloadUrlLinux64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-linux-amd64-compatible-{0}.gz", + DownloadUrlLinuxArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-linux-arm64-{0}.gz", + DownloadUrlOSX64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-darwin-amd64-compatible-{0}.gz", + DownloadUrlOSXArm64 = Global.MihomoCoreUrl + "/download/{0}/mihomo-darwin-arm64-{0}.gz", + Match = "Mihomo", + VersionArg = "-v", + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.hysteria, - CoreExes = ["hysteria-windows-amd64", "hysteria"], - Arguments = "", - Url = Global.HysteriaCoreUrl, - ReleaseApiUrl = Global.HysteriaCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.hysteria, + CoreExes = ["hysteria-windows-amd64", "hysteria"], + Arguments = "", + Url = Global.HysteriaCoreUrl, + ReleaseApiUrl = Global.HysteriaCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.naiveproxy, - CoreExes = ["naiveproxy", "naive"], - Arguments = "config.json", - Url = Global.NaiveproxyCoreUrl, - RedirectInfo = false, - }, + new CoreInfo + { + CoreType = ECoreType.naiveproxy, + CoreExes = ["naiveproxy", "naive"], + Arguments = "config.json", + Url = Global.NaiveproxyCoreUrl, + RedirectInfo = false, + }, - new CoreInfo - { - CoreType = ECoreType.tuic, - CoreExes = ["tuic-client", "tuic"], - Arguments = "-c config.json", - Url = Global.TuicCoreUrl, - RedirectInfo = true, - }, + new CoreInfo + { + CoreType = ECoreType.tuic, + CoreExes = ["tuic-client", "tuic"], + Arguments = "-c config.json", + Url = Global.TuicCoreUrl, + RedirectInfo = true, + }, - new CoreInfo - { - CoreType = ECoreType.sing_box, - CoreExes = ["sing-box-client", "sing-box"], - Arguments = "run -c {0} --disable-color", - Url = Global.SingboxCoreUrl, - RedirectInfo = true, - ReleaseApiUrl = Global.SingboxCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - DownloadUrlWin64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-windows-amd64.zip", - DownloadUrlWinArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-windows-arm64.zip", - DownloadUrlLinux64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-linux-amd64.tar.gz", - DownloadUrlLinuxArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-linux-arm64.tar.gz", - DownloadUrlOSX64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-darwin-amd64.tar.gz", - DownloadUrlOSXArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-darwin-arm64.tar.gz", - Match = "sing-box", - VersionArg = "version", - }, + new CoreInfo + { + CoreType = ECoreType.sing_box, + CoreExes = ["sing-box-client", "sing-box"], + Arguments = "run -c {0} --disable-color", + Url = Global.SingboxCoreUrl, + RedirectInfo = true, + ReleaseApiUrl = Global.SingboxCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + DownloadUrlWin64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-windows-amd64.zip", + DownloadUrlWinArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-windows-arm64.zip", + DownloadUrlLinux64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-linux-amd64.tar.gz", + DownloadUrlLinuxArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-linux-arm64.tar.gz", + DownloadUrlOSX64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-darwin-amd64.tar.gz", + DownloadUrlOSXArm64 = Global.SingboxCoreUrl + "/download/{0}/sing-box-{1}-darwin-arm64.tar.gz", + Match = "sing-box", + VersionArg = "version", + }, - new CoreInfo - { - CoreType = ECoreType.juicity, - CoreExes = ["juicity-client", "juicity"], - Arguments = "run -c config.json", - Url = Global.JuicityCoreUrl - }, + new CoreInfo + { + CoreType = ECoreType.juicity, + CoreExes = ["juicity-client", "juicity"], + Arguments = "run -c config.json", + Url = Global.JuicityCoreUrl + }, - new CoreInfo - { - CoreType = ECoreType.hysteria2, - CoreExes = ["hysteria-windows-amd64", "hysteria-linux-amd64", "hysteria"], - Arguments = "", - Url = Global.HysteriaCoreUrl, - ReleaseApiUrl = Global.HysteriaCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), - RedirectInfo = true, - } + new CoreInfo + { + CoreType = ECoreType.hysteria2, + CoreExes = ["hysteria-windows-amd64", "hysteria-linux-amd64", "hysteria"], + Arguments = "", + Url = Global.HysteriaCoreUrl, + ReleaseApiUrl = Global.HysteriaCoreUrl.Replace(Global.GithubUrl, Global.GithubApiUrl), + RedirectInfo = true, + } - ]; - } + ]; + } - private string PortableMode() - { - return $" -d {Utils.GetBinPath("").AppendQuotes()}"; - } - } -} \ No newline at end of file + private string PortableMode() + { + return $" -d {Utils.GetBinPath("").AppendQuotes()}"; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs index 7afa005a..0baf8e62 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/BaseFmt.cs @@ -1,239 +1,240 @@ -using System.Collections.Specialized; +using System.Collections.Specialized; namespace ServiceLib.Handler.Fmt { - public class BaseFmt - { - protected static string GetIpv6(string address) - { - if (Utils.IsIpv6(address)) - { - // 检查地址是否已经被方括号包围,如果没有,则添加方括号 - return address.StartsWith('[') && address.EndsWith(']') ? address : $"[{address}]"; - } - return address; // 如果不是IPv6地址,直接返回原地址 - } + public class BaseFmt + { + protected static string GetIpv6(string address) + { + if (Utils.IsIpv6(address)) + { + // 检查地址是否已经被方括号包围,如果没有,则添加方括号 + return address.StartsWith('[') && address.EndsWith(']') ? address : $"[{address}]"; + } + return address; // 如果不是IPv6地址,直接返回原地址 + } - protected static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary dicQuery) - { - if (Utils.IsNotEmpty(item.Flow)) - { - dicQuery.Add("flow", item.Flow); - } + protected static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary dicQuery) + { + if (Utils.IsNotEmpty(item.Flow)) + { + dicQuery.Add("flow", item.Flow); + } - if (Utils.IsNotEmpty(item.StreamSecurity)) - { - dicQuery.Add("security", item.StreamSecurity); - } - else - { - if (securityDef != null) - { - dicQuery.Add("security", securityDef); - } - } - if (Utils.IsNotEmpty(item.Sni)) - { - dicQuery.Add("sni", item.Sni); - } - if (Utils.IsNotEmpty(item.Alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); - } - if (Utils.IsNotEmpty(item.Fingerprint)) - { - dicQuery.Add("fp", Utils.UrlEncode(item.Fingerprint)); - } - if (Utils.IsNotEmpty(item.PublicKey)) - { - dicQuery.Add("pbk", Utils.UrlEncode(item.PublicKey)); - } - if (Utils.IsNotEmpty(item.ShortId)) - { - dicQuery.Add("sid", Utils.UrlEncode(item.ShortId)); - } - if (Utils.IsNotEmpty(item.SpiderX)) - { - dicQuery.Add("spx", Utils.UrlEncode(item.SpiderX)); - } - if (item.AllowInsecure.Equals("true")) - { - dicQuery.Add("allowInsecure", "1"); - } + if (Utils.IsNotEmpty(item.StreamSecurity)) + { + dicQuery.Add("security", item.StreamSecurity); + } + else + { + if (securityDef != null) + { + dicQuery.Add("security", securityDef); + } + } + if (Utils.IsNotEmpty(item.Sni)) + { + dicQuery.Add("sni", item.Sni); + } + if (Utils.IsNotEmpty(item.Alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); + } + if (Utils.IsNotEmpty(item.Fingerprint)) + { + dicQuery.Add("fp", Utils.UrlEncode(item.Fingerprint)); + } + if (Utils.IsNotEmpty(item.PublicKey)) + { + dicQuery.Add("pbk", Utils.UrlEncode(item.PublicKey)); + } + if (Utils.IsNotEmpty(item.ShortId)) + { + dicQuery.Add("sid", Utils.UrlEncode(item.ShortId)); + } + if (Utils.IsNotEmpty(item.SpiderX)) + { + dicQuery.Add("spx", Utils.UrlEncode(item.SpiderX)); + } + if (item.AllowInsecure.Equals("true")) + { + dicQuery.Add("allowInsecure", "1"); + } - dicQuery.Add("type", Utils.IsNotEmpty(item.Network) ? item.Network : nameof(ETransport.tcp)); + dicQuery.Add("type", Utils.IsNotEmpty(item.Network) ? item.Network : nameof(ETransport.tcp)); - switch (item.Network) - { - case nameof(ETransport.tcp): - dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); - if (Utils.IsNotEmpty(item.RequestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); - } - break; + switch (item.Network) + { + case nameof(ETransport.tcp): + dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); + if (Utils.IsNotEmpty(item.RequestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); + } + break; - case nameof(ETransport.kcp): - dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("seed", Utils.UrlEncode(item.Path)); - } - break; + case nameof(ETransport.kcp): + dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("seed", Utils.UrlEncode(item.Path)); + } + break; - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - if (Utils.IsNotEmpty(item.RequestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); - } - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.Path)); - } - break; + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + if (Utils.IsNotEmpty(item.RequestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); + } + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.Path)); + } + break; - case nameof(ETransport.xhttp): - if (Utils.IsNotEmpty(item.RequestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); - } - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.Path)); - } - if (Utils.IsNotEmpty(item.HeaderType) && Global.XhttpMode.Contains(item.HeaderType)) - { - dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType)); - } - if (Utils.IsNotEmpty(item.Extra)) - { - dicQuery.Add("extra", Utils.UrlEncode(item.Extra)); - } - break; + case nameof(ETransport.xhttp): + if (Utils.IsNotEmpty(item.RequestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); + } + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.Path)); + } + if (Utils.IsNotEmpty(item.HeaderType) && Global.XhttpMode.Contains(item.HeaderType)) + { + dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType)); + } + if (Utils.IsNotEmpty(item.Extra)) + { + dicQuery.Add("extra", Utils.UrlEncode(item.Extra)); + } + break; - case nameof(ETransport.http): - case nameof(ETransport.h2): - dicQuery["type"] = nameof(ETransport.http); - if (Utils.IsNotEmpty(item.RequestHost)) - { - dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); - } - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("path", Utils.UrlEncode(item.Path)); - } - break; + case nameof(ETransport.http): + case nameof(ETransport.h2): + dicQuery["type"] = nameof(ETransport.http); + if (Utils.IsNotEmpty(item.RequestHost)) + { + dicQuery.Add("host", Utils.UrlEncode(item.RequestHost)); + } + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("path", Utils.UrlEncode(item.Path)); + } + break; - case nameof(ETransport.quic): - dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); - dicQuery.Add("quicSecurity", Utils.UrlEncode(item.RequestHost)); - dicQuery.Add("key", Utils.UrlEncode(item.Path)); - break; + case nameof(ETransport.quic): + dicQuery.Add("headerType", Utils.IsNotEmpty(item.HeaderType) ? item.HeaderType : Global.None); + dicQuery.Add("quicSecurity", Utils.UrlEncode(item.RequestHost)); + dicQuery.Add("key", Utils.UrlEncode(item.Path)); + break; - case nameof(ETransport.grpc): - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("authority", Utils.UrlEncode(item.RequestHost)); - dicQuery.Add("serviceName", Utils.UrlEncode(item.Path)); - if (item.HeaderType is Global.GrpcGunMode or Global.GrpcMultiMode) - { - dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType)); - } - } - break; - } - return 0; - } + case nameof(ETransport.grpc): + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("authority", Utils.UrlEncode(item.RequestHost)); + dicQuery.Add("serviceName", Utils.UrlEncode(item.Path)); + if (item.HeaderType is Global.GrpcGunMode or Global.GrpcMultiMode) + { + dicQuery.Add("mode", Utils.UrlEncode(item.HeaderType)); + } + } + break; + } + return 0; + } - protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item) - { - item.Flow = query["flow"] ?? ""; - item.StreamSecurity = query["security"] ?? ""; - item.Sni = query["sni"] ?? ""; - item.Alpn = Utils.UrlDecode(query["alpn"] ?? ""); - item.Fingerprint = Utils.UrlDecode(query["fp"] ?? ""); - item.PublicKey = Utils.UrlDecode(query["pbk"] ?? ""); - item.ShortId = Utils.UrlDecode(query["sid"] ?? ""); - item.SpiderX = Utils.UrlDecode(query["spx"] ?? ""); - item.AllowInsecure = (query["allowInsecure"] ?? "") == "1" ? "true" : ""; + protected static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item) + { + item.Flow = query["flow"] ?? ""; + item.StreamSecurity = query["security"] ?? ""; + item.Sni = query["sni"] ?? ""; + item.Alpn = Utils.UrlDecode(query["alpn"] ?? ""); + item.Fingerprint = Utils.UrlDecode(query["fp"] ?? ""); + item.PublicKey = Utils.UrlDecode(query["pbk"] ?? ""); + item.ShortId = Utils.UrlDecode(query["sid"] ?? ""); + item.SpiderX = Utils.UrlDecode(query["spx"] ?? ""); + item.AllowInsecure = (query["allowInsecure"] ?? "") == "1" ? "true" : ""; - item.Network = query["type"] ?? nameof(ETransport.tcp); - switch (item.Network) - { - case nameof(ETransport.tcp): - item.HeaderType = query["headerType"] ?? Global.None; - item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); + item.Network = query["type"] ?? nameof(ETransport.tcp); + switch (item.Network) + { + case nameof(ETransport.tcp): + item.HeaderType = query["headerType"] ?? Global.None; + item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); - break; + break; - case nameof(ETransport.kcp): - item.HeaderType = query["headerType"] ?? Global.None; - item.Path = Utils.UrlDecode(query["seed"] ?? ""); - break; + case nameof(ETransport.kcp): + item.HeaderType = query["headerType"] ?? Global.None; + item.Path = Utils.UrlDecode(query["seed"] ?? ""); + break; - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); - item.Path = Utils.UrlDecode(query["path"] ?? "/"); - break; + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); + item.Path = Utils.UrlDecode(query["path"] ?? "/"); + break; - case nameof(ETransport.xhttp): - item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); - item.Path = Utils.UrlDecode(query["path"] ?? "/"); - item.HeaderType = Utils.UrlDecode(query["mode"] ?? ""); - item.Extra = Utils.UrlDecode(query["extra"] ?? ""); - break; + case nameof(ETransport.xhttp): + item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); + item.Path = Utils.UrlDecode(query["path"] ?? "/"); + item.HeaderType = Utils.UrlDecode(query["mode"] ?? ""); + item.Extra = Utils.UrlDecode(query["extra"] ?? ""); + break; - case nameof(ETransport.http): - case nameof(ETransport.h2): - item.Network = nameof(ETransport.h2); - item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); - item.Path = Utils.UrlDecode(query["path"] ?? "/"); - break; + case nameof(ETransport.http): + case nameof(ETransport.h2): + item.Network = nameof(ETransport.h2); + item.RequestHost = Utils.UrlDecode(query["host"] ?? ""); + item.Path = Utils.UrlDecode(query["path"] ?? "/"); + break; - case nameof(ETransport.quic): - item.HeaderType = query["headerType"] ?? Global.None; - item.RequestHost = query["quicSecurity"] ?? Global.None; - item.Path = Utils.UrlDecode(query["key"] ?? ""); - break; + case nameof(ETransport.quic): + item.HeaderType = query["headerType"] ?? Global.None; + item.RequestHost = query["quicSecurity"] ?? Global.None; + item.Path = Utils.UrlDecode(query["key"] ?? ""); + break; - case nameof(ETransport.grpc): - item.RequestHost = Utils.UrlDecode(query["authority"] ?? ""); - item.Path = Utils.UrlDecode(query["serviceName"] ?? ""); - item.HeaderType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode); - break; + case nameof(ETransport.grpc): + item.RequestHost = Utils.UrlDecode(query["authority"] ?? ""); + item.Path = Utils.UrlDecode(query["serviceName"] ?? ""); + item.HeaderType = Utils.UrlDecode(query["mode"] ?? Global.GrpcGunMode); + break; - default: - break; - } - return 0; - } + default: + break; + } + return 0; + } - protected static bool Contains(string str, params string[] s) - { - foreach (var item in s) - { - if (str.Contains(item, StringComparison.OrdinalIgnoreCase)) return true; - } - return false; - } + protected static bool Contains(string str, params string[] s) + { + foreach (var item in s) + { + if (str.Contains(item, StringComparison.OrdinalIgnoreCase)) + return true; + } + return false; + } - protected static string WriteAllText(string strData, string ext = "json") - { - var fileName = Utils.GetTempPath($"{Utils.GetGuid(false)}.{ext}"); - File.WriteAllText(fileName, strData); - return fileName; - } + protected static string WriteAllText(string strData, string ext = "json") + { + var fileName = Utils.GetTempPath($"{Utils.GetGuid(false)}.{ext}"); + File.WriteAllText(fileName, strData); + return fileName; + } - protected static string ToUri(EConfigType eConfigType, string address, object port, string userInfo, Dictionary? dicQuery, string? remark) - { - var query = dicQuery != null - ? ("?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray())) - : string.Empty; + protected static string ToUri(EConfigType eConfigType, string address, object port, string userInfo, Dictionary? dicQuery, string? remark) + { + var query = dicQuery != null + ? ("?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray())) + : string.Empty; - var url = $"{Utils.UrlEncode(userInfo)}@{GetIpv6(address)}:{port}"; - return $"{Global.ProtocolShares[eConfigType]}{url}{query}{remark}"; - } - } -} \ No newline at end of file + var url = $"{Utils.UrlEncode(userInfo)}@{GetIpv6(address)}:{port}"; + return $"{Global.ProtocolShares[eConfigType]}{url}{query}{remark}"; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/ClashFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/ClashFmt.cs index ed6faf37..ad1a57ba 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/ClashFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/ClashFmt.cs @@ -1,23 +1,23 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class ClashFmt : BaseFmt - { - public static ProfileItem? ResolveFull(string strData, string? subRemarks) - { - if (Contains(strData, "port", "socks-port", "proxies")) - { - var fileName = WriteAllText(strData, "yaml"); + public class ClashFmt : BaseFmt + { + public static ProfileItem? ResolveFull(string strData, string? subRemarks) + { + if (Contains(strData, "port", "socks-port", "proxies")) + { + var fileName = WriteAllText(strData, "yaml"); - var profileItem = new ProfileItem - { - CoreType = ECoreType.mihomo, - Address = fileName, - Remarks = subRemarks ?? "clash_custom" - }; - return profileItem; - } + var profileItem = new ProfileItem + { + CoreType = ECoreType.mihomo, + Address = fileName, + Remarks = subRemarks ?? "clash_custom" + }; + return profileItem; + } - return null; - } - } -} \ No newline at end of file + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/FmtHandler.cs b/v2rayN/ServiceLib/Handler/Fmt/FmtHandler.cs index 1830c8af..9af1f9aa 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/FmtHandler.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/FmtHandler.cs @@ -1,92 +1,92 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class FmtHandler - { - private static readonly string _tag = "FmtHandler"; + public class FmtHandler + { + private static readonly string _tag = "FmtHandler"; - public static string? GetShareUri(ProfileItem item) - { - try - { - var url = item.ConfigType switch - { - EConfigType.VMess => VmessFmt.ToUri(item), - EConfigType.Shadowsocks => ShadowsocksFmt.ToUri(item), - EConfigType.SOCKS => SocksFmt.ToUri(item), - EConfigType.Trojan => TrojanFmt.ToUri(item), - EConfigType.VLESS => VLESSFmt.ToUri(item), - EConfigType.Hysteria2 => Hysteria2Fmt.ToUri(item), - EConfigType.TUIC => TuicFmt.ToUri(item), - EConfigType.WireGuard => WireguardFmt.ToUri(item), - _ => null, - }; + public static string? GetShareUri(ProfileItem item) + { + try + { + var url = item.ConfigType switch + { + EConfigType.VMess => VmessFmt.ToUri(item), + EConfigType.Shadowsocks => ShadowsocksFmt.ToUri(item), + EConfigType.SOCKS => SocksFmt.ToUri(item), + EConfigType.Trojan => TrojanFmt.ToUri(item), + EConfigType.VLESS => VLESSFmt.ToUri(item), + EConfigType.Hysteria2 => Hysteria2Fmt.ToUri(item), + EConfigType.TUIC => TuicFmt.ToUri(item), + EConfigType.WireGuard => WireguardFmt.ToUri(item), + _ => null, + }; - return url; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return ""; - } - } + return url; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return ""; + } + } - public static ProfileItem? ResolveConfig(string config, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public static ProfileItem? ResolveConfig(string config, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - try - { - string str = config.TrimEx(); - if (Utils.IsNullOrEmpty(str)) - { - msg = ResUI.FailedReadConfiguration; - return null; - } + try + { + string str = config.TrimEx(); + if (Utils.IsNullOrEmpty(str)) + { + msg = ResUI.FailedReadConfiguration; + return null; + } - if (str.StartsWith(Global.ProtocolShares[EConfigType.VMess])) - { - return VmessFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.Shadowsocks])) - { - return ShadowsocksFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.SOCKS])) - { - return SocksFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.Trojan])) - { - return TrojanFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.VLESS])) - { - return VLESSFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.Hysteria2]) || str.StartsWith(Global.Hysteria2ProtocolShare)) - { - return Hysteria2Fmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.TUIC])) - { - return TuicFmt.Resolve(str, out msg); - } - else if (str.StartsWith(Global.ProtocolShares[EConfigType.WireGuard])) - { - return WireguardFmt.Resolve(str, out msg); - } - else - { - msg = ResUI.NonvmessOrssProtocol; - return null; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - msg = ResUI.Incorrectconfiguration; - return null; - } - } - } -} \ No newline at end of file + if (str.StartsWith(Global.ProtocolShares[EConfigType.VMess])) + { + return VmessFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Shadowsocks])) + { + return ShadowsocksFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.SOCKS])) + { + return SocksFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Trojan])) + { + return TrojanFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.VLESS])) + { + return VLESSFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.Hysteria2]) || str.StartsWith(Global.Hysteria2ProtocolShare)) + { + return Hysteria2Fmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.TUIC])) + { + return TuicFmt.Resolve(str, out msg); + } + else if (str.StartsWith(Global.ProtocolShares[EConfigType.WireGuard])) + { + return WireguardFmt.Resolve(str, out msg); + } + else + { + msg = ResUI.NonvmessOrssProtocol; + return null; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + msg = ResUI.Incorrectconfiguration; + return null; + } + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs b/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs index 7f51120c..d0a5917f 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/Hysteria2Fmt.cs @@ -1,94 +1,96 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class Hysteria2Fmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem item = new() - { - ConfigType = EConfigType.Hysteria2 - }; + public class Hysteria2Fmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem item = new() + { + ConfigType = EConfigType.Hysteria2 + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.Id = Utils.UrlDecode(url.UserInfo); + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.Id = Utils.UrlDecode(url.UserInfo); - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); - item.Path = Utils.UrlDecode(query["obfs-password"] ?? ""); - item.AllowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + item.Path = Utils.UrlDecode(query["obfs-password"] ?? ""); + item.AllowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - var dicQuery = new Dictionary(); - if (Utils.IsNotEmpty(item.Sni)) - { - dicQuery.Add("sni", item.Sni); - } - if (Utils.IsNotEmpty(item.Alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); - } - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("obfs", "salamander"); - dicQuery.Add("obfs-password", Utils.UrlEncode(item.Path)); - } - dicQuery.Add("insecure", item.AllowInsecure.ToLower() == "true" ? "1" : "0"); + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + var dicQuery = new Dictionary(); + if (Utils.IsNotEmpty(item.Sni)) + { + dicQuery.Add("sni", item.Sni); + } + if (Utils.IsNotEmpty(item.Alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); + } + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("obfs", "salamander"); + dicQuery.Add("obfs-password", Utils.UrlEncode(item.Path)); + } + dicQuery.Add("insecure", item.AllowInsecure.ToLower() == "true" ? "1" : "0"); - return ToUri(EConfigType.Hysteria2, item.Address, item.Port, item.Id, dicQuery, remark); - } + return ToUri(EConfigType.Hysteria2, item.Address, item.Port, item.Id, dicQuery, remark); + } - public static ProfileItem? ResolveFull(string strData, string? subRemarks) - { - if (Contains(strData, "server", "up", "down", "listen", "", "")) - { - var fileName = WriteAllText(strData); + public static ProfileItem? ResolveFull(string strData, string? subRemarks) + { + if (Contains(strData, "server", "up", "down", "listen", "", "")) + { + var fileName = WriteAllText(strData); - var profileItem = new ProfileItem - { - CoreType = ECoreType.hysteria, - Address = fileName, - Remarks = subRemarks ?? "hysteria_custom" - }; - return profileItem; - } + var profileItem = new ProfileItem + { + CoreType = ECoreType.hysteria, + Address = fileName, + Remarks = subRemarks ?? "hysteria_custom" + }; + return profileItem; + } - return null; - } + return null; + } - public static ProfileItem? ResolveFull2(string strData, string? subRemarks) - { - if (Contains(strData, "server", "auth", "up", "down", "listen")) - { - var fileName = WriteAllText(strData); + public static ProfileItem? ResolveFull2(string strData, string? subRemarks) + { + if (Contains(strData, "server", "auth", "up", "down", "listen")) + { + var fileName = WriteAllText(strData); - var profileItem = new ProfileItem - { - CoreType = ECoreType.hysteria2, - Address = fileName, - Remarks = subRemarks ?? "hysteria2_custom" - }; - return profileItem; - } + var profileItem = new ProfileItem + { + CoreType = ECoreType.hysteria2, + Address = fileName, + Remarks = subRemarks ?? "hysteria2_custom" + }; + return profileItem; + } - return null; - } - } -} \ No newline at end of file + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/NaiveproxyFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/NaiveproxyFmt.cs index 3846c3af..1ccdc363 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/NaiveproxyFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/NaiveproxyFmt.cs @@ -1,23 +1,23 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class NaiveproxyFmt : BaseFmt - { - public static ProfileItem? ResolveFull(string strData, string? subRemarks) - { - if (Contains(strData, "listen", "proxy", "", "")) - { - var fileName = WriteAllText(strData); + public class NaiveproxyFmt : BaseFmt + { + public static ProfileItem? ResolveFull(string strData, string? subRemarks) + { + if (Contains(strData, "listen", "proxy", "", "")) + { + var fileName = WriteAllText(strData); - var profileItem = new ProfileItem - { - CoreType = ECoreType.naiveproxy, - Address = fileName, - Remarks = subRemarks ?? "naiveproxy_custom" - }; - return profileItem; - } + var profileItem = new ProfileItem + { + CoreType = ECoreType.naiveproxy, + Address = fileName, + Remarks = subRemarks ?? "naiveproxy_custom" + }; + return profileItem; + } - return null; - } - } -} \ No newline at end of file + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs index f9028c44..a5ef11c9 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/ShadowsocksFmt.cs @@ -1,172 +1,174 @@ -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; namespace ServiceLib.Handler.Fmt { - public class ShadowsocksFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem? item; + public class ShadowsocksFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem? item; - item = ResolveSSLegacy(str) ?? ResolveSip002(str); - if (item == null) - { - return null; - } - if (item.Address.Length == 0 || item.Port == 0 || item.Security.Length == 0 || item.Id.Length == 0) - { - return null; - } + item = ResolveSSLegacy(str) ?? ResolveSip002(str); + if (item == null) + { + return null; + } + if (item.Address.Length == 0 || item.Port == 0 || item.Security.Length == 0 || item.Id.Length == 0) + { + return null; + } - item.ConfigType = EConfigType.Shadowsocks; + item.ConfigType = EConfigType.Shadowsocks; - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - //url = string.Format("{0}:{1}@{2}:{3}", - // item.security, - // item.id, - // item.address, - // item.port); - //url = Utile.Base64Encode(url); - //new Sip002 - var pw = Utils.Base64Encode($"{item.Security}:{item.Id}"); - return ToUri(EConfigType.Shadowsocks, item.Address, item.Port, pw, null, remark); - } + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + //url = string.Format("{0}:{1}@{2}:{3}", + // item.security, + // item.id, + // item.address, + // item.port); + //url = Utile.Base64Encode(url); + //new Sip002 + var pw = Utils.Base64Encode($"{item.Security}:{item.Id}"); + return ToUri(EConfigType.Shadowsocks, item.Address, item.Port, pw, null, remark); + } - private static readonly Regex UrlFinder = new(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static readonly Regex DetailsParser = new(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex UrlFinder = new(@"ss://(?[A-Za-z0-9+-/=_]+)(?:#(?\S+))?", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private static readonly Regex DetailsParser = new(@"^((?.+?):(?.*)@(?.+?):(?\d+?))$", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static ProfileItem? ResolveSSLegacy(string result) - { - var match = UrlFinder.Match(result); - if (!match.Success) - return null; + private static ProfileItem? ResolveSSLegacy(string result) + { + var match = UrlFinder.Match(result); + if (!match.Success) + return null; - ProfileItem item = new(); - var base64 = match.Groups["base64"].Value.TrimEnd('/'); - var tag = match.Groups["tag"].Value; - if (Utils.IsNotEmpty(tag)) - { - item.Remarks = Utils.UrlDecode(tag); - } - Match details; - try - { - details = DetailsParser.Match(Utils.Base64Decode(base64)); - } - catch (FormatException) - { - return null; - } - if (!details.Success) - return null; - item.Security = details.Groups["method"].Value; - item.Id = details.Groups["password"].Value; - item.Address = details.Groups["hostname"].Value; - item.Port = Utils.ToInt(details.Groups["port"].Value); - return item; - } + ProfileItem item = new(); + var base64 = match.Groups["base64"].Value.TrimEnd('/'); + var tag = match.Groups["tag"].Value; + if (Utils.IsNotEmpty(tag)) + { + item.Remarks = Utils.UrlDecode(tag); + } + Match details; + try + { + details = DetailsParser.Match(Utils.Base64Decode(base64)); + } + catch (FormatException) + { + return null; + } + if (!details.Success) + return null; + item.Security = details.Groups["method"].Value; + item.Id = details.Groups["password"].Value; + item.Address = details.Groups["hostname"].Value; + item.Port = Utils.ToInt(details.Groups["port"].Value); + return item; + } - private static ProfileItem? ResolveSip002(string result) - { - var parsedUrl = Utils.TryUri(result); - if (parsedUrl == null) return null; + private static ProfileItem? ResolveSip002(string result) + { + var parsedUrl = Utils.TryUri(result); + if (parsedUrl == null) + return null; - ProfileItem item = new() - { - Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), - Address = parsedUrl.IdnHost, - Port = parsedUrl.Port, - }; - var rawUserInfo = Utils.UrlDecode(parsedUrl.UserInfo); - //2022-blake3 - if (rawUserInfo.Contains(':')) - { - string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length != 2) - { - return null; - } - item.Security = userInfoParts.First(); - item.Id = Utils.UrlDecode(userInfoParts.Last()); - } - else - { - // parse base64 UserInfo - string userInfo = Utils.Base64Decode(rawUserInfo); - string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length != 2) - { - return null; - } - item.Security = userInfoParts.First(); - item.Id = userInfoParts.Last(); - } + ProfileItem item = new() + { + Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + Address = parsedUrl.IdnHost, + Port = parsedUrl.Port, + }; + var rawUserInfo = Utils.UrlDecode(parsedUrl.UserInfo); + //2022-blake3 + if (rawUserInfo.Contains(':')) + { + string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + item.Security = userInfoParts.First(); + item.Id = Utils.UrlDecode(userInfoParts.Last()); + } + else + { + // parse base64 UserInfo + string userInfo = Utils.Base64Decode(rawUserInfo); + string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length != 2) + { + return null; + } + item.Security = userInfoParts.First(); + item.Id = userInfoParts.Last(); + } - var queryParameters = Utils.ParseQueryString(parsedUrl.Query); - if (queryParameters["plugin"] != null) - { - //obfs-host exists - var obfsHost = queryParameters["plugin"]?.Split(';').FirstOrDefault(t => t.Contains("obfs-host")); - if (queryParameters["plugin"].Contains("obfs=http") && Utils.IsNotEmpty(obfsHost)) - { - obfsHost = obfsHost?.Replace("obfs-host=", ""); - item.Network = Global.DefaultNetwork; - item.HeaderType = Global.TcpHeaderHttp; - item.RequestHost = obfsHost ?? ""; - } - else - { - return null; - } - } + var queryParameters = Utils.ParseQueryString(parsedUrl.Query); + if (queryParameters["plugin"] != null) + { + //obfs-host exists + var obfsHost = queryParameters["plugin"]?.Split(';').FirstOrDefault(t => t.Contains("obfs-host")); + if (queryParameters["plugin"].Contains("obfs=http") && Utils.IsNotEmpty(obfsHost)) + { + obfsHost = obfsHost?.Replace("obfs-host=", ""); + item.Network = Global.DefaultNetwork; + item.HeaderType = Global.TcpHeaderHttp; + item.RequestHost = obfsHost ?? ""; + } + else + { + return null; + } + } - return item; - } + return item; + } - public static List? ResolveSip008(string result) - { - //SsSIP008 - var lstSsServer = JsonUtils.Deserialize>(result); - if (lstSsServer?.Count <= 0) - { - var ssSIP008 = JsonUtils.Deserialize(result); - if (ssSIP008?.servers?.Count > 0) - { - lstSsServer = ssSIP008.servers; - } - } + public static List? ResolveSip008(string result) + { + //SsSIP008 + var lstSsServer = JsonUtils.Deserialize>(result); + if (lstSsServer?.Count <= 0) + { + var ssSIP008 = JsonUtils.Deserialize(result); + if (ssSIP008?.servers?.Count > 0) + { + lstSsServer = ssSIP008.servers; + } + } - if (lstSsServer?.Count > 0) - { - List lst = []; - foreach (var it in lstSsServer) - { - var ssItem = new ProfileItem() - { - Remarks = it.remarks, - Security = it.method, - Id = it.password, - Address = it.server, - Port = Utils.ToInt(it.server_port) - }; - lst.Add(ssItem); - } - return lst; - } - return null; - } - } -} \ No newline at end of file + if (lstSsServer?.Count > 0) + { + List lst = []; + foreach (var it in lstSsServer) + { + var ssItem = new ProfileItem() + { + Remarks = it.remarks, + Security = it.method, + Id = it.password, + Address = it.server, + Port = Utils.ToInt(it.server_port) + }; + lst.Add(ssItem); + } + return lst; + } + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/SingboxFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/SingboxFmt.cs index e3540872..ed0ab0d9 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/SingboxFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/SingboxFmt.cs @@ -1,55 +1,55 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class SingboxFmt : BaseFmt - { - public static List? ResolveFullArray(string strData, string? subRemarks) - { - var configObjects = JsonUtils.Deserialize(strData); - if (configObjects != null && configObjects.Length > 0) - { - List lstResult = []; - foreach (var configObject in configObjects) - { - var objectString = JsonUtils.Serialize(configObject); - var singboxCon = JsonUtils.Deserialize(objectString); - if (singboxCon?.inbounds?.Count > 0 - && singboxCon.outbounds?.Count > 0 - && singboxCon.route != null) - { - var fileName = WriteAllText(objectString); + public class SingboxFmt : BaseFmt + { + public static List? ResolveFullArray(string strData, string? subRemarks) + { + var configObjects = JsonUtils.Deserialize(strData); + if (configObjects != null && configObjects.Length > 0) + { + List lstResult = []; + foreach (var configObject in configObjects) + { + var objectString = JsonUtils.Serialize(configObject); + var singboxCon = JsonUtils.Deserialize(objectString); + if (singboxCon?.inbounds?.Count > 0 + && singboxCon.outbounds?.Count > 0 + && singboxCon.route != null) + { + var fileName = WriteAllText(objectString); - var profileIt = new ProfileItem - { - CoreType = ECoreType.sing_box, - Address = fileName, - Remarks = subRemarks ?? "singbox_custom", - }; - lstResult.Add(profileIt); - } - } - return lstResult; - } - return null; - } + var profileIt = new ProfileItem + { + CoreType = ECoreType.sing_box, + Address = fileName, + Remarks = subRemarks ?? "singbox_custom", + }; + lstResult.Add(profileIt); + } + } + return lstResult; + } + return null; + } - public static ProfileItem? ResolveFull(string strData, string? subRemarks) - { - var singboxConfig = JsonUtils.Deserialize(strData); - if (singboxConfig?.inbounds?.Count > 0 - && singboxConfig.outbounds?.Count > 0 - && singboxConfig.route != null) - { - var fileName = WriteAllText(strData); - var profileItem = new ProfileItem - { - CoreType = ECoreType.sing_box, - Address = fileName, - Remarks = subRemarks ?? "singbox_custom" - }; + public static ProfileItem? ResolveFull(string strData, string? subRemarks) + { + var singboxConfig = JsonUtils.Deserialize(strData); + if (singboxConfig?.inbounds?.Count > 0 + && singboxConfig.outbounds?.Count > 0 + && singboxConfig.route != null) + { + var fileName = WriteAllText(strData); + var profileItem = new ProfileItem + { + CoreType = ECoreType.sing_box, + Address = fileName, + Remarks = subRemarks ?? "singbox_custom" + }; - return profileItem; - } - return null; - } - } -} \ No newline at end of file + return profileItem; + } + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs index 250f39e4..86d959c2 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs @@ -1,111 +1,113 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class SocksFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public class SocksFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - var item = ResolveSocksNew(str) ?? ResolveSocks(str); - if (item == null) - { - return null; - } - if (item.Address.Length == 0 || item.Port == 0) - { - return null; - } + var item = ResolveSocksNew(str) ?? ResolveSocks(str); + if (item == null) + { + return null; + } + if (item.Address.Length == 0 || item.Port == 0) + { + return null; + } - item.ConfigType = EConfigType.SOCKS; + item.ConfigType = EConfigType.SOCKS; - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - var url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + var url = string.Empty; - var remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - //new - var pw = Utils.Base64Encode($"{item.Security}:{item.Id}"); - return ToUri(EConfigType.SOCKS, item.Address, item.Port, pw, null, remark); - } + var remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + //new + var pw = Utils.Base64Encode($"{item.Security}:{item.Id}"); + return ToUri(EConfigType.SOCKS, item.Address, item.Port, pw, null, remark); + } - private static ProfileItem? ResolveSocks(string result) - { - ProfileItem item = new() - { - ConfigType = EConfigType.SOCKS - }; - result = result[Global.ProtocolShares[EConfigType.SOCKS].Length..]; - //remark - var indexRemark = result.IndexOf("#"); - if (indexRemark > 0) - { - try - { - item.Remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); - } - catch { } - result = result[..indexRemark]; - } - //part decode - var indexS = result.IndexOf("@"); - if (indexS > 0) - { - } - else - { - result = Utils.Base64Decode(result); - } + private static ProfileItem? ResolveSocks(string result) + { + ProfileItem item = new() + { + ConfigType = EConfigType.SOCKS + }; + result = result[Global.ProtocolShares[EConfigType.SOCKS].Length..]; + //remark + var indexRemark = result.IndexOf("#"); + if (indexRemark > 0) + { + try + { + item.Remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); + } + catch { } + result = result[..indexRemark]; + } + //part decode + var indexS = result.IndexOf("@"); + if (indexS > 0) + { + } + else + { + result = Utils.Base64Decode(result); + } - var arr1 = result.Split('@'); - if (arr1.Length != 2) - { - return null; - } - var arr21 = arr1.First().Split(':'); - var indexPort = arr1.Last().LastIndexOf(":"); - if (arr21.Length != 2 || indexPort < 0) - { - return null; - } - item.Address = arr1[1][..indexPort]; - item.Port = Utils.ToInt(arr1[1][(indexPort + 1)..]); - item.Security = arr21.First(); - item.Id = arr21[1]; + var arr1 = result.Split('@'); + if (arr1.Length != 2) + { + return null; + } + var arr21 = arr1.First().Split(':'); + var indexPort = arr1.Last().LastIndexOf(":"); + if (arr21.Length != 2 || indexPort < 0) + { + return null; + } + item.Address = arr1[1][..indexPort]; + item.Port = Utils.ToInt(arr1[1][(indexPort + 1)..]); + item.Security = arr21.First(); + item.Id = arr21[1]; - return item; - } + return item; + } - private static ProfileItem? ResolveSocksNew(string result) - { - var parsedUrl = Utils.TryUri(result); - if (parsedUrl == null) return null; + private static ProfileItem? ResolveSocksNew(string result) + { + var parsedUrl = Utils.TryUri(result); + if (parsedUrl == null) + return null; - ProfileItem item = new() - { - Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), - Address = parsedUrl.IdnHost, - Port = parsedUrl.Port, - }; + ProfileItem item = new() + { + Remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped), + Address = parsedUrl.IdnHost, + Port = parsedUrl.Port, + }; - // parse base64 UserInfo - var rawUserInfo = Utils.UrlDecode(parsedUrl.UserInfo); - var userInfo = Utils.Base64Decode(rawUserInfo); - var userInfoParts = userInfo.Split([':'], 2); - if (userInfoParts.Length == 2) - { - item.Security = userInfoParts.First(); - item.Id = userInfoParts[1]; - } + // parse base64 UserInfo + var rawUserInfo = Utils.UrlDecode(parsedUrl.UserInfo); + var userInfo = Utils.Base64Decode(rawUserInfo); + var userInfoParts = userInfo.Split([':'], 2); + if (userInfoParts.Length == 2) + { + item.Security = userInfoParts.First(); + item.Id = userInfoParts[1]; + } - return item; - } - } -} \ No newline at end of file + return item; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs index 5a6a2081..0c6c9ebe 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/TrojanFmt.cs @@ -1,44 +1,46 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class TrojanFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public class TrojanFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem item = new() - { - ConfigType = EConfigType.Trojan - }; + ProfileItem item = new() + { + ConfigType = EConfigType.Trojan + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.Id = Utils.UrlDecode(url.UserInfo); + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.Id = Utils.UrlDecode(url.UserInfo); - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - var dicQuery = new Dictionary(); - GetStdTransport(item, null, ref dicQuery); + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + var dicQuery = new Dictionary(); + GetStdTransport(item, null, ref dicQuery); - return ToUri(EConfigType.Trojan, item.Address, item.Port, item.Id, dicQuery, remark); - } - } -} \ No newline at end of file + return ToUri(EConfigType.Trojan, item.Address, item.Port, item.Id, dicQuery, remark); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs index 4783716a..659d349f 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs @@ -1,59 +1,61 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class TuicFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public class TuicFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem item = new() - { - ConfigType = EConfigType.TUIC - }; + ProfileItem item = new() + { + ConfigType = EConfigType.TUIC + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - var rawUserInfo = Utils.UrlDecode(url.UserInfo); - var userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); - if (userInfoParts.Length == 2) - { - item.Id = userInfoParts.First(); - item.Security = userInfoParts.Last(); - } + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + var rawUserInfo = Utils.UrlDecode(url.UserInfo); + var userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); + if (userInfoParts.Length == 2) + { + item.Id = userInfoParts.First(); + item.Security = userInfoParts.Last(); + } - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); - item.HeaderType = query["congestion_control"] ?? ""; + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); + item.HeaderType = query["congestion_control"] ?? ""; - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - var dicQuery = new Dictionary(); - if (Utils.IsNotEmpty(item.Sni)) - { - dicQuery.Add("sni", item.Sni); - } - if (Utils.IsNotEmpty(item.Alpn)) - { - dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); - } - dicQuery.Add("congestion_control", item.HeaderType); + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + var dicQuery = new Dictionary(); + if (Utils.IsNotEmpty(item.Sni)) + { + dicQuery.Add("sni", item.Sni); + } + if (Utils.IsNotEmpty(item.Alpn)) + { + dicQuery.Add("alpn", Utils.UrlEncode(item.Alpn)); + } + dicQuery.Add("congestion_control", item.HeaderType); - return ToUri(EConfigType.TUIC, item.Address, item.Port, $"{item.Id}:{item.Security}", dicQuery, remark); - } - } -} \ No newline at end of file + return ToUri(EConfigType.TUIC, item.Address, item.Port, $"{item.Id}:{item.Security}", dicQuery, remark); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/V2rayFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/V2rayFmt.cs index cc2ec7bf..c647a8dd 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/V2rayFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/V2rayFmt.cs @@ -1,56 +1,56 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class V2rayFmt : BaseFmt - { - public static List? ResolveFullArray(string strData, string? subRemarks) - { - var configObjects = JsonUtils.Deserialize(strData); - if (configObjects != null && configObjects.Length > 0) - { - List lstResult = []; - foreach (var configObject in configObjects) - { - var objectString = JsonUtils.Serialize(configObject); - var v2rayCon = JsonUtils.Deserialize(objectString); - if (v2rayCon?.inbounds?.Count > 0 - && v2rayCon.outbounds?.Count > 0 - && v2rayCon.routing != null) - { - var fileName = WriteAllText(objectString); + public class V2rayFmt : BaseFmt + { + public static List? ResolveFullArray(string strData, string? subRemarks) + { + var configObjects = JsonUtils.Deserialize(strData); + if (configObjects != null && configObjects.Length > 0) + { + List lstResult = []; + foreach (var configObject in configObjects) + { + var objectString = JsonUtils.Serialize(configObject); + var v2rayCon = JsonUtils.Deserialize(objectString); + if (v2rayCon?.inbounds?.Count > 0 + && v2rayCon.outbounds?.Count > 0 + && v2rayCon.routing != null) + { + var fileName = WriteAllText(objectString); - var profileIt = new ProfileItem - { - CoreType = ECoreType.Xray, - Address = fileName, - Remarks = v2rayCon.remarks ?? subRemarks ?? "v2ray_custom", - }; - lstResult.Add(profileIt); - } - } - return lstResult; - } - return null; - } + var profileIt = new ProfileItem + { + CoreType = ECoreType.Xray, + Address = fileName, + Remarks = v2rayCon.remarks ?? subRemarks ?? "v2ray_custom", + }; + lstResult.Add(profileIt); + } + } + return lstResult; + } + return null; + } - public static ProfileItem? ResolveFull(string strData, string? subRemarks) - { - var v2rayConfig = JsonUtils.Deserialize(strData); - if (v2rayConfig?.inbounds?.Count > 0 - && v2rayConfig.outbounds?.Count > 0 - && v2rayConfig.routing != null) - { - var fileName = WriteAllText(strData); + public static ProfileItem? ResolveFull(string strData, string? subRemarks) + { + var v2rayConfig = JsonUtils.Deserialize(strData); + if (v2rayConfig?.inbounds?.Count > 0 + && v2rayConfig.outbounds?.Count > 0 + && v2rayConfig.routing != null) + { + var fileName = WriteAllText(strData); - var profileItem = new ProfileItem - { - CoreType = ECoreType.Xray, - Address = fileName, - Remarks = v2rayConfig.remarks ?? subRemarks ?? "v2ray_custom" - }; + var profileItem = new ProfileItem + { + CoreType = ECoreType.Xray, + Address = fileName, + Remarks = v2rayConfig.remarks ?? subRemarks ?? "v2ray_custom" + }; - return profileItem; - } - return null; - } - } -} \ No newline at end of file + return profileItem; + } + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs index a84145c3..85e14b59 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/VLESSFmt.cs @@ -1,55 +1,57 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class VLESSFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public class VLESSFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem item = new() - { - ConfigType = EConfigType.VLESS, - Security = Global.None - }; + ProfileItem item = new() + { + ConfigType = EConfigType.VLESS, + Security = Global.None + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.Id = Utils.UrlDecode(url.UserInfo); + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.Id = Utils.UrlDecode(url.UserInfo); - var query = Utils.ParseQueryString(url.Query); - item.Security = query["encryption"] ?? Global.None; - item.StreamSecurity = query["security"] ?? ""; - ResolveStdTransport(query, ref item); + var query = Utils.ParseQueryString(url.Query); + item.Security = query["encryption"] ?? Global.None; + item.StreamSecurity = query["security"] ?? ""; + ResolveStdTransport(query, ref item); - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } - var dicQuery = new Dictionary(); - if (Utils.IsNotEmpty(item.Security)) - { - dicQuery.Add("encryption", item.Security); - } - else - { - dicQuery.Add("encryption", Global.None); - } - GetStdTransport(item, Global.None, ref dicQuery); + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } + var dicQuery = new Dictionary(); + if (Utils.IsNotEmpty(item.Security)) + { + dicQuery.Add("encryption", item.Security); + } + else + { + dicQuery.Add("encryption", Global.None); + } + GetStdTransport(item, Global.None, ref dicQuery); - return ToUri(EConfigType.VLESS, item.Address, item.Port, item.Id, dicQuery, remark); - } - } -} \ No newline at end of file + return ToUri(EConfigType.VLESS, item.Address, item.Port, item.Id, dicQuery, remark); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs index a9913a3a..41639990 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/VmessFmt.cs @@ -1,122 +1,124 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class VmessFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem? item; - if (str.IndexOf('?') > 0 && str.IndexOf('&') > 0) - { - item = ResolveStdVmess(str); - } - else - { - item = ResolveVmess(str, out msg); - } - return item; - } + public class VmessFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; + ProfileItem? item; + if (str.IndexOf('?') > 0 && str.IndexOf('&') > 0) + { + item = ResolveStdVmess(str); + } + else + { + item = ResolveVmess(str, out msg); + } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - VmessQRCode vmessQRCode = new() - { - v = item.ConfigVersion, - ps = item.Remarks.TrimEx(), - add = item.Address, - port = item.Port, - id = item.Id, - aid = item.AlterId, - scy = item.Security, - net = item.Network, - type = item.HeaderType, - host = item.RequestHost, - path = item.Path, - tls = item.StreamSecurity, - sni = item.Sni, - alpn = item.Alpn, - fp = item.Fingerprint - }; + VmessQRCode vmessQRCode = new() + { + v = item.ConfigVersion, + ps = item.Remarks.TrimEx(), + add = item.Address, + port = item.Port, + id = item.Id, + aid = item.AlterId, + scy = item.Security, + net = item.Network, + type = item.HeaderType, + host = item.RequestHost, + path = item.Path, + tls = item.StreamSecurity, + sni = item.Sni, + alpn = item.Alpn, + fp = item.Fingerprint + }; - url = JsonUtils.Serialize(vmessQRCode); - url = Utils.Base64Encode(url); - url = $"{Global.ProtocolShares[EConfigType.VMess]}{url}"; + url = JsonUtils.Serialize(vmessQRCode); + url = Utils.Base64Encode(url); + url = $"{Global.ProtocolShares[EConfigType.VMess]}{url}"; - return url; - } + return url; + } - private static ProfileItem? ResolveVmess(string result, out string msg) - { - msg = string.Empty; - var item = new ProfileItem - { - ConfigType = EConfigType.VMess - }; + private static ProfileItem? ResolveVmess(string result, out string msg) + { + msg = string.Empty; + var item = new ProfileItem + { + ConfigType = EConfigType.VMess + }; - result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; - result = Utils.Base64Decode(result); + result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; + result = Utils.Base64Decode(result); - VmessQRCode? vmessQRCode = JsonUtils.Deserialize(result); - if (vmessQRCode == null) - { - msg = ResUI.FailedConversionConfiguration; - return null; - } + VmessQRCode? vmessQRCode = JsonUtils.Deserialize(result); + if (vmessQRCode == null) + { + msg = ResUI.FailedConversionConfiguration; + return null; + } - item.Network = Global.DefaultNetwork; - item.HeaderType = Global.None; + item.Network = Global.DefaultNetwork; + item.HeaderType = Global.None; - item.ConfigVersion = vmessQRCode.v; - item.Remarks = Utils.ToString(vmessQRCode.ps); - item.Address = Utils.ToString(vmessQRCode.add); - item.Port = vmessQRCode.port; - item.Id = Utils.ToString(vmessQRCode.id); - item.AlterId = vmessQRCode.aid; - item.Security = Utils.ToString(vmessQRCode.scy); + item.ConfigVersion = vmessQRCode.v; + item.Remarks = Utils.ToString(vmessQRCode.ps); + item.Address = Utils.ToString(vmessQRCode.add); + item.Port = vmessQRCode.port; + item.Id = Utils.ToString(vmessQRCode.id); + item.AlterId = vmessQRCode.aid; + item.Security = Utils.ToString(vmessQRCode.scy); - item.Security = Utils.IsNotEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; - if (Utils.IsNotEmpty(vmessQRCode.net)) - { - item.Network = vmessQRCode.net; - } - if (Utils.IsNotEmpty(vmessQRCode.type)) - { - item.HeaderType = vmessQRCode.type; - } + item.Security = Utils.IsNotEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; + if (Utils.IsNotEmpty(vmessQRCode.net)) + { + item.Network = vmessQRCode.net; + } + if (Utils.IsNotEmpty(vmessQRCode.type)) + { + item.HeaderType = vmessQRCode.type; + } - item.RequestHost = Utils.ToString(vmessQRCode.host); - item.Path = Utils.ToString(vmessQRCode.path); - item.StreamSecurity = Utils.ToString(vmessQRCode.tls); - item.Sni = Utils.ToString(vmessQRCode.sni); - item.Alpn = Utils.ToString(vmessQRCode.alpn); - item.Fingerprint = Utils.ToString(vmessQRCode.fp); + item.RequestHost = Utils.ToString(vmessQRCode.host); + item.Path = Utils.ToString(vmessQRCode.path); + item.StreamSecurity = Utils.ToString(vmessQRCode.tls); + item.Sni = Utils.ToString(vmessQRCode.sni); + item.Alpn = Utils.ToString(vmessQRCode.alpn); + item.Fingerprint = Utils.ToString(vmessQRCode.fp); - return item; - } + return item; + } - public static ProfileItem? ResolveStdVmess(string str) - { - ProfileItem item = new() - { - ConfigType = EConfigType.VMess, - Security = "auto" - }; + public static ProfileItem? ResolveStdVmess(string str) + { + ProfileItem item = new() + { + ConfigType = EConfigType.VMess, + Security = "auto" + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.Id = Utils.UrlDecode(url.UserInfo); + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.Id = Utils.UrlDecode(url.UserInfo); - var query = Utils.ParseQueryString(url.Query); - ResolveStdTransport(query, ref item); + var query = Utils.ParseQueryString(url.Query); + ResolveStdTransport(query, ref item); - return item; - } - } -} \ No newline at end of file + return item; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs index e3d88e8c..54911709 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/WireguardFmt.cs @@ -1,63 +1,65 @@ -namespace ServiceLib.Handler.Fmt +namespace ServiceLib.Handler.Fmt { - public class WireguardFmt : BaseFmt - { - public static ProfileItem? Resolve(string str, out string msg) - { - msg = ResUI.ConfigurationFormatIncorrect; + public class WireguardFmt : BaseFmt + { + public static ProfileItem? Resolve(string str, out string msg) + { + msg = ResUI.ConfigurationFormatIncorrect; - ProfileItem item = new() - { - ConfigType = EConfigType.WireGuard - }; + ProfileItem item = new() + { + ConfigType = EConfigType.WireGuard + }; - var url = Utils.TryUri(str); - if (url == null) return null; + var url = Utils.TryUri(str); + if (url == null) + return null; - item.Address = url.IdnHost; - item.Port = url.Port; - item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); - item.Id = Utils.UrlDecode(url.UserInfo); + item.Address = url.IdnHost; + item.Port = url.Port; + item.Remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); + item.Id = Utils.UrlDecode(url.UserInfo); - var query = Utils.ParseQueryString(url.Query); + var query = Utils.ParseQueryString(url.Query); - item.PublicKey = Utils.UrlDecode(query["publickey"] ?? ""); - item.Path = Utils.UrlDecode(query["reserved"] ?? ""); - item.RequestHost = Utils.UrlDecode(query["address"] ?? ""); - item.ShortId = Utils.UrlDecode(query["mtu"] ?? ""); + item.PublicKey = Utils.UrlDecode(query["publickey"] ?? ""); + item.Path = Utils.UrlDecode(query["reserved"] ?? ""); + item.RequestHost = Utils.UrlDecode(query["address"] ?? ""); + item.ShortId = Utils.UrlDecode(query["mtu"] ?? ""); - return item; - } + return item; + } - public static string? ToUri(ProfileItem? item) - { - if (item == null) return null; - string url = string.Empty; + public static string? ToUri(ProfileItem? item) + { + if (item == null) + return null; + string url = string.Empty; - string remark = string.Empty; - if (Utils.IsNotEmpty(item.Remarks)) - { - remark = "#" + Utils.UrlEncode(item.Remarks); - } + string remark = string.Empty; + if (Utils.IsNotEmpty(item.Remarks)) + { + remark = "#" + Utils.UrlEncode(item.Remarks); + } - var dicQuery = new Dictionary(); - if (Utils.IsNotEmpty(item.PublicKey)) - { - dicQuery.Add("publickey", Utils.UrlEncode(item.PublicKey)); - } - if (Utils.IsNotEmpty(item.Path)) - { - dicQuery.Add("reserved", Utils.UrlEncode(item.Path)); - } - if (Utils.IsNotEmpty(item.RequestHost)) - { - dicQuery.Add("address", Utils.UrlEncode(item.RequestHost)); - } - if (Utils.IsNotEmpty(item.ShortId)) - { - dicQuery.Add("mtu", Utils.UrlEncode(item.ShortId)); - } - return ToUri(EConfigType.WireGuard, item.Address, item.Port, item.Id, dicQuery, remark); - } - } -} \ No newline at end of file + var dicQuery = new Dictionary(); + if (Utils.IsNotEmpty(item.PublicKey)) + { + dicQuery.Add("publickey", Utils.UrlEncode(item.PublicKey)); + } + if (Utils.IsNotEmpty(item.Path)) + { + dicQuery.Add("reserved", Utils.UrlEncode(item.Path)); + } + if (Utils.IsNotEmpty(item.RequestHost)) + { + dicQuery.Add("address", Utils.UrlEncode(item.RequestHost)); + } + if (Utils.IsNotEmpty(item.ShortId)) + { + dicQuery.Add("mtu", Utils.UrlEncode(item.ShortId)); + } + return ToUri(EConfigType.WireGuard, item.Address, item.Port, item.Id, dicQuery, remark); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/NoticeHandler.cs b/v2rayN/ServiceLib/Handler/NoticeHandler.cs index 948fc81c..90dcf05c 100644 --- a/v2rayN/ServiceLib/Handler/NoticeHandler.cs +++ b/v2rayN/ServiceLib/Handler/NoticeHandler.cs @@ -1,44 +1,44 @@ -using ReactiveUI; +using ReactiveUI; namespace ServiceLib.Handler { - public class NoticeHandler - { - private static readonly Lazy _instance = new(() => new()); - public static NoticeHandler Instance => _instance.Value; + public class NoticeHandler + { + private static readonly Lazy _instance = new(() => new()); + public static NoticeHandler Instance => _instance.Value; - public void Enqueue(string? content) - { - if (content.IsNullOrEmpty()) - { - return; - } - MessageBus.Current.SendMessage(content, EMsgCommand.SendSnackMsg.ToString()); - } + public void Enqueue(string? content) + { + if (content.IsNullOrEmpty()) + { + return; + } + MessageBus.Current.SendMessage(content, EMsgCommand.SendSnackMsg.ToString()); + } - public void SendMessage(string? content) - { - if (content.IsNullOrEmpty()) - { - return; - } - MessageBus.Current.SendMessage(content, EMsgCommand.SendMsgView.ToString()); - } + public void SendMessage(string? content) + { + if (content.IsNullOrEmpty()) + { + return; + } + MessageBus.Current.SendMessage(content, EMsgCommand.SendMsgView.ToString()); + } - public void SendMessageEx(string? content) - { - if (content.IsNullOrEmpty()) - { - return; - } - content = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss} {content}"; - SendMessage(content); - } + public void SendMessageEx(string? content) + { + if (content.IsNullOrEmpty()) + { + return; + } + content = $"{DateTime.Now:yyyy/MM/dd HH:mm:ss} {content}"; + SendMessage(content); + } - public void SendMessageAndEnqueue(string? msg) - { - Enqueue(msg); - SendMessage(msg); - } - } -} \ No newline at end of file + public void SendMessageAndEnqueue(string? msg) + { + Enqueue(msg); + SendMessage(msg); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/PacHandler.cs b/v2rayN/ServiceLib/Handler/PacHandler.cs index f6bf0e28..f2d35e52 100644 --- a/v2rayN/ServiceLib/Handler/PacHandler.cs +++ b/v2rayN/ServiceLib/Handler/PacHandler.cs @@ -1,105 +1,106 @@ -using System.Net.Sockets; +using System.Net.Sockets; using System.Text; namespace ServiceLib.Handler { - public class PacHandler - { - private static string _configPath; - private static int _httpPort; - private static int _pacPort; - private static TcpListener? _tcpListener; - private static byte[] _writeContent; - private static bool _isRunning; - private static bool _needRestart = true; + public class PacHandler + { + private static string _configPath; + private static int _httpPort; + private static int _pacPort; + private static TcpListener? _tcpListener; + private static byte[] _writeContent; + private static bool _isRunning; + private static bool _needRestart = true; - public static async Task Start(string configPath, int httpPort, int pacPort) - { - _needRestart = (configPath != _configPath || httpPort != _httpPort || pacPort != _pacPort || !_isRunning); + public static async Task Start(string configPath, int httpPort, int pacPort) + { + _needRestart = (configPath != _configPath || httpPort != _httpPort || pacPort != _pacPort || !_isRunning); - _configPath = configPath; - _httpPort = httpPort; - _pacPort = pacPort; + _configPath = configPath; + _httpPort = httpPort; + _pacPort = pacPort; - await InitText(); + await InitText(); - if (_needRestart) - { - Stop(); - RunListener(); - } - } + if (_needRestart) + { + Stop(); + RunListener(); + } + } - private static async Task InitText() - { - var path = Path.Combine(_configPath, "pac.txt"); - if (!File.Exists(path)) - { - var pac = Utils.GetEmbedText(Global.PacFileName); - await File.AppendAllTextAsync(path, pac); - } + private static async Task InitText() + { + var path = Path.Combine(_configPath, "pac.txt"); + if (!File.Exists(path)) + { + var pac = Utils.GetEmbedText(Global.PacFileName); + await File.AppendAllTextAsync(path, pac); + } - var pacText = - (await File.ReadAllTextAsync(path)).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;"); + var pacText = + (await File.ReadAllTextAsync(path)).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;"); - var sb = new StringBuilder(); - sb.AppendLine("HTTP/1.0 200 OK"); - sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig"); - sb.AppendLine("Connection:close"); - sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(pacText)); - sb.AppendLine(); - sb.Append(pacText); - _writeContent = Encoding.UTF8.GetBytes(sb.ToString()); - } + var sb = new StringBuilder(); + sb.AppendLine("HTTP/1.0 200 OK"); + sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig"); + sb.AppendLine("Connection:close"); + sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(pacText)); + sb.AppendLine(); + sb.Append(pacText); + _writeContent = Encoding.UTF8.GetBytes(sb.ToString()); + } - private static void RunListener() - { - _tcpListener = TcpListener.Create(_pacPort); - _isRunning = true; - _tcpListener.Start(); - Task.Factory.StartNew(async () => - { - while (_isRunning) - { - try - { - if (!_tcpListener.Pending()) - { - await Task.Delay(10); - continue; - } + private static void RunListener() + { + _tcpListener = TcpListener.Create(_pacPort); + _isRunning = true; + _tcpListener.Start(); + Task.Factory.StartNew(async () => + { + while (_isRunning) + { + try + { + if (!_tcpListener.Pending()) + { + await Task.Delay(10); + continue; + } - var client = await _tcpListener.AcceptTcpClientAsync(); - await Task.Run(() => { WriteContent(client); }); - } - catch - { - // ignored - } - } - }, TaskCreationOptions.LongRunning); - } + var client = await _tcpListener.AcceptTcpClientAsync(); + await Task.Run(() => { WriteContent(client); }); + } + catch + { + // ignored + } + } + }, TaskCreationOptions.LongRunning); + } - private static void WriteContent(TcpClient client) - { - var stream = client.GetStream(); - stream.Write(_writeContent, 0, _writeContent.Length); - stream.Flush(); - } + private static void WriteContent(TcpClient client) + { + var stream = client.GetStream(); + stream.Write(_writeContent, 0, _writeContent.Length); + stream.Flush(); + } - public static void Stop() - { - if (_tcpListener == null) return; - try - { - _isRunning = false; - _tcpListener.Stop(); - _tcpListener = null; - } - catch - { - // ignored - } - } - } -} \ No newline at end of file + public static void Stop() + { + if (_tcpListener == null) + return; + try + { + _isRunning = false; + _tcpListener.Stop(); + _tcpListener = null; + } + catch + { + // ignored + } + } + } +} diff --git a/v2rayN/ServiceLib/Handler/ProfileExHandler.cs b/v2rayN/ServiceLib/Handler/ProfileExHandler.cs index e7e2fef5..729c5b91 100644 --- a/v2rayN/ServiceLib/Handler/ProfileExHandler.cs +++ b/v2rayN/ServiceLib/Handler/ProfileExHandler.cs @@ -1,183 +1,181 @@ -using System.Collections.Concurrent; - -//using System.Reactive.Linq; +using System.Collections.Concurrent; namespace ServiceLib.Handler { - public class ProfileExHandler - { - private static readonly Lazy _instance = new(() => new()); - private ConcurrentBag _lstProfileEx = []; - private Queue _queIndexIds = new(); - public static ProfileExHandler Instance => _instance.Value; - private static readonly string _tag = "ProfileExHandler"; + public class ProfileExHandler + { + private static readonly Lazy _instance = new(() => new()); + private ConcurrentBag _lstProfileEx = []; + private Queue _queIndexIds = new(); + public static ProfileExHandler Instance => _instance.Value; + private static readonly string _tag = "ProfileExHandler"; - public ProfileExHandler() - { - //Init(); - } + public ProfileExHandler() + { + //Init(); + } - public async Task Init() - { - await InitData(); - _ = Task.Run(async () => - { - while (true) - { - await Task.Delay(1000 * 600); - await SaveQueueIndexIds(); - } - }); - } + public async Task Init() + { + await InitData(); + _ = Task.Run(async () => + { + while (true) + { + await Task.Delay(1000 * 600); + await SaveQueueIndexIds(); + } + }); + } - public async Task> GetProfileExs() - { - return await Task.FromResult(_lstProfileEx); - } + public async Task> GetProfileExs() + { + return await Task.FromResult(_lstProfileEx); + } - private async Task InitData() - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem where indexId not in ( select indexId from ProfileItem )"); + private async Task InitData() + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem where indexId not in ( select indexId from ProfileItem )"); - _lstProfileEx = new(await SQLiteHelper.Instance.TableAsync().ToListAsync()); - } + _lstProfileEx = new(await SQLiteHelper.Instance.TableAsync().ToListAsync()); + } - private void IndexIdEnqueue(string indexId) - { - if (Utils.IsNotEmpty(indexId) && !_queIndexIds.Contains(indexId)) - { - _queIndexIds.Enqueue(indexId); - } - } + private void IndexIdEnqueue(string indexId) + { + if (Utils.IsNotEmpty(indexId) && !_queIndexIds.Contains(indexId)) + { + _queIndexIds.Enqueue(indexId); + } + } - private async Task SaveQueueIndexIds() - { - var cnt = _queIndexIds.Count; - if (cnt > 0) - { - var lstExists = await SQLiteHelper.Instance.TableAsync().ToListAsync(); - List lstInserts = []; - List lstUpdates = []; + private async Task SaveQueueIndexIds() + { + var cnt = _queIndexIds.Count; + if (cnt > 0) + { + var lstExists = await SQLiteHelper.Instance.TableAsync().ToListAsync(); + List lstInserts = []; + List lstUpdates = []; - for (int i = 0; i < cnt; i++) - { - var id = _queIndexIds.Dequeue(); - var item = lstExists.FirstOrDefault(t => t.IndexId == id); - var itemNew = _lstProfileEx?.FirstOrDefault(t => t.IndexId == id); - if (itemNew is null) - { - continue; - } + for (int i = 0; i < cnt; i++) + { + var id = _queIndexIds.Dequeue(); + var item = lstExists.FirstOrDefault(t => t.IndexId == id); + var itemNew = _lstProfileEx?.FirstOrDefault(t => t.IndexId == id); + if (itemNew is null) + { + continue; + } - if (item is not null) - { - lstUpdates.Add(itemNew); - } - else - { - lstInserts.Add(itemNew); - } - } - try - { - if (lstInserts.Count() > 0) - await SQLiteHelper.Instance.InsertAllAsync(lstInserts); + if (item is not null) + { + lstUpdates.Add(itemNew); + } + else + { + lstInserts.Add(itemNew); + } + } + try + { + if (lstInserts.Count() > 0) + await SQLiteHelper.Instance.InsertAllAsync(lstInserts); - if (lstUpdates.Count() > 0) - await SQLiteHelper.Instance.UpdateAllAsync(lstUpdates); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } - } + if (lstUpdates.Count() > 0) + await SQLiteHelper.Instance.UpdateAllAsync(lstUpdates); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } + } - private void AddProfileEx(string indexId, ref ProfileExItem? profileEx) - { - profileEx = new() - { - IndexId = indexId, - Delay = 0, - Speed = 0, - Sort = 0 - }; - _lstProfileEx.Add(profileEx); - IndexIdEnqueue(indexId); - } + private void AddProfileEx(string indexId, ref ProfileExItem? profileEx) + { + profileEx = new() + { + IndexId = indexId, + Delay = 0, + Speed = 0, + Sort = 0 + }; + _lstProfileEx.Add(profileEx); + IndexIdEnqueue(indexId); + } - public async Task ClearAll() - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem "); - _lstProfileEx = new(); - } + public async Task ClearAll() + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ProfileExItem "); + _lstProfileEx = new(); + } - public async Task SaveTo() - { - try - { - await SaveQueueIndexIds(); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public async Task SaveTo() + { + try + { + await SaveQueueIndexIds(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public void SetTestDelay(string indexId, string delayVal) - { - var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); - if (profileEx == null) - { - AddProfileEx(indexId, ref profileEx); - } + public void SetTestDelay(string indexId, string delayVal) + { + var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); + if (profileEx == null) + { + AddProfileEx(indexId, ref profileEx); + } - int.TryParse(delayVal, out int delay); - profileEx.Delay = delay; - IndexIdEnqueue(indexId); - } + int.TryParse(delayVal, out int delay); + profileEx.Delay = delay; + IndexIdEnqueue(indexId); + } - public void SetTestSpeed(string indexId, string speedVal) - { - var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); - if (profileEx == null) - { - AddProfileEx(indexId, ref profileEx); - } + public void SetTestSpeed(string indexId, string speedVal) + { + var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); + if (profileEx == null) + { + AddProfileEx(indexId, ref profileEx); + } - decimal.TryParse(speedVal, out decimal speed); - profileEx.Speed = speed; - IndexIdEnqueue(indexId); - } + decimal.TryParse(speedVal, out decimal speed); + profileEx.Speed = speed; + IndexIdEnqueue(indexId); + } - public void SetSort(string indexId, int sort) - { - var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); - if (profileEx == null) - { - AddProfileEx(indexId, ref profileEx); - } - profileEx.Sort = sort; - IndexIdEnqueue(indexId); - } + public void SetSort(string indexId, int sort) + { + var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); + if (profileEx == null) + { + AddProfileEx(indexId, ref profileEx); + } + profileEx.Sort = sort; + IndexIdEnqueue(indexId); + } - public int GetSort(string indexId) - { - var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); - if (profileEx == null) - { - return 0; - } - return profileEx.Sort; - } + public int GetSort(string indexId) + { + var profileEx = _lstProfileEx.FirstOrDefault(t => t.IndexId == indexId); + if (profileEx == null) + { + return 0; + } + return profileEx.Sort; + } - public int GetMaxSort() - { - if (_lstProfileEx.Count <= 0) - { - return 0; - } - return _lstProfileEx.Max(t => t == null ? 0 : t.Sort); - } - } -} \ No newline at end of file + public int GetMaxSort() + { + if (_lstProfileEx.Count <= 0) + { + return 0; + } + return _lstProfileEx.Max(t => t == null ? 0 : t.Sort); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/StatisticsHandler.cs b/v2rayN/ServiceLib/Handler/StatisticsHandler.cs index 8b900b0a..bd3dd393 100644 --- a/v2rayN/ServiceLib/Handler/StatisticsHandler.cs +++ b/v2rayN/ServiceLib/Handler/StatisticsHandler.cs @@ -1,164 +1,164 @@ -namespace ServiceLib.Handler +namespace ServiceLib.Handler { - public class StatisticsHandler - { - private static readonly Lazy instance = new(() => new()); - public static StatisticsHandler Instance => instance.Value; + public class StatisticsHandler + { + private static readonly Lazy instance = new(() => new()); + public static StatisticsHandler Instance => instance.Value; - private Config _config; - private ServerStatItem? _serverStatItem; - private List _lstServerStat; - private Action? _updateFunc; + private Config _config; + private ServerStatItem? _serverStatItem; + private List _lstServerStat; + private Action? _updateFunc; - private StatisticsXrayService? _statisticsXray; - private StatisticsSingboxService? _statisticsSingbox; - private static readonly string _tag = "StatisticsHandler"; - public List ServerStat => _lstServerStat; + private StatisticsXrayService? _statisticsXray; + private StatisticsSingboxService? _statisticsSingbox; + private static readonly string _tag = "StatisticsHandler"; + public List ServerStat => _lstServerStat; - public async Task Init(Config config, Action updateFunc) - { - _config = config; - _updateFunc = updateFunc; - if (config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) - { - await InitData(); + public async Task Init(Config config, Action updateFunc) + { + _config = config; + _updateFunc = updateFunc; + if (config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) + { + await InitData(); - _statisticsXray = new StatisticsXrayService(config, UpdateServerStatHandler); - _statisticsSingbox = new StatisticsSingboxService(config, UpdateServerStatHandler); - } - } + _statisticsXray = new StatisticsXrayService(config, UpdateServerStatHandler); + _statisticsSingbox = new StatisticsSingboxService(config, UpdateServerStatHandler); + } + } - public void Close() - { - try - { - _statisticsXray?.Close(); - _statisticsSingbox?.Close(); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public void Close() + { + try + { + _statisticsXray?.Close(); + _statisticsSingbox?.Close(); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public async Task ClearAllServerStatistics() - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem "); - _serverStatItem = null; - _lstServerStat = new(); - } + public async Task ClearAllServerStatistics() + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem "); + _serverStatItem = null; + _lstServerStat = new(); + } - public async Task SaveTo() - { - try - { - if (_lstServerStat != null) - { - await SQLiteHelper.Instance.UpdateAllAsync(_lstServerStat); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public async Task SaveTo() + { + try + { + if (_lstServerStat != null) + { + await SQLiteHelper.Instance.UpdateAllAsync(_lstServerStat); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - public async Task CloneServerStatItem(string indexId, string toIndexId) - { - if (_lstServerStat == null) - { - return; - } + public async Task CloneServerStatItem(string indexId, string toIndexId) + { + if (_lstServerStat == null) + { + return; + } - if (indexId == toIndexId) - { - return; - } + if (indexId == toIndexId) + { + return; + } - var stat = _lstServerStat.FirstOrDefault(t => t.IndexId == indexId); - if (stat == null) - { - return; - } + var stat = _lstServerStat.FirstOrDefault(t => t.IndexId == indexId); + if (stat == null) + { + return; + } - var toStat = JsonUtils.DeepCopy(stat); - toStat.IndexId = toIndexId; - await SQLiteHelper.Instance.ReplaceAsync(toStat); - _lstServerStat.Add(toStat); - } + var toStat = JsonUtils.DeepCopy(stat); + toStat.IndexId = toIndexId; + await SQLiteHelper.Instance.ReplaceAsync(toStat); + _lstServerStat.Add(toStat); + } - private async Task InitData() - { - await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem where indexId not in ( select indexId from ProfileItem )"); + private async Task InitData() + { + await SQLiteHelper.Instance.ExecuteAsync($"delete from ServerStatItem where indexId not in ( select indexId from ProfileItem )"); - long ticks = DateTime.Now.Date.Ticks; - await SQLiteHelper.Instance.ExecuteAsync($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}"); + long ticks = DateTime.Now.Date.Ticks; + await SQLiteHelper.Instance.ExecuteAsync($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}"); - _lstServerStat = await SQLiteHelper.Instance.TableAsync().ToListAsync(); - } + _lstServerStat = await SQLiteHelper.Instance.TableAsync().ToListAsync(); + } - private void UpdateServerStatHandler(ServerSpeedItem server) - { - _ = UpdateServerStat(server); - } + private void UpdateServerStatHandler(ServerSpeedItem server) + { + _ = UpdateServerStat(server); + } - private async Task UpdateServerStat(ServerSpeedItem server) - { - await GetServerStatItem(_config.IndexId); + private async Task UpdateServerStat(ServerSpeedItem server) + { + await GetServerStatItem(_config.IndexId); - if (_serverStatItem is null) - { - return; - } - if (server.ProxyUp != 0 || server.ProxyDown != 0) - { - _serverStatItem.TodayUp += server.ProxyUp; - _serverStatItem.TodayDown += server.ProxyDown; - _serverStatItem.TotalUp += server.ProxyUp; - _serverStatItem.TotalDown += server.ProxyDown; - } + if (_serverStatItem is null) + { + return; + } + if (server.ProxyUp != 0 || server.ProxyDown != 0) + { + _serverStatItem.TodayUp += server.ProxyUp; + _serverStatItem.TodayDown += server.ProxyDown; + _serverStatItem.TotalUp += server.ProxyUp; + _serverStatItem.TotalDown += server.ProxyDown; + } - server.IndexId = _config.IndexId; - server.TodayUp = _serverStatItem.TodayUp; - server.TodayDown = _serverStatItem.TodayDown; - server.TotalUp = _serverStatItem.TotalUp; - server.TotalDown = _serverStatItem.TotalDown; - _updateFunc?.Invoke(server); - } + server.IndexId = _config.IndexId; + server.TodayUp = _serverStatItem.TodayUp; + server.TodayDown = _serverStatItem.TodayDown; + server.TotalUp = _serverStatItem.TotalUp; + server.TotalDown = _serverStatItem.TotalDown; + _updateFunc?.Invoke(server); + } - private async Task GetServerStatItem(string indexId) - { - long ticks = DateTime.Now.Date.Ticks; - if (_serverStatItem != null && _serverStatItem.IndexId != indexId) - { - _serverStatItem = null; - } + private async Task GetServerStatItem(string indexId) + { + long ticks = DateTime.Now.Date.Ticks; + if (_serverStatItem != null && _serverStatItem.IndexId != indexId) + { + _serverStatItem = null; + } - if (_serverStatItem == null) - { - _serverStatItem = _lstServerStat.FirstOrDefault(t => t.IndexId == indexId); - if (_serverStatItem == null) - { - _serverStatItem = new ServerStatItem - { - IndexId = indexId, - TotalUp = 0, - TotalDown = 0, - TodayUp = 0, - TodayDown = 0, - DateNow = ticks - }; - await SQLiteHelper.Instance.ReplaceAsync(_serverStatItem); - _lstServerStat.Add(_serverStatItem); - } - } + if (_serverStatItem == null) + { + _serverStatItem = _lstServerStat.FirstOrDefault(t => t.IndexId == indexId); + if (_serverStatItem == null) + { + _serverStatItem = new ServerStatItem + { + IndexId = indexId, + TotalUp = 0, + TotalDown = 0, + TodayUp = 0, + TodayDown = 0, + DateNow = ticks + }; + await SQLiteHelper.Instance.ReplaceAsync(_serverStatItem); + _lstServerStat.Add(_serverStatItem); + } + } - if (_serverStatItem.DateNow != ticks) - { - _serverStatItem.TodayUp = 0; - _serverStatItem.TodayDown = 0; - _serverStatItem.DateNow = ticks; - } - } - } -} \ No newline at end of file + if (_serverStatItem.DateNow != ticks) + { + _serverStatItem.TodayUp = 0; + _serverStatItem.TodayDown = 0; + _serverStatItem.DateNow = ticks; + } + } + } +} diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs index 78879219..b41afeb3 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingLinux.cs @@ -1,202 +1,202 @@ -namespace ServiceLib.Handler.SysProxy +namespace ServiceLib.Handler.SysProxy { - public class ProxySettingLinux - { - public static async Task SetProxy(string host, int port, string exceptions) - { - var lstCmd = GetSetCmds(host, port, exceptions); + public class ProxySettingLinux + { + public static async Task SetProxy(string host, int port, string exceptions) + { + var lstCmd = GetSetCmds(host, port, exceptions); - await ExecCmd(lstCmd); - } + await ExecCmd(lstCmd); + } - public static async Task UnsetProxy() - { - var lstCmd = GetUnsetCmds(); + public static async Task UnsetProxy() + { + var lstCmd = GetUnsetCmds(); - await ExecCmd(lstCmd); - } + await ExecCmd(lstCmd); + } - private static async Task ExecCmd(List lstCmd) - { - foreach (var cmd in lstCmd) - { - if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments is null) - { - continue; - } - await Task.Delay(10); - await Utils.GetCliWrapOutput(cmd.Cmd, cmd.Arguments); - } - } + private static async Task ExecCmd(List lstCmd) + { + foreach (var cmd in lstCmd) + { + if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments is null) + { + continue; + } + await Task.Delay(10); + await Utils.GetCliWrapOutput(cmd.Cmd, cmd.Arguments); + } + } - private static List GetSetCmds(string host, int port, string exceptions) - { - var isKde = IsKde(out var configDir); - List lstType = ["", "http", "https", "socks", "ftp"]; - List lstCmd = []; + private static List GetSetCmds(string host, int port, string exceptions) + { + var isKde = IsKde(out var configDir); + List lstType = ["", "http", "https", "socks", "ftp"]; + List lstCmd = []; - //GNOME - foreach (var type in lstType) - { - lstCmd.AddRange(GetSetCmd4Gnome(type, host, port)); - } - if (exceptions.IsNotEmpty()) - { - lstCmd.AddRange(GetSetCmd4Gnome("exceptions", exceptions, 0)); - } + //GNOME + foreach (var type in lstType) + { + lstCmd.AddRange(GetSetCmd4Gnome(type, host, port)); + } + if (exceptions.IsNotEmpty()) + { + lstCmd.AddRange(GetSetCmd4Gnome("exceptions", exceptions, 0)); + } - if (isKde) - { - foreach (var type in lstType) - { - lstCmd.AddRange(GetSetCmd4Kde(type, host, port, configDir)); - } - if (exceptions.IsNotEmpty()) - { - lstCmd.AddRange(GetSetCmd4Kde("exceptions", exceptions, 0, configDir)); - } + if (isKde) + { + foreach (var type in lstType) + { + lstCmd.AddRange(GetSetCmd4Kde(type, host, port, configDir)); + } + if (exceptions.IsNotEmpty()) + { + lstCmd.AddRange(GetSetCmd4Kde("exceptions", exceptions, 0, configDir)); + } - // Notify system to reload - lstCmd.Add(new CmdItem() - { - Cmd = "dbus-send", - Arguments = ["--type=signal", "/KIO/Scheduler", "org.kde.KIO.Scheduler.reparseSlaveConfiguration", "string:''"] - }); - } - return lstCmd; - } + // Notify system to reload + lstCmd.Add(new CmdItem() + { + Cmd = "dbus-send", + Arguments = ["--type=signal", "/KIO/Scheduler", "org.kde.KIO.Scheduler.reparseSlaveConfiguration", "string:''"] + }); + } + return lstCmd; + } - private static List GetUnsetCmds() - { - var isKde = IsKde(out var configDir); - List lstCmd = []; + private static List GetUnsetCmds() + { + var isKde = IsKde(out var configDir); + List lstCmd = []; - //GNOME - lstCmd.Add(new CmdItem() - { - Cmd = "gsettings", - Arguments = ["set", "org.gnome.system.proxy", "mode", "none"] - }); + //GNOME + lstCmd.Add(new CmdItem() + { + Cmd = "gsettings", + Arguments = ["set", "org.gnome.system.proxy", "mode", "none"] + }); - if (isKde) - { - lstCmd.Add(new CmdItem() - { - Cmd = GetKdeVersion(), - Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0"] - }); + if (isKde) + { + lstCmd.Add(new CmdItem() + { + Cmd = GetKdeVersion(), + Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "0"] + }); - // Notify system to reload - lstCmd.Add(new CmdItem() - { - Cmd = "dbus-send", - Arguments = ["--type=signal", "/KIO/Scheduler", "org.kde.KIO.Scheduler.reparseSlaveConfiguration", "string:''"] - }); - } - return lstCmd; - } + // Notify system to reload + lstCmd.Add(new CmdItem() + { + Cmd = "dbus-send", + Arguments = ["--type=signal", "/KIO/Scheduler", "org.kde.KIO.Scheduler.reparseSlaveConfiguration", "string:''"] + }); + } + return lstCmd; + } - private static List GetSetCmd4Kde(string type, string host, int port, string configDir) - { - List lstCmd = []; - var cmd = GetKdeVersion(); + private static List GetSetCmd4Kde(string type, string host, int port, string configDir) + { + List lstCmd = []; + var cmd = GetKdeVersion(); - if (type.IsNullOrEmpty()) - { - lstCmd.Add(new() - { - Cmd = cmd, - Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1"] - }); - } - else if (type == "exceptions") - { - lstCmd.Add(new() - { - Cmd = cmd, - Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "NoProxyFor", host] - }); - } - else - { - var type2 = type.Equals("https") ? "http" : type; - lstCmd.Add(new CmdItem() - { - Cmd = cmd, - Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", $"{type}Proxy", $"{type2}://{host}:{port}"] - }); - } + if (type.IsNullOrEmpty()) + { + lstCmd.Add(new() + { + Cmd = cmd, + Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "ProxyType", "1"] + }); + } + else if (type == "exceptions") + { + lstCmd.Add(new() + { + Cmd = cmd, + Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", "NoProxyFor", host] + }); + } + else + { + var type2 = type.Equals("https") ? "http" : type; + lstCmd.Add(new CmdItem() + { + Cmd = cmd, + Arguments = ["--file", $"{configDir}/kioslaverc", "--group", "Proxy Settings", "--key", $"{type}Proxy", $"{type2}://{host}:{port}"] + }); + } - return lstCmd; - } + return lstCmd; + } - private static List GetSetCmd4Gnome(string type, string host, int port) - { - List lstCmd = []; + private static List GetSetCmd4Gnome(string type, string host, int port) + { + List lstCmd = []; - if (type.IsNullOrEmpty()) - { - lstCmd.Add(new() - { - Cmd = "gsettings", - Arguments = ["set", "org.gnome.system.proxy", "mode", "manual"] - }); - } - else if (type == "exceptions") - { - lstCmd.Add(new() - { - Cmd = "gsettings", - Arguments = ["set", $"org.gnome.system.proxy", "ignore-hosts", JsonUtils.Serialize(host.Split(','), false)] - }); - } - else - { - lstCmd.Add(new() - { - Cmd = "gsettings", - Arguments = ["set", $"org.gnome.system.proxy.{type}", "host", host] - }); + if (type.IsNullOrEmpty()) + { + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = ["set", "org.gnome.system.proxy", "mode", "manual"] + }); + } + else if (type == "exceptions") + { + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = ["set", $"org.gnome.system.proxy", "ignore-hosts", JsonUtils.Serialize(host.Split(','), false)] + }); + } + else + { + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = ["set", $"org.gnome.system.proxy.{type}", "host", host] + }); - lstCmd.Add(new() - { - Cmd = "gsettings", - Arguments = ["set", $"org.gnome.system.proxy.{type}", "port", $"{port}"] - }); - } + lstCmd.Add(new() + { + Cmd = "gsettings", + Arguments = ["set", $"org.gnome.system.proxy.{type}", "port", $"{port}"] + }); + } - return lstCmd; - } + return lstCmd; + } - private static bool IsKde(out string configDir) - { - configDir = "/home"; - var desktop = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP"); - var desktop2 = Environment.GetEnvironmentVariable("XDG_SESSION_DESKTOP"); - var isKde = string.Equals(desktop, "KDE", StringComparison.OrdinalIgnoreCase) - || string.Equals(desktop, "plasma", StringComparison.OrdinalIgnoreCase) - || string.Equals(desktop2, "KDE", StringComparison.OrdinalIgnoreCase) - || string.Equals(desktop2, "plasma", StringComparison.OrdinalIgnoreCase); - if (isKde) - { - var homeDir = Environment.GetEnvironmentVariable("HOME"); - if (homeDir != null) - { - configDir = Path.Combine(homeDir, ".config"); - } - } + private static bool IsKde(out string configDir) + { + configDir = "/home"; + var desktop = Environment.GetEnvironmentVariable("XDG_CURRENT_DESKTOP"); + var desktop2 = Environment.GetEnvironmentVariable("XDG_SESSION_DESKTOP"); + var isKde = string.Equals(desktop, "KDE", StringComparison.OrdinalIgnoreCase) + || string.Equals(desktop, "plasma", StringComparison.OrdinalIgnoreCase) + || string.Equals(desktop2, "KDE", StringComparison.OrdinalIgnoreCase) + || string.Equals(desktop2, "plasma", StringComparison.OrdinalIgnoreCase); + if (isKde) + { + var homeDir = Environment.GetEnvironmentVariable("HOME"); + if (homeDir != null) + { + configDir = Path.Combine(homeDir, ".config"); + } + } - return isKde; - } + return isKde; + } - private static string GetKdeVersion() - { - var ver = Environment.GetEnvironmentVariable("KDE_SESSION_VERSION") ?? "0"; - return ver switch - { - "6" => "kwriteconfig6", - _ => "kwriteconfig5" - }; - } - } -} \ No newline at end of file + private static string GetKdeVersion() + { + var ver = Environment.GetEnvironmentVariable("KDE_SESSION_VERSION") ?? "0"; + return ver switch + { + "6" => "kwriteconfig6", + _ => "kwriteconfig5" + }; + } + } +} diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs index 33f6f36b..3b542dab 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingOSX.cs @@ -1,101 +1,101 @@ -namespace ServiceLib.Handler.SysProxy +namespace ServiceLib.Handler.SysProxy { - public class ProxySettingOSX - { - /// - /// 应用接口类型 - /// - private static readonly List LstInterface = ["Ethernet", "Wi-Fi", "Thunderbolt Bridge", "USB 10/100/1000 LAN"]; + public class ProxySettingOSX + { + /// + /// 应用接口类型 + /// + private static readonly List LstInterface = ["Ethernet", "Wi-Fi", "Thunderbolt Bridge", "USB 10/100/1000 LAN"]; - /// - /// 代理类型,对应 http,https,socks - /// - private static readonly List LstTypes = ["setwebproxy", "setsecurewebproxy", "setsocksfirewallproxy"]; + /// + /// 代理类型,对应 http,https,socks + /// + private static readonly List LstTypes = ["setwebproxy", "setsecurewebproxy", "setsocksfirewallproxy"]; - public static async Task SetProxy(string host, int port, string exceptions) - { - var lstInterface = await GetListNetworkServices(); - var lstCmd = GetSetCmds(lstInterface, host, port, exceptions); - await ExecCmd(lstCmd); - } + public static async Task SetProxy(string host, int port, string exceptions) + { + var lstInterface = await GetListNetworkServices(); + var lstCmd = GetSetCmds(lstInterface, host, port, exceptions); + await ExecCmd(lstCmd); + } - public static async Task UnsetProxy() - { - var lstInterface = await GetListNetworkServices(); - var lstCmd = GetUnsetCmds(lstInterface); - await ExecCmd(lstCmd); - } + public static async Task UnsetProxy() + { + var lstInterface = await GetListNetworkServices(); + var lstCmd = GetUnsetCmds(lstInterface); + await ExecCmd(lstCmd); + } - private static async Task ExecCmd(List lstCmd) - { - foreach (var cmd in lstCmd) - { - if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments is null) - { - continue; - } + private static async Task ExecCmd(List lstCmd) + { + foreach (var cmd in lstCmd) + { + if (cmd is null || cmd.Cmd.IsNullOrEmpty() || cmd.Arguments is null) + { + continue; + } - await Task.Delay(10); - await Utils.GetCliWrapOutput(cmd.Cmd, cmd.Arguments); - } - } + await Task.Delay(10); + await Utils.GetCliWrapOutput(cmd.Cmd, cmd.Arguments); + } + } - private static List GetSetCmds(List lstInterface, string host, int port, string exceptions) - { - List lstCmd = []; - foreach (var interf in lstInterface) - { - foreach (var type in LstTypes) - { - lstCmd.Add(new CmdItem() - { - Cmd = "networksetup", - Arguments = [$"-{type}", interf, host, port.ToString()] - }); - } - if (exceptions.IsNotEmpty()) - { - List args = [$"-setproxybypassdomains", interf]; - args.AddRange(exceptions.Split(',')); - lstCmd.Add(new CmdItem() - { - Cmd = "networksetup", - Arguments = args - }); - } - } + private static List GetSetCmds(List lstInterface, string host, int port, string exceptions) + { + List lstCmd = []; + foreach (var interf in lstInterface) + { + foreach (var type in LstTypes) + { + lstCmd.Add(new CmdItem() + { + Cmd = "networksetup", + Arguments = [$"-{type}", interf, host, port.ToString()] + }); + } + if (exceptions.IsNotEmpty()) + { + List args = [$"-setproxybypassdomains", interf]; + args.AddRange(exceptions.Split(',')); + lstCmd.Add(new CmdItem() + { + Cmd = "networksetup", + Arguments = args + }); + } + } - return lstCmd; - } + return lstCmd; + } - private static List GetUnsetCmds(List lstInterface) - { - List lstCmd = []; - foreach (var interf in lstInterface) - { - foreach (var type in LstTypes) - { - lstCmd.Add(new CmdItem() - { - Cmd = "networksetup", - Arguments = [$"-{type}state", interf, "off"] - }); - } - } + private static List GetUnsetCmds(List lstInterface) + { + List lstCmd = []; + foreach (var interf in lstInterface) + { + foreach (var type in LstTypes) + { + lstCmd.Add(new CmdItem() + { + Cmd = "networksetup", + Arguments = [$"-{type}state", interf, "off"] + }); + } + } - return lstCmd; - } + return lstCmd; + } - public static async Task> GetListNetworkServices() - { - var services = await Utils.GetListNetworkServices(); - if (services.IsNullOrEmpty()) - { - return LstInterface; - } + public static async Task> GetListNetworkServices() + { + var services = await Utils.GetListNetworkServices(); + if (services.IsNullOrEmpty()) + { + return LstInterface; + } - var lst = services.Split(Environment.NewLine).Where(t => t.Length > 0 && t.Contains('*') == false); - return lst.ToList(); - } - } -} \ No newline at end of file + var lst = services.Split(Environment.NewLine).Where(t => t.Length > 0 && t.Contains('*') == false); + return lst.ToList(); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs index 8d6dbc13..d5e007f6 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/ProxySettingWindows.cs @@ -3,357 +3,358 @@ using static ServiceLib.Handler.SysProxy.ProxySettingWindows.InternetConnectionO namespace ServiceLib.Handler.SysProxy { - public class ProxySettingWindows - { - private const string _regPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings"; + public class ProxySettingWindows + { + private const string _regPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings"; - private static bool SetProxyFallback(string? strProxy, string? exceptions, int type) - { - if (type == 1) - { - WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 0); - WindowsUtils.RegWriteValue(_regPath, "ProxyServer", string.Empty); - WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); - WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); - } - if (type == 2) - { - WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 1); - WindowsUtils.RegWriteValue(_regPath, "ProxyServer", strProxy ?? string.Empty); - WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", exceptions ?? string.Empty); - WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); - } - else if (type == 4) - { - WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 0); - WindowsUtils.RegWriteValue(_regPath, "ProxyServer", string.Empty); - WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); - WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", strProxy ?? string.Empty); - } - return true; - } + private static bool SetProxyFallback(string? strProxy, string? exceptions, int type) + { + if (type == 1) + { + WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 0); + WindowsUtils.RegWriteValue(_regPath, "ProxyServer", string.Empty); + WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); + WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); + } + if (type == 2) + { + WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 1); + WindowsUtils.RegWriteValue(_regPath, "ProxyServer", strProxy ?? string.Empty); + WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", exceptions ?? string.Empty); + WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", string.Empty); + } + else if (type == 4) + { + WindowsUtils.RegWriteValue(_regPath, "ProxyEnable", 0); + WindowsUtils.RegWriteValue(_regPath, "ProxyServer", string.Empty); + WindowsUtils.RegWriteValue(_regPath, "ProxyOverride", string.Empty); + WindowsUtils.RegWriteValue(_regPath, "AutoConfigURL", strProxy ?? string.Empty); + } + return true; + } - /// - // set to use no proxy - /// - /// Error message with win32 error code - public static bool UnsetProxy() - { - return SetProxy(null, null, 1); - } + /// + // set to use no proxy + /// + /// Error message with win32 error code + public static bool UnsetProxy() + { + return SetProxy(null, null, 1); + } - /// - /// Set system proxy settings - /// - /// proxy address - /// exception addresses that do not use proxy - /// type of proxy defined in PerConnFlags - /// PROXY_TYPE_DIRECT = 0x00000001, // direct connection (no proxy) - /// PROXY_TYPE_PROXY = 0x00000002, // via named proxy - /// PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy script URL - /// PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection - /// - /// Error message with win32 error code - /// true: one of connection is successfully updated proxy settings - public static bool SetProxy(string? strProxy, string? exceptions, int type) - { - try - { - // set proxy for LAN - bool result = SetConnectionProxy(null, strProxy, exceptions, type); - // set proxy for dial up connections - var connections = EnumerateRasEntries(); - foreach (var connection in connections) - { - result |= SetConnectionProxy(connection, strProxy, exceptions, type); - } - return result; - } - catch (Exception ex) - { - SetProxyFallback(strProxy, exceptions, type); - return false; - } - } + /// + /// Set system proxy settings + /// + /// proxy address + /// exception addresses that do not use proxy + /// type of proxy defined in PerConnFlags + /// PROXY_TYPE_DIRECT = 0x00000001, // direct connection (no proxy) + /// PROXY_TYPE_PROXY = 0x00000002, // via named proxy + /// PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy script URL + /// PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection + /// + /// Error message with win32 error code + /// true: one of connection is successfully updated proxy settings + public static bool SetProxy(string? strProxy, string? exceptions, int type) + { + try + { + // set proxy for LAN + bool result = SetConnectionProxy(null, strProxy, exceptions, type); + // set proxy for dial up connections + var connections = EnumerateRasEntries(); + foreach (var connection in connections) + { + result |= SetConnectionProxy(connection, strProxy, exceptions, type); + } + return result; + } + catch (Exception ex) + { + SetProxyFallback(strProxy, exceptions, type); + return false; + } + } - private static bool SetConnectionProxy(string? connectionName, string? strProxy, string? exceptions, int type) - { - InternetPerConnOptionList list = new(); + private static bool SetConnectionProxy(string? connectionName, string? strProxy, string? exceptions, int type) + { + InternetPerConnOptionList list = new(); - int optionCount = 1; - if (type == 1) // No proxy - { - optionCount = 1; - } - else if (type is 2 or 4) // named proxy or autoproxy script URL - { - optionCount = string.IsNullOrEmpty(exceptions) ? 2 : 3; - } + int optionCount = 1; + if (type == 1) // No proxy + { + optionCount = 1; + } + else if (type is 2 or 4) // named proxy or autoproxy script URL + { + optionCount = string.IsNullOrEmpty(exceptions) ? 2 : 3; + } - int m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; - PerConnOption m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; - if (type == 2) // named proxy - { - m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY); - m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; - } - else if (type == 4) // autoproxy script url - { - m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL); - m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; - } + int m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; + PerConnOption m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + if (type == 2) // named proxy + { + m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY); + m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; + } + else if (type == 4) // autoproxy script url + { + m_Int = (int)(PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL); + m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; + } - //int optionCount = Utile.IsNullOrEmpty(strProxy) ? 1 : (Utile.IsNullOrEmpty(exceptions) ? 2 : 3); - InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; - // USE a proxy server ... - options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; - //options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); - options[0].m_Value.m_Int = m_Int; - // use THIS proxy server - if (optionCount > 1) - { - options[1].m_Option = m_Option; - options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); // !! remember to deallocate memory 1 - // except for these addresses ... - if (optionCount > 2) - { - options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; - options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); // !! remember to deallocate memory 2 - } - } + //int optionCount = Utile.IsNullOrEmpty(strProxy) ? 1 : (Utile.IsNullOrEmpty(exceptions) ? 2 : 3); + InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; + // USE a proxy server ... + options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; + //options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); + options[0].m_Value.m_Int = m_Int; + // use THIS proxy server + if (optionCount > 1) + { + options[1].m_Option = m_Option; + options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); // !! remember to deallocate memory 1 + // except for these addresses ... + if (optionCount > 2) + { + options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; + options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); // !! remember to deallocate memory 2 + } + } - // default stuff - list.dwSize = Marshal.SizeOf(list); - if (connectionName != null) - { - list.szConnection = Marshal.StringToHGlobalAuto(connectionName); // !! remember to deallocate memory 3 - } - else - { - list.szConnection = nint.Zero; - } - list.dwOptionCount = options.Length; - list.dwOptionError = 0; + // default stuff + list.dwSize = Marshal.SizeOf(list); + if (connectionName != null) + { + list.szConnection = Marshal.StringToHGlobalAuto(connectionName); // !! remember to deallocate memory 3 + } + else + { + list.szConnection = nint.Zero; + } + list.dwOptionCount = options.Length; + list.dwOptionError = 0; - int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); - // make a pointer out of all that ... - nint optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // !! remember to deallocate memory 4 - // copy the array over into that spot in memory ... - for (int i = 0; i < options.Length; ++i) - { - if (Environment.Is64BitOperatingSystem) - { - nint opt = new(optionsPtr.ToInt64() + (i * optSize)); - Marshal.StructureToPtr(options[i], opt, false); - } - else - { - nint opt = new(optionsPtr.ToInt32() + (i * optSize)); - Marshal.StructureToPtr(options[i], opt, false); - } - } + int optSize = Marshal.SizeOf(typeof(InternetConnectionOption)); + // make a pointer out of all that ... + nint optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // !! remember to deallocate memory 4 + // copy the array over into that spot in memory ... + for (int i = 0; i < options.Length; ++i) + { + if (Environment.Is64BitOperatingSystem) + { + nint opt = new(optionsPtr.ToInt64() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + else + { + nint opt = new(optionsPtr.ToInt32() + (i * optSize)); + Marshal.StructureToPtr(options[i], opt, false); + } + } - list.options = optionsPtr; + list.options = optionsPtr; - // and then make a pointer out of the whole list - nint ipcoListPtr = Marshal.AllocCoTaskMem(list.dwSize); // !! remember to deallocate memory 5 - Marshal.StructureToPtr(list, ipcoListPtr, false); + // and then make a pointer out of the whole list + nint ipcoListPtr = Marshal.AllocCoTaskMem(list.dwSize); // !! remember to deallocate memory 5 + Marshal.StructureToPtr(list, ipcoListPtr, false); - // and finally, call the API method! - bool isSuccess = NativeMethods.InternetSetOption(nint.Zero, - InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, - ipcoListPtr, list.dwSize); - int returnvalue = 0; // ERROR_SUCCESS - if (!isSuccess) - { // get the error codes, they might be helpful - returnvalue = Marshal.GetLastPInvokeError(); - } - else - { - // Notify the system that the registry settings have been changed and cause them to be refreshed - NativeMethods.InternetSetOption(nint.Zero, InternetOption.INTERNET_OPTION_SETTINGS_CHANGED, nint.Zero, 0); - NativeMethods.InternetSetOption(nint.Zero, InternetOption.INTERNET_OPTION_REFRESH, nint.Zero, 0); - } + // and finally, call the API method! + bool isSuccess = NativeMethods.InternetSetOption(nint.Zero, + InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, + ipcoListPtr, list.dwSize); + int returnvalue = 0; // ERROR_SUCCESS + if (!isSuccess) + { // get the error codes, they might be helpful + returnvalue = Marshal.GetLastPInvokeError(); + } + else + { + // Notify the system that the registry settings have been changed and cause them to be refreshed + NativeMethods.InternetSetOption(nint.Zero, InternetOption.INTERNET_OPTION_SETTINGS_CHANGED, nint.Zero, 0); + NativeMethods.InternetSetOption(nint.Zero, InternetOption.INTERNET_OPTION_REFRESH, nint.Zero, 0); + } - // FREE the data ASAP - if (list.szConnection != nint.Zero) Marshal.FreeHGlobal(list.szConnection); // release mem 3 - if (optionCount > 1) - { - Marshal.FreeHGlobal(options[1].m_Value.m_StringPtr); // release mem 1 - if (optionCount > 2) - { - Marshal.FreeHGlobal(options[2].m_Value.m_StringPtr); // release mem 2 - } - } - Marshal.FreeCoTaskMem(optionsPtr); // release mem 4 - Marshal.FreeCoTaskMem(ipcoListPtr); // release mem 5 - if (returnvalue != 0) - { - // throw the error codes, they might be helpful - throw new ApplicationException($"Set Internet Proxy failed with error code: {Marshal.GetLastWin32Error()}"); - } + // FREE the data ASAP + if (list.szConnection != nint.Zero) + Marshal.FreeHGlobal(list.szConnection); // release mem 3 + if (optionCount > 1) + { + Marshal.FreeHGlobal(options[1].m_Value.m_StringPtr); // release mem 1 + if (optionCount > 2) + { + Marshal.FreeHGlobal(options[2].m_Value.m_StringPtr); // release mem 2 + } + } + Marshal.FreeCoTaskMem(optionsPtr); // release mem 4 + Marshal.FreeCoTaskMem(ipcoListPtr); // release mem 5 + if (returnvalue != 0) + { + // throw the error codes, they might be helpful + throw new ApplicationException($"Set Internet Proxy failed with error code: {Marshal.GetLastWin32Error()}"); + } - return true; - } + return true; + } - /// - /// Retrieve list of connections including LAN and WAN to support PPPoE connection - /// - /// A list of RAS connection names. May be empty list if no dial up connection. - /// Error message with win32 error code - private static IEnumerable EnumerateRasEntries() - { - int entries = 0; - // attempt to query with 1 entry buffer - RASENTRYNAME[] rasEntryNames = new RASENTRYNAME[1]; - int bufferSize = Marshal.SizeOf(typeof(RASENTRYNAME)); - rasEntryNames[0].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME)); + /// + /// Retrieve list of connections including LAN and WAN to support PPPoE connection + /// + /// A list of RAS connection names. May be empty list if no dial up connection. + /// Error message with win32 error code + private static IEnumerable EnumerateRasEntries() + { + int entries = 0; + // attempt to query with 1 entry buffer + RASENTRYNAME[] rasEntryNames = new RASENTRYNAME[1]; + int bufferSize = Marshal.SizeOf(typeof(RASENTRYNAME)); + rasEntryNames[0].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME)); - uint result = NativeMethods.RasEnumEntries(null, null, rasEntryNames, ref bufferSize, ref entries); - // increase buffer if the buffer is not large enough - if (result == (uint)ErrorCode.ERROR_BUFFER_TOO_SMALL) - { - rasEntryNames = new RASENTRYNAME[bufferSize / Marshal.SizeOf(typeof(RASENTRYNAME))]; - for (int i = 0; i < rasEntryNames.Length; i++) - { - rasEntryNames[i].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME)); - } + uint result = NativeMethods.RasEnumEntries(null, null, rasEntryNames, ref bufferSize, ref entries); + // increase buffer if the buffer is not large enough + if (result == (uint)ErrorCode.ERROR_BUFFER_TOO_SMALL) + { + rasEntryNames = new RASENTRYNAME[bufferSize / Marshal.SizeOf(typeof(RASENTRYNAME))]; + for (int i = 0; i < rasEntryNames.Length; i++) + { + rasEntryNames[i].dwSize = Marshal.SizeOf(typeof(RASENTRYNAME)); + } - result = NativeMethods.RasEnumEntries(null, null, rasEntryNames, ref bufferSize, ref entries); - } - if (result == 0) - { - var entryNames = new List(); - for (int i = 0; i < entries; i++) - { - entryNames.Add(rasEntryNames[i].szEntryName); - } + result = NativeMethods.RasEnumEntries(null, null, rasEntryNames, ref bufferSize, ref entries); + } + if (result == 0) + { + var entryNames = new List(); + for (int i = 0; i < entries; i++) + { + entryNames.Add(rasEntryNames[i].szEntryName); + } - return entryNames; - } - throw new ApplicationException($"RasEnumEntries failed with error code: {result}"); - } + return entryNames; + } + throw new ApplicationException($"RasEnumEntries failed with error code: {result}"); + } - #region WinInet structures + #region WinInet structures - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public struct InternetPerConnOptionList - { - public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct - public nint szConnection; // connection name to set/query options - public int dwOptionCount; // number of options to set/query - public int dwOptionError; // on error, which option failed + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetPerConnOptionList + { + public int dwSize; // size of the INTERNET_PER_CONN_OPTION_LIST struct + public nint szConnection; // connection name to set/query options + public int dwOptionCount; // number of options to set/query + public int dwOptionError; // on error, which option failed - //[MarshalAs(UnmanagedType.)] - public nint options; - } + //[MarshalAs(UnmanagedType.)] + public nint options; + } - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public struct InternetConnectionOption - { - private static readonly int Size; - public PerConnOption m_Option; - public InternetConnectionOptionValue m_Value; + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct InternetConnectionOption + { + private static readonly int Size; + public PerConnOption m_Option; + public InternetConnectionOptionValue m_Value; - static InternetConnectionOption() - { - Size = Marshal.SizeOf(typeof(InternetConnectionOption)); - } + static InternetConnectionOption() + { + Size = Marshal.SizeOf(typeof(InternetConnectionOption)); + } - // Nested Types - [StructLayout(LayoutKind.Explicit)] - public struct InternetConnectionOptionValue - { - // Fields - [FieldOffset(0)] - public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; + // Nested Types + [StructLayout(LayoutKind.Explicit)] + public struct InternetConnectionOptionValue + { + // Fields + [FieldOffset(0)] + public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime; - [FieldOffset(0)] - public int m_Int; + [FieldOffset(0)] + public int m_Int; - [FieldOffset(0)] - public nint m_StringPtr; - } + [FieldOffset(0)] + public nint m_StringPtr; + } - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] - public struct RASENTRYNAME - { - public int dwSize; + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct RASENTRYNAME + { + public int dwSize; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)] - public string szEntryName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)] + public string szEntryName; - public int dwFlags; + public int dwFlags; - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)] - public string szPhonebookPath; - } + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)] + public string szPhonebookPath; + } - // Constants - public const int RAS_MaxEntryName = 256; + // Constants + public const int RAS_MaxEntryName = 256; - public const int MAX_PATH = 260; // Standard MAX_PATH value in Windows - } + public const int MAX_PATH = 260; // Standard MAX_PATH value in Windows + } - #endregion WinInet structures + #endregion WinInet structures - #region WinInet enums + #region WinInet enums - // - // options manifests for Internet{Query|Set}Option - // - public enum InternetOption : uint - { - INTERNET_OPTION_PER_CONNECTION_OPTION = 75, - INTERNET_OPTION_REFRESH = 37, - INTERNET_OPTION_SETTINGS_CHANGED = 39 - } + // + // options manifests for Internet{Query|Set}Option + // + public enum InternetOption : uint + { + INTERNET_OPTION_PER_CONNECTION_OPTION = 75, + INTERNET_OPTION_REFRESH = 37, + INTERNET_OPTION_SETTINGS_CHANGED = 39 + } - // - // Options used in INTERNET_PER_CONN_OPTON struct - // - public enum PerConnOption - { - INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags - INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. - INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. - INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. - } + // + // Options used in INTERNET_PER_CONN_OPTON struct + // + public enum PerConnOption + { + INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags + INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers. + INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server. + INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script. + } - // - // PER_CONN_FLAGS - // - [Flags] - public enum PerConnFlags - { - PROXY_TYPE_DIRECT = 0x00000001, // direct to net - PROXY_TYPE_PROXY = 0x00000002, // via named proxy - PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL - PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection - } + // + // PER_CONN_FLAGS + // + [Flags] + public enum PerConnFlags + { + PROXY_TYPE_DIRECT = 0x00000001, // direct to net + PROXY_TYPE_PROXY = 0x00000002, // via named proxy + PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL + PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection + } - public enum ErrorCode : uint - { - ERROR_BUFFER_TOO_SMALL = 603, - ERROR_INVALID_SIZE = 632 - } + public enum ErrorCode : uint + { + ERROR_BUFFER_TOO_SMALL = 603, + ERROR_INVALID_SIZE = 632 + } - #endregion WinInet enums + #endregion WinInet enums - internal static class NativeMethods - { - [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool InternetSetOption(nint hInternet, InternetOption dwOption, nint lpBuffer, int dwBufferLength); + internal static class NativeMethods + { + [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool InternetSetOption(nint hInternet, InternetOption dwOption, nint lpBuffer, int dwBufferLength); - [DllImport("Rasapi32.dll", CharSet = CharSet.Auto)] - public static extern uint RasEnumEntries( - string? reserved, // Reserved, must be null - string? lpszPhonebook, // Pointer to full path and filename of phone-book file. If this parameter is NULL, the entries are enumerated from all the remote access phone-book files - [In, Out] RASENTRYNAME[]? lprasentryname, // Buffer to receive RAS entry names - ref int lpcb, // Size of the buffer - ref int lpcEntries // Number of entries written to the buffer - ); - } - } -} \ No newline at end of file + [DllImport("Rasapi32.dll", CharSet = CharSet.Auto)] + public static extern uint RasEnumEntries( + string? reserved, // Reserved, must be null + string? lpszPhonebook, // Pointer to full path and filename of phone-book file. If this parameter is NULL, the entries are enumerated from all the remote access phone-book files + [In, Out] RASENTRYNAME[]? lprasentryname, // Buffer to receive RAS entry names + ref int lpcb, // Size of the buffer + ref int lpcEntries // Number of entries written to the buffer + ); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs index 99cc991a..a32b4374 100644 --- a/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs +++ b/v2rayN/ServiceLib/Handler/SysProxy/SysProxyHandler.cs @@ -1,99 +1,99 @@ -namespace ServiceLib.Handler.SysProxy +namespace ServiceLib.Handler.SysProxy { - public static class SysProxyHandler - { - private static readonly string _tag = "SysProxyHandler"; + public static class SysProxyHandler + { + private static readonly string _tag = "SysProxyHandler"; - public static async Task UpdateSysProxy(Config config, bool forceDisable) - { - var type = config.SystemProxyItem.SysProxyType; + public static async Task UpdateSysProxy(Config config, bool forceDisable) + { + var type = config.SystemProxyItem.SysProxyType; - if (forceDisable && type != ESysProxyType.Unchanged) - { - type = ESysProxyType.ForcedClear; - } + if (forceDisable && type != ESysProxyType.Unchanged) + { + type = ESysProxyType.ForcedClear; + } - try - { - var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); - var exceptions = config.SystemProxyItem.SystemProxyExceptions.Replace(" ", ""); - if (port <= 0) - { - return false; - } - switch (type) - { - case ESysProxyType.ForcedChange when Utils.IsWindows(): - { - GetWindowsProxyString(config, port, out var strProxy, out var strExceptions); - ProxySettingWindows.SetProxy(strProxy, strExceptions, 2); - break; - } - case ESysProxyType.ForcedChange when Utils.IsLinux(): - await ProxySettingLinux.SetProxy(Global.Loopback, port, exceptions); - break; + try + { + var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); + var exceptions = config.SystemProxyItem.SystemProxyExceptions.Replace(" ", ""); + if (port <= 0) + { + return false; + } + switch (type) + { + case ESysProxyType.ForcedChange when Utils.IsWindows(): + { + GetWindowsProxyString(config, port, out var strProxy, out var strExceptions); + ProxySettingWindows.SetProxy(strProxy, strExceptions, 2); + break; + } + case ESysProxyType.ForcedChange when Utils.IsLinux(): + await ProxySettingLinux.SetProxy(Global.Loopback, port, exceptions); + break; - case ESysProxyType.ForcedChange when Utils.IsOSX(): - await ProxySettingOSX.SetProxy(Global.Loopback, port, exceptions); - break; + case ESysProxyType.ForcedChange when Utils.IsOSX(): + await ProxySettingOSX.SetProxy(Global.Loopback, port, exceptions); + break; - case ESysProxyType.ForcedClear when Utils.IsWindows(): - ProxySettingWindows.UnsetProxy(); - break; + case ESysProxyType.ForcedClear when Utils.IsWindows(): + ProxySettingWindows.UnsetProxy(); + break; - case ESysProxyType.ForcedClear when Utils.IsLinux(): - await ProxySettingLinux.UnsetProxy(); - break; + case ESysProxyType.ForcedClear when Utils.IsLinux(): + await ProxySettingLinux.UnsetProxy(); + break; - case ESysProxyType.ForcedClear when Utils.IsOSX(): - await ProxySettingOSX.UnsetProxy(); - break; + case ESysProxyType.ForcedClear when Utils.IsOSX(): + await ProxySettingOSX.UnsetProxy(); + break; - case ESysProxyType.Pac when Utils.IsWindows(): - await SetWindowsProxyPac(port); - break; - } + case ESysProxyType.Pac when Utils.IsWindows(): + await SetWindowsProxyPac(port); + break; + } - if (type != ESysProxyType.Pac && Utils.IsWindows()) - { - PacHandler.Stop(); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return true; - } + if (type != ESysProxyType.Pac && Utils.IsWindows()) + { + PacHandler.Stop(); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return true; + } - private static void GetWindowsProxyString(Config config, int port, out string strProxy, out string strExceptions) - { - strExceptions = config.SystemProxyItem.SystemProxyExceptions.Replace(" ", ""); - if (config.SystemProxyItem.NotProxyLocalAddress) - { - strExceptions = $";{strExceptions}"; - } + private static void GetWindowsProxyString(Config config, int port, out string strProxy, out string strExceptions) + { + strExceptions = config.SystemProxyItem.SystemProxyExceptions.Replace(" ", ""); + if (config.SystemProxyItem.NotProxyLocalAddress) + { + strExceptions = $";{strExceptions}"; + } - strProxy = string.Empty; - if (Utils.IsNullOrEmpty(config.SystemProxyItem.SystemProxyAdvancedProtocol)) - { - strProxy = $"{Global.Loopback}:{port}"; - } - else - { - strProxy = config.SystemProxyItem.SystemProxyAdvancedProtocol - .Replace("{ip}", Global.Loopback) - .Replace("{http_port}", port.ToString()) - .Replace("{socks_port}", port.ToString()); - } - } + strProxy = string.Empty; + if (Utils.IsNullOrEmpty(config.SystemProxyItem.SystemProxyAdvancedProtocol)) + { + strProxy = $"{Global.Loopback}:{port}"; + } + else + { + strProxy = config.SystemProxyItem.SystemProxyAdvancedProtocol + .Replace("{ip}", Global.Loopback) + .Replace("{http_port}", port.ToString()) + .Replace("{socks_port}", port.ToString()); + } + } - private static async Task SetWindowsProxyPac(int port) - { - var portPac = AppHandler.Instance.GetLocalPort(EInboundProtocol.pac); - await PacHandler.Start(Utils.GetConfigPath(), port, portPac); - var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; - ProxySettingWindows.SetProxy(strProxy, "", 4); - } - } -} \ No newline at end of file + private static async Task SetWindowsProxyPac(int port) + { + var portPac = AppHandler.Instance.GetLocalPort(EInboundProtocol.pac); + await PacHandler.Start(Utils.GetConfigPath(), port, portPac); + var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; + ProxySettingWindows.SetProxy(strProxy, "", 4); + } + } +} diff --git a/v2rayN/ServiceLib/Handler/TaskHandler.cs b/v2rayN/ServiceLib/Handler/TaskHandler.cs index 3d04a33d..9e9231d5 100644 --- a/v2rayN/ServiceLib/Handler/TaskHandler.cs +++ b/v2rayN/ServiceLib/Handler/TaskHandler.cs @@ -1,72 +1,72 @@ -namespace ServiceLib.Handler +namespace ServiceLib.Handler { - public class TaskHandler - { - private static readonly Lazy _instance = new(() => new()); - public static TaskHandler Instance => _instance.Value; + public class TaskHandler + { + private static readonly Lazy _instance = new(() => new()); + public static TaskHandler Instance => _instance.Value; - public void RegUpdateTask(Config config, Action updateFunc) - { - Task.Run(() => UpdateTaskRunSubscription(config, updateFunc)); - Task.Run(() => UpdateTaskRunGeo(config, updateFunc)); - } + public void RegUpdateTask(Config config, Action updateFunc) + { + Task.Run(() => UpdateTaskRunSubscription(config, updateFunc)); + Task.Run(() => UpdateTaskRunGeo(config, updateFunc)); + } - private async Task UpdateTaskRunSubscription(Config config, Action updateFunc) - { - await Task.Delay(60000); - Logging.SaveLog("UpdateTaskRunSubscription"); + private async Task UpdateTaskRunSubscription(Config config, Action updateFunc) + { + await Task.Delay(60000); + Logging.SaveLog("UpdateTaskRunSubscription"); - var updateHandle = new UpdateService(); - while (true) - { - var updateTime = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds(); - var lstSubs = (await AppHandler.Instance.SubItems()) - .Where(t => t.AutoUpdateInterval > 0) - .Where(t => updateTime - t.UpdateTime >= t.AutoUpdateInterval * 60) - .ToList(); + var updateHandle = new UpdateService(); + while (true) + { + var updateTime = ((DateTimeOffset)DateTime.Now).ToUnixTimeSeconds(); + var lstSubs = (await AppHandler.Instance.SubItems()) + .Where(t => t.AutoUpdateInterval > 0) + .Where(t => updateTime - t.UpdateTime >= t.AutoUpdateInterval * 60) + .ToList(); - foreach (var item in lstSubs) - { - await updateHandle.UpdateSubscriptionProcess(config, item.Id, true, (bool success, string msg) => - { - updateFunc?.Invoke(success, msg); - if (success) - Logging.SaveLog("subscription" + msg); - }); - item.UpdateTime = updateTime; - await ConfigHandler.AddSubItem(config, item); + foreach (var item in lstSubs) + { + await updateHandle.UpdateSubscriptionProcess(config, item.Id, true, (bool success, string msg) => + { + updateFunc?.Invoke(success, msg); + if (success) + Logging.SaveLog("subscription" + msg); + }); + item.UpdateTime = updateTime; + await ConfigHandler.AddSubItem(config, item); - await Task.Delay(5000); - } - await Task.Delay(60000); - } - } + await Task.Delay(5000); + } + await Task.Delay(60000); + } + } - private async Task UpdateTaskRunGeo(Config config, Action updateFunc) - { - var autoUpdateGeoTime = DateTime.Now; + private async Task UpdateTaskRunGeo(Config config, Action updateFunc) + { + var autoUpdateGeoTime = DateTime.Now; - //await Task.Delay(1000 * 120); - Logging.SaveLog("UpdateTaskRunGeo"); + //await Task.Delay(1000 * 120); + Logging.SaveLog("UpdateTaskRunGeo"); - var updateHandle = new UpdateService(); - while (true) - { - await Task.Delay(1000 * 3600); + var updateHandle = new UpdateService(); + while (true) + { + await Task.Delay(1000 * 3600); - var dtNow = DateTime.Now; - if (config.GuiItem.AutoUpdateInterval > 0) - { - if ((dtNow - autoUpdateGeoTime).Hours % config.GuiItem.AutoUpdateInterval == 0) - { - await updateHandle.UpdateGeoFileAll(config, (bool success, string msg) => - { - updateFunc?.Invoke(false, msg); - }); - autoUpdateGeoTime = dtNow; - } - } - } - } - } -} \ No newline at end of file + var dtNow = DateTime.Now; + if (config.GuiItem.AutoUpdateInterval > 0) + { + if ((dtNow - autoUpdateGeoTime).Hours % config.GuiItem.AutoUpdateInterval == 0) + { + await updateHandle.UpdateGeoFileAll(config, (bool success, string msg) => + { + updateFunc?.Invoke(false, msg); + }); + autoUpdateGeoTime = dtNow; + } + } + } + } + } +} diff --git a/v2rayN/ServiceLib/Handler/WebDavHandler.cs b/v2rayN/ServiceLib/Handler/WebDavHandler.cs index d661eb66..cfb71cf1 100644 --- a/v2rayN/ServiceLib/Handler/WebDavHandler.cs +++ b/v2rayN/ServiceLib/Handler/WebDavHandler.cs @@ -1,179 +1,180 @@ -using System.Net; +using System.Net; using WebDav; namespace ServiceLib.Handler { - public sealed class WebDavHandler - { - private static readonly Lazy _instance = new(() => new()); - public static WebDavHandler Instance => _instance.Value; + public sealed class WebDavHandler + { + private static readonly Lazy _instance = new(() => new()); + public static WebDavHandler Instance => _instance.Value; - private Config? _config; - private WebDavClient? _client; - private string? _lastDescription; - private string _webDir = Global.AppName + "_backup"; - private readonly string _webFileName = "backup.zip"; - private readonly string _tag = "WebDav--"; + private Config? _config; + private WebDavClient? _client; + private string? _lastDescription; + private string _webDir = Global.AppName + "_backup"; + private readonly string _webFileName = "backup.zip"; + private readonly string _tag = "WebDav--"; - public WebDavHandler() - { - _config = AppHandler.Instance.Config; - } + public WebDavHandler() + { + _config = AppHandler.Instance.Config; + } - private async Task GetClient() - { - try - { - if (_config.WebDavItem.Url.IsNullOrEmpty() - || _config.WebDavItem.UserName.IsNullOrEmpty() - || _config.WebDavItem.Password.IsNullOrEmpty()) - { - throw new ArgumentException("webdav parameter error or null"); - } - if (_client != null) - { - _client?.Dispose(); - _client = null; - } - if (_config.WebDavItem.DirName.IsNullOrEmpty()) - { - _webDir = Global.AppName + "_backup"; - } - else - { - _webDir = _config.WebDavItem.DirName.TrimEx(); - } + private async Task GetClient() + { + try + { + if (_config.WebDavItem.Url.IsNullOrEmpty() + || _config.WebDavItem.UserName.IsNullOrEmpty() + || _config.WebDavItem.Password.IsNullOrEmpty()) + { + throw new ArgumentException("webdav parameter error or null"); + } + if (_client != null) + { + _client?.Dispose(); + _client = null; + } + if (_config.WebDavItem.DirName.IsNullOrEmpty()) + { + _webDir = Global.AppName + "_backup"; + } + else + { + _webDir = _config.WebDavItem.DirName.TrimEx(); + } - var clientParams = new WebDavClientParams - { - BaseAddress = new Uri(_config.WebDavItem.Url), - Credentials = new NetworkCredential(_config.WebDavItem.UserName, _config.WebDavItem.Password) - }; - _client = new WebDavClient(clientParams); - } - catch (Exception ex) - { - SaveLog(ex); - return false; - } - return await Task.FromResult(true); - } + var clientParams = new WebDavClientParams + { + BaseAddress = new Uri(_config.WebDavItem.Url), + Credentials = new NetworkCredential(_config.WebDavItem.UserName, _config.WebDavItem.Password) + }; + _client = new WebDavClient(clientParams); + } + catch (Exception ex) + { + SaveLog(ex); + return false; + } + return await Task.FromResult(true); + } - private async Task TryCreateDir() - { - if (_client is null) return false; - try - { - var result2 = await _client.Mkcol(_webDir); - if (result2.IsSuccessful) - { - return true; - } - SaveLog(result2.Description); - } - catch (Exception ex) - { - SaveLog(ex); - } - return false; - } + private async Task TryCreateDir() + { + if (_client is null) + return false; + try + { + var result2 = await _client.Mkcol(_webDir); + if (result2.IsSuccessful) + { + return true; + } + SaveLog(result2.Description); + } + catch (Exception ex) + { + SaveLog(ex); + } + return false; + } - private void SaveLog(string desc) - { - _lastDescription = desc; - Logging.SaveLog(_tag + desc); - } + private void SaveLog(string desc) + { + _lastDescription = desc; + Logging.SaveLog(_tag + desc); + } - private void SaveLog(Exception ex) - { - _lastDescription = ex.Message; - Logging.SaveLog(_tag, ex); - } + private void SaveLog(Exception ex) + { + _lastDescription = ex.Message; + Logging.SaveLog(_tag, ex); + } - public async Task CheckConnection() - { - if (await GetClient() == false) - { - return false; - } - await TryCreateDir(); + public async Task CheckConnection() + { + if (await GetClient() == false) + { + return false; + } + await TryCreateDir(); - try - { - var testName = "readme_test"; - var myContent = new StringContent(testName); - var result = await _client.PutFile($"{_webDir}/{testName}", myContent); - if (result.IsSuccessful) - { - await _client.Delete($"{_webDir}/{testName}"); - return true; - } - else - { - SaveLog(result.Description); - } - } - catch (Exception ex) - { - SaveLog(ex); - } - return false; - } + try + { + var testName = "readme_test"; + var myContent = new StringContent(testName); + var result = await _client.PutFile($"{_webDir}/{testName}", myContent); + if (result.IsSuccessful) + { + await _client.Delete($"{_webDir}/{testName}"); + return true; + } + else + { + SaveLog(result.Description); + } + } + catch (Exception ex) + { + SaveLog(ex); + } + return false; + } - public async Task PutFile(string fileName) - { - if (await GetClient() == false) - { - return false; - } - await TryCreateDir(); + public async Task PutFile(string fileName) + { + if (await GetClient() == false) + { + return false; + } + await TryCreateDir(); - try - { - await using var fs = File.OpenRead(fileName); - var result = await _client.PutFile($"{_webDir}/{_webFileName}", fs); // upload a resource - if (result.IsSuccessful) - { - return true; - } + try + { + await using var fs = File.OpenRead(fileName); + var result = await _client.PutFile($"{_webDir}/{_webFileName}", fs); // upload a resource + if (result.IsSuccessful) + { + return true; + } - SaveLog(result.Description); - } - catch (Exception ex) - { - SaveLog(ex); - } - return false; - } + SaveLog(result.Description); + } + catch (Exception ex) + { + SaveLog(ex); + } + return false; + } - public async Task GetRawFile(string fileName) - { - if (await GetClient() == false) - { - return false; - } - await TryCreateDir(); + public async Task GetRawFile(string fileName) + { + if (await GetClient() == false) + { + return false; + } + await TryCreateDir(); - try - { - var response = await _client.GetRawFile($"{_webDir}/{_webFileName}"); - if (!response.IsSuccessful) - { - SaveLog(response.Description); - return false; - } + try + { + var response = await _client.GetRawFile($"{_webDir}/{_webFileName}"); + if (!response.IsSuccessful) + { + SaveLog(response.Description); + return false; + } - await using var outputFileStream = new FileStream(fileName, FileMode.Create); - await response.Stream.CopyToAsync(outputFileStream); - return true; - } - catch (Exception ex) - { - SaveLog(ex); - } - return false; - } + await using var outputFileStream = new FileStream(fileName, FileMode.Create); + await response.Stream.CopyToAsync(outputFileStream); + return true; + } + catch (Exception ex) + { + SaveLog(ex); + } + return false; + } - public string GetLastError() => _lastDescription ?? string.Empty; - } -} \ No newline at end of file + public string GetLastError() => _lastDescription ?? string.Empty; + } +} diff --git a/v2rayN/ServiceLib/Models/CheckUpdateModel.cs b/v2rayN/ServiceLib/Models/CheckUpdateModel.cs index 03080c79..d89d34b4 100644 --- a/v2rayN/ServiceLib/Models/CheckUpdateModel.cs +++ b/v2rayN/ServiceLib/Models/CheckUpdateModel.cs @@ -1,11 +1,11 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class CheckUpdateModel - { - public bool? IsSelected { get; set; } - public string? CoreType { get; set; } - public string? Remarks { get; set; } - public string? FileName { get; set; } - public bool? IsFinished { get; set; } - } -} \ No newline at end of file + public class CheckUpdateModel + { + public bool? IsSelected { get; set; } + public string? CoreType { get; set; } + public string? Remarks { get; set; } + public string? FileName { get; set; } + public bool? IsFinished { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ClashConnectionModel.cs b/v2rayN/ServiceLib/Models/ClashConnectionModel.cs index 3a68feb2..885cd0f7 100644 --- a/v2rayN/ServiceLib/Models/ClashConnectionModel.cs +++ b/v2rayN/ServiceLib/Models/ClashConnectionModel.cs @@ -1,17 +1,17 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class ClashConnectionModel - { - public string? Id { get; set; } - public string? Network { get; set; } - public string? Type { get; set; } - public string? Host { get; set; } - public ulong Upload { get; set; } - public ulong Download { get; set; } - public string? UploadTraffic { get; set; } - public string? DownloadTraffic { get; set; } - public double Time { get; set; } - public string? Elapsed { get; set; } - public string? Chain { get; set; } - } -} \ No newline at end of file + public class ClashConnectionModel + { + public string? Id { get; set; } + public string? Network { get; set; } + public string? Type { get; set; } + public string? Host { get; set; } + public ulong Upload { get; set; } + public ulong Download { get; set; } + public string? UploadTraffic { get; set; } + public string? DownloadTraffic { get; set; } + public double Time { get; set; } + public string? Elapsed { get; set; } + public string? Chain { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ClashConnections.cs b/v2rayN/ServiceLib/Models/ClashConnections.cs index 1db83786..5ad24462 100644 --- a/v2rayN/ServiceLib/Models/ClashConnections.cs +++ b/v2rayN/ServiceLib/Models/ClashConnections.cs @@ -1,37 +1,37 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class ClashConnections - { - public ulong downloadTotal { get; set; } - public ulong uploadTotal { get; set; } - public List? connections { get; set; } - } + public class ClashConnections + { + public ulong downloadTotal { get; set; } + public ulong uploadTotal { get; set; } + public List? connections { get; set; } + } - public class ConnectionItem - { - public string? id { get; set; } - public MetadataItem? metadata { get; set; } - public ulong upload { get; set; } - public ulong download { get; set; } - public DateTime start { get; set; } - public List? chains { get; set; } - public string? rule { get; set; } - public string? rulePayload { get; set; } - } + public class ConnectionItem + { + public string? id { get; set; } + public MetadataItem? metadata { get; set; } + public ulong upload { get; set; } + public ulong download { get; set; } + public DateTime start { get; set; } + public List? chains { get; set; } + public string? rule { get; set; } + public string? rulePayload { get; set; } + } - public class MetadataItem - { - public string? network { get; set; } - public string? type { get; set; } - public string? sourceIP { get; set; } - public string? destinationIP { get; set; } - public string? sourcePort { get; set; } - public string? destinationPort { get; set; } - public string? host { get; set; } - public string? nsMode { get; set; } - public object? uid { get; set; } - public string? process { get; set; } - public string? processPath { get; set; } - public string? remoteDestination { get; set; } - } -} \ No newline at end of file + public class MetadataItem + { + public string? network { get; set; } + public string? type { get; set; } + public string? sourceIP { get; set; } + public string? destinationIP { get; set; } + public string? sourcePort { get; set; } + public string? destinationPort { get; set; } + public string? host { get; set; } + public string? nsMode { get; set; } + public object? uid { get; set; } + public string? process { get; set; } + public string? processPath { get; set; } + public string? remoteDestination { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ClashProviders.cs b/v2rayN/ServiceLib/Models/ClashProviders.cs index 1832f028..6fe139bc 100644 --- a/v2rayN/ServiceLib/Models/ClashProviders.cs +++ b/v2rayN/ServiceLib/Models/ClashProviders.cs @@ -1,17 +1,17 @@ -using static ServiceLib.Models.ClashProxies; +using static ServiceLib.Models.ClashProxies; namespace ServiceLib.Models { - public class ClashProviders - { - public Dictionary? providers { get; set; } + public class ClashProviders + { + public Dictionary? providers { get; set; } - public class ProvidersItem - { - public string? name { get; set; } - public List? proxies { get; set; } - public string? type { get; set; } - public string? vehicleType { get; set; } - } - } -} \ No newline at end of file + public class ProvidersItem + { + public string? name { get; set; } + public List? proxies { get; set; } + public string? type { get; set; } + public string? vehicleType { get; set; } + } + } +} diff --git a/v2rayN/ServiceLib/Models/ClashProxies.cs b/v2rayN/ServiceLib/Models/ClashProxies.cs index b5a5de6c..045c39b8 100644 --- a/v2rayN/ServiceLib/Models/ClashProxies.cs +++ b/v2rayN/ServiceLib/Models/ClashProxies.cs @@ -1,24 +1,24 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class ClashProxies - { - public Dictionary? proxies { get; set; } + public class ClashProxies + { + public Dictionary? proxies { get; set; } - public class ProxiesItem - { - public List? all { get; set; } - public List? history { get; set; } - public string? name { get; set; } - public string? type { get; set; } - public bool udp { get; set; } - public string? now { get; set; } - public int delay { get; set; } - } + public class ProxiesItem + { + public List? all { get; set; } + public List? history { get; set; } + public string? name { get; set; } + public string? type { get; set; } + public bool udp { get; set; } + public string? now { get; set; } + public int delay { get; set; } + } - public class HistoryItem - { - public string? time { get; set; } - public int delay { get; set; } - } - } -} \ No newline at end of file + public class HistoryItem + { + public string? time { get; set; } + public int delay { get; set; } + } + } +} diff --git a/v2rayN/ServiceLib/Models/ClashProxyModel.cs b/v2rayN/ServiceLib/Models/ClashProxyModel.cs index a19de253..aa089985 100644 --- a/v2rayN/ServiceLib/Models/ClashProxyModel.cs +++ b/v2rayN/ServiceLib/Models/ClashProxyModel.cs @@ -1,18 +1,18 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class ClashProxyModel - { - public string? Name { get; set; } + [Serializable] + public class ClashProxyModel + { + public string? Name { get; set; } - public string? Type { get; set; } + public string? Type { get; set; } - public string? Now { get; set; } + public string? Now { get; set; } - public int Delay { get; set; } + public int Delay { get; set; } - public string? DelayName { get; set; } + public string? DelayName { get; set; } - public bool IsActive { get; set; } - } -} \ No newline at end of file + public bool IsActive { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/CmdItem.cs b/v2rayN/ServiceLib/Models/CmdItem.cs index d9c1a4a5..4cbf3317 100644 --- a/v2rayN/ServiceLib/Models/CmdItem.cs +++ b/v2rayN/ServiceLib/Models/CmdItem.cs @@ -1,8 +1,8 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class CmdItem - { - public string? Cmd { get; set; } - public List? Arguments { get; set; } - } -} \ No newline at end of file + public class CmdItem + { + public string? Cmd { get; set; } + public List? Arguments { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ComboItem.cs b/v2rayN/ServiceLib/Models/ComboItem.cs index 12f7ddba..2fbc1d34 100644 --- a/v2rayN/ServiceLib/Models/ComboItem.cs +++ b/v2rayN/ServiceLib/Models/ComboItem.cs @@ -1,15 +1,15 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class ComboItem - { - public string? ID - { - get; set; - } + public class ComboItem + { + public string? ID + { + get; set; + } - public string? Text - { - get; set; - } - } -} \ No newline at end of file + public string? Text + { + get; set; + } + } +} diff --git a/v2rayN/ServiceLib/Models/Config.cs b/v2rayN/ServiceLib/Models/Config.cs index a74f58d6..35273574 100644 --- a/v2rayN/ServiceLib/Models/Config.cs +++ b/v2rayN/ServiceLib/Models/Config.cs @@ -1,57 +1,57 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - /// - /// 本软件配置文件实体类 - /// - [Serializable] - public class Config - { - #region property + /// + /// 本软件配置文件实体类 + /// + [Serializable] + public class Config + { + #region property - public string IndexId { get; set; } - public string SubIndexId { get; set; } + public string IndexId { get; set; } + public string SubIndexId { get; set; } - public ECoreType RunningCoreType { get; set; } + public ECoreType RunningCoreType { get; set; } - public bool IsRunningCore(ECoreType type) - { - switch (type) - { - case ECoreType.Xray when RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5: - case ECoreType.sing_box when RunningCoreType is ECoreType.sing_box or ECoreType.mihomo: - return true; + public bool IsRunningCore(ECoreType type) + { + switch (type) + { + case ECoreType.Xray when RunningCoreType is ECoreType.Xray or ECoreType.v2fly or ECoreType.v2fly_v5: + case ECoreType.sing_box when RunningCoreType is ECoreType.sing_box or ECoreType.mihomo: + return true; - default: - return false; - } - } + default: + return false; + } + } - #endregion property + #endregion property - #region other entities + #region other entities - public CoreBasicItem CoreBasicItem { get; set; } - public TunModeItem TunModeItem { get; set; } - public KcpItem KcpItem { get; set; } - public GrpcItem GrpcItem { get; set; } - public RoutingBasicItem RoutingBasicItem { get; set; } - public GUIItem GuiItem { get; set; } - public MsgUIItem MsgUIItem { get; set; } - public UIItem UiItem { get; set; } - public ConstItem ConstItem { get; set; } - public SpeedTestItem SpeedTestItem { get; set; } - public Mux4RayItem Mux4RayItem { get; set; } - public Mux4SboxItem Mux4SboxItem { get; set; } - public HysteriaItem HysteriaItem { get; set; } - public ClashUIItem ClashUIItem { get; set; } - public SystemProxyItem SystemProxyItem { get; set; } - public WebDavItem WebDavItem { get; set; } - public CheckUpdateItem CheckUpdateItem { get; set; } - public Fragment4RayItem? Fragment4RayItem { get; set; } - public List Inbound { get; set; } - public List GlobalHotkeys { get; set; } - public List CoreTypeItem { get; set; } + public CoreBasicItem CoreBasicItem { get; set; } + public TunModeItem TunModeItem { get; set; } + public KcpItem KcpItem { get; set; } + public GrpcItem GrpcItem { get; set; } + public RoutingBasicItem RoutingBasicItem { get; set; } + public GUIItem GuiItem { get; set; } + public MsgUIItem MsgUIItem { get; set; } + public UIItem UiItem { get; set; } + public ConstItem ConstItem { get; set; } + public SpeedTestItem SpeedTestItem { get; set; } + public Mux4RayItem Mux4RayItem { get; set; } + public Mux4SboxItem Mux4SboxItem { get; set; } + public HysteriaItem HysteriaItem { get; set; } + public ClashUIItem ClashUIItem { get; set; } + public SystemProxyItem SystemProxyItem { get; set; } + public WebDavItem WebDavItem { get; set; } + public CheckUpdateItem CheckUpdateItem { get; set; } + public Fragment4RayItem? Fragment4RayItem { get; set; } + public List Inbound { get; set; } + public List GlobalHotkeys { get; set; } + public List CoreTypeItem { get; set; } - #endregion other entities - } -} \ No newline at end of file + #endregion other entities + } +} diff --git a/v2rayN/ServiceLib/Models/ConfigItems.cs b/v2rayN/ServiceLib/Models/ConfigItems.cs index 05d08c3d..73f6c252 100644 --- a/v2rayN/ServiceLib/Models/ConfigItems.cs +++ b/v2rayN/ServiceLib/Models/ConfigItems.cs @@ -1,247 +1,247 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class CoreBasicItem - { - public bool LogEnabled { get; set; } + [Serializable] + public class CoreBasicItem + { + public bool LogEnabled { get; set; } - public string Loglevel { get; set; } + public string Loglevel { get; set; } - public bool MuxEnabled { get; set; } + public bool MuxEnabled { get; set; } - public bool DefAllowInsecure { get; set; } + public bool DefAllowInsecure { get; set; } - public string DefFingerprint { get; set; } + public string DefFingerprint { get; set; } - public string DefUserAgent { get; set; } + public string DefUserAgent { get; set; } - public bool EnableFragment { get; set; } + public bool EnableFragment { get; set; } - public bool EnableCacheFile4Sbox { get; set; } = true; - } + public bool EnableCacheFile4Sbox { get; set; } = true; + } - [Serializable] - public class InItem - { - public int LocalPort { get; set; } - public string Protocol { get; set; } - public bool UdpEnabled { get; set; } - public bool SniffingEnabled { get; set; } = true; - public List? DestOverride { get; set; } = ["http", "tls"]; - public bool RouteOnly { get; set; } - public bool AllowLANConn { get; set; } - public bool NewPort4LAN { get; set; } - public string User { get; set; } - public string Pass { get; set; } - public bool SecondLocalPortEnabled { get; set; } - } + [Serializable] + public class InItem + { + public int LocalPort { get; set; } + public string Protocol { get; set; } + public bool UdpEnabled { get; set; } + public bool SniffingEnabled { get; set; } = true; + public List? DestOverride { get; set; } = ["http", "tls"]; + public bool RouteOnly { get; set; } + public bool AllowLANConn { get; set; } + public bool NewPort4LAN { get; set; } + public string User { get; set; } + public string Pass { get; set; } + public bool SecondLocalPortEnabled { get; set; } + } - [Serializable] - public class KcpItem - { - public int Mtu { get; set; } + [Serializable] + public class KcpItem + { + public int Mtu { get; set; } - public int Tti { get; set; } + public int Tti { get; set; } - public int UplinkCapacity { get; set; } + public int UplinkCapacity { get; set; } - public int DownlinkCapacity { get; set; } + public int DownlinkCapacity { get; set; } - public bool Congestion { get; set; } + public bool Congestion { get; set; } - public int ReadBufferSize { get; set; } + public int ReadBufferSize { get; set; } - public int WriteBufferSize { get; set; } - } + public int WriteBufferSize { get; set; } + } - [Serializable] - public class GrpcItem - { - public int? IdleTimeout { get; set; } - public int? HealthCheckTimeout { get; set; } - public bool? PermitWithoutStream { get; set; } - public int? InitialWindowsSize { get; set; } - } + [Serializable] + public class GrpcItem + { + public int? IdleTimeout { get; set; } + public int? HealthCheckTimeout { get; set; } + public bool? PermitWithoutStream { get; set; } + public int? InitialWindowsSize { get; set; } + } - [Serializable] - public class GUIItem - { - public bool AutoRun { get; set; } - public bool EnableStatistics { get; set; } - public bool DisplayRealTimeSpeed { get; set; } - public bool KeepOlderDedupl { get; set; } - public int AutoUpdateInterval { get; set; } - public bool EnableSecurityProtocolTls13 { get; set; } - public int TrayMenuServersLimit { get; set; } = 20; - public bool EnableHWA { get; set; } = false; - public bool EnableLog { get; set; } = true; - } + [Serializable] + public class GUIItem + { + public bool AutoRun { get; set; } + public bool EnableStatistics { get; set; } + public bool DisplayRealTimeSpeed { get; set; } + public bool KeepOlderDedupl { get; set; } + public int AutoUpdateInterval { get; set; } + public bool EnableSecurityProtocolTls13 { get; set; } + public int TrayMenuServersLimit { get; set; } = 20; + public bool EnableHWA { get; set; } = false; + public bool EnableLog { get; set; } = true; + } - [Serializable] - public class MsgUIItem - { - public string? MainMsgFilter { get; set; } - public bool? AutoRefresh { get; set; } - } + [Serializable] + public class MsgUIItem + { + public string? MainMsgFilter { get; set; } + public bool? AutoRefresh { get; set; } + } - [Serializable] - public class UIItem - { - public bool EnableAutoAdjustMainLvColWidth { get; set; } - public bool EnableUpdateSubOnlyRemarksExist { get; set; } - public double MainWidth { get; set; } - public double MainHeight { get; set; } - public double MainGirdHeight1 { get; set; } - public double MainGirdHeight2 { get; set; } - public EGirdOrientation MainGirdOrientation { get; set; } = EGirdOrientation.Vertical; - public string? ColorPrimaryName { get; set; } - public string? CurrentTheme { get; set; } - public string CurrentLanguage { get; set; } - public string CurrentFontFamily { get; set; } - public int CurrentFontSize { get; set; } - public bool EnableDragDropSort { get; set; } - public bool DoubleClick2Activate { get; set; } - public bool AutoHideStartup { get; set; } - public bool Hide2TrayWhenClose { get; set; } - public List MainColumnItem { get; set; } - public bool ShowInTaskbar { get; set; } - } + [Serializable] + public class UIItem + { + public bool EnableAutoAdjustMainLvColWidth { get; set; } + public bool EnableUpdateSubOnlyRemarksExist { get; set; } + public double MainWidth { get; set; } + public double MainHeight { get; set; } + public double MainGirdHeight1 { get; set; } + public double MainGirdHeight2 { get; set; } + public EGirdOrientation MainGirdOrientation { get; set; } = EGirdOrientation.Vertical; + public string? ColorPrimaryName { get; set; } + public string? CurrentTheme { get; set; } + public string CurrentLanguage { get; set; } + public string CurrentFontFamily { get; set; } + public int CurrentFontSize { get; set; } + public bool EnableDragDropSort { get; set; } + public bool DoubleClick2Activate { get; set; } + public bool AutoHideStartup { get; set; } + public bool Hide2TrayWhenClose { get; set; } + public List MainColumnItem { get; set; } + public bool ShowInTaskbar { get; set; } + } - [Serializable] - public class ConstItem - { - public string? SubConvertUrl { get; set; } - public string? GeoSourceUrl { get; set; } - public string? SrsSourceUrl { get; set; } - public string? RouteRulesTemplateSourceUrl { get; set; } - } + [Serializable] + public class ConstItem + { + public string? SubConvertUrl { get; set; } + public string? GeoSourceUrl { get; set; } + public string? SrsSourceUrl { get; set; } + public string? RouteRulesTemplateSourceUrl { get; set; } + } - [Serializable] - public class KeyEventItem - { - public EGlobalHotkey EGlobalHotkey { get; set; } + [Serializable] + public class KeyEventItem + { + public EGlobalHotkey EGlobalHotkey { get; set; } - public bool Alt { get; set; } + public bool Alt { get; set; } - public bool Control { get; set; } + public bool Control { get; set; } - public bool Shift { get; set; } + public bool Shift { get; set; } - public int? KeyCode { get; set; } - } + public int? KeyCode { get; set; } + } - [Serializable] - public class CoreTypeItem - { - public EConfigType ConfigType { get; set; } + [Serializable] + public class CoreTypeItem + { + public EConfigType ConfigType { get; set; } - public ECoreType CoreType { get; set; } - } + public ECoreType CoreType { get; set; } + } - [Serializable] - public class TunModeItem - { - public bool EnableTun { get; set; } - public bool StrictRoute { get; set; } = true; - public string Stack { get; set; } - public int Mtu { get; set; } - public bool EnableExInbound { get; set; } - public bool EnableIPv6Address { get; set; } - public string? LinuxSudoPwd { get; set; } - } + [Serializable] + public class TunModeItem + { + public bool EnableTun { get; set; } + public bool StrictRoute { get; set; } = true; + public string Stack { get; set; } + public int Mtu { get; set; } + public bool EnableExInbound { get; set; } + public bool EnableIPv6Address { get; set; } + public string? LinuxSudoPwd { get; set; } + } - [Serializable] - public class SpeedTestItem - { - public int SpeedTestTimeout { get; set; } - public string SpeedTestUrl { get; set; } - public string SpeedPingTestUrl { get; set; } - public int SpeedTestPageSize { get; set; } - } + [Serializable] + public class SpeedTestItem + { + public int SpeedTestTimeout { get; set; } + public string SpeedTestUrl { get; set; } + public string SpeedPingTestUrl { get; set; } + public int SpeedTestPageSize { get; set; } + } - [Serializable] - public class RoutingBasicItem - { - public string DomainStrategy { get; set; } - public string DomainStrategy4Singbox { get; set; } - public string DomainMatcher { get; set; } - public string RoutingIndexId { get; set; } - } + [Serializable] + public class RoutingBasicItem + { + public string DomainStrategy { get; set; } + public string DomainStrategy4Singbox { get; set; } + public string DomainMatcher { get; set; } + public string RoutingIndexId { get; set; } + } - [Serializable] - public class ColumnItem - { - public string Name { get; set; } - public int Width { get; set; } - public int Index { get; set; } - } + [Serializable] + public class ColumnItem + { + public string Name { get; set; } + public int Width { get; set; } + public int Index { get; set; } + } - [Serializable] - public class Mux4RayItem - { - public int? Concurrency { get; set; } - public int? XudpConcurrency { get; set; } - public string? XudpProxyUDP443 { get; set; } - } + [Serializable] + public class Mux4RayItem + { + public int? Concurrency { get; set; } + public int? XudpConcurrency { get; set; } + public string? XudpProxyUDP443 { get; set; } + } - [Serializable] - public class Mux4SboxItem - { - public string Protocol { get; set; } - public int MaxConnections { get; set; } - public bool? Padding { get; set; } - } + [Serializable] + public class Mux4SboxItem + { + public string Protocol { get; set; } + public int MaxConnections { get; set; } + public bool? Padding { get; set; } + } - [Serializable] - public class HysteriaItem - { - public int UpMbps { get; set; } - public int DownMbps { get; set; } - } + [Serializable] + public class HysteriaItem + { + public int UpMbps { get; set; } + public int DownMbps { get; set; } + } - [Serializable] - public class ClashUIItem - { - public ERuleMode RuleMode { get; set; } - public bool EnableIPv6 { get; set; } - public bool EnableMixinContent { get; set; } - public int ProxiesSorting { get; set; } - public bool ProxiesAutoRefresh { get; set; } - public int ProxiesAutoDelayTestInterval { get; set; } = 10; - public bool ConnectionsAutoRefresh { get; set; } - public int ConnectionsRefreshInterval { get; set; } = 2; - } + [Serializable] + public class ClashUIItem + { + public ERuleMode RuleMode { get; set; } + public bool EnableIPv6 { get; set; } + public bool EnableMixinContent { get; set; } + public int ProxiesSorting { get; set; } + public bool ProxiesAutoRefresh { get; set; } + public int ProxiesAutoDelayTestInterval { get; set; } = 10; + public bool ConnectionsAutoRefresh { get; set; } + public int ConnectionsRefreshInterval { get; set; } = 2; + } - [Serializable] - public class SystemProxyItem - { - public ESysProxyType SysProxyType { get; set; } - public string SystemProxyExceptions { get; set; } - public bool NotProxyLocalAddress { get; set; } = true; - public string SystemProxyAdvancedProtocol { get; set; } - } + [Serializable] + public class SystemProxyItem + { + public ESysProxyType SysProxyType { get; set; } + public string SystemProxyExceptions { get; set; } + public bool NotProxyLocalAddress { get; set; } = true; + public string SystemProxyAdvancedProtocol { get; set; } + } - [Serializable] - public class WebDavItem - { - public string? Url { get; set; } - public string? UserName { get; set; } - public string? Password { get; set; } - public string? DirName { get; set; } - } + [Serializable] + public class WebDavItem + { + public string? Url { get; set; } + public string? UserName { get; set; } + public string? Password { get; set; } + public string? DirName { get; set; } + } - [Serializable] - public class CheckUpdateItem - { - public bool CheckPreReleaseUpdate { get; set; } - public List? SelectedCoreTypes { get; set; } - } + [Serializable] + public class CheckUpdateItem + { + public bool CheckPreReleaseUpdate { get; set; } + public List? SelectedCoreTypes { get; set; } + } - [Serializable] - public class Fragment4RayItem - { - public string? Packets { get; set; } - public string? Length { get; set; } - public string? Interval { get; set; } - } -} \ No newline at end of file + [Serializable] + public class Fragment4RayItem + { + public string? Packets { get; set; } + public string? Length { get; set; } + public string? Interval { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/CoreInfo.cs b/v2rayN/ServiceLib/Models/CoreInfo.cs index 1afcd0b6..f23342f2 100644 --- a/v2rayN/ServiceLib/Models/CoreInfo.cs +++ b/v2rayN/ServiceLib/Models/CoreInfo.cs @@ -1,21 +1,21 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class CoreInfo - { - public ECoreType CoreType { get; set; } - public List? CoreExes { get; set; } - public string? Arguments { get; set; } - public string? Url { get; set; } - public string? ReleaseApiUrl { get; set; } - public string? DownloadUrlWin64 { get; set; } - public string? DownloadUrlWinArm64 { get; set; } - public string? DownloadUrlLinux64 { get; set; } - public string? DownloadUrlLinuxArm64 { get; set; } - public string? DownloadUrlOSX64 { get; set; } - public string? DownloadUrlOSXArm64 { get; set; } - public string? Match { get; set; } - public string? VersionArg { get; set; } - public bool RedirectInfo { get; set; } - } -} \ No newline at end of file + [Serializable] + public class CoreInfo + { + public ECoreType CoreType { get; set; } + public List? CoreExes { get; set; } + public string? Arguments { get; set; } + public string? Url { get; set; } + public string? ReleaseApiUrl { get; set; } + public string? DownloadUrlWin64 { get; set; } + public string? DownloadUrlWinArm64 { get; set; } + public string? DownloadUrlLinux64 { get; set; } + public string? DownloadUrlLinuxArm64 { get; set; } + public string? DownloadUrlOSX64 { get; set; } + public string? DownloadUrlOSXArm64 { get; set; } + public string? Match { get; set; } + public string? VersionArg { get; set; } + public bool RedirectInfo { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/DNSItem.cs b/v2rayN/ServiceLib/Models/DNSItem.cs index 44acb4fb..ece4d011 100644 --- a/v2rayN/ServiceLib/Models/DNSItem.cs +++ b/v2rayN/ServiceLib/Models/DNSItem.cs @@ -1,20 +1,20 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class DNSItem - { - [PrimaryKey] - public string Id { get; set; } + [Serializable] + public class DNSItem + { + [PrimaryKey] + public string Id { get; set; } - public string Remarks { get; set; } - public bool Enabled { get; set; } = true; - public ECoreType CoreType { get; set; } - public bool UseSystemHosts { get; set; } - public string? NormalDNS { get; set; } - public string? TunDNS { get; set; } - public string? DomainStrategy4Freedom { get; set; } - public string? DomainDNSAddress { get; set; } - } -} \ No newline at end of file + public string Remarks { get; set; } + public bool Enabled { get; set; } = true; + public ECoreType CoreType { get; set; } + public bool UseSystemHosts { get; set; } + public string? NormalDNS { get; set; } + public string? TunDNS { get; set; } + public string? DomainStrategy4Freedom { get; set; } + public string? DomainDNSAddress { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/GitHubRelease.cs b/v2rayN/ServiceLib/Models/GitHubRelease.cs index 8f062b40..0f118e1d 100644 --- a/v2rayN/ServiceLib/Models/GitHubRelease.cs +++ b/v2rayN/ServiceLib/Models/GitHubRelease.cs @@ -1,68 +1,68 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; namespace ServiceLib.Models { - public class GitHubReleaseAsset - { - [JsonPropertyName("url")] public string? Url { get; set; } + public class GitHubReleaseAsset + { + [JsonPropertyName("url")] public string? Url { get; set; } - [JsonPropertyName("id")] public int Id { get; set; } + [JsonPropertyName("id")] public int Id { get; set; } - [JsonPropertyName("node_id")] public string? NodeId { get; set; } + [JsonPropertyName("node_id")] public string? NodeId { get; set; } - [JsonPropertyName("name")] public string? Name { get; set; } + [JsonPropertyName("name")] public string? Name { get; set; } - [JsonPropertyName("label")] public object Label { get; set; } + [JsonPropertyName("label")] public object Label { get; set; } - [JsonPropertyName("content_type")] public string? ContentType { get; set; } + [JsonPropertyName("content_type")] public string? ContentType { get; set; } - [JsonPropertyName("state")] public string? State { get; set; } + [JsonPropertyName("state")] public string? State { get; set; } - [JsonPropertyName("size")] public int Size { get; set; } + [JsonPropertyName("size")] public int Size { get; set; } - [JsonPropertyName("download_count")] public int DownloadCount { get; set; } + [JsonPropertyName("download_count")] public int DownloadCount { get; set; } - [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } + [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } - [JsonPropertyName("updated_at")] public DateTime UpdatedAt { get; set; } + [JsonPropertyName("updated_at")] public DateTime UpdatedAt { get; set; } - [JsonPropertyName("browser_download_url")] public string? BrowserDownloadUrl { get; set; } - } + [JsonPropertyName("browser_download_url")] public string? BrowserDownloadUrl { get; set; } + } - public class GitHubRelease - { - [JsonPropertyName("url")] public string? Url { get; set; } + public class GitHubRelease + { + [JsonPropertyName("url")] public string? Url { get; set; } - [JsonPropertyName("assets_url")] public string? AssetsUrl { get; set; } + [JsonPropertyName("assets_url")] public string? AssetsUrl { get; set; } - [JsonPropertyName("upload_url")] public string? UploadUrl { get; set; } + [JsonPropertyName("upload_url")] public string? UploadUrl { get; set; } - [JsonPropertyName("html_url")] public string? HtmlUrl { get; set; } + [JsonPropertyName("html_url")] public string? HtmlUrl { get; set; } - [JsonPropertyName("id")] public int Id { get; set; } + [JsonPropertyName("id")] public int Id { get; set; } - [JsonPropertyName("node_id")] public string? NodeId { get; set; } + [JsonPropertyName("node_id")] public string? NodeId { get; set; } - [JsonPropertyName("tag_name")] public string? TagName { get; set; } + [JsonPropertyName("tag_name")] public string? TagName { get; set; } - [JsonPropertyName("target_commitish")] public string? TargetCommitish { get; set; } + [JsonPropertyName("target_commitish")] public string? TargetCommitish { get; set; } - [JsonPropertyName("name")] public string? Name { get; set; } + [JsonPropertyName("name")] public string? Name { get; set; } - [JsonPropertyName("draft")] public bool Draft { get; set; } + [JsonPropertyName("draft")] public bool Draft { get; set; } - [JsonPropertyName("prerelease")] public bool Prerelease { get; set; } + [JsonPropertyName("prerelease")] public bool Prerelease { get; set; } - [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } + [JsonPropertyName("created_at")] public DateTime CreatedAt { get; set; } - [JsonPropertyName("published_at")] public DateTime PublishedAt { get; set; } + [JsonPropertyName("published_at")] public DateTime PublishedAt { get; set; } - [JsonPropertyName("assets")] public List Assets { get; set; } + [JsonPropertyName("assets")] public List Assets { get; set; } - [JsonPropertyName("tarball_url")] public string? TarballUrl { get; set; } + [JsonPropertyName("tarball_url")] public string? TarballUrl { get; set; } - [JsonPropertyName("zipball_url")] public string? ZipballUrl { get; set; } + [JsonPropertyName("zipball_url")] public string? ZipballUrl { get; set; } - [JsonPropertyName("body")] public string? Body { get; set; } - } -} \ No newline at end of file + [JsonPropertyName("body")] public string? Body { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/IPAPIInfo.cs b/v2rayN/ServiceLib/Models/IPAPIInfo.cs index 07259d95..b823d0cc 100644 --- a/v2rayN/ServiceLib/Models/IPAPIInfo.cs +++ b/v2rayN/ServiceLib/Models/IPAPIInfo.cs @@ -1,13 +1,13 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - internal class IPAPIInfo - { - public string? ip { get; set; } - public string? city { get; set; } - public string? region { get; set; } - public string? region_code { get; set; } - public string? country { get; set; } - public string? country_name { get; set; } - public string? country_code { get; set; } - } -} \ No newline at end of file + internal class IPAPIInfo + { + public string? ip { get; set; } + public string? city { get; set; } + public string? region { get; set; } + public string? region_code { get; set; } + public string? country { get; set; } + public string? country_name { get; set; } + public string? country_code { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ProfileExItem.cs b/v2rayN/ServiceLib/Models/ProfileExItem.cs index afa7918d..9324c40d 100644 --- a/v2rayN/ServiceLib/Models/ProfileExItem.cs +++ b/v2rayN/ServiceLib/Models/ProfileExItem.cs @@ -1,15 +1,15 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class ProfileExItem - { - [PrimaryKey] - public string IndexId { get; set; } + [Serializable] + public class ProfileExItem + { + [PrimaryKey] + public string IndexId { get; set; } - public int Delay { get; set; } - public decimal Speed { get; set; } - public int Sort { get; set; } - } -} \ No newline at end of file + public int Delay { get; set; } + public decimal Speed { get; set; } + public int Sort { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ProfileItem.cs b/v2rayN/ServiceLib/Models/ProfileItem.cs index 8bf5405e..e0625f5e 100644 --- a/v2rayN/ServiceLib/Models/ProfileItem.cs +++ b/v2rayN/ServiceLib/Models/ProfileItem.cs @@ -1,96 +1,96 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class ProfileItem - { - public ProfileItem() - { - IndexId = string.Empty; - ConfigType = EConfigType.VMess; - ConfigVersion = 2; - Address = string.Empty; - Port = 0; - Id = string.Empty; - AlterId = 0; - Security = string.Empty; - Network = string.Empty; - Remarks = string.Empty; - HeaderType = string.Empty; - RequestHost = string.Empty; - Path = string.Empty; - StreamSecurity = string.Empty; - AllowInsecure = string.Empty; - Subid = string.Empty; - Flow = string.Empty; - } + [Serializable] + public class ProfileItem + { + public ProfileItem() + { + IndexId = string.Empty; + ConfigType = EConfigType.VMess; + ConfigVersion = 2; + Address = string.Empty; + Port = 0; + Id = string.Empty; + AlterId = 0; + Security = string.Empty; + Network = string.Empty; + Remarks = string.Empty; + HeaderType = string.Empty; + RequestHost = string.Empty; + Path = string.Empty; + StreamSecurity = string.Empty; + AllowInsecure = string.Empty; + Subid = string.Empty; + Flow = string.Empty; + } - #region function + #region function - public string GetSummary() - { - var summary = $"[{(ConfigType).ToString()}] "; - var arrAddr = Address.Split('.'); - var addr = arrAddr.Length switch - { - > 2 => $"{arrAddr.First()}***{arrAddr.Last()}", - > 1 => $"***{arrAddr.Last()}", - _ => Address - }; - summary += ConfigType switch - { - EConfigType.Custom => $"[{CoreType.ToString()}]{Remarks}", - _ => $"{Remarks}({addr}:{Port})" - }; - return summary; - } + public string GetSummary() + { + var summary = $"[{ConfigType.ToString()}] "; + var arrAddr = Address.Split('.'); + var addr = arrAddr.Length switch + { + > 2 => $"{arrAddr.First()}***{arrAddr.Last()}", + > 1 => $"***{arrAddr.Last()}", + _ => Address + }; + summary += ConfigType switch + { + EConfigType.Custom => $"[{CoreType.ToString()}]{Remarks}", + _ => $"{Remarks}({addr}:{Port})" + }; + return summary; + } - public List? GetAlpn() - { - return Utils.IsNullOrEmpty(Alpn) ? null : Utils.String2List(Alpn); - } + public List? GetAlpn() + { + return Utils.IsNullOrEmpty(Alpn) ? null : Utils.String2List(Alpn); + } - public string GetNetwork() - { - if (Utils.IsNullOrEmpty(Network) || !Global.Networks.Contains(Network)) - { - return Global.DefaultNetwork; - } - return Network.TrimEx(); - } + public string GetNetwork() + { + if (Utils.IsNullOrEmpty(Network) || !Global.Networks.Contains(Network)) + { + return Global.DefaultNetwork; + } + return Network.TrimEx(); + } - #endregion function + #endregion function - [PrimaryKey] - public string IndexId { get; set; } + [PrimaryKey] + public string IndexId { get; set; } - public EConfigType ConfigType { get; set; } - public int ConfigVersion { get; set; } - public string Address { get; set; } - public int Port { get; set; } - public string Id { get; set; } - public int AlterId { get; set; } - public string Security { get; set; } - public string Network { get; set; } - public string Remarks { get; set; } - public string HeaderType { get; set; } - public string RequestHost { get; set; } - public string Path { get; set; } - public string StreamSecurity { get; set; } - public string AllowInsecure { get; set; } - public string Subid { get; set; } - public bool IsSub { get; set; } = true; - public string Flow { get; set; } - public string Sni { get; set; } - public string Alpn { get; set; } = string.Empty; - public ECoreType? CoreType { get; set; } - public int? PreSocksPort { get; set; } - public string Fingerprint { get; set; } - public bool DisplayLog { get; set; } = true; - public string PublicKey { get; set; } - public string ShortId { get; set; } - public string SpiderX { get; set; } - public string Extra { get; set; } - } -} \ No newline at end of file + public EConfigType ConfigType { get; set; } + public int ConfigVersion { get; set; } + public string Address { get; set; } + public int Port { get; set; } + public string Id { get; set; } + public int AlterId { get; set; } + public string Security { get; set; } + public string Network { get; set; } + public string Remarks { get; set; } + public string HeaderType { get; set; } + public string RequestHost { get; set; } + public string Path { get; set; } + public string StreamSecurity { get; set; } + public string AllowInsecure { get; set; } + public string Subid { get; set; } + public bool IsSub { get; set; } = true; + public string Flow { get; set; } + public string Sni { get; set; } + public string Alpn { get; set; } = string.Empty; + public ECoreType? CoreType { get; set; } + public int? PreSocksPort { get; set; } + public string Fingerprint { get; set; } + public bool DisplayLog { get; set; } = true; + public string PublicKey { get; set; } + public string ShortId { get; set; } + public string SpiderX { get; set; } + public string Extra { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ProfileItemModel.cs b/v2rayN/ServiceLib/Models/ProfileItemModel.cs index 731316fe..7f8c7fd3 100644 --- a/v2rayN/ServiceLib/Models/ProfileItemModel.cs +++ b/v2rayN/ServiceLib/Models/ProfileItemModel.cs @@ -1,18 +1,18 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class ProfileItemModel : ProfileItem - { - public bool IsActive { get; set; } - public string SubRemarks { get; set; } - public int Delay { get; set; } - public decimal Speed { get; set; } - public int Sort { get; set; } - public string DelayVal { get; set; } - public string SpeedVal { get; set; } - public string TodayUp { get; set; } - public string TodayDown { get; set; } - public string TotalUp { get; set; } - public string TotalDown { get; set; } - } -} \ No newline at end of file + [Serializable] + public class ProfileItemModel : ProfileItem + { + public bool IsActive { get; set; } + public string SubRemarks { get; set; } + public int Delay { get; set; } + public decimal Speed { get; set; } + public int Sort { get; set; } + public string DelayVal { get; set; } + public string SpeedVal { get; set; } + public string TodayUp { get; set; } + public string TodayDown { get; set; } + public string TotalUp { get; set; } + public string TotalDown { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/RetResult.cs b/v2rayN/ServiceLib/Models/RetResult.cs index 9c6122c0..1e9dae68 100644 --- a/v2rayN/ServiceLib/Models/RetResult.cs +++ b/v2rayN/ServiceLib/Models/RetResult.cs @@ -1,27 +1,27 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class RetResult - { - public bool Success { get; set; } - public string? Msg { get; set; } - public object? Data { get; set; } + public class RetResult + { + public bool Success { get; set; } + public string? Msg { get; set; } + public object? Data { get; set; } - public RetResult(bool success = false) - { - Success = success; - } + public RetResult(bool success = false) + { + Success = success; + } - public RetResult(bool success, string? msg) - { - Success = success; - Msg = msg; - } + public RetResult(bool success, string? msg) + { + Success = success; + Msg = msg; + } - public RetResult(bool success, string? msg, object? data) - { - Success = success; - Msg = msg; - Data = data; - } - } -} \ No newline at end of file + public RetResult(bool success, string? msg, object? data) + { + Success = success; + Msg = msg; + Data = data; + } + } +} diff --git a/v2rayN/ServiceLib/Models/RoutingItem.cs b/v2rayN/ServiceLib/Models/RoutingItem.cs index 5212c359..4fcc8173 100644 --- a/v2rayN/ServiceLib/Models/RoutingItem.cs +++ b/v2rayN/ServiceLib/Models/RoutingItem.cs @@ -1,23 +1,23 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class RoutingItem - { - [PrimaryKey] - public string Id { get; set; } + [Serializable] + public class RoutingItem + { + [PrimaryKey] + public string Id { get; set; } - public string Remarks { get; set; } - public string Url { get; set; } - public string RuleSet { get; set; } - public int RuleNum { get; set; } - public bool Enabled { get; set; } = true; - public bool Locked { get; set; } - public string CustomIcon { get; set; } - public string CustomRulesetPath4Singbox { get; set; } - public string DomainStrategy { get; set; } - public string DomainStrategy4Singbox { get; set; } - public int Sort { get; set; } - } -} \ No newline at end of file + public string Remarks { get; set; } + public string Url { get; set; } + public string RuleSet { get; set; } + public int RuleNum { get; set; } + public bool Enabled { get; set; } = true; + public bool Locked { get; set; } + public string CustomIcon { get; set; } + public string CustomRulesetPath4Singbox { get; set; } + public string DomainStrategy { get; set; } + public string DomainStrategy4Singbox { get; set; } + public int Sort { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/RoutingItemModel.cs b/v2rayN/ServiceLib/Models/RoutingItemModel.cs index 23dcab83..26864133 100644 --- a/v2rayN/ServiceLib/Models/RoutingItemModel.cs +++ b/v2rayN/ServiceLib/Models/RoutingItemModel.cs @@ -1,8 +1,8 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class RoutingItemModel : RoutingItem - { - public bool IsActive { get; set; } - } -} \ No newline at end of file + [Serializable] + public class RoutingItemModel : RoutingItem + { + public bool IsActive { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/RoutingTemplate.cs b/v2rayN/ServiceLib/Models/RoutingTemplate.cs index 43ebd81c..ccd936a5 100644 --- a/v2rayN/ServiceLib/Models/RoutingTemplate.cs +++ b/v2rayN/ServiceLib/Models/RoutingTemplate.cs @@ -1,9 +1,9 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class RoutingTemplate - { - public string Version { get; set; } - public RoutingItem[] RoutingItems { get; set; } - } -} \ No newline at end of file + [Serializable] + public class RoutingTemplate + { + public string Version { get; set; } + public RoutingItem[] RoutingItems { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/RulesItem.cs b/v2rayN/ServiceLib/Models/RulesItem.cs index fde8d7db..db9b5513 100644 --- a/v2rayN/ServiceLib/Models/RulesItem.cs +++ b/v2rayN/ServiceLib/Models/RulesItem.cs @@ -1,19 +1,19 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class RulesItem - { - public string Id { get; set; } - public string? Type { get; set; } - public string? Port { get; set; } - public string? Network { get; set; } - public List? InboundTag { get; set; } - public string? OutboundTag { get; set; } - public List? Ip { get; set; } - public List? Domain { get; set; } - public List? Protocol { get; set; } - public List? Process { get; set; } - public bool Enabled { get; set; } = true; - public string? Remarks { get; set; } - } -} \ No newline at end of file + [Serializable] + public class RulesItem + { + public string Id { get; set; } + public string? Type { get; set; } + public string? Port { get; set; } + public string? Network { get; set; } + public List? InboundTag { get; set; } + public string? OutboundTag { get; set; } + public List? Ip { get; set; } + public List? Domain { get; set; } + public List? Protocol { get; set; } + public List? Process { get; set; } + public bool Enabled { get; set; } = true; + public string? Remarks { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/RulesItemModel.cs b/v2rayN/ServiceLib/Models/RulesItemModel.cs index c11ccdd8..71c01459 100644 --- a/v2rayN/ServiceLib/Models/RulesItemModel.cs +++ b/v2rayN/ServiceLib/Models/RulesItemModel.cs @@ -1,11 +1,11 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class RulesItemModel : RulesItem - { - public string InboundTags { get; set; } - public string Ips { get; set; } - public string Domains { get; set; } - public string Protocols { get; set; } - } -} \ No newline at end of file + [Serializable] + public class RulesItemModel : RulesItem + { + public string InboundTags { get; set; } + public string Ips { get; set; } + public string Domains { get; set; } + public string Protocols { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ServerSpeedItem.cs b/v2rayN/ServiceLib/Models/ServerSpeedItem.cs index 5781a6ea..cc388ddc 100644 --- a/v2rayN/ServiceLib/Models/ServerSpeedItem.cs +++ b/v2rayN/ServiceLib/Models/ServerSpeedItem.cs @@ -1,22 +1,22 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class ServerSpeedItem : ServerStatItem - { - public long ProxyUp { get; set; } + [Serializable] + public class ServerSpeedItem : ServerStatItem + { + public long ProxyUp { get; set; } - public long ProxyDown { get; set; } + public long ProxyDown { get; set; } - public long DirectUp { get; set; } + public long DirectUp { get; set; } - public long DirectDown { get; set; } - } + public long DirectDown { get; set; } + } - [Serializable] - public class TrafficItem - { - public ulong Up { get; set; } + [Serializable] + public class TrafficItem + { + public ulong Up { get; set; } - public ulong Down { get; set; } - } -} \ No newline at end of file + public ulong Down { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ServerStatItem.cs b/v2rayN/ServiceLib/Models/ServerStatItem.cs index 16f6695f..00e6d83d 100644 --- a/v2rayN/ServiceLib/Models/ServerStatItem.cs +++ b/v2rayN/ServiceLib/Models/ServerStatItem.cs @@ -1,21 +1,21 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class ServerStatItem - { - [PrimaryKey] - public string IndexId { get; set; } + [Serializable] + public class ServerStatItem + { + [PrimaryKey] + public string IndexId { get; set; } - public long TotalUp { get; set; } + public long TotalUp { get; set; } - public long TotalDown { get; set; } + public long TotalDown { get; set; } - public long TodayUp { get; set; } + public long TodayUp { get; set; } - public long TodayDown { get; set; } + public long TodayDown { get; set; } - public long DateNow { get; set; } - } -} \ No newline at end of file + public long DateNow { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/ServerTestItem.cs b/v2rayN/ServiceLib/Models/ServerTestItem.cs index 1a6352f6..97b2d483 100644 --- a/v2rayN/ServiceLib/Models/ServerTestItem.cs +++ b/v2rayN/ServiceLib/Models/ServerTestItem.cs @@ -1,13 +1,13 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class ServerTestItem - { - public string? IndexId { get; set; } - public string? Address { get; set; } - public int Port { get; set; } - public EConfigType ConfigType { get; set; } - public bool AllowTest { get; set; } - public int Delay { get; set; } - } -} \ No newline at end of file + [Serializable] + public class ServerTestItem + { + public string? IndexId { get; set; } + public string? Address { get; set; } + public int Port { get; set; } + public EConfigType ConfigType { get; set; } + public bool AllowTest { get; set; } + public int Delay { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/SingboxConfig.cs b/v2rayN/ServiceLib/Models/SingboxConfig.cs index 41eee042..9223d4f2 100644 --- a/v2rayN/ServiceLib/Models/SingboxConfig.cs +++ b/v2rayN/ServiceLib/Models/SingboxConfig.cs @@ -1,255 +1,255 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class SingboxConfig - { - public Log4Sbox log { get; set; } - public Dns4Sbox? dns { get; set; } - public List inbounds { get; set; } - public List outbounds { get; set; } - public Route4Sbox route { get; set; } - public Experimental4Sbox? experimental { get; set; } - } + public class SingboxConfig + { + public Log4Sbox log { get; set; } + public Dns4Sbox? dns { get; set; } + public List inbounds { get; set; } + public List outbounds { get; set; } + public Route4Sbox route { get; set; } + public Experimental4Sbox? experimental { get; set; } + } - public class Log4Sbox - { - public bool? disabled { get; set; } - public string level { get; set; } - public string output { get; set; } - public bool? timestamp { get; set; } - } + public class Log4Sbox + { + public bool? disabled { get; set; } + public string level { get; set; } + public string output { get; set; } + public bool? timestamp { get; set; } + } - public class Dns4Sbox - { - public List servers { get; set; } - public List rules { get; set; } - public string? final { get; set; } - public string? strategy { get; set; } - public bool? disable_cache { get; set; } - public bool? disable_expire { get; set; } - public bool? independent_cache { get; set; } - public bool? reverse_mapping { get; set; } - public string? client_subnet { get; set; } - public Fakeip4Sbox? fakeip { get; set; } - } + public class Dns4Sbox + { + public List servers { get; set; } + public List rules { get; set; } + public string? final { get; set; } + public string? strategy { get; set; } + public bool? disable_cache { get; set; } + public bool? disable_expire { get; set; } + public bool? independent_cache { get; set; } + public bool? reverse_mapping { get; set; } + public string? client_subnet { get; set; } + public Fakeip4Sbox? fakeip { get; set; } + } - public class Route4Sbox - { - public bool? auto_detect_interface { get; set; } - public List rules { get; set; } - public List? rule_set { get; set; } - } + public class Route4Sbox + { + public bool? auto_detect_interface { get; set; } + public List rules { get; set; } + public List? rule_set { get; set; } + } - [Serializable] - public class Rule4Sbox - { - public string? outbound { get; set; } - public string? server { get; set; } - public bool? disable_cache { get; set; } - public string? type { get; set; } - public string? mode { get; set; } - public bool? ip_is_private { get; set; } - public string? client_subnet { get; set; } - public bool? invert { get; set; } - public string? clash_mode { get; set; } - public List? inbound { get; set; } - public List? protocol { get; set; } - public List? network { get; set; } - public List? port { get; set; } - public List? port_range { get; set; } - public List? geosite { get; set; } - public List? domain { get; set; } - public List? domain_suffix { get; set; } - public List? domain_keyword { get; set; } - public List? domain_regex { get; set; } - public List? geoip { get; set; } - public List? ip_cidr { get; set; } - public List? source_ip_cidr { get; set; } - public List? process_name { get; set; } - public List? rule_set { get; set; } - public List? rules { get; set; } - } + [Serializable] + public class Rule4Sbox + { + public string? outbound { get; set; } + public string? server { get; set; } + public bool? disable_cache { get; set; } + public string? type { get; set; } + public string? mode { get; set; } + public bool? ip_is_private { get; set; } + public string? client_subnet { get; set; } + public bool? invert { get; set; } + public string? clash_mode { get; set; } + public List? inbound { get; set; } + public List? protocol { get; set; } + public List? network { get; set; } + public List? port { get; set; } + public List? port_range { get; set; } + public List? geosite { get; set; } + public List? domain { get; set; } + public List? domain_suffix { get; set; } + public List? domain_keyword { get; set; } + public List? domain_regex { get; set; } + public List? geoip { get; set; } + public List? ip_cidr { get; set; } + public List? source_ip_cidr { get; set; } + public List? process_name { get; set; } + public List? rule_set { get; set; } + public List? rules { get; set; } + } - [Serializable] - public class Inbound4Sbox - { - public string type { get; set; } - public string tag { get; set; } - public string listen { get; set; } - public int? listen_port { get; set; } - public string? domain_strategy { get; set; } - public string interface_name { get; set; } - public List? address { get; set; } - public int? mtu { get; set; } - public bool? auto_route { get; set; } - public bool? strict_route { get; set; } - public bool? endpoint_independent_nat { get; set; } - public string? stack { get; set; } - public bool? sniff { get; set; } - public bool? sniff_override_destination { get; set; } - public List users { get; set; } - } + [Serializable] + public class Inbound4Sbox + { + public string type { get; set; } + public string tag { get; set; } + public string listen { get; set; } + public int? listen_port { get; set; } + public string? domain_strategy { get; set; } + public string interface_name { get; set; } + public List? address { get; set; } + public int? mtu { get; set; } + public bool? auto_route { get; set; } + public bool? strict_route { get; set; } + public bool? endpoint_independent_nat { get; set; } + public string? stack { get; set; } + public bool? sniff { get; set; } + public bool? sniff_override_destination { get; set; } + public List users { get; set; } + } - public class User4Sbox - { - public string username { get; set; } - public string password { get; set; } - } + public class User4Sbox + { + public string username { get; set; } + public string password { get; set; } + } - public class Outbound4Sbox - { - public string type { get; set; } - public string tag { get; set; } - public string? server { get; set; } - public int? server_port { get; set; } - public string uuid { get; set; } - public string security { get; set; } - public int? alter_id { get; set; } - public string flow { get; set; } - public int? up_mbps { get; set; } - public int? down_mbps { get; set; } - public string auth_str { get; set; } - public int? recv_window_conn { get; set; } - public int? recv_window { get; set; } - public bool? disable_mtu_discovery { get; set; } - public string? detour { get; set; } - public string method { get; set; } - public string username { get; set; } - public string password { get; set; } - public string congestion_control { get; set; } - public string? version { get; set; } - public string? network { get; set; } - public string? packet_encoding { get; set; } - public List? local_address { get; set; } - public string? private_key { get; set; } - public string? peer_public_key { get; set; } - public List? reserved { get; set; } - public int? mtu { get; set; } - public string? plugin { get; set; } - public string? plugin_opts { get; set; } - public Tls4Sbox? tls { get; set; } - public Multiplex4Sbox? multiplex { get; set; } - public Transport4Sbox? transport { get; set; } - public HyObfs4Sbox? obfs { get; set; } - public List? outbounds { get; set; } - public bool? interrupt_exist_connections { get; set; } - } + public class Outbound4Sbox + { + public string type { get; set; } + public string tag { get; set; } + public string? server { get; set; } + public int? server_port { get; set; } + public string uuid { get; set; } + public string security { get; set; } + public int? alter_id { get; set; } + public string flow { get; set; } + public int? up_mbps { get; set; } + public int? down_mbps { get; set; } + public string auth_str { get; set; } + public int? recv_window_conn { get; set; } + public int? recv_window { get; set; } + public bool? disable_mtu_discovery { get; set; } + public string? detour { get; set; } + public string method { get; set; } + public string username { get; set; } + public string password { get; set; } + public string congestion_control { get; set; } + public string? version { get; set; } + public string? network { get; set; } + public string? packet_encoding { get; set; } + public List? local_address { get; set; } + public string? private_key { get; set; } + public string? peer_public_key { get; set; } + public List? reserved { get; set; } + public int? mtu { get; set; } + public string? plugin { get; set; } + public string? plugin_opts { get; set; } + public Tls4Sbox? tls { get; set; } + public Multiplex4Sbox? multiplex { get; set; } + public Transport4Sbox? transport { get; set; } + public HyObfs4Sbox? obfs { get; set; } + public List? outbounds { get; set; } + public bool? interrupt_exist_connections { get; set; } + } - public class Tls4Sbox - { - public bool enabled { get; set; } - public string? server_name { get; set; } - public bool? insecure { get; set; } - public List? alpn { get; set; } - public Utls4Sbox? utls { get; set; } - public Reality4Sbox? reality { get; set; } - } + public class Tls4Sbox + { + public bool enabled { get; set; } + public string? server_name { get; set; } + public bool? insecure { get; set; } + public List? alpn { get; set; } + public Utls4Sbox? utls { get; set; } + public Reality4Sbox? reality { get; set; } + } - public class Multiplex4Sbox - { - public bool enabled { get; set; } - public string protocol { get; set; } - public int max_connections { get; set; } - public bool? padding { get; set; } - } + public class Multiplex4Sbox + { + public bool enabled { get; set; } + public string protocol { get; set; } + public int max_connections { get; set; } + public bool? padding { get; set; } + } - public class Utls4Sbox - { - public bool enabled { get; set; } - public string fingerprint { get; set; } - } + public class Utls4Sbox + { + public bool enabled { get; set; } + public string fingerprint { get; set; } + } - public class Reality4Sbox - { - public bool enabled { get; set; } - public string public_key { get; set; } - public string short_id { get; set; } - } + public class Reality4Sbox + { + public bool enabled { get; set; } + public string public_key { get; set; } + public string short_id { get; set; } + } - public class Transport4Sbox - { - public string? type { get; set; } - public object? host { get; set; } - public string? path { get; set; } - public Headers4Sbox? headers { get; set; } + public class Transport4Sbox + { + public string? type { get; set; } + public object? host { get; set; } + public string? path { get; set; } + public Headers4Sbox? headers { get; set; } - public string? service_name { get; set; } - public string? idle_timeout { get; set; } - public string? ping_timeout { get; set; } - public bool? permit_without_stream { get; set; } - } + public string? service_name { get; set; } + public string? idle_timeout { get; set; } + public string? ping_timeout { get; set; } + public bool? permit_without_stream { get; set; } + } - public class Headers4Sbox - { - public string? Host { get; set; } - } + public class Headers4Sbox + { + public string? Host { get; set; } + } - public class HyObfs4Sbox - { - public string? type { get; set; } - public string? password { get; set; } - } + public class HyObfs4Sbox + { + public string? type { get; set; } + public string? password { get; set; } + } - public class Server4Sbox - { - public string? tag { get; set; } - public string? address { get; set; } - public string? address_resolver { get; set; } - public string? address_strategy { get; set; } - public string? strategy { get; set; } - public string? detour { get; set; } - public string? client_subnet { get; set; } - } + public class Server4Sbox + { + public string? tag { get; set; } + public string? address { get; set; } + public string? address_resolver { get; set; } + public string? address_strategy { get; set; } + public string? strategy { get; set; } + public string? detour { get; set; } + public string? client_subnet { get; set; } + } - public class Experimental4Sbox - { - public CacheFile4Sbox? cache_file { get; set; } - public V2ray_Api4Sbox? v2ray_api { get; set; } - public Clash_Api4Sbox? clash_api { get; set; } - } + public class Experimental4Sbox + { + public CacheFile4Sbox? cache_file { get; set; } + public V2ray_Api4Sbox? v2ray_api { get; set; } + public Clash_Api4Sbox? clash_api { get; set; } + } - public class V2ray_Api4Sbox - { - public string listen { get; set; } - public Stats4Sbox stats { get; set; } - } + public class V2ray_Api4Sbox + { + public string listen { get; set; } + public Stats4Sbox stats { get; set; } + } - public class Clash_Api4Sbox - { - public string? external_controller { get; set; } - public bool? store_selected { get; set; } - } + public class Clash_Api4Sbox + { + public string? external_controller { get; set; } + public bool? store_selected { get; set; } + } - public class Stats4Sbox - { - public bool enabled { get; set; } - public List? inbounds { get; set; } - public List? outbounds { get; set; } - public List? users { get; set; } - } + public class Stats4Sbox + { + public bool enabled { get; set; } + public List? inbounds { get; set; } + public List? outbounds { get; set; } + public List? users { get; set; } + } - public class Fakeip4Sbox - { - public bool enabled { get; set; } - public string inet4_range { get; set; } - public string inet6_range { get; set; } - } + public class Fakeip4Sbox + { + public bool enabled { get; set; } + public string inet4_range { get; set; } + public string inet6_range { get; set; } + } - public class CacheFile4Sbox - { - public bool enabled { get; set; } - public string? path { get; set; } - public string? cache_id { get; set; } - public bool? store_fakeip { get; set; } - } + public class CacheFile4Sbox + { + public bool enabled { get; set; } + public string? path { get; set; } + public string? cache_id { get; set; } + public bool? store_fakeip { get; set; } + } - public class Ruleset4Sbox - { - public string? tag { get; set; } - public string? type { get; set; } - public string? format { get; set; } - public string? path { get; set; } - public string? url { get; set; } - public string? download_detour { get; set; } - public string? update_interval { get; set; } - } -} \ No newline at end of file + public class Ruleset4Sbox + { + public string? tag { get; set; } + public string? type { get; set; } + public string? format { get; set; } + public string? path { get; set; } + public string? url { get; set; } + public string? download_detour { get; set; } + public string? update_interval { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/SpeedTestResult.cs b/v2rayN/ServiceLib/Models/SpeedTestResult.cs index 63016bfc..fad862c5 100644 --- a/v2rayN/ServiceLib/Models/SpeedTestResult.cs +++ b/v2rayN/ServiceLib/Models/SpeedTestResult.cs @@ -1,12 +1,12 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - [Serializable] - public class SpeedTestResult - { - public string? IndexId { get; set; } + [Serializable] + public class SpeedTestResult + { + public string? IndexId { get; set; } - public string? Delay { get; set; } + public string? Delay { get; set; } - public string? Speed { get; set; } - } -} \ No newline at end of file + public string? Speed { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/SsSIP008.cs b/v2rayN/ServiceLib/Models/SsSIP008.cs index 9c5f1a22..3951ba9c 100644 --- a/v2rayN/ServiceLib/Models/SsSIP008.cs +++ b/v2rayN/ServiceLib/Models/SsSIP008.cs @@ -1,18 +1,18 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - public class SsSIP008 - { - public List? servers { get; set; } - } + public class SsSIP008 + { + public List? servers { get; set; } + } - [Serializable] - public class SsServer - { - public string? remarks { get; set; } - public string? server { get; set; } - public string? server_port { get; set; } - public string? method { get; set; } - public string? password { get; set; } - public string? plugin { get; set; } - } -} \ No newline at end of file + [Serializable] + public class SsServer + { + public string? remarks { get; set; } + public string? server { get; set; } + public string? server_port { get; set; } + public string? method { get; set; } + public string? password { get; set; } + public string? plugin { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/SubItem.cs b/v2rayN/ServiceLib/Models/SubItem.cs index b6caa374..a469d36c 100644 --- a/v2rayN/ServiceLib/Models/SubItem.cs +++ b/v2rayN/ServiceLib/Models/SubItem.cs @@ -1,39 +1,39 @@ -using SQLite; +using SQLite; namespace ServiceLib.Models { - [Serializable] - public class SubItem - { - [PrimaryKey] - public string Id { get; set; } + [Serializable] + public class SubItem + { + [PrimaryKey] + public string Id { get; set; } - public string Remarks { get; set; } + public string Remarks { get; set; } - public string Url { get; set; } + public string Url { get; set; } - public string MoreUrl { get; set; } + public string MoreUrl { get; set; } - public bool Enabled { get; set; } = true; + public bool Enabled { get; set; } = true; - public string UserAgent { get; set; } = string.Empty; + public string UserAgent { get; set; } = string.Empty; - public int Sort { get; set; } + public int Sort { get; set; } - public string? Filter { get; set; } + public string? Filter { get; set; } - public int AutoUpdateInterval { get; set; } + public int AutoUpdateInterval { get; set; } - public long UpdateTime { get; set; } + public long UpdateTime { get; set; } - public string? ConvertTarget { get; set; } + public string? ConvertTarget { get; set; } - public string? PrevProfile { get; set; } + public string? PrevProfile { get; set; } - public string? NextProfile { get; set; } + public string? NextProfile { get; set; } - public int? PreSocksPort { get; set; } + public int? PreSocksPort { get; set; } - public string? Memo { get; set; } - } -} \ No newline at end of file + public string? Memo { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/V2rayConfig.cs b/v2rayN/ServiceLib/Models/V2rayConfig.cs index c7e48bd1..8f43dfa1 100644 --- a/v2rayN/ServiceLib/Models/V2rayConfig.cs +++ b/v2rayN/ServiceLib/Models/V2rayConfig.cs @@ -2,400 +2,400 @@ using System.Text.Json.Serialization; namespace ServiceLib.Models { - public class V2rayConfig - { - public string? remarks { get; set; } + public class V2rayConfig + { + public string? remarks { get; set; } - public Log4Ray log { get; set; } + public Log4Ray log { get; set; } - public List inbounds { get; set; } + public List inbounds { get; set; } - public List outbounds { get; set; } + public List outbounds { get; set; } - public Stats4Ray? stats { get; set; } + public Stats4Ray? stats { get; set; } - public Metrics4Ray? metrics { get; set; } + public Metrics4Ray? metrics { get; set; } - public Policy4Ray? policy { get; set; } + public Policy4Ray? policy { get; set; } - public object dns { get; set; } + public object dns { get; set; } - public Routing4Ray routing { get; set; } - } + public Routing4Ray routing { get; set; } + } - public class Stats4Ray - { } + public class Stats4Ray + { } - public class Metrics4Ray - { - public string tag { get; set; } - } + public class Metrics4Ray + { + public string tag { get; set; } + } - public class Policy4Ray - { - public SystemPolicy4Ray system { get; set; } - } + public class Policy4Ray + { + public SystemPolicy4Ray system { get; set; } + } - public class SystemPolicy4Ray - { - public bool statsOutboundUplink { get; set; } - public bool statsOutboundDownlink { get; set; } - } + public class SystemPolicy4Ray + { + public bool statsOutboundUplink { get; set; } + public bool statsOutboundDownlink { get; set; } + } - public class Log4Ray - { - public string? access { get; set; } + public class Log4Ray + { + public string? access { get; set; } - public string? error { get; set; } + public string? error { get; set; } - public string? loglevel { get; set; } - } + public string? loglevel { get; set; } + } - public class Inbounds4Ray - { - public string tag { get; set; } + public class Inbounds4Ray + { + public string tag { get; set; } - public int port { get; set; } + public int port { get; set; } - public string listen { get; set; } + public string listen { get; set; } - public string protocol { get; set; } + public string protocol { get; set; } - public Sniffing4Ray sniffing { get; set; } + public Sniffing4Ray sniffing { get; set; } - public Inboundsettings4Ray settings { get; set; } - } + public Inboundsettings4Ray settings { get; set; } + } - public class Inboundsettings4Ray - { - public string? auth { get; set; } + public class Inboundsettings4Ray + { + public string? auth { get; set; } - public bool? udp { get; set; } + public bool? udp { get; set; } - public string? ip { get; set; } + public string? ip { get; set; } - public string? address { get; set; } + public string? address { get; set; } - public List? clients { get; set; } + public List? clients { get; set; } - public string? decryption { get; set; } + public string? decryption { get; set; } - public bool? allowTransparent { get; set; } + public bool? allowTransparent { get; set; } - public List? accounts { get; set; } - } + public List? accounts { get; set; } + } - public class UsersItem4Ray - { - public string? id { get; set; } + public class UsersItem4Ray + { + public string? id { get; set; } - public int? alterId { get; set; } + public int? alterId { get; set; } - public string? email { get; set; } + public string? email { get; set; } - public string? security { get; set; } + public string? security { get; set; } - public string? encryption { get; set; } + public string? encryption { get; set; } - public string? flow { get; set; } - } + public string? flow { get; set; } + } - public class Sniffing4Ray - { - public bool enabled { get; set; } - public List? destOverride { get; set; } - public bool routeOnly { get; set; } - } + public class Sniffing4Ray + { + public bool enabled { get; set; } + public List? destOverride { get; set; } + public bool routeOnly { get; set; } + } - public class Outbounds4Ray - { - public string tag { get; set; } + public class Outbounds4Ray + { + public string tag { get; set; } - public string protocol { get; set; } + public string protocol { get; set; } - public Outboundsettings4Ray settings { get; set; } + public Outboundsettings4Ray settings { get; set; } - public StreamSettings4Ray streamSettings { get; set; } + public StreamSettings4Ray streamSettings { get; set; } - public Mux4Ray mux { get; set; } - } + public Mux4Ray mux { get; set; } + } - public class Outboundsettings4Ray - { - public List? vnext { get; set; } + public class Outboundsettings4Ray + { + public List? vnext { get; set; } - public List? servers { get; set; } + public List? servers { get; set; } - public Response4Ray? response { get; set; } + public Response4Ray? response { get; set; } - public string domainStrategy { get; set; } + public string domainStrategy { get; set; } - public int? userLevel { get; set; } + public int? userLevel { get; set; } - public FragmentItem4Ray? fragment { get; set; } - } + public FragmentItem4Ray? fragment { get; set; } + } - public class VnextItem4Ray - { - public string address { get; set; } + public class VnextItem4Ray + { + public string address { get; set; } - public int port { get; set; } + public int port { get; set; } - public List users { get; set; } - } + public List users { get; set; } + } - public class ServersItem4Ray - { - public string email { get; set; } + public class ServersItem4Ray + { + public string email { get; set; } - public string address { get; set; } + public string address { get; set; } - public string? method { get; set; } + public string? method { get; set; } - public bool? ota { get; set; } + public bool? ota { get; set; } - public string? password { get; set; } + public string? password { get; set; } - public int port { get; set; } + public int port { get; set; } - public int? level { get; set; } + public int? level { get; set; } - public string flow { get; set; } + public string flow { get; set; } - public List users { get; set; } - } + public List users { get; set; } + } - public class SocksUsersItem4Ray - { - public string user { get; set; } + public class SocksUsersItem4Ray + { + public string user { get; set; } - public string pass { get; set; } + public string pass { get; set; } - public int? level { get; set; } - } + public int? level { get; set; } + } - public class Mux4Ray - { - public bool enabled { get; set; } - public int? concurrency { get; set; } - public int? xudpConcurrency { get; set; } - public string? xudpProxyUDP443 { get; set; } - } + public class Mux4Ray + { + public bool enabled { get; set; } + public int? concurrency { get; set; } + public int? xudpConcurrency { get; set; } + public string? xudpProxyUDP443 { get; set; } + } - public class Response4Ray - { - public string type { get; set; } - } + public class Response4Ray + { + public string type { get; set; } + } - public class Dns4Ray - { - public List servers { get; set; } - } + public class Dns4Ray + { + public List servers { get; set; } + } - public class DnsServer4Ray - { - public string? address { get; set; } - public List? domains { get; set; } - } + public class DnsServer4Ray + { + public string? address { get; set; } + public List? domains { get; set; } + } - public class Routing4Ray - { - public string domainStrategy { get; set; } + public class Routing4Ray + { + public string domainStrategy { get; set; } - public string? domainMatcher { get; set; } + public string? domainMatcher { get; set; } - public List rules { get; set; } + public List rules { get; set; } - public List? balancers { get; set; } - } + public List? balancers { get; set; } + } - [Serializable] - public class RulesItem4Ray - { - public string? type { get; set; } + [Serializable] + public class RulesItem4Ray + { + public string? type { get; set; } - public string? port { get; set; } - public string? network { get; set; } + public string? port { get; set; } + public string? network { get; set; } - public List? inboundTag { get; set; } + public List? inboundTag { get; set; } - public string? outboundTag { get; set; } + public string? outboundTag { get; set; } - public string? balancerTag { get; set; } + public string? balancerTag { get; set; } - public List? ip { get; set; } + public List? ip { get; set; } - public List? domain { get; set; } + public List? domain { get; set; } - public List? protocol { get; set; } - } + public List? protocol { get; set; } + } - public class BalancersItem4Ray - { - public List? selector { get; set; } - public BalancersStrategy4Ray? strategy { get; set; } - public string? tag { get; set; } - } + public class BalancersItem4Ray + { + public List? selector { get; set; } + public BalancersStrategy4Ray? strategy { get; set; } + public string? tag { get; set; } + } - public class BalancersStrategy4Ray - { - public string? type { get; set; } - } + public class BalancersStrategy4Ray + { + public string? type { get; set; } + } - public class StreamSettings4Ray - { - public string network { get; set; } + public class StreamSettings4Ray + { + public string network { get; set; } - public string security { get; set; } + public string security { get; set; } - public TlsSettings4Ray? tlsSettings { get; set; } + public TlsSettings4Ray? tlsSettings { get; set; } - public TcpSettings4Ray? tcpSettings { get; set; } + public TcpSettings4Ray? tcpSettings { get; set; } - public KcpSettings4Ray? kcpSettings { get; set; } + public KcpSettings4Ray? kcpSettings { get; set; } - public WsSettings4Ray? wsSettings { get; set; } + public WsSettings4Ray? wsSettings { get; set; } - public HttpupgradeSettings4Ray? httpupgradeSettings { get; set; } + public HttpupgradeSettings4Ray? httpupgradeSettings { get; set; } - public XhttpSettings4Ray? xhttpSettings { get; set; } + public XhttpSettings4Ray? xhttpSettings { get; set; } - public HttpSettings4Ray? httpSettings { get; set; } + public HttpSettings4Ray? httpSettings { get; set; } - public QuicSettings4Ray? quicSettings { get; set; } + public QuicSettings4Ray? quicSettings { get; set; } - public TlsSettings4Ray? realitySettings { get; set; } + public TlsSettings4Ray? realitySettings { get; set; } - public GrpcSettings4Ray? grpcSettings { get; set; } + public GrpcSettings4Ray? grpcSettings { get; set; } - public Sockopt4Ray? sockopt { get; set; } - } + public Sockopt4Ray? sockopt { get; set; } + } - public class TlsSettings4Ray - { - public bool? allowInsecure { get; set; } + public class TlsSettings4Ray + { + public bool? allowInsecure { get; set; } - public string? serverName { get; set; } + public string? serverName { get; set; } - public List? alpn { get; set; } + public List? alpn { get; set; } - public string? fingerprint { get; set; } + public string? fingerprint { get; set; } - public bool? show { get; set; } - public string? publicKey { get; set; } - public string? shortId { get; set; } - public string? spiderX { get; set; } - } + public bool? show { get; set; } + public string? publicKey { get; set; } + public string? shortId { get; set; } + public string? spiderX { get; set; } + } - public class TcpSettings4Ray - { - public Header4Ray header { get; set; } - } + public class TcpSettings4Ray + { + public Header4Ray header { get; set; } + } - public class Header4Ray - { - public string type { get; set; } + public class Header4Ray + { + public string type { get; set; } - public object request { get; set; } + public object request { get; set; } - public object response { get; set; } - } + public object response { get; set; } + } - public class KcpSettings4Ray - { - public int mtu { get; set; } + public class KcpSettings4Ray + { + public int mtu { get; set; } - public int tti { get; set; } + public int tti { get; set; } - public int uplinkCapacity { get; set; } + public int uplinkCapacity { get; set; } - public int downlinkCapacity { get; set; } + public int downlinkCapacity { get; set; } - public bool congestion { get; set; } + public bool congestion { get; set; } - public int readBufferSize { get; set; } + public int readBufferSize { get; set; } - public int writeBufferSize { get; set; } + public int writeBufferSize { get; set; } - public Header4Ray header { get; set; } + public Header4Ray header { get; set; } - public string seed { get; set; } - } + public string seed { get; set; } + } - public class WsSettings4Ray - { - public string? path { get; set; } - public string? host { get; set; } + public class WsSettings4Ray + { + public string? path { get; set; } + public string? host { get; set; } - public Headers4Ray headers { get; set; } - } + public Headers4Ray headers { get; set; } + } - public class Headers4Ray - { - public string Host { get; set; } + public class Headers4Ray + { + public string Host { get; set; } - [JsonPropertyName("User-Agent")] - public string UserAgent { get; set; } - } + [JsonPropertyName("User-Agent")] + public string UserAgent { get; set; } + } - public class HttpupgradeSettings4Ray - { - public string? path { get; set; } + public class HttpupgradeSettings4Ray + { + public string? path { get; set; } - public string? host { get; set; } - } + public string? host { get; set; } + } - public class XhttpSettings4Ray - { - public string? path { get; set; } - public string? host { get; set; } - public string? mode { get; set; } - public object? extra { get; set; } - } + public class XhttpSettings4Ray + { + public string? path { get; set; } + public string? host { get; set; } + public string? mode { get; set; } + public object? extra { get; set; } + } - public class HttpSettings4Ray - { - public string? path { get; set; } + public class HttpSettings4Ray + { + public string? path { get; set; } - public List? host { get; set; } - } + public List? host { get; set; } + } - public class QuicSettings4Ray - { - public string security { get; set; } + public class QuicSettings4Ray + { + public string security { get; set; } - public string key { get; set; } + public string key { get; set; } - public Header4Ray header { get; set; } - } + public Header4Ray header { get; set; } + } - public class GrpcSettings4Ray - { - public string? authority { get; set; } - public string? serviceName { get; set; } - public bool multiMode { get; set; } - public int? idle_timeout { get; set; } - public int? health_check_timeout { get; set; } - public bool? permit_without_stream { get; set; } - public int? initial_windows_size { get; set; } - } + public class GrpcSettings4Ray + { + public string? authority { get; set; } + public string? serviceName { get; set; } + public bool multiMode { get; set; } + public int? idle_timeout { get; set; } + public int? health_check_timeout { get; set; } + public bool? permit_without_stream { get; set; } + public int? initial_windows_size { get; set; } + } - public class AccountsItem4Ray - { - public string user { get; set; } + public class AccountsItem4Ray + { + public string user { get; set; } - public string pass { get; set; } - } + public string pass { get; set; } + } - public class Sockopt4Ray - { - public string? dialerProxy { get; set; } - } + public class Sockopt4Ray + { + public string? dialerProxy { get; set; } + } - public class FragmentItem4Ray - { - public string? packets { get; set; } - public string? length { get; set; } - public string? interval { get; set; } - } -} \ No newline at end of file + public class FragmentItem4Ray + { + public string? packets { get; set; } + public string? length { get; set; } + public string? interval { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/V2rayMetricsVars.cs b/v2rayN/ServiceLib/Models/V2rayMetricsVars.cs index acd4ea45..4302159b 100644 --- a/v2rayN/ServiceLib/Models/V2rayMetricsVars.cs +++ b/v2rayN/ServiceLib/Models/V2rayMetricsVars.cs @@ -1,20 +1,20 @@ -using System.Collections; +using System.Collections; namespace ServiceLib.Models { - internal class V2rayMetricsVars - { - public V2rayMetricsVarsStats? stats { get; set; } - } + internal class V2rayMetricsVars + { + public V2rayMetricsVarsStats? stats { get; set; } + } } public class V2rayMetricsVarsStats { - public Hashtable? outbound { get; set; } + public Hashtable? outbound { get; set; } } public class V2rayMetricsVarsLink { - public long downlink { get; set; } - public long uplink { get; set; } -} \ No newline at end of file + public long downlink { get; set; } + public long uplink { get; set; } +} diff --git a/v2rayN/ServiceLib/Models/V2rayTcpRequest.cs b/v2rayN/ServiceLib/Models/V2rayTcpRequest.cs index 98564415..4a3e49d6 100644 --- a/v2rayN/ServiceLib/Models/V2rayTcpRequest.cs +++ b/v2rayN/ServiceLib/Models/V2rayTcpRequest.cs @@ -1,21 +1,21 @@ -namespace ServiceLib.Models +namespace ServiceLib.Models { - /// - /// Tcp伪装http的Request,只要Host - /// - public class V2rayTcpRequest - { - /// - /// - /// - public RequestHeaders headers { get; set; } - } + /// + /// Tcp伪装http的Request,只要Host + /// + public class V2rayTcpRequest + { + /// + /// + /// + public RequestHeaders headers { get; set; } + } - public class RequestHeaders - { - /// - /// - /// - public List Host { get; set; } - } -} \ No newline at end of file + public class RequestHeaders + { + /// + /// + /// + public List Host { get; set; } + } +} diff --git a/v2rayN/ServiceLib/Models/VmessQRCode.cs b/v2rayN/ServiceLib/Models/VmessQRCode.cs index 92f93bf3..86b10aa9 100644 --- a/v2rayN/ServiceLib/Models/VmessQRCode.cs +++ b/v2rayN/ServiceLib/Models/VmessQRCode.cs @@ -1,44 +1,44 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; namespace ServiceLib.Models { - /// - /// https://github.com/2dust/v2rayN/wiki/ - /// - [Serializable] - public class VmessQRCode - { - [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] - public int v { get; set; } = 2; + /// + /// https://github.com/2dust/v2rayN/wiki/ + /// + [Serializable] + public class VmessQRCode + { + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public int v { get; set; } = 2; - public string ps { get; set; } = string.Empty; + public string ps { get; set; } = string.Empty; - public string add { get; set; } = string.Empty; + public string add { get; set; } = string.Empty; - [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] - public int port { get; set; } = 0; + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public int port { get; set; } = 0; - public string id { get; set; } = string.Empty; + public string id { get; set; } = string.Empty; - [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] - public int aid { get; set; } = 0; + [JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public int aid { get; set; } = 0; - public string scy { get; set; } = string.Empty; + public string scy { get; set; } = string.Empty; - public string net { get; set; } = string.Empty; + public string net { get; set; } = string.Empty; - public string type { get; set; } = string.Empty; + public string type { get; set; } = string.Empty; - public string host { get; set; } = string.Empty; + public string host { get; set; } = string.Empty; - public string path { get; set; } = string.Empty; + public string path { get; set; } = string.Empty; - public string tls { get; set; } = string.Empty; + public string tls { get; set; } = string.Empty; - public string sni { get; set; } = string.Empty; + public string sni { get; set; } = string.Empty; - public string alpn { get; set; } = string.Empty; + public string alpn { get; set; } = string.Empty; - public string fp { get; set; } = string.Empty; - } -} \ No newline at end of file + public string fp { get; set; } = string.Empty; + } +} diff --git a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs index 002a10ed..bfa4879a 100644 --- a/v2rayN/ServiceLib/Resx/ResUI.Designer.cs +++ b/v2rayN/ServiceLib/Resx/ResUI.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 @@ -9,3881 +9,3881 @@ //------------------------------------------------------------------------------ namespace ServiceLib.Resx { - using System; - - - /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 - /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class ResUI { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal ResUI() { - } - - /// - /// 返回此类使用的缓存的 ResourceManager 实例。 - /// - [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("ServiceLib.Resx.ResUI", typeof(ResUI).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 - /// - public static string AddBatchRoutingRulesYesNo { - get { - return ResourceManager.GetString("AddBatchRoutingRulesYesNo", resourceCulture); - } - } - - /// - /// 查找类似 All 的本地化字符串。 - /// - public static string AllGroupServers { - get { - return ResourceManager.GetString("AllGroupServers", resourceCulture); - } - } - - /// - /// 查找类似 Export Share Link to Clipboard Successfully 的本地化字符串。 - /// - public static string BatchExportURLSuccessfully { - get { - return ResourceManager.GetString("BatchExportURLSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Please check the server settings first 的本地化字符串。 - /// - public static string CheckServerSettings { - get { - return ResourceManager.GetString("CheckServerSettings", resourceCulture); - } - } - - /// - /// 查找类似 Invalid configuration format 的本地化字符串。 - /// - public static string ConfigurationFormatIncorrect { - get { - return ResourceManager.GetString("ConfigurationFormatIncorrect", resourceCulture); - } - } - - /// - /// 查找类似 Host filter 的本地化字符串。 - /// - public static string ConnectionsHostFilterTitle { - get { - return ResourceManager.GetString("ConnectionsHostFilterTitle", resourceCulture); - } - } - - /// - /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 - /// - public static string CustomServerTips { - get { - return ResourceManager.GetString("CustomServerTips", resourceCulture); - } - } - - /// - /// 查找类似 Downloading... 的本地化字符串。 - /// - public static string Downloading { - get { - return ResourceManager.GetString("Downloading", resourceCulture); - } - } - - /// - /// 查找类似 Download 的本地化字符串。 - /// - public static string downloadSpeed { - get { - return ResourceManager.GetString("downloadSpeed", resourceCulture); - } - } - - /// - /// 查找类似 Whether to download? {0} 的本地化字符串。 - /// - public static string DownloadYesNo { - get { - return ResourceManager.GetString("DownloadYesNo", resourceCulture); - } - } - - /// - /// 查找类似 Failed to convert configuration file 的本地化字符串。 - /// - public static string FailedConversionConfiguration { - get { - return ResourceManager.GetString("FailedConversionConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Failed to generate default configuration file 的本地化字符串。 - /// - public static string FailedGenDefaultConfiguration { - get { - return ResourceManager.GetString("FailedGenDefaultConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Failed to get the default configuration 的本地化字符串。 - /// - public static string FailedGetDefaultConfiguration { - get { - return ResourceManager.GetString("FailedGetDefaultConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Failed to import custom configuration server 的本地化字符串。 - /// - public static string FailedImportedCustomServer { - get { - return ResourceManager.GetString("FailedImportedCustomServer", resourceCulture); - } - } - - /// - /// 查找类似 Failed to read configuration file 的本地化字符串。 - /// - public static string FailedReadConfiguration { - get { - return ResourceManager.GetString("FailedReadConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Failed to run Core, please see the log 的本地化字符串。 - /// - public static string FailedToRunCore { - get { - return ResourceManager.GetString("FailedToRunCore", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 - /// - public static string FillCorrectDNSText { - get { - return ResourceManager.GetString("FillCorrectDNSText", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the correct format server port 的本地化字符串。 - /// - public static string FillCorrectServerPort { - get { - return ResourceManager.GetString("FillCorrectServerPort", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the local listening port 的本地化字符串。 - /// - public static string FillLocalListeningPort { - get { - return ResourceManager.GetString("FillLocalListeningPort", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the password 的本地化字符串。 - /// - public static string FillPassword { - get { - return ResourceManager.GetString("FillPassword", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the server address 的本地化字符串。 - /// - public static string FillServerAddress { - get { - return ResourceManager.GetString("FillServerAddress", resourceCulture); - } - } - - /// - /// 查找类似 Please browse to import server configuration 的本地化字符串。 - /// - public static string FillServerAddressCustom { - get { - return ResourceManager.GetString("FillServerAddressCustom", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the user ID 的本地化字符串。 - /// - public static string FillUUID { - get { - return ResourceManager.GetString("FillUUID", resourceCulture); - } - } - - /// - /// 查找类似 Transport 的本地化字符串。 - /// - public static string GbTransport { - get { - return ResourceManager.GetString("GbTransport", resourceCulture); - } - } - - /// - /// 查找类似 Is not the correct configuration, please check 的本地化字符串。 - /// - public static string Incorrectconfiguration { - get { - return ResourceManager.GetString("Incorrectconfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Initial Configuration 的本地化字符串。 - /// - public static string InitialConfiguration { - get { - return ResourceManager.GetString("InitialConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Please do not use the insecure HTTP protocol subscription address 的本地化字符串。 - /// - public static string InsecureUrlProtocol { - get { - return ResourceManager.GetString("InsecureUrlProtocol", resourceCulture); - } - } - - /// - /// 查找类似 Invalid address (Url) 的本地化字符串。 - /// - public static string InvalidUrlTip { - get { - return ResourceManager.GetString("InvalidUrlTip", resourceCulture); - } - } - - /// - /// 查找类似 {0} {1} already up to date. 的本地化字符串。 - /// - public static string IsLatestCore { - get { - return ResourceManager.GetString("IsLatestCore", resourceCulture); - } - } - - /// - /// 查找类似 {0} {1} already up to date. 的本地化字符串。 - /// - public static string IsLatestN { - get { - return ResourceManager.GetString("IsLatestN", resourceCulture); - } - } - - /// - /// 查找类似 LAN 的本地化字符串。 - /// - public static string LabLAN { - get { - return ResourceManager.GetString("LabLAN", resourceCulture); - } - } - - /// - /// 查找类似 Local 的本地化字符串。 - /// - public static string LabLocal { - get { - return ResourceManager.GetString("LabLocal", resourceCulture); - } - } - - /// - /// 查找类似 Invalid backup file 的本地化字符串。 - /// - public static string LocalRestoreInvalidZipTips { - get { - return ResourceManager.GetString("LocalRestoreInvalidZipTips", resourceCulture); - } - } - - /// - /// 查找类似 Address 的本地化字符串。 - /// - public static string LvAddress { - get { - return ResourceManager.GetString("LvAddress", resourceCulture); - } - } - - /// - /// 查找类似 Automatic update interval (minutes) 的本地化字符串。 - /// - public static string LvAutoUpdateInterval { - get { - return ResourceManager.GetString("LvAutoUpdateInterval", resourceCulture); - } - } - - /// - /// 查找类似 Convert target type 的本地化字符串。 - /// - public static string LvConvertTarget { - get { - return ResourceManager.GetString("LvConvertTarget", resourceCulture); - } - } - - /// - /// 查找类似 Please leave blank if no conversion is required 的本地化字符串。 - /// - public static string LvConvertTargetTip { - get { - return ResourceManager.GetString("LvConvertTargetTip", resourceCulture); - } - } - - /// - /// 查找类似 Count 的本地化字符串。 - /// - public static string LvCount { - get { - return ResourceManager.GetString("LvCount", resourceCulture); - } - } - - /// - /// 查找类似 Custom icon 的本地化字符串。 - /// - public static string LvCustomIcon { - get { - return ResourceManager.GetString("LvCustomIcon", resourceCulture); - } - } - - /// - /// 查找类似 Custom the rule-set of sing-box 的本地化字符串。 - /// - public static string LvCustomRulesetPath4Singbox { - get { - return ResourceManager.GetString("LvCustomRulesetPath4Singbox", resourceCulture); - } - } - - /// - /// 查找类似 Enable update 的本地化字符串。 - /// - public static string LvEnabled { - get { - return ResourceManager.GetString("LvEnabled", resourceCulture); - } - } - - /// - /// 查找类似 Security 的本地化字符串。 - /// - public static string LvEncryptionMethod { - get { - return ResourceManager.GetString("LvEncryptionMethod", resourceCulture); - } - } - - /// - /// 查找类似 Remarks regular filter 的本地化字符串。 - /// - public static string LvFilter { - get { - return ResourceManager.GetString("LvFilter", resourceCulture); - } - } - - /// - /// 查找类似 Remarks Memo 的本地化字符串。 - /// - public static string LvMemo { - get { - return ResourceManager.GetString("LvMemo", resourceCulture); - } - } - - /// - /// 查找类似 More URLs, separated by commas; Subscription conversion will be invalid 的本地化字符串。 - /// - public static string LvMoreUrl { - get { - return ResourceManager.GetString("LvMoreUrl", resourceCulture); - } - } - - /// - /// 查找类似 Next proxy remarks 的本地化字符串。 - /// - public static string LvNextProfile { - get { - return ResourceManager.GetString("LvNextProfile", resourceCulture); - } - } - - /// - /// 查找类似 Port 的本地化字符串。 - /// - public static string LvPort { - get { - return ResourceManager.GetString("LvPort", resourceCulture); - } - } - - /// - /// 查找类似 Previous proxy remarks 的本地化字符串。 - /// - public static string LvPrevProfile { - get { - return ResourceManager.GetString("LvPrevProfile", resourceCulture); - } - } - - /// - /// 查找类似 Please make sure the remarks exists and is unique 的本地化字符串。 - /// - public static string LvPrevProfileTip { - get { - return ResourceManager.GetString("LvPrevProfileTip", resourceCulture); - } - } - - /// - /// 查找类似 Remarks 的本地化字符串。 - /// - public static string LvRemarks { - get { - return ResourceManager.GetString("LvRemarks", resourceCulture); - } - } - - /// - /// 查找类似 Type 的本地化字符串。 - /// - public static string LvServiceType { - get { - return ResourceManager.GetString("LvServiceType", resourceCulture); - } - } - - /// - /// 查找类似 Sort 的本地化字符串。 - /// - public static string LvSort { - get { - return ResourceManager.GetString("LvSort", resourceCulture); - } - } - - /// - /// 查找类似 Subs group 的本地化字符串。 - /// - public static string LvSubscription { - get { - return ResourceManager.GetString("LvSubscription", resourceCulture); - } - } - - /// - /// 查找类似 Delay(ms) 的本地化字符串。 - /// - public static string LvTestDelay { - get { - return ResourceManager.GetString("LvTestDelay", resourceCulture); - } - } - - /// - /// 查找类似 Speed(M/s) 的本地化字符串。 - /// - public static string LvTestSpeed { - get { - return ResourceManager.GetString("LvTestSpeed", resourceCulture); - } - } - - /// - /// 查找类似 TLS 的本地化字符串。 - /// - public static string LvTLS { - get { - return ResourceManager.GetString("LvTLS", resourceCulture); - } - } - - /// - /// 查找类似 Download traffic today 的本地化字符串。 - /// - public static string LvTodayDownloadDataAmount { - get { - return ResourceManager.GetString("LvTodayDownloadDataAmount", resourceCulture); - } - } - - /// - /// 查找类似 Upload traffic today 的本地化字符串。 - /// - public static string LvTodayUploadDataAmount { - get { - return ResourceManager.GetString("LvTodayUploadDataAmount", resourceCulture); - } - } - - /// - /// 查找类似 Total download traffic 的本地化字符串。 - /// - public static string LvTotalDownloadDataAmount { - get { - return ResourceManager.GetString("LvTotalDownloadDataAmount", resourceCulture); - } - } - - /// - /// 查找类似 Total upload traffic 的本地化字符串。 - /// - public static string LvTotalUploadDataAmount { - get { - return ResourceManager.GetString("LvTotalUploadDataAmount", resourceCulture); - } - } - - /// - /// 查找类似 Transport 的本地化字符串。 - /// - public static string LvTransportProtocol { - get { - return ResourceManager.GetString("LvTransportProtocol", resourceCulture); - } - } - - /// - /// 查找类似 URL (optional) 的本地化字符串。 - /// - public static string LvUrl { - get { - return ResourceManager.GetString("LvUrl", resourceCulture); - } - } - - /// - /// 查找类似 User Agent 的本地化字符串。 - /// - public static string LvUserAgent { - get { - return ResourceManager.GetString("LvUserAgent", resourceCulture); - } - } - - /// - /// 查找类似 WebDav Check 的本地化字符串。 - /// - public static string LvWebDavCheck { - get { - return ResourceManager.GetString("LvWebDavCheck", resourceCulture); - } - } - - /// - /// 查找类似 Remote folder name (optional) 的本地化字符串。 - /// - public static string LvWebDavDirName { - get { - return ResourceManager.GetString("LvWebDavDirName", resourceCulture); - } - } - - /// - /// 查找类似 WebDav Password 的本地化字符串。 - /// - public static string LvWebDavPassword { - get { - return ResourceManager.GetString("LvWebDavPassword", resourceCulture); - } - } - - /// - /// 查找类似 WebDav Url 的本地化字符串。 - /// - public static string LvWebDavUrl { - get { - return ResourceManager.GetString("LvWebDavUrl", resourceCulture); - } - } - - /// - /// 查找类似 WebDav User Name 的本地化字符串。 - /// - public static string LvWebDavUserName { - get { - return ResourceManager.GetString("LvWebDavUserName", resourceCulture); - } - } - - /// - /// 查找类似 Add a custom configuration server 的本地化字符串。 - /// - public static string menuAddCustomServer { - get { - return ResourceManager.GetString("menuAddCustomServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [HTTP] server 的本地化字符串。 - /// - public static string menuAddHttpServer { - get { - return ResourceManager.GetString("menuAddHttpServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [Hysteria2] server 的本地化字符串。 - /// - public static string menuAddHysteria2Server { - get { - return ResourceManager.GetString("menuAddHysteria2Server", resourceCulture); - } - } - - /// - /// 查找类似 Import Share Links from clipboard (Ctrl+V) 的本地化字符串。 - /// - public static string menuAddServerViaClipboard { - get { - return ResourceManager.GetString("menuAddServerViaClipboard", resourceCulture); - } - } - - /// - /// 查找类似 Scan QR code in the image 的本地化字符串。 - /// - public static string menuAddServerViaImage { - get { - return ResourceManager.GetString("menuAddServerViaImage", resourceCulture); - } - } - - /// - /// 查找类似 Scan QR code on the screen (Ctrl+S) 的本地化字符串。 - /// - public static string menuAddServerViaScan { - get { - return ResourceManager.GetString("menuAddServerViaScan", resourceCulture); - } - } - - /// - /// 查找类似 Add [Shadowsocks] server 的本地化字符串。 - /// - public static string menuAddShadowsocksServer { - get { - return ResourceManager.GetString("menuAddShadowsocksServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [SOCKS] server 的本地化字符串。 - /// - public static string menuAddSocksServer { - get { - return ResourceManager.GetString("menuAddSocksServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [Trojan] server 的本地化字符串。 - /// - public static string menuAddTrojanServer { - get { - return ResourceManager.GetString("menuAddTrojanServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [TUIC] server 的本地化字符串。 - /// - public static string menuAddTuicServer { - get { - return ResourceManager.GetString("menuAddTuicServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [VLESS] server 的本地化字符串。 - /// - public static string menuAddVlessServer { - get { - return ResourceManager.GetString("menuAddVlessServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [VMess] server 的本地化字符串。 - /// - public static string menuAddVmessServer { - get { - return ResourceManager.GetString("menuAddVmessServer", resourceCulture); - } - } - - /// - /// 查找类似 Add [WireGuard] server 的本地化字符串。 - /// - public static string menuAddWireguardServer { - get { - return ResourceManager.GetString("menuAddWireguardServer", resourceCulture); - } - } - - /// - /// 查找类似 Backup and Restore 的本地化字符串。 - /// - public static string menuBackupAndRestore { - get { - return ResourceManager.GetString("menuBackupAndRestore", resourceCulture); - } - } - - /// - /// 查找类似 Check Update 的本地化字符串。 - /// - public static string menuCheckUpdate { - get { - return ResourceManager.GetString("menuCheckUpdate", resourceCulture); - } - } - - /// - /// 查找类似 Clear all service statistics 的本地化字符串。 - /// - public static string menuClearServerStatistics { - get { - return ResourceManager.GetString("menuClearServerStatistics", resourceCulture); - } - } - - /// - /// 查找类似 Close 的本地化字符串。 - /// - public static string menuClose { - get { - return ResourceManager.GetString("menuClose", resourceCulture); - } - } - - /// - /// 查找类似 Close Connection 的本地化字符串。 - /// - public static string menuConnectionClose { - get { - return ResourceManager.GetString("menuConnectionClose", resourceCulture); - } - } - - /// - /// 查找类似 Close All Connection 的本地化字符串。 - /// - public static string menuConnectionCloseAll { - get { - return ResourceManager.GetString("menuConnectionCloseAll", resourceCulture); - } - } - - /// - /// 查找类似 Copy proxy command to clipboard 的本地化字符串。 - /// - public static string menuCopyProxyCmdToClipboard { - get { - return ResourceManager.GetString("menuCopyProxyCmdToClipboard", resourceCulture); - } - } - - /// - /// 查找类似 Clone selected server 的本地化字符串。 - /// - public static string menuCopyServer { - get { - return ResourceManager.GetString("menuCopyServer", resourceCulture); - } - } - - /// - /// 查找类似 DNS Settings 的本地化字符串。 - /// - public static string menuDNSSetting { - get { - return ResourceManager.GetString("menuDNSSetting", resourceCulture); - } - } - - /// - /// 查找类似 Edit Server (Ctrl+D) 的本地化字符串。 - /// - public static string menuEditServer { - get { - return ResourceManager.GetString("menuEditServer", resourceCulture); - } - } - - /// - /// 查找类似 Exit 的本地化字符串。 - /// - public static string menuExit { - get { - return ResourceManager.GetString("menuExit", resourceCulture); - } - } - - /// - /// 查找类似 Are you sure to exit? 的本地化字符串。 - /// - public static string menuExitTips { - get { - return ResourceManager.GetString("menuExitTips", resourceCulture); - } - } - - /// - /// 查找类似 Export selected server for complete configuration 的本地化字符串。 - /// - public static string menuExport2ClientConfig { - get { - return ResourceManager.GetString("menuExport2ClientConfig", resourceCulture); - } - } - - /// - /// 查找类似 Export selected server for complete configuration to clipboard 的本地化字符串。 - /// - public static string menuExport2ClientConfigClipboard { - get { - return ResourceManager.GetString("menuExport2ClientConfigClipboard", resourceCulture); - } - } - - /// - /// 查找类似 Export Share Link to Clipboard (Ctrl+C) 的本地化字符串。 - /// - public static string menuExport2ShareUrl { - get { - return ResourceManager.GetString("menuExport2ShareUrl", resourceCulture); - } - } - - /// - /// 查找类似 Export Base64-encoded Share Links to Clipboard 的本地化字符串。 - /// - public static string menuExport2ShareUrlBase64 { - get { - return ResourceManager.GetString("menuExport2ShareUrlBase64", resourceCulture); - } - } - - /// - /// 查找类似 Global Hotkey Setting 的本地化字符串。 - /// - public static string menuGlobalHotkeySetting { - get { - return ResourceManager.GetString("menuGlobalHotkeySetting", resourceCulture); - } - } - - /// - /// 查找类似 Help 的本地化字符串。 - /// - public static string menuHelp { - get { - return ResourceManager.GetString("menuHelp", resourceCulture); - } - } - - /// - /// 查找类似 Import Rules From Clipboard 的本地化字符串。 - /// - public static string menuImportRulesFromClipboard { - get { - return ResourceManager.GetString("menuImportRulesFromClipboard", resourceCulture); - } - } - - /// - /// 查找类似 Import Rules From File 的本地化字符串。 - /// - public static string menuImportRulesFromFile { - get { - return ResourceManager.GetString("menuImportRulesFromFile", resourceCulture); - } - } - - /// - /// 查找类似 Import Rules From Subscription URL 的本地化字符串。 - /// - public static string menuImportRulesFromUrl { - get { - return ResourceManager.GetString("menuImportRulesFromUrl", resourceCulture); - } - } - - /// - /// 查找类似 Backup to local 的本地化字符串。 - /// - public static string menuLocalBackup { - get { - return ResourceManager.GetString("menuLocalBackup", resourceCulture); - } - } - - /// - /// 查找类似 Local 的本地化字符串。 - /// - public static string menuLocalBackupAndRestore { - get { - return ResourceManager.GetString("menuLocalBackupAndRestore", resourceCulture); - } - } - - /// - /// 查找类似 Restore from local 的本地化字符串。 - /// - public static string menuLocalRestore { - get { - return ResourceManager.GetString("menuLocalRestore", resourceCulture); - } - } - - /// - /// 查找类似 One-click multi-test latency and speed (Ctrl+E) 的本地化字符串。 - /// - public static string menuMixedTestServer { - get { - return ResourceManager.GetString("menuMixedTestServer", resourceCulture); - } - } - - /// - /// 查找类似 Direct 的本地化字符串。 - /// - public static string menuModeDirect { - get { - return ResourceManager.GetString("menuModeDirect", resourceCulture); - } - } - - /// - /// 查找类似 Global 的本地化字符串。 - /// - public static string menuModeGlobal { - get { - return ResourceManager.GetString("menuModeGlobal", resourceCulture); - } - } - - /// - /// 查找类似 Do not change 的本地化字符串。 - /// - public static string menuModeNothing { - get { - return ResourceManager.GetString("menuModeNothing", resourceCulture); - } - } - - /// - /// 查找类似 Rule 的本地化字符串。 - /// - public static string menuModeRule { - get { - return ResourceManager.GetString("menuModeRule", resourceCulture); - } - } - - /// - /// 查找类似 Move to bottom (B) 的本地化字符串。 - /// - public static string menuMoveBottom { - get { - return ResourceManager.GetString("menuMoveBottom", resourceCulture); - } - } - - /// - /// 查找类似 Down (D) 的本地化字符串。 - /// - public static string menuMoveDown { - get { - return ResourceManager.GetString("menuMoveDown", resourceCulture); - } - } - - /// - /// 查找类似 Move up and down 的本地化字符串。 - /// - public static string menuMoveTo { - get { - return ResourceManager.GetString("menuMoveTo", resourceCulture); - } - } - - /// - /// 查找类似 Move to group 的本地化字符串。 - /// - public static string menuMoveToGroup { - get { - return ResourceManager.GetString("menuMoveToGroup", resourceCulture); - } - } - - /// - /// 查找类似 Move to top (T) 的本地化字符串。 - /// - public static string menuMoveTop { - get { - return ResourceManager.GetString("menuMoveTop", resourceCulture); - } - } - - /// - /// 查找类似 Up (U) 的本地化字符串。 - /// - public static string menuMoveUp { - get { - return ResourceManager.GetString("menuMoveUp", resourceCulture); - } - } - - /// - /// 查找类似 Clear all 的本地化字符串。 - /// - public static string menuMsgViewClear { - get { - return ResourceManager.GetString("menuMsgViewClear", resourceCulture); - } - } - - /// - /// 查找类似 Copy (Ctrl+C) 的本地化字符串。 - /// - public static string menuMsgViewCopy { - get { - return ResourceManager.GetString("menuMsgViewCopy", resourceCulture); - } - } - - /// - /// 查找类似 Copy all 的本地化字符串。 - /// - public static string menuMsgViewCopyAll { - get { - return ResourceManager.GetString("menuMsgViewCopyAll", resourceCulture); - } - } - - /// - /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 - /// - public static string menuMsgViewSelectAll { - get { - return ResourceManager.GetString("menuMsgViewSelectAll", resourceCulture); - } - } - - /// - /// 查找类似 Open the storage location 的本地化字符串。 - /// - public static string menuOpenTheFileLocation { - get { - return ResourceManager.GetString("menuOpenTheFileLocation", resourceCulture); - } - } - - /// - /// 查找类似 Option Setting 的本地化字符串。 - /// - public static string menuOptionSetting { - get { - return ResourceManager.GetString("menuOptionSetting", resourceCulture); - } - } - - /// - /// 查找类似 Auto column width adjustment 的本地化字符串。 - /// - public static string menuProfileAutofitColumnWidth { - get { - return ResourceManager.GetString("menuProfileAutofitColumnWidth", resourceCulture); - } - } - - /// - /// 查找类似 Promotion 的本地化字符串。 - /// - public static string menuPromotion { - get { - return ResourceManager.GetString("menuPromotion", resourceCulture); - } - } - - /// - /// 查找类似 Latency Test 的本地化字符串。 - /// - public static string menuProxiesDelaytest { - get { - return ResourceManager.GetString("menuProxiesDelaytest", resourceCulture); - } - } - - /// - /// 查找类似 Part Node Latency Test 的本地化字符串。 - /// - public static string menuProxiesDelaytestPart { - get { - return ResourceManager.GetString("menuProxiesDelaytestPart", resourceCulture); - } - } - - /// - /// 查找类似 Refresh Proxies 的本地化字符串。 - /// - public static string menuProxiesReload { - get { - return ResourceManager.GetString("menuProxiesReload", resourceCulture); - } - } - - /// - /// 查找类似 Select active node (Enter) 的本地化字符串。 - /// - public static string menuProxiesSelectActivity { - get { - return ResourceManager.GetString("menuProxiesSelectActivity", resourceCulture); - } - } - - /// - /// 查找类似 Test servers real delay (Ctrl+R) 的本地化字符串。 - /// - public static string menuRealPingServer { - get { - return ResourceManager.GetString("menuRealPingServer", resourceCulture); - } - } - - /// - /// 查找类似 Restart as Administrator 的本地化字符串。 - /// - public static string menuRebootAsAdmin { - get { - return ResourceManager.GetString("menuRebootAsAdmin", resourceCulture); - } - } - - /// - /// 查找类似 Regional presets setting 的本地化字符串。 - /// - public static string menuRegionalPresets { - get { - return ResourceManager.GetString("menuRegionalPresets", resourceCulture); - } - } - - /// - /// 查找类似 Default 的本地化字符串。 - /// - public static string menuRegionalPresetsDefault { - get { - return ResourceManager.GetString("menuRegionalPresetsDefault", resourceCulture); - } - } - - /// - /// 查找类似 Iran 的本地化字符串。 - /// - public static string menuRegionalPresetsIran { - get { - return ResourceManager.GetString("menuRegionalPresetsIran", resourceCulture); - } - } - - /// - /// 查找类似 Russia 的本地化字符串。 - /// - public static string menuRegionalPresetsRussia { - get { - return ResourceManager.GetString("menuRegionalPresetsRussia", resourceCulture); - } - } - - /// - /// 查找类似 Reload 的本地化字符串。 - /// - public static string menuReload { - get { - return ResourceManager.GetString("menuReload", resourceCulture); - } - } - - /// - /// 查找类似 Backup to remote (WebDAV) 的本地化字符串。 - /// - public static string menuRemoteBackup { - get { - return ResourceManager.GetString("menuRemoteBackup", resourceCulture); - } - } - - /// - /// 查找类似 Remote (WebDAV) 的本地化字符串。 - /// - public static string menuRemoteBackupAndRestore { - get { - return ResourceManager.GetString("menuRemoteBackupAndRestore", resourceCulture); - } - } - - /// - /// 查找类似 Restore from remote (WebDAV) 的本地化字符串。 - /// - public static string menuRemoteRestore { - get { - return ResourceManager.GetString("menuRemoteRestore", resourceCulture); - } - } - - /// - /// 查找类似 Remove duplicate servers 的本地化字符串。 - /// - public static string menuRemoveDuplicateServer { - get { - return ResourceManager.GetString("menuRemoveDuplicateServer", resourceCulture); - } - } - - /// - /// 查找类似 Remove selected servers (Delete) 的本地化字符串。 - /// - public static string menuRemoveServer { - get { - return ResourceManager.GetString("menuRemoveServer", resourceCulture); - } - } - - /// - /// 查找类似 Routing 的本地化字符串。 - /// - public static string menuRouting { - get { - return ResourceManager.GetString("menuRouting", resourceCulture); - } - } - - /// - /// 查找类似 Advanced Function 的本地化字符串。 - /// - public static string menuRoutingAdvanced { - get { - return ResourceManager.GetString("menuRoutingAdvanced", resourceCulture); - } - } - - /// - /// 查找类似 Add 的本地化字符串。 - /// - public static string menuRoutingAdvancedAdd { - get { - return ResourceManager.GetString("menuRoutingAdvancedAdd", resourceCulture); - } - } - - /// - /// 查找类似 Import Rules 的本地化字符串。 - /// - public static string menuRoutingAdvancedImportRules { - get { - return ResourceManager.GetString("menuRoutingAdvancedImportRules", resourceCulture); - } - } - - /// - /// 查找类似 Remove selected (Delete) 的本地化字符串。 - /// - public static string menuRoutingAdvancedRemove { - get { - return ResourceManager.GetString("menuRoutingAdvancedRemove", resourceCulture); - } - } - - /// - /// 查找类似 Set as active rule (Enter) 的本地化字符串。 - /// - public static string menuRoutingAdvancedSetDefault { - get { - return ResourceManager.GetString("menuRoutingAdvancedSetDefault", resourceCulture); - } - } - - /// - /// 查找类似 RoutingRuleDetailsSetting 的本地化字符串。 - /// - public static string menuRoutingRuleDetailsSetting { - get { - return ResourceManager.GetString("menuRoutingRuleDetailsSetting", resourceCulture); - } - } - - /// - /// 查找类似 Rule Settings 的本地化字符串。 - /// - public static string menuRoutingRuleSetting { - get { - return ResourceManager.GetString("menuRoutingRuleSetting", resourceCulture); - } - } - - /// - /// 查找类似 Routing Setting 的本地化字符串。 - /// - public static string menuRoutingSetting { - get { - return ResourceManager.GetString("menuRoutingSetting", resourceCulture); - } - } - - /// - /// 查找类似 Add Rule 的本地化字符串。 - /// - public static string menuRuleAdd { - get { - return ResourceManager.GetString("menuRuleAdd", resourceCulture); - } - } - - /// - /// 查找类似 Export Selected Rules 的本地化字符串。 - /// - public static string menuRuleExportSelected { - get { - return ResourceManager.GetString("menuRuleExportSelected", resourceCulture); - } - } - - /// - /// 查找类似 Rule List 的本地化字符串。 - /// - public static string menuRuleList { - get { - return ResourceManager.GetString("menuRuleList", resourceCulture); - } - } - - /// - /// 查找类似 Rule mode 的本地化字符串。 - /// - public static string menuRulemode { - get { - return ResourceManager.GetString("menuRulemode", resourceCulture); - } - } - - /// - /// 查找类似 Remove Rule (Delete) 的本地化字符串。 - /// - public static string menuRuleRemove { - get { - return ResourceManager.GetString("menuRuleRemove", resourceCulture); - } - } - - /// - /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 - /// - public static string menuSelectAll { - get { - return ResourceManager.GetString("menuSelectAll", resourceCulture); - } - } - - /// - /// 查找类似 Servers 的本地化字符串。 - /// - public static string menuServers { - get { - return ResourceManager.GetString("menuServers", resourceCulture); - } - } - - /// - /// 查找类似 Multi-server load balancing 的本地化字符串。 - /// - public static string menuSetDefaultLoadBalanceServer { - get { - return ResourceManager.GetString("menuSetDefaultLoadBalanceServer", resourceCulture); - } - } - - /// - /// 查找类似 Multi-Server lowest latency 的本地化字符串。 - /// - public static string menuSetDefaultMultipleServer { - get { - return ResourceManager.GetString("menuSetDefaultMultipleServer", resourceCulture); - } - } - - /// - /// 查找类似 Set as active server (Enter) 的本地化字符串。 - /// - public static string menuSetDefaultServer { - get { - return ResourceManager.GetString("menuSetDefaultServer", resourceCulture); - } - } - - /// - /// 查找类似 Settings 的本地化字符串。 - /// - public static string menuSetting { - get { - return ResourceManager.GetString("menuSetting", resourceCulture); - } - } - - /// - /// 查找类似 Share Server (Ctrl+F) 的本地化字符串。 - /// - public static string menuShareServer { - get { - return ResourceManager.GetString("menuShareServer", resourceCulture); - } - } - - /// - /// 查找类似 Show or hide the main window 的本地化字符串。 - /// - public static string menuShowOrHideMainWindow { - get { - return ResourceManager.GetString("menuShowOrHideMainWindow", resourceCulture); - } - } - - /// - /// 查找类似 Sort by test result 的本地化字符串。 - /// - public static string menuSortServerResult { - get { - return ResourceManager.GetString("menuSortServerResult", resourceCulture); - } - } - - /// - /// 查找类似 Test servers download speed (Ctrl+T) 的本地化字符串。 - /// - public static string menuSpeedServer { - get { - return ResourceManager.GetString("menuSpeedServer", resourceCulture); - } - } - - /// - /// 查找类似 Add 的本地化字符串。 - /// - public static string menuSubAdd { - get { - return ResourceManager.GetString("menuSubAdd", resourceCulture); - } - } - - /// - /// 查找类似 Delete 的本地化字符串。 - /// - public static string menuSubDelete { - get { - return ResourceManager.GetString("menuSubDelete", resourceCulture); - } - } - - /// - /// 查找类似 Edit 的本地化字符串。 - /// - public static string menuSubEdit { - get { - return ResourceManager.GetString("menuSubEdit", resourceCulture); - } - } - - /// - /// 查找类似 Update current subscription without proxy 的本地化字符串。 - /// - public static string menuSubGroupUpdate { - get { - return ResourceManager.GetString("menuSubGroupUpdate", resourceCulture); - } - } - - /// - /// 查找类似 Update current subscription with proxy 的本地化字符串。 - /// - public static string menuSubGroupUpdateViaProxy { - get { - return ResourceManager.GetString("menuSubGroupUpdateViaProxy", resourceCulture); - } - } - - /// - /// 查找类似 Subscription Group 的本地化字符串。 - /// - public static string menuSubscription { - get { - return ResourceManager.GetString("menuSubscription", resourceCulture); - } - } - - /// - /// 查找类似 Subscription group settings 的本地化字符串。 - /// - public static string menuSubSetting { - get { - return ResourceManager.GetString("menuSubSetting", resourceCulture); - } - } - - /// - /// 查找类似 Share 的本地化字符串。 - /// - public static string menuSubShare { - get { - return ResourceManager.GetString("menuSubShare", resourceCulture); - } - } - - /// - /// 查找类似 Update subscriptions without proxy 的本地化字符串。 - /// - public static string menuSubUpdate { - get { - return ResourceManager.GetString("menuSubUpdate", resourceCulture); - } - } - - /// - /// 查找类似 Update subscriptions with proxy 的本地化字符串。 - /// - public static string menuSubUpdateViaProxy { - get { - return ResourceManager.GetString("menuSubUpdateViaProxy", resourceCulture); - } - } - - /// - /// 查找类似 System proxy 的本地化字符串。 - /// - public static string menuSystemproxy { - get { - return ResourceManager.GetString("menuSystemproxy", resourceCulture); - } - } - - /// - /// 查找类似 Clear system proxy 的本地化字符串。 - /// - public static string menuSystemProxyClear { - get { - return ResourceManager.GetString("menuSystemProxyClear", resourceCulture); - } - } - - /// - /// 查找类似 Do not change system proxy 的本地化字符串。 - /// - public static string menuSystemProxyNothing { - get { - return ResourceManager.GetString("menuSystemProxyNothing", resourceCulture); - } - } - - /// - /// 查找类似 PAC mode 的本地化字符串。 - /// - public static string menuSystemProxyPac { - get { - return ResourceManager.GetString("menuSystemProxyPac", resourceCulture); - } - } - - /// - /// 查找类似 Set system proxy 的本地化字符串。 - /// - public static string menuSystemProxySet { - get { - return ResourceManager.GetString("menuSystemProxySet", resourceCulture); - } - } - - /// - /// 查找类似 Test servers with tcping (Ctrl+O) 的本地化字符串。 - /// - public static string menuTcpingServer { - get { - return ResourceManager.GetString("menuTcpingServer", resourceCulture); - } - } - - /// - /// 查找类似 {0} Website 的本地化字符串。 - /// - public static string menuWebsiteItem { - get { - return ResourceManager.GetString("menuWebsiteItem", resourceCulture); - } - } - - /// - /// 查找类似 Clear original subscription content 的本地化字符串。 - /// - public static string MsgClearSubscription { - get { - return ResourceManager.GetString("MsgClearSubscription", resourceCulture); - } - } - - /// - /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 - /// - public static string MsgDownloadGeoFileSuccessfully { - get { - return ResourceManager.GetString("MsgDownloadGeoFileSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Download Core successfully 的本地化字符串。 - /// - public static string MsgDownloadV2rayCoreSuccessfully { - get { - return ResourceManager.GetString("MsgDownloadV2rayCoreSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Failed to import subscription content 的本地化字符串。 - /// - public static string MsgFailedImportSubscription { - get { - return ResourceManager.GetString("MsgFailedImportSubscription", resourceCulture); - } - } - - /// - /// 查找类似 Filter, support regular 的本地化字符串。 - /// - public static string MsgFilterTitle { - get { - return ResourceManager.GetString("MsgFilterTitle", resourceCulture); - } - } - - /// - /// 查找类似 Get subscription content successfully 的本地化字符串。 - /// - public static string MsgGetSubscriptionSuccessfully { - get { - return ResourceManager.GetString("MsgGetSubscriptionSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Information 的本地化字符串。 - /// - public static string MsgInformationTitle { - get { - return ResourceManager.GetString("MsgInformationTitle", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in the URL 的本地化字符串。 - /// - public static string MsgNeedUrl { - get { - return ResourceManager.GetString("MsgNeedUrl", resourceCulture); - } - } - - /// - /// 查找类似 No valid subscriptions set 的本地化字符串。 - /// - public static string MsgNoValidSubscription { - get { - return ResourceManager.GetString("MsgNoValidSubscription", resourceCulture); - } - } - - /// - /// 查找类似 Resolve {0} successfully 的本地化字符串。 - /// - public static string MsgParsingSuccessfully { - get { - return ResourceManager.GetString("MsgParsingSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Server filter, press Enter to execute 的本地化字符串。 - /// - public static string MsgServerTitle { - get { - return ResourceManager.GetString("MsgServerTitle", resourceCulture); - } - } - - /// - /// 查找类似 Updates are not enabled, skip this subscription 的本地化字符串。 - /// - public static string MsgSkipSubscriptionUpdate { - get { - return ResourceManager.GetString("MsgSkipSubscriptionUpdate", resourceCulture); - } - } - - /// - /// 查找类似 Start getting subscriptions 的本地化字符串。 - /// - public static string MsgStartGettingSubscriptions { - get { - return ResourceManager.GetString("MsgStartGettingSubscriptions", resourceCulture); - } - } - - /// - /// 查找类似 Start updating {0}... 的本地化字符串。 - /// - public static string MsgStartUpdating { - get { - return ResourceManager.GetString("MsgStartUpdating", resourceCulture); - } - } - - /// - /// 查找类似 Invalid subscription content 的本地化字符串。 - /// - public static string MsgSubscriptionDecodingFailed { - get { - return ResourceManager.GetString("MsgSubscriptionDecodingFailed", resourceCulture); - } - } - - /// - /// 查找类似 Is unpacking...... 的本地化字符串。 - /// - public static string MsgUnpacking { - get { - return ResourceManager.GetString("MsgUnpacking", resourceCulture); - } - } - - /// - /// 查找类似 Update subscriptions end 的本地化字符串。 - /// - public static string MsgUpdateSubscriptionEnd { - get { - return ResourceManager.GetString("MsgUpdateSubscriptionEnd", resourceCulture); - } - } - - /// - /// 查找类似 Update subscriptions start 的本地化字符串。 - /// - public static string MsgUpdateSubscriptionStart { - get { - return ResourceManager.GetString("MsgUpdateSubscriptionStart", resourceCulture); - } - } - - /// - /// 查找类似 Update Core successfully 的本地化字符串。 - /// - public static string MsgUpdateV2rayCoreSuccessfully { - get { - return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 - /// - public static string MsgUpdateV2rayCoreSuccessfullyMore { - get { - return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfullyMore", resourceCulture); - } - } - - /// - /// 查找类似 Successful operation. Click the settings menu to reboot the app. 的本地化字符串。 - /// - public static string NeedRebootTips { - get { - return ResourceManager.GetString("NeedRebootTips", resourceCulture); - } - } - - /// - /// 查找类似 Non-VMess or ss protocol 的本地化字符串。 - /// - public static string NonvmessOrssProtocol { - get { - return ResourceManager.GetString("NonvmessOrssProtocol", resourceCulture); - } - } - - /// - /// 查找类似 The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2} 的本地化字符串。 - /// - public static string NotFoundCore { - get { - return ResourceManager.GetString("NotFoundCore", resourceCulture); - } - } - - /// - /// 查找类似 Not run as Admin 的本地化字符串。 - /// - public static string NotRunAsAdmin { - get { - return ResourceManager.GetString("NotRunAsAdmin", resourceCulture); - } - } - - /// - /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 - /// - public static string NoValidQRcodeFound { - get { - return ResourceManager.GetString("NoValidQRcodeFound", resourceCulture); - } - } - - /// - /// 查找类似 Operation failed, please check and retry 的本地化字符串。 - /// - public static string OperationFailed { - get { - return ResourceManager.GetString("OperationFailed", resourceCulture); - } - } - - /// - /// 查找类似 Operation success 的本地化字符串。 - /// - public static string OperationSuccess { - get { - return ResourceManager.GetString("OperationSuccess", resourceCulture); - } - } - - /// - /// 查找类似 Please Fill Remarks 的本地化字符串。 - /// - public static string PleaseFillRemarks { - get { - return ResourceManager.GetString("PleaseFillRemarks", resourceCulture); - } - } - - /// - /// 查找类似 Please select the encryption method 的本地化字符串。 - /// - public static string PleaseSelectEncryption { - get { - return ResourceManager.GetString("PleaseSelectEncryption", resourceCulture); - } - } - - /// - /// 查找类似 Please select a protocol 的本地化字符串。 - /// - public static string PleaseSelectProtocol { - get { - return ResourceManager.GetString("PleaseSelectProtocol", resourceCulture); - } - } - - /// - /// 查找类似 Please select rules 的本地化字符串。 - /// - public static string PleaseSelectRules { - get { - return ResourceManager.GetString("PleaseSelectRules", resourceCulture); - } - } - - /// - /// 查找类似 Please select the server first 的本地化字符串。 - /// - public static string PleaseSelectServer { - get { - return ResourceManager.GetString("PleaseSelectServer", resourceCulture); - } - } - - /// - /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 - /// - public static string RegisterGlobalHotkeyFailed { - get { - return ResourceManager.GetString("RegisterGlobalHotkeyFailed", resourceCulture); - } - } - - /// - /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 - /// - public static string RegisterGlobalHotkeySuccessfully { - get { - return ResourceManager.GetString("RegisterGlobalHotkeySuccessfully", resourceCulture); - } - } - - /// - /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 - /// - public static string RemoveDuplicateServerResult { - get { - return ResourceManager.GetString("RemoveDuplicateServerResult", resourceCulture); - } - } - - /// - /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 - /// - public static string RemoveRules { - get { - return ResourceManager.GetString("RemoveRules", resourceCulture); - } - } - - /// - /// 查找类似 Are you sure to remove the server? 的本地化字符串。 - /// - public static string RemoveServer { - get { - return ResourceManager.GetString("RemoveServer", resourceCulture); - } - } - - /// - /// 查找类似 {0},One of the required. 的本地化字符串。 - /// - public static string RoutingRuleDetailRequiredTips { - get { - return ResourceManager.GetString("RoutingRuleDetailRequiredTips", resourceCulture); - } - } - - /// - /// 查找类似 Run as Admin 的本地化字符串。 - /// - public static string RunAsAdmin { - get { - return ResourceManager.GetString("RunAsAdmin", resourceCulture); - } - } - - /// - /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 - /// - public static string SaveClientConfigurationIn { - get { - return ResourceManager.GetString("SaveClientConfigurationIn", resourceCulture); - } - } - - /// - /// 查找类似 {0} : {1}/s↑ | {2}/s↓ 的本地化字符串。 - /// - public static string SpeedDisplayText { - get { - return ResourceManager.GetString("SpeedDisplayText", resourceCulture); - } - } - - /// - /// 查找类似 Testing... 的本地化字符串。 - /// - public static string Speedtesting { - get { - return ResourceManager.GetString("Speedtesting", resourceCulture); - } - } - - /// - /// 查找类似 Test completed 的本地化字符串。 - /// - public static string SpeedtestingCompleted { - get { - return ResourceManager.GetString("SpeedtestingCompleted", resourceCulture); - } - } - - /// - /// 查找类似 Skip test 的本地化字符串。 - /// - public static string SpeedtestingSkip { - get { - return ResourceManager.GetString("SpeedtestingSkip", resourceCulture); - } - } - - /// - /// 查找类似 Test terminating... 的本地化字符串。 - /// - public static string SpeedtestingStop { - get { - return ResourceManager.GetString("SpeedtestingStop", resourceCulture); - } - } - - /// - /// 查找类似 Waiting for testing (press ESC to terminate)... 的本地化字符串。 - /// - public static string SpeedtestingWait { - get { - return ResourceManager.GetString("SpeedtestingWait", resourceCulture); - } - } - - /// - /// 查找类似 Start service ({0})... 的本地化字符串。 - /// - public static string StartService { - get { - return ResourceManager.GetString("StartService", resourceCulture); - } - } - - /// - /// 查找类似 For group please leave blank here 的本地化字符串。 - /// - public static string SubUrlTips { - get { - return ResourceManager.GetString("SubUrlTips", resourceCulture); - } - } - - /// - /// 查找类似 Configuration successful - ///{0} 的本地化字符串。 - /// - public static string SuccessfulConfiguration { - get { - return ResourceManager.GetString("SuccessfulConfiguration", resourceCulture); - } - } - - /// - /// 查找类似 Custom configuration server imported successfully 的本地化字符串。 - /// - public static string SuccessfullyImportedCustomServer { - get { - return ResourceManager.GetString("SuccessfullyImportedCustomServer", resourceCulture); - } - } - - /// - /// 查找类似 {0} servers have been imported from clipboard 的本地化字符串。 - /// - public static string SuccessfullyImportedServerViaClipboard { - get { - return ResourceManager.GetString("SuccessfullyImportedServerViaClipboard", resourceCulture); - } - } - - /// - /// 查找类似 Scan import the shared link successfully 的本地化字符串。 - /// - public static string SuccessfullyImportedServerViaScan { - get { - return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture); - } - } - - /// - /// 查找类似 Address 的本地化字符串。 - /// - public static string TbAddress { - get { - return ResourceManager.GetString("TbAddress", resourceCulture); - } - } - - /// - /// 查找类似 AllowInsecure 的本地化字符串。 - /// - public static string TbAllowInsecure { - get { - return ResourceManager.GetString("TbAllowInsecure", resourceCulture); - } - } - - /// - /// 查找类似 ALPN 的本地化字符串。 - /// - public static string TbAlpn { - get { - return ResourceManager.GetString("TbAlpn", resourceCulture); - } - } - - /// - /// 查找类似 AlterID 的本地化字符串。 - /// - public static string TbAlterId { - get { - return ResourceManager.GetString("TbAlterId", resourceCulture); - } - } - - /// - /// 查找类似 AutoRefresh 的本地化字符串。 - /// - public static string TbAutoRefresh { - get { - return ResourceManager.GetString("TbAutoRefresh", resourceCulture); - } - } - - /// - /// 查找类似 Auto ScrollToEnd 的本地化字符串。 - /// - public static string TbAutoScrollToEnd { - get { - return ResourceManager.GetString("TbAutoScrollToEnd", resourceCulture); - } - } - - /// - /// 查找类似 Domain, ip, process are auto sorted when saving 的本地化字符串。 - /// - public static string TbAutoSort { - get { - return ResourceManager.GetString("TbAutoSort", resourceCulture); - } - } - - /// - /// 查找类似 Browse 的本地化字符串。 - /// - public static string TbBrowse { - get { - return ResourceManager.GetString("TbBrowse", resourceCulture); - } - } - - /// - /// 查找类似 Cancel 的本地化字符串。 - /// - public static string TbCancel { - get { - return ResourceManager.GetString("TbCancel", resourceCulture); - } - } - - /// - /// 查找类似 Clear system proxy 的本地化字符串。 - /// - public static string TbClearSystemProxy { - get { - return ResourceManager.GetString("TbClearSystemProxy", resourceCulture); - } - } - - /// - /// 查找类似 Confirm 的本地化字符串。 - /// - public static string TbConfirm { - get { - return ResourceManager.GetString("TbConfirm", resourceCulture); - } - } - - /// - /// 查找类似 Connections 的本地化字符串。 - /// - public static string TbConnections { - get { - return ResourceManager.GetString("TbConnections", resourceCulture); - } - } - - /// - /// 查找类似 Core Type 的本地化字符串。 - /// - public static string TbCoreType { - get { - return ResourceManager.GetString("TbCoreType", resourceCulture); - } - } - - /// - /// 查找类似 Display GUI 的本地化字符串。 - /// - public static string TbDisplayGUI { - get { - return ResourceManager.GetString("TbDisplayGUI", resourceCulture); - } - } - - /// - /// 查找类似 Display Log 的本地化字符串。 - /// - public static string TbDisplayLog { - get { - return ResourceManager.GetString("TbDisplayLog", resourceCulture); - } - } - - /// - /// 查找类似 Supports DnsObject; Click to view documentation 的本地化字符串。 - /// - public static string TbDnsObjectDoc { - get { - return ResourceManager.GetString("TbDnsObjectDoc", resourceCulture); - } - } - - /// - /// 查找类似 Please fill in DNS Structure, Click to view the document 的本地化字符串。 - /// - public static string TbDnsSingboxObjectDoc { - get { - return ResourceManager.GetString("TbDnsSingboxObjectDoc", resourceCulture); - } - } - - /// - /// 查找类似 Domain Matcher 的本地化字符串。 - /// - public static string TbdomainMatcher { - get { - return ResourceManager.GetString("TbdomainMatcher", resourceCulture); - } - } - - /// - /// 查找类似 Domain strategy 的本地化字符串。 - /// - public static string TbdomainStrategy { - get { - return ResourceManager.GetString("TbdomainStrategy", resourceCulture); - } - } - - /// - /// 查找类似 sing-box domain strategy 的本地化字符串。 - /// - public static string TbdomainStrategy4Singbox { - get { - return ResourceManager.GetString("TbdomainStrategy4Singbox", resourceCulture); - } - } - - /// - /// 查找类似 Edit 的本地化字符串。 - /// - public static string TbEdit { - get { - return ResourceManager.GetString("TbEdit", resourceCulture); - } - } - - /// - /// 查找类似 Enable Tun 的本地化字符串。 - /// - public static string TbEnableTunAs { - get { - return ResourceManager.GetString("TbEnableTunAs", resourceCulture); - } - } - - /// - /// 查找类似 Fingerprint 的本地化字符串。 - /// - public static string TbFingerprint { - get { - return ResourceManager.GetString("TbFingerprint", resourceCulture); - } - } - - /// - /// 查找类似 Flow 的本地化字符串。 - /// - public static string TbFlow5 { - get { - return ResourceManager.GetString("TbFlow5", resourceCulture); - } - } - - /// - /// 查找类似 Global Hotkey Settings 的本地化字符串。 - /// - public static string TbGlobalHotkeySetting { - get { - return ResourceManager.GetString("TbGlobalHotkeySetting", resourceCulture); - } - } - - /// - /// 查找类似 Set directly by pressing the keyboard; Takes effect after restart 的本地化字符串。 - /// - public static string TbGlobalHotkeySettingTip { - get { - return ResourceManager.GetString("TbGlobalHotkeySettingTip", resourceCulture); - } - } - - /// - /// 查找类似 Generate 的本地化字符串。 - /// - public static string TbGUID { - get { - return ResourceManager.GetString("TbGUID", resourceCulture); - } - } - - /// - /// 查找类似 Camouflage type 的本地化字符串。 - /// - public static string TbHeaderType { - get { - return ResourceManager.GetString("TbHeaderType", resourceCulture); - } - } - - /// - /// 查找类似 Congestion control 的本地化字符串。 - /// - public static string TbHeaderType8 { - get { - return ResourceManager.GetString("TbHeaderType8", resourceCulture); - } - } - - /// - /// 查找类似 UUID(id) 的本地化字符串。 - /// - public static string TbId { - get { - return ResourceManager.GetString("TbId", resourceCulture); - } - } - - /// - /// 查找类似 Password 的本地化字符串。 - /// - public static string TbId3 { - get { - return ResourceManager.GetString("TbId3", resourceCulture); - } - } - - /// - /// 查找类似 Password(Optional) 的本地化字符串。 - /// - public static string TbId4 { - get { - return ResourceManager.GetString("TbId4", resourceCulture); - } - } - - /// - /// 查找类似 UUID(id) 的本地化字符串。 - /// - public static string TbId5 { - get { - return ResourceManager.GetString("TbId5", resourceCulture); - } - } - - /// - /// 查找类似 Address(Ip,Ipv6) 的本地化字符串。 - /// - public static string TbLocalAddress { - get { - return ResourceManager.GetString("TbLocalAddress", resourceCulture); - } - } - - /// - /// 查找类似 Transport protocol(network) 的本地化字符串。 - /// - public static string TbNetwork { - get { - return ResourceManager.GetString("TbNetwork", resourceCulture); - } - } - - /// - /// 查找类似 Do not change system proxy 的本地化字符串。 - /// - public static string TbNotChangeSystemProxy { - get { - return ResourceManager.GetString("TbNotChangeSystemProxy", resourceCulture); - } - } - - /// - /// 查找类似 Path 的本地化字符串。 - /// - public static string TbPath { - get { - return ResourceManager.GetString("TbPath", resourceCulture); - } - } - - /// - /// 查找类似 obfs password 的本地化字符串。 - /// - public static string TbPath7 { - get { - return ResourceManager.GetString("TbPath7", resourceCulture); - } - } - - /// - /// 查找类似 Port 的本地化字符串。 - /// - public static string TbPort { - get { - return ResourceManager.GetString("TbPort", resourceCulture); - } - } - - /// - /// 查找类似 Socks port 的本地化字符串。 - /// - public static string TbPreSocksPort { - get { - return ResourceManager.GetString("TbPreSocksPort", resourceCulture); - } - } - - /// - /// 查找类似 Custom config socks port 的本地化字符串。 - /// - public static string TbPreSocksPort4Sub { - get { - return ResourceManager.GetString("TbPreSocksPort4Sub", resourceCulture); - } - } - - /// - /// 查找类似 PrivateKey 的本地化字符串。 - /// - public static string TbPrivateKey { - get { - return ResourceManager.GetString("TbPrivateKey", resourceCulture); - } - } - - /// - /// 查找类似 Proxies 的本地化字符串。 - /// - public static string TbProxies { - get { - return ResourceManager.GetString("TbProxies", resourceCulture); - } - } - - /// - /// 查找类似 PublicKey 的本地化字符串。 - /// - public static string TbPublicKey { - get { - return ResourceManager.GetString("TbPublicKey", resourceCulture); - } - } - - /// - /// 查找类似 Alias (remarks) 的本地化字符串。 - /// - public static string TbRemarks { - get { - return ResourceManager.GetString("TbRemarks", resourceCulture); - } - } - - /// - /// 查找类似 Camouflage domain(host) 的本地化字符串。 - /// - public static string TbRequestHost { - get { - return ResourceManager.GetString("TbRequestHost", resourceCulture); - } - } - - /// - /// 查找类似 Reserved(2,3,4) 的本地化字符串。 - /// - public static string TbReserved { - get { - return ResourceManager.GetString("TbReserved", resourceCulture); - } - } - - /// - /// 查找类似 Reset 的本地化字符串。 - /// - public static string TbReset { - get { - return ResourceManager.GetString("TbReset", resourceCulture); - } - } - - /// - /// 查找类似 socks: local port, socks2: second local port, socks3: LAN port 的本地化字符串。 - /// - public static string TbRoutingInboundTagTips { - get { - return ResourceManager.GetString("TbRoutingInboundTagTips", resourceCulture); - } - } - - /// - /// 查找类似 Domain 的本地化字符串。 - /// - public static string TbRoutingRuleDomain { - get { - return ResourceManager.GetString("TbRoutingRuleDomain", resourceCulture); - } - } - - /// - /// 查找类似 IP or IP CIDR 的本地化字符串。 - /// - public static string TbRoutingRuleIP { - get { - return ResourceManager.GetString("TbRoutingRuleIP", resourceCulture); - } - } - - /// - /// 查找类似 Full process name (Tun mode) 的本地化字符串。 - /// - public static string TbRoutingRuleProcess { - get { - return ResourceManager.GetString("TbRoutingRuleProcess", resourceCulture); - } - } - - /// - /// 查找类似 3.Block Domain or IP 的本地化字符串。 - /// - public static string TbRoutingTabBlock { - get { - return ResourceManager.GetString("TbRoutingTabBlock", resourceCulture); - } - } - - /// - /// 查找类似 2.Direct Domain or IP 的本地化字符串。 - /// - public static string TbRoutingTabDirect { - get { - return ResourceManager.GetString("TbRoutingTabDirect", resourceCulture); - } - } - - /// - /// 查找类似 1.Proxy Domain or IP 的本地化字符串。 - /// - public static string TbRoutingTabProxy { - get { - return ResourceManager.GetString("TbRoutingTabProxy", resourceCulture); - } - } - - /// - /// 查找类似 Pre-defined Rule Set List 的本地化字符串。 - /// - public static string TbRoutingTabRuleList { - get { - return ResourceManager.GetString("TbRoutingTabRuleList", resourceCulture); - } - } - - /// - /// 查找类似 *Separate rules by commas (,); For a literal comma use <COMMA>; Prefix # to ignore a rule 的本地化字符串。 - /// - public static string TbRoutingTips { - get { - return ResourceManager.GetString("TbRoutingTips", resourceCulture); - } - } - - /// - /// 查找类似 (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag 的本地化字符串。 - /// - public static string TbRuleMatchingTips { - get { - return ResourceManager.GetString("TbRuleMatchingTips", resourceCulture); - } - } - - /// - /// 查找类似 Ruleobject Doc 的本地化字符串。 - /// - public static string TbRuleobjectDoc { - get { - return ResourceManager.GetString("TbRuleobjectDoc", resourceCulture); - } - } - - /// - /// 查找类似 Encryption method (security) 的本地化字符串。 - /// - public static string TbSecurity { - get { - return ResourceManager.GetString("TbSecurity", resourceCulture); - } - } - - /// - /// 查找类似 Encryption 的本地化字符串。 - /// - public static string TbSecurity3 { - get { - return ResourceManager.GetString("TbSecurity3", resourceCulture); - } - } - - /// - /// 查找类似 User(Optional) 的本地化字符串。 - /// - public static string TbSecurity4 { - get { - return ResourceManager.GetString("TbSecurity4", resourceCulture); - } - } - - /// - /// 查找类似 Encryption 的本地化字符串。 - /// - public static string TbSecurity5 { - get { - return ResourceManager.GetString("TbSecurity5", resourceCulture); - } - } - - /// - /// 查找类似 Set system proxy 的本地化字符串。 - /// - public static string TbSetSystemProxy { - get { - return ResourceManager.GetString("TbSetSystemProxy", resourceCulture); - } - } - - /// - /// 查找类似 Click to import default DNS config 的本地化字符串。 - /// - public static string TbSettingDnsImportDefConfig { - get { - return ResourceManager.GetString("TbSettingDnsImportDefConfig", resourceCulture); - } - } - - /// - /// 查找类似 Advanced proxy settings, protocol selection (optional) 的本地化字符串。 - /// - public static string TbSettingsAdvancedProtocol { - get { - return ResourceManager.GetString("TbSettingsAdvancedProtocol", resourceCulture); - } - } - - /// - /// 查找类似 Allow connections from the LAN 的本地化字符串。 - /// - public static string TbSettingsAllowLAN { - get { - return ResourceManager.GetString("TbSettingsAllowLAN", resourceCulture); - } - } - - /// - /// 查找类似 Auto hide startup 的本地化字符串。 - /// - public static string TbSettingsAutoHideStartup { - get { - return ResourceManager.GetString("TbSettingsAutoHideStartup", resourceCulture); - } - } - - /// - /// 查找类似 Automatic update interval for Geo files (hours) 的本地化字符串。 - /// - public static string TbSettingsAutoUpdateInterval { - get { - return ResourceManager.GetString("TbSettingsAutoUpdateInterval", resourceCulture); - } - } - - /// - /// 查找类似 Users in China region can ignore this item 的本地化字符串。 - /// - public static string TbSettingsChinaUserTip { - get { - return ResourceManager.GetString("TbSettingsChinaUserTip", resourceCulture); - } - } - - /// - /// 查找类似 Color 的本地化字符串。 - /// - public static string TbSettingsColor { - get { - return ResourceManager.GetString("TbSettingsColor", resourceCulture); - } - } - - /// - /// 查找类似 Core: basic settings 的本地化字符串。 - /// - public static string TbSettingsCore { - get { - return ResourceManager.GetString("TbSettingsCore", resourceCulture); - } - } - - /// - /// 查找类似 V2ray DNS settings 的本地化字符串。 - /// - public static string TbSettingsCoreDns { - get { - return ResourceManager.GetString("TbSettingsCoreDns", resourceCulture); - } - } - - /// - /// 查找类似 sing-box DNS settings 的本地化字符串。 - /// - public static string TbSettingsCoreDnsSingbox { - get { - return ResourceManager.GetString("TbSettingsCoreDnsSingbox", resourceCulture); - } - } - - /// - /// 查找类似 Core: KCP settings 的本地化字符串。 - /// - public static string TbSettingsCoreKcp { - get { - return ResourceManager.GetString("TbSettingsCoreKcp", resourceCulture); - } - } - - /// - /// 查找类似 CoreType settings 的本地化字符串。 - /// - public static string TbSettingsCoreType { - get { - return ResourceManager.GetString("TbSettingsCoreType", resourceCulture); - } - } - - /// - /// 查找类似 Font family (requires restart) 的本地化字符串。 - /// - public static string TbSettingsCurrentFontFamily { - get { - return ResourceManager.GetString("TbSettingsCurrentFontFamily", resourceCulture); - } - } - - /// - /// 查找类似 Install the font to the system and restart the settings 的本地化字符串。 - /// - public static string TbSettingsCurrentFontFamilyLinuxTip { - get { - return ResourceManager.GetString("TbSettingsCurrentFontFamilyLinuxTip", resourceCulture); - } - } - - /// - /// 查找类似 Copy the font TTF/TTC file to the directory guiFonts; Reopen the settings window 的本地化字符串。 - /// - public static string TbSettingsCurrentFontFamilyTip { - get { - return ResourceManager.GetString("TbSettingsCurrentFontFamilyTip", resourceCulture); - } - } - - /// - /// 查找类似 AllowInsecure 的本地化字符串。 - /// - public static string TbSettingsDefAllowInsecure { - get { - return ResourceManager.GetString("TbSettingsDefAllowInsecure", resourceCulture); - } - } - - /// - /// 查找类似 Default TLS fingerprint 的本地化字符串。 - /// - public static string TbSettingsDefFingerprint { - get { - return ResourceManager.GetString("TbSettingsDefFingerprint", resourceCulture); - } - } - - /// - /// 查找类似 User-Agent 的本地化字符串。 - /// - public static string TbSettingsDefUserAgent { - get { - return ResourceManager.GetString("TbSettingsDefUserAgent", resourceCulture); - } - } - - /// - /// 查找类似 This parameter is valid only for tcp/http and ws 的本地化字符串。 - /// - public static string TbSettingsDefUserAgentTips { - get { - return ResourceManager.GetString("TbSettingsDefUserAgentTips", resourceCulture); - } - } - - /// - /// 查找类似 Sniffing type 的本地化字符串。 - /// - public static string TbSettingsDestOverride { - get { - return ResourceManager.GetString("TbSettingsDestOverride", resourceCulture); - } - } - - /// - /// 查找类似 Display real-time speed (requires restart) 的本地化字符串。 - /// - public static string TbSettingsDisplayRealTimeSpeed { - get { - return ResourceManager.GetString("TbSettingsDisplayRealTimeSpeed", resourceCulture); - } - } - - /// - /// 查找类似 Outbound DNS address 的本地化字符串。 - /// - public static string TbSettingsDomainDNSAddress { - get { - return ResourceManager.GetString("TbSettingsDomainDNSAddress", resourceCulture); - } - } - - /// - /// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。 - /// - public static string TbSettingsDomainStrategy4Freedom { - get { - return ResourceManager.GetString("TbSettingsDomainStrategy4Freedom", resourceCulture); - } - } - - /// - /// 查找类似 Default domain strategy for outbound 的本地化字符串。 - /// - public static string TbSettingsDomainStrategy4Out { - get { - return ResourceManager.GetString("TbSettingsDomainStrategy4Out", resourceCulture); - } - } - - /// - /// 查找类似 Double-clicking server makes it active 的本地化字符串。 - /// - public static string TbSettingsDoubleClick2Activate { - get { - return ResourceManager.GetString("TbSettingsDoubleClick2Activate", resourceCulture); - } - } - - /// - /// 查找类似 Automatically adjust column width after subscription update 的本地化字符串。 - /// - public static string TbSettingsEnableAutoAdjustMainLvColWidth { - get { - return ResourceManager.GetString("TbSettingsEnableAutoAdjustMainLvColWidth", resourceCulture); - } - } - - /// - /// 查找类似 Enable cache file for sing-box (ruleset files) 的本地化字符串。 - /// - public static string TbSettingsEnableCacheFile4Sbox { - get { - return ResourceManager.GetString("TbSettingsEnableCacheFile4Sbox", resourceCulture); - } - } - - /// - /// 查找类似 Check for pre-release updates 的本地化字符串。 - /// - public static string TbSettingsEnableCheckPreReleaseUpdate { - get { - return ResourceManager.GetString("TbSettingsEnableCheckPreReleaseUpdate", resourceCulture); - } - } - - /// - /// 查找类似 Enable sorting servers by drag-n-drop (requires restart) 的本地化字符串。 - /// - public static string TbSettingsEnableDragDropSort { - get { - return ResourceManager.GetString("TbSettingsEnableDragDropSort", resourceCulture); - } - } - - /// - /// 查找类似 Enable additional Inbound 的本地化字符串。 - /// - public static string TbSettingsEnableExInbound { - get { - return ResourceManager.GetString("TbSettingsEnableExInbound", resourceCulture); - } - } - - /// - /// 查找类似 Enable fragment 的本地化字符串。 - /// - public static string TbSettingsEnableFragment { - get { - return ResourceManager.GetString("TbSettingsEnableFragment", resourceCulture); - } - } - - /// - /// 查找类似 Use Xray and enable non-Tun mode, which conflicts with the group previous proxy 的本地化字符串。 - /// - public static string TbSettingsEnableFragmentTips { - get { - return ResourceManager.GetString("TbSettingsEnableFragmentTips", resourceCulture); - } - } - - /// - /// 查找类似 Enable hardware acceleration (requires restart) 的本地化字符串。 - /// - public static string TbSettingsEnableHWA { - get { - return ResourceManager.GetString("TbSettingsEnableHWA", resourceCulture); - } - } - - /// - /// 查找类似 Enable IPv6 Address 的本地化字符串。 - /// - public static string TbSettingsEnableIPv6Address { - get { - return ResourceManager.GetString("TbSettingsEnableIPv6Address", resourceCulture); - } - } - - /// - /// 查找类似 Updating subscription, only determine remarks exists 的本地化字符串。 - /// - public static string TbSettingsEnableUpdateSubOnlyRemarksExist { - get { - return ResourceManager.GetString("TbSettingsEnableUpdateSubOnlyRemarksExist", resourceCulture); - } - } - - /// - /// 查找类似 Exception 的本地化字符串。 - /// - public static string TbSettingsException { - get { - return ResourceManager.GetString("TbSettingsException", resourceCulture); - } - } - - /// - /// 查找类似 Exclusions: Do not use proxy server for addresses beginning with the following. Use semicolon (;) to separate entries. 的本地化字符串。 - /// - public static string TbSettingsExceptionTip { - get { - return ResourceManager.GetString("TbSettingsExceptionTip", resourceCulture); - } - } - - /// - /// 查找类似 Exclusions: Do not use proxy server for the following addresses. Use comma (,) to separate entries. 的本地化字符串。 - /// - public static string TbSettingsExceptionTip2 { - get { - return ResourceManager.GetString("TbSettingsExceptionTip2", resourceCulture); - } - } - - /// - /// 查找类似 Font Size 的本地化字符串。 - /// - public static string TbSettingsFontSize { - get { - return ResourceManager.GetString("TbSettingsFontSize", resourceCulture); - } - } - - /// - /// 查找类似 Geo files source (optional) 的本地化字符串。 - /// - public static string TbSettingsGeoFilesSource { - get { - return ResourceManager.GetString("TbSettingsGeoFilesSource", resourceCulture); - } - } - - /// - /// 查找类似 Hide to tray when closing the window 的本地化字符串。 - /// - public static string TbSettingsHide2TrayWhenClose { - get { - return ResourceManager.GetString("TbSettingsHide2TrayWhenClose", resourceCulture); - } - } - - /// - /// 查找类似 HTTP Port 的本地化字符串。 - /// - public static string TbSettingsHttpPort { - get { - return ResourceManager.GetString("TbSettingsHttpPort", resourceCulture); - } - } - - /// - /// 查找类似 Hysteria Max bandwidth (Up/Dw) 的本地化字符串。 - /// - public static string TbSettingsHysteriaBandwidth { - get { - return ResourceManager.GetString("TbSettingsHysteriaBandwidth", resourceCulture); - } - } - - /// - /// 查找类似 Keep the older when de-duplicating 的本地化字符串。 - /// - public static string TbSettingsKeepOlderDedupl { - get { - return ResourceManager.GetString("TbSettingsKeepOlderDedupl", resourceCulture); - } - } - - /// - /// 查找类似 Language (Restart) 的本地化字符串。 - /// - public static string TbSettingsLanguage { - get { - return ResourceManager.GetString("TbSettingsLanguage", resourceCulture); - } - } - - /// - /// 查找类似 System sudo password 的本地化字符串。 - /// - public static string TbSettingsLinuxSudoPassword { - get { - return ResourceManager.GetString("TbSettingsLinuxSudoPassword", resourceCulture); - } - } - - /// - /// 查找类似 Please set the sudo password in Tun mode settings first 的本地化字符串。 - /// - public static string TbSettingsLinuxSudoPasswordIsEmpty { - get { - return ResourceManager.GetString("TbSettingsLinuxSudoPasswordIsEmpty", resourceCulture); - } - } - - /// - /// 查找类似 Please do not run this app with sudo 的本地化字符串。 - /// - public static string TbSettingsLinuxSudoPasswordNotSudoRunApp { - get { - return ResourceManager.GetString("TbSettingsLinuxSudoPasswordNotSudoRunApp", resourceCulture); - } - } - - /// - /// 查找类似 The password is encrypted and stored only in local files. 的本地化字符串。 - /// - public static string TbSettingsLinuxSudoPasswordTip { - get { - return ResourceManager.GetString("TbSettingsLinuxSudoPasswordTip", resourceCulture); - } - } - - /// - /// 查找类似 Enable Log 的本地化字符串。 - /// - public static string TbSettingsLogEnabled { - get { - return ResourceManager.GetString("TbSettingsLogEnabled", resourceCulture); - } - } - - /// - /// 查找类似 Enable logging to file 的本地化字符串。 - /// - public static string TbSettingsLogEnabledToFile { - get { - return ResourceManager.GetString("TbSettingsLogEnabledToFile", resourceCulture); - } - } - - /// - /// 查找类似 Log Level 的本地化字符串。 - /// - public static string TbSettingsLogLevel { - get { - return ResourceManager.GetString("TbSettingsLogLevel", resourceCulture); - } - } - - /// - /// 查找类似 Main layout orientation (requires restart) 的本地化字符串。 - /// - public static string TbSettingsMainGirdOrientation { - get { - return ResourceManager.GetString("TbSettingsMainGirdOrientation", resourceCulture); - } - } - - /// - /// 查找类似 sing-box Mux Protocol 的本地化字符串。 - /// - public static string TbSettingsMux4SboxProtocol { - get { - return ResourceManager.GetString("TbSettingsMux4SboxProtocol", resourceCulture); - } - } - - /// - /// 查找类似 Turn on Mux Multiplexing 的本地化字符串。 - /// - public static string TbSettingsMuxEnabled { - get { - return ResourceManager.GetString("TbSettingsMuxEnabled", resourceCulture); - } - } - - /// - /// 查找类似 v2rayN settings 的本地化字符串。 - /// - public static string TbSettingsN { - get { - return ResourceManager.GetString("TbSettingsN", resourceCulture); - } - } - - /// - /// 查找类似 New Port for LAN 的本地化字符串。 - /// - public static string TbSettingsNewPort4LAN { - get { - return ResourceManager.GetString("TbSettingsNewPort4LAN", resourceCulture); - } - } - - /// - /// 查找类似 Do not use proxy servers for local (intranet) addresses 的本地化字符串。 - /// - public static string TbSettingsNotProxyLocalAddress { - get { - return ResourceManager.GetString("TbSettingsNotProxyLocalAddress", resourceCulture); - } - } - - /// - /// 查找类似 Auth pass 的本地化字符串。 - /// - public static string TbSettingsPass { - get { - return ResourceManager.GetString("TbSettingsPass", resourceCulture); - } - } - - /// - /// 查找类似 Custom DNS (multiple, separated by commas (,)) 的本地化字符串。 - /// - public static string TbSettingsRemoteDNS { - get { - return ResourceManager.GetString("TbSettingsRemoteDNS", resourceCulture); - } - } - - /// - /// 查找类似 RouteOnly 的本地化字符串。 - /// - public static string TbSettingsRouteOnly { - get { - return ResourceManager.GetString("TbSettingsRouteOnly", resourceCulture); - } - } - - /// - /// 查找类似 Routing rules source (optional) 的本地化字符串。 - /// - public static string TbSettingsRoutingRulesSource { - get { - return ResourceManager.GetString("TbSettingsRoutingRulesSource", resourceCulture); - } - } - - /// - /// 查找类似 Enable second mixed port 的本地化字符串。 - /// - public static string TbSettingsSecondLocalPortEnabled { - get { - return ResourceManager.GetString("TbSettingsSecondLocalPortEnabled", resourceCulture); - } - } - - /// - /// 查找类似 Set Win10 UWP Loopback 的本地化字符串。 - /// - public static string TbSettingsSetUWP { - get { - return ResourceManager.GetString("TbSettingsSetUWP", resourceCulture); - } - } - - /// - /// 查找类似 Turn on Sniffing 的本地化字符串。 - /// - public static string TbSettingsSniffingEnabled { - get { - return ResourceManager.GetString("TbSettingsSniffingEnabled", resourceCulture); - } - } - - /// - /// 查找类似 Mixed Port 的本地化字符串。 - /// - public static string TbSettingsSocksPort { - get { - return ResourceManager.GetString("TbSettingsSocksPort", resourceCulture); - } - } - - /// - /// 查找类似 Pac port = +3; Xray API port = +4; mihomo API port = +5; 的本地化字符串。 - /// - public static string TbSettingsSocksPortTip { - get { - return ResourceManager.GetString("TbSettingsSocksPortTip", resourceCulture); - } - } - - /// - /// 查找类似 Speed Ping Test URL 的本地化字符串。 - /// - public static string TbSettingsSpeedPingTestUrl { - get { - return ResourceManager.GetString("TbSettingsSpeedPingTestUrl", resourceCulture); - } - } - - /// - /// 查找类似 Number per time for auto batch during speedtest(max 1000) 的本地化字符串。 - /// - public static string TbSettingsSpeedTestPageSize { - get { - return ResourceManager.GetString("TbSettingsSpeedTestPageSize", resourceCulture); - } - } - - /// - /// 查找类似 SpeedTest Single Timeout Value 的本地化字符串。 - /// - public static string TbSettingsSpeedTestTimeout { - get { - return ResourceManager.GetString("TbSettingsSpeedTestTimeout", resourceCulture); - } - } - - /// - /// 查找类似 SpeedTest URL 的本地化字符串。 - /// - public static string TbSettingsSpeedTestUrl { - get { - return ResourceManager.GetString("TbSettingsSpeedTestUrl", resourceCulture); - } - } - - /// - /// 查找类似 sing-box ruleset files source (optional) 的本地化字符串。 - /// - public static string TbSettingsSrsFilesSource { - get { - return ResourceManager.GetString("TbSettingsSrsFilesSource", resourceCulture); - } - } - - /// - /// 查找类似 Start on boot 的本地化字符串。 - /// - public static string TbSettingsStartBoot { - get { - return ResourceManager.GetString("TbSettingsStartBoot", resourceCulture); - } - } - - /// - /// 查找类似 Set this with admin privileges, get admin privileges after startup 的本地化字符串。 - /// - public static string TbSettingsStartBootTip { - get { - return ResourceManager.GetString("TbSettingsStartBootTip", resourceCulture); - } - } - - /// - /// 查找类似 Enable traffic statistics (requires restart) 的本地化字符串。 - /// - public static string TbSettingsStatistics { - get { - return ResourceManager.GetString("TbSettingsStatistics", resourceCulture); - } - } - - /// - /// 查找类似 Subscription conversion URL 的本地化字符串。 - /// - public static string TbSettingsSubConvert { - get { - return ResourceManager.GetString("TbSettingsSubConvert", resourceCulture); - } - } - - /// - /// 查找类似 System proxy settings 的本地化字符串。 - /// - public static string TbSettingsSystemproxy { - get { - return ResourceManager.GetString("TbSettingsSystemproxy", resourceCulture); - } - } - - /// - /// 查找类似 Theme 的本地化字符串。 - /// - public static string TbSettingsTheme { - get { - return ResourceManager.GetString("TbSettingsTheme", resourceCulture); - } - } - - /// - /// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。 - /// - public static string TbSettingsTLS13 { - get { - return ResourceManager.GetString("TbSettingsTLS13", resourceCulture); - } - } - - /// - /// 查找类似 Tray right-click menu servers display limit 的本地化字符串。 - /// - public static string TbSettingsTrayMenuServersLimit { - get { - return ResourceManager.GetString("TbSettingsTrayMenuServersLimit", resourceCulture); - } - } - - /// - /// 查找类似 TunMode settings 的本地化字符串。 - /// - public static string TbSettingsTunMode { - get { - return ResourceManager.GetString("TbSettingsTunMode", resourceCulture); - } - } - - /// - /// 查找类似 Enable UDP 的本地化字符串。 - /// - public static string TbSettingsUdpEnabled { - get { - return ResourceManager.GetString("TbSettingsUdpEnabled", resourceCulture); - } - } - - /// - /// 查找类似 Auth user 的本地化字符串。 - /// - public static string TbSettingsUser { - get { - return ResourceManager.GetString("TbSettingsUser", resourceCulture); - } - } - - /// - /// 查找类似 Use System Hosts 的本地化字符串。 - /// - public static string TbSettingsUseSystemHosts { - get { - return ResourceManager.GetString("TbSettingsUseSystemHosts", resourceCulture); - } - } - - /// - /// 查找类似 ShortId 的本地化字符串。 - /// - public static string TbShortId { - get { - return ResourceManager.GetString("TbShortId", resourceCulture); - } - } - - /// - /// 查找类似 SNI 的本地化字符串。 - /// - public static string TbSNI { - get { - return ResourceManager.GetString("TbSNI", resourceCulture); - } - } - - /// - /// 查找类似 Sorting 的本地化字符串。 - /// - public static string TbSorting { - get { - return ResourceManager.GetString("TbSorting", resourceCulture); - } - } - - /// - /// 查找类似 Chain 的本地化字符串。 - /// - public static string TbSortingChain { - get { - return ResourceManager.GetString("TbSortingChain", resourceCulture); - } - } - - /// - /// 查找类似 Default 的本地化字符串。 - /// - public static string TbSortingDefault { - get { - return ResourceManager.GetString("TbSortingDefault", resourceCulture); - } - } - - /// - /// 查找类似 Delay 的本地化字符串。 - /// - public static string TbSortingDelay { - get { - return ResourceManager.GetString("TbSortingDelay", resourceCulture); - } - } - - /// - /// 查找类似 Download Speed 的本地化字符串。 - /// - public static string TbSortingDownSpeed { - get { - return ResourceManager.GetString("TbSortingDownSpeed", resourceCulture); - } - } - - /// - /// 查找类似 Download Traffic 的本地化字符串。 - /// - public static string TbSortingDownTraffic { - get { - return ResourceManager.GetString("TbSortingDownTraffic", resourceCulture); - } - } - - /// - /// 查找类似 Host 的本地化字符串。 - /// - public static string TbSortingHost { - get { - return ResourceManager.GetString("TbSortingHost", resourceCulture); - } - } - - /// - /// 查找类似 Name 的本地化字符串。 - /// - public static string TbSortingName { - get { - return ResourceManager.GetString("TbSortingName", resourceCulture); - } - } - - /// - /// 查找类似 Network 的本地化字符串。 - /// - public static string TbSortingNetwork { - get { - return ResourceManager.GetString("TbSortingNetwork", resourceCulture); - } - } - - /// - /// 查找类似 Time 的本地化字符串。 - /// - public static string TbSortingTime { - get { - return ResourceManager.GetString("TbSortingTime", resourceCulture); - } - } - - /// - /// 查找类似 Type 的本地化字符串。 - /// - public static string TbSortingType { - get { - return ResourceManager.GetString("TbSortingType", resourceCulture); - } - } - - /// - /// 查找类似 Upload Speed 的本地化字符串。 - /// - public static string TbSortingUpSpeed { - get { - return ResourceManager.GetString("TbSortingUpSpeed", resourceCulture); - } - } - - /// - /// 查找类似 Upload Traffic 的本地化字符串。 - /// - public static string TbSortingUpTraffic { - get { - return ResourceManager.GetString("TbSortingUpTraffic", resourceCulture); - } - } - - /// - /// 查找类似 SpiderX 的本地化字符串。 - /// - public static string TbSpiderX { - get { - return ResourceManager.GetString("TbSpiderX", resourceCulture); - } - } - - /// - /// 查找类似 TLS 的本地化字符串。 - /// - public static string TbStreamSecurity { - get { - return ResourceManager.GetString("TbStreamSecurity", resourceCulture); - } - } - - /// - /// 查找类似 PAC mode 的本地化字符串。 - /// - public static string TbSystemProxyPac { - get { - return ResourceManager.GetString("TbSystemProxyPac", resourceCulture); - } - } - - /// - /// 查找类似 The delay : {0} ms, {1} 的本地化字符串。 - /// - public static string TestMeOutput { - get { - return ResourceManager.GetString("TestMeOutput", resourceCulture); - } - } - - /// - /// 查找类似 Active 的本地化字符串。 - /// - public static string TipActiveServer { - get { - return ResourceManager.GetString("TipActiveServer", resourceCulture); - } - } - - /// - /// 查找类似 Routing setting is changed 的本地化字符串。 - /// - public static string TipChangeRouting { - get { - return ResourceManager.GetString("TipChangeRouting", resourceCulture); - } - } - - /// - /// 查找类似 System proxy setting is changed 的本地化字符串。 - /// - public static string TipChangeSystemProxy { - get { - return ResourceManager.GetString("TipChangeSystemProxy", resourceCulture); - } - } - - /// - /// 查找类似 Please turn off when there is an abnormal disconnection 的本地化字符串。 - /// - public static string TipDisplayLog { - get { - return ResourceManager.GetString("TipDisplayLog", resourceCulture); - } - } - - /// - /// 查找类似 *Default value tcp 的本地化字符串。 - /// - public static string TipNetwork { - get { - return ResourceManager.GetString("TipNetwork", resourceCulture); - } - } - - /// - /// 查找类似 * After setting this value, an socks service will be started using Xray/sing-box(Tun) to provide functions such as speed display 的本地化字符串。 - /// - public static string TipPreSocksPort { - get { - return ResourceManager.GetString("TipPreSocksPort", resourceCulture); - } - } - - /// - /// 查找类似 XHTTP Extra raw JSON, format: { XHTTPObject } 的本地化字符串。 - /// - public static string TransportExtraTip { - get { - return ResourceManager.GetString("TransportExtraTip", resourceCulture); - } - } - - /// - /// 查找类似 *tcp camouflage type 的本地化字符串。 - /// - public static string TransportHeaderTypeTip1 { - get { - return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture); - } - } - - /// - /// 查找类似 *kcp camouflage type 的本地化字符串。 - /// - public static string TransportHeaderTypeTip2 { - get { - return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture); - } - } - - /// - /// 查找类似 *QUIC camouflage type 的本地化字符串。 - /// - public static string TransportHeaderTypeTip3 { - get { - return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture); - } - } - - /// - /// 查找类似 *grpc mode 的本地化字符串。 - /// - public static string TransportHeaderTypeTip4 { - get { - return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture); - } - } - - /// - /// 查找类似 *xhttp mode 的本地化字符串。 - /// - public static string TransportHeaderTypeTip5 { - get { - return ResourceManager.GetString("TransportHeaderTypeTip5", resourceCulture); - } - } - - /// - /// 查找类似 *ws/httpupgrade/xhttp path 的本地化字符串。 - /// - public static string TransportPathTip1 { - get { - return ResourceManager.GetString("TransportPathTip1", resourceCulture); - } - } - - /// - /// 查找类似 *h2 path 的本地化字符串。 - /// - public static string TransportPathTip2 { - get { - return ResourceManager.GetString("TransportPathTip2", resourceCulture); - } - } - - /// - /// 查找类似 *QUIC key/KCP seed 的本地化字符串。 - /// - public static string TransportPathTip3 { - get { - return ResourceManager.GetString("TransportPathTip3", resourceCulture); - } - } - - /// - /// 查找类似 *grpc serviceName 的本地化字符串。 - /// - public static string TransportPathTip4 { - get { - return ResourceManager.GetString("TransportPathTip4", resourceCulture); - } - } - - /// - /// 查找类似 *kcp seed 的本地化字符串。 - /// - public static string TransportPathTip5 { - get { - return ResourceManager.GetString("TransportPathTip5", resourceCulture); - } - } - - /// - /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 - /// - public static string TransportRequestHostTip1 { - get { - return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture); - } - } - - /// - /// 查找类似 *ws/httpupgrade/xhttp host 的本地化字符串。 - /// - public static string TransportRequestHostTip2 { - get { - return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture); - } - } - - /// - /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 - /// - public static string TransportRequestHostTip3 { - get { - return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture); - } - } - - /// - /// 查找类似 *QUIC security 的本地化字符串。 - /// - public static string TransportRequestHostTip4 { - get { - return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); - } - } - - /// - /// 查找类似 *grpc Authority 的本地化字符串。 - /// - public static string TransportRequestHostTip5 { - get { - return ResourceManager.GetString("TransportRequestHostTip5", resourceCulture); - } - } - - /// - /// 查找类似 Ungrouped 的本地化字符串。 - /// - public static string UngroupedServers { - get { - return ResourceManager.GetString("UngroupedServers", resourceCulture); - } - } - - /// - /// 查找类似 You are currently running a standalone package, please manually download the SelfContained.7z file to unzip and overwrite it! 的本地化字符串。 - /// - public static string UpdateStandalonePackageTip { - get { - return ResourceManager.GetString("UpdateStandalonePackageTip", resourceCulture); - } - } - - /// - /// 查找类似 UpgradeApp does not exist 的本地化字符串。 - /// - public static string UpgradeAppNotExistTip { - get { - return ResourceManager.GetString("UpgradeAppNotExistTip", resourceCulture); - } - } - } + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class ResUI { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResUI() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("ServiceLib.Resx.ResUI", typeof(ResUI).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似 Do you want to append rules? Choose yes to append, choose otherwise to replace 的本地化字符串。 + /// + public static string AddBatchRoutingRulesYesNo { + get { + return ResourceManager.GetString("AddBatchRoutingRulesYesNo", resourceCulture); + } + } + + /// + /// 查找类似 All 的本地化字符串。 + /// + public static string AllGroupServers { + get { + return ResourceManager.GetString("AllGroupServers", resourceCulture); + } + } + + /// + /// 查找类似 Export Share Link to Clipboard Successfully 的本地化字符串。 + /// + public static string BatchExportURLSuccessfully { + get { + return ResourceManager.GetString("BatchExportURLSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Please check the server settings first 的本地化字符串。 + /// + public static string CheckServerSettings { + get { + return ResourceManager.GetString("CheckServerSettings", resourceCulture); + } + } + + /// + /// 查找类似 Invalid configuration format 的本地化字符串。 + /// + public static string ConfigurationFormatIncorrect { + get { + return ResourceManager.GetString("ConfigurationFormatIncorrect", resourceCulture); + } + } + + /// + /// 查找类似 Host filter 的本地化字符串。 + /// + public static string ConnectionsHostFilterTitle { + get { + return ResourceManager.GetString("ConnectionsHostFilterTitle", resourceCulture); + } + } + + /// + /// 查找类似 Note that custom configuration relies entirely on your own configuration and does not work with all settings. If you want to use the system proxy, please modify the listening port manually. 的本地化字符串。 + /// + public static string CustomServerTips { + get { + return ResourceManager.GetString("CustomServerTips", resourceCulture); + } + } + + /// + /// 查找类似 Downloading... 的本地化字符串。 + /// + public static string Downloading { + get { + return ResourceManager.GetString("Downloading", resourceCulture); + } + } + + /// + /// 查找类似 Download 的本地化字符串。 + /// + public static string downloadSpeed { + get { + return ResourceManager.GetString("downloadSpeed", resourceCulture); + } + } + + /// + /// 查找类似 Whether to download? {0} 的本地化字符串。 + /// + public static string DownloadYesNo { + get { + return ResourceManager.GetString("DownloadYesNo", resourceCulture); + } + } + + /// + /// 查找类似 Failed to convert configuration file 的本地化字符串。 + /// + public static string FailedConversionConfiguration { + get { + return ResourceManager.GetString("FailedConversionConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to generate default configuration file 的本地化字符串。 + /// + public static string FailedGenDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGenDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to get the default configuration 的本地化字符串。 + /// + public static string FailedGetDefaultConfiguration { + get { + return ResourceManager.GetString("FailedGetDefaultConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import custom configuration server 的本地化字符串。 + /// + public static string FailedImportedCustomServer { + get { + return ResourceManager.GetString("FailedImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Failed to read configuration file 的本地化字符串。 + /// + public static string FailedReadConfiguration { + get { + return ResourceManager.GetString("FailedReadConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Failed to run Core, please see the log 的本地化字符串。 + /// + public static string FailedToRunCore { + get { + return ResourceManager.GetString("FailedToRunCore", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct custom DNS 的本地化字符串。 + /// + public static string FillCorrectDNSText { + get { + return ResourceManager.GetString("FillCorrectDNSText", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the correct format server port 的本地化字符串。 + /// + public static string FillCorrectServerPort { + get { + return ResourceManager.GetString("FillCorrectServerPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the local listening port 的本地化字符串。 + /// + public static string FillLocalListeningPort { + get { + return ResourceManager.GetString("FillLocalListeningPort", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the password 的本地化字符串。 + /// + public static string FillPassword { + get { + return ResourceManager.GetString("FillPassword", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the server address 的本地化字符串。 + /// + public static string FillServerAddress { + get { + return ResourceManager.GetString("FillServerAddress", resourceCulture); + } + } + + /// + /// 查找类似 Please browse to import server configuration 的本地化字符串。 + /// + public static string FillServerAddressCustom { + get { + return ResourceManager.GetString("FillServerAddressCustom", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the user ID 的本地化字符串。 + /// + public static string FillUUID { + get { + return ResourceManager.GetString("FillUUID", resourceCulture); + } + } + + /// + /// 查找类似 Transport 的本地化字符串。 + /// + public static string GbTransport { + get { + return ResourceManager.GetString("GbTransport", resourceCulture); + } + } + + /// + /// 查找类似 Is not the correct configuration, please check 的本地化字符串。 + /// + public static string Incorrectconfiguration { + get { + return ResourceManager.GetString("Incorrectconfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Initial Configuration 的本地化字符串。 + /// + public static string InitialConfiguration { + get { + return ResourceManager.GetString("InitialConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Please do not use the insecure HTTP protocol subscription address 的本地化字符串。 + /// + public static string InsecureUrlProtocol { + get { + return ResourceManager.GetString("InsecureUrlProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Invalid address (Url) 的本地化字符串。 + /// + public static string InvalidUrlTip { + get { + return ResourceManager.GetString("InvalidUrlTip", resourceCulture); + } + } + + /// + /// 查找类似 {0} {1} already up to date. 的本地化字符串。 + /// + public static string IsLatestCore { + get { + return ResourceManager.GetString("IsLatestCore", resourceCulture); + } + } + + /// + /// 查找类似 {0} {1} already up to date. 的本地化字符串。 + /// + public static string IsLatestN { + get { + return ResourceManager.GetString("IsLatestN", resourceCulture); + } + } + + /// + /// 查找类似 LAN 的本地化字符串。 + /// + public static string LabLAN { + get { + return ResourceManager.GetString("LabLAN", resourceCulture); + } + } + + /// + /// 查找类似 Local 的本地化字符串。 + /// + public static string LabLocal { + get { + return ResourceManager.GetString("LabLocal", resourceCulture); + } + } + + /// + /// 查找类似 Invalid backup file 的本地化字符串。 + /// + public static string LocalRestoreInvalidZipTips { + get { + return ResourceManager.GetString("LocalRestoreInvalidZipTips", resourceCulture); + } + } + + /// + /// 查找类似 Address 的本地化字符串。 + /// + public static string LvAddress { + get { + return ResourceManager.GetString("LvAddress", resourceCulture); + } + } + + /// + /// 查找类似 Automatic update interval (minutes) 的本地化字符串。 + /// + public static string LvAutoUpdateInterval { + get { + return ResourceManager.GetString("LvAutoUpdateInterval", resourceCulture); + } + } + + /// + /// 查找类似 Convert target type 的本地化字符串。 + /// + public static string LvConvertTarget { + get { + return ResourceManager.GetString("LvConvertTarget", resourceCulture); + } + } + + /// + /// 查找类似 Please leave blank if no conversion is required 的本地化字符串。 + /// + public static string LvConvertTargetTip { + get { + return ResourceManager.GetString("LvConvertTargetTip", resourceCulture); + } + } + + /// + /// 查找类似 Count 的本地化字符串。 + /// + public static string LvCount { + get { + return ResourceManager.GetString("LvCount", resourceCulture); + } + } + + /// + /// 查找类似 Custom icon 的本地化字符串。 + /// + public static string LvCustomIcon { + get { + return ResourceManager.GetString("LvCustomIcon", resourceCulture); + } + } + + /// + /// 查找类似 Custom the rule-set of sing-box 的本地化字符串。 + /// + public static string LvCustomRulesetPath4Singbox { + get { + return ResourceManager.GetString("LvCustomRulesetPath4Singbox", resourceCulture); + } + } + + /// + /// 查找类似 Enable update 的本地化字符串。 + /// + public static string LvEnabled { + get { + return ResourceManager.GetString("LvEnabled", resourceCulture); + } + } + + /// + /// 查找类似 Security 的本地化字符串。 + /// + public static string LvEncryptionMethod { + get { + return ResourceManager.GetString("LvEncryptionMethod", resourceCulture); + } + } + + /// + /// 查找类似 Remarks regular filter 的本地化字符串。 + /// + public static string LvFilter { + get { + return ResourceManager.GetString("LvFilter", resourceCulture); + } + } + + /// + /// 查找类似 Remarks Memo 的本地化字符串。 + /// + public static string LvMemo { + get { + return ResourceManager.GetString("LvMemo", resourceCulture); + } + } + + /// + /// 查找类似 More URLs, separated by commas; Subscription conversion will be invalid 的本地化字符串。 + /// + public static string LvMoreUrl { + get { + return ResourceManager.GetString("LvMoreUrl", resourceCulture); + } + } + + /// + /// 查找类似 Next proxy remarks 的本地化字符串。 + /// + public static string LvNextProfile { + get { + return ResourceManager.GetString("LvNextProfile", resourceCulture); + } + } + + /// + /// 查找类似 Port 的本地化字符串。 + /// + public static string LvPort { + get { + return ResourceManager.GetString("LvPort", resourceCulture); + } + } + + /// + /// 查找类似 Previous proxy remarks 的本地化字符串。 + /// + public static string LvPrevProfile { + get { + return ResourceManager.GetString("LvPrevProfile", resourceCulture); + } + } + + /// + /// 查找类似 Please make sure the remarks exists and is unique 的本地化字符串。 + /// + public static string LvPrevProfileTip { + get { + return ResourceManager.GetString("LvPrevProfileTip", resourceCulture); + } + } + + /// + /// 查找类似 Remarks 的本地化字符串。 + /// + public static string LvRemarks { + get { + return ResourceManager.GetString("LvRemarks", resourceCulture); + } + } + + /// + /// 查找类似 Type 的本地化字符串。 + /// + public static string LvServiceType { + get { + return ResourceManager.GetString("LvServiceType", resourceCulture); + } + } + + /// + /// 查找类似 Sort 的本地化字符串。 + /// + public static string LvSort { + get { + return ResourceManager.GetString("LvSort", resourceCulture); + } + } + + /// + /// 查找类似 Subs group 的本地化字符串。 + /// + public static string LvSubscription { + get { + return ResourceManager.GetString("LvSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Delay(ms) 的本地化字符串。 + /// + public static string LvTestDelay { + get { + return ResourceManager.GetString("LvTestDelay", resourceCulture); + } + } + + /// + /// 查找类似 Speed(M/s) 的本地化字符串。 + /// + public static string LvTestSpeed { + get { + return ResourceManager.GetString("LvTestSpeed", resourceCulture); + } + } + + /// + /// 查找类似 TLS 的本地化字符串。 + /// + public static string LvTLS { + get { + return ResourceManager.GetString("LvTLS", resourceCulture); + } + } + + /// + /// 查找类似 Download traffic today 的本地化字符串。 + /// + public static string LvTodayDownloadDataAmount { + get { + return ResourceManager.GetString("LvTodayDownloadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Upload traffic today 的本地化字符串。 + /// + public static string LvTodayUploadDataAmount { + get { + return ResourceManager.GetString("LvTodayUploadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Total download traffic 的本地化字符串。 + /// + public static string LvTotalDownloadDataAmount { + get { + return ResourceManager.GetString("LvTotalDownloadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Total upload traffic 的本地化字符串。 + /// + public static string LvTotalUploadDataAmount { + get { + return ResourceManager.GetString("LvTotalUploadDataAmount", resourceCulture); + } + } + + /// + /// 查找类似 Transport 的本地化字符串。 + /// + public static string LvTransportProtocol { + get { + return ResourceManager.GetString("LvTransportProtocol", resourceCulture); + } + } + + /// + /// 查找类似 URL (optional) 的本地化字符串。 + /// + public static string LvUrl { + get { + return ResourceManager.GetString("LvUrl", resourceCulture); + } + } + + /// + /// 查找类似 User Agent 的本地化字符串。 + /// + public static string LvUserAgent { + get { + return ResourceManager.GetString("LvUserAgent", resourceCulture); + } + } + + /// + /// 查找类似 WebDav Check 的本地化字符串。 + /// + public static string LvWebDavCheck { + get { + return ResourceManager.GetString("LvWebDavCheck", resourceCulture); + } + } + + /// + /// 查找类似 Remote folder name (optional) 的本地化字符串。 + /// + public static string LvWebDavDirName { + get { + return ResourceManager.GetString("LvWebDavDirName", resourceCulture); + } + } + + /// + /// 查找类似 WebDav Password 的本地化字符串。 + /// + public static string LvWebDavPassword { + get { + return ResourceManager.GetString("LvWebDavPassword", resourceCulture); + } + } + + /// + /// 查找类似 WebDav Url 的本地化字符串。 + /// + public static string LvWebDavUrl { + get { + return ResourceManager.GetString("LvWebDavUrl", resourceCulture); + } + } + + /// + /// 查找类似 WebDav User Name 的本地化字符串。 + /// + public static string LvWebDavUserName { + get { + return ResourceManager.GetString("LvWebDavUserName", resourceCulture); + } + } + + /// + /// 查找类似 Add a custom configuration server 的本地化字符串。 + /// + public static string menuAddCustomServer { + get { + return ResourceManager.GetString("menuAddCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [HTTP] server 的本地化字符串。 + /// + public static string menuAddHttpServer { + get { + return ResourceManager.GetString("menuAddHttpServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [Hysteria2] server 的本地化字符串。 + /// + public static string menuAddHysteria2Server { + get { + return ResourceManager.GetString("menuAddHysteria2Server", resourceCulture); + } + } + + /// + /// 查找类似 Import Share Links from clipboard (Ctrl+V) 的本地化字符串。 + /// + public static string menuAddServerViaClipboard { + get { + return ResourceManager.GetString("menuAddServerViaClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Scan QR code in the image 的本地化字符串。 + /// + public static string menuAddServerViaImage { + get { + return ResourceManager.GetString("menuAddServerViaImage", resourceCulture); + } + } + + /// + /// 查找类似 Scan QR code on the screen (Ctrl+S) 的本地化字符串。 + /// + public static string menuAddServerViaScan { + get { + return ResourceManager.GetString("menuAddServerViaScan", resourceCulture); + } + } + + /// + /// 查找类似 Add [Shadowsocks] server 的本地化字符串。 + /// + public static string menuAddShadowsocksServer { + get { + return ResourceManager.GetString("menuAddShadowsocksServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [SOCKS] server 的本地化字符串。 + /// + public static string menuAddSocksServer { + get { + return ResourceManager.GetString("menuAddSocksServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [Trojan] server 的本地化字符串。 + /// + public static string menuAddTrojanServer { + get { + return ResourceManager.GetString("menuAddTrojanServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [TUIC] server 的本地化字符串。 + /// + public static string menuAddTuicServer { + get { + return ResourceManager.GetString("menuAddTuicServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [VLESS] server 的本地化字符串。 + /// + public static string menuAddVlessServer { + get { + return ResourceManager.GetString("menuAddVlessServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [VMess] server 的本地化字符串。 + /// + public static string menuAddVmessServer { + get { + return ResourceManager.GetString("menuAddVmessServer", resourceCulture); + } + } + + /// + /// 查找类似 Add [WireGuard] server 的本地化字符串。 + /// + public static string menuAddWireguardServer { + get { + return ResourceManager.GetString("menuAddWireguardServer", resourceCulture); + } + } + + /// + /// 查找类似 Backup and Restore 的本地化字符串。 + /// + public static string menuBackupAndRestore { + get { + return ResourceManager.GetString("menuBackupAndRestore", resourceCulture); + } + } + + /// + /// 查找类似 Check Update 的本地化字符串。 + /// + public static string menuCheckUpdate { + get { + return ResourceManager.GetString("menuCheckUpdate", resourceCulture); + } + } + + /// + /// 查找类似 Clear all service statistics 的本地化字符串。 + /// + public static string menuClearServerStatistics { + get { + return ResourceManager.GetString("menuClearServerStatistics", resourceCulture); + } + } + + /// + /// 查找类似 Close 的本地化字符串。 + /// + public static string menuClose { + get { + return ResourceManager.GetString("menuClose", resourceCulture); + } + } + + /// + /// 查找类似 Close Connection 的本地化字符串。 + /// + public static string menuConnectionClose { + get { + return ResourceManager.GetString("menuConnectionClose", resourceCulture); + } + } + + /// + /// 查找类似 Close All Connection 的本地化字符串。 + /// + public static string menuConnectionCloseAll { + get { + return ResourceManager.GetString("menuConnectionCloseAll", resourceCulture); + } + } + + /// + /// 查找类似 Copy proxy command to clipboard 的本地化字符串。 + /// + public static string menuCopyProxyCmdToClipboard { + get { + return ResourceManager.GetString("menuCopyProxyCmdToClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Clone selected server 的本地化字符串。 + /// + public static string menuCopyServer { + get { + return ResourceManager.GetString("menuCopyServer", resourceCulture); + } + } + + /// + /// 查找类似 DNS Settings 的本地化字符串。 + /// + public static string menuDNSSetting { + get { + return ResourceManager.GetString("menuDNSSetting", resourceCulture); + } + } + + /// + /// 查找类似 Edit Server (Ctrl+D) 的本地化字符串。 + /// + public static string menuEditServer { + get { + return ResourceManager.GetString("menuEditServer", resourceCulture); + } + } + + /// + /// 查找类似 Exit 的本地化字符串。 + /// + public static string menuExit { + get { + return ResourceManager.GetString("menuExit", resourceCulture); + } + } + + /// + /// 查找类似 Are you sure to exit? 的本地化字符串。 + /// + public static string menuExitTips { + get { + return ResourceManager.GetString("menuExitTips", resourceCulture); + } + } + + /// + /// 查找类似 Export selected server for complete configuration 的本地化字符串。 + /// + public static string menuExport2ClientConfig { + get { + return ResourceManager.GetString("menuExport2ClientConfig", resourceCulture); + } + } + + /// + /// 查找类似 Export selected server for complete configuration to clipboard 的本地化字符串。 + /// + public static string menuExport2ClientConfigClipboard { + get { + return ResourceManager.GetString("menuExport2ClientConfigClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Export Share Link to Clipboard (Ctrl+C) 的本地化字符串。 + /// + public static string menuExport2ShareUrl { + get { + return ResourceManager.GetString("menuExport2ShareUrl", resourceCulture); + } + } + + /// + /// 查找类似 Export Base64-encoded Share Links to Clipboard 的本地化字符串。 + /// + public static string menuExport2ShareUrlBase64 { + get { + return ResourceManager.GetString("menuExport2ShareUrlBase64", resourceCulture); + } + } + + /// + /// 查找类似 Global Hotkey Setting 的本地化字符串。 + /// + public static string menuGlobalHotkeySetting { + get { + return ResourceManager.GetString("menuGlobalHotkeySetting", resourceCulture); + } + } + + /// + /// 查找类似 Help 的本地化字符串。 + /// + public static string menuHelp { + get { + return ResourceManager.GetString("menuHelp", resourceCulture); + } + } + + /// + /// 查找类似 Import Rules From Clipboard 的本地化字符串。 + /// + public static string menuImportRulesFromClipboard { + get { + return ResourceManager.GetString("menuImportRulesFromClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Import Rules From File 的本地化字符串。 + /// + public static string menuImportRulesFromFile { + get { + return ResourceManager.GetString("menuImportRulesFromFile", resourceCulture); + } + } + + /// + /// 查找类似 Import Rules From Subscription URL 的本地化字符串。 + /// + public static string menuImportRulesFromUrl { + get { + return ResourceManager.GetString("menuImportRulesFromUrl", resourceCulture); + } + } + + /// + /// 查找类似 Backup to local 的本地化字符串。 + /// + public static string menuLocalBackup { + get { + return ResourceManager.GetString("menuLocalBackup", resourceCulture); + } + } + + /// + /// 查找类似 Local 的本地化字符串。 + /// + public static string menuLocalBackupAndRestore { + get { + return ResourceManager.GetString("menuLocalBackupAndRestore", resourceCulture); + } + } + + /// + /// 查找类似 Restore from local 的本地化字符串。 + /// + public static string menuLocalRestore { + get { + return ResourceManager.GetString("menuLocalRestore", resourceCulture); + } + } + + /// + /// 查找类似 One-click multi-test latency and speed (Ctrl+E) 的本地化字符串。 + /// + public static string menuMixedTestServer { + get { + return ResourceManager.GetString("menuMixedTestServer", resourceCulture); + } + } + + /// + /// 查找类似 Direct 的本地化字符串。 + /// + public static string menuModeDirect { + get { + return ResourceManager.GetString("menuModeDirect", resourceCulture); + } + } + + /// + /// 查找类似 Global 的本地化字符串。 + /// + public static string menuModeGlobal { + get { + return ResourceManager.GetString("menuModeGlobal", resourceCulture); + } + } + + /// + /// 查找类似 Do not change 的本地化字符串。 + /// + public static string menuModeNothing { + get { + return ResourceManager.GetString("menuModeNothing", resourceCulture); + } + } + + /// + /// 查找类似 Rule 的本地化字符串。 + /// + public static string menuModeRule { + get { + return ResourceManager.GetString("menuModeRule", resourceCulture); + } + } + + /// + /// 查找类似 Move to bottom (B) 的本地化字符串。 + /// + public static string menuMoveBottom { + get { + return ResourceManager.GetString("menuMoveBottom", resourceCulture); + } + } + + /// + /// 查找类似 Down (D) 的本地化字符串。 + /// + public static string menuMoveDown { + get { + return ResourceManager.GetString("menuMoveDown", resourceCulture); + } + } + + /// + /// 查找类似 Move up and down 的本地化字符串。 + /// + public static string menuMoveTo { + get { + return ResourceManager.GetString("menuMoveTo", resourceCulture); + } + } + + /// + /// 查找类似 Move to group 的本地化字符串。 + /// + public static string menuMoveToGroup { + get { + return ResourceManager.GetString("menuMoveToGroup", resourceCulture); + } + } + + /// + /// 查找类似 Move to top (T) 的本地化字符串。 + /// + public static string menuMoveTop { + get { + return ResourceManager.GetString("menuMoveTop", resourceCulture); + } + } + + /// + /// 查找类似 Up (U) 的本地化字符串。 + /// + public static string menuMoveUp { + get { + return ResourceManager.GetString("menuMoveUp", resourceCulture); + } + } + + /// + /// 查找类似 Clear all 的本地化字符串。 + /// + public static string menuMsgViewClear { + get { + return ResourceManager.GetString("menuMsgViewClear", resourceCulture); + } + } + + /// + /// 查找类似 Copy (Ctrl+C) 的本地化字符串。 + /// + public static string menuMsgViewCopy { + get { + return ResourceManager.GetString("menuMsgViewCopy", resourceCulture); + } + } + + /// + /// 查找类似 Copy all 的本地化字符串。 + /// + public static string menuMsgViewCopyAll { + get { + return ResourceManager.GetString("menuMsgViewCopyAll", resourceCulture); + } + } + + /// + /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 + /// + public static string menuMsgViewSelectAll { + get { + return ResourceManager.GetString("menuMsgViewSelectAll", resourceCulture); + } + } + + /// + /// 查找类似 Open the storage location 的本地化字符串。 + /// + public static string menuOpenTheFileLocation { + get { + return ResourceManager.GetString("menuOpenTheFileLocation", resourceCulture); + } + } + + /// + /// 查找类似 Option Setting 的本地化字符串。 + /// + public static string menuOptionSetting { + get { + return ResourceManager.GetString("menuOptionSetting", resourceCulture); + } + } + + /// + /// 查找类似 Auto column width adjustment 的本地化字符串。 + /// + public static string menuProfileAutofitColumnWidth { + get { + return ResourceManager.GetString("menuProfileAutofitColumnWidth", resourceCulture); + } + } + + /// + /// 查找类似 Promotion 的本地化字符串。 + /// + public static string menuPromotion { + get { + return ResourceManager.GetString("menuPromotion", resourceCulture); + } + } + + /// + /// 查找类似 Latency Test 的本地化字符串。 + /// + public static string menuProxiesDelaytest { + get { + return ResourceManager.GetString("menuProxiesDelaytest", resourceCulture); + } + } + + /// + /// 查找类似 Part Node Latency Test 的本地化字符串。 + /// + public static string menuProxiesDelaytestPart { + get { + return ResourceManager.GetString("menuProxiesDelaytestPart", resourceCulture); + } + } + + /// + /// 查找类似 Refresh Proxies 的本地化字符串。 + /// + public static string menuProxiesReload { + get { + return ResourceManager.GetString("menuProxiesReload", resourceCulture); + } + } + + /// + /// 查找类似 Select active node (Enter) 的本地化字符串。 + /// + public static string menuProxiesSelectActivity { + get { + return ResourceManager.GetString("menuProxiesSelectActivity", resourceCulture); + } + } + + /// + /// 查找类似 Test servers real delay (Ctrl+R) 的本地化字符串。 + /// + public static string menuRealPingServer { + get { + return ResourceManager.GetString("menuRealPingServer", resourceCulture); + } + } + + /// + /// 查找类似 Restart as Administrator 的本地化字符串。 + /// + public static string menuRebootAsAdmin { + get { + return ResourceManager.GetString("menuRebootAsAdmin", resourceCulture); + } + } + + /// + /// 查找类似 Regional presets setting 的本地化字符串。 + /// + public static string menuRegionalPresets { + get { + return ResourceManager.GetString("menuRegionalPresets", resourceCulture); + } + } + + /// + /// 查找类似 Default 的本地化字符串。 + /// + public static string menuRegionalPresetsDefault { + get { + return ResourceManager.GetString("menuRegionalPresetsDefault", resourceCulture); + } + } + + /// + /// 查找类似 Iran 的本地化字符串。 + /// + public static string menuRegionalPresetsIran { + get { + return ResourceManager.GetString("menuRegionalPresetsIran", resourceCulture); + } + } + + /// + /// 查找类似 Russia 的本地化字符串。 + /// + public static string menuRegionalPresetsRussia { + get { + return ResourceManager.GetString("menuRegionalPresetsRussia", resourceCulture); + } + } + + /// + /// 查找类似 Reload 的本地化字符串。 + /// + public static string menuReload { + get { + return ResourceManager.GetString("menuReload", resourceCulture); + } + } + + /// + /// 查找类似 Backup to remote (WebDAV) 的本地化字符串。 + /// + public static string menuRemoteBackup { + get { + return ResourceManager.GetString("menuRemoteBackup", resourceCulture); + } + } + + /// + /// 查找类似 Remote (WebDAV) 的本地化字符串。 + /// + public static string menuRemoteBackupAndRestore { + get { + return ResourceManager.GetString("menuRemoteBackupAndRestore", resourceCulture); + } + } + + /// + /// 查找类似 Restore from remote (WebDAV) 的本地化字符串。 + /// + public static string menuRemoteRestore { + get { + return ResourceManager.GetString("menuRemoteRestore", resourceCulture); + } + } + + /// + /// 查找类似 Remove duplicate servers 的本地化字符串。 + /// + public static string menuRemoveDuplicateServer { + get { + return ResourceManager.GetString("menuRemoveDuplicateServer", resourceCulture); + } + } + + /// + /// 查找类似 Remove selected servers (Delete) 的本地化字符串。 + /// + public static string menuRemoveServer { + get { + return ResourceManager.GetString("menuRemoveServer", resourceCulture); + } + } + + /// + /// 查找类似 Routing 的本地化字符串。 + /// + public static string menuRouting { + get { + return ResourceManager.GetString("menuRouting", resourceCulture); + } + } + + /// + /// 查找类似 Advanced Function 的本地化字符串。 + /// + public static string menuRoutingAdvanced { + get { + return ResourceManager.GetString("menuRoutingAdvanced", resourceCulture); + } + } + + /// + /// 查找类似 Add 的本地化字符串。 + /// + public static string menuRoutingAdvancedAdd { + get { + return ResourceManager.GetString("menuRoutingAdvancedAdd", resourceCulture); + } + } + + /// + /// 查找类似 Import Rules 的本地化字符串。 + /// + public static string menuRoutingAdvancedImportRules { + get { + return ResourceManager.GetString("menuRoutingAdvancedImportRules", resourceCulture); + } + } + + /// + /// 查找类似 Remove selected (Delete) 的本地化字符串。 + /// + public static string menuRoutingAdvancedRemove { + get { + return ResourceManager.GetString("menuRoutingAdvancedRemove", resourceCulture); + } + } + + /// + /// 查找类似 Set as active rule (Enter) 的本地化字符串。 + /// + public static string menuRoutingAdvancedSetDefault { + get { + return ResourceManager.GetString("menuRoutingAdvancedSetDefault", resourceCulture); + } + } + + /// + /// 查找类似 RoutingRuleDetailsSetting 的本地化字符串。 + /// + public static string menuRoutingRuleDetailsSetting { + get { + return ResourceManager.GetString("menuRoutingRuleDetailsSetting", resourceCulture); + } + } + + /// + /// 查找类似 Rule Settings 的本地化字符串。 + /// + public static string menuRoutingRuleSetting { + get { + return ResourceManager.GetString("menuRoutingRuleSetting", resourceCulture); + } + } + + /// + /// 查找类似 Routing Setting 的本地化字符串。 + /// + public static string menuRoutingSetting { + get { + return ResourceManager.GetString("menuRoutingSetting", resourceCulture); + } + } + + /// + /// 查找类似 Add Rule 的本地化字符串。 + /// + public static string menuRuleAdd { + get { + return ResourceManager.GetString("menuRuleAdd", resourceCulture); + } + } + + /// + /// 查找类似 Export Selected Rules 的本地化字符串。 + /// + public static string menuRuleExportSelected { + get { + return ResourceManager.GetString("menuRuleExportSelected", resourceCulture); + } + } + + /// + /// 查找类似 Rule List 的本地化字符串。 + /// + public static string menuRuleList { + get { + return ResourceManager.GetString("menuRuleList", resourceCulture); + } + } + + /// + /// 查找类似 Rule mode 的本地化字符串。 + /// + public static string menuRulemode { + get { + return ResourceManager.GetString("menuRulemode", resourceCulture); + } + } + + /// + /// 查找类似 Remove Rule (Delete) 的本地化字符串。 + /// + public static string menuRuleRemove { + get { + return ResourceManager.GetString("menuRuleRemove", resourceCulture); + } + } + + /// + /// 查找类似 Select all (Ctrl+A) 的本地化字符串。 + /// + public static string menuSelectAll { + get { + return ResourceManager.GetString("menuSelectAll", resourceCulture); + } + } + + /// + /// 查找类似 Servers 的本地化字符串。 + /// + public static string menuServers { + get { + return ResourceManager.GetString("menuServers", resourceCulture); + } + } + + /// + /// 查找类似 Multi-server load balancing 的本地化字符串。 + /// + public static string menuSetDefaultLoadBalanceServer { + get { + return ResourceManager.GetString("menuSetDefaultLoadBalanceServer", resourceCulture); + } + } + + /// + /// 查找类似 Multi-Server lowest latency 的本地化字符串。 + /// + public static string menuSetDefaultMultipleServer { + get { + return ResourceManager.GetString("menuSetDefaultMultipleServer", resourceCulture); + } + } + + /// + /// 查找类似 Set as active server (Enter) 的本地化字符串。 + /// + public static string menuSetDefaultServer { + get { + return ResourceManager.GetString("menuSetDefaultServer", resourceCulture); + } + } + + /// + /// 查找类似 Settings 的本地化字符串。 + /// + public static string menuSetting { + get { + return ResourceManager.GetString("menuSetting", resourceCulture); + } + } + + /// + /// 查找类似 Share Server (Ctrl+F) 的本地化字符串。 + /// + public static string menuShareServer { + get { + return ResourceManager.GetString("menuShareServer", resourceCulture); + } + } + + /// + /// 查找类似 Show or hide the main window 的本地化字符串。 + /// + public static string menuShowOrHideMainWindow { + get { + return ResourceManager.GetString("menuShowOrHideMainWindow", resourceCulture); + } + } + + /// + /// 查找类似 Sort by test result 的本地化字符串。 + /// + public static string menuSortServerResult { + get { + return ResourceManager.GetString("menuSortServerResult", resourceCulture); + } + } + + /// + /// 查找类似 Test servers download speed (Ctrl+T) 的本地化字符串。 + /// + public static string menuSpeedServer { + get { + return ResourceManager.GetString("menuSpeedServer", resourceCulture); + } + } + + /// + /// 查找类似 Add 的本地化字符串。 + /// + public static string menuSubAdd { + get { + return ResourceManager.GetString("menuSubAdd", resourceCulture); + } + } + + /// + /// 查找类似 Delete 的本地化字符串。 + /// + public static string menuSubDelete { + get { + return ResourceManager.GetString("menuSubDelete", resourceCulture); + } + } + + /// + /// 查找类似 Edit 的本地化字符串。 + /// + public static string menuSubEdit { + get { + return ResourceManager.GetString("menuSubEdit", resourceCulture); + } + } + + /// + /// 查找类似 Update current subscription without proxy 的本地化字符串。 + /// + public static string menuSubGroupUpdate { + get { + return ResourceManager.GetString("menuSubGroupUpdate", resourceCulture); + } + } + + /// + /// 查找类似 Update current subscription with proxy 的本地化字符串。 + /// + public static string menuSubGroupUpdateViaProxy { + get { + return ResourceManager.GetString("menuSubGroupUpdateViaProxy", resourceCulture); + } + } + + /// + /// 查找类似 Subscription Group 的本地化字符串。 + /// + public static string menuSubscription { + get { + return ResourceManager.GetString("menuSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Subscription group settings 的本地化字符串。 + /// + public static string menuSubSetting { + get { + return ResourceManager.GetString("menuSubSetting", resourceCulture); + } + } + + /// + /// 查找类似 Share 的本地化字符串。 + /// + public static string menuSubShare { + get { + return ResourceManager.GetString("menuSubShare", resourceCulture); + } + } + + /// + /// 查找类似 Update subscriptions without proxy 的本地化字符串。 + /// + public static string menuSubUpdate { + get { + return ResourceManager.GetString("menuSubUpdate", resourceCulture); + } + } + + /// + /// 查找类似 Update subscriptions with proxy 的本地化字符串。 + /// + public static string menuSubUpdateViaProxy { + get { + return ResourceManager.GetString("menuSubUpdateViaProxy", resourceCulture); + } + } + + /// + /// 查找类似 System proxy 的本地化字符串。 + /// + public static string menuSystemproxy { + get { + return ResourceManager.GetString("menuSystemproxy", resourceCulture); + } + } + + /// + /// 查找类似 Clear system proxy 的本地化字符串。 + /// + public static string menuSystemProxyClear { + get { + return ResourceManager.GetString("menuSystemProxyClear", resourceCulture); + } + } + + /// + /// 查找类似 Do not change system proxy 的本地化字符串。 + /// + public static string menuSystemProxyNothing { + get { + return ResourceManager.GetString("menuSystemProxyNothing", resourceCulture); + } + } + + /// + /// 查找类似 PAC mode 的本地化字符串。 + /// + public static string menuSystemProxyPac { + get { + return ResourceManager.GetString("menuSystemProxyPac", resourceCulture); + } + } + + /// + /// 查找类似 Set system proxy 的本地化字符串。 + /// + public static string menuSystemProxySet { + get { + return ResourceManager.GetString("menuSystemProxySet", resourceCulture); + } + } + + /// + /// 查找类似 Test servers with tcping (Ctrl+O) 的本地化字符串。 + /// + public static string menuTcpingServer { + get { + return ResourceManager.GetString("menuTcpingServer", resourceCulture); + } + } + + /// + /// 查找类似 {0} Website 的本地化字符串。 + /// + public static string menuWebsiteItem { + get { + return ResourceManager.GetString("menuWebsiteItem", resourceCulture); + } + } + + /// + /// 查找类似 Clear original subscription content 的本地化字符串。 + /// + public static string MsgClearSubscription { + get { + return ResourceManager.GetString("MsgClearSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Download GeoFile: {0} successfully 的本地化字符串。 + /// + public static string MsgDownloadGeoFileSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadGeoFileSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Download Core successfully 的本地化字符串。 + /// + public static string MsgDownloadV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgDownloadV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Failed to import subscription content 的本地化字符串。 + /// + public static string MsgFailedImportSubscription { + get { + return ResourceManager.GetString("MsgFailedImportSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Filter, support regular 的本地化字符串。 + /// + public static string MsgFilterTitle { + get { + return ResourceManager.GetString("MsgFilterTitle", resourceCulture); + } + } + + /// + /// 查找类似 Get subscription content successfully 的本地化字符串。 + /// + public static string MsgGetSubscriptionSuccessfully { + get { + return ResourceManager.GetString("MsgGetSubscriptionSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Information 的本地化字符串。 + /// + public static string MsgInformationTitle { + get { + return ResourceManager.GetString("MsgInformationTitle", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in the URL 的本地化字符串。 + /// + public static string MsgNeedUrl { + get { + return ResourceManager.GetString("MsgNeedUrl", resourceCulture); + } + } + + /// + /// 查找类似 No valid subscriptions set 的本地化字符串。 + /// + public static string MsgNoValidSubscription { + get { + return ResourceManager.GetString("MsgNoValidSubscription", resourceCulture); + } + } + + /// + /// 查找类似 Resolve {0} successfully 的本地化字符串。 + /// + public static string MsgParsingSuccessfully { + get { + return ResourceManager.GetString("MsgParsingSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Server filter, press Enter to execute 的本地化字符串。 + /// + public static string MsgServerTitle { + get { + return ResourceManager.GetString("MsgServerTitle", resourceCulture); + } + } + + /// + /// 查找类似 Updates are not enabled, skip this subscription 的本地化字符串。 + /// + public static string MsgSkipSubscriptionUpdate { + get { + return ResourceManager.GetString("MsgSkipSubscriptionUpdate", resourceCulture); + } + } + + /// + /// 查找类似 Start getting subscriptions 的本地化字符串。 + /// + public static string MsgStartGettingSubscriptions { + get { + return ResourceManager.GetString("MsgStartGettingSubscriptions", resourceCulture); + } + } + + /// + /// 查找类似 Start updating {0}... 的本地化字符串。 + /// + public static string MsgStartUpdating { + get { + return ResourceManager.GetString("MsgStartUpdating", resourceCulture); + } + } + + /// + /// 查找类似 Invalid subscription content 的本地化字符串。 + /// + public static string MsgSubscriptionDecodingFailed { + get { + return ResourceManager.GetString("MsgSubscriptionDecodingFailed", resourceCulture); + } + } + + /// + /// 查找类似 Is unpacking...... 的本地化字符串。 + /// + public static string MsgUnpacking { + get { + return ResourceManager.GetString("MsgUnpacking", resourceCulture); + } + } + + /// + /// 查找类似 Update subscriptions end 的本地化字符串。 + /// + public static string MsgUpdateSubscriptionEnd { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionEnd", resourceCulture); + } + } + + /// + /// 查找类似 Update subscriptions start 的本地化字符串。 + /// + public static string MsgUpdateSubscriptionStart { + get { + return ResourceManager.GetString("MsgUpdateSubscriptionStart", resourceCulture); + } + } + + /// + /// 查找类似 Update Core successfully 的本地化字符串。 + /// + public static string MsgUpdateV2rayCoreSuccessfully { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Update Core successfully! Restarting service... 的本地化字符串。 + /// + public static string MsgUpdateV2rayCoreSuccessfullyMore { + get { + return ResourceManager.GetString("MsgUpdateV2rayCoreSuccessfullyMore", resourceCulture); + } + } + + /// + /// 查找类似 Successful operation. Click the settings menu to reboot the app. 的本地化字符串。 + /// + public static string NeedRebootTips { + get { + return ResourceManager.GetString("NeedRebootTips", resourceCulture); + } + } + + /// + /// 查找类似 Non-VMess or ss protocol 的本地化字符串。 + /// + public static string NonvmessOrssProtocol { + get { + return ResourceManager.GetString("NonvmessOrssProtocol", resourceCulture); + } + } + + /// + /// 查找类似 The Core file (file name: {1}) was not found under the folder ({0}), please download and put it in the folder, download address: {2} 的本地化字符串。 + /// + public static string NotFoundCore { + get { + return ResourceManager.GetString("NotFoundCore", resourceCulture); + } + } + + /// + /// 查找类似 Not run as Admin 的本地化字符串。 + /// + public static string NotRunAsAdmin { + get { + return ResourceManager.GetString("NotRunAsAdmin", resourceCulture); + } + } + + /// + /// 查找类似 Scan completed, no valid QR code found 的本地化字符串。 + /// + public static string NoValidQRcodeFound { + get { + return ResourceManager.GetString("NoValidQRcodeFound", resourceCulture); + } + } + + /// + /// 查找类似 Operation failed, please check and retry 的本地化字符串。 + /// + public static string OperationFailed { + get { + return ResourceManager.GetString("OperationFailed", resourceCulture); + } + } + + /// + /// 查找类似 Operation success 的本地化字符串。 + /// + public static string OperationSuccess { + get { + return ResourceManager.GetString("OperationSuccess", resourceCulture); + } + } + + /// + /// 查找类似 Please Fill Remarks 的本地化字符串。 + /// + public static string PleaseFillRemarks { + get { + return ResourceManager.GetString("PleaseFillRemarks", resourceCulture); + } + } + + /// + /// 查找类似 Please select the encryption method 的本地化字符串。 + /// + public static string PleaseSelectEncryption { + get { + return ResourceManager.GetString("PleaseSelectEncryption", resourceCulture); + } + } + + /// + /// 查找类似 Please select a protocol 的本地化字符串。 + /// + public static string PleaseSelectProtocol { + get { + return ResourceManager.GetString("PleaseSelectProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Please select rules 的本地化字符串。 + /// + public static string PleaseSelectRules { + get { + return ResourceManager.GetString("PleaseSelectRules", resourceCulture); + } + } + + /// + /// 查找类似 Please select the server first 的本地化字符串。 + /// + public static string PleaseSelectServer { + get { + return ResourceManager.GetString("PleaseSelectServer", resourceCulture); + } + } + + /// + /// 查找类似 Global hotkey {0} registered failed, reason {1} 的本地化字符串。 + /// + public static string RegisterGlobalHotkeyFailed { + get { + return ResourceManager.GetString("RegisterGlobalHotkeyFailed", resourceCulture); + } + } + + /// + /// 查找类似 Global hotkey {0} registered successfully 的本地化字符串。 + /// + public static string RegisterGlobalHotkeySuccessfully { + get { + return ResourceManager.GetString("RegisterGlobalHotkeySuccessfully", resourceCulture); + } + } + + /// + /// 查找类似 Servers deduplication completed. Old: {0}, New: {1}. 的本地化字符串。 + /// + public static string RemoveDuplicateServerResult { + get { + return ResourceManager.GetString("RemoveDuplicateServerResult", resourceCulture); + } + } + + /// + /// 查找类似 Are you sure to remove the rules? 的本地化字符串。 + /// + public static string RemoveRules { + get { + return ResourceManager.GetString("RemoveRules", resourceCulture); + } + } + + /// + /// 查找类似 Are you sure to remove the server? 的本地化字符串。 + /// + public static string RemoveServer { + get { + return ResourceManager.GetString("RemoveServer", resourceCulture); + } + } + + /// + /// 查找类似 {0},One of the required. 的本地化字符串。 + /// + public static string RoutingRuleDetailRequiredTips { + get { + return ResourceManager.GetString("RoutingRuleDetailRequiredTips", resourceCulture); + } + } + + /// + /// 查找类似 Run as Admin 的本地化字符串。 + /// + public static string RunAsAdmin { + get { + return ResourceManager.GetString("RunAsAdmin", resourceCulture); + } + } + + /// + /// 查找类似 The client configuration file is saved at: {0} 的本地化字符串。 + /// + public static string SaveClientConfigurationIn { + get { + return ResourceManager.GetString("SaveClientConfigurationIn", resourceCulture); + } + } + + /// + /// 查找类似 {0} : {1}/s↑ | {2}/s↓ 的本地化字符串。 + /// + public static string SpeedDisplayText { + get { + return ResourceManager.GetString("SpeedDisplayText", resourceCulture); + } + } + + /// + /// 查找类似 Testing... 的本地化字符串。 + /// + public static string Speedtesting { + get { + return ResourceManager.GetString("Speedtesting", resourceCulture); + } + } + + /// + /// 查找类似 Test completed 的本地化字符串。 + /// + public static string SpeedtestingCompleted { + get { + return ResourceManager.GetString("SpeedtestingCompleted", resourceCulture); + } + } + + /// + /// 查找类似 Skip test 的本地化字符串。 + /// + public static string SpeedtestingSkip { + get { + return ResourceManager.GetString("SpeedtestingSkip", resourceCulture); + } + } + + /// + /// 查找类似 Test terminating... 的本地化字符串。 + /// + public static string SpeedtestingStop { + get { + return ResourceManager.GetString("SpeedtestingStop", resourceCulture); + } + } + + /// + /// 查找类似 Waiting for testing (press ESC to terminate)... 的本地化字符串。 + /// + public static string SpeedtestingWait { + get { + return ResourceManager.GetString("SpeedtestingWait", resourceCulture); + } + } + + /// + /// 查找类似 Start service ({0})... 的本地化字符串。 + /// + public static string StartService { + get { + return ResourceManager.GetString("StartService", resourceCulture); + } + } + + /// + /// 查找类似 For group please leave blank here 的本地化字符串。 + /// + public static string SubUrlTips { + get { + return ResourceManager.GetString("SubUrlTips", resourceCulture); + } + } + + /// + /// 查找类似 Configuration successful + ///{0} 的本地化字符串。 + /// + public static string SuccessfulConfiguration { + get { + return ResourceManager.GetString("SuccessfulConfiguration", resourceCulture); + } + } + + /// + /// 查找类似 Custom configuration server imported successfully 的本地化字符串。 + /// + public static string SuccessfullyImportedCustomServer { + get { + return ResourceManager.GetString("SuccessfullyImportedCustomServer", resourceCulture); + } + } + + /// + /// 查找类似 {0} servers have been imported from clipboard 的本地化字符串。 + /// + public static string SuccessfullyImportedServerViaClipboard { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaClipboard", resourceCulture); + } + } + + /// + /// 查找类似 Scan import the shared link successfully 的本地化字符串。 + /// + public static string SuccessfullyImportedServerViaScan { + get { + return ResourceManager.GetString("SuccessfullyImportedServerViaScan", resourceCulture); + } + } + + /// + /// 查找类似 Address 的本地化字符串。 + /// + public static string TbAddress { + get { + return ResourceManager.GetString("TbAddress", resourceCulture); + } + } + + /// + /// 查找类似 AllowInsecure 的本地化字符串。 + /// + public static string TbAllowInsecure { + get { + return ResourceManager.GetString("TbAllowInsecure", resourceCulture); + } + } + + /// + /// 查找类似 ALPN 的本地化字符串。 + /// + public static string TbAlpn { + get { + return ResourceManager.GetString("TbAlpn", resourceCulture); + } + } + + /// + /// 查找类似 AlterID 的本地化字符串。 + /// + public static string TbAlterId { + get { + return ResourceManager.GetString("TbAlterId", resourceCulture); + } + } + + /// + /// 查找类似 AutoRefresh 的本地化字符串。 + /// + public static string TbAutoRefresh { + get { + return ResourceManager.GetString("TbAutoRefresh", resourceCulture); + } + } + + /// + /// 查找类似 Auto ScrollToEnd 的本地化字符串。 + /// + public static string TbAutoScrollToEnd { + get { + return ResourceManager.GetString("TbAutoScrollToEnd", resourceCulture); + } + } + + /// + /// 查找类似 Domain, ip, process are auto sorted when saving 的本地化字符串。 + /// + public static string TbAutoSort { + get { + return ResourceManager.GetString("TbAutoSort", resourceCulture); + } + } + + /// + /// 查找类似 Browse 的本地化字符串。 + /// + public static string TbBrowse { + get { + return ResourceManager.GetString("TbBrowse", resourceCulture); + } + } + + /// + /// 查找类似 Cancel 的本地化字符串。 + /// + public static string TbCancel { + get { + return ResourceManager.GetString("TbCancel", resourceCulture); + } + } + + /// + /// 查找类似 Clear system proxy 的本地化字符串。 + /// + public static string TbClearSystemProxy { + get { + return ResourceManager.GetString("TbClearSystemProxy", resourceCulture); + } + } + + /// + /// 查找类似 Confirm 的本地化字符串。 + /// + public static string TbConfirm { + get { + return ResourceManager.GetString("TbConfirm", resourceCulture); + } + } + + /// + /// 查找类似 Connections 的本地化字符串。 + /// + public static string TbConnections { + get { + return ResourceManager.GetString("TbConnections", resourceCulture); + } + } + + /// + /// 查找类似 Core Type 的本地化字符串。 + /// + public static string TbCoreType { + get { + return ResourceManager.GetString("TbCoreType", resourceCulture); + } + } + + /// + /// 查找类似 Display GUI 的本地化字符串。 + /// + public static string TbDisplayGUI { + get { + return ResourceManager.GetString("TbDisplayGUI", resourceCulture); + } + } + + /// + /// 查找类似 Display Log 的本地化字符串。 + /// + public static string TbDisplayLog { + get { + return ResourceManager.GetString("TbDisplayLog", resourceCulture); + } + } + + /// + /// 查找类似 Supports DnsObject; Click to view documentation 的本地化字符串。 + /// + public static string TbDnsObjectDoc { + get { + return ResourceManager.GetString("TbDnsObjectDoc", resourceCulture); + } + } + + /// + /// 查找类似 Please fill in DNS Structure, Click to view the document 的本地化字符串。 + /// + public static string TbDnsSingboxObjectDoc { + get { + return ResourceManager.GetString("TbDnsSingboxObjectDoc", resourceCulture); + } + } + + /// + /// 查找类似 Domain Matcher 的本地化字符串。 + /// + public static string TbdomainMatcher { + get { + return ResourceManager.GetString("TbdomainMatcher", resourceCulture); + } + } + + /// + /// 查找类似 Domain strategy 的本地化字符串。 + /// + public static string TbdomainStrategy { + get { + return ResourceManager.GetString("TbdomainStrategy", resourceCulture); + } + } + + /// + /// 查找类似 sing-box domain strategy 的本地化字符串。 + /// + public static string TbdomainStrategy4Singbox { + get { + return ResourceManager.GetString("TbdomainStrategy4Singbox", resourceCulture); + } + } + + /// + /// 查找类似 Edit 的本地化字符串。 + /// + public static string TbEdit { + get { + return ResourceManager.GetString("TbEdit", resourceCulture); + } + } + + /// + /// 查找类似 Enable Tun 的本地化字符串。 + /// + public static string TbEnableTunAs { + get { + return ResourceManager.GetString("TbEnableTunAs", resourceCulture); + } + } + + /// + /// 查找类似 Fingerprint 的本地化字符串。 + /// + public static string TbFingerprint { + get { + return ResourceManager.GetString("TbFingerprint", resourceCulture); + } + } + + /// + /// 查找类似 Flow 的本地化字符串。 + /// + public static string TbFlow5 { + get { + return ResourceManager.GetString("TbFlow5", resourceCulture); + } + } + + /// + /// 查找类似 Global Hotkey Settings 的本地化字符串。 + /// + public static string TbGlobalHotkeySetting { + get { + return ResourceManager.GetString("TbGlobalHotkeySetting", resourceCulture); + } + } + + /// + /// 查找类似 Set directly by pressing the keyboard; Takes effect after restart 的本地化字符串。 + /// + public static string TbGlobalHotkeySettingTip { + get { + return ResourceManager.GetString("TbGlobalHotkeySettingTip", resourceCulture); + } + } + + /// + /// 查找类似 Generate 的本地化字符串。 + /// + public static string TbGUID { + get { + return ResourceManager.GetString("TbGUID", resourceCulture); + } + } + + /// + /// 查找类似 Camouflage type 的本地化字符串。 + /// + public static string TbHeaderType { + get { + return ResourceManager.GetString("TbHeaderType", resourceCulture); + } + } + + /// + /// 查找类似 Congestion control 的本地化字符串。 + /// + public static string TbHeaderType8 { + get { + return ResourceManager.GetString("TbHeaderType8", resourceCulture); + } + } + + /// + /// 查找类似 UUID(id) 的本地化字符串。 + /// + public static string TbId { + get { + return ResourceManager.GetString("TbId", resourceCulture); + } + } + + /// + /// 查找类似 Password 的本地化字符串。 + /// + public static string TbId3 { + get { + return ResourceManager.GetString("TbId3", resourceCulture); + } + } + + /// + /// 查找类似 Password(Optional) 的本地化字符串。 + /// + public static string TbId4 { + get { + return ResourceManager.GetString("TbId4", resourceCulture); + } + } + + /// + /// 查找类似 UUID(id) 的本地化字符串。 + /// + public static string TbId5 { + get { + return ResourceManager.GetString("TbId5", resourceCulture); + } + } + + /// + /// 查找类似 Address(Ip,Ipv6) 的本地化字符串。 + /// + public static string TbLocalAddress { + get { + return ResourceManager.GetString("TbLocalAddress", resourceCulture); + } + } + + /// + /// 查找类似 Transport protocol(network) 的本地化字符串。 + /// + public static string TbNetwork { + get { + return ResourceManager.GetString("TbNetwork", resourceCulture); + } + } + + /// + /// 查找类似 Do not change system proxy 的本地化字符串。 + /// + public static string TbNotChangeSystemProxy { + get { + return ResourceManager.GetString("TbNotChangeSystemProxy", resourceCulture); + } + } + + /// + /// 查找类似 Path 的本地化字符串。 + /// + public static string TbPath { + get { + return ResourceManager.GetString("TbPath", resourceCulture); + } + } + + /// + /// 查找类似 obfs password 的本地化字符串。 + /// + public static string TbPath7 { + get { + return ResourceManager.GetString("TbPath7", resourceCulture); + } + } + + /// + /// 查找类似 Port 的本地化字符串。 + /// + public static string TbPort { + get { + return ResourceManager.GetString("TbPort", resourceCulture); + } + } + + /// + /// 查找类似 Socks port 的本地化字符串。 + /// + public static string TbPreSocksPort { + get { + return ResourceManager.GetString("TbPreSocksPort", resourceCulture); + } + } + + /// + /// 查找类似 Custom config socks port 的本地化字符串。 + /// + public static string TbPreSocksPort4Sub { + get { + return ResourceManager.GetString("TbPreSocksPort4Sub", resourceCulture); + } + } + + /// + /// 查找类似 PrivateKey 的本地化字符串。 + /// + public static string TbPrivateKey { + get { + return ResourceManager.GetString("TbPrivateKey", resourceCulture); + } + } + + /// + /// 查找类似 Proxies 的本地化字符串。 + /// + public static string TbProxies { + get { + return ResourceManager.GetString("TbProxies", resourceCulture); + } + } + + /// + /// 查找类似 PublicKey 的本地化字符串。 + /// + public static string TbPublicKey { + get { + return ResourceManager.GetString("TbPublicKey", resourceCulture); + } + } + + /// + /// 查找类似 Alias (remarks) 的本地化字符串。 + /// + public static string TbRemarks { + get { + return ResourceManager.GetString("TbRemarks", resourceCulture); + } + } + + /// + /// 查找类似 Camouflage domain(host) 的本地化字符串。 + /// + public static string TbRequestHost { + get { + return ResourceManager.GetString("TbRequestHost", resourceCulture); + } + } + + /// + /// 查找类似 Reserved(2,3,4) 的本地化字符串。 + /// + public static string TbReserved { + get { + return ResourceManager.GetString("TbReserved", resourceCulture); + } + } + + /// + /// 查找类似 Reset 的本地化字符串。 + /// + public static string TbReset { + get { + return ResourceManager.GetString("TbReset", resourceCulture); + } + } + + /// + /// 查找类似 socks: local port, socks2: second local port, socks3: LAN port 的本地化字符串。 + /// + public static string TbRoutingInboundTagTips { + get { + return ResourceManager.GetString("TbRoutingInboundTagTips", resourceCulture); + } + } + + /// + /// 查找类似 Domain 的本地化字符串。 + /// + public static string TbRoutingRuleDomain { + get { + return ResourceManager.GetString("TbRoutingRuleDomain", resourceCulture); + } + } + + /// + /// 查找类似 IP or IP CIDR 的本地化字符串。 + /// + public static string TbRoutingRuleIP { + get { + return ResourceManager.GetString("TbRoutingRuleIP", resourceCulture); + } + } + + /// + /// 查找类似 Full process name (Tun mode) 的本地化字符串。 + /// + public static string TbRoutingRuleProcess { + get { + return ResourceManager.GetString("TbRoutingRuleProcess", resourceCulture); + } + } + + /// + /// 查找类似 3.Block Domain or IP 的本地化字符串。 + /// + public static string TbRoutingTabBlock { + get { + return ResourceManager.GetString("TbRoutingTabBlock", resourceCulture); + } + } + + /// + /// 查找类似 2.Direct Domain or IP 的本地化字符串。 + /// + public static string TbRoutingTabDirect { + get { + return ResourceManager.GetString("TbRoutingTabDirect", resourceCulture); + } + } + + /// + /// 查找类似 1.Proxy Domain or IP 的本地化字符串。 + /// + public static string TbRoutingTabProxy { + get { + return ResourceManager.GetString("TbRoutingTabProxy", resourceCulture); + } + } + + /// + /// 查找类似 Pre-defined Rule Set List 的本地化字符串。 + /// + public static string TbRoutingTabRuleList { + get { + return ResourceManager.GetString("TbRoutingTabRuleList", resourceCulture); + } + } + + /// + /// 查找类似 *Separate rules by commas (,); For a literal comma use <COMMA>; Prefix # to ignore a rule 的本地化字符串。 + /// + public static string TbRoutingTips { + get { + return ResourceManager.GetString("TbRoutingTips", resourceCulture); + } + } + + /// + /// 查找类似 (Domain or IP or ProcName) and Port and Protocol and InboundTag => OutboundTag 的本地化字符串。 + /// + public static string TbRuleMatchingTips { + get { + return ResourceManager.GetString("TbRuleMatchingTips", resourceCulture); + } + } + + /// + /// 查找类似 Ruleobject Doc 的本地化字符串。 + /// + public static string TbRuleobjectDoc { + get { + return ResourceManager.GetString("TbRuleobjectDoc", resourceCulture); + } + } + + /// + /// 查找类似 Encryption method (security) 的本地化字符串。 + /// + public static string TbSecurity { + get { + return ResourceManager.GetString("TbSecurity", resourceCulture); + } + } + + /// + /// 查找类似 Encryption 的本地化字符串。 + /// + public static string TbSecurity3 { + get { + return ResourceManager.GetString("TbSecurity3", resourceCulture); + } + } + + /// + /// 查找类似 User(Optional) 的本地化字符串。 + /// + public static string TbSecurity4 { + get { + return ResourceManager.GetString("TbSecurity4", resourceCulture); + } + } + + /// + /// 查找类似 Encryption 的本地化字符串。 + /// + public static string TbSecurity5 { + get { + return ResourceManager.GetString("TbSecurity5", resourceCulture); + } + } + + /// + /// 查找类似 Set system proxy 的本地化字符串。 + /// + public static string TbSetSystemProxy { + get { + return ResourceManager.GetString("TbSetSystemProxy", resourceCulture); + } + } + + /// + /// 查找类似 Click to import default DNS config 的本地化字符串。 + /// + public static string TbSettingDnsImportDefConfig { + get { + return ResourceManager.GetString("TbSettingDnsImportDefConfig", resourceCulture); + } + } + + /// + /// 查找类似 Advanced proxy settings, protocol selection (optional) 的本地化字符串。 + /// + public static string TbSettingsAdvancedProtocol { + get { + return ResourceManager.GetString("TbSettingsAdvancedProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Allow connections from the LAN 的本地化字符串。 + /// + public static string TbSettingsAllowLAN { + get { + return ResourceManager.GetString("TbSettingsAllowLAN", resourceCulture); + } + } + + /// + /// 查找类似 Auto hide startup 的本地化字符串。 + /// + public static string TbSettingsAutoHideStartup { + get { + return ResourceManager.GetString("TbSettingsAutoHideStartup", resourceCulture); + } + } + + /// + /// 查找类似 Automatic update interval for Geo files (hours) 的本地化字符串。 + /// + public static string TbSettingsAutoUpdateInterval { + get { + return ResourceManager.GetString("TbSettingsAutoUpdateInterval", resourceCulture); + } + } + + /// + /// 查找类似 Users in China region can ignore this item 的本地化字符串。 + /// + public static string TbSettingsChinaUserTip { + get { + return ResourceManager.GetString("TbSettingsChinaUserTip", resourceCulture); + } + } + + /// + /// 查找类似 Color 的本地化字符串。 + /// + public static string TbSettingsColor { + get { + return ResourceManager.GetString("TbSettingsColor", resourceCulture); + } + } + + /// + /// 查找类似 Core: basic settings 的本地化字符串。 + /// + public static string TbSettingsCore { + get { + return ResourceManager.GetString("TbSettingsCore", resourceCulture); + } + } + + /// + /// 查找类似 V2ray DNS settings 的本地化字符串。 + /// + public static string TbSettingsCoreDns { + get { + return ResourceManager.GetString("TbSettingsCoreDns", resourceCulture); + } + } + + /// + /// 查找类似 sing-box DNS settings 的本地化字符串。 + /// + public static string TbSettingsCoreDnsSingbox { + get { + return ResourceManager.GetString("TbSettingsCoreDnsSingbox", resourceCulture); + } + } + + /// + /// 查找类似 Core: KCP settings 的本地化字符串。 + /// + public static string TbSettingsCoreKcp { + get { + return ResourceManager.GetString("TbSettingsCoreKcp", resourceCulture); + } + } + + /// + /// 查找类似 CoreType settings 的本地化字符串。 + /// + public static string TbSettingsCoreType { + get { + return ResourceManager.GetString("TbSettingsCoreType", resourceCulture); + } + } + + /// + /// 查找类似 Font family (requires restart) 的本地化字符串。 + /// + public static string TbSettingsCurrentFontFamily { + get { + return ResourceManager.GetString("TbSettingsCurrentFontFamily", resourceCulture); + } + } + + /// + /// 查找类似 Install the font to the system and restart the settings 的本地化字符串。 + /// + public static string TbSettingsCurrentFontFamilyLinuxTip { + get { + return ResourceManager.GetString("TbSettingsCurrentFontFamilyLinuxTip", resourceCulture); + } + } + + /// + /// 查找类似 Copy the font TTF/TTC file to the directory guiFonts; Reopen the settings window 的本地化字符串。 + /// + public static string TbSettingsCurrentFontFamilyTip { + get { + return ResourceManager.GetString("TbSettingsCurrentFontFamilyTip", resourceCulture); + } + } + + /// + /// 查找类似 AllowInsecure 的本地化字符串。 + /// + public static string TbSettingsDefAllowInsecure { + get { + return ResourceManager.GetString("TbSettingsDefAllowInsecure", resourceCulture); + } + } + + /// + /// 查找类似 Default TLS fingerprint 的本地化字符串。 + /// + public static string TbSettingsDefFingerprint { + get { + return ResourceManager.GetString("TbSettingsDefFingerprint", resourceCulture); + } + } + + /// + /// 查找类似 User-Agent 的本地化字符串。 + /// + public static string TbSettingsDefUserAgent { + get { + return ResourceManager.GetString("TbSettingsDefUserAgent", resourceCulture); + } + } + + /// + /// 查找类似 This parameter is valid only for tcp/http and ws 的本地化字符串。 + /// + public static string TbSettingsDefUserAgentTips { + get { + return ResourceManager.GetString("TbSettingsDefUserAgentTips", resourceCulture); + } + } + + /// + /// 查找类似 Sniffing type 的本地化字符串。 + /// + public static string TbSettingsDestOverride { + get { + return ResourceManager.GetString("TbSettingsDestOverride", resourceCulture); + } + } + + /// + /// 查找类似 Display real-time speed (requires restart) 的本地化字符串。 + /// + public static string TbSettingsDisplayRealTimeSpeed { + get { + return ResourceManager.GetString("TbSettingsDisplayRealTimeSpeed", resourceCulture); + } + } + + /// + /// 查找类似 Outbound DNS address 的本地化字符串。 + /// + public static string TbSettingsDomainDNSAddress { + get { + return ResourceManager.GetString("TbSettingsDomainDNSAddress", resourceCulture); + } + } + + /// + /// 查找类似 Outbound Freedom domainStrategy 的本地化字符串。 + /// + public static string TbSettingsDomainStrategy4Freedom { + get { + return ResourceManager.GetString("TbSettingsDomainStrategy4Freedom", resourceCulture); + } + } + + /// + /// 查找类似 Default domain strategy for outbound 的本地化字符串。 + /// + public static string TbSettingsDomainStrategy4Out { + get { + return ResourceManager.GetString("TbSettingsDomainStrategy4Out", resourceCulture); + } + } + + /// + /// 查找类似 Double-clicking server makes it active 的本地化字符串。 + /// + public static string TbSettingsDoubleClick2Activate { + get { + return ResourceManager.GetString("TbSettingsDoubleClick2Activate", resourceCulture); + } + } + + /// + /// 查找类似 Automatically adjust column width after subscription update 的本地化字符串。 + /// + public static string TbSettingsEnableAutoAdjustMainLvColWidth { + get { + return ResourceManager.GetString("TbSettingsEnableAutoAdjustMainLvColWidth", resourceCulture); + } + } + + /// + /// 查找类似 Enable cache file for sing-box (ruleset files) 的本地化字符串。 + /// + public static string TbSettingsEnableCacheFile4Sbox { + get { + return ResourceManager.GetString("TbSettingsEnableCacheFile4Sbox", resourceCulture); + } + } + + /// + /// 查找类似 Check for pre-release updates 的本地化字符串。 + /// + public static string TbSettingsEnableCheckPreReleaseUpdate { + get { + return ResourceManager.GetString("TbSettingsEnableCheckPreReleaseUpdate", resourceCulture); + } + } + + /// + /// 查找类似 Enable sorting servers by drag-n-drop (requires restart) 的本地化字符串。 + /// + public static string TbSettingsEnableDragDropSort { + get { + return ResourceManager.GetString("TbSettingsEnableDragDropSort", resourceCulture); + } + } + + /// + /// 查找类似 Enable additional Inbound 的本地化字符串。 + /// + public static string TbSettingsEnableExInbound { + get { + return ResourceManager.GetString("TbSettingsEnableExInbound", resourceCulture); + } + } + + /// + /// 查找类似 Enable fragment 的本地化字符串。 + /// + public static string TbSettingsEnableFragment { + get { + return ResourceManager.GetString("TbSettingsEnableFragment", resourceCulture); + } + } + + /// + /// 查找类似 Use Xray and enable non-Tun mode, which conflicts with the group previous proxy 的本地化字符串。 + /// + public static string TbSettingsEnableFragmentTips { + get { + return ResourceManager.GetString("TbSettingsEnableFragmentTips", resourceCulture); + } + } + + /// + /// 查找类似 Enable hardware acceleration (requires restart) 的本地化字符串。 + /// + public static string TbSettingsEnableHWA { + get { + return ResourceManager.GetString("TbSettingsEnableHWA", resourceCulture); + } + } + + /// + /// 查找类似 Enable IPv6 Address 的本地化字符串。 + /// + public static string TbSettingsEnableIPv6Address { + get { + return ResourceManager.GetString("TbSettingsEnableIPv6Address", resourceCulture); + } + } + + /// + /// 查找类似 Updating subscription, only determine remarks exists 的本地化字符串。 + /// + public static string TbSettingsEnableUpdateSubOnlyRemarksExist { + get { + return ResourceManager.GetString("TbSettingsEnableUpdateSubOnlyRemarksExist", resourceCulture); + } + } + + /// + /// 查找类似 Exception 的本地化字符串。 + /// + public static string TbSettingsException { + get { + return ResourceManager.GetString("TbSettingsException", resourceCulture); + } + } + + /// + /// 查找类似 Exclusions: Do not use proxy server for addresses beginning with the following. Use semicolon (;) to separate entries. 的本地化字符串。 + /// + public static string TbSettingsExceptionTip { + get { + return ResourceManager.GetString("TbSettingsExceptionTip", resourceCulture); + } + } + + /// + /// 查找类似 Exclusions: Do not use proxy server for the following addresses. Use comma (,) to separate entries. 的本地化字符串。 + /// + public static string TbSettingsExceptionTip2 { + get { + return ResourceManager.GetString("TbSettingsExceptionTip2", resourceCulture); + } + } + + /// + /// 查找类似 Font Size 的本地化字符串。 + /// + public static string TbSettingsFontSize { + get { + return ResourceManager.GetString("TbSettingsFontSize", resourceCulture); + } + } + + /// + /// 查找类似 Geo files source (optional) 的本地化字符串。 + /// + public static string TbSettingsGeoFilesSource { + get { + return ResourceManager.GetString("TbSettingsGeoFilesSource", resourceCulture); + } + } + + /// + /// 查找类似 Hide to tray when closing the window 的本地化字符串。 + /// + public static string TbSettingsHide2TrayWhenClose { + get { + return ResourceManager.GetString("TbSettingsHide2TrayWhenClose", resourceCulture); + } + } + + /// + /// 查找类似 HTTP Port 的本地化字符串。 + /// + public static string TbSettingsHttpPort { + get { + return ResourceManager.GetString("TbSettingsHttpPort", resourceCulture); + } + } + + /// + /// 查找类似 Hysteria Max bandwidth (Up/Dw) 的本地化字符串。 + /// + public static string TbSettingsHysteriaBandwidth { + get { + return ResourceManager.GetString("TbSettingsHysteriaBandwidth", resourceCulture); + } + } + + /// + /// 查找类似 Keep the older when de-duplicating 的本地化字符串。 + /// + public static string TbSettingsKeepOlderDedupl { + get { + return ResourceManager.GetString("TbSettingsKeepOlderDedupl", resourceCulture); + } + } + + /// + /// 查找类似 Language (Restart) 的本地化字符串。 + /// + public static string TbSettingsLanguage { + get { + return ResourceManager.GetString("TbSettingsLanguage", resourceCulture); + } + } + + /// + /// 查找类似 System sudo password 的本地化字符串。 + /// + public static string TbSettingsLinuxSudoPassword { + get { + return ResourceManager.GetString("TbSettingsLinuxSudoPassword", resourceCulture); + } + } + + /// + /// 查找类似 Please set the sudo password in Tun mode settings first 的本地化字符串。 + /// + public static string TbSettingsLinuxSudoPasswordIsEmpty { + get { + return ResourceManager.GetString("TbSettingsLinuxSudoPasswordIsEmpty", resourceCulture); + } + } + + /// + /// 查找类似 Please do not run this app with sudo 的本地化字符串。 + /// + public static string TbSettingsLinuxSudoPasswordNotSudoRunApp { + get { + return ResourceManager.GetString("TbSettingsLinuxSudoPasswordNotSudoRunApp", resourceCulture); + } + } + + /// + /// 查找类似 The password is encrypted and stored only in local files. 的本地化字符串。 + /// + public static string TbSettingsLinuxSudoPasswordTip { + get { + return ResourceManager.GetString("TbSettingsLinuxSudoPasswordTip", resourceCulture); + } + } + + /// + /// 查找类似 Enable Log 的本地化字符串。 + /// + public static string TbSettingsLogEnabled { + get { + return ResourceManager.GetString("TbSettingsLogEnabled", resourceCulture); + } + } + + /// + /// 查找类似 Enable logging to file 的本地化字符串。 + /// + public static string TbSettingsLogEnabledToFile { + get { + return ResourceManager.GetString("TbSettingsLogEnabledToFile", resourceCulture); + } + } + + /// + /// 查找类似 Log Level 的本地化字符串。 + /// + public static string TbSettingsLogLevel { + get { + return ResourceManager.GetString("TbSettingsLogLevel", resourceCulture); + } + } + + /// + /// 查找类似 Main layout orientation (requires restart) 的本地化字符串。 + /// + public static string TbSettingsMainGirdOrientation { + get { + return ResourceManager.GetString("TbSettingsMainGirdOrientation", resourceCulture); + } + } + + /// + /// 查找类似 sing-box Mux Protocol 的本地化字符串。 + /// + public static string TbSettingsMux4SboxProtocol { + get { + return ResourceManager.GetString("TbSettingsMux4SboxProtocol", resourceCulture); + } + } + + /// + /// 查找类似 Turn on Mux Multiplexing 的本地化字符串。 + /// + public static string TbSettingsMuxEnabled { + get { + return ResourceManager.GetString("TbSettingsMuxEnabled", resourceCulture); + } + } + + /// + /// 查找类似 v2rayN settings 的本地化字符串。 + /// + public static string TbSettingsN { + get { + return ResourceManager.GetString("TbSettingsN", resourceCulture); + } + } + + /// + /// 查找类似 New Port for LAN 的本地化字符串。 + /// + public static string TbSettingsNewPort4LAN { + get { + return ResourceManager.GetString("TbSettingsNewPort4LAN", resourceCulture); + } + } + + /// + /// 查找类似 Do not use proxy servers for local (intranet) addresses 的本地化字符串。 + /// + public static string TbSettingsNotProxyLocalAddress { + get { + return ResourceManager.GetString("TbSettingsNotProxyLocalAddress", resourceCulture); + } + } + + /// + /// 查找类似 Auth pass 的本地化字符串。 + /// + public static string TbSettingsPass { + get { + return ResourceManager.GetString("TbSettingsPass", resourceCulture); + } + } + + /// + /// 查找类似 Custom DNS (multiple, separated by commas (,)) 的本地化字符串。 + /// + public static string TbSettingsRemoteDNS { + get { + return ResourceManager.GetString("TbSettingsRemoteDNS", resourceCulture); + } + } + + /// + /// 查找类似 RouteOnly 的本地化字符串。 + /// + public static string TbSettingsRouteOnly { + get { + return ResourceManager.GetString("TbSettingsRouteOnly", resourceCulture); + } + } + + /// + /// 查找类似 Routing rules source (optional) 的本地化字符串。 + /// + public static string TbSettingsRoutingRulesSource { + get { + return ResourceManager.GetString("TbSettingsRoutingRulesSource", resourceCulture); + } + } + + /// + /// 查找类似 Enable second mixed port 的本地化字符串。 + /// + public static string TbSettingsSecondLocalPortEnabled { + get { + return ResourceManager.GetString("TbSettingsSecondLocalPortEnabled", resourceCulture); + } + } + + /// + /// 查找类似 Set Win10 UWP Loopback 的本地化字符串。 + /// + public static string TbSettingsSetUWP { + get { + return ResourceManager.GetString("TbSettingsSetUWP", resourceCulture); + } + } + + /// + /// 查找类似 Turn on Sniffing 的本地化字符串。 + /// + public static string TbSettingsSniffingEnabled { + get { + return ResourceManager.GetString("TbSettingsSniffingEnabled", resourceCulture); + } + } + + /// + /// 查找类似 Mixed Port 的本地化字符串。 + /// + public static string TbSettingsSocksPort { + get { + return ResourceManager.GetString("TbSettingsSocksPort", resourceCulture); + } + } + + /// + /// 查找类似 Pac port = +3; Xray API port = +4; mihomo API port = +5; 的本地化字符串。 + /// + public static string TbSettingsSocksPortTip { + get { + return ResourceManager.GetString("TbSettingsSocksPortTip", resourceCulture); + } + } + + /// + /// 查找类似 Speed Ping Test URL 的本地化字符串。 + /// + public static string TbSettingsSpeedPingTestUrl { + get { + return ResourceManager.GetString("TbSettingsSpeedPingTestUrl", resourceCulture); + } + } + + /// + /// 查找类似 Number per time for auto batch during speedtest(max 1000) 的本地化字符串。 + /// + public static string TbSettingsSpeedTestPageSize { + get { + return ResourceManager.GetString("TbSettingsSpeedTestPageSize", resourceCulture); + } + } + + /// + /// 查找类似 SpeedTest Single Timeout Value 的本地化字符串。 + /// + public static string TbSettingsSpeedTestTimeout { + get { + return ResourceManager.GetString("TbSettingsSpeedTestTimeout", resourceCulture); + } + } + + /// + /// 查找类似 SpeedTest URL 的本地化字符串。 + /// + public static string TbSettingsSpeedTestUrl { + get { + return ResourceManager.GetString("TbSettingsSpeedTestUrl", resourceCulture); + } + } + + /// + /// 查找类似 sing-box ruleset files source (optional) 的本地化字符串。 + /// + public static string TbSettingsSrsFilesSource { + get { + return ResourceManager.GetString("TbSettingsSrsFilesSource", resourceCulture); + } + } + + /// + /// 查找类似 Start on boot 的本地化字符串。 + /// + public static string TbSettingsStartBoot { + get { + return ResourceManager.GetString("TbSettingsStartBoot", resourceCulture); + } + } + + /// + /// 查找类似 Set this with admin privileges, get admin privileges after startup 的本地化字符串。 + /// + public static string TbSettingsStartBootTip { + get { + return ResourceManager.GetString("TbSettingsStartBootTip", resourceCulture); + } + } + + /// + /// 查找类似 Enable traffic statistics (requires restart) 的本地化字符串。 + /// + public static string TbSettingsStatistics { + get { + return ResourceManager.GetString("TbSettingsStatistics", resourceCulture); + } + } + + /// + /// 查找类似 Subscription conversion URL 的本地化字符串。 + /// + public static string TbSettingsSubConvert { + get { + return ResourceManager.GetString("TbSettingsSubConvert", resourceCulture); + } + } + + /// + /// 查找类似 System proxy settings 的本地化字符串。 + /// + public static string TbSettingsSystemproxy { + get { + return ResourceManager.GetString("TbSettingsSystemproxy", resourceCulture); + } + } + + /// + /// 查找类似 Theme 的本地化字符串。 + /// + public static string TbSettingsTheme { + get { + return ResourceManager.GetString("TbSettingsTheme", resourceCulture); + } + } + + /// + /// 查找类似 Enable Security Protocol TLS v1.3 (subscription/update) 的本地化字符串。 + /// + public static string TbSettingsTLS13 { + get { + return ResourceManager.GetString("TbSettingsTLS13", resourceCulture); + } + } + + /// + /// 查找类似 Tray right-click menu servers display limit 的本地化字符串。 + /// + public static string TbSettingsTrayMenuServersLimit { + get { + return ResourceManager.GetString("TbSettingsTrayMenuServersLimit", resourceCulture); + } + } + + /// + /// 查找类似 TunMode settings 的本地化字符串。 + /// + public static string TbSettingsTunMode { + get { + return ResourceManager.GetString("TbSettingsTunMode", resourceCulture); + } + } + + /// + /// 查找类似 Enable UDP 的本地化字符串。 + /// + public static string TbSettingsUdpEnabled { + get { + return ResourceManager.GetString("TbSettingsUdpEnabled", resourceCulture); + } + } + + /// + /// 查找类似 Auth user 的本地化字符串。 + /// + public static string TbSettingsUser { + get { + return ResourceManager.GetString("TbSettingsUser", resourceCulture); + } + } + + /// + /// 查找类似 Use System Hosts 的本地化字符串。 + /// + public static string TbSettingsUseSystemHosts { + get { + return ResourceManager.GetString("TbSettingsUseSystemHosts", resourceCulture); + } + } + + /// + /// 查找类似 ShortId 的本地化字符串。 + /// + public static string TbShortId { + get { + return ResourceManager.GetString("TbShortId", resourceCulture); + } + } + + /// + /// 查找类似 SNI 的本地化字符串。 + /// + public static string TbSNI { + get { + return ResourceManager.GetString("TbSNI", resourceCulture); + } + } + + /// + /// 查找类似 Sorting 的本地化字符串。 + /// + public static string TbSorting { + get { + return ResourceManager.GetString("TbSorting", resourceCulture); + } + } + + /// + /// 查找类似 Chain 的本地化字符串。 + /// + public static string TbSortingChain { + get { + return ResourceManager.GetString("TbSortingChain", resourceCulture); + } + } + + /// + /// 查找类似 Default 的本地化字符串。 + /// + public static string TbSortingDefault { + get { + return ResourceManager.GetString("TbSortingDefault", resourceCulture); + } + } + + /// + /// 查找类似 Delay 的本地化字符串。 + /// + public static string TbSortingDelay { + get { + return ResourceManager.GetString("TbSortingDelay", resourceCulture); + } + } + + /// + /// 查找类似 Download Speed 的本地化字符串。 + /// + public static string TbSortingDownSpeed { + get { + return ResourceManager.GetString("TbSortingDownSpeed", resourceCulture); + } + } + + /// + /// 查找类似 Download Traffic 的本地化字符串。 + /// + public static string TbSortingDownTraffic { + get { + return ResourceManager.GetString("TbSortingDownTraffic", resourceCulture); + } + } + + /// + /// 查找类似 Host 的本地化字符串。 + /// + public static string TbSortingHost { + get { + return ResourceManager.GetString("TbSortingHost", resourceCulture); + } + } + + /// + /// 查找类似 Name 的本地化字符串。 + /// + public static string TbSortingName { + get { + return ResourceManager.GetString("TbSortingName", resourceCulture); + } + } + + /// + /// 查找类似 Network 的本地化字符串。 + /// + public static string TbSortingNetwork { + get { + return ResourceManager.GetString("TbSortingNetwork", resourceCulture); + } + } + + /// + /// 查找类似 Time 的本地化字符串。 + /// + public static string TbSortingTime { + get { + return ResourceManager.GetString("TbSortingTime", resourceCulture); + } + } + + /// + /// 查找类似 Type 的本地化字符串。 + /// + public static string TbSortingType { + get { + return ResourceManager.GetString("TbSortingType", resourceCulture); + } + } + + /// + /// 查找类似 Upload Speed 的本地化字符串。 + /// + public static string TbSortingUpSpeed { + get { + return ResourceManager.GetString("TbSortingUpSpeed", resourceCulture); + } + } + + /// + /// 查找类似 Upload Traffic 的本地化字符串。 + /// + public static string TbSortingUpTraffic { + get { + return ResourceManager.GetString("TbSortingUpTraffic", resourceCulture); + } + } + + /// + /// 查找类似 SpiderX 的本地化字符串。 + /// + public static string TbSpiderX { + get { + return ResourceManager.GetString("TbSpiderX", resourceCulture); + } + } + + /// + /// 查找类似 TLS 的本地化字符串。 + /// + public static string TbStreamSecurity { + get { + return ResourceManager.GetString("TbStreamSecurity", resourceCulture); + } + } + + /// + /// 查找类似 PAC mode 的本地化字符串。 + /// + public static string TbSystemProxyPac { + get { + return ResourceManager.GetString("TbSystemProxyPac", resourceCulture); + } + } + + /// + /// 查找类似 The delay : {0} ms, {1} 的本地化字符串。 + /// + public static string TestMeOutput { + get { + return ResourceManager.GetString("TestMeOutput", resourceCulture); + } + } + + /// + /// 查找类似 Active 的本地化字符串。 + /// + public static string TipActiveServer { + get { + return ResourceManager.GetString("TipActiveServer", resourceCulture); + } + } + + /// + /// 查找类似 Routing setting is changed 的本地化字符串。 + /// + public static string TipChangeRouting { + get { + return ResourceManager.GetString("TipChangeRouting", resourceCulture); + } + } + + /// + /// 查找类似 System proxy setting is changed 的本地化字符串。 + /// + public static string TipChangeSystemProxy { + get { + return ResourceManager.GetString("TipChangeSystemProxy", resourceCulture); + } + } + + /// + /// 查找类似 Please turn off when there is an abnormal disconnection 的本地化字符串。 + /// + public static string TipDisplayLog { + get { + return ResourceManager.GetString("TipDisplayLog", resourceCulture); + } + } + + /// + /// 查找类似 *Default value tcp 的本地化字符串。 + /// + public static string TipNetwork { + get { + return ResourceManager.GetString("TipNetwork", resourceCulture); + } + } + + /// + /// 查找类似 * After setting this value, an socks service will be started using Xray/sing-box(Tun) to provide functions such as speed display 的本地化字符串。 + /// + public static string TipPreSocksPort { + get { + return ResourceManager.GetString("TipPreSocksPort", resourceCulture); + } + } + + /// + /// 查找类似 XHTTP Extra raw JSON, format: { XHTTPObject } 的本地化字符串。 + /// + public static string TransportExtraTip { + get { + return ResourceManager.GetString("TransportExtraTip", resourceCulture); + } + } + + /// + /// 查找类似 *tcp camouflage type 的本地化字符串。 + /// + public static string TransportHeaderTypeTip1 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip1", resourceCulture); + } + } + + /// + /// 查找类似 *kcp camouflage type 的本地化字符串。 + /// + public static string TransportHeaderTypeTip2 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip2", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC camouflage type 的本地化字符串。 + /// + public static string TransportHeaderTypeTip3 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip3", resourceCulture); + } + } + + /// + /// 查找类似 *grpc mode 的本地化字符串。 + /// + public static string TransportHeaderTypeTip4 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip4", resourceCulture); + } + } + + /// + /// 查找类似 *xhttp mode 的本地化字符串。 + /// + public static string TransportHeaderTypeTip5 { + get { + return ResourceManager.GetString("TransportHeaderTypeTip5", resourceCulture); + } + } + + /// + /// 查找类似 *ws/httpupgrade/xhttp path 的本地化字符串。 + /// + public static string TransportPathTip1 { + get { + return ResourceManager.GetString("TransportPathTip1", resourceCulture); + } + } + + /// + /// 查找类似 *h2 path 的本地化字符串。 + /// + public static string TransportPathTip2 { + get { + return ResourceManager.GetString("TransportPathTip2", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC key/KCP seed 的本地化字符串。 + /// + public static string TransportPathTip3 { + get { + return ResourceManager.GetString("TransportPathTip3", resourceCulture); + } + } + + /// + /// 查找类似 *grpc serviceName 的本地化字符串。 + /// + public static string TransportPathTip4 { + get { + return ResourceManager.GetString("TransportPathTip4", resourceCulture); + } + } + + /// + /// 查找类似 *kcp seed 的本地化字符串。 + /// + public static string TransportPathTip5 { + get { + return ResourceManager.GetString("TransportPathTip5", resourceCulture); + } + } + + /// + /// 查找类似 *http host Separated by commas (,) 的本地化字符串。 + /// + public static string TransportRequestHostTip1 { + get { + return ResourceManager.GetString("TransportRequestHostTip1", resourceCulture); + } + } + + /// + /// 查找类似 *ws/httpupgrade/xhttp host 的本地化字符串。 + /// + public static string TransportRequestHostTip2 { + get { + return ResourceManager.GetString("TransportRequestHostTip2", resourceCulture); + } + } + + /// + /// 查找类似 *h2 host Separated by commas (,) 的本地化字符串。 + /// + public static string TransportRequestHostTip3 { + get { + return ResourceManager.GetString("TransportRequestHostTip3", resourceCulture); + } + } + + /// + /// 查找类似 *QUIC security 的本地化字符串。 + /// + public static string TransportRequestHostTip4 { + get { + return ResourceManager.GetString("TransportRequestHostTip4", resourceCulture); + } + } + + /// + /// 查找类似 *grpc Authority 的本地化字符串。 + /// + public static string TransportRequestHostTip5 { + get { + return ResourceManager.GetString("TransportRequestHostTip5", resourceCulture); + } + } + + /// + /// 查找类似 Ungrouped 的本地化字符串。 + /// + public static string UngroupedServers { + get { + return ResourceManager.GetString("UngroupedServers", resourceCulture); + } + } + + /// + /// 查找类似 You are currently running a standalone package, please manually download the SelfContained.7z file to unzip and overwrite it! 的本地化字符串。 + /// + public static string UpdateStandalonePackageTip { + get { + return ResourceManager.GetString("UpdateStandalonePackageTip", resourceCulture); + } + } + + /// + /// 查找类似 UpgradeApp does not exist 的本地化字符串。 + /// + public static string UpgradeAppNotExistTip { + get { + return ResourceManager.GetString("UpgradeAppNotExistTip", resourceCulture); + } + } + } } diff --git a/v2rayN/ServiceLib/Sample/SampleClientConfig b/v2rayN/ServiceLib/Sample/SampleClientConfig index 407a1307..09dae6e8 100644 --- a/v2rayN/ServiceLib/Sample/SampleClientConfig +++ b/v2rayN/ServiceLib/Sample/SampleClientConfig @@ -1,36 +1,52 @@ -{ - "log": { +{ + "log": + { "access": "Vaccess.log", "error": "Verror.log", "loglevel": "warning" }, - "inbounds": [], - "outbounds": [ + "inbounds": + [ + ], + "outbounds": + [ { "tag": "proxy", "protocol": "vmess", - "settings": { - "vnext": [{ - "address": "", - "port": 0, - "users": [{ - "id": "", - "security": "auto" - }] - }], - "servers": [{ - "address": "", - "method": "", - "ota": false, - "password": "", - "port": 0, - "level": 1 - }] + "settings": + { + "vnext": + [ + { + "address": "", + "port": 0, + "users": + [ + { + "id": "", + "security": "auto" + } + ] + } + ], + "servers": + [ + { + "address": "", + "method": "", + "ota": false, + "password": "", + "port": 0, + "level": 1 + } + ] }, - "streamSettings": { + "streamSettings": + { "network": "tcp" }, - "mux": { + "mux": + { "enabled": false } }, @@ -43,11 +59,14 @@ "tag": "block" } ], - "routing": { + "routing": + { "domainStrategy": "IPIfNonMatch", - "rules": [ + "rules": + [ { - "inboundTag": [ + "inboundTag": + [ "api" ], "outboundTag": "api", @@ -55,4 +74,4 @@ } ] } -} \ No newline at end of file +} diff --git a/v2rayN/ServiceLib/Sample/SampleInbound b/v2rayN/ServiceLib/Sample/SampleInbound index a21452dd..96436f4e 100644 --- a/v2rayN/ServiceLib/Sample/SampleInbound +++ b/v2rayN/ServiceLib/Sample/SampleInbound @@ -1,18 +1,21 @@ -{ +{ "tag": "tag1", "port": 10808, "protocol": "socks", "listen": "127.0.0.1", - "settings": { + "settings": + { "auth": "noauth", "udp": true, "allowTransparent": false }, - "sniffing": { + "sniffing": + { "enabled": true, - "destOverride": [ + "destOverride": + [ "http", "tls" ] } -} \ No newline at end of file +} diff --git a/v2rayN/ServiceLib/Sample/SampleOutbound b/v2rayN/ServiceLib/Sample/SampleOutbound index 54885375..8010a1f5 100644 --- a/v2rayN/ServiceLib/Sample/SampleOutbound +++ b/v2rayN/ServiceLib/Sample/SampleOutbound @@ -1,12 +1,15 @@ -{ +{ "tag": "proxy", "protocol": "vmess", - "settings": { - "vnext": [ + "settings": + { + "vnext": + [ { "address": "v2ray.cool", "port": 10086, - "users": [ + "users": + [ { "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", "security": "auto" @@ -14,7 +17,8 @@ ] } ], - "servers": [ + "servers": + [ { "address": "v2ray.cool", "method": "chacha20", @@ -25,10 +29,12 @@ } ] }, - "streamSettings": { + "streamSettings": + { "network": "tcp" }, - "mux": { + "mux": + { "enabled": false } -} \ No newline at end of file +} diff --git a/v2rayN/ServiceLib/Sample/SingboxSampleClientConfig b/v2rayN/ServiceLib/Sample/SingboxSampleClientConfig index f88422a1..a1bea809 100644 --- a/v2rayN/ServiceLib/Sample/SingboxSampleClientConfig +++ b/v2rayN/ServiceLib/Sample/SingboxSampleClientConfig @@ -1,10 +1,14 @@ -{ - "log": { +{ + "log": + { "level": "debug", "timestamp": true }, - "inbounds": [], - "outbounds": [ + "inbounds": + [ + ], + "outbounds": + [ { "type": "vless", "tag": "proxy", @@ -24,12 +28,17 @@ "type": "dns" } ], - "route": { - "rules": [ + "route": + { + "rules": + [ { - "protocol": [ "dns" ], + "protocol": + [ + "dns" + ], "outbound": "dns_out" } ] } -} \ No newline at end of file +} diff --git a/v2rayN/ServiceLib/Sample/SingboxSampleOutbound b/v2rayN/ServiceLib/Sample/SingboxSampleOutbound index 9c87194f..4013739b 100644 --- a/v2rayN/ServiceLib/Sample/SingboxSampleOutbound +++ b/v2rayN/ServiceLib/Sample/SingboxSampleOutbound @@ -1,6 +1,6 @@ -{ +{ "type": "vless", "tag": "proxy", "server": "", "server_port": 443 -} \ No newline at end of file +} diff --git a/v2rayN/ServiceLib/Sample/clash_mixin_yaml b/v2rayN/ServiceLib/Sample/clash_mixin_yaml index 940144ee..5d527e6d 100644 --- a/v2rayN/ServiceLib/Sample/clash_mixin_yaml +++ b/v2rayN/ServiceLib/Sample/clash_mixin_yaml @@ -36,4 +36,4 @@ dns: - "*.*.xboxlive.com" - "*.msftncsi.com" - "*.msftconnecttest.com" - - WORKGROUP \ No newline at end of file + - WORKGROUP diff --git a/v2rayN/ServiceLib/Sample/custom_routing_black b/v2rayN/ServiceLib/Sample/custom_routing_black index 971058a8..5c48a8e4 100644 --- a/v2rayN/ServiceLib/Sample/custom_routing_black +++ b/v2rayN/ServiceLib/Sample/custom_routing_black @@ -1,156 +1,166 @@ [ - { - "remarks": "绕过bittorrent", - "outboundTag": "direct", - "protocol": [ - "bittorrent" - ] - }, - { - "remarks": "api.ip.sb", - "outboundTag": "proxy", - "domain": [ - "api.ip.sb" - ] - }, - { - "remarks": "Google cn", - "outboundTag": "proxy", - "domain": [ - "domain:googleapis.cn", - "domain:gstatic.com" - ] - }, - { - "remarks": "阻断udp443", - "outboundTag": "block", - "port": "443", - "network": "udp" - }, - { - "remarks": "阻断广告", - "outboundTag": "block", - "domain": [ - "geosite:category-ads-all" - ] - }, - { - "remarks": "绕过局域网IP", - "outboundTag": "direct", - "ip": [ - "geoip:private" - ] - }, - { - "remarks": "绕过局域网域名", - "outboundTag": "direct", - "domain": [ - "geosite:private" - ] - }, - { - "remarks": "代理海外公共DNSIP", - "outboundTag": "proxy", - "ip": [ - "1.1.1.1", - "1.0.0.1", - "2606:4700:4700::1111", - "2606:4700:4700::1001", - "1.1.1.2", - "1.0.0.2", - "2606:4700:4700::1112", - "2606:4700:4700::1002", - "1.1.1.3", - "1.0.0.3", - "2606:4700:4700::1113", - "2606:4700:4700::1003", - "8.8.8.8", - "8.8.4.4", - "2001:4860:4860::8888", - "2001:4860:4860::8844", - "94.140.14.14", - "94.140.15.15", - "2a10:50c0::ad1:ff", - "2a10:50c0::ad2:ff", - "94.140.14.15", - "94.140.15.16", - "2a10:50c0::bad1:ff", - "2a10:50c0::bad2:ff", - "94.140.14.140", - "94.140.14.141", - "2a10:50c0::1:ff", - "2a10:50c0::2:ff", - "208.67.222.222", - "208.67.220.220", - "2620:119:35::35", - "2620:119:53::53", - "208.67.222.123", - "208.67.220.123", - "2620:119:35::123", - "2620:119:53::123", - "9.9.9.9", - "149.112.112.112", - "2620:fe::9", - "2620:fe::fe", - "9.9.9.11", - "149.112.112.11", - "2620:fe::11", - "2620:fe::fe:11", - "9.9.9.10", - "149.112.112.10", - "2620:fe::10", - "2620:fe::fe:10", - "77.88.8.8", - "77.88.8.1", - "2a02:6b8::feed:0ff", - "2a02:6b8:0:1::feed:0ff", - "77.88.8.88", - "77.88.8.2", - "2a02:6b8::feed:bad", - "2a02:6b8:0:1::feed:bad", - "77.88.8.7", - "77.88.8.3", - "2a02:6b8::feed:a11", - "2a02:6b8:0:1::feed:a11" - ] - }, - { - "remarks": "代理海外公共DNS域名", - "outboundTag": "proxy", - "domain": [ - "domain:cloudflare-dns.com", - "domain:one.one.one.one", - "domain:dns.google", - "domain:adguard-dns.com", - "domain:opendns.com", - "domain:umbrella.com", - "domain:quad9.net", - "domain:yandex.net" - ] - }, - { - "remarks": "代理IP", - "outboundTag": "proxy", - "ip": [ - "geoip:facebook", - "geoip:fastly", - "geoip:google", - "geoip:netflix", - "geoip:telegram", - "geoip:twitter" - ] - }, - { - "remarks": "代理GFW", - "outboundTag": "proxy", - "domain": [ - "geosite:gfw", - "geosite:greatfire" - ] - }, - { - "remarks": "最终直连", - "port": "0-65535", - "outboundTag": "direct" - } -] \ No newline at end of file + { + "remarks": "绕过bittorrent", + "outboundTag": "direct", + "protocol": + [ + "bittorrent" + ] + }, + { + "remarks": "api.ip.sb", + "outboundTag": "proxy", + "domain": + [ + "api.ip.sb" + ] + }, + { + "remarks": "Google cn", + "outboundTag": "proxy", + "domain": + [ + "domain:googleapis.cn", + "domain:gstatic.com" + ] + }, + { + "remarks": "阻断udp443", + "outboundTag": "block", + "port": "443", + "network": "udp" + }, + { + "remarks": "阻断广告", + "outboundTag": "block", + "domain": + [ + "geosite:category-ads-all" + ] + }, + { + "remarks": "绕过局域网IP", + "outboundTag": "direct", + "ip": + [ + "geoip:private" + ] + }, + { + "remarks": "绕过局域网域名", + "outboundTag": "direct", + "domain": + [ + "geosite:private" + ] + }, + { + "remarks": "代理海外公共DNSIP", + "outboundTag": "proxy", + "ip": + [ + "1.1.1.1", + "1.0.0.1", + "2606:4700:4700::1111", + "2606:4700:4700::1001", + "1.1.1.2", + "1.0.0.2", + "2606:4700:4700::1112", + "2606:4700:4700::1002", + "1.1.1.3", + "1.0.0.3", + "2606:4700:4700::1113", + "2606:4700:4700::1003", + "8.8.8.8", + "8.8.4.4", + "2001:4860:4860::8888", + "2001:4860:4860::8844", + "94.140.14.14", + "94.140.15.15", + "2a10:50c0::ad1:ff", + "2a10:50c0::ad2:ff", + "94.140.14.15", + "94.140.15.16", + "2a10:50c0::bad1:ff", + "2a10:50c0::bad2:ff", + "94.140.14.140", + "94.140.14.141", + "2a10:50c0::1:ff", + "2a10:50c0::2:ff", + "208.67.222.222", + "208.67.220.220", + "2620:119:35::35", + "2620:119:53::53", + "208.67.222.123", + "208.67.220.123", + "2620:119:35::123", + "2620:119:53::123", + "9.9.9.9", + "149.112.112.112", + "2620:fe::9", + "2620:fe::fe", + "9.9.9.11", + "149.112.112.11", + "2620:fe::11", + "2620:fe::fe:11", + "9.9.9.10", + "149.112.112.10", + "2620:fe::10", + "2620:fe::fe:10", + "77.88.8.8", + "77.88.8.1", + "2a02:6b8::feed:0ff", + "2a02:6b8:0:1::feed:0ff", + "77.88.8.88", + "77.88.8.2", + "2a02:6b8::feed:bad", + "2a02:6b8:0:1::feed:bad", + "77.88.8.7", + "77.88.8.3", + "2a02:6b8::feed:a11", + "2a02:6b8:0:1::feed:a11" + ] + }, + { + "remarks": "代理海外公共DNS域名", + "outboundTag": "proxy", + "domain": + [ + "domain:cloudflare-dns.com", + "domain:one.one.one.one", + "domain:dns.google", + "domain:adguard-dns.com", + "domain:opendns.com", + "domain:umbrella.com", + "domain:quad9.net", + "domain:yandex.net" + ] + }, + { + "remarks": "代理IP", + "outboundTag": "proxy", + "ip": + [ + "geoip:facebook", + "geoip:fastly", + "geoip:google", + "geoip:netflix", + "geoip:telegram", + "geoip:twitter" + ] + }, + { + "remarks": "代理GFW", + "outboundTag": "proxy", + "domain": + [ + "geosite:gfw", + "geosite:greatfire" + ] + }, + { + "remarks": "最终直连", + "port": "0-65535", + "outboundTag": "direct" + } +] diff --git a/v2rayN/ServiceLib/Sample/custom_routing_global b/v2rayN/ServiceLib/Sample/custom_routing_global index 896ff5b9..0c74f27a 100644 --- a/v2rayN/ServiceLib/Sample/custom_routing_global +++ b/v2rayN/ServiceLib/Sample/custom_routing_global @@ -8,21 +8,24 @@ { "remarks": "阻断广告", "outboundTag": "block", - "domain": [ + "domain": + [ "geosite:category-ads-all" ] }, { "remarks": "绕过局域网IP", "outboundTag": "direct", - "ip": [ + "ip": + [ "geoip:private" ] }, { "remarks": "绕过局域网域名", "outboundTag": "direct", - "domain": [ + "domain": + [ "geosite:private" ] }, @@ -31,4 +34,4 @@ "port": "0-65535", "outboundTag": "proxy" } -] \ No newline at end of file +] diff --git a/v2rayN/ServiceLib/Sample/custom_routing_white b/v2rayN/ServiceLib/Sample/custom_routing_white index 21453848..3de4f1e1 100644 --- a/v2rayN/ServiceLib/Sample/custom_routing_white +++ b/v2rayN/ServiceLib/Sample/custom_routing_white @@ -1,103 +1,111 @@ [ - { - "remarks": "Google cn", - "outboundTag": "proxy", - "domain": [ - "domain:googleapis.cn", - "domain:gstatic.com" - ] - }, - { - "remarks": "阻断udp443", - "outboundTag": "block", - "port": "443", - "network": "udp" - }, - { - "remarks": "阻断广告", - "outboundTag": "block", - "domain": [ - "geosite:category-ads-all" - ] - }, - { - "remarks": "绕过局域网IP", - "outboundTag": "direct", - "ip": [ - "geoip:private" - ] - }, - { - "remarks": "绕过局域网域名", - "outboundTag": "direct", - "domain": [ - "geosite:private" - ] - }, - { - "remarks": "绕过中国公共DNSIP", - "outboundTag": "direct", - "ip": [ - "223.5.5.5", - "223.6.6.6", - "2400:3200::1", - "2400:3200:baba::1", - "119.29.29.29", - "1.12.12.12", - "120.53.53.53", - "2402:4e00::", - "2402:4e00:1::", - "180.76.76.76", - "2400:da00::6666", - "114.114.114.114", - "114.114.115.115", - "114.114.114.119", - "114.114.115.119", - "114.114.114.110", - "114.114.115.110", - "180.184.1.1", - "180.184.2.2", - "101.226.4.6", - "218.30.118.6", - "123.125.81.6", - "140.207.198.6", - "1.2.4.8", - "210.2.4.8", - "52.80.66.66", - "117.50.22.22", - "2400:7fc0:849e:200::4", - "2404:c2c0:85d8:901::4", - "117.50.10.10", - "52.80.52.52", - "2400:7fc0:849e:200::8", - "2404:c2c0:85d8:901::8", - "117.50.60.30", - "52.80.60.30" - ] - }, - { - "remarks": "绕过中国公共DNS域名", - "outboundTag": "direct", - "domain": [ - "domain:alidns.com", - "domain:doh.pub", - "domain:dot.pub", - "domain:360.cn", - "domain:onedns.net" - ] - }, - { - "remarks": "绕过中国IP", - "outboundTag": "direct", - "ip": [ - "geoip:cn" - ] - }, - { - "remarks": "绕过中国域名", - "outboundTag": "direct", - "domain": [ - "geosite:cn" - ] - } -] \ No newline at end of file + { + "remarks": "Google cn", + "outboundTag": "proxy", + "domain": + [ + "domain:googleapis.cn", + "domain:gstatic.com" + ] + }, + { + "remarks": "阻断udp443", + "outboundTag": "block", + "port": "443", + "network": "udp" + }, + { + "remarks": "阻断广告", + "outboundTag": "block", + "domain": + [ + "geosite:category-ads-all" + ] + }, + { + "remarks": "绕过局域网IP", + "outboundTag": "direct", + "ip": + [ + "geoip:private" + ] + }, + { + "remarks": "绕过局域网域名", + "outboundTag": "direct", + "domain": + [ + "geosite:private" + ] + }, + { + "remarks": "绕过中国公共DNSIP", + "outboundTag": "direct", + "ip": + [ + "223.5.5.5", + "223.6.6.6", + "2400:3200::1", + "2400:3200:baba::1", + "119.29.29.29", + "1.12.12.12", + "120.53.53.53", + "2402:4e00::", + "2402:4e00:1::", + "180.76.76.76", + "2400:da00::6666", + "114.114.114.114", + "114.114.115.115", + "114.114.114.119", + "114.114.115.119", + "114.114.114.110", + "114.114.115.110", + "180.184.1.1", + "180.184.2.2", + "101.226.4.6", + "218.30.118.6", + "123.125.81.6", + "140.207.198.6", + "1.2.4.8", + "210.2.4.8", + "52.80.66.66", + "117.50.22.22", + "2400:7fc0:849e:200::4", + "2404:c2c0:85d8:901::4", + "117.50.10.10", + "52.80.52.52", + "2400:7fc0:849e:200::8", + "2404:c2c0:85d8:901::8", + "117.50.60.30", + "52.80.60.30" + ] + }, + { + "remarks": "绕过中国公共DNS域名", + "outboundTag": "direct", + "domain": + [ + "domain:alidns.com", + "domain:doh.pub", + "domain:dot.pub", + "domain:360.cn", + "domain:onedns.net" + ] + }, + { + "remarks": "绕过中国IP", + "outboundTag": "direct", + "ip": + [ + "geoip:cn" + ] + }, + { + "remarks": "绕过中国域名", + "outboundTag": "direct", + "domain": + [ + "geosite:cn" + ] + } +] diff --git a/v2rayN/ServiceLib/Sample/dns_singbox_normal b/v2rayN/ServiceLib/Sample/dns_singbox_normal index 605b7d59..4bfe020b 100644 --- a/v2rayN/ServiceLib/Sample/dns_singbox_normal +++ b/v2rayN/ServiceLib/Sample/dns_singbox_normal @@ -1,35 +1,39 @@ { - "servers": [ - { - "tag": "remote", - "address": "tcp://8.8.8.8", - "strategy": "prefer_ipv4", - "detour": "proxy" - }, - { - "tag": "local", - "address": "223.5.5.5", - "strategy": "prefer_ipv4", - "detour": "direct" - }, - { - "tag": "block", - "address": "rcode://success" - } - ], - "rules": [ - { - "rule_set": [ - "geosite-cn" - ], - "server": "local" - }, - { - "rule_set": [ - "geosite-category-ads-all" - ], - "server": "block" - } - ], - "final": "remote" + "servers": + [ + { + "tag": "remote", + "address": "tcp://8.8.8.8", + "strategy": "prefer_ipv4", + "detour": "proxy" + }, + { + "tag": "local", + "address": "223.5.5.5", + "strategy": "prefer_ipv4", + "detour": "direct" + }, + { + "tag": "block", + "address": "rcode://success" + } + ], + "rules": + [ + { + "rule_set": + [ + "geosite-cn" + ], + "server": "local" + }, + { + "rule_set": + [ + "geosite-category-ads-all" + ], + "server": "block" + } + ], + "final": "remote" } diff --git a/v2rayN/ServiceLib/Sample/dns_v2ray_normal b/v2rayN/ServiceLib/Sample/dns_v2ray_normal index 9aecbd6e..55a6f5a1 100644 --- a/v2rayN/ServiceLib/Sample/dns_v2ray_normal +++ b/v2rayN/ServiceLib/Sample/dns_v2ray_normal @@ -1,28 +1,34 @@ { - "hosts": { - "dns.google": "8.8.8.8", - "proxy.example.com": "127.0.0.1" - }, - "servers": [ - { - "address": "1.1.1.1", - "domains": [ - "geosite:geolocation-!cn" - ], - "expectIPs": [ - "geoip:!cn" - ] - }, - { - "address": "223.5.5.5", - "domains": [ - "geosite:cn" - ], - "expectIPs": [ - "geoip:cn" - ] - }, - "8.8.8.8", - "https://dns.google/dns-query" - ] -} \ No newline at end of file + "hosts": + { + "dns.google": "8.8.8.8", + "proxy.example.com": "127.0.0.1" + }, + "servers": + [ + { + "address": "1.1.1.1", + "domains": + [ + "geosite:geolocation-!cn" + ], + "expectIPs": + [ + "geoip:!cn" + ] + }, + { + "address": "223.5.5.5", + "domains": + [ + "geosite:cn" + ], + "expectIPs": + [ + "geoip:cn" + ] + }, + "8.8.8.8", + "https://dns.google/dns-query" + ] +} diff --git a/v2rayN/ServiceLib/Sample/linux_autostart_config b/v2rayN/ServiceLib/Sample/linux_autostart_config index c2f2f4e5..07eb0b27 100644 --- a/v2rayN/ServiceLib/Sample/linux_autostart_config +++ b/v2rayN/ServiceLib/Sample/linux_autostart_config @@ -7,4 +7,4 @@ X-GNOME-Autostart-enabled=true Name[en_US]=v2rayN Name=v2rayN Comment[en_US]=v2rayN -Comment=v2rayN \ No newline at end of file +Comment=v2rayN diff --git a/v2rayN/ServiceLib/Sample/pac b/v2rayN/ServiceLib/Sample/pac index 844d9617..7ea20263 100644 --- a/v2rayN/ServiceLib/Sample/pac +++ b/v2rayN/ServiceLib/Sample/pac @@ -1,30720 +1,30720 @@ var proxy = '__PROXY__'; var rules = [ - [ - [], - [ - "000webhost.com", - "01.org", - "02weqj32.com", - "030buy.com", - "04.si", - "04647.club", - "0cgdklr5sfwj.com", - "0emm.com", - "0plkijj.vip", - "0rz.tw", - "0x0.st", - "0xxx.ws", - "1-apple.com.tw", - "10.tt", - "1000giri.net", - "100beatscheap.com", - "100bucksbabes.com", - "100classicbooks.com", - "100ke.org", - "1010.com.hk", - "101boyvideos.com", - "101tubeporn.com", - "101xxx.xyz", - "10beasts.net", - "10bet.com", - "10c10qoo.one", - "10conditionsoflove.com", - "10musume.com", - "10xfotolia.com", - "110xnxx.com", - "1111mod-tube.buzz", - "1111mode.xyz", - "1111modpo.info", - "112263.com", - "114av.xyz", - "119474.xyz", - "11jav.com", - "123-hp.com", - "123bin.cc", - "123dapp.com", - "123dappipad.com", - "123dartisan.com", - "123dcatch.com", - "123dcircuits.com", - "123dcreature.com", - "123dcreaturenews.com", - "123ddesign.com", - "123ddoodler.com", - "123dmake.com", - "123dnews.com", - "123dpro.com", - "123dpro.net", - "123dsculpt.com", - "123hplaserjet.com", - "123rf.com", - "123sex.top", - "123videos.tv", - "126728.net", - "128100.xyz", - "12bet.com", - "12diasdepresentesdeitunes.com", - "12diasderegalosdeitunes.cl", - "12diasderegalosdeitunes.co", - "12diasderegalosdeitunes.co.cr", - "12diasderegalosdeitunes.co.ni", - "12diasderegalosdeitunes.co.ve", - "12diasderegalosdeitunes.com", - "12diasderegalosdeitunes.com.co", - "12diasderegalosdeitunes.com.hn", - "12diasderegalosdeitunes.com.ni", - "12diasderegalosdeitunes.com.ve", - "12diasderegalosdeitunes.cr", - "12diasderegalosdeitunes.gt", - "12diasderegalosdeitunes.hn", - "12diasderegalosdeitunes.pe", - "12joursdecadeauxdeitunes.com", - "12vpn.com", - "12vpn.net", - "1337x.gd", - "1337x.is", - "1337x.st", - "1337x.to", - "1337x.tw", - "1337xto.to", - "1337xx.to", - "138.com", - "13mei13.top", - "140033.xyz", - "141-hk.com", - "141hongkong.com", - "141jav.com", - "141jj.com", - "141tube.com", - "159i.com", - "161sex.com", - "1688.com.au", - "16885858.com", - "168sex.top", - "16fhgdty.xyz", - "16honeys.com", - "17.live", - "170.icu", - "1717se.cc", - "171xx.com", - "173ng.com", - "177pic.info", - "177picyy.com", - "179na.com", - "17lu.xyz", - "17mimei.club", - "17mimei.com", - "17supxxx.com", - "17t17p.com", - "18-teen-porn.com", - "18-teen-xxx.com", - "188channel.com", - "18acg.us", - "18av.pro", - "18avx.com", - "18board.com", - "18board.info", - "18comic-god.cc", - "18comic-god.club", - "18comic-god.xyz", - "18comic.cc", - "18comic.company", - "18comic.org", - "18comic.vip", - "18commic.com", - "18doujin.com", - "18doujinshi.xyz", - "18eighteen.com", - "18exgfs.com", - "18fby.com", - "18h.tv", - "18hmanga.click", - "18hmanga.com", - "18insta.com", - "18j.tv", - "18jms.com", - "18novel.xyz", - "18onlygirls.com", - "18p2p.com", - "18porncomic.com", - "18porno.tv", - "18push.com", - "18qt.com", - "18sex.org", - "18tube.xxx", - "18virginsex.com", - "18ww.life", - "18yiren.tv", - "191porn.com", - "1949er.org", - "1984.city", - "1984bbs.com", - "1984bbs.org", - "1991way.com", - "1992qq.xyz", - "1994group.ac.uk", - "1998cdp.org", - "1bao.org", - "1bigclub.com", - "1bokeponline.top", - "1classtube.com", - "1degree.com.au", - "1drv.com", - "1drv.ms", - "1dumb.com", - "1e100.net", - "1eew.com", - "1inch.io", - "1jjdg2.vip", - "1lib.cloud", - "1lib.cz", - "1lib.domains", - "1lib.education", - "1lib.eu", - "1lib.limited", - "1lib.pl", - "1lib.to", - "1lib.tw", - "1mobile.com", - "1mobile.tw", - "1monsterbeatsbydreus.com", - "1pondo.tv", - "1pornlist.com", - "1thek.com", - "1to1computing.com.au", - "1to1conference.com.au", - "1ucrs.com", - "1watchmygf.com", - "1xbet.cm", - "1xbet.co.ke", - "2-hand.info", - "2000fun.com", - "2008xianzhang.info", - "2013beatsbydrdreonline.com", - "2013beatsbydrdreshop.com", - "2013beatsbydreshop.com", - "2013beatshdcybermonday.com", - "2013cheapestbeats.com", - "2013newbeatsworld.com", - "2013pascherbeatsbydre.com", - "2014cheapbeatsbydre.com", - "2017.hk", - "2019baidu.xyz", - "2021hkcharter.com", - "2047.name", - "2047.one", - "2049bbs.xyz", - "20thcenturystudios.com.au", - "20thcenturystudios.com.br", - "20thcenturystudios.jp", - "20yearsoffea.com", - "21andy.com", - "21centuryaccess.com", - "21heise360dh.cc", - "21hub.com", - "21join.com", - "21naturals.com", - "21pron.com", - "21sextury.com", - "21vv.cc", - "228.net.tw", - "233abc.com", - "233v2.com", - "2371tom.com", - "24hjav.com", - "24hrs.ca", - "24porn.com", - "24porn.pro", - "24smile.org", - "25u.com", - "265sdwe3.com", - "2789av.com", - "27mmwmmw.top", - "2adultflashgames.com", - "2beatsdre.com", - "2beeg.me", - "2bit8.com", - "2buybeatsbydre.com", - "2ch.hk", - "2ch.net", - "2chav.com", - "2dgen.com", - "2drdrebeats.com", - "2du5.com", - "2gayboys.com", - "2k.com", - "2kcoretech.online", - "2kgames.com", - "2lib.org", - "2lipstube.com", - "2mdn-cn.net", - "2mdn.net", - "2o7.net", - "2shared.com", - "2waky.com", - "3-a.net", - "30boxes.com", - "30plusgirls.com", - "315lz.com", - "32bm.cc", - "32red.com", - "35s4.com", - "360autodesk.com", - "360nexus.com", - "360nexus.net", - "360plm.com", - "360trailers.com", - "365buymy.com", - "36717.info", - "36rain.com", - "3789av.com", - "39group.info", - "3a5a.com", - "3aaa.ac.uk", - "3animalsextube.com", - "3arabporn.com", - "3arabtv.com", - "3boys2girls.com", - "3d-comics.com", - "3d-december.com", - "3d-fossils.ac.uk", - "3d-game.com", - "3d-toon.com", - "3d-xxx.com", - "3dadultgames.net", - "3danimeworld.com", - "3ddecember.com", - "3december.com", - "3decemberonline.com", - "3devilattack.net", - "3dfuckhouse.com", - "3dhentai.tv", - "3dhentaix.com", - "3drules.com", - "3dsexgames.biz", - "3dsexmovies.biz", - "3dsexplay.xyz", - "3dsexvilla.com", - "3dsexy.net", - "3dstudio.com", - "3dtin.com", - "3dtin.net", - "3go.fun", - "3hentai.net", - "3lib.net", - "3movs.com", - "3movs.xyz", - "3naked.com", - "3pornhere.com", - "3pornstarmovies.com", - "3proxy.ru", - "3ren.ca", - "3sixty-ucc.ac.uk", - "3tui.net", - "3xplanet.com", - "3xplanet.net", - "3xplanetimg.com", - "3xxx.pro", - "404museum.com", - "40momporntube.com", - "40shopping.com", - "40somethingmag.com", - "41maonn.com", - "43110.cf", - "444.coffee", - "445gei.com", - "445jun.com", - "445nan.com", - "44yu.cc", - "4550.fun", - "45porn.com", - "466453.com", - "47gyosei.jp", - "47news.jp", - "4beatsbydre.com", - "4bluestones.biz", - "4cdn.org", - "4chan.com", - "4chan.org", - "4channel.org", - "4club.com", - "4dq.com", - "4ebaytraders.com", - "4ertik.live", - "4ertik.one", - "4everland.io", - "4everproxy.com", - "4gls.ac.uk", - "4greedy.com", - "4gtv.tv", - "4hu.one", - "4hu.tv", - "4irc.com", - "4kporn.xxx", - "4ksex.me", - "4kup.net", - "4mydomain.com", - "4myminicard.com", - "4pcdn.org", - "4pig.com", - "4plebs.org", - "4porn.com", - "4porn4.com", - "4pu.com", - "4rbtv.com", - "4shared.com", - "4sqi.net", - "4tube.com", - "4tubefree.net", - "4u4c.com", - "5-d.com", - "500caocao.com", - "50dh.app", - "50plusmilfs.com", - "50webs.com", - "51.ca", - "51cg1.com", - "51dh.site", - "51jav.org", - "51luoben.com", - "51luoli.info", - "51mh.app", - "51pincha.cc", - "51tuqiang.com", - "520aa.tv", - "520avtv.com", - "5238.me", - "5278.cc", - "5299.tv", - "52av.be", - "52av.com", - "52av.one", - "52fuliji.cc", - "52hyse.com", - "52kmz.com", - "531tr.com", - "53world.com", - "53worldsweeps.com", - "54647.global", - "54647.io", - "54647.online", - "54647.org", - "55comic.com", - "55dndn.com", - "567321.online", - "568xe.com", - "58avgo.com", - "592r.com", - "59mvmv.com", - "5aimiku.com", - "5axis-machining.com", - "5beatsbydre.com", - "5ch.net", - "5fang.cc", - "5i01.com", - "5isotoi5.org", - "5lml.com", - "5maodang.com", - "5mb48g.com", - "5mo.fun", - "5q5zu9f1.me", - "5w.ag", - "5xsq.com", - "6-ar.com", - "60plusmilfs.com", - "61jxbs42.xyz", - "62fh1bnj.me", - "634.tv", - "63i.com", - "64museum.org", - "64tianwang.com", - "64wiki.com", - "66.ca", - "666kb.com", - "66lu.link", - "66wwmm.com", - "66xing.cc", - "67maoab.com", - "69-sexgames.com", - "69av.one", - "69bag.xyz", - "69dys.pw", - "69femdom.com", - "69flv.com", - "69games.xxx", - "69gayporno.com", - "69hongdq6.buzz", - "69hongdq7.buzz", - "69loli.com", - "69luolie.com", - "69re.net", - "69shu.com", - "69story.com", - "69tubesex.com", - "69vj.com", - "69xporn.com", - "69xx.one", - "69xx560.xyz", - "6arabs.com", - "6do.news", - "6do.world", - "6e8xr2gk.me", - "6japaneseporn.com", - "6kea.com", - "6mature9.com", - "6neek.com", - "6park.com", - "6parkbbs.com", - "6parker.com", - "6parknews.com", - "6sextube.com", - "6twseb.com", - "6xxxvideos.com", - "720video.tv", - "721av.com", - "748av.com", - "75m.co", - "7719.me", - "777tv.net", - "777xporn.com", - "77maott.com", - "7capture.com", - "7cow.com", - "7jp.info", - "7mm.tv", - "7mmtv.sx", - "7mmtv.tv", - "7tb.cc", - "8-d.com", - "8008206616.com", - "8111y.top", - "81jia.tv", - "81tower.com", - "82mvmv.com", - "85cc.net", - "85cc.us", - "85st.com", - "85tube.com", - "8664av.com", - "881903.com", - "888.com", - "888poker.com", - "88av.one", - "88gals.com", - "88kkn.com", - "88manhua.top", - "88square.com", - "89-64.org", - "89.com", - "8964museum.com", - "8kcosplay.com", - "8kpornvids.com", - "8muses.com", - "8muses.io", - "8muses.xxx", - "8news.com.tw", - "8sp.biz", - "8teenxxx.com", - "8thstreetlatinas.com", - "8world.com", - "8xxx.net", - "8z1.net", - "9001700.com", - "908taiwan.org", - "90seconds.asia", - "91av.one", - "91avfuli.com", - "91beiyong.com", - "91cy.app", - "91dy.club", - "91fans.org", - "91gay.me", - "91jinman.com", - "91md.me", - "91moxiong.com", - "91oo.xyz", - "91porn.com", - "91pornplus.com", - "91porny.com", - "91porny.store", - "91qk41rf.com", - "91quanji.com", - "91rb.com", - "91rb.net", - "91rb99.com", - "91se.fun", - "91sesex.xyz", - "91sew.xyz", - "91sew40.buzz", - "91vhome.com", - "91vps.club", - "920share.com", - "921bb.com", - "922tp.com", - "928.plus", - "92ccav.com", - "92hm.life", - "92hm.top", - "941tube.com", - "9527.rocks", - "9550.fun", - "978.life", - "97dounai.top", - "991.com", - "99btgc01.com", - "99cn.info", - "99quse.cc", - "99re.com", - "99thz.cc", - "99thz.com", - "9anime.cz", - "9anime.id", - "9anime.to", - "9anime.ws", - "9bis.com", - "9bis.net", - "9cache.com", - "9cao9.com", - "9cdn.net", - "9gag.com", - "9hentai.ru", - "9hentai.to", - "9hentaiz.com", - "9ineverse.com", - "9k6v4y.cyou", - "9nation.com.au", - "9news.com.au", - "9now.com.au", - "9tak-nav.buzz", - "9to5google.com", - "9to5mac.com", - "9to5terminal.com", - "9to5toys.com", - "9xav.cc", - "9xlove.xyz", - "9zipai.net", - "a-hentai.tv", - "a-msedge.net", - "a-normal-day.com", - "a-tap.ac.uk", - "a-teenz.com", - "a0pple.net", - "a1av.xyz", - "a2z.com", - "a5.com.ru", - "a5vpn.com", - "a7sex.com", - "aa77kk.com", - "aaacymru.ac.uk", - "aaagradeheadphones.com", - "aaapp.cyou", - "aabb1802.com", - "aabb1803.com", - "aacrjournals.org", - "aadmv.com", - "aaex.uk", - "aalah.me", - "aamacau.com", - "aanaan.com", - "aapl.tw", - "aaplimg.com", - "aaschool.ac.uk", - "aau.ac.uk", - "aave.com", - "aavs.xyz", - "abank.com.mm", - "abbeygatesfc.ac.uk", - "abbeygatesixthformcollege.ac.uk", - "abbywintersfree.com", - "abc-studios.com", - "abc.com", - "abc.net.au", - "abc.xyz", - "abcheadphones.com", - "abchinese.com", - "abclider.com", - "abclite.net", - "abcol.ac.uk", - "abcolstudents.ac.uk", - "abdn-access-biomedical.ac.uk", - "abdn-online.ac.uk", - "abdn.ac.uk", - "abeatsbydrdre.com", - "abebooks.com", - "abellalist.com", - "abema-tv.com", - "abema.io", - "abema.tv", - "abematv.co.jp", - "aber.ac.uk", - "aberbangorpartnership.ac.uk", - "aberbangorstrategicalliance.ac.uk", - "aberdare.ac.uk", - "aberdeen-isc.ac.uk", - "aberdeen.ac.uk", - "aberdeenenergy.ac.uk", - "aberdeenrescon.ac.uk", - "abertawe.ac.uk", - "abertay.ac.uk", - "abertaydundee.ac.uk", - "aberystwyth.ac.uk", - "abgsp1.buzz", - "abhsc.ac.uk", - "abicollege.ac.uk", - "abigass.com", - "abingdon-witney.ac.uk", - "abira.ac.uk", - "ablmm.com", - "ablwang.com", - "aboluowang.com", - "about.google", - "about.me", - "aboutamazon.co.uk", - "aboutamazon.com", - "aboutamazon.com.au", - "aboutamazon.de", - "aboutamazon.es", - "aboutamazon.eu", - "aboutamazon.fr", - "aboutamazon.in", - "aboutamazon.it", - "aboutamazon.jp", - "aboutamazon.pl", - "aboutfacebook.com", - "aboutgfw.com", - "aboutmcdonalds.com", - "aboutporno.net", - "aboutyourmini.com", - "abow.jp", - "abrsm.ac.uk", - "abs.ac.uk", - "abs.edu", - "absoluporn.com", - "absolutewhores.com", - "ac-pocketcamp.com", - "ac.ir", - "ac.jp", - "acacia.ac.uk", - "academic-clinician.ac.uk", - "academicpaediatricsassociation.ac.uk", - "academicpeerlearning.ac.uk", - "academyforhealthcarescience.ac.uk", - "academynetriders.com", - "academyofmusic.ac.uk", - "acaric.co.jp", - "acasadasbrasileirinhas.com.br", - "acast.com", - "accbusiness.com", - "acceleratedcomputing.ac.uk", - "acces-vod.com", - "access-summit.ac.uk", - "accesscollege.ac.uk", - "accesscreative.ac.uk", - "accessfacebookfromschool.com", - "accesshe.ac.uk", - "accessheonline.ac.uk", - "accesstohe.ac.uk", - "accesstohighereducation.ac.uk", - "accesstomusic.ac.uk", - "accim.org", - "account-paypal.info", - "account-paypal.net", - "account-paypal.org", - "accountancylearning.ac.uk", - "accountkit.com", - "accountpaypal.com", - "accountpaypal.net", - "accountpaypal.org", - "accross.ac.uk", - "accs.ac.uk", - "accuweather.com", - "accv.es", - "acdocs.com", - "ace-lp.ac.uk", - "acebooik.com", - "acebook.com", - "aced.ac.uk", - "acer-group.com", - "acer.ac.uk", - "acer.com", - "aceros-de-hispania.com", - "aces.ac.uk", - "acets.ac.uk", - "acevpn.com", - "acg18.me", - "acgbox.link", - "acgbox.org", - "acgcf.com", - "acgdg.com", - "acgdv.com", - "acgfabu.com", - "acgfbw.com", - "acgkj.com", - "acgnmanhua.com", - "acgnx.se", - "acgvipss.com", - "acgwr.com", - "acgww.cyou", - "achat-followers-instagram.com", - "acheter-followers-instagram.com", - "acheterdesfollowersinstagram.com", - "acheterfollowersinstagram.com", - "achievementanalytics.com", - "acjj.net", - "aclweb.org", - "acm.ac.uk", - "acm.org", - "acmedia365.com", - "acmedsci.ac.uk", - "acmetoy.com", - "acmvalidations.com", - "acmvalidationsaws.com", - "acnw.com.au", - "acoustics.ac.uk", - "acp.ac.uk", - "acpica.com", - "acpme.ac.uk", - "acrobat.com", - "acs.org", - "acsis.ac.uk", - "actalis.com", - "actalis.it", - "actfortibet.org", - "actimes.com.au", - "activatelearning.ac.uk", - "activelearnprimary.co.uk", - "activelearnprimary.com.au", - "activeteachonline.com", - "activpn.com", - "actofunion.ac.uk", - "actris.ac.uk", - "actual.ac.uk", - "acu.ac.uk", - "aculo.us", - "ad69.com", - "ada.ac.uk", - "ada.support", - "adacollege.ac.uk", - "adalovelacecentre.ac.uk", - "adams-institute.ac.uk", - "adamsmith.ac.uk", - "adamsmithcollege.ac.uk", - "adanaatikhaber.com", - "adapt.ac.uk", - "adaptivecards.io", - "adas.ac.uk", - "adbecrsl.com", - "adbkm.com", - "adblockplus.org", - "adcex.com", - "adcommerce.tv", - "addictedtocoffee.de", - "addison-wesley.ch", - "addison.ac.uk", - "addthis.com", - "addthiscdn.com", - "addthisedge.com", - "addtoany.com", - "addyoutube.com", - "adelaidebbs.com", - "adelaidenow.com.au", - "adeptt.ac.uk", - "adgoogle.net", - "adguard-dns.com", - "adguard-dns.io", - "adguard-vpn.com", - "adguard-vpn.online", - "adguard.app", - "adguard.com", - "adguard.info", - "adguard.io", - "adguard.org", - "adguardvpn.com", - "adhelpnews.com", - "adidas.at", - "adidas.be", - "adidas.ch", - "adidas.co.in", - "adidas.co.uk", - "adidas.com", - "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", - "adinst.com", - "adlib.ac.uk", - "adls.ac.uk", - "admeld.com", - "admob-cn.com", - "admob.com", - "adobe-aemassets-value.com", - "adobe-audience-finder.com", - "adobe-video-partner-finder.com", - "adobe.com", - "adobe.io", - "adobe.ly", - "adobeaemcloud.com", - "adobeaemcloud.net", - "adobeawards.com", - "adobecc.com", - "adobecce.com", - "adobeccstatic.com", - "adobecontent.io", - "adobecreativityawards.com", - "adobedc.net", - "adobedemo.com", - "adobedtm.com", - "adobeereg.com", - "adobeexchange.com", - "adobeexperienceawards.com", - "adobegov.com", - "adobehiddentreasures.com", - "adobejanus.com", - "adobeku.com", - "adobelanding.com", - "adobelogin.com", - "adobeoobe.com", - "adobeplatinumclub.com", - "adobepress.ch", - "adobeprojectm.com", - "adobesc.com", - "adobesign.com", - "adobesigncdn.com", - "adobespark.com", - "adobess.com", - "adobestock.com", - "adobetag.com", - "adobetarget.com", - "adobetcstrialdvd.com", - "adobetechcomm.com", - "adobetechcommcallback.com", - "adobetechcommdemo.com", - "adobexdplatform.com", - "adorevids.com", - "adpl.org.hk", - "adporn.cc", - "adpornu.xyz", - "adrc-e.ac.uk", - "adrn.ac.uk", - "ads-pixiv.net", - "ads-twitter.com", - "ads.ac.uk", - "adsense.com", - "adsensecustomsearchads.com", - "adsenseformobileapps.com", - "adskcloud.com", - "adskcloud.net", - "adskeng.net", - "adskengineering.net", - "adskengpp.net", - "adskengpr.net", - "adtcc.com", - "adtidy.net", - "adtidy.org", - "adult-h.com", - "adult-home-videos.com", - "adult-list.com", - "adult-sex-games.com", - "adult-web-site.net", - "adult3dcomics.com", - "adult3dfantasycomics.com", - "adult3dporno.com", - "adult3dtoons.com", - "adultartsites.com", - "adultbay.org", - "adultblogranking.com", - "adultblogtoplist.com", - "adultcamslover.com", - "adultclinic.jp", - "adultdeepfakes.com", - "adultdvdmarketplace.com", - "adultdvdtalk.com", - "adultempire.com", - "adultepic.com", - "adulterfree.com", - "adulters.org", - "adultexpo.com.tw", - "adultfilmdatabase.com", - "adultfreex.com", - "adultfriendfinder.com", - "adultgamereviews.com", - "adultgames.games", - "adultgames.me", - "adultgames18.com", - "adultgamesapk.com", - "adultgamescollector.com", - "adultgameson.com", - "adultgamesportal.com", - "adultgamestop.com", - "adultgamingroom.com", - "adultgeek.net", - "adulti01.com", - "adultinfojpn.com", - "adultism.com", - "adultkeep.net", - "adultlearningbcc.ac.uk", - "adultlister.com", - "adultmagazinespdf.com", - "adulto.vip", - "adultpornvideos.net", - "adultrental.com", - "adultsexgame.biz", - "adultsexgames.biz", - "adultsextoys.com", - "adulttime.com", - "adulttoontube.com", - "adultvideodump.com", - "adultvideotop.com", - "adultvirtualworlds.net", - "advance-he.ac.uk", - "advanced-he.ac.uk", - "advanced-radiotherapy.ac.uk", - "advancedhe.ac.uk", - "advancediddetection.com", - "advancedtherapeutics-cdt.ac.uk", - "advancehe.ac.uk", - "advancingaccess.ac.uk", - "advanscene.com", - "advantagenottinghamshire.ac.uk", - "adventofcode.com", - "adventuresbydisney.com", - "advertfan.com", - "advertisercommunity.com", - "advertiserscommunity.com", - "adwords-community.com", - "adwords.com", - "adwordsexpress.com", - "adx.promo", - "ae.org", - "aeasyshop.com", - "aebn.com", - "aecc-chiropractic.ac.uk", - "aecc.ac.uk", - "aecexcellence.com", - "aei.org", - "aemap.ac.uk", - "aengd.ac.uk", - "aenhancers.com", - "aerogard.com.au", - "aerogardcn.com", - "aerosol-cdt.ac.uk", - "aerospace-cadcam.com", - "aerospace-design.com", - "aerospace-training-wales.ac.uk", - "aes.ac.uk", - "aesworkshops.com", - "aex.com", - "af.mil", - "afantibbs.com", - "afao.ac.uk", - "afappyending.com", - "afewmomentswith.com", - "affect3dstore.com", - "affirmtrust.com", - "afi.ac.uk", - "afkv28.com", - "aflamporn.com", - "aflamsex.net", - "aflamsexhd.com", - "afp.com", - "afpforum.com", - "afr.com", - "afreecatv.com", - "afriboyz.com", - "africadesk.ac.uk", - "africanplants.ac.uk", - "afsni.ac.uk", - "afterenglish.ac.uk", - "aga-expo.com", - "agag.tw", - "agdbank.com", - "age.tv", - "agedm.app", - "agedm.org", - "agedm.tv", - "agefans.com", - "agemys.net", - "agemys.org", - "agendaweek.com", - "agenet.ac.uk", - "agnesb.fr", - "agocg.ac.uk", - "agoogleaday.com", - "agrd.io", - "agressofinanceroyalholloway.ac.uk", - "agrifoodatp.ac.uk", - "agrifor.ac.uk", - "agriforwards-cdt.ac.uk", - "agro.hk", - "agroforestry.ac.uk", - "ags.ac.uk", - "agu.org", - "agzy1.com", - "ah-me.com", - "ahc.ac.uk", - "ahcathyxxx.com", - "ahcs.ac.uk", - "ahds.ac.uk", - "ahegao.online", - "ahentaitv.com", - "ahessc.ac.uk", - "ahgtm.ac.uk", - "ahlxs-me.buzz", - "ahlxsdh.sbs", - "ahmia.fi", - "ahorsecock.com", - "ahpd.ac.uk", - "ahpornogratuit.com", - "ahpornotube.com", - "ahrc.ac.uk", - "ahrcfoodnetwork.ac.uk", - "ahsexfilme.com", - "ahswingerporno.com", - "ahtops.com", - "ahtranny.com", - "ahua.ac.uk", - "ahvideosexe.com", - "ahxxx.club", - "ai-kan.net", - "ai-wen.net", - "ai.com", - "ai.google", - "ai3sd.ac.uk", - "ai7995.site", - "ai91porn.cc", - "aiaa.org", - "aiasahi.jp", - "aib.ac.uk", - "aim25.ac.uk", - "aimei133.com", - "aimhighergreatermerseyside.ac.uk", - "aimhighernorthamptonshire.ac.uk", - "aimhighernw.ac.uk", - "aimhigherscotland.ac.uk", - "aimhighersurrey.ac.uk", - "aimhighersw.ac.uk", - "aimhigherwm-alps.ac.uk", - "aimhigherwm.ac.uk", - "aims.ac.uk", - "aimsciences.org", - "aipa553.com", - "aiph.net", - "air-nike-shoes.com", - "air-watch.com", - "airasia.com", - "airav.cc", - "airav.wiki", - "airconsole.com", - "aircrack-ng.org", - "aire-wharf-coll.ac.uk", - "airgonetworks.com", - "airgunstudio.com", - "airhorn.solutions", - "airhornbot.com", - "airiti.com", - "airitilibrary.com", - "airmax360.com", - "airmay.com", - "airport-gov-cn.com", - "airport.brussels", - "airport.com", - "airport.eu", - "airsextube.com", - "airsupportapp.com", - "airtunes.com", - "airtunes.info", - "airtunes.net", - "airvpn.org", - "airwatchexpress.com", - "airwatchqa.com", - "airwick.at", - "airwick.be", - "airwick.ca", - "airwick.ch", - "airwick.cl", - "airwick.co.in", - "airwick.co.nz", - "airwick.co.uk", - "airwick.co.za", - "airwick.com", - "airwick.com.au", - "airwick.com.br", - "airwick.com.mx", - "airwick.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.us", - "airwickarabia.com", - "aisejushi.com", - "aisex.com", - "aishegw.com", - "ait.org.tw", - "aiv-cdn.net", - "aiv-delivery.net", - "aiweiwei.com", - "aiweiweiblog.com", - "aiwucm-us.sbs", - "aixingge2.cc", - "aizyk.buzz", - "aizyk.xyz", - "ajplus.net", - "ajsands.com", - "ajsjx.com", - "ajtalk.com", - "ak1.net", - "aka-ai.com", - "aka-ai.net", - "aka.ms", - "akacrypto.net", - "akadeem.net", - "akademiye.org", - "akadns.com", - "akadns.net", - "akadns6.net", - "akaeai.com", - "akafms.net", - "akagtm.org", - "akahost.net", - "akaint.net", - "akam.net", - "akamaa.com", - "akamah.com", - "akamai-access.com", - "akamai-access.net", - "akamai-cdn.com", - "akamai-platform-internal.net", - "akamai-platform-staging.com", - "akamai-platform.net", - "akamai-regression.net", - "akamai-staging.net", - "akamai-sucks.net", - "akamai-thailand.com", - "akamai-thailand.net", - "akamai-trials.com", - "akamai.co.kr", - "akamai.net", - "akamaiedge.net", - "akamaientrypoint.net", - "akamaietpcnctest.com", - "akamaietpcompromisedcnctest.com", - "akamaietpcompromisedmalwaretest.com", - "akamaietpmalwaretest.com", - "akamaietpphishingtest.com", - "akamaihd-staging.net", - "akamaihd.com", - "akamaihd.net", - "akamaimagicmath.net", - "akamainewzealand.com", - "akamaiphillipines.com", - "akamaiphillipines.net", - "akamaisingapore.net", - "akamaistream.net", - "akamaitech.com", - "akamaitech.net", - "akamaitechnologies.com", - "akamaitechnologies.net", - "akamaized-staging.net", - "akamaized.net", - "akamaizercentral.com", - "akamak.com", - "akamam.com", - "akamci.com", - "akami.com", - "akami.net", - "akamii.com", - "akamqi.com", - "akasha.world", - "akastream.com", - "akastream.net", - "akatns.net", - "akiba-online.com", - "akiba-web.com", - "akinator.com", - "akow.org", - "akthelp.com", - "al-islam.com", - "al-qimmah.net", - "al.ru", - "alabout.com", - "alanhou.com", - "alarab.qa", - "alasbarricadas.org", - "albagals.com", - "albastudio.co", - "albeats.com", - "alc.ac.uk", - "alchemysynth.com", - "alcs.ac.uk", - "aldinhe.ac.uk", - "alexa.com", - "alexanderlondoncollege.ac.uk", - "alexanderstreet.com", - "alexlur.org", - "alfera.com.hk", - "alfera.com.my", - "alfera.in", - "alfera.my", - "alforattv.net", - "alhayat.com", - "alhs.link", - "alhs.xyz", - "alias.com", - "aliasadvantage.com", - "aliasimaginationsengine.com", - "aliasple.com", - "aliasshowcase.com", - "aliassketchbook.com", - "aliassketchbookpro.com", - "aliassystems.com", - "aliasvisualizationstudio.com", - "aliaswavefront.com", - "alibabacloud.co.in", - "alibabacloud.com", - "alibabacloud.com.au", - "alibabacloud.com.hk", - "alibabacloud.com.my", - "alibabacloud.com.sg", - "alibabacloud.com.tw", - "alicejapan.co.jp", - "alicloud.com", - "aliengu.com", - "alis-wales.ac.uk", - "alive.bar", - "aliveipc.com", - "aliveitsm.com", - "aliveprofiler.com", - "alivercm.com", - "aliverewind.com", - "alivertsm.com", - "alivevm.com", - "alivevmax.com", - "alivevue.com", - "aliyuncs.com", - "aljazeera.com", - "aljazeera.net", - "alkasir.com", - "all-sex-links.com", - "all3dsexpics.com", - "all4mom.org", - "allcoin.com", - "allconnected.co", - "allcu.ac.uk", - "alldrawingshere.com", - "alldrawnsex.com", - "allervpn.com", - "allfet.net", - "allfinegirls.com", - "allgirlmassage.com", - "allgirlsallowed.org", - "allgravure.com", - "allhen.online", - "allhorsesex.com", - "alliance.org.hk", - "alliancemanchester.ac.uk", - "alliancemanchesterbusinessschool.ac.uk", - "alliancembs.ac.uk", - "alliancesages.com", - "allinfa.com", - "allinternal.com", - "allizom.net", - "allizom.org", - "alljackpotscasino.com", - "alljapanesepass.com", - "allmomsex.com", - "allmovie.com", - "allnations.ac.uk", - "allover30.com", - "allowed.org", - "allpasswords.com", - "allporncomic.com", - "allpornsites.net", - "allpornsitespass.com", - "allspyclips.com", - "allswingersclubs.org", - "allthefallen.moe", - "alma.ac.uk", - "almasdarnews.com", - "almcollege.ac.uk", - "almostmy.com", - "aloe.ac.uk", - "alohatube.com", - "alotporn.com", - "alphabet.asia", - "alphabet.at", - "alphabet.be", - "alphabet.biz", - "alphabet.ch", - "alphabet.co.hu", - "alphabet.co.uk", - "alphabet.co.za", - "alphabet.com", - "alphabet.com.es", - "alphabet.com.lv", - "alphabet.com.mx", - "alphabet.com.pl", - "alphabet.com.pt", - "alphabet.cz", - "alphabet.de", - "alphabet.es", - "alphabet.eu", - "alphabet.fr", - "alphabet.info", - "alphabet.jp", - "alphabet.lt", - "alphabet.lu", - "alphabet.lv", - "alphabet.mx", - "alphabet.no", - "alphabet.org.uk", - "alphabet.pl", - "alphabet.pt", - "alphabet.uk", - "alphabet.us", - "alphabetfinance.net", - "alphaporno.com", - "alphera-finance.co.in", - "alphera-finance.com.hk", - "alphera-finance.in", - "alphera.ca", - "alphera.co.in", - "alphera.co.nz", - "alphera.com", - "alphera.com.es", - "alphera.com.hk", - "alphera.com.my", - "alphera.de", - "alphera.es", - "alphera.ie", - "alphera.in", - "alphera.my", - "alphera.net", - "alpherafinance.com.hk", - "alpherafinancialservices.es", - "alpherafinancialservices.in", - "alpherafs.ca", - "alpherafs.co.nz", - "alpherafs.com.hk", - "alpherafs.com.my", - "alpherafs.ie", - "alpherafs.in", - "alpherafs.my", - "alpinedc.ch", - "alpinelinux.org", - "alps-cetl.ac.uk", - "alps-wm.ac.uk", - "alsalam.ac.uk", - "alsod.ac.uk", - "alt.ac.uk", - "alt.com", - "altera.com", - "alteraforum.com", - "alteraforums.com", - "alteraforums.net", - "alterauserforum.com", - "alterauserforum.net", - "alterauserforums.com", - "alterauserforums.net", - "altereco.ac.uk", - "alternate-tools.com", - "alternativeto.net", - "altis.ac.uk", - "altmetric.com", - "alton.ac.uk", - "altoncollege.ac.uk", - "altporn.net", - "altrec.com", - "alvinalexander.com", - "always-we-need.games", - "alwaysdata.com", - "alwaysdata.net", - "alwaysvpn.com", - "alwcymru.ac.uk", - "alzheimers.ac.uk", - "am730.com.hk", - "amaaozn.com", - "amabitch.com", - "amakings.com", - "amamanualofstyle.com", - "amandalist.com", - "amanmi.com", - "amapornofilme.com", - "amateur-cougar.com", - "amateur-exhibitionist.org", - "amateur-fetish.com", - "amateur-gallery-post.com", - "amateur-home-sex.com", - "amateur-porn-clips.com", - "amateur-porn-tube.net", - "amateur-pussies.com", - "amateur-threesomes.com", - "amateuralbum.net", - "amateuranalporn.com", - "amateuranalvideos.com", - "amateurarchiver.com", - "amateurbdsmporn.com", - "amateurblondegirls.com", - "amateurblowjobporn.com", - "amateurcool.com", - "amateurcuckoldporn.com", - "amateure-xtreme.com", - "amateurest.com", - "amateurgalore.net", - "amateurgirlfriends.net", - "amateurhomevids.com", - "amateurhousewifefuck.com", - "amateurmommymovies.com", - "amateuroldsluts.com", - "amateurpages.com", - "amateurporn.photos", - "amateurpornhouse.com", - "amateurpornonly.com", - "amateurpornsexvideos.com", - "amateurs-fuck.com", - "amateurs-gone-wild.com", - "amateursecrets.net", - "amateursexpussy.com", - "amateursexstart.nl", - "amateurslovesporn.com", - "amateursvid.com", - "amateurswingersmovies.com", - "amateurthreesomeporn.com", - "amateurwifefuck.com", - "amateurwifetits.com", - "amateurwifevideos.com", - "amateurwivesvideos.com", - "amateurxx.org", - "amatorialesesso.com", - "amatporn.com", - "amatura.com", - "amazingcuckold.com", - "amazon-adsystem.com", - "amazon-fashions.com", - "amazon-jp-recruiting.com", - "amazon-lantern.com", - "amazon-launchpad.com", - "amazon.ae", - "amazon.ca", - "amazon.co.jp", - "amazon.co.uk", - "amazon.com", - "amazon.com.au", - "amazon.com.br", - "amazon.com.mx", - "amazon.com.tr", - "amazon.de", - "amazon.dev", - "amazon.es", - "amazon.fr", - "amazon.in", - "amazon.it", - "amazon.jobs", - "amazon.jp", - "amazon.nl", - "amazon.red", - "amazon.sg", - "amazonalexavoxcon.com", - "amazonauthorinsights.com", - "amazonaws-china.com", - "amazonaws.biz", - "amazonaws.co.uk", - "amazonaws.com", - "amazonaws.info", - "amazonaws.net", - "amazonaws.org", - "amazonaws.tv", - "amazonbusiness.org", - "amazonbusinessblog.com", - "amazondevicesupport.com", - "amazonfctours.com", - "amazonianblog.com", - "amazonimages.com", - "amazonlaunchpad.com", - "amazonliterarypartnership.com", - "amazonlumberyard.wang", - "amazonpay.com", - "amazonpay.in", - "amazonprimevideos.com", - "amazonsdi.com", - "amazonses.com", - "amazonstudiosguilds.com", - "amazontrust.com", - "amazonvideo.cc", - "amazonvideo.com", - "amazonvideodirect.com", - "amazonworkdocs.com", - "ambs.ac.uk", - "amc.com", - "amcn.com", - "amcnetworks.com", - "amcplus.com", - "amd.com", - "amd.com.cn", - "amdfanstore.com", - "amdigital.co.uk", - "ameba.jp", - "amebame.com", - "amebaownd.com", - "amebaowndme.com", - "ameblo.jp", - "amerc.ac.uk", - "america.gov", - "americabrox.ac.uk", - "american.edu", - "americangreencard.com", - "americanunfinished.com", - "americasvoice.news", - "americorps.gov", - "amerikaninsesi.com", - "amerikaninsesi.org", - "amerikaovozi.com", - "amerikayidzayn.com", - "amerikiskhma.com", - "amersham.ac.uk", - "amerwyc-coll.ac.uk", - "amf.ac.uk", - "amgueddfacymru.ac.uk", - "amh.ac.uk", - "ami.ac.uk", - "amiblockedornot.com", - "amigobbs.net", - "amiibo.com", - "amitabhafoundation.us", - "amity.ac.uk", - "amlg.io", - "amnesty.org", - "amnesty.org.hk", - "amnesty.tw", - "amnestyusa.org", - "amnyemachen.org", - "amodoll.com", - "amof.ac.uk", - "amoiist.com", - "amourangels.com", - "amp.dev", - "amplifi.com", - "amplifyapp.com", - "amplifyframework.com", - "ampproject.com", - "ampproject.net", - "ampproject.org", - "amrtraining.ac.uk", - "ams.org", - "ams02.space", - "amsterdamhotescort.com", - "amsterdamluxescort.com", - "amtb-taipei.org", - "amytele.com", - "amzn.asia", - "amzn.com", - "amzn.to", - "amznl.com", - "anacams.com", - "anaconda.cloud", - "anaconda.com", - "anaconda.org", - "anaesthetistswales.ac.uk", - "anal-f.net", - "anal-pantyhose.com", - "anal.casa", - "anal.media", - "analamateursex.com", - "analcamshow.com", - "analdin.com", - "analfuckvideo.com", - "analhomeporn.com", - "anallivecams.com", - "analpornhouse.com", - "analpornonly.com", - "analpornosex.com", - "analqts.com", - "analsaga.com", - "analscreen.com", - "analtime.org", - "analvids.com", - "analytictech.com", - "anandtech.com", - "anatomy.tv", - "anb.org", - "ancensored.com", - "anchor.fm", - "anchorfree.com", - "ancientcyprus.ac.uk", - "ancientwisdoms.ac.uk", - "ancsconf.org", - "andfaraway.net", - "andover.ac.uk", - "andovercollege.ac.uk", - "android-x86.org", - "android.com", - "androidauthority.com", - "androidcombo.com", - "androidfilehost.com", - "androidify.com", - "androidplus.co", - "androidpolice.com", - "androidtv.com", - "andygod.com", - "andysparis.com", - "anfutong.com", - "angel-gto.com", - "angel.ac.uk", - "angela-merkel.de", - "angelbeats.jp", - "angelfire.com", - "angelweb.jp", - "angle.com.tw", - "anglia-polytechnic.ac.uk", - "anglia-ruskin.ac.uk", - "anglia.ac.uk", - "angola.org", - "angulardart.org", - "angularjs.org", - "angus.ac.uk", - "anguscollege.ac.uk", - "anibooru.com", - "anic.ac.uk", - "anidom.com", - "anigema.jp", - "anilos.com", - "animal-hentai.com", - "animal-porn.net", - "animalforsex.com", - "animalincum.com", - "animalporn.me", - "animalpornxxx.me", - "animalsporn.net", - "animalsporn.tv", - "animalzoosex.me", - "anime-pictures.net", - "anime-tube.pw", - "animecrazy.net", - "animedao-tv.com", - "animegal.net", - "animehentaihub.com", - "animeidhentai.com", - "animepornhd.com", - "animesex.me", - "animesexhq.com", - "animeshippuuden.com", - "animestigma.com", - "animezilla.com", - "aniscartujo.com", - "anistreaming.xyz", - "ankarazirvesi2018.com", - "anm.co.uk", - "annamilk.com", - "annas-archive.org", - "annatam.com", - "anniesland-fe.ac.uk", - "anniesland.ac.uk", - "annstores.net", - "annualpelvicexam.com", - "annualreviews.org", - "anobii.com", - "anon-v.com", - "anon-v.lol", - "anonfiles.com", - "anontext.com", - "anonymise.us", - "anonymitynetwork.com", - "anonymize.com", - "anonymizer.com", - "anonymouse.org", - "anpopo.com", - "answering-islam.org", - "antarctic.ac.uk", - "antarctica.ac.uk", - "antarvasnaclips.com", - "antarvasnax.com", - "antd.org", - "antenna.co.kr", - "antf.ac.uk", - "anthemgame.com", - "anthemthegame.com", - "anthonycalzadilla.com", - "anthropic.com", - "anthropology.ac.uk", - "anti1984.com", - "antichristendom.com", - "anticipate.ac.uk", - "antiquity.ac.uk", - "antislavery.ac.uk", - "antislaverylaw.ac.uk", - "antisocial.science", - "antiwave.net", - "anudetube.com", - "anws.gov.tw", - "anxiangxing.com", - "anybunny.org", - "anybunny.tv", - "anydesk.com", - "anyhentai.com", - "anyporn.com", - "anypornhd.com", - "anypornsexxx.com", - "anysex.com", - "anyshemale.com", - "anyxxx.me", - "anyxxx.pro", - "ao3.org", - "aobo.com.au", - "aoc.ac.uk", - "aoc.cat", - "aocc.ac.uk", - "aofriend.com", - "aofriend.com.au", - "aojiao.org", - "aokwholesale.net", - "aol.ca", - "aol.co.uk", - "aol.com", - "aolnews.com", - "aomedia.org", - "aomiwang.com", - "aopcuk.ac.uk", - "aorus.com", - "aoxx69.net", - "ap.org", - "ap0le.com", - "apa.org", - "apache.org", - "apartmentratings.com", - "apartments.com", - "apat1989.org", - "apetube.com", - "apexlegends.com", - "apexprint.com.hk", - "aphe.ac.uk", - "api-extractor.com", - "api.ai", - "api.news", - "apiary.io", - "apibay.org", - "apigee.com", - "apina.biz", - "apis.ac.uk", - "apisof.net", - "apk-dl.com", - "apk.support", - "apk.tw", - "apkcombo.com", - "apkmirror.com", - "apkmonk.com", - "apkplz.com", - "apkpure.com", - "apkpure.net", - "aple.com", - "aplestore.com", - "aplleipods.com", - "aplustraining.ac.uk", - "aplusvpn.com", - "apnews.com", - "apole.com", - "apollo.ac.uk", - "apollocampus.ac.uk", - "apollocrewe.ac.uk", - "apornotube.net", - "aporntv.com", - "apornvideo.com", - "app-dynamics.com", - "app-measurement-cn.com", - "app-measurement.com", - "app-store.wang", - "app.link", - "app0le.com", - "app756.com", - "appbrain.com", - "appbridge.ca", - "appbridge.io", - "appbridge.it", - "appcenter.ms", - "appcloud.com", - "appdomain.cloud", - "appdownloader.net", - "appdynamics.co.uk", - "appdynamics.com", - "appdynamics.de", - "appdynamics.fr", - "appdynamics.info", - "appdynamics.jp", - "appdynamics.org", - "appe-store.com", - "appexchange.com", - "apphb.com", - "appl-e.com", - "appl.com", - "appl4e.com", - "appla.com", - "apple-cloudkit.com", - "apple-darwin.com", - "apple-darwin.net", - "apple-darwin.org", - "apple-dns.com", - "apple-dns.net", - "apple-enews.com", - "apple-expo.com", - "apple-expo.eu", - "apple-hk.com", - "apple-imac.com", - "apple-inc.net", - "apple-livephotoskit.com", - "apple-mapkit.com", - "apple-online.com", - "apple-pay.com", - "apple-pay.rs", - "apple-pay.wang", - "apple-store.net", - "apple-store.wang", - "apple-usa.net", - "apple-watch.com.ru", - "apple.ae", - "apple.at", - "apple.be", - "apple.bg", - "apple.bs", - "apple.ca", - "apple.ch", - "apple.cl", - "apple.cm", - "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.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.news", - "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.us", - "apple.xyz", - "appleaccount.net", - "appleafrica.com", - "appleantilles.com", - "appleappstore.net", - "appleappstore.tv", - "appleaustralia.com", - "appleaustralia.com.au", - "appleaustralia.net.au", - "applebk.net", - "applecarbon.com", - "applecard.tv", - "applecare.berlin", - "applecare.cc", - "applecare.eu", - "applecare.hamburg", - "applecare.wang", - "applecensorship.com", - "applecentar.co.rs", - "applecentar.rs", - "applecentre.com.au", - "applecentre.info", - "appleclassicipod.com", - "appleclub.com.hk", - "applecom.com", - "applecomputer-imac.com", - "applecomputer.co.in", - "applecomputer.co.nz", - "applecomputer.com", - "applecomputer.com.hk", - "applecomputer.com.tw", - "applecomputer.hu", - "applecomputer.kr", - "applecomputerimac.com", - "applecomputerinc.info", - "applecomputers.co.nz", - "applecoronavirus.com", - "appledaily.com", - "appledaily.com.hk", - "appledaily.com.tw", - "appledaily.hk", - "appledarwin.com", - "appledarwin.net", - "appleenews.com", - "appleexpo.eu", - "appleexpo.info", - "applefilmaker.com", - "applefilmmaker.com", - "applefinalcutproworld.com", - "applefinalcutproworld.net", - "applefinalcutproworld.org", - "applefruity.com", - "applehealth.com.hk", - "applehongkong.com", - "applehongkong.com.hk", - "appleid-applemx.com", - "appleid-applemx.us", - "appleid-iclou.com", - "appleid-uk.us", - "appleid.berlin", - "appleid.com", - "appleid.hamburg", - "appleid.hk", - "appleimac.com", - "appleinclegal.com", - "appleinsider.com", - "appleiphone.hu", - "appleiphone.net", - "appleiphonecell.com", - "appleipodsettlement.com", - "appleiservices.com", - "applelink.com", - "applemagickeyboard.com", - "applemalaysia.com.my", - "applemasters.info", - "applemusic.berlin", - "applemusic.co", - "applemusic.com", - "applemusic.com.au", - "applemusic.hamburg", - "applemusic.wang", - "applemusicconnect.com", - "applemusicfestival.com", - "applemx-icloud.com", - "applenews.berlin", - "applenews.hamburg", - "applenews.tv", - "applenewsformat.com", - "appleone.audio", - "appleone.blog", - "appleone.chat", - "appleone.cloud", - "appleone.club", - "appleone.community", - "appleone.film", - "appleone.guide", - "appleone.host", - "appleone.space", - "appleone.tech", - "appleone.website", - "appleonline.com", - "appleonline.net", - "appleoriginalproductions.com", - "appleos.tv", - "applepay.berlin", - "applepay.co.rs", - "applepay.com.tw", - "applepay.hamburg", - "applepay.hk", - "applepay.info", - "applepay.jp", - "applepay.rs", - "applepay.tv", - "applepaycash.net", - "applepaycash.tv", - "applepaymerchantsupplies.info", - "applepaysupplies.berlin", - "applepaysupplies.com", - "applepaysupplies.info", - "applepaysupplies.net", - "applepaysupplies.tv", - "applepencil.net", - "applepodcasts.com", - "applepremiumreseller.com.au", - "applepremiumresellers.com.au", - "applereach.com", - "applereach.net", - "apples-msk.ru", - "applescreensavers.com", - "applescript.info", - "appleshare.info", - "appleshop.co.uk", - "applestor.com", - "applestore.bg", - "applestore.cc", - "applestore.ch", - "applestore.cm", - "applestore.co.hu", - "applestore.co.jp", - "applestore.co.ug", - "applestore.co.uk", - "applestore.com", - "applestore.com.au", - "applestore.com.bn", - "applestore.com.ee", - "applestore.com.eg", - "applestore.com.gr", - "applestore.com.hk", - "applestore.com.hr", - "applestore.com.jo", - "applestore.com.my", - "applestore.com.ph", - "applestore.com.pl", - "applestore.com.pt", - "applestore.com.ro", - "applestore.com.ru", - "applestore.com.sn", - "applestore.com.tw", - "applestore.de", - "applestore.hk", - "applestore.kr", - "applestore.me", - "applestore.net", - "applestore.net.gr", - "applestore.ph", - "applestore.qa", - "applestore.sg", - "applestore.wang", - "applestoreonline.com", - "applestorepro.eu", - "applesurveys.com", - "appleswift.com", - "appletaiwan.com", - "appletips.net", - "appletv.com", - "appletv.fr", - "appletv.wang", - "appletvapp.apple", - "applewallet.com", - "applewallet.tv", - "applewatch.hk", - "applewatch.tv", - "applewatch.tw", - "applewatch.wang", - "applewatchedition.com", - "applewatchseries3.net", - "applewatchsport.com", - "appleweb.net", - "applexpo.net", - "applezh.com", - "applf.com", - "applfe.com", - "applicationinsights.io", - "applicationinsights.net", - "applle.com", - "applw.com", - "appmediagroup.com", - "approvedusedbmw.com", - "appsflayer.com", - "appshopper.com", - "appsocks.net", - "appsonebay.net", - "appspot-preview.com", - "appspot.com", - "appsto.re", - "appstore.co.id", - "appstore.hk", - "appstore.my", - "appstore.ph", - "appule.com", - "appye.com", - "appyq.com", - "apr.ac.uk", - "apress.com", - "aps.org", - "apt.ac.uk", - "aptoide.com", - "apts.ac.uk", - "apture.com", - "apu.ac.uk", - "apuc-scot.ac.uk", - "apyarstorybooks.blogspot.com", - "apyle.com", - "aqdlt.net", - "aqmen.ac.uk", - "aquinas.ac.uk", - "arabianchicks.com", - "arabidopsis.org", - "arabnek.com", - "arabxn.com", - "arabxnxx.org", - "arabysexy.com", - "arabysexy.mobi", - "aragon.network", - "aranzadi.es", - "arauc.br", - "arc.ac.uk", - "arcadewank.com", - "arcgis.com", - "arcgisonline.com", - "archaeologydataservice.ac.uk", - "archangel.ac.uk", - "archer.ac.uk", - "archie-west.ac.uk", - "architectural-cadcam.com", - "archive-it.org", - "archive.ac.uk", - "archive.fo", - "archive.is", - "archive.li", - "archive.md", - "archive.org", - "archive.ph", - "archive.today", - "archiveofourown.com", - "archiveofourown.net", - "archiveofourown.org", - "archives.gov", - "archives.gov.tw", - "archiveshub.ac.uk", - "archivx.to", - "archlinux.org", - "archlinuxarm.org", - "archway.ac.uk", - "arcom.ac.uk", - "arctic.ac.uk", - "arctosia.com", - "arden.ac.uk", - "ardencampus.ac.uk", - "ardencollege.ac.uk", - "ardenu.ac.uk", - "ardenuni.ac.uk", - "ardenuniversity.ac.uk", - "area120.com", - "area51.to", - "areca-backup.org", - "arena.taipei", - "arethusa.su", - "arewereadyyet.com", - "areyoucreditwise.com", - "argotunnel.com", - "argyllcollege.ac.uk", - "aria.ms", - "ariadne.ac.uk", - "aricd.ac.uk", - "aries-dtp.ac.uk", - "ark-genomics.ac.uk", - "ark.ac.uk", - "ark.to", - "arlingtoncemetery.mil", - "arm.ac.uk", - "arma.ac.uk", - "armagh.ac.uk", - "armovs.com", - "army.mil", - "arnold-carlton.ac.uk", - "arnoldrenderer.com", - "arphic.com", - "arphic.com.cn", - "arphic.com.tw", - "arrc.ac.uk", - "ars.ac.uk", - "art1lib.com", - "art4tibet1998.org", - "artcam.com", - "artcamexpress.com", - "artcaminsignia.com", - "artcamjewelsmith.com", - "artcampro.com", - "artdesignhull.ac.uk", - "arte.tv", - "artifact.ac.uk", - "artixlinux.org", - "artnudegalleries.com", - "artoferotica.info", - "artofmaking.ac.uk", - "artofpeacefoundation.org", - "arts-inst-bournemouth.ac.uk", - "arts.ac.uk", - "artsigns.ac.uk", - "artsmethodsnorthwest.ac.uk", - "artsresearchatnorthampton.ac.uk", - "artstation.com", - "artstationmedia.com", - "artstor.org", - "artsy.net", - "aru.ac.uk", - "arunachalforests.gov.in", - "arupoc.ac.uk", - "arxiv.org", - "arzon.jp", - "as-hp.ca", - "asacp.org", - "asagaku.com", - "asahi.com", - "asahicom.jp", - "asakonet.co.jp", - "ascelibrary.org", - "ascent.ac.uk", - "ascentis.ac.uk", - "ascorpus.ac.uk", - "ascr.ac.uk", - "ascribed.ac.uk", - "asdfg.jp", - "asearch.ac.uk", - "asebay.com", - "asen.ac.uk", - "asexdoll.com", - "asextube.net", - "asfc.ac.uk", - "asg.to", - "asgp.ac.uk", - "asha.org", - "ashemaletube.com", - "ashemaletv.com", - "ashford.ac.uk", - "ashleysageellison.com", - "ashridge.ac.uk", - "ashtoninstitute.ac.uk", - "asia-gaming.com", - "asiabrox.ac.uk", - "asiacrazy.xyz", - "asiaharvest.org", - "asiamap.ac.uk", - "asiamoviepass.com", - "asian-anal-sex.com", - "asianage.com", - "asianboygay.com", - "asiancamgirllive.com", - "asiancamly.com", - "asianews.it", - "asianfreeforum.com", - "asianfreeporn.net", - "asiangfvideos.com", - "asiangirlsnextdoor.com", - "asianphd.com", - "asianporn.rest", - "asianporn.sexy", - "asianpornjav.com", - "asianpornlabs.com", - "asianpornmovies.com", - "asianpornonly.com", - "asianporntrends.com", - "asianpornup.com", - "asianscreens.com", - "asiansex.sexy", - "asiansexdiary.com", - "asiansmaster.com", - "asianspiss.com", - "asianthumbs.org", - "asianwifeporn.com", - "asianwomensfilm.de", - "asianxxxvideos.cc", - "asiaone.com", - "asiatgp.com", - "asiatimes.com", - "asiatoday.us", - "ask-sam.ac.uk", - "ask.com", - "askfacebook.net", - "askfacebook.org", - "askham-bryan.ac.uk", - "askham.ac.uk", - "askhambryan.ac.uk", - "asknudes.com", - "askstudent.com", - "askubuntu.com", - "askynz.net", - "asm.org", - "asme.org", - "asmhentai.com", - "asminternational.org", - "asmrbuluo.com", - "asn-online.org", - "asp-cc.com", - "asp.net", - "aspbjournals.org", - "aspect.ac.uk", - "aspectnetwork.ac.uk", - "aspenpublishing.com", - "aspi.org.au", - "aspire.ac.uk", - "aspiretrainingteam.ac.uk", - "aspistrategist.org.au", - "aspnetcdn.com", - "asproex.com", - "asproexapi.com", - "asra.ac.uk", - "asredas.com", - "asrockind.com", - "ass4all.com", - "assap.ac.uk", - "assembla.com", - "assemblesystems.com", - "assesphoto.com", - "assetsadobe.com", - "assimp.org", - "assistirhentai.com", - "assoass.com", - "associates-amazon.com", - "associationforpoliticalthought.ac.uk", - "assylum.com", - "astec.ac.uk", - "asthma-allergy.ac.uk", - "astm.org", - "asto.re", - "aston.ac.uk", - "astrill.com", - "astrobiology.ac.uk", - "astrogrid.ac.uk", - "astronomy.ac.uk", - "asus.com", - "asuscloud.com", - "asuswebstorage.com", - "asvin.ac.uk", - "atandt.com", - "atc.org.au", - "atchinese.com", - "atdmt.com", - "atdmt2.com", - "ateam-oracle.com", - "atgfw.org", - "athenaeizou.com", - "athens.ac.uk", - "atkgallery.com", - "atlanta168.com", - "atlantaminidealers.com", - "atlars.ac.uk", - "atlas.ac.uk", - "atlasdmt.com", - "atlasonepoint.com", - "atlaspost.com", - "atlassian.com", - "atlassian.net", - "atnext.com", - "atom.io", - "atos.net", - "atp.ac.uk", - "atscaleconference.com", - "atsip.ac.uk", - "att-bundles.com", - "att-idns.net", - "att-japan.com", - "att-mail.com", - "att-promotions.com", - "att-rsvp.com", - "att.com", - "att.jobs", - "att.net", - "att.tv", - "attackers.net", - "attalascom.com", - "attbelieves.com", - "attbusiness.net", - "attcenter.com", - "attcollaborate.com", - "attdns.com", - "attdns.net", - "attexperts.com", - "attglobal.net", - "atthelimits.ac.uk", - "attic.io", - "attinnovationspace.com", - "attinternetservice.com", - "attjoy.com", - "attnetclient.com", - "attonlineoffers.com", - "attproxy.com", - "attpublicpolicy.com", - "attpurchasing.com", - "attsavings.com", - "attspecial.com", - "attssl.com", - "attstadium.com", - "attsuppliers.com", - "atttvnow.com", - "attuverseoffers.com", - "attuverseonline.com", - "attvoip.com", - "attwatchtv.com", - "attwifi.com", - "attwirelessinternet.com", - "attwirelessonline.com", - "attwirelesssolutions.com", - "atube.sex", - "atube.xxx", - "atubex.com", - "atwiki.jp", - "atypi.org", - "aua.ac.uk", - "aub.ac.uk", - "auc.ac.uk", - "aucb.ac.uk", - "aucheapbeats.com", - "aucyfrwngcymraeg.ac.uk", - "aude.ac.uk", - "audelondon.ac.uk", - "audible.com", - "audiencenetwork.com", - "audiencenetwork.tv", - "audiobeatsau.com", - "audiobeatsbydre.com", - "audiomonsterbeatsonline.com", - "audionow.com", - "aue.ac.uk", - "auee.ac.uk", - "aukcar.ac.uk", - "aulic.ac.uk", - "auntymaza.com", - "auphf.ac.uk", - "auricularemonsterbeats.com", - "auricularesbeatsbaratosshop.com", - "auricularesbeatsmarkt.com", - "auroraoss.com", - "ausbeatsbydrdre.com", - "auth0.com", - "authorizeddns.net", - "authorizeddns.org", - "authorizeddns.us", - "authorxml.com", - "authy.com", - "autocad-schulungen.com", - "autocad.com", - "autocad360.com", - "autocad3d.com", - "autocadarchitecturecc.com", - "autocadexpert.com", - "autocadformac.com", - "autocadfreestyle.com", - "autocadlt.com", - "autocadltbg.com", - "autocadmac.com", - "autocadmobile.com", - "autocadsucks.com", - "autocadsucks.net", - "autocadws.com", - "autocadws.net", - "autodesk-aia-me.com", - "autodesk-events.com", - "autodesk-kickoff.com", - "autodesk-mm.com", - "autodesk-news.com", - "autodesk-online.com", - "autodesk-service.com", - "autodesk-services.com", - "autodesk-support.com", - "autodesk-university.com", - "autodesk-usability.com", - "autodesk.com", - "autodesk.dev", - "autodesk.net", - "autodesk123d.com", - "autodesk123dnews.com", - "autodesk360.com", - "autodesk360access.com", - "autodesk360beta.com", - "autodesk360bim.com", - "autodesk360express.com", - "autodesk360forbim.com", - "autodesk360forplm.com", - "autodesk360nexus.com", - "autodesk360nexus.net", - "autodesk360plm.com", - "autodesk360pro.com", - "autodesk360solutionforbim.com", - "autodesk360solutionforplm.com", - "autodesk360vault.com", - "autodeskaecfeed.com", - "autodeskandcitrix.com", - "autodeskarcade.com", - "autodeskautocadlt.com", - "autodeskautomotive.com", - "autodeskbim360.com", - "autodeskbookrequest.com", - "autodeskbuild.com", - "autodeskbuildingops.com", - "autodeskbuildspc.com", - "autodeskcave.com", - "autodeskchronicle.com", - "autodeskcommunications.com", - "autodeskcompetitions.com", - "autodeskdesigncompetition.com", - "autodeskdesigncompetitions.com", - "autodeskdiscussions.com", - "autodeskdocandmedia.com", - "autodeskdocandmediaamericas.com", - "autodeskdocandmediaasia.com", - "autodeskdocandmediaemea.com", - "autodeskdocandmediaeurope.com", - "autodeskegitimleri.com", - "autodeskenterprise.com", - "autodeskevents.com", - "autodeskfashionstyler.com", - "autodeskforgames.com", - "autodeskforge.com", - "autodeskformit.com", - "autodeskfoundation.com", - "autodeskfusionlifecycle.com", - "autodeskgovernment.net", - "autodeskgreenbuildingstudio.com", - "autodeskhelp.com", - "autodeskicpcouncil.com", - "autodeskimpression.com", - "autodeskinform.com", - "autodeskinstant.com", - "autodeskjournal.com", - "autodesklearning.com", - "autodesklistens.com", - "autodesklivedesign.com", - "autodesklms.com", - "autodeskmanufacturingacademy.com", - "autodeskmayaformotiongraphics.com", - "autodeskmedbookrequest.com", - "autodeskmedia.com", - "autodeskmediarequest.com", - "autodeskmeetings.com", - "autodeskmfg.com", - "autodeskmotiongraphicsandmore.com", - "autodesknews.com", - "autodeskonline.com", - "autodeskpartner.com", - "autodeskplm.com", - "autodeskplm360.com", - "autodeskplm360.net", - "autodeskproductreviews.com", - "autodeskprofiles.com", - "autodeskprograms.com", - "autodeskresearch.com", - "autodeskrevit.com", - "autodeskrevit.net", - "autodeskrevitsucks.com", - "autodeskrevitsucks.net", - "autodeskseek.com", - "autodesksketchbook.com", - "autodesksketchbookdesigner.com", - "autodeskstylebook.com", - "autodesksubscription.com", - "autodesksucks.com", - "autodesksucks.net", - "autodesktechdays.com", - "autodesktechx.com", - "autodesktinkerbox.com", - "autodesktravel.com", - "autodeskturkiye.com", - "autodeskuniversity.com", - "autodeskuniversity2013.com", - "autodeskvasari.com", - "autodeskvasari.net", - "autodeskvietnam.com", - "autodeskviewer.com", - "autodeskworkshop.com", - "autodeskworkshop.net", - "autodraw.com", - "automobile.fr", - "automotive-cadcam.com", - "autosketch.com", - "autosub.ac.uk", - "autumn-jade.com", - "auxdubai.com", - "av-baron.com", - "av-channel.com", - "av-e-body.com", - "av-movie.cc", - "av-th.net", - "av-top.com", - "av.com", - "av.movie", - "av01.tv", - "av11.org", - "av1688.cc", - "av369.net", - "av4.us", - "av69.tv", - "av69.us", - "av6k.com", - "av6k.vip", - "avaaz.org", - "avant.ac.uk", - "avatara.com", - "avbebe.com", - "avbody.tv", - "avcar.vip", - "avcens.xyz", - "avcity.tv", - "avcnn.com", - "avcool.com", - "avcrempie.com", - "avday.tv", - "avdb.in", - "avdb.tv", - "avdby-up.buzz", - "avdudu.top", - "avdwang.xyz", - "avelip.com", - "aventertainments.com", - "avfantasy.com", - "avfox.cc", - "avg.com", - "avgigi.com", - "avgle.com", - "avgle.net", - "avgod.club", - "avh.world", - "avhbo.com", - "avhd101.com", - "avhome.one", - "avhu.com", - "avidemux.org", - "avinetworks.com", - "avinin.com", - "avizoon.site", - "avizoone.com", - "avjb.com", - "avjiasu.com", - "avjoy.me", - "avjzy67.xyz", - "avking-mp4.sbs", - "avlulu.cc", - "avmo.pw", - "avmoo.click", - "avmoo.com", - "avmoo.net", - "avmoo.pw", - "avn.com", - "avnana5.com", - "avnight-shipin.com", - "avoision.com", - "avpanda.cc", - "avphd.ac.uk", - "avple.tv", - "avprc.ac.uk", - "avrila.cc", - "avrila2.cc", - "avrila2023.top", - "avrila23.cc", - "avriri.top", - "avsee01.tv", - "avseesee.com", - "avsforum.com", - "avstar.me", - "avstar01.me", - "avstar02.me", - "avstar03.me", - "avstar04.com", - "avstar04.me", - "avstar05.me", - "avstar06.me", - "avstar07.com", - "avstar07.me", - "avstar09.com", - "avstar09.me", - "avstar1.com", - "avstar2.com", - "avstar3.com", - "avstar4.com", - "avstar5.com", - "avstar6.com", - "avstar8.com", - "avstar9.com", - "avwong.com", - "avwto.com", - "avxde.org", - "avxhm.is", - "avxhm.se", - "avxlive.icu", - "avxxc.com", - "avyahoo.com", - "awayoutgame.com", - "aweencore.com", - "awempire.com", - "awesomeent.co.kr", - "awetv.com", - "awfdcp.ac.uk", - "awflapp.top", - "awjq.cc", - "awlc.ac.uk", - "aws-iot-hackathon.com", - "awsautopilot.com", - "awsautoscaling.com", - "awsbraket.com", - "awscommandlineinterface.com", - "awsedstart.com", - "awseducate.com", - "awseducate.net", - "awseducate.org", - "awsglobalaccelerator.com", - "awsloft-johannesburg.com", - "awsloft-stockholm.com", - "awssecworkshops.com", - "awsstatic.com", - "awsthinkbox.com", - "awstrack.me", - "awstrust.com", - "awwcn.buzz", - "awwcn.xyz", - "axbdoll.com.tw", - "axios.com", - "axureformac.com", - "ayabank.com", - "aylesbury.ac.uk", - "ayrcoll.ac.uk", - "ayrshire.ac.uk", - "ayshdade.info", - "ayshdee.xyz", - "ayudanintendo.com", - "azadiradio.com", - "azadliq.org", - "azathabar.com", - "azatliq.org", - "azattyk.org", - "azattyq.org", - "azatutyun.am", - "azerbaycan.tv", - "azerimix.com", - "aziani.com", - "azirevpn.com", - "aznude.com", - "azubu.tv", - "azure-devices-int.net", - "azure-devices.net", - "azure-dns.com", - "azure-dns.info", - "azure-dns.net", - "azure-dns.org", - "azure-mobile.net", - "azure-sphere.com", - "azure-test.net", - "azure.com", - "azure.net", - "azurecomcdn.net", - "azurecomm.net", - "azurecontainer.io", - "azurecosmos.net", - "azurecosmosdb.com", - "azurecosmosdb.info", - "azurecosmosdb.net", - "azurecr.io", - "azuredatabricks.net", - "azuredevopslaunch.com", - "azuredigitaltwin.com", - "azuredigitaltwins.com", - "azuredigitaltwins.net", - "azuredns-prd.info", - "azuredns-prd.org", - "azureedge-test.net", - "azureedge.net", - "azurefd.net", - "azureiotcentral.com", - "azureiotsolutions.com", - "azureiotsuite.com", - "azureplanetscale.info", - "azureplanetscale.net", - "azureserviceprofiler.com", - "azuresmartspaces.net", - "azurestackvalidation.com", - "azurewebsites.net", - "b-cdn.net", - "b-eroland.net", - "b-ok.africa", - "b-ok.asia", - "b-ok.cc", - "b-ok.global", - "b-ok.org", - "b0ne.com", - "b3boos.com", - "b6b33.com", - "b6fc.ac.uk", - "baa.ac.uk", - "baap.ac.uk", - "baas.ac.uk", - "baazee.com", - "babble.com", - "babecentrum.com", - "babeimpact.com", - "babeltech.ac.uk", - "babepedia.com", - "babes.com", - "babes34.com", - "babes34.pro", - "babesandbitches.net", - "babesandgirls.com", - "babesandstars.com", - "babesaround.com", - "babesbang.com", - "babesinporn.com", - "babesmachine.com", - "babesnetwork.com", - "babesofindia.com", - "babesource.com", - "babestube.com", - "babosas.com", - "babraham.ac.uk", - "babushky.club", - "baby-kingdom.com", - "baby-me-nrt.ac.uk", - "babycondom.com", - "babylonbee.com", - "babylongirls.co.uk", - "babynet.com.hk", - "babypink.to", - "babyzone.com", - "bach.ac.uk", - "backchina.com", - "backdoorlesbians.com", - "backoncourse.ac.uk", - "backpackers.com.tw", - "backroomcastingcouch.com", - "backstage.ac.uk", - "backtotiananmen.com", - "bacl.ac.uk", - "baclaw.ac.uk", - "bacoll.ac.uk", - "bacon.com", - "bacsitinhyeu.vn", - "bad.news", - "badaas.com", - "badasianpussy.com", - "badc.ac.uk", - "badgen.net", - "badiucao.com", - "badjojo.com", - "badoinkvr.com", - "badoo.com", - "badsexygirl.com", - "badteenspunished.com", - "badvirtue.com", - "baeb.com", - "baec.ac.uk", - "baes.ac.uk", - "bafa.ac.uk", - "bag-glasses1.com", - "bahamut.com.tw", - "bahcesehir.ac.uk", - "bai29.xyz", - "baicaonetwork.com", - "baice.ac.uk", - "baidu.jp", - "baijie.org", - "bailandaily.com", - "bailer.ac.uk", - "bais.ac.uk", - "baixing.me", - "baizhi.org", - "baj.ac.uk", - "bakgeekhome.tk", - "balance.ac.uk", - "ballbustingtube.com", - "balletwest.ac.uk", - "baltimorebmw.com", - "bam.ac.uk", - "bamgrid.com", - "bams.ac.uk", - "bamtoki.com", - "banan.tv", - "banana-vpn.com", - "banatfun.com", - "banbury-bicester.ac.uk", - "banbury-college.ac.uk", - "band.us", - "bandag.cc", - "bandag.com", - "bandcamp.com", - "bandgirlz.com", - "bandp.ac.uk", - "bandpage.com", - "bandpcoll.ac.uk", - "bandwagonhost.com", - "banff-buchan.ac.uk", - "bang-movies.com", - "bangbros.com", - "bangbrosnetwork.com", - "bangchen.net", - "bangdream.space", - "bangher.net", - "bangkokpost.com", - "bangkokstreetwhores.com", - "bangor-university-london.ac.uk", - "bangor.ac.uk", - "bangyoulater.com", - "bangyourwife.com", - "bankmobilevibe.com", - "banned.video", - "bannedbook.net", - "bannedbook.org", - "bannednews.org", - "banorte.com", - "baraero.com", - "baramangaonline.com", - "barefootnetworks.com", - "barelist.com", - "barenakedislam.com", - "bareporno.com", - "barfuck.com", - "barium-enema.com", - "barkadahansasmartone.com", - "barking-coll.ac.uk", - "barkingcollege.ac.uk", - "barkingdagenhamcollege.ac.uk", - "barnabu.co.uk", - "barnet.ac.uk", - "barnetsouthgate.ac.uk", - "barnfield.ac.uk", - "barnsley.ac.uk", - "barony.ac.uk", - "barricades.ac.uk", - "barrons-advisor.com", - "barrons-conferences.com", - "barrons.com", - "barrow6fc.ac.uk", - "barry.ac.uk", - "bars.ac.uk", - "barss1207.pro", - "barton-peveril.ac.uk", - "barton.ac.uk", - "barton.de", - "bartvpn.com", - "bas.ac.uk", - "baselinestudy.com", - "baselinestudy.org", - "basford-hall.ac.uk", - "basildon.ac.uk", - "basilisk-browser.org", - "basingstoke.ac.uk", - "basketry.ac.uk", - "basp.ac.uk", - "basr.ac.uk", - "bastillepost.com", - "bastropfirestone.com", - "baterias-hp.com", - "bath.ac.uk", - "bathcollege.ac.uk", - "bathnortheastsomerset-acl.ac.uk", - "bathspa.ac.uk", - "batsa.me", - "battle.net", - "battlebreakers.com", - "battlefield.com", - "battlefield1943.com", - "battlefield3.com", - "battlefield4.com", - "battlefield5.com", - "battlefieldbadcompany2.com", - "battlefieldheroes.com", - "battlefieldv.com", - "battleforcecomix.com", - "battlefront2.com", - "battlefrontii.com", - "battlelog.com", - "bavs.ac.uk", - "baxsound.com", - "bayareabmw.com", - "bayvoice.net", - "baywords.com", - "bazel.build", - "bb-chat.tv", - "bb33.net", - "bbbaihu.vip", - "bbc-anal.com", - "bbc-reporting-api.app", - "bbc.ac.uk", - "bbc.co.uk", - "bbc.com", - "bbc.in", - "bbc.net.uk", - "bbcchinese.com", - "bbchat.tv", - "bbci.co.uk", - "bbcmedia.co.uk", - "bbcpersian.com", - "bbcpornonly.com", - "bbcslln.ac.uk", - "bbcverticals.com", - "bbe.ac.uk", - "bbestmall.com", - "bbg.gov", - "bbgevent.com", - "bbgwatch.com", - "bbhub.io", - "bbk.ac.uk", - "bbkz.com", - "bbnradio.org", - "bbqm1.xyz", - "bbs-cove.ac.uk", - "bbs-tw.com", - "bbsdigest.com", - "bbsfeed.com", - "bbsland.com", - "bbsmo.com", - "bbsone.com", - "bbsrc.ac.uk", - "bbthat.com", - "bbtoystore.com", - "bbw-yoyo.buzz", - "bbwmilftube.com", - "bbwyoyo.info", - "bby.com", - "bbycastatic.ca", - "bbycloud.com", - "bbycontent.com", - "bbycontent.net", - "bbyintl.com", - "bbystatic.com", - "bbyurl.us", - "bca.ac.uk", - "bcam.ac.uk", - "bcast.ac.uk", - "bcast.co.nz", - "bcbits.com", - "bcc.ac.uk", - "bcc.com.tw", - "bcchinese.net", - "bccolleges.ac.uk", - "bcex.ca", - "bcftcs.ac.uk", - "bcicdn.com", - "bcmorning.com", - "bcno.ac.uk", - "bcom.ac.uk", - "bcomstudents.ac.uk", - "bcot.ac.uk", - "bcove.video", - "bcovlive.io", - "bcrncdn.com", - "bctcs.ac.uk", - "bcu.ac.uk", - "bcuc.ac.uk", - "bcvp0rtal.com", - "bcy01.com", - "bdc.ac.uk", - "bdn.dev", - "bdsm-mov.net", - "bdsm.com", - "bdsm123.xyz", - "bdsmboard.org", - "bdsmbunker.com", - "bdsmcafe.com", - "bdsmhd.cc", - "bdsmland.org", - "bdsmlibrary.com", - "bdsmlr.com", - "bdsmpornonly.com", - "bdsmsexgame.com", - "bdsmstreak.com", - "bdsmtubexxx.com", - "bdsmtv.cc", - "bdsmvideos.net", - "beaa.ac.uk", - "beaconevents.com", - "beanfun.com", - "beascoremodel.com", - "beastiegals.com", - "beastysexlinks.com", - "beastythumbs.com", - "beatbd.com", - "beatbydre2013.com", - "beatbydreheadphonesonsale.com", - "beatbydrekopen.com", - "beatbydremonster.com", - "beatbydreuk2014.com", - "beatdrdres.com", - "beatfactoryoutlets.com", - "beatmonstersaustralia.net", - "beats-by-dre-australia.com", - "beats-bydrdre.net", - "beats-bydre-mall.com", - "beats-bydrecheapsale.com", - "beats-bydreoutletonline.com", - "beats-bydreoutletsale.com", - "beats-bydreoutletsale.net", - "beats-bydreoutletssale.net", - "beats-bydrestore.com", - "beats-bydreuk.com", - "beats-deal.com", - "beats-dre-us.com", - "beats-headphones-buy-cheap.com", - "beats-headphones.us", - "beats-sale.com", - "beats-seller.com", - "beats-soaho.com", - "beats1.cc", - "beats1.tv", - "beats123.com", - "beats4.net", - "beats4outlets.com", - "beats4salecheap.com", - "beatsallsale.com", - "beatsaudifonos.com", - "beatsaudiobydre.com", - "beatsaudiobydre.net", - "beatsaudios.net", - "beatsbeatsmonster.com", - "beatsbestdeals.com", - "beatsblackfridaydeals.net", - "beatsblackfridayretails.com", - "beatsboxingdayuksale.com", - "beatsbydrdre-headphones.com", - "beatsbydrdre-officials5.com", - "beatsbydrdre-online.com", - "beatsbydrdre-onsale.com", - "beatsbydrdre-store.com", - "beatsbydrdre-store.us", - "beatsbydrdre4sale.com", - "beatsbydrdrebiz.com", - "beatsbydrdrecustom.com", - "beatsbydrdredanmark.com", - "beatsbydrdremall.com", - "beatsbydrdreoutlet.com", - "beatsbydrdres.com", - "beatsbydrdresale.net", - "beatsbydrdrestore.com", - "beatsbydrdreus.com", - "beatsbydre-beatsheadphone.com", - "beatsbydre-chen.com", - "beatsbydre-club.com", - "beatsbydre-headphones.com", - "beatsbydre-headphonesshop.com", - "beatsbydre-mall.com", - "beatsbydre-outlet.com", - "beatsbydre-outletsale.net", - "beatsbydre-outletstore.com", - "beatsbydre-sell.com", - "beatsbydre-store.com", - "beatsbydre-studio.com", - "beatsbydre-us.com", - "beatsbydre.jp", - "beatsbydre2081.com", - "beatsbydre411.com", - "beatsbydre4usales.com", - "beatsbydreauofficial.com", - "beatsbydreausale.net", - "beatsbydreaustralia-sale.com", - "beatsbydreaustraliaonline.com", - "beatsbydreaustraliaonlines.com", - "beatsbydreaustraliasales.com", - "beatsbydrebeatsby.com", - "beatsbydreblackfriday2013.com", - "beatsbydreblackfridaypro.com", - "beatsbydreboxingdayca.com", - "beatsbydrecasquesfr.com", - "beatsbydrecheap-outletstore.com", - "beatsbydrecheaper.com", - "beatsbydrecheaponlinesales.com", - "beatsbydrecolors.com", - "beatsbydrecustomwireless.com", - "beatsbydrecybermondaydeals2013.com", - "beatsbydrecybermondaydeals2013.net", - "beatsbydredanmarks.com", - "beatsbydredealsblackfriday.com", - "beatsbydredealscybermonday.com", - "beatsbydrediscount.com", - "beatsbydrediscountonline.net", - "beatsbydredr.com", - "beatsbydreexecutivesale.com", - "beatsbydreformall2013-nl.com", - "beatsbydreforsalesonline.com", - "beatsbydreforshop2013-nl.com", - "beatsbydreforstore.com", - "beatsbydreforyououtlet.com", - "beatsbydrefr.com", - "beatsbydrefrcasquepascher.com", - "beatsbydrefriday.com", - "beatsbydregot.com", - "beatsbydrehd.com", - "beatsbydrehd.net", - "beatsbydreheadphones-nz.com", - "beatsbydreheadphonesolo.com", - "beatsbydrehut.com", - "beatsbydreinexpensive.com", - "beatsbydreireland-sales.com", - "beatsbydreirelandonlines.com", - "beatsbydreirelandsale.com", - "beatsbydreirelandsonline.com", - "beatsbydremall2013.com", - "beatsbydremonsteraustralia.com", - "beatsbydrenls.com", - "beatsbydrenorge1.net", - "beatsbydreofficialdanmark.com", - "beatsbydreoksale.com", - "beatsbydreol.com", - "beatsbydreonlie2013-nl.com", - "beatsbydreonlines-ireland.com", - "beatsbydreonlines-uk.com", - "beatsbydreonlinesale-nz.com", - "beatsbydreoordopjes.com", - "beatsbydreoslo.com", - "beatsbydreoutletsale.com", - "beatsbydreoutletscheap.com", - "beatsbydrerealstore.com", - "beatsbydres-shop.com", - "beatsbydresale-uk.com", - "beatsbydresalemall2013.com", - "beatsbydresaleonlines-nz.com", - "beatsbydresales.us", - "beatsbydresalesonline-australia.com", - "beatsbydresdanmark.net", - "beatsbydreshop-uk.com", - "beatsbydreshops.net", - "beatsbydresingapores.com", - "beatsbydresingaporesale.com", - "beatsbydresold.com", - "beatsbydresolohdonline-canada.com", - "beatsbydresonline-nz.com", - "beatsbydrespeakers.com", - "beatsbydressale.com", - "beatsbydressolo.com", - "beatsbydresstudio.com", - "beatsbydrestorevip.com", - "beatsbydrestudio-australia.com", - "beatsbydrestudio.com", - "beatsbydretoutlet.com", - "beatsbydreuk.com", - "beatsbydreuk.net", - "beatsbydreus.com", - "beatsbydrevipde.com", - "beatsbydrew.com", - "beatsbydrsmonsterinusa.com", - "beatsbymusic.net", - "beatsbysdrbre.com", - "beatsbysdrdres.com", - "beatscasque-france.com", - "beatscheap-nz.com", - "beatscheap-uk.com", - "beatscheapforsale.com", - "beatscollection2014.com", - "beatscustomblackfriday.com", - "beatsdanmark2013.com", - "beatsdrdre-headphones.com", - "beatsdrdre-it.com", - "beatsdrdre-solo.com", - "beatsdrdre2014.com", - "beatsdrdrecuffie.net", - "beatsdrdrekaufenschweiz.net", - "beatsdrdreneon.com", - "beatsdre-monster.com", - "beatsdre.net", - "beatsdre4cheap.com", - "beatsdrecheap.com", - "beatsdredreheadphones.com", - "beatsdreforsale.com", - "beatsdreinau.com", - "beatsdremonster-uk.com", - "beatsdrenewcolorful4usale.com", - "beatsdreoutletsale.com", - "beatsdresale2013.com", - "beatsdresalestore.com", - "beatsdresolo2013.com", - "beatsdreus.com", - "beatsearbudsheadphoness.com", - "beatselectronic.net", - "beatselectronics.com", - "beatsep.com", - "beatsep.net", - "beatsfacstore.com", - "beatsfactoroutlets.com", - "beatsfactorycollection.com", - "beatsfactoryoutles.com", - "beatsforcheap-usa.com", - "beatsforme.com", - "beatsfranceofficiel.com", - "beatsheadphones-discount.com", - "beatsheadphones1.com", - "beatsheadphones2u.com", - "beatsheadphonesale.com", - "beatsheadphonesdealer.com", - "beatsheadphonesforcheap.net", - "beatsheadphonesonline.com", - "beatsheadphoness.com", - "beatsheadphonestudio.com", - "beatsheadphonesusamall.com", - "beatshopuk.com", - "beatsincanada.com", - "beatsinsingapore.com", - "beatsireland.net", - "beatsjoy.com", - "beatsmonstersales.com", - "beatsmusic.com", - "beatsmusic.wang", - "beatsneon.com", - "beatsnzsale.com", - "beatsodre.com", - "beatsofdre-usa.com", - "beatsonblackfriday2013.com", - "beatsone.net", - "beatsoutlet.net", - "beatsoutletanytime.com", - "beatsoutletonlines.com", - "beatspascher-bydre.com", - "beatspascher-fr.net", - "beatspascher.net", - "beatspaschers.net", - "beatspillnewcolor.com", - "beatspills.com", - "beatspromonsterjp.com", - "beatspromotions.com", - "beatssales.com", - "beatssaleus.com", - "beatssaustraliabuy.com", - "beatssbyaustralia.com", - "beatssbydredanmark.com", - "beatsshop-uk.com", - "beatsshop-usa.com", - "beatsshopstore.com", - "beatssingapores.com", - "beatssingaporeshop.com", - "beatsstudiohodetelefoner.com", - "beatsstudiosite.com", - "beatstoreusa.com", - "beatsua.com", - "beatswholesale.us", - "beatswirelesscheap.com", - "beatswirelesscuffie.com", - "beatthatquote.com", - "beaumontcollege.ac.uk", - "beautifulandbusty.com", - "beautyandthebeastmusical.co.uk", - "beautyescortsamsterdam.com", - "bebepremium3.com.bo", - "bebirkbeck.ac.uk", - "bebo.com", - "beck.de", - "becomeindex.com", - "becoming-a-teacher.ac.uk", - "beddit.tv", - "bede.ac.uk", - "bedford.ac.uk", - "bedfordshire.ac.uk", - "bedfordsixthform.ac.uk", - "beds.ac.uk", - "bedsacl.ac.uk", - "bedstegratisporno.com", - "beeg.com", - "beeg.rest", - "beegfree.com", - "beejp.net", - "beep.ac.uk", - "bees.ac.uk", - "beevpn.com", - "befuck.com", - "befuck.net", - "begellhouse.com", - "begin-trade.com", - "behance.net", - "behaviour4learning.ac.uk", - "behavioural-science.ac.uk", - "behindkink.com", - "behindthescreenz.com", - "bei.ac.uk", - "beibao.com", - "beijing1989.com", - "beijing2022.art", - "beijingnike.com", - "beijingspring.com", - "beijingzx.org", - "beinghumanfestival.ac.uk", - "beinspiredatstaffs.ac.uk", - "beirc.ac.uk", - "beiyongzhan1.com", - "bejav.net", - "bejeweledstars.com", - "bejewled-stars.com", - "bekijkporno.nl", - "belamionline.com", - "belfastinstitute.ac.uk", - "belfastmet.ac.uk", - "belfastmetropolitan.ac.uk", - "belfastmetropolitancollege.ac.uk", - "belfordcollege.ac.uk", - "bell.ac.uk", - "bell.wiki", - "bellebound.com", - "bellerbys.ac.uk", - "bellesa.co", - "bellotube.com", - "bellsouth.net", - "belwue.net", - "bemix.ac.uk", - "bemywife.cc", - "benaughty.fun", - "benc.ac.uk", - "bengalisexvideos.com", - "benliton.com", - "bentobox.tv", - "bep.ac.uk", - "bera.ac.uk", - "beric.me", - "berkanawireless.com", - "berkeley.edu", - "berks-coll-ag.ac.uk", - "berkscollag.ac.uk", - "berlincompanions.com", - "berlinerbericht.de", - "berlintwitterwall.com", - "berm.co.nz", - "bern.ac.uk", - "bernards.ac.uk", - "besa.ac.uk", - "besc.ac.uk", - "beside.ac.uk", - "bess.ac.uk", - "best-practice.se", - "best-sex-games.com", - "best.ac.uk", - "best4bim.com", - "bestbeats4u.com", - "bestbhy.com", - "bestbim.com", - "bestbuy-audio.com", - "bestbuy-communityrelations.com", - "bestbuy-giftcard.info", - "bestbuy-int.com", - "bestbuy-jobs.com", - "bestbuy.ca", - "bestbuy.com", - "bestbuy.com.mx", - "bestbuy.info", - "bestbuy24x7solutions.com", - "bestbuybusiness.com", - "bestbuybusinessadvantageaccount.com", - "bestbuycanada.ca", - "bestbuycanada.com", - "bestbuycanadaltd.ca", - "bestbuycharityclassic.com", - "bestbuycoffeemakers.com", - "bestbuyethics.com", - "bestbuyforbusiness.ca", - "bestbuygsm.com", - "bestbuyideax.com", - "bestbuyphotoworkshoptours.com", - "bestbuyrewards.com", - "bestbuyrewardzone.ca", - "bestbuys.com", - "bestbuysgeeksquad.com", - "bestbuysolutions.net", - "bestbuystores.com", - "bestbuytradein.com", - "bestbuyus.com", - "bestcamsites.net", - "besterpornos.com", - "bestescortgirls.nl", - "bestforchina.org", - "bestfreecams.club", - "bestfreesexgames.com", - "bestfreetube.net", - "bestfreetube.xxx", - "bestgames-2022.com", - "bestgore.com", - "besthandjobporn.com", - "besthentaitube.com", - "bestiality.guru", - "bestialitysextaboo.com", - "bestialitytaboo.tv", - "bestialityvideo.us", - "bestiphonestuff.com", - "bestjapanesepornsites.com", - "bestjavporn.com", - "bestjavporn.net", - "bestkinky.com", - "bestlistofporn.com", - "bestmallawards.com", - "bestofu.ac.uk", - "bestporn.su", - "bestpornclip.com", - "bestporncomix.com", - "bestporngames.com", - "bestpornsites.eu", - "bestpornsites.guide", - "bestpornstardb.com", - "bestporntube.me", - "bestpremiumpornsite.com", - "bestrecipes.com.au", - "bestsexcam.com", - "bestshoesale2014.net", - "besttitstube.com", - "bestvpn.com", - "bestvpnanalysis.com", - "bestvpnserver.com", - "bestvpnservice.com", - "bestvpnusa.com", - "bestxxxsites.com", - "besuty99.com", - "besztbuy.com", - "bet365.com", - "betfair.com", - "beth.games", - "bethesda.net", - "bethesdagamestudios.com", - "bethsoft.com", - "betterbim.com", - "betterexplained.com", - "betterhdporn.com", - "betternet.co", - "betternike.com", - "bettertogether.ac.uk", - "bettervpn.com", - "betterwithautodesk.com", - "bettween.com", - "betvictor.com", - "between-legs.com", - "beurettesvideo.com", - "beverleycollege.ac.uk", - "bewww.net", - "bexhillcollege.ac.uk", - "bexley.ac.uk", - "bexleycollege.ac.uk", - "bextbuy.com", - "beyondcore.com", - "beyondfirewall.com", - "beyondtext.ac.uk", - "bffshd.com", - "bfmat.ac.uk", - "bfnn.org", - "bfsh.hk", - "bftv.ac.uk", - "bgc.ac.uk", - "bgme.me", - "bgov.com", - "bgr.in", - "bgs.ac.uk", - "bgu.ac.uk", - "bgvpn.com", - "bham.ac.uk", - "bhamcity.ac.uk", - "bhamcityuniversity.ac.uk", - "bhasvic.ac.uk", - "bhent.co.kr", - "bhggn.xyz", - "bhpgms.ac.uk", - "bhpms.ac.uk", - "bhrc.ac.uk", - "bhzyk.buzz", - "bhzyw2.top", - "biaa.ac.uk", - "biab.ac.uk", - "bianlei.com", - "biantailajiao.com", - "biantailajiao.in", - "biaoqs.xyz", - "biaoqs1.xyz", - "biaoqs2.xyz", - "biblesforamerica.org", - "bibliography.ac.uk", - "bibox.com", - "bic2011.org", - "bicc.ac.uk", - "bicpa.ac.uk", - "bicton.ac.uk", - "bidbay.com", - "bidi.net.uk", - "bidong25.com", - "bidong9.com", - "bidorbuyindia.com", - "bids.ac.uk", - "bidswitch.net", - "bidvestbank.co.za", - "biea.ac.uk", - "biedian.me", - "bienvenuechezbestbuy.ca", - "big.one", - "bigassporn.tv", - "bigbeans.solutions", - "bigbigchannel.com.hk", - "bigbigshop.com", - "bigblackdicklover.com", - "bigboobbundle.com", - "bigboobsalert.com", - "bigboobsandhotsex.com", - "bigboobsonline.org", - "bigboobspov.com", - "bigboobswives.com", - "bigboss.video", - "bigbuckbunny.org", - "bigcharts.com", - "bigcocker.com", - "bigdata-cdt.ac.uk", - "bigdata.ac.uk", - "bigdick.com", - "bigdickorgasm.com", - "bigf.ac.uk", - "bigfools.com", - "biggggg.com", - "biggo.com.tw", - "bighead.group", - "bighealthactuarialdata.ac.uk", - "bigidea.ac.uk", - "bigindiansex.mobi", - "bigjapanesesex.com", - "bigmoney.biz", - "bignews.org", - "bigone.com", - "bigporn.com", - "bigsex.tv", - "bigsound.org", - "bigtitangelawhite.com", - "bigtithitomi.com", - "bigtithooker.com", - "bigtitsextapes.com", - "bigtitsgallery.net", - "bigtitsmodelsdirectory.com", - "bigtitsthreesomes.com", - "bigtitterrynova.com", - "bigtitvenera.com", - "bigtopsites.com", - "biguz.net", - "bihg.ac.uk", - "biitii.com", - "bijukujo.club", - "bikaa.xyz", - "bikac.xyz", - "bikaios.xyz", - "bil.ac.uk", - "bilborough.ac.uk", - "bild.de", - "bileta.ac.uk", - "bili2.cc", - "bili888.com", - "bili999.com", - "bilibili.tv", - "biliplus.com", - "biliworld.com", - "bilk.ac.uk", - "bill-safe.com", - "billmelater.com", - "billmelater.info", - "billmelater.net", - "billpoint.com", - "billpoint.info", - "billpoint.tv", - "billpoint.us", - "billpointnewzealand.com", - "billypan.com", - "bilston.ac.uk", - "bim-360.com", - "bim360.com", - "bim360.net", - "bim360field.com", - "bim360glue.com", - "bim360ops.com", - "bim3dcontent.com", - "bimacademy.ac.uk", - "bimadsk.com", - "bimbim.com", - "bimbolive.com", - "bimglue.com", - "bimlibrary.com", - "bimm.ac.uk", - "bimmstudents.ac.uk", - "bimseeker.com", - "bimsource.com", - "bimworld.com", - "binads.com", - "binance.cc", - "binance.cloud", - "binance.co", - "binance.com", - "binance.info", - "binance.me", - "binance.net", - "binance.org", - "binance.us", - "binance.vision", - "binanceapi.com", - "binancecnt.com", - "binancezh.be", - "binancezh.biz", - "binancezh.cc", - "binancezh.co", - "binancezh.com", - "binancezh.info", - "binancezh.ink", - "binancezh.kim", - "binancezh.link", - "binancezh.live", - "binancezh.mobi", - "binancezh.net", - "binancezh.pro", - "binancezh.sh", - "binancezh.top", - "bing.com", - "bing.net", - "bing123.com", - "bingads.com", - "bingagencyawards.com", - "bingapis.com", - "bingapistatistics.com", - "bingparachute.com", - "bingsandbox.com", - "bingvisualsearch.com", - "bingworld.com", - "binoculus.com", - "bintray.com", - "binux.me", - "binwang.me", - "biobank.ac.uk", - "biobankingsolutions.ac.uk", - "biobankuk.ac.uk", - "biochar.ac.uk", - "bioethics.ac.uk", - "bioethicsweb.ac.uk", - "biofilms.ac.uk", - "bioinf.ac.uk", - "bioinfo.ac.uk", - "bioinformatics.ac.uk", - "biologists.com", - "biome.ac.uk", - "biomedcentral.com", - "bioone.org", - "bioporno.com", - "bioresearch.ac.uk", - "biorxiv.org", - "bioss.ac.uk", - "bioville.ac.uk", - "bioware.com", - "biowarestore.com", - "bioyork.ac.uk", - "bipic.net", - "bips.ac.uk", - "biqle.org", - "biqle.ru", - "birbeckstratford.ac.uk", - "bird.so", - "birkbeck.ac.uk", - "birkbeckstratford.ac.uk", - "birmingham-nottingham.ac.uk", - "birmingham.ac.uk", - "birminghamcity.ac.uk", - "birminghamcityuniversity.ac.uk", - "birminghamschoolofacting.ac.uk", - "bisa.ac.uk", - "bishopaucklandcollege.ac.uk", - "bishopb-college.ac.uk", - "bishopburton.ac.uk", - "bishopburtoncollege.ac.uk", - "bishopg.ac.uk", - "bisi.ac.uk", - "bisq.io", - "bisq.network", - "bit-z.com", - "bit.do", - "bit.ly", - "bitballoon.com", - "bitbank.cc", - "bitbay.net", - "bitbucket.io", - "bitbucket.org", - "bitchesgirls.com", - "bitchmomporn.com", - "bitchute.com", - "bitcoin.org", - "bitcointalk.org", - "bitcoinworld.com", - "bite.ac.uk", - "bitfinex.com", - "bitflyer.com", - "bitflyer.jp", - "bitget.com", - "bithumb.com", - "bitinka.com.ar", - "bitly.com", - "bitly.is", - "bitmex.com", - "bitnami.com", - "bitnamiapp.com", - "bitnamistudio.com", - "bitporno.com", - "bitquick.co", - "bitshare.com", - "bitsnoop.com", - "bitsquare.io", - "bitstamp.net", - "bitstream.com", - "bitterwinter.org", - "bittrex.com", - "bitvise.com", - "bitwarden.com", - "bitwarden.eu", - "bitwarden.net", - "bitz.ai", - "bitz.com", - "bizarresexuality.com", - "bizhat.com", - "bizographics.com", - "bjini.cc", - "bjnewlife.org", - "bjs.org", - "bjzc.org", - "bkkdown.site", - "bl-doujinsouko.com", - "black-country.ac.uk", - "blackamateurfuck.com", - "blackamateursvideos.com", - "blackandasiangrad.ac.uk", - "blackandstacked.com", - "blackboxgames.com", - "blackburn.ac.uk", - "blackcountryandmarchesiot.ac.uk", - "blacked.com", - "blackfridaydrebeatsnew.com", - "blackfridaydrebeatsshop.com", - "blackhomeporn.com", - "blacklogic.com", - "blackmonsterterror.com", - "blackpool-acl.ac.uk", - "blackpool.ac.uk", - "blackpoolsixth.ac.uk", - "blackshemalevideo.com", - "blacksonblondes.com", - "blackstonespoliceservice.com", - "blacktowhite.net", - "blackvpn.com", - "blake.ac.uk", - "blaoshi.cc", - "blazor.net", - "blc.ac.uk", - "ble.ac.uk", - "blend-ed.ac.uk", - "blender.org", - "blewpass.com", - "blingblingsquad.net", - "blink.org", - "blinkload.zone", - "blinkx.com", - "blinw.com", - "blip.tv", - "blizzak-juken.jp", - "blizzard.com", - "blizzardgearstore.com", - "blms.ac.uk", - "blockcast.it", - "blockcn.com", - "blockedbyhk.com", - "blockfrost.io", - "blockless.com", - "blocktempo.com", - "blog.de", - "blog.google", - "blog.jp", - "blogblog.com", - "blogcatalog.com", - "blogcity.me", - "blogdns.org", - "blogebay.com", - "blogger.com", - "bloggrowup.com", - "blogimg.jp", - "blogism.jp", - "bloglines.com", - "bloglovin.com", - "blogo.jp", - "blogoverflow.com", - "blogs.com", - "blogspot.ae", - "blogspot.al", - "blogspot.am", - "blogspot.ba", - "blogspot.be", - "blogspot.bg", - "blogspot.bj", - "blogspot.ca", - "blogspot.cat", - "blogspot.cf", - "blogspot.ch", - "blogspot.cl", - "blogspot.co.at", - "blogspot.co.id", - "blogspot.co.il", - "blogspot.co.ke", - "blogspot.co.nz", - "blogspot.co.uk", - "blogspot.co.za", - "blogspot.com", - "blogspot.com.ar", - "blogspot.com.au", - "blogspot.com.br", - "blogspot.com.by", - "blogspot.com.co", - "blogspot.com.cy", - "blogspot.com.ee", - "blogspot.com.eg", - "blogspot.com.es", - "blogspot.com.mt", - "blogspot.com.ng", - "blogspot.com.tr", - "blogspot.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", - "blogtd.net", - "blogtd.org", - "blogterest.net", - "bloodshed.net", - "bloomberg.cn", - "bloomberg.co.jp", - "bloomberg.co.kr", - "bloomberg.com", - "bloomberg.com.br", - "bloomberg.de", - "bloomberg.fm", - "bloomberg.tv", - "bloombergapps.com", - "bloombergarcade.com", - "bloombergbeta.com", - "bloombergbna.com", - "bloombergbreakaway.com", - "bloombergbriefs.com", - "bloombergchina.com", - "bloombergenvironment.com", - "bloombergforeducation.com", - "bloomberggovernment.com", - "bloombergindices.com", - "bloombergindustry.com", - "bloomberglabs.com", - "bloomberglaw.com", - "bloomberglive.com", - "bloomberglp.com", - "bloombergmedia.com", - "bloombergnext.com", - "bloombergpolarlake.com", - "bloombergprep.com", - "bloombergquint.com", - "bloombergradio.com", - "bloombergsef.com", - "bloombergspace.com", - "bloombergstatus.com", - "bloombergsurvey.com", - "bloombergtax.com", - "bloombergtax1.com", - "bloombergtaxtech.com", - "bloombergtradingchallenge.com", - "bloombergtv.mn", - "bloombergvault.com", - "bloombergview.com", - "bloomfortune.com", - "bloommicroventures.com", - "bloomsbury.ac.uk", - "bloomsburycollections.com", - "bloomsburydesignlibrary.com", - "bloomsburydtc.ac.uk", - "bloomsburyinstitute.ac.uk", - "blowjobit.com", - "blowjobqueens.net", - "blpcareers.com", - "blpevents.com", - "blpprofessional.com", - "blubrry.com", - "blueangellive.com", - "bluearchive.jp", - "bluefootcms.com", - "bluegreencities.ac.uk", - "bluehatil.com", - "bluehatnights.com", - "bluekai.com", - "bluemix.com", - "bluemix.net", - "bluestacks.com", - "bluestone.ac.uk", - "bluffyporn.com", - "blurams.com", - "blws.ac.uk", - "blylq.buzz", - "blz-contentstack.com", - "bm14.ac.uk", - "bmac.ac.uk", - "bmc.ac.uk", - "bme.ac.uk", - "bmet.ac.uk", - "bmetc.ac.uk", - "bmfinn.com", - "bmia.org", - "bmj.com", - "bml.info", - "bms.ac.uk", - "bmth-poole-cad.ac.uk", - "bmth.ac.uk", - "bmva.ac.uk", - "bmw-abudhabi.com", - "bmw-adventskalender.com", - "bmw-albania.com", - "bmw-antilles.fr", - "bmw-art-journey.com", - "bmw-arts-design.com", - "bmw-asia.com", - "bmw-auslieferungszentrum.com", - "bmw-authority-vehicles.com", - "bmw-bahrain.com", - "bmw-businessdrive.com", - "bmw-calgary.ca", - "bmw-carit.de", - "bmw-classic.com", - "bmw-clubs-international.com", - "bmw-connected-drive.com", - "bmw-connecteddrive.ae", - "bmw-connecteddrive.at", - "bmw-connecteddrive.be", - "bmw-connecteddrive.bg", - "bmw-connecteddrive.ca", - "bmw-connecteddrive.ch", - "bmw-connecteddrive.co.nz", - "bmw-connecteddrive.co.uk", - "bmw-connecteddrive.co.za", - "bmw-connecteddrive.com", - "bmw-connecteddrive.com.au", - "bmw-connecteddrive.com.br", - "bmw-connecteddrive.com.cy", - "bmw-connecteddrive.com.hr", - "bmw-connecteddrive.com.kw", - "bmw-connecteddrive.com.mt", - "bmw-connecteddrive.cz", - "bmw-connecteddrive.de", - "bmw-connecteddrive.dk", - "bmw-connecteddrive.ee", - "bmw-connecteddrive.es", - "bmw-connecteddrive.fi", - "bmw-connecteddrive.fr", - "bmw-connecteddrive.gr", - "bmw-connecteddrive.hu", - "bmw-connecteddrive.ie", - "bmw-connecteddrive.it", - "bmw-connecteddrive.jp", - "bmw-connecteddrive.kr", - "bmw-connecteddrive.lt", - "bmw-connecteddrive.lu", - "bmw-connecteddrive.lv", - "bmw-connecteddrive.mx", - "bmw-connecteddrive.my", - "bmw-connecteddrive.nl", - "bmw-connecteddrive.no", - "bmw-connecteddrive.pl", - "bmw-connecteddrive.pt", - "bmw-connecteddrive.ro", - "bmw-connecteddrive.ru", - "bmw-connecteddrive.se", - "bmw-connecteddrive.sg", - "bmw-connecteddrive.si", - "bmw-connecteddrive.sk", - "bmw-connecteddrive.tw", - "bmw-corporate-sales.com", - "bmw-diplomatic-sales.com", - "bmw-driving-center.co.kr", - "bmw-drivingexperience.com", - "bmw-dubai.com", - "bmw-eg.com", - "bmw-fleet.net", - "bmw-ghana.com", - "bmw-golfsport.com", - "bmw-group.com", - "bmw-group.net", - "bmw-grouparchiv.de", - "bmw-grouparchives.com", - "bmw-gta.ca", - "bmw-i-pure-impulse.com", - "bmw-i.jp", - "bmw-int1.com", - "bmw-iraq.com", - "bmw-jordan.com", - "bmw-konzernarchiv.de", - "bmw-ksa.com", - "bmw-kuwait.com", - "bmw-lao.la", - "bmw-lebanon.com", - "bmw-m-safetycar.com", - "bmw-m.com", - "bmw-mdrivetour.com", - "bmw-me.com", - "bmw-military-sales.com", - "bmw-motorcycle.com", - "bmw-motorcycles.vn", - "bmw-motorrad-abudhabi.com", - "bmw-motorrad-authorities.com", - "bmw-motorrad-dubai.com", - "bmw-motorrad-motorsport.com", - "bmw-motorrad-now-or-never.com", - "bmw-motorrad-service-inclusive.com", - "bmw-motorrad-test-ride.com", - "bmw-motorrad.at", - "bmw-motorrad.be", - "bmw-motorrad.bg", - "bmw-motorrad.bh", - "bmw-motorrad.bo", - "bmw-motorrad.ca", - "bmw-motorrad.ch", - "bmw-motorrad.cl", - "bmw-motorrad.co", - "bmw-motorrad.co.id", - "bmw-motorrad.co.kr", - "bmw-motorrad.co.nz", - "bmw-motorrad.co.th", - "bmw-motorrad.co.uk", - "bmw-motorrad.co.za", - "bmw-motorrad.com", - "bmw-motorrad.com.ar", - "bmw-motorrad.com.au", - "bmw-motorrad.com.br", - "bmw-motorrad.com.do", - "bmw-motorrad.com.hr", - "bmw-motorrad.com.mx", - "bmw-motorrad.com.my", - "bmw-motorrad.com.pe", - "bmw-motorrad.com.py", - "bmw-motorrad.com.tr", - "bmw-motorrad.cr", - "bmw-motorrad.cz", - "bmw-motorrad.de", - "bmw-motorrad.dk", - "bmw-motorrad.dz", - "bmw-motorrad.ec", - "bmw-motorrad.ee", - "bmw-motorrad.es", - "bmw-motorrad.fi", - "bmw-motorrad.fr", - "bmw-motorrad.gr", - "bmw-motorrad.gt", - "bmw-motorrad.hu", - "bmw-motorrad.in", - "bmw-motorrad.it", - "bmw-motorrad.jp", - "bmw-motorrad.lu", - "bmw-motorrad.ma", - "bmw-motorrad.nl", - "bmw-motorrad.no", - "bmw-motorrad.pa", - "bmw-motorrad.pl", - "bmw-motorrad.pt", - "bmw-motorrad.ro", - "bmw-motorrad.rs", - "bmw-motorrad.ru", - "bmw-motorrad.sa", - "bmw-motorrad.se", - "bmw-motorrad.si", - "bmw-motorrad.sk", - "bmw-motorrad.sv", - "bmw-motorrad.tw", - "bmw-motorrad.ua", - "bmw-motorrad.uy", - "bmw-motorsport.com", - "bmw-mountains.com", - "bmw-museum.com", - "bmw-museum.net", - "bmw-nigeria.com", - "bmw-oman.com", - "bmw-ottawa.ca", - "bmw-pakistan.com", - "bmw-plant-munich.com", - "bmw-pma.com.sg", - "bmw-powertrain.com", - "bmw-product-highlights.com", - "bmw-qatar.com", - "bmw-routes.com", - "bmw-rp.com", - "bmw-rrdays.com", - "bmw-saudiarabia.com", - "bmw-security-vehicles.com", - "bmw-special-sales.com", - "bmw-sports.com", - "bmw-sudan.com", - "bmw-tahiti.com", - "bmw-tunisia.com", - "bmw-vancouver.ca", - "bmw-voli.me", - "bmw-welt.com", - "bmw-welt.net", - "bmw-welt.tv", - "bmw-werk-berlin.de", - "bmw-world.com", - "bmw-world.net", - "bmw-world.tv", - "bmw-worldfinal.com", - "bmw-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.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.de", - "bmwartjourney.com", - "bmwasia.com", - "bmwauslieferungszentrum.com", - "bmwbikes.com", - "bmwbkk.de", - "bmwccrc.ca", - "bmwcenternet.com", - "bmwchampionship.com", - "bmwchampionshipusa.com", - "bmwcharitygolf.com", - "bmwcitychallenge.com", - "bmwclassic.com", - "bmwcolorado.com", - "bmwconnecteddrive.com", - "bmwcustomapparel.com", - "bmwdcsnet.net", - "bmwdealercareers.com", - "bmwdealerdirect.com", - "bmwdelawarevalley.com", - "bmwfilms.com", - "bmwgroup-classic-heart.com", - "bmwgroup-classic.com", - "bmwgroup-gaad.com", - "bmwgroup-plants.com", - "bmwgroup-posdigital.com", - "bmwgroup-werke.com", - "bmwgroup.at", - "bmwgroup.com", - "bmwgroup.jobs", - "bmwgroup.net", - "bmwgroupclassic.com", - "bmwgroupdesignworks.com", - "bmwgroupdirect.com", - "bmwgroupfs.com", - "bmwgroupinfobahn.com", - "bmwgroupna.com", - "bmwhk.com", - "bmwi.ca", - "bmwi.jp", - "bmwiventures.com", - "bmwjamaica.com", - "bmwlat.com", - "bmwlifestyle.ca", - "bmwm.com", - "bmwmagazine.com", - "bmwmagazine.de", - "bmwmass.com", - "bmwmass.net", - "bmwmc.net", - "bmwmontreal.ca", - "bmwmotorcycles.com", - "bmwmotorcycleusa.com", - "bmwmotorrad.co.kr", - "bmwmotorrad.com.au", - "bmwmotorrad.com.ph", - "bmwmotorrad.com.sg", - "bmwmotorradhk.com", - "bmwmotorshowblog.com", - "bmwmotorsport.com", - "bmwmperformance.com", - "bmwmuseum.net", - "bmwmyanmar.com", - "bmwofannapolis.com", - "bmwofcentralpa.com", - "bmwoftulsa.com", - "bmwondemandusa.com", - "bmworegon.com", - "bmwperformancecenter.com", - "bmwpittsburgh.com", - "bmwproductnews.com", - "bmwsafari.com", - "bmwsfl.com", - "bmwsfl.net", - "bmwshop.ca", - "bmwspecialoffers.ca", - "bmwsports.com", - "bmwstartupgarage.com", - "bmwstep.com", - "bmwstepconnections.com", - "bmwsummerschool.com", - "bmwtampabay.com", - "bmwusa.com", - "bmwusaservice.com", - "bmwusatires.com", - "bmwusfactory.com", - "bmwusrideracademy.com", - "bmwvalueservice.com", - "bmwwholesaleconnect.com", - "bmwworld.com", - "bmwworld.net", - "bmwworld.tv", - "bmwzentrum.com", - "bn5x.net", - "bnac.ac.uk", - "bnbstatic.com", - "bnef.com", - "bnews.co", - "bnext.com.tw", - "bnn.co", - "bnrmetal.com", - "bntrace.com", - "bnu.ac.uk", - "boa.ac.uk", - "boardreader.com", - "bobble.ac.uk", - "boboporn.com", - "boboporn.net", - "bobovip.cc", - "bobs-tube.com", - "bobvoyeur.com", - "bocici.buzz", - "bod.asia", - "bodc.ac.uk", - "bodgirls.com", - "bodog88.com", - "bodyandsoul.com.au", - "bodyfluids-jav.com", - "bognor-training.ac.uk", - "bognor.ac.uk", - "bokep.net", - "bokepseks.org", - "bokepvidz.com", - "bolehvpn.net", - "bollywoodlife.com", - "bolt.ac.uk", - "boltdns.net", - "bolton-college.ac.uk", - "bolton-community-college.ac.uk", - "bolton-sfc.ac.uk", - "bolton.ac.uk", - "boltoncc.ac.uk", - "boltoncollege.ac.uk", - "boltoncollege365.ac.uk", - "boltoncollegestem.ac.uk", - "boltonsix.ac.uk", - "bon.ac.uk", - "bonbonme.com", - "bonbonsex.com", - "bondagecomixxx.net", - "bondagesex-xxx.com", - "bondagesm.xyz", - "bone.ac.uk", - "bonedathome.com", - "bonfoundation.org", - "bongacams.com", - "bonyu.cyou", - "boobieblog.com", - "boobpedia.com", - "boobsrealm.com", - "boobstagram.com", - "boodigo.com", - "boodigogo.com", - "book.com.tw", - "book18.org", - "book4you.org", - "bookclubcorner.com", - "bookclubgirl.com", - "bookdepository.com", - "bookepub.com", - "bookfi.net", - "bookhad.ac.uk", - "booking.com", - "bookmark.xxx", - "bookmybridgestonetyre.com", - "bookonsky.net", - "books.com.tw", - "booksc.eu", - "booksc.me", - "booksc.org", - "booksc.xyz", - "bookshome.info", - "bookshome.net", - "bookshome.world", - "booksinprint.com", - "bookstagram.com", - "booktopia.com.au", - "booloo.com", - "boomba.club", - "boomerang.com", - "boomssr.com", - "booru.org", - "booth.pm", - "bootstrapcdn.com", - "bootyliciousmag.com", - "bootysource.com", - "bopcris.ac.uk", - "boqimod.com", - "boqitube.cc", - "borderlessprepaid.com", - "bordersandborderlands.ac.uk", - "borderscollege.ac.uk", - "borgenmagazine.com", - "boringcompany.com", - "borneo.world", - "borneoasia.com", - "borneoschematic.com", - "borwap.com", - "bosco.ac.uk", - "boshancy.com", - "bosharso.net", - "boslife.biz", - "boslife.net", - "bossae.com", - "bossagency.co.uk", - "bosta.ac.uk", - "bostaa.ac.uk", - "boston.ac.uk", - "bostoncentre.ac.uk", - "boswp.com", - "bot.nu", - "botanwang.com", - "botframework.com", - "botorch.org", - "botstop.com", - "boulx.com", - "boundhub.com", - "bountyhunterporn.com", - "bourne.ac.uk", - "bournemouth.ac.uk", - "bournemouthandpoole-cfe.ac.uk", - "bournville.ac.uk", - "bowenpress.com", - "bowlroll.net", - "bowsersinsidestory.com", - "box.com", - "box.net", - "box57.one", - "boxofficemojo.com", - "boxpn.com", - "boxun.com", - "boxun.tv", - "boxunblog.com", - "boxunclub.com", - "boy18tube.com", - "boyangu.com", - "boycall.com", - "boyfriendtv.com", - "boylabs.net", - "boylove.cc", - "boylove.com", - "boylove.live", - "boylove1.cc", - "boyloves.cc", - "boypost.com", - "boysfood.com", - "boysmaster.com", - "boyspornpics.com", - "boyvid.com", - "boyztube.com", - "bpa.ac.uk", - "bpc.ac.uk", - "bpcoll.ac.uk", - "bpmf.ac.uk", - "bppuniversity.ac.uk", - "bps.ac.uk", - "br.st", - "bracknell.ac.uk", - "brad.ac.uk", - "bradcoll.ac.uk", - "bradford.ac.uk", - "bradfordcollege.ac.uk", - "bradforduni-recruitment.ac.uk", - "braeburncapital.com", - "brain.ac.uk", - "brainsimagebank.ac.uk", - "braintree.ac.uk", - "braintreegateway.com", - "braintreegateway.tv", - "braintreepayments.com", - "braintreepayments.info", - "braintreepayments.org", - "braintreepayments.tv", - "braintreepaymentsolutions.com", - "braintreeps.com", - "brainyquote.com", - "brais.ac.uk", - "brams.ac.uk", - "branchportal.com", - "brand-protection-team.com", - "brandeasygo.com", - "brandelectronic.com", - "brandonhutchinson.com", - "brandporno.com", - "brandproducts1688.com", - "brands098.com", - "brasilincesto.com", - "brasiltudoliberado.com", - "brasshouse.ac.uk", - "braumeister.org", - "brave.com", - "braventures.com", - "braveux.com", - "bravoerotica.com", - "bravoporn.com", - "bravoteens.com", - "bravotube.net", - "bravotube.tv", - "brazilpartneruniversity.com", - "brazzer.com", - "brazzers-porno.online", - "brazzers-xxx.net", - "brazzers.com", - "brazzers.xxx", - "brazzersnetwork.com", - "brazzersporn.mobi", - "brazzfan.com", - "brc.ac.uk", - "brdteengal.com", - "breached.to", - "break.com", - "breakdown.me", - "breakgfw.com", - "breaking911.com", - "breakingofbritain.ac.uk", - "breakingtweets.com", - "breakwall.net", - "breasthealthinfo.com", - "breath-takers.com", - "breitbart.com", - "brent-acl.ac.uk", - "brentstart.ac.uk", - "brepolis.net", - "bretton.ac.uk", - "brew.sh", - "brewmp.com", - "briantreepayments.net", - "briantreepayments.tv", - "bricoltech.ac.uk", - "bridgce.ac.uk", - "bridge-studio.co.uk", - "bridgebim.com", - "bridgecollege.ac.uk", - "bridgend.ac.uk", - "bridgendcollege.ac.uk", - "bridgestone-asiapacific.com", - "bridgestone-bandag.com", - "bridgestone-brand.com", - "bridgestone-business-service.jp", - "bridgestone-korea.co.kr", - "bridgestone-plt-eng.com", - "bridgestone-tac-oman.com", - "bridgestone.cl", - "bridgestone.co.cr", - "bridgestone.co.id", - "bridgestone.co.in", - "bridgestone.co.jp", - "bridgestone.co.th", - "bridgestone.com", - "bridgestone.com.ar", - "bridgestone.com.br", - "bridgestone.com.co", - "bridgestone.com.mx", - "bridgestone.com.sg", - "bridgestone.com.tw", - "bridgestone.com.vn", - "bridgestoneamericas.com", - "bridgestonearena.com", - "bridgestonecntc.com", - "bridgestonecomercial.cl", - "bridgestonecomercial.co.cr", - "bridgestonecomercial.com.ar", - "bridgestonecomercial.com.br", - "bridgestonecomercial.com.co", - "bridgestonecomercial.com.mx", - "bridgestonegolf.com", - "bridgestonegz.com", - "bridgestonela.com", - "bridgestonemarketing.com", - "bridgestonemerchandise.com", - "bridgestonenationalfleet.com", - "bridgestoneperformance.com", - "bridgestoneperformancemedia.net", - "bridgestonerapiddelivery.com", - "bridgestonerewards.com", - "bridgestonesyb.com", - "bridgestonetire.ca", - "bridgestonetire.com", - "bridgestonetyre.com.my", - "bridgestonevan.com", - "bridgestonewx.com", - "bridgwater.ac.uk", - "briefdream.com", - "brightcove.com", - "brightcove.net", - "brightcove.services", - "brightcovecdn.com", - "brightline.tv", - "brighton.ac.uk", - "brightonandsussexmedicalschool.ac.uk", - "brightoncity.ac.uk", - "brightoncitycollege.ac.uk", - "brightonlegacy.ac.uk", - "brightonmedicalschool.ac.uk", - "brightstudy.ac.uk", - "briian.com", - "brilcom.ac.uk", - "brill.com", - "brilliant.org", - "brin.ac.uk", - "brinsbury.ac.uk", - "brinsburycollege.ac.uk", - "brinscoll.ac.uk", - "bris.ac.uk", - "brismes.ac.uk", - "bristol-baptist.ac.uk", - "bristol.ac.uk", - "bristolinstituteoflegalpractice.ac.uk", - "bristollawschool.ac.uk", - "bristolroboticslaboratory.ac.uk", - "bristoltheological.ac.uk", - "bristoluwe.ac.uk", - "britac.ac.uk", - "britarch.ac.uk", - "britcollege.ac.uk", - "british-antarctic-survey.ac.uk", - "british-geological-survey.ac.uk", - "british-history.ac.uk", - "british-museum.ac.uk", - "britishacademy.ac.uk", - "britishart.ac.uk", - "britishartstudies.ac.uk", - "britishelectionstudy.ac.uk", - "britishlibrary.ac.uk", - "britishludwigwittgensociety.ac.uk", - "britishmuseum.ac.uk", - "britishwittgensteinsociety.ac.uk", - "britsexcash.com", - "brizzly.com", - "brkmd.com", - "brl.ac.uk", - "brnc.ac.uk", - "brni.com", - "broadbandreports.com", - "broadbook.com", - "broadpressinc.com", - "broadstairscollege.ac.uk", - "brocaproject.com", - "brock.ac.uk", - "brockbbs.com", - "brokenteens.com", - "bromite.org", - "bromley.ac.uk", - "bromleyadulteducation.ac.uk", - "bromleyapps.ac.uk", - "bromo.com", - "bronch.ac.uk", - "bronto.com", - "brookehouse.ac.uk", - "brookes.ac.uk", - "brookings.edu", - "brooklands.ac.uk", - "brooks.ac.uk", - "brooksby.ac.uk", - "brooksbymelton.ac.uk", - "broomfield.ac.uk", - "broomsbarn.ac.uk", - "brotli.org", - "brourou.com", - "browser-intake-datadoghq.com", - "browserleaks.com", - "brox-coll.ac.uk", - "broxtowe.ac.uk", - "brucewang.net", - "bruford.ac.uk", - "brunel.ac.uk", - "bruneldigital.ac.uk", - "bruneluniversitylondon.ac.uk", - "brutalbdsmtube.com", - "brutalfetish.com", - "brutaltgp.com", - "bs-adreview.com", - "bs-awh.ne.jp", - "bsa.ac.uk", - "bsaw.ac.uk", - "bsbec.ac.uk", - "bsdc.ac.uk", - "bsfc.ac.uk", - "bsg.ac.uk", - "bshm.ac.uk", - "bsix.ac.uk", - "bsixbrookehouse.ac.uk", - "bsixbrookehousesixthformcollege.ac.uk", - "bsixcollege.ac.uk", - "bsky.app", - "bsky.network", - "bsky.social", - "bsls.ac.uk", - "bsmb.ac.uk", - "bsms.ac.uk", - "bsmslegacy.ac.uk", - "bsnti.ac.uk", - "bso.ac.uk", - "bsom.ac.uk", - "bsr.ac.uk", - "bsrg.ac.uk", - "bssd.ac.uk", - "bssh.ac.uk", - "bstatic.com", - "bsu.ac.uk", - "bsw.co.jp", - "bsw.jp", - "bsxm1213.pro", - "bt2mag.com", - "bt95.com", - "btaia.com", - "btas.ac.uk", - "btbtav.com", - "btc.ac.uk", - "btc98.com", - "btcbank.bank", - "btcbox.co.jp", - "btctrade.im", - "btdig.com", - "btdigg.org", - "btec.co.uk", - "btku.me", - "btku.org", - "bton.ac.uk", - "btrp-hyperpolarised.ac.uk", - "btspread.com", - "btsynckeys.com", - "btt804.com", - "btt904.com", - "bttzyw.com", - "bttzyw.net", - "btwrdn.com", - "buba.ac.uk", - "bubbaporn.com", - "bubl.ac.uk", - "buck.ac.uk", - "buck.build", - "buckbuild.com", - "bucketeer.jp", - "buckingham.ac.uk", - "buckinghamshire.ac.uk", - "bucks.ac.uk", - "buckscol.ac.uk", - "buckscollege.ac.uk", - "buckscollegegroup.ac.uk", - "bucksnewuni.ac.uk", - "budaedu.org", - "budatt.com", - "buddhanet.com.tw", - "buddhistchannel.tv", - "buddymedia.com", - "bufdg.ac.uk", - "buffered.com", - "bufvc.ac.uk", - "bugzilla.org", - "buhidoh.net", - "bui.ac.uk", - "buic.ac.uk", - "buicha.social", - "buila.ac.uk", - "building3dcontent.com", - "builtenvsigns.ac.uk", - "builtfromebay.com", - "bukkake-jav.com", - "bullguard.com", - "bullog.org", - "bullogger.com", - "bululusexdoll.com", - "bumingbai.net", - "bumpshare.com", - "bumptop.ca", - "bumptop.com", - "bumptop.net", - "bumptop.org", - "bumptunes.com", - "bunbunhk.com", - "bunnylust.com", - "burningcamel.com", - "burnley.ac.uk", - "burstly.net", - "burstlyrewards.com", - "burton-college.ac.uk", - "burton-southderbyshirecollege.ac.uk", - "burton.ac.uk", - "burtonandsouthderbyshirecollege.ac.uk", - "buryacl.ac.uk", - "burycollege.ac.uk", - "busayari.com", - "business-humanrights.org", - "business-i.jp", - "business-intelligence.ac.uk", - "business.page", - "business.site", - "businessaccess.ac.uk", - "businesscatalyst.com", - "businesscove-blackcountry.ac.uk", - "businessfocus.io", - "businessinsider.co.za", - "businessinsider.com", - "businessinsider.com.au", - "businessinsider.com.pl", - "businessinsider.de", - "businessinsider.es", - "businessinsider.fr", - "businessinsider.in", - "businessinsider.jp", - "businessinsider.mx", - "businessinsider.my", - "businessinsider.nl", - "businessinsider.sg", - "businesstoday.com.tw", - "businesswebwise.com", - "businessweek.com", - "businessweekly.com.tw", - "businessweekmag.com", - "bustyangelique.com", - "bustyarianna.com", - "bustydanniashe.com", - "bustydustystash.com", - "bustyinescudna.com", - "bustykellykay.com", - "bustykerrymarie.com", - "bustylornamorgan.com", - "bustymerilyn.com", - "bustymomsvideo.com", - "bustynudebabes.com", - "bustyoldsluts.com", - "bustysammieblack.com", - "busu.org", - "busytrade.com", - "butex.ac.uk", - "buugaa.com", - "buxtoncollege.ac.uk", - "buy-from-shanghai.com", - "buyaapl.com", - "buyaapl.net", - "buyaltera.com", - "buyaple.com", - "buybeatsbydre-uk.com", - "buybeatsheadphonesbydre.com", - "buycheapbeatsbus.com", - "buycheapbeatsbydre.com", - "buycheapbeatsbydreshop.com", - "buycheapbeatsdreuk.com", - "buydrdrebeatbox.com", - "buyfast-paysmart.net", - "buyingfacebooklikes.com", - "buyitnow.com", - "buyitnow.net", - "buyitnow.org", - "buyitnow.tv", - "buyitnowshop.net", - "buymeacoff.ee", - "buymeacoffee.com", - "buyminibeatbox.com", - "buynikechina.com", - "buyoculus.com", - "buyonlineheadphones.com", - "buypass-ssl.com", - "buypass.com", - "buypass.no", - "buypass.se", - "buyshoponly.com", - "buzzardflapper.com", - "buzzav.com", - "buzzhand.com", - "buzzhand.net", - "buzzorange.com", - "buzzsprout.com", - "bvdinfo.com", - "bvpn.com", - "bwbx.io", - "bwgyhw.com", - "bwh1.net", - "bwh8.net", - "bwh81.net", - "bwh88.net", - "bwh89.net", - "bwhstatus.com", - "bwin.com", - "bwrhub.ac.uk", - "bws.ac.uk", - "bwsj.hk", - "bx.in.th", - "bx.tl", - "byam-shaw.ac.uk", - "byapis.com", - "bybeatsdre.com", - "bybit-exchange.github.io", - "bybit.com", - "bycbe.com", - "bycsi.com", - "bydrebeats.com", - "bygpp1207.world", - "byjav.me", - "byjhd.com", - "bymj.io", - "bynet.co.il", - "bypasscensorship.org", - "byrut.org", - "byspotify.com", - "byteoversea.com", - "bytick.com", - "byzantine-ahrb-centre.ac.uk", - "byzantium.ac.uk", - "c-est-simple.com", - "c-ij.com", - "c-scaipe.ac.uk", - "c-span.org", - "c-spanvideo.org", - "c0930.com", - "c100tibet.org", - "c2cx.com", - "c4ccetl.ac.uk", - "c4rex.co", - "c4slive.com", - "ca.gov", - "caacentre.ac.uk", - "caadoc.ac.uk", - "caagcc.ac.uk", - "caban.ac.uk", - "cableav.tv", - "cableav.xyz", - "cablegatesearch.net", - "cabletv.com.hk", - "cabletvdirectv.com", - "cabot.ac.uk", - "cachefly.com", - "cachefly.net", - "cachinese.com", - "cacnw.com", - "cactusvpn.com", - "cad-mep.com", - "cadarn.ac.uk", - "cadarnskillscentre.ac.uk", - "cadbury.ac.uk", - "cadburycollege.ac.uk", - "cadcamsystemsinc.com", - "cadcol.ac.uk", - "cadduct.com", - "cade.ac.uk", - "cadise.ac.uk", - "cadmep.com", - "cadoverlay.com", - "cadren.com", - "cadres.ac.uk", - "caepr.ac.uk", - "caerdydd.ac.uk", - "cafepress.com", - "cafmad.ac.uk", - "cafr.ca", - "cafre.ac.uk", - "cahr.org.tw", - "cai21.xyz", - "caice.com", - "caijinglengyan.com", - "caime.xyz", - "cairn.info", - "cairnspost.com.au", - "calam.ac.uk", - "calameo.com", - "calat.ac.uk", - "calderdale-acl.ac.uk", - "calderdale.ac.uk", - "calderdaletraining.ac.uk", - "calebelston.com", - "caledonian.ac.uk", - "calendarserver.org", - "calendarz.com", - "calgarychinese.ca", - "calgarychinese.com", - "calgarychinese.net", - "calgon.at", - "calgon.be", - "calgon.ch", - "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.tv", - "calgoncarbon-china.com", - "calgoncarbon.com", - "calgonit.com", - "calibre-ebook.com", - "callabitch.org", - "callersbane.com", - "callhulu.com", - "calls.ac.uk", - "callywith.ac.uk", - "caltech.edu", - "cam-duct.com", - "cam-man-cic.ac.uk", - "cam-pgmc.ac.uk", - "cam.ac.uk", - "cam4.com", - "cam4.jp", - "cam4.sg", - "cam69.com", - "cambaddies.com", - "cambb.xxx", - "camborne.ac.uk", - "cambria.ac.uk", - "cambridge-university.ac.uk", - "cambridge.ac.uk", - "cambridge.org", - "cambridgedigital.net", - "cambridgeislamiccollege.ac.uk", - "cambridgemaths.org", - "cambridgemuslimcollege.ac.uk", - "cambridgeschoolshakespeare.com", - "cambridgeshireskills.ac.uk", - "cambridgeuniversity.ac.uk", - "cambro.tv", - "cambslearning.ac.uk", - "camcam.cc", - "camden-acl.ac.uk", - "camdolls.com", - "camduct.com", - "camelot-europe.com", - "camelotherald.com", - "camelotherald.net", - "camelphat.com", - "camelspaceeffect.com", - "camera.ac.uk", - "cameraboys.com", - "camerfirma.com", - "camfinder.com", - "camfox.com", - "camfrog.com", - "camgirlfinder.net", - "camgirlstemple.com", - "camgoddess.tv", - "camonster.com", - "campaignforuyghurs.org", - "camphill.ac.uk", - "campushp.com", - "campuslondon.com", - "campwsbydeangcymru.ac.uk", - "camrabbit.com", - "camre.ac.uk", - "camri.ac.uk", - "cams.com", - "cams.org.sg", - "camsfc.ac.uk", - "camsoda.com", - "camsoda1.com", - "camstagestudio.com", - "camster.com", - "camstreams.tv", - "camsvids.tv", - "camvideos.org", - "camvideos.tv", - "camvideoshub.com", - "camwhores-tv.com", - "camwhores.forum", - "camwhores.tv", - "camwhores.video", - "camwhoresbay.com", - "camwhoreshd.com", - "camwhoria.com", - "can.ac.uk", - "canada-beatsbydre.com", - "canadameet.com", - "canalporno.com", - "cancerandsociety.ac.uk", - "candi.ac.uk", - "candidforum-videos.com", - "cando.ac.uk", - "candycumcity.com", - "candypleasure.com", - "cannington.ac.uk", - "cannock.ac.uk", - "canolfansgiliaucadarn.ac.uk", - "canolfanyramgylcheddolcymru.ac.uk", - "canon-cee.com", - "canon-cmos-sensors.com", - "canon-cna.com", - "canon-ebm.com.hk", - "canon-emea.com", - "canon-emirates.ae", - "canon-europa.com", - "canon-europe.com", - "canon-me.com", - "canon-ois.qa", - "canon-se.com.tw", - "canon.am", - "canon.at", - "canon.az", - "canon.ba", - "canon.be", - "canon.bg", - "canon.ca", - "canon.ch", - "canon.co.il", - "canon.co.uk", - "canon.co.za", - "canon.com", - "canon.com.al", - "canon.com.au", - "canon.com.by", - "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.uz", - "canonfoundation.org", - "canonical.com", - "canonproprinters.com", - "cant-col.ac.uk", - "cant.ac.uk", - "cantab.ac.uk", - "canterbury.ac.uk", - "canterburycollege.ac.uk", - "canterburytrust.ac.uk", - "cantonese.asia", - "canyu.org", - "cao.im", - "caobian.info", - "caochangqing.com", - "cap.org.hk", - "cape.ac.uk", - "capel.ac.uk", - "capitalccg.ac.uk", - "capitalcct.ac.uk", - "capitalcitycg.ac.uk", - "capitalgames.com", - "capitaliq.com", - "capitalisingoncreativity.ac.uk", - "capsule.ac.uk", - "captainfawcett.com", - "carabinasypistolas.com", - "carbo-biocrop.ac.uk", - "carbobiocrop.ac.uk", - "carbon.com", - "carcare-and-tireshop.jp", - "card.io", - "cardiff-institute.ac.uk", - "cardiff.ac.uk", - "cardiffandvalecollege.ac.uk", - "cardiffmet.ac.uk", - "cardiffmetropolitanuniversity.ac.uk", - "cardinalkungfoundation.org", - "cardinalnewman.ac.uk", - "cardonald.ac.uk", - "carebay.com", - "careerengine.us", - "careerfundas.com", - "careerjournal.com", - "careersatfb.com", - "careersinresearch.ac.uk", - "careerswales.ac.uk", - "carekit.org", - "carfax.com", - "cargigileads.com", - "cari.com.my", - "caribbeancom.com", - "caribbeancompr.com", - "carlisle.ac.uk", - "carmel.ac.uk", - "carmer.ac.uk", - "carmotorshow.com", - "carnegie.ac.uk", - "carnegiecollege.ac.uk", - "carnet.hr", - "carousell.com.hk", - "carr-lse.ac.uk", - "carrd.co", - "carryzhou.com", - "carshalton.ac.uk", - "carstagram.com", - "cartoon-sex.tv", - "cartoon18.com", - "cartoon3thumbs.com", - "cartoonmovement.com", - "cartoonporn.com", - "cartoonporno.xxx", - "cartoonpornonly.com", - "cartoonpornvideos.com", - "cartoonregistry.com", - "cartoons.ac.uk", - "cartoonscity.com", - "cartoonsexfantazy.com", - "cartoontube.com", - "cartoonville.net", - "cas.org", - "casadeltibetbcn.org", - "casatibet.org.mx", - "casaw.ac.uk", - "cash.app", - "cash2.com", - "cashback69.com", - "cashbycashapp.com", - "cashify.com", - "cashify.net", - "cashpassport.ca", - "cashpassport.co.za", - "cashpassport.com", - "cashpassport.com.br", - "cashpassport.net", - "cashpassportglobe.com", - "cashvideotube.com", - "casim.ac.uk", - "casimages.com", - "casinobellini.com", - "casinoking.com", - "casinoriva.com", - "casms.ac.uk", - "casnewydd.ac.uk", - "casoneexchange.com", - "casque-fr.com", - "casquebeatsbydrdresolohd.com", - "casquebeatsdocteurdre.com", - "casquebeatsdre2013.com", - "casquebeatsenligne.com", - "casquebeatsfracheter.com", - "casquebeatsmer.net", - "casquebeatsofficiel-fr.com", - "casquebeatspascher2013.com", - "casquebeatssolo.net", - "casquedrdrebeatssfr.com", - "casquemonsterbeats.com", - "casquemonsterbeatsbydre2013.com", - "casquesbeatsaudio.com", - "cast.ac.uk", - "castbox.fm", - "castingcouch-x.com", - "castle-coll.ac.uk", - "castle.ac.uk", - "castlecollege.ac.uk", - "castlereagh.ac.uk", - "castro.fm", - "catalina.hk", - "catalinacruz.com", - "cataloguementalhealth.ac.uk", - "catalysis-cdt.ac.uk", - "catbox.moe", - "catcert.cat", - "catch22.net", - "catchgod.com", - "catchplay.com", - "catfightpayperview.xxx", - "cathedralsgroup.ac.uk", - "catholic.org.hk", - "catholic.org.tw", - "cathvoice.org.tw", - "catmiimi.com", - "cato.org", - "cattt.com", - "causeway.ac.uk", - "cava.ac.uk", - "cavc.ac.uk", - "cave.ac.uk", - "cavendish.ac.uk", - "cavhot.com", - "cavporn.com", - "cavporn.github.io", - "caw.ac.uk", - "caxton.ac.uk", - "cayt.ac.uk", - "cbart.net", - "cbbank.com.mm", - "cbc.ca", - "cbcdc.ac.uk", - "cbm.com.mm", - "cbpar.ac.uk", - "cbrl.ac.uk", - "cbs.ac.uk", - "cbs.com", - "cbsaavideo.com", - "cbscorporation.com", - "cbsi.com", - "cbsi.video", - "cbsiam.com", - "cbsig.net", - "cbsimg.net", - "cbsinteractive.com", - "cbsistatic.com", - "cbsivideo.com", - "cbsnews.com", - "cbspressexpress.com", - "cbssports.com", - "cbsstatic.com", - "cbssvideo.com", - "cbtc.org.hk", - "cc.com", - "cc18.biz", - "cc18.tv", - "cc18tv.com", - "ccad.ac.uk", - "ccap.ac.uk", - "ccav69.info", - "ccav69.me", - "ccav691api.com", - "ccavb.tv", - "ccb.ac.uk", - "ccc.ac.uk", - "cccat.cc", - "cccat.co", - "cccep.ac.uk", - "cccr.ac.uk", - "cccu.ac.uk", - "ccdc.ac.uk", - "ccdtr.org", - "ccesd.ac.uk", - "ccfe.ac.uk", - "cch.ac.uk", - "cchere.com", - "cchsr.ac.uk", - "cci.ac.uk", - "cciernslabs.com", - "cciesecuritylabs.com", - "ccievoicelabs.com", - "ccim.org", - "ccl.ac.uk", - "cclife.ca", - "cclife.org", - "cclifefl.org", - "cclrc.ac.uk", - "ccm.ac.uk", - "ccms.ac.uk", - "ccn.ac.uk", - "ccna5.net", - "ccnsite.com", - "ccol.ac.uk", - "ccp-mag.ac.uk", - "ccp-wsi.ac.uk", - "ccp.ac.uk", - "ccp1.ac.uk", - "ccp11.ac.uk", - "ccp13.ac.uk", - "ccp14.ac.uk", - "ccp2.ac.uk", - "ccp3.ac.uk", - "ccp4.ac.uk", - "ccp5.ac.uk", - "ccp6.ac.uk", - "ccp9.ac.uk", - "ccpb.ac.uk", - "ccpbiosim.ac.uk", - "ccpem.ac.uk", - "ccpforge.ac.uk", - "ccpi.ac.uk", - "ccplymouth.ac.uk", - "ccpn.ac.uk", - "ccpnc.ac.uk", - "ccpp.ac.uk", - "ccppetmr.ac.uk", - "ccpq.ac.uk", - "ccpsx.com", - "ccri.ac.uk", - "ccs.ac.uk", - "ccscfe-cdt.ac.uk", - "ccse.ac.uk", - "ccsr.ac.uk", - "ccstatic.org", - "ccsw.ac.uk", - "ccta.ac.uk", - "ccthere.com", - "ccthere.net", - "cctmweb.net", - "cctongbao.com", - "ccu.edu.tw", - "ccue.ca", - "ccue.com", - "ccvoice.ca", - "ccw.org.tw", - "ccwp.ac.uk", - "cdbook.org", - "cdcparty.com", - "cdd.ac.uk", - "cdef.org", - "cdig.info", - "cdjp.org", - "cdkworkshop.com", - "cdmatech.com", - "cdn-apple.com", - "cdn-telegram.org", - "cdn-terapeak.com", - "cdn.ac.uk", - "cdn20.com", - "cdn77.com", - "cdn77.org", - "cdnews.com.tw", - "cdninstagram.com", - "cdnjs.com", - "cdnlab.live", - "cdnpure.com", - "cdp1989.org", - "cdp1998.org", - "cdp2006.org", - "cdpa.url.tw", - "cdpeu.org", - "cdpusa.org", - "cdpweb.org", - "cdpwu.org", - "cdrc.ac.uk", - "cdt-art-ai.ac.uk", - "cdt-cmp.ac.uk", - "cdt-piads.ac.uk", - "cdtceltic.ac.uk", - "cdw.com", - "cebay.com", - "cecan.ac.uk", - "cecc.gov", - "cecos.ac.uk", - "ceda.ac.uk", - "cedar.ac.uk", - "cee.ac.uk", - "ceeds.ac.uk", - "ceelbas-cdt.ac.uk", - "ceelbas.ac.uk", - "ceesi.ac.uk", - "cefims.ac.uk", - "ceg.ac.uk", - "ceh-nerc.ac.uk", - "ceh-wallingford.ac.uk", - "ceh.ac.uk", - "cehuk.ac.uk", - "ceicdata.com", - "celebforum.co", - "celebgramme.com", - "celebmasta.live", - "celebritygay.com", - "celebritynakeds.com", - "celebrityslips.com", - "celebritystorysite.com", - "celebsporno.com", - "celebsroulette.com", - "celeron.com", - "celeron.net", - "celestiallight.org", - "cell.com", - "cellulo.info", - "celluloidfilmfutures.ac.uk", - "cem.ac.uk", - "cem1.ac.uk", - "ceme.ac.uk", - "cemmap.ac.uk", - "cemp.ac.uk", - "cencoastbmw.com", - "cenews.eu", - "cenkei.com", - "censorship.ai", - "censorship.no", - "census-registration.ac.uk", - "census.ac.uk", - "centa.ac.uk", - "centauro.com.br", - "centerforhumanreprod.com", - "centervillage.co.jp", - "centos.org", - "central-glasgow.ac.uk", - "central-lancashire.ac.uk", - "centralbeds.ac.uk", - "centralcollege.ac.uk", - "centralnation.com", - "centralnottingham.ac.uk", - "centralstmichaels.ac.uk", - "centralsussex.ac.uk", - "centralvalidation.com", - "centreformacroeconomics.ac.uk", - "centreforsustainablecities.ac.uk", - "centreforyouthministry.ac.uk", - "centreonconstitutionalchange.ac.uk", - "centrino.com", - "centrino.net", - "centurys.net", - "ceoi.ac.uk", - "cepacol.ca", - "cepacol.com", - "ceramics-cadcam.com", - "cercia.ac.uk", - "cerdas.com", - "ceredigion.ac.uk", - "ceri.ac.uk", - "cerlim.ac.uk", - "cern.ch", - "certificat2.com", - "certificate-transparency.org", - "certinomis.com", - "certinomis.fr", - "certsign.ro", - "certum.pl", - "ceruk.ac.uk", - "ceskeporno.cz", - "cetc.ac.uk", - "cetis.ac.uk", - "cetl4healthne.ac.uk", - "cetl4musicne.ac.uk", - "ceug.ac.uk", - "cex.io", - "cf-ipfs.com", - "cf.ac.uk", - "cfake.com", - "cfas.ac.uk", - "cfblob.com", - "cfd-tv.com", - "cfdesign.com", - "cfhks.org.hk", - "cfl.re", - "cfldcol.ac.uk", - "cfna.com", - "cfos.de", - "cfr.org", - "cfs.ac.uk", - "cftfc.com", - "cfwives.com", - "cgdepot.org", - "cgh.ac.uk", - "cglas.ac.uk", - "cgst.edu", - "ch9.ms", - "chace.ac.uk", - "championshipseriesleague.com", - "change.org", - "changeip.name", - "changeip.net", - "changeip.org", - "changing-arctic-ocean.ac.uk", - "changp.com", - "changsa.net", - "channel8news.sg", - "channelnewsasia.com", - "chaoex.com", - "chapm25.com", - "chargenow.com", - "chargenowusa.com", - "charlemagne-icon.ac.uk", - "charlemagneseurope.ac.uk", - "charleslyellcentre.ac.uk", - "charlestonroadregistry.com", - "charlotte-anime.jp", - "charmescorts.com", - "chart.ac.uk", - "charteredcollegeofteaching.ac.uk", - "charticulator.com", - "chase.ac.uk", - "chasestudy.ac.uk", - "chat.com", - "chatango.com", - "chatgpt.com", - "chatgptvideo.xyz", - "chatgptvideob.buzz", - "chatnook.com", - "chatsex.xxx", - "chatter.com", - "chatterbate.io", - "chaturbate.com", - "chatwhores.com", - "chatwhores.net", - "chatwhores.org", - "chatwhores.sex", - "chatwhores.tv", - "chcc.ac.uk", - "che.ac.uk", - "chea-nmidlands.ac.uk", - "chead.ac.uk", - "cheadlecollege.ac.uk", - "cheap-beats-by-dre.net", - "cheap-beatsbydre.com", - "cheap-nike.com", - "cheapbagshoes.com", - "cheapbeats.us", - "cheapbeats365.com", - "cheapbeats4sale.net", - "cheapbeatsaustraliasale.com", - "cheapbeatsbus.com", - "cheapbeatsbydr.com", - "cheapbeatsbydrdrepro.com", - "cheapbeatsbydre-au.com", - "cheapbeatsbydre99.com", - "cheapbeatsbydrefau.com", - "cheapbeatsbydremall.com", - "cheapbeatsbydremonster.com", - "cheapbeatsbydrenz.net", - "cheapbeatsbydreonsale.com", - "cheapbeatsbydreoutlet-nz.com", - "cheapbeatsbydreoutlet.com", - "cheapbeatsbydreoutlets2013.com", - "cheapbeatsbydresale.com", - "cheapbeatsbydreshop.com", - "cheapbeatsbydrestudioedition.com", - "cheapbeatsbydrestudioutlet.com", - "cheapbeatsdrdresolo.com", - "cheapbeatsdrestudios.com", - "cheapbeatsheadphone2014.com", - "cheapbeatsheadphones.us", - "cheapbeatsie.com", - "cheapbeatsla.com", - "cheapbeatssale4u.com", - "cheapbeatsshopbydre.com", - "cheapcustombeatsbydre.com", - "cheapdrdrebeats8.com", - "cheapdrdrebeatsca.com", - "cheapdrebeats8.net", - "cheaperbeatsbydresale.com", - "cheapestbeatsdrdre.com", - "cheapheadphonesland.com", - "cheapheadphonessale.com", - "cheapheadsetmall.com", - "cheapheadsetshop.com", - "cheapmonsterbeatsbydrdre.com", - "cheapmonsterbeatsheadsets.com", - "cheapmonsterbeatssale.com", - "cheapmonsterbeatsusa.us", - "cheapmonstersbeatsonsale.com", - "cheapnewbeatsbydre.com", - "cheapnikedunks.com", - "cheapnikeoutlet.com", - "cheapsalemonster.com", - "cheapshoesvip.com", - "cheapwireless04.com", - "cheapwirelessbeats.com", - "checkgfw.com", - "cheep.ac.uk", - "cheerwholesale.us", - "chegg.com", - "cheggcdn.com", - "cheia.ac.uk", - "cheib.ac.uk", - "chelmsford-college.ac.uk", - "chelmsford.ac.uk", - "chelt.ac.uk", - "cheltenham-he.ac.uk", - "chemequations.com", - "chemicalbiology.ac.uk", - "chemnetbase.com", - "chemreact.ac.uk", - "chenel.ac.uk", - "chengjuanseo.com", - "chengmingmag.com", - "chengrendouyin-app.com", - "chengrenshipin-app.com", - "chenguangcheng.com", - "chenpokong.com", - "chenpokong.net", - "chenpokongvip.com", - "cherry-tale.com", - "cherryasia.com", - "cherrybrady.com", - "cherrynudes.com", - "cherrypai.com", - "cherrypanpan.com", - "cherrypimps.com", - "cherrypornhd.com", - "cherrysave.com", - "cheshire.ac.uk", - "cheshirecolleges.ac.uk", - "cheshirehe.ac.uk", - "chest.ac.uk", - "chester.ac.uk", - "chesterfield.ac.uk", - "chesterfieldcollegegroup.ac.uk", - "chhongbi.org", - "chi-med.ac.uk", - "chi.ac.uk", - "chialumni.ac.uk", - "chianxv.buzz", - "chicagolandbmw.com", - "chicagoncmtv.com", - "chichester.ac.uk", - "chichestercollegegroup.ac.uk", - "chickstagram.com", - "chickteases.com", - "chicloud.ac.uk", - "chid.com.mm", - "chigroup.ac.uk", - "chihair-straightener.com", - "chikiporn.com", - "chilbolton.ac.uk", - "childrenofthe90s.ac.uk", - "chillingo.com", - "chimeforchange.org", - "china-autodesk.com", - "china-facebook.com", - "china-mmm.jp.net", - "china-mmm.net", - "china-mmm.sa.com", - "china-review.com.ua", - "china-week.com", - "china101.com", - "china18.org", - "china21.com", - "china21.org", - "china5000.us", - "chinaaffairs.org", - "chinaaid.me", - "chinaaid.net", - "chinaaid.org", - "chinaaid.us", - "chinachange.org", - "chinachannel.hk", - "chinacitynews.be", - "chinaclothesstore.com", - "chinacomments.org", - "chinaculturalvisitinghub.ac.uk", - "chinadecoding.com", - "chinadialogue.net", - "chinadigitaltimes.net", - "chinaeconomicreview.com", - "chinaelections.org", - "chinaeweekly.com", - "chinafile.com", - "chinafreepress.org", - "chinagate.com", - "chinageeks.org", - "chinagfw.org", - "chinagonet.com", - "chinagreenparty.org", - "chinahorizon.org", - "chinahrc.org", - "chinahush.com", - "chinainperspective.com", - "chinainterimgov.org", - "chinalaborwatch.org", - "chinalawandpolicy.com", - "chinalawtranslate.com", - "chinamule.com", - "chinamz.org", - "chinanewscenter.com", - "chinapost.com.tw", - "chinapress.com.my", - "chinarightsia.org", - "chinasex.com.es", - "chinasmile.net", - "chinasocialdemocraticparty.com", - "chinasoul.org", - "chinasucks.net", - "chinatimes.com", - "chinatimes.com.tw", - "chinatopsex.com", - "chinatown.com.au", - "chinatweeps.com", - "chinaway.org", - "chinaworker.info", - "chinaxchina.com", - "chinayouth.org.hk", - "chinayuanmin.org", - "chinchuqi-av.lat", - "chinese-empires.ac.uk", - "chinese-hermit.net", - "chinese-leaders.org", - "chinese-memorial.org", - "chinese-porn-videos.com", - "chinese-xnxx.com", - "chinesedaily.com", - "chinesedailynews.com", - "chinesedemocracy.com", - "chinesegay.org", - "chinesen.de", - "chinesenews.net.au", - "chinesepen.org", - "chineseradioseattle.com", - "chinesespanking.com", - "chinesetalks.net", - "chineseupress.com", - "chinesexxxporn.net", - "chingcheong.com", - "chinman.net", - "chipcoll.ac.uk", - "chipmong13g.buzz", - "chippcoll.ac.uk", - "chips.com", - "chipscohort.ac.uk", - "chithu.org", - "chiuni.ac.uk", - "chla3.com", - "chlamydia.ac.uk", - "chlg.ac.uk", - "chloesworld.com", - "chms.ac.uk", - "chobit.cc", - "chocam.com", - "chocolatey.org", - "choicereviews.org", - "chomp.com", - "chopinonline.ac.uk", - "chosun.com", - "chped.com", - "chrdnet.com", - "christianfreedom.org", - "christianstudy.com", - "christiantimes.org.hk", - "christredeemer.ac.uk", - "christusrex.org", - "christymarks.com", - "chrlawyers.hk", - "chrome.com", - "chromebook.com", - "chromecast.com", - "chromeenterprise.google", - "chromeexperiments.com", - "chromeos.dev", - "chromercise.com", - "chromestatus.com", - "chromium.org", - "chronicle.security", - "chroniclesec.com", - "chrysaliscourses.ac.uk", - "chs.ac.uk", - "cht.com.tw", - "chtf.org.tw", - "chuang-yen.org", - "chuangb15.xyz", - "chubbypornonly.com", - "chubold.com", - "chubun.com", - "chugd.ac.uk", - "chuizi.net", - "chuls.ac.uk", - "chuneo.xyz", - "chunja19.net", - "chuokoron.jp", - "chuporno.com", - "churchill.ac.uk", - "churchinhongkong.org", - "chushigangdrug.ch", - "chutuno.fun", - "chuzs2.xyz", - "chwr7s8u.com", - "chyoa.com", - "ci-en.jp", - "ci-en.net", - "cia.ac.uk", - "cia.gov", - "cias.ac.uk", - "ciattackers.com", - "cib.ac.uk", - "ciciai.com", - "cicl.ac.uk", - "cied.ac.uk", - "ciemap.ac.uk", - "cienen.com", - "cignet.ac.uk", - "cile.ac.uk", - "cilexlawschool.ac.uk", - "cilk.com", - "cilk.net", - "cim-laser.ac.uk", - "cimcomp.ac.uk", - "cindymovies.com", - "cineastentreff.de", - "cinemax.com", - "cinepornogratis.com", - "cios.org", - "ciota.ac.uk", - "cipfg.org", - "circlethebayfortibet.org", - "cirencester.ac.uk", - "cirius.ac.uk", - "cirosantilli.com", - "cirre.ac.uk", - "cirrus.ac.uk", - "cisban.ac.uk", - "cisco-returns.com", - "cisco-warrantyfinder.com", - "cisco.com", - "cisco.mobi", - "ciscoccservice.com", - "ciscoconnectcloud.com", - "ciscoconnectcloud.net", - "ciscoconnectcloud.org", - "ciscocontest.com", - "ciscoerate.com", - "ciscofax.com", - "ciscoinvestments.com", - "ciscojabbervideo.net", - "ciscokinetic.com", - "ciscoknowledgenetwork.com", - "ciscolearningsociety.org", - "ciscolearningsystem.com", - "ciscolive.com", - "cisconetapp.com", - "cisconetspace.com", - "cisconetspace.info", - "cisconetspace.net", - "ciscopartnermarketing.com", - "ciscopowercube.com", - "ciscopress.ch", - "ciscoprice.com", - "ciscoresearch.com", - "ciscosoftware.com", - "ciscospark.ca", - "ciscospark.com", - "ciscospark.jp", - "ciscotaccc.com", - "ciscotr.com", - "ciscoturk.net", - "ciscovideo.com", - "ciscowebseminars.com", - "cispaletter.com", - "cispaletter.org", - "citas-para-mayoresde50.ec", - "citasecuador.com", - "citizencn.com", - "citizenlab.ca", - "citizenlab.org", - "citizenpowerforchina.org", - "citizenscommission.hk", - "citizensradio.org", - "citrixandautodesk.com", - "citscapes.ac.uk", - "city-and-guilds.ac.uk", - "city-hentai.com", - "city-poly.ac.uk", - "city.ac.uk", - "city365.ca", - "city9x.com", - "cityandguilds.ac.uk", - "cityandguildsartschool.ac.uk", - "citybathcoll.ac.uk", - "citycol.ac.uk", - "citycollege.ac.uk", - "citycollegebrighton.ac.uk", - "citycollegepeterborough.ac.uk", - "citycollegeplymouth.ac.uk", - "citycollegesoton.ac.uk", - "cityheaven.net", - "citylab.com", - "citylit.ac.uk", - "cityofbristol.ac.uk", - "cityofglacol.ac.uk", - "cityofglasgowcollege.ac.uk", - "cityoflondonbschool.ac.uk", - "cityoflove.com", - "cityofoxford.ac.uk", - "cityplym.ac.uk", - "citypopulation.de", - "citysun.ac.uk", - "citytalk.tw", - "citytourgirls.com", - "cityuniversitybirmingham.ac.uk", - "ciu.ac.uk", - "civicparty.hk", - "civil3d.com", - "civilcc.com", - "civildisobediencemovement.org", - "civilhrfront.org", - "civiliangunner.com", - "civilmedia.tw", - "civilsoftware.net", - "civilwarpetitions.ac.uk", - "civisec.org", - "civitai.com", - "cixp.net", - "ciyuanjie.cc", - "cjb.net", - "ck101.com", - "ckcdn.com", - "ckck.fun", - "ckeene.ac.uk", - "ckss98.com", - "clackmannan-college.ac.uk", - "clacks.ac.uk", - "clacton.ac.uk", - "clad.ac.uk", - "clannad-movie.jp", - "claravenger.com", - "clarendon.ac.uk", - "clarin.ac.uk", - "clarionproject.org", - "clarivate.com", - "clasporno.org", - "classicalguitarblog.net", - "classicnike.com", - "classics.ac.uk", - "classymomsex.com", - "claude.ai", - "claudeusercontent.com", - "clb.org.hk", - "clc-london.ac.uk", - "clco.cc", - "clean-cooling.ac.uk", - "cleansite.biz", - "cleansite.info", - "cleansite.us", - "clearasil.us", - "clearflo.ac.uk", - "clearharmony.net", - "clearlinux.org", - "clearpool.finance", - "clearsurance.com", - "clearwisdom.net", - "clementine-player.org", - "cleveland.ac.uk", - "clh.ac.uk", - "click-url.com", - "clickandgovideo.ac.uk", - "clickedu.co.uk", - "clickme.net", - "cliffcollege.ac.uk", - "climate-lab-book.ac.uk", - "climate-server.com", - "climatechangewales.ac.uk", - "climateone.blogspot.co.id", - "climb.ac.uk", - "clinica-tibet.ru", - "clinical-videos.com", - "clinicalkey.com", - "clinicalnotes.ac.uk", - "clinicalskillscentre.ac.uk", - "clip16.com", - "clipcake.com", - "clipdrop.co", - "clipfish.de", - "cliphayho.com", - "cliphunter.com", - "clips4sale.com", - "clipsaoyai.com", - "clipsbai.com", - "clipseksi.com", - "clipsex.asia", - "clitgames.com", - "cln.ac.uk", - "cloakpoint.com", - "clojure.org", - "clonoth.com", - "closer.ac.uk", - "cloud.ac.uk", - "cloudapp.net", - "cloudappsecurity.com", - "cloudburstresearch.com", - "cloudc.one", - "cloudchoose.com", - "cloudcone.com", - "cloudcone.net", - "cloudconvert.com", - "cloudcraze.com", - "cloudcredibility.com", - "cloudflare-dns.com", - "cloudflare-ech.com", - "cloudflare-esni.com", - "cloudflare-gateway.com", - "cloudflare-ipfs.com", - "cloudflare-quic.com", - "cloudflare.com", - "cloudflare.net", - "cloudflare.tv", - "cloudflareaccess.com", - "cloudflareapps.com", - "cloudflarebolt.com", - "cloudflareclient.com", - "cloudflareinsights.com", - "cloudflareok.com", - "cloudflarepartners.com", - "cloudflareportal.com", - "cloudflarepreview.com", - "cloudflareresolve.com", - "cloudflaressl.com", - "cloudflarestatus.com", - "cloudflarestorage.com", - "cloudflarestream.com", - "cloudflaretest.com", - "cloudflarewarp.com", - "cloudfront.com", - "cloudfront.net", - "cloudfunctions.net", - "cloudhealthtech.com", - "cloudimage.io", - "cloudimg.io", - "cloudinary.com", - "cloudinary.net", - "cloudinsights.com", - "cloudlatex.io", - "cloudlive.com", - "cloudlock.com", - "cloudn.me", - "cloudokyo.cloud", - "cloudproxy.app", - "cloudrobotics.com", - "cloudsync-prod.s3.amazonaws.com", - "cloudvolumes.com", - "cloudworks.ac.uk", - "cloudyzgirl.com", - "cloupia.com", - "cloupia.net", - "clova.ai", - "clp.ac.uk", - "clrc.ac.uk", - "club1069.com", - "clubhouse.com", - "clubhouseapi.com", - "clubseventeen.com", - "clubsweethearts.com", - "clubtubes.com", - "clusterconnection.com", - "clydebank.ac.uk", - "clyp.it", - "clzz2.xyz", - "cmac.ac.uk", - "cmcn.org", - "cmcnet.ac.uk", - "cmcsm.ac.uk", - "cmegroup.com", - "cmhalq.com", - "cmi.org.tw", - "cmmedia.com.tw", - "cmoinc.org", - "cmpaas.com", - "cmpcp.ac.uk", - "cms-twdigitalassets.com", - "cms.ac.uk", - "cms.gov", - "cmu.ac.uk", - "cmu.edu", - "cmule.com", - "cmule.org", - "cmx.im", - "cn-proxy.com", - "cn6.eu", - "cna.com.tw", - "cnabc.com", - "cnbc.com", - "cnbcfm.com", - "cnbeta.com", - "cnbeta.com.tw", - "cnbetacdn.com", - "cncrivals.com", - "cnd.org", - "cnet.co.kr", - "cnet.com", - "cnet.de", - "cnetfrance.fr", - "cnex.org.cn", - "cnineu.com", - "cnitter.com", - "cnivogue.com.au", - "cnix-gov-cn.com", - "cnmd.ac.uk", - "cnn.com", - "cnn.io", - "cnn.it", - "cnnamador.com", - "cnnarabic.com", - "cnnikebrand.com", - "cnnlabs.com", - "cnnmoney.ch", - "cnnmoney.com", - "cnnmoneystream.com", - "cnnpolitics.com", - "cnpmjs.org", - "cnpolitics.org", - "cnproxy.com", - "cnshopin.com", - "cnwl.ac.uk", - "cnyes.com", - "cnzjp.xyz", - "co-op.ac.uk", - "co-opcollege.ac.uk", - "co-operative-university.ac.uk", - "co-operative.ac.uk", - "co-operativeuniversity.ac.uk", - "co.de", - "co.ph", - "co.tv", - "coat.co.jp", - "coatbridge.ac.uk", - "cobatt.com", - "cobinhood.com", - "cobra.ac.uk", - "cobrasearch.com", - "coccfea.ac.uk", - "cochina.co", - "cochina.org", - "cochrane-airways.ac.uk", - "cochrane.ac.uk", - "cochranelibrary.com", - "cock4stepmom.com", - "cockcroft.ac.uk", - "cockofhorse.com", - "cocksuckersguide.com", - "cocktailsandcocktalk.com", - "cockyboys.com", - "cocorees.ac.uk", - "cod-health.ac.uk", - "code.ac.uk", - "code.org", - "code1984.com", - "codeberg.org", - "codeberg.page", - "codecademy.com", - "codeforaliving.io", - "codeforces.com", - "codei.sh", - "codeish.co", - "codeish.io", - "codeplex.com", - "codeshare.io", - "codeskulptor.org", - "codespot.com", - "codethemicrobit.com", - "codima.ac.uk", - "codivorexxx.com", - "cods-nursing.ac.uk", - "coedcherry.com", - "coem.ac.uk", - "cof.ac.uk", - "cogc.ac.uk", - "coin2co.in", - "coinalyze.net", - "coinbase.com", - "coinbene.com", - "coindesk.com", - "coinegg.com", - "coinex.com", - "coingecko.com", - "coingi.com", - "coinglass.com", - "coinmap.org", - "coinmarketcap.com", - "coinone.co.kr", - "coinonecore.com", - "coinonecorp.com", - "coinrail.co.kr", - "cointiger.com", - "cointobe.com", - "coinut.com", - "coithienthai.com", - "coitustube.com", - "col-westanglia.ac.uk", - "col.ac.uk", - "colc.ac.uk", - "colcc.ac.uk", - "colch-inst.ac.uk", - "colchester.ac.uk", - "colchsfc.ac.uk", - "coleg-powys.ac.uk", - "colegaucymru.ac.uk", - "colegcymraeg.ac.uk", - "colegdewisant.ac.uk", - "colegelidyr.ac.uk", - "coleggwent.ac.uk", - "coleggwyrabertawe.ac.uk", - "colegialasdeverdad.com", - "colegialasreales.com", - "colegmorgannwg.ac.uk", - "colegpenybont.ac.uk", - "colegsirbenfro.ac.uk", - "colegsirgar.ac.uk", - "coliriodemacho.com.br", - "collabora.co.uk", - "collabora.com", - "collabora.org", - "collaboraoffice.com", - "collaborateni.ac.uk", - "collateralmurder.com", - "collateralmurder.org", - "collection-3d.com", - "collectionofbestporn.com", - "collective99.com", - "college-falmouth.ac.uk", - "collegecareearlyed.ac.uk", - "collegedevelopmentnetwork.ac.uk", - "collegejournal.com", - "collegeofosteopaths.ac.uk", - "collegeofteachers.ac.uk", - "collegeofteaching.ac.uk", - "collegepornonly.com", - "collegesexgames.com", - "collegesni.ac.uk", - "collegesscotland.ac.uk", - "collegeswales.ac.uk", - "collegewebsites.ac.uk", - "collemergencymed.ac.uk", - "colliderporn.com", - "collins.co.uk", - "collins.in", - "collyers.ac.uk", - "colombianas.webcam", - "colorfulpalette.org", - "colorfulstage.com", - "colorprotechnology.com", - "colpet.ac.uk", - "com.am", - "com.google", - "com.in", - "com.kn", - "com.uk", - "combinedhonours.ac.uk", - "comcast.net", - "comdotgame.com", - "come29.xyz", - "comedycentral.com", - "comefromchina.com", - "comet-study.ac.uk", - "cometotheduckside.com", - "comic-mega.me", - "comicbox.xyz", - "comico.tw", - "comics.ac.uk", - "comicscartoonporn.com", - "comicsporno.es", - "comicunivers.com", - "comicuniverse.org", - "comixzilla.com", - "comm-coll-hackney.ac.uk", - "commandandconquer.com", - "commandarms.com", - "comments.app", - "commentshk.com", - "commerceos.com", - "commnet.ac.uk", - "communistcrimes.org", - "communitychoicecu.com", - "como-hackearfacebook.com", - "comodo.com", - "comodo.net", - "comodoca.com", - "comodoca2.com", - "comodoca3.com", - "comodoca4.com", - "compaq.org", - "comparitech.com", - "compass-system.com", - "compass-systems.com", - "compass.is", - "competitionpolicy.ac.uk", - "compileheart.com", - "complex.ac.uk", - "componentkit.org", - "compose-spec.io", - "compress.to", - "compresspdf.new", - "computer.org", - "computing.ac.uk", - "computingreviews.com", - "compython.net", - "comscoreresearch.com", - "comsoc.org", - "conair.me", - "conan.xxx", - "concordat.ac.uk", - "concordats.ac.uk", - "conda.io", - "condenastcollege.ac.uk", - "condovercollege.ac.uk", - "conductrics.com", - "conductus.ac.uk", - "conel.ac.uk", - "confetti.ac.uk", - "conform.ac.uk", - "confuciusinstitute.ac.uk", - "congyu.moe", - "connaissancesfinancierespratiques.ca", - "connect-ed.ac.uk", - "connect-in-canada.com", - "connect.ac.uk", - "connectcommerce.hk", - "connectcommerce.info", - "connectcommerce.tv", - "connected-drive.com", - "connectedcommerce.com", - "connectedcommerce.tv", - "connectedeverything.ac.uk", - "connectionsacademy.com", - "connectionseducation.com", - "connectionslearning.com", - "connell.ac.uk", - "conoha.jp", - "conquerwithcharacter.com", - "conscrypt.com", - "conscrypt.org", - "conservatoiresuk.ac.uk", - "consilience.ac.uk", - "constitutionalism.solutions", - "constructware.com", - "consul.io", - "consultants.ac.uk", - "contactmagazine.net", - "contactossexoecuador.com", - "containersonaws.com", - "contechacademy.com", - "contemp-hist-arch.ac.uk", - "contentful.com", - "contest.com", - "convio.net", - "convrgencegame.com", - "coobay.com", - "cooer.su", - "cookiechoices.org", - "cookielaw.org", - "cookiepro.com", - "cool-comics.com", - "cool18.com", - "coolaler.com", - "coolder.com", - "coolinet.net", - "cooliphonecasesstore.com", - "coolloud.org.tw", - "coolmonster.net", - "coolncute.com", - "coolsexnew.com", - "coolstuffinc.com", - "coomer.party", - "coova.com", - "coova.net", - "coova.org", - "copac.ac.uk", - "copim.ac.uk", - "copior.ac.uk", - "copro.pw", - "cops.ac.uk", - "copstat.ac.uk", - "coqnu.com", - "corbinfisher.com", - "cordcloud.org", - "cordwainers.ac.uk", - "core.ac.uk", - "coreduo.com", - "coreextreme.com", - "corel.com", - "corel.net", - "coreldraw.app", - "coreldraw.com", - "corelstore.com", - "coreml.net", - "coreoptics.net", - "corepublishingsolutions.com", - "cornell-brown-penn.ac.uk", - "cornwall-acl.ac.uk", - "cornwall-vithform.ac.uk", - "cornwall.ac.uk", - "coronavirusnow.com", - "corpasnagaidhlig.ac.uk", - "corpmerchandise.com", - "corporatecashpassport.com", - "cortanaanalytics.com", - "cortanaskills.com", - "cortexrpg.com", - "corumcollege.com", - "cos-moe.com", - "cosc.ac.uk", - "coseelis.ac.uk", - "cosfans-tw.com", - "cosmosdb.info", - "cosmosdb.net", - "cosplay-jav.com", - "cosplayeromania.jp", - "cosplayjav.pl", - "cosplayporntube.com", - "cosplayworld.net", - "cospop.ac.uk", - "costco-static.com", - "costco.com", - "costcobusinessdelivery.com", - "cot.ac.uk", - "cotolia.com", - "cotr.ac.uk", - "cotweet.com", - "cougarsexmovies.com", - "coulsdon.ac.uk", - "councilofhealthcarescience.ac.uk", - "counsellingresearch.ac.uk", - "counter.social", - "countytraining.ac.uk", - "coup.ac.uk", - "coupang.com", - "coupangcdn.com", - "couplecam.co.uk", - "couriermail.com.au", - "coursehero.com", - "coursera-for-business.org", - "coursera.community", - "coursera.help", - "coursera.org", - "courtauld.ac.uk", - "cov.ac.uk", - "covcollege.ac.uk", - "cove4careinkent.ac.uk", - "coventry.ac.uk", - "coventrycollege.ac.uk", - "coventryuniversity.ac.uk", - "covid19-rx.org", - "covid19rx.org", - "covuni.ac.uk", - "covuniapps.ac.uk", - "cowboom.com", - "cowc.ac.uk", - "cowork.ac.uk", - "coze.com", - "cozydrdrebeats.com", - "cp44.net", - "cpan.org", - "cpc.ac.uk", - "cpd25.ac.uk", - "cpd4phd.ac.uk", - "cpdnoticeboard.ac.uk", - "cpedge.com", - "cpel.ac.uk", - "cphc.ac.uk", - "cpib.ac.uk", - "cpj.org", - "cppe.ac.uk", - "cppr.ac.uk", - "cptt.ac.uk", - "cpz.to", - "cq99.us", - "cqcorea.com", - "crabporn.com", - "crackle.com", - "craigslist.org", - "cral.ac.uk", - "cran.ac.uk", - "cranfield.ac.uk", - "crankplayer.com", - "crash.ac.uk", - "crates.io", - "craven-college.ac.uk", - "crawley-college.ac.uk", - "crawley.ac.uk", - "crazy-amateurs.com", - "crazyav.xyz", - "crazybook.xyz", - "crazycloud.ru", - "crazyfiction.xyz", - "crazylivecams.com", - "crazynovel.xyz", - "crazys.cc", - "crazyshit.com", - "crazyxxx3dworld.com", - "crazyxxx3dworld.net", - "crazyxxx3dworld.org", - "crazyxxxworld.com", - "crbug.com", - "crchina.org", - "crd-net.org", - "creaders.net", - "creadersnet.com", - "cream.ac.uk", - "creamasia.com", - "creamlemon.info", - "creampieforgranny.com", - "create.ac.uk", - "createspace.com", - "createwhatsnext.com", - "creativecloud.com", - "creativecommons.engineering", - "creativecommons.org", - "creativeindustries.ac.uk", - "creativelab5.com", - "creativepass.com", - "creativesdk.com", - "creativity-cetl.ac.uk", - "creatwhatsnext.com", - "crececonebay.com", - "creditcardsbay.com", - "creditlink-east.ac.uk", - "creds.ac.uk", - "cresc.ac.uk", - "crescentlearning.ac.uk", - "crest.ac.uk", - "crestresearch.ac.uk", - "crew.ac.uk", - "crfr.ac.uk", - "crh.ac.uk", - "cri.ac.uk", - "cric.ac.uk", - "cricbristol.ac.uk", - "crichton.ac.uk", - "crick.ac.uk", - "cricketcountry.com", - "cricklade.ac.uk", - "crisisresponse.google", - "cristyli.com", - "crit-staging.com", - "critica.ac.uk", - "critical.ac.uk", - "criticalfriend.ac.uk", - "criticaltheology.ac.uk", - "crmdynint-gcc.com", - "crmdynint.com", - "crocels.ac.uk", - "crocotube.com", - "cromite.org", - "cronton.ac.uk", - "crontonsixthform.ac.uk", - "crontonsixthformcollege.ac.uk", - "cropdiversity.ac.uk", - "cropyields.ac.uk", - "cros.ac.uk", - "crossborderexpansion.com", - "crossfire.co.kr", - "crossfitfirestone.com", - "crossmediapanel.com", - "crossthewall.net", - "crossvpn.net", - "crosswalk-project.com", - "crosswalk-project.net", - "crowdtangle.com", - "croxyproxy.com", - "croydon.ac.uk", - "croydon6f.ac.uk", - "croydonacl.ac.uk", - "croydonhe.ac.uk", - "croydonsec.ac.uk", - "crr.com", - "crrev.com", - "crsbi.ac.uk", - "crsp.ac.uk", - "crtsgfb1.top", - "crucial.com", - "crucible-cetl.ac.uk", - "cruel-furies.com", - "cruisse.ac.uk", - "crunchyroll.com", - "crustwebsites.net", - "crwdcntrl.net", - "crypto.com", - "cryptocompare.com", - "cryptographyengineering.com", - "crypton.co.jp", - "crysis.jp", - "crystalgunnsworld.com", - "crystalmiss.com", - "cs.co", - "cs4hs.com", - "csakporno.hu", - "csc.ac.uk", - "cscd.ac.uk", - "csct.ac.uk", - "cscuk.ac.uk", - "csd3.ac.uk", - "csdparty.com", - "csec.ac.uk", - "cser.ac.uk", - "cserge.ac.uk", - "csg.ac.uk", - "cshive.com", - "cshl.ac.uk", - "csifund.org", - "csis-prod.s3.amazonaws.com", - "csis.org", - "csm.ac.uk", - "csmen.ac.uk", - "csmonitor.com", - "csn-cetl.ac.uk", - "csrankings.org", - "csrf.ac.uk", - "csrs.ac.uk", - "csrw.ac.uk", - "cssd.ac.uk", - "cstatic.net", - "csu.ac.uk", - "csuchen.de", - "csw.org.uk", - "ct-toolkit.ac.uk", - "ct.org.tw", - "cta-observatory.ac.uk", - "ctan.org", - "ctao.org", - "ctc.ac.uk", - "ctcrm.ac.uk", - "ctee.com.tw", - "ctfassets.net", - "ctfriend.net", - "ctg.ac.uk", - "ctitv.com.tw", - "ctk.ac.uk", - "ctkaquinas.ac.uk", - "ctkemmanuel.ac.uk", - "ctksfc.ac.uk", - "ctkstmarys.ac.uk", - "ctotires.com", - "ctowc.org", - "ctr-math-phys.ac.uk", - "cts.ac.uk", - "cts.com.tw", - "cttoolkit.ac.uk", - "ctv.com.tw", - "ctwant.com", - "ctyun.online", - "cubo.ac.uk", - "cuc.ac.uk", - "cuckfilmswifefuck.com", - "cuckold69.com", - "cuckoldfuck.com", - "cuckoldingwifey.com", - "cuckoldinterracialporn.com", - "cuckoldinterracialwife.com", - "cuckoldplacetube.com", - "cuckoldporntube.com", - "cuckoldwifesex.com", - "cuckoldwifesexxx.com", - "cuckoldwifetube.com", - "cuckporn.com", - "cuckvideos.com", - "cuckwatchingwife.com", - "cuckwimp.com", - "cudah.ac.uk", - "cudassh.ac.uk", - "cudos.ac.uk", - "cue.ac.uk", - "cuebic.biz", - "cuffiesaldi.com", - "cuhk.edu.hk", - "cuhkacs.org", - "cuhop.ac.uk", - "cuihua.org", - "cuinc.tw", - "cuiweiping.net", - "cukas.ac.uk", - "culham.ac.uk", - "cullenproject.ac.uk", - "cultiva.ac.uk", - "cultoferotica.com", - "cultura-kolomna.ru", - "culture.tw", - "cultureofthecountryside.ac.uk", - "cum4k.cc", - "cumasianporn.com", - "cumberlandlodge.ac.uk", - "cumbernauld.ac.uk", - "cumbria.ac.uk", - "cumbriacad.ac.uk", - "cumbriahigherlearning.ac.uk", - "cumlouder.com", - "cumshotlist.com", - "cumswappingsis.com", - "cumteenporn.com", - "cunhua.pics", - "cuntcrack.com", - "cuntempire.com", - "cuntwars.com", - "cunw.ac.uk", - "cup.com.hk", - "cups.org", - "curator.ac.uk", - "curbed.com", - "curdev-fe-ni.ac.uk", - "curioustravellers.ac.uk", - "curl.ac.uk", - "currently.com", - "currently.net", - "currenttime.tv", - "cursecdn.com", - "curseforge.com", - "cursor-cdn.com", - "cursor.com", - "cursor.sh", - "cursorapi.com", - "curve.fi", - "curvefish.com", - "curvybbwwives.com", - "curvyerotic.com", - "cusp.ac.uk", - "cusp.hk", - "cusplondon.ac.uk", - "custom-iphonecase.com", - "custombeatsbydrebuy.com", - "custombeatsdeals.com", - "custombeatsforcheap.com", - "custombeatsny.com", - "custombeatssbydreus.com", - "customdrdrebeats.com", - "customercontrolpanel.de", - "customizedbeatbydre.com", - "customizedbeatsbydre.com", - "customizedbeatsdre.com", - "customnikeshoes.com", - "cusu.hk", - "cutg.ac.uk", - "cutscenes.net", - "cutt.ly", - "cuv.ac.uk", - "cuwm.ac.uk", - "cvcp.ac.uk", - "cvma.ac.uk", - "cvr.ac.uk", - "cvs.ac.uk", - "cvu.ac.uk", - "cw.com.tw", - "cwa.ac.uk", - "cwb.gov.tw", - "cwc.ac.uk", - "cwcams.com", - "cwcfe.ac.uk", - "cwrc.ac.uk", - "cws.ac.uk", - "cy22.tv", - "cyber-bay.info", - "cyber-bay.org", - "cyber-college.ac.uk", - "cyberctm.com", - "cyberghostvpn.com", - "cybermondaybeats4sale.com", - "cybersecurity-cdt.ac.uk", - "cybersecuritycdt.ac.uk", - "cybertrust.co.jp", - "cybertrust.ne.jp", - "cyberx.com", - "cyclops-network.ac.uk", - "cygames.co.jp", - "cygames.jp", - "cygwin.com", - "cylink.pro", - "cylink0122.icu", - "cym.ac.uk", - "cymdeithasddysgedig.ac.uk", - "cymdeithasddysgedigcymru.ac.uk", - "cymoedd.ac.uk", - "cymru.ac.uk", - "cynghrairstrategolaberbangor.ac.uk", - "cynscribe.com", - "cython.org", - "cytode.us", - "cz.cc", - "czechav.com", - "czechbiporn.com", - "czechcasting.com", - "czechhunter.com", - "czechlesbians.com", - "czechmassage.com", - "czechstreets.com", - "czechvr.com", - "czechwifeswap.com", - "cztv117.shop", - "d-fukyu.com", - "d-trust.net", - "d-upp.com", - "d0z.net", - "d100.net", - "d1b183sg0nvnuh.cloudfront.net", - "d1c37gjwa26taa.cloudfront.net", - "d1g1f25tn8m2e6.cloudfront.net", - "d1k2us671qcoau.cloudfront.net", - "d1m7jfoe9zdc1j.cloudfront.net", - "d1mhjrowxxagfy.cloudfront.net", - "d1oca24q5dwo6d.cloudfront.net", - "d1w2poirtb3as9.cloudfront.net", - "d1xhnb4ptk05mw.cloudfront.net", - "d1ymi26ma8va5x.cloudfront.net", - "d29vzk4ow07wi7.cloudfront.net", - "d2aba1wr3818hz.cloudfront.net", - "d2anahhhmp1ffz.cloudfront.net", - "d2bay.com", - "d2dylwb3shzel1.cloudfront.net", - "d2e2de1etea730.cloudfront.net", - "d2mrry2to5rg.com", - "d2nvs31859zcd8.cloudfront.net", - "d2pass.com", - "d2um2qdswy1tb0.cloudfront.net", - "d2vjef5jvl6bfs.cloudfront.net", - "d2xmjdvx03ij56.cloudfront.net", - "d33wubrfki0l68.cloudfront.net", - "d36nr0u3xmc4mm.cloudfront.net", - "d3aqoihi2n8ty8.cloudfront.net", - "d3c27h4odz752x.cloudfront.net", - "d3c33hcgiwev3.cloudfront.net", - "d3rhr7kgmtrq1v.cloudfront.net", - "d3vd9lfkzbru3h.cloudfront.net", - "d6d4ismr40iw.cloudfront.net", - "d6tizftlrpuof.cloudfront.net", - "da-files.com", - "da3dsoul.dev", - "daboja18.com", - "dabr.co.uk", - "dabr.eu", - "dabr.me", - "dabr.mobi", - "dacebook.com", - "dachix.com", - "dadazim.com", - "daddyslilangel.com", - "dadi360.com", - "dafabet.com", - "dafagood.com", - "dafahao.com", - "dafanhao-app.com", - "dafni.ac.uk", - "dafoh.org", - "daft.sex", - "daftporn.com", - "daftsex-hd.com", - "daftsex.com", - "dagelijksestandaard.nl", - "dagfs.com", - "daidostup.ru", - "dailidaili.com", - "dailybasis.com", - "dailym.ai", - "dailymail.co.uk", - "dailymail.com", - "dailymail.com.au", - "dailymail.dk", - "dailymailonline.com", - "dailymotion.com", - "dailyporn.club", - "dailysabah.com", - "dailytelegraph.com.au", - "dailyview.tw", - "daindianporn.com", - "daiphapinfo.net", - "dajiyuan.com", - "dajiyuan.de", - "dajiyuan.eu", - "dalailama-archives.org", - "dalailama.com", - "dalailama.mn", - "dalailama.ru", - "dalailama80.org", - "dalailamacenter.org", - "dalailamafellows.org", - "dalailamafilm.com", - "dalailamafoundation.org", - "dalailamahindi.com", - "dalailamainaustralia.org", - "dalailamajapanese.com", - "dalailamaprotesters.info", - "dalailamaquotes.org", - "dalailamatrust.org", - "dalailamavisit.org.nz", - "dalailamaworld.com", - "dalianmeng.org", - "daliulian.org", - "damduc.org", - "damplips.com", - "dance-archives.ac.uk", - "dandalinvoa.com", - "dandanzan.cc", - "danemarket.com", - "danke4china.net", - "danmarkbeatsbydrdre.com", - "danskpornofilm.com", - "dansmovies.com", - "danwei.org", - "daoc.net", - "daolan.net", - "daozhongxing.org", - "daresbury.ac.uk", - "daretoku-eromanga.info", - "darivoa.com", - "darkageofcamelot.com", - "darkcategories.com", - "darknaija.com", - "darkness-risen.com", - "darknessporn.com", - "darknun.com", - "darksidemagazine.com", - "darktech.org", - "darktoy.net", - "darlington.ac.uk", - "darlingtonlearningandskills.ac.uk", - "darpa.mil", - "darrenliuwei.com", - "dart.dev", - "dartington.ac.uk", - "dartlang.org", - "dartpad.dev", - "darts.ac.uk", - "dartsearch.net", - "darwin.ac.uk", - "darwindimensions.com", - "darwinproject.ac.uk", - "darwinsource.com", - "darwinsource.org", - "darwinsourcecode.com", - "dasaob.online", - "dasg.ac.uk", - "dash-1.ac.uk", - "dashlane.com", - "dashwood360.com", - "dassh.ac.uk", - "dastanhisexy.cc", - "dastrassi.org", - "dat.foundation", - "data-archive.ac.uk", - "data-intensive-cdt.ac.uk", - "data-service.ac.uk", - "data-vocabulary.org", - "data.ac.uk", - "data.com", - "data.gov.tw", - "datafuturesalphapilot.ac.uk", - "datagrid.ac.uk", - "datalabour.com", - "dataliberation.org", - "datalore.io", - "datasheets360.com", - "datashield.ac.uk", - "datasig.ac.uk", - "datawav.club", - "date2night.xyz", - "daum.net", - "daumcdn.net", - "daumkakao.io", - "daumpcbang.com", - "davcoll.ac.uk", - "daventrylearningpartnership.ac.uk", - "david-kilgour.com", - "david-laserscanner.com", - "davidlewis.ac.uk", - "dawangidc.com", - "dawngate.com", - "dawngatechronicles.com", - "daxa.cn", - "dayabook.com", - "daylenerio.com", - "daylife.com", - "daytonbmw.com", - "daytontrucktires.com", - "dazn-api.com", - "dazn.com", - "dazndn.com", - "db.tt", - "dba.dk", - "dbc.hk", - "dbgjd.com", - "dc-msedge.net", - "dca.ac.uk", - "dcard.cc", - "dcard.io", - "dcard.link", - "dcard.tw", - "dcc.ac.uk", - "dcd.ac.uk", - "dcdp.ac.uk", - "dcg.ac.uk", - "dcmilitary.com", - "dct.ac.uk", - "dctbeatsbydre.com", - "ddacn6pr5v0tl.cloudfront.net", - "ddc.com.tw", - "ddd-smart.net", - "ddff66.com", - "ddff77.com", - "ddg.co", - "ddg.gg", - "ddh.gg", - "ddhw.info", - "ddi.ac.uk", - "dditsadn.com", - "dditscdn.com", - "ddns.info", - "ddns.me.uk", - "ddns.mobi", - "ddns.ms", - "ddns.name", - "ddns.net", - "ddns.us", - "de-montfort.ac.uk", - "de-sci.org", - "de1lib.org", - "deadline.com", - "deadspacegame.com", - "deafandcreative.ac.uk", - "deafheritagenetwork.ac.uk", - "deaftone.com", - "dealbay.com", - "dealerspeed.net", - "dealsbeatsblackfriday.com", - "dealtime.com", - "dealtree.org", - "deansofscience.ac.uk", - "dearne-coll.ac.uk", - "deas.ac.uk", - "deasians.com", - "debank.com", - "debian.org", - "debs.ac.uk", - "debug.com", - "debugproject.com", - "dec.ac.uk", - "decentr.net", - "dechamora.com", - "deck.ly", - "decodet.co", - "decorativemodels.com", - "decrypt.day", - "decymru.ac.uk", - "deed.ac.uk", - "deepdiscount.com", - "deeper.com", - "deepfake-porn.com", - "deepfakeporn.net", - "deepfreeze.co.uk", - "deepfreeze.com", - "deepfreeze.com.br", - "deepfreeze.eu", - "deepfreeze.net", - "deepfreeze.tech", - "deeping.ac.uk", - "deepl.com", - "deepmind.com", - "deepmind.google", - "deeside.ac.uk", - "deezer.com", - "defac.ac.uk", - "defenceacademy.ac.uk", - "definebabe.com", - "definefetish.com", - "degruyter.com", - "deja.com", - "delcam-ams.com", - "delcam-electrode.com", - "delcam-na.com", - "delcam-robotics.com", - "delcam-services.com", - "delcam.com", - "delcamconsulting.com", - "delcamforsolidworks.com", - "delcamna.com", - "delcamp.net", - "delcamtv.com", - "delcamuniversity.com", - "delcamusa.com", - "delicious.com", - "delicious.com.au", - "dell-brand.com", - "dell.com", - "dellcdn.com", - "dellsupportcenter.com", - "delltechnologies.com", - "deluxe.com.hk", - "delvenetworks.com", - "demand.ac.uk", - "demandware.com", - "demarco-archive.ac.uk", - "demdex.net", - "dementianet.ac.uk", - "dementiaresearchinstitute.ac.uk", - "democracy.earth", - "democrats.org", - "demonoid.is", - "demoprint.com", - "demos.ac.uk", - "demosisto.hk", - "den.ac.uk", - "dengeamerika.com", - "dengiamerika.com", - "deno.com", - "deno.land", - "dentalhypotheses.com", - "dentalschoolscouncil.ac.uk", - "dentpostgradwales.ac.uk", - "dependabot.com", - "depositphotos.com", - "deps.dev", - "deps.info", - "derby-college.ac.uk", - "derby.ac.uk", - "derbyals.ac.uk", - "derbycollege.ac.uk", - "derbyonline.ac.uk", - "derbyshire.ac.uk", - "derekhsu.homeip.net", - "deribit.com", - "derpibooru.org", - "derweb.ac.uk", - "derwen.ac.uk", - "derwencollege.ac.uk", - "derwentside.ac.uk", - "desc.se", - "descargasgay.com", - "desertbmw.com", - "design-ledrev.com", - "design-ledrevolution.com", - "design.google", - "designeriphonescases.com", - "designledrevolution.com", - "designsformovement.com", - "designxml.com", - "designxml.net", - "desihoes.com", - "desiporn.tube", - "desipornfilms.com", - "desipro.de", - "desiraesworld.com", - "desiresecrets.com", - "desk.com", - "desktopmovie.com", - "desktopmovie.net", - "desktopmovie.org", - "desktopmovies.net", - "desktopmovies.org", - "dessci.com", - "destinationbim.com", - "destroy-china.jp", - "detaliczny.com", - "detentiongirls.com", - "detroitnews.com", - "dettol-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.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.ru", - "dettolarabia.com", - "dettolcleannaija.com", - "dettolsitishield.co.in", - "dettolthailand.com", - "deutsch-sexfilme.com", - "deutsche-pornos-kostenlos.xxx", - "deutsche-welle.de", - "deutschepornos-kostenlos.net", - "deutschsex.com", - "dev-guardianapis.com", - "dev-theguardian.com", - "dev.to", - "devcon.org", - "developebp.ac.uk", - "developer-advisor.com", - "developria.com", - "deviantart.com", - "deviantart.net", - "deviantclip.com", - "device-manager.us", - "devilsfilm.com", - "devio.us", - "devm2m.com", - "devolution.ac.uk", - "devopsassessment.net", - "devopsms.com", - "devpn.com", - "devsitetest.how", - "devtools-paypal.com", - "devv.ai", - "dewcol.ac.uk", - "dewitwithdurex.com", - "dewsbury.ac.uk", - "dexterhorn.com", - "dezyred.com", - "dfas.mil", - "dfn.org", - "dfp6rglgjqszk.cloudfront.net", - "dgaqp.com", - "dgeft87wbj63p.cloudfront.net", - "dgg.gg", - "dghe.ac.uk", - "dgwav.com", - "dh44.lol", - "dharamsalanet.com", - "dharmakara.net", - "dhcp.biz", - "dhi.ac.uk", - "dhlestudio.com.co", - "diabetes-healthnet.ac.uk", - "diablo3.com", - "diabloimmortal.com", - "dialga.com", - "dialogflow.com", - "diamantewebcam.com", - "diamm.ac.uk", - "diamond.ac.uk", - "diamondgirls.co.uk", - "diamondgirlstudio.com", - "dianapost.com", - "dianepoppos.com", - "diaoyuislands.org", - "diasporas.ac.uk", - "dice.se", - "dicela.com", - "dicela.net", - "dickeomas.com", - "dickhardon.com", - "dickwhiteacademy.ac.uk", - "dictate.ms", - "didce.com", - "diddykongracing.com", - "didet.ac.uk", - "didilist.com", - "dierectv.com", - "dietandhealth.ac.uk", - "difangwenge.org", - "dify.ai", - "digg.com", - "digicert-cn.com", - "digicert-validation.com", - "digicert.com", - "digiland.tw", - "digimap.ac.uk", - "digisfera.com", - "digital-anime.com", - "digital-id.ch", - "digital-rb.com", - "digitalassetlinks.org", - "digitalcertvalidation.com", - "digitalcreativity.ac.uk", - "digitaldesire.com", - "digitalhub.com", - "digitalid.ch", - "digitallifespan.ac.uk", - "digitalnomadsproject.org", - "digitalocean.com", - "digitaloceanspaces.com", - "digitalpack.com", - "digitalplayground.com", - "digitalplaygroundnetwork.com", - "digitalprototyping.com", - "digitalscholarship.ac.uk", - "digitalsocialresearch.ac.uk", - "digitaltransformations.ac.uk", - "digitaltrends.com", - "digitisingscotland.ac.uk", - "digitop.ac.uk", - "digitrans.ac.uk", - "digitwin.ac.uk", - "diigo.com", - "dilber.se", - "dilcdn.com", - "dilstoncollege.ac.uk", - "dingchin.com.tw", - "dinotube.com", - "dipity.com", - "dippam.ac.uk", - "dirac.ac.uk", - "dirctv.com", - "direcpath.com", - "direcpath.net", - "directcreative.com", - "directtv-deals.tv", - "directtv-dish.com", - "directtv.net", - "directtvdeals.tv", - "directtvreviews.com", - "directv-4-you.com", - "directv-newyork.com", - "directv.com", - "directvadsales.com", - "directvatlantaga.com", - "directvboston.com", - "directvbundles.com", - "directvbusiness.com", - "directvbusinessmarket.com", - "directvcincinnatioh.com", - "directvcinema.com", - "directvconnect.com", - "directvcookevilletn.com", - "directvcrossvilletn.com", - "directvdealer.com", - "directvdeals.com", - "directvdealsnow.com", - "directvdsl.tv", - "directvforhotels.com", - "directvgrandslam.com", - "directvhouston.com", - "directvinternet.com", - "directvkentucky.com", - "directvlebanontn.com", - "directvlosangeles.com", - "directvmetropolisil.com", - "directvmonitoring.com", - "directvmurfreesborotn.com", - "directvnewhampshire.com", - "directvnow.com", - "directvoffercodes.com", - "directvonline.com", - "directvplans.com", - "directvpomise.com", - "directvpromise.com", - "directvpromotions.com", - "directvrebate.com", - "directvrichmond.com", - "directvsavings.com", - "directvsports.com", - "directvsundayticket.com", - "direectv.com", - "diretv.com", - "dirty.games", - "dirtyasiantube.com", - "dirtydoglinks.com", - "dirtyfarmer.com", - "dirtyflix.com", - "dirtyhomefuck.com", - "dirtyleague.com", - "dirtyonline.com", - "dirtypornvids.com", - "dirtyscat.org", - "dirtyshack.com", - "dirtyship.com", - "dis.gd", - "disability.ac.uk", - "disabilitytoolkits.ac.uk", - "disco-api.com", - "discoins.com", - "discomax.com", - "disconnect.me", - "discord-activities.com", - "discord.co", - "discord.com", - "discord.design", - "discord.dev", - "discord.gg", - "discord.gift", - "discord.gifts", - "discord.media", - "discord.new", - "discord.store", - "discord.tools", - "discordactivities.com", - "discordapp.com", - "discordapp.io", - "discordapp.net", - "discordcdn.com", - "discordmerch.com", - "discordpartygames.com", - "discordsays.com", - "discordstatus.com", - "discountbeatsbydre-us.com", - "discountbeatsstore.com", - "discountedporn.com", - "discountporn.club", - "discover.ac.uk", - "discovereconomics.ac.uk", - "discovery.ac.uk", - "discoveryinvestigations.ac.uk", - "discoveryplus.com", - "discreet.com", - "discuss.com.hk", - "discuss4u.com", - "discussionsapple.com", - "dish.com", - "dishworld.com", - "disinhe.ac.uk", - "disk.yandex", - "disney-asia.com", - "disney-discount.com", - "disney-plus.net", - "disney-studio.com", - "disney-studio.net", - "disney.asia", - "disney.be", - "disney.bg", - "disney.ca", - "disney.ch", - "disney.co.il", - "disney.co.jp", - "disney.co.kr", - "disney.co.th", - "disney.co.uk", - "disney.co.za", - "disney.com", - "disney.com.au", - "disney.com.br", - "disney.com.hk", - "disney.com.tw", - "disney.cz", - "disney.de", - "disney.dk", - "disney.es", - "disney.fi", - "disney.fr", - "disney.gr", - "disney.hu", - "disney.id", - "disney.in", - "disney.io", - "disney.it", - "disney.my", - "disney.nl", - "disney.no", - "disney.ph", - "disney.pl", - "disney.pt", - "disney.ro", - "disney.ru", - "disney.se", - "disney.sg", - "disneyadsales.com", - "disneyarena.com", - "disneyaulani.com", - "disneybaby.com", - "disneycareers.com", - "disneychannelonstage.com", - "disneychannelroadtrip.com", - "disneycruisebrasil.com", - "disneyenconcert.com", - "disneyhentai.com", - "disneyiejobs.com", - "disneyinflight.com", - "disneyinternational.com", - "disneyinternationalhd.com", - "disneyjunior.com", - "disneyjuniortreataday.com", - "disneylatino.com", - "disneymagicmoments.co.il", - "disneymagicmoments.co.uk", - "disneymagicmoments.co.za", - "disneymagicmoments.de", - "disneymagicmoments.es", - "disneymagicmoments.fr", - "disneymagicmoments.gen.tr", - "disneymagicmoments.gr", - "disneymagicmoments.it", - "disneymagicmoments.pl", - "disneymagicmomentsme.com", - "disneyme.com", - "disneymeetingsandevents.com", - "disneymovieinsiders.com", - "disneymusicpromotion.com", - "disneynewseries.com", - "disneynow.com", - "disneypeoplesurveys.com", - "disneyplus.com", - "disneyredirects.com", - "disneysrivieraresort.com", - "disneystore.com", - "disneystreaming.com", - "disneysubscription.com", - "disneytickets.co.uk", - "disneyturkiye.com.tr", - "disneytvajobs.com", - "disneyworld-go.com", - "disp.cc", - "disqus.com", - "disquscdn.com", - "disqusservice.com", - "distillate.ac.uk", - "distinct.ac.uk", - "dit-inc.us", - "divas.com.uy", - "diversityuk.ac.uk", - "diyarbakirescort.com", - "diyuser.buzz", - "dizhidizhi.com", - "dizhuzhishang.com", - "djangosnippets.org", - "djkav.mom", - "djorz.com", - "djreprints.com", - "dkbeatsbydre.com", - "dkcloud.cc", - "dkk37.com", - "dkr.com", - "dkrecttv.com", - "dl-iphone.com", - "dl-laby.jp", - "dl.ac.uk", - "dl4d.ac.uk", - "dlap001.xyz", - "dlap301.com", - "dldlinks.com", - "dldshare.net", - "dlercloud.com", - "dlercloud.me", - "dlercloud.org", - "dleris.best", - "dlfacebook.com", - "dlhe.ac.uk", - "dlive.tv", - "dls.ac.uk", - "dlsite.com", - "dlsite.com.tw", - "dlsite.jp", - "dlsitenews.com", - "dlsitestudio.com", - "dlyoutube.com", - "dm-event.net", - "dm530.net", - "dmarcnetworks.com", - "dmc.nico", - "dmcdn.net", - "dmed.technology", - "dmgmediaprivacy.co.uk", - "dmhy.org", - "dml.ac.uk", - "dmm-extension.com", - "dmm.co.jp", - "dmm.com", - "dmmapis.com", - "dmmrex.com", - "dmu.ac.uk", - "dmuk.ac.uk", - "dna-network.ac.uk", - "dna.ac.uk", - "dnaav.com", - "dnai.in", - "dnaindia.com", - "dnaspaces.io", - "dncolleges.ac.uk", - "dndbeyond.com", - "dns-dns.com", - "dns-stuff.com", - "dns.google", - "dns.sb", - "dns04.com", - "dns05.com", - "dns1.us", - "dns2.us", - "dns2go.com", - "dnscrypt.org", - "dnset.com", - "dnsrd.com", - "dnssec.net", - "dnsvisa.com", - "dnvod.tv", - "dnvodcdn.me", - "do.co", - "dobbyporn.com", - "dobendan.de", - "doceapower.com", - "docker.com", - "docker.io", - "dockerizer.com", - "docleradn.com", - "doclercdn.com", - "docs.com", - "docs.new", - "docs.rs", - "doctor-videos.com", - "doctorvoice.org", - "documentforce.com", - "documentingreality.com", - "docusend.ac.uk", - "dodgersexcartoons.com", - "dodi-repacks.download", - "dodi-repacks.site", - "dodv.com", - "doeda.com", - "dogatch.jp", - "dogcumshot.net", - "dogecoin.com", - "dogfart.com", - "dogfartnetwork.com", - "dogmovie.net", - "dogofcum.com", - "dogslife.ac.uk", - "dogspics.net", - "doi.info", - "doi.org", - "doitpoms.ac.uk", - "dojin-dl.com", - "dojin.com", - "dojindb.net", - "dojinmanga.net", - "dojinwatch.com", - "dok-forum.net", - "dokusho-ojikan.jp", - "dolc.de", - "dolf.org.hk", - "dollarfotoclub.com", - "dollarphotoclub.com", - "dollarphotosclub.com", - "dollf.com", - "dolphiners.com", - "domain.club.tw", - "domain.glass", - "domains.google", - "domaintoday.com.au", - "dombosco.com.br", - "domesticabuserisk.ac.uk", - "domywife.com", - "don.ac.uk", - "donatecarsoh.org", - "doncaster.ac.uk", - "donga.com", - "dongtaiwang.com", - "dongtaiwang.net", - "dongyangjing.com", - "donkeykongcountryreturns.com", - "donkparty.com", - "donmai.us", - "donpornogratis.com", - "donsnaughtymodels.com", - "dontbubble.us", - "dontfilter.us", - "dontmovetochina.com", - "donttrack.us", - "doodhwali.com", - "doom.com", - "doom9.org", - "dopaminegirl.com", - "dorjeshugden.com", - "dorset-acl.ac.uk", - "dorset-al.ac.uk", - "doseofporn.com", - "dot-mac.de", - "dot.net", - "dotcernpilot.info", - "dotdeb.org", - "dotfacebook.com", - "dotfacebook.net", - "dotfreesex.com", - "dotherex.com", - "dothq.org", - "dotmac.de", - "dotplane.com", - "dotrural.ac.uk", - "dotsub.com", - "dotvpn.com", - "doub.io", - "doubibackup.com", - "doubleclick-cn.net", - "doubleclick.cn", - "doubleclick.com", - "doubleclick.net", - "doublethinklab.org", - "doubmirror.cf", - "douchi.space", - "doufurufabu.xyz", - "dougscripts.com", - "douhokanko.net", - "doujin-eromanga.com", - "doujin-freee.com", - "doujin-info.net", - "doujin-night.com", - "doujincafe.com", - "doujinfree.com", - "doujinland.info", - "doujinnomori.com", - "doujins.com", - "doure.net", - "douwriteright.com", - "douya.org", - "douyintt10.me", - "douzinnsi-eromannga.com", - "dovercollege.ac.uk", - "dovertechnicalcollege.ac.uk", - "dowei.org", - "dowjones.com", - "dowjones.io", - "dowjoneson.com", - "download.com", - "downloadpass.com", - "downloadsforipod.com", - "dphk.org", - "dpoc.ac.uk", - "dpp.org.tw", - "dpr.info", - "dpscitt.ac.uk", - "dqrpb9wgowsf5.cloudfront.net", - "draftjs.org", - "dragonage.com", - "dragonagekeep.com", - "dragonagemovie.com", - "dragonex.io", - "dragonhentai.net", - "dragonip.ac.uk", - "dragoniscoming.com", - "dragonsprings.org", - "drainage.com", - "drakemarineinstitute.ac.uk", - "drawnevidence.ac.uk", - "drbdsmporn.com", - "drbeatsukmart.com", - "drbizzaro.com", - "drbl.in", - "drdre-beats.com", - "drdrebeats-chen.com", - "drdrebeats-headphone.com", - "drdrebeats-usa.com", - "drdrebeatsale.com", - "drdrebeatsbillig.com", - "drdrebeatsdesale.com", - "drdrebeatsdiscount.com", - "drdrebeatsforu.com", - "drdrebeatsretail2013.com", - "drdrebeatssale7.com", - "drdrebeatsuk.com", - "drdrefnac.com", - "drdreheadphonebeats.com", - "drdreheadphonekey.com", - "drdreheadphonesusstore.com", - "drdremonster-beats.com", - "drdremonsterdre.com", - "drdreprobeatssale.com", - "dream-cdt.ac.uk", - "dreamamateurs.com", - "dreambmw.ca", - "dreamforce.com", - "dreammovies.com", - "dreamteamfc.com", - "dreamtoplay.com", - "dreamworks.com", - "drebeats-australia.com", - "drebeats-france.com", - "drebeats-monster.com", - "drebeats-monsteraustralia.com", - "drebeats-monsterusa.com", - "drebeats-singapore.com", - "drebeats-singapore.net", - "drebeats-singaporecheap.com", - "drebeats-singaporecheap.net", - "drebeats-solo.com", - "drebeats-studio.com", - "drebeatsaustralia-cheap.com", - "drebeatsaustralia-cheap.net", - "drebeatsbuy.com", - "drebeatsbydreoutlet.com", - "drebeatscanada.com", - "drebeatsdeutschland.net", - "drebeatsforsaleus.com", - "drebeatsheadphones-nz.com", - "drebeatshome.com", - "drebeatsoldes.com", - "drebeatsoutletstore.com", - "drebeatspill.com", - "drebeatssite.com", - "drebeatssolocybermondaysale.com", - "drebeatsstudio2013.com", - "drebeatstudio.com", - "drebyby.com", - "dreeam.ac.uk", - "dremonsterbeatsoutlets.com", - "dreprobeats.com", - "dreprofy.com", - "drepung.org", - "drg.ac.uk", - "drgan.net", - "dri.ac.uk", - "dribbble.com", - "drindod.ac.uk", - "driverxxx.com", - "drivevideo.xyz", - "driving.co.uk", - "drkogyi.com", - "drmario-world.com", - "drmgmggyi-mm.blogspot.com", - "drmingxia.org", - "drnastran.com", - "drns.ac.uk", - "dronedj.com", - "dropbooks.tv", - "dropbox-dns.com", - "dropbox.com", - "dropbox.tech", - "dropboxapi.com", - "dropboxbusiness.com", - "dropboxcaptcha.com", - "dropboxforum.com", - "dropboxforums.com", - "dropboxinsiders.com", - "dropboxmail.com", - "dropboxpartners.com", - "dropboxstatic.com", - "dropboxusercontent.com", - "drsunacademy.com", - "drtuber.com", - "drunk6.com", - "drunkenstepfather.com", - "drunkentop.com", - "drweb-av.de", - "drweb-av.es", - "drweb-av.it", - "drweb-av.pl", - "drweb.by", - "drweb.cn", - "drweb.co.jp", - "drweb.com", - "drweb.fr", - "drweb.kz", - "drweb.uz", - "ds0h3roq6wcgc.cloudfront.net", - "dscis.ac.uk", - "dscn.info", - "dses.ac.uk", - "dsex.to", - "dsfc.ac.uk", - "dsl.ac.uk", - "dslr.net", - "dslreports.com", - "dsmtp.com", - "dssott.com", - "dst-dtc.ac.uk", - "dstk.dk", - "dsw.ac.uk", - "dswz88.xyz", - "dsyiren.com", - "dt-toolkit.ac.uk", - "dtc-online.ac.uk", - "dtci.co", - "dtci.technology", - "dtdns.net", - "dtiblog.com", - "dtic.mil", - "dtlgalleryint.cloudapp.net", - "dtsell.com", - "dtv2009offers.com", - "dtvce.com", - "dtwang.org", - "dualeotruyen1s.com", - "duanzhihu.com", - "dubai-escort-list.com", - "dubox.com", - "ducere.ac.uk", - "duchy.ac.uk", - "duck.co", - "duck.com", - "duckdns.org", - "duckduckco.com", - "duckduckco.de", - "duckduckgo.ca", - "duckduckgo.co", - "duckduckgo.co.uk", - "duckduckgo.com", - "duckduckgo.com.mx", - "duckduckgo.com.tw", - "duckduckgo.de", - "duckduckgo.dk", - "duckduckgo.in", - "duckduckgo.jp", - "duckduckgo.ke", - "duckduckgo.mx", - "duckduckgo.nl", - "duckduckgo.org", - "duckduckgo.pl", - "duckduckgo.sg", - "duckduckgo.uk", - "duckduckhack.com", - "duckgo.com", - "duckload.com", - "duckmovie.com", - "duckmylife.com", - "ducksear.ch", - "duckside.com", - "dudethrill.com", - "dudley.ac.uk", - "dudleycol.ac.uk", - "dudleylearners.ac.uk", - "dudleylearning.ac.uk", - "duga.jp", - "duihua.org", - "duihuahrjournal.org", - "dukgo.com", - "dulceecuador.com", - "dumb1.com", - "dumgal.ac.uk", - "dump.xxx", - "dumpxxx.net", - "dun.ac.uk", - "dund.ac.uk", - "dundee-tech.ac.uk", - "dundee.ac.uk", - "dundeeandangus.ac.uk", - "dundeeandanguscollege.ac.uk", - "dundeecoll.ac.uk", - "dundeecollege.ac.uk", - "dune.ac.uk", - "dungeonkeeper.cn", - "dungeonkeeper.com", - "dungeonkeeper.com.cn", - "dunstable.ac.uk", - "dunstaffnage-marine-lab.ac.uk", - "dunyabulteni.net", - "duolaapian126.xyz", - "duolaapian127.xyz", - "duolingo.com", - "duoweitimes.com", - "duoweiweek.com", - "duping.net", - "duplicati.com", - "dupola.com", - "dupola.net", - "dur.ac.uk", - "durex-shop.ch", - "durex-shopline.com", - "durex-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.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.com", - "durexcanada.com", - "durexchina.com", - "durexindia.com", - "durexloveclub.com", - "durexukraine.com", - "durexusa.com", - "durham.ac.uk", - "durhampriory.ac.uk", - "dushi.ca", - "dutch.ac.uk", - "dutrai.com", - "duyaoss.com", - "duyaossr.com", - "dvdpac.com", - "dvdstudiopro.biz", - "dvdstudiopro.com", - "dvdstudiopro.info", - "dvdstudiopro.net", - "dvdstudiopro.org", - "dvdstudiopro.us", - "dvdtrailertube.com", - "dvorak.org", - "dw-world.com", - "dw-world.de", - "dw.com", - "dw.de", - "dweb.link", - "dwg.com", - "dwgtrueconvert.com", - "dwgtrueview.com", - "dwheeler.com", - "dwl.ac.uk", - "dwnews.com", - "dwnews.net", - "dx9527.cc", - "dxiong.com", - "dxyav.co", - "dydx.exchange", - "dyfl1.pw", - "dykkng5hnh52u.cloudfront.net", - "dykycl.com", - "dynacw.co.jp", - "dynacw.com", - "dynacw.com.cn", - "dynacw.com.hk", - "dynacw.com.tw", - "dynafleetonline.com", - "dynamic-dns.net", - "dynamicdialects.ac.uk", - "dynamicdns.biz", - "dynamicdns.co.uk", - "dynamicdns.me.uk", - "dynamicdns.org.uk", - "dynamics.com", - "dynamobuilds.com", - "dynamopackages.com", - "dynamoreach.com", - "dynawebinc.com", - "dyncdn.me", - "dyndns-ip.com", - "dyndns-pics.com", - "dyndns.org", - "dyndns.pro", - "dynssl.com", - "dynu.com", - "dynu.net", - "dysfz.cc", - "dzen.ru", - "dzze.com", - "e-bay.com", - "e-bay.it", - "e-bay.net", - "e-c-a.ac.uk", - "e-cba.org", - "e-classical.com.tw", - "e-gold.com", - "e-goods.ru", - "e-hentai.org", - "e-hentaidb.com", - "e-htpx.ac.uk", - "e-info.org.tw", - "e-learningnorthwest.ac.uk", - "e-learningresearch.ac.uk", - "e-liv.ac.uk", - "e-merlin.ac.uk", - "e-rihs.ac.uk", - "e-science.ac.uk", - "e-scrf.ac.uk", - "e-studio.ac.uk", - "e-szigno.hu", - "e-timing.ne.jp", - "e-traderland.net", - "e-tugra.com", - "e-zone.com.hk", - "e123.hk", - "e3an.ac.uk", - "e53w.com", - "e621.net", - "ea-anz-press.com", - "ea.com", - "eaaccess.com", - "eablackbox.com", - "eac-cdn.com", - "eacashcard.com", - "eachpay.com", - "eachpay.net", - "eacodigos.com", - "eadultgames.com", - "eafootballworld.com", - "eaifhe.ac.uk", - "eakorea.co.kr", - "ealingcoll.ac.uk", - "eamirrorsedge.com", - "eamobile.com", - "eamythic.com", - "eamythic.net", - "eandc-sirgar.ac.uk", - "eanordic.com", - "eaplay.com", - "earlham.ac.uk", - "earlhaminstitute.ac.uk", - "earlyenglishlaws.ac.uk", - "earlymoderndressandtextiles.ac.uk", - "earlyphonography.ac.uk", - "earlytibet.com", - "earngeek.com", - "earphonescheapest.com", - "earpod.net", - "earthcam.com", - "earthsciencescotland.ac.uk", - "earthvpn.com", - "ease.ac.uk", - "easeit-eng.ac.uk", - "easic.com", - "easports.com", - "easports.jp", - "easportsactive.com", - "easportsactiveonline.com", - "easportsfootball.com", - "easportsfootballclub.com", - "easportsmma.com", - "easportsworld.com", - "east-anglia.ac.uk", - "east-london.ac.uk", - "east-yorks-coll.ac.uk", - "east15.ac.uk", - "eastantrim-institute.ac.uk", - "eastbabes.com", - "eastberks.ac.uk", - "eastchem.ac.uk", - "eastcoast.ac.uk", - "eastdevon.ac.uk", - "eastdurham.ac.uk", - "eastendcbc.ac.uk", - "eastern-ark.com", - "easternarc.ac.uk", - "easternlightning.org", - "eastkent.ac.uk", - "eastkentcollege.ac.uk", - "eastleigh.ac.uk", - "eastmallingresearch.ac.uk", - "eastmidlandscetls.ac.uk", - "eastnorfolk.ac.uk", - "easton-college.ac.uk", - "easton.ac.uk", - "eastonotley.ac.uk", - "eastore.com", - "eastridingadultlearn.ac.uk", - "eastridingcollege.ac.uk", - "eastscotbiodtp.ac.uk", - "eastsurrey.ac.uk", - "eastsurreycollege.ac.uk", - "easttouch.com.hk", - "eastturkestan.com", - "eastturkistan-gov.org", - "eastturkistan.net", - "eastturkistancc.org", - "eastturkistangovernmentinexile.us", - "eastview.com", - "eastweek.com.hk", - "easy-jtag.com", - "easy.ac", - "easyanticheat.net", - "easyca.ca", - "easylist.to", - "easynike.com", - "easypic.com", - "easysexporn.com", - "eater.com", - "eatthatfrog.ac.uk", - "eb.com", - "ebahy.com", - "ebalovo.com", - "ebam.ac.uk", - "ebay-25-assets.s3-us-west-1.amazonaws.com", - "ebay-authenticate.net", - "ebay-confirm.com", - "ebay-course.com", - "ebay-cz.com", - "ebay-delivery.com", - "ebay-discoveries.com", - "ebay-fashion.com", - "ebay-inc.com", - "ebay-inc.net", - "ebay-inc.org", - "ebay-online.com", - "ebay-sales.com", - "ebay-stories.com", - "ebay-us.com", - "ebay-vacation.com", - "ebay.at", - "ebay.be", - "ebay.ca", - "ebay.ch", - "ebay.co.nz", - "ebay.co.uk", - "ebay.co.ve", - "ebay.co.za", - "ebay.com", - "ebay.com.ar", - "ebay.com.au", - "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.nl", - "ebay.org", - "ebay.ph", - "ebay.pk", - "ebay.pl", - "ebay.sg", - "ebay.us", - "ebay.vn", - "ebay25.com", - "ebay68.com", - "ebaya.com", - "ebayads.com", - "ebayads.net", - "ebayadvertising.com", - "ebayanunsios.net", - "ebayauction.com", - "ebayaustralia.com", - "ebayauthenticate.com.cn", - "ebaybags.com", - "ebaybank.com", - "ebaybenefits.com", - "ebayboutique.com", - "ebayca.com", - "ebayca.org", - "ebaycafe.com", - "ebaycar.com", - "ebaycareers.com", - "ebaycbt.co.kr", - "ebaycdn.net", - "ebaychina.net", - "ebayclassifieds.com", - "ebayclassifieds.info", - "ebayclassifieds.org", - "ebayclassifieds.tv", - "ebayclassifiedsgroup.com", - "ebayclassifiedsgroup.info", - "ebayclassifiedsgroup.org", - "ebayclassifies.com", - "ebayclub.com", - "ebaycoins.com", - "ebaycom.com", - "ebaycommercenetwork.com", - "ebaycourse.com", - "ebayd.com", - "ebayde.com", - "ebaydlassifieds.com", - "ebaydts.com", - "ebayedu.com", - "ebayeletro.com", - "ebayenterprise.com", - "ebayenterprise.info", - "ebayenterprise.net", - "ebayenterprise.tv", - "ebayetc.com", - "ebayexpress.sg", - "ebayfashion.com", - "ebayfashion.net", - "ebayforcharity.org", - "ebayforeclosure.org", - "ebayfrance.com", - "ebayglobalshipping.com", - "ebaygroup.com", - "ebayhabit.com", - "ebayheels.com", - "ebayhots.com", - "ebayimg.com", - "ebayinc.com", - "ebayinc.net", - "ebayinc.org", - "ebayincconnectedcommerce.net", - "ebayinkblog.com", - "ebayinternetsalestax.com", - "ebayit.com", - "ebayjewelry.com", - "ebayjob.com", - "ebayla.org", - "ebaylisting.com", - "ebaylocal.net", - "ebaylocationsdevacances.com", - "ebaymag.com", - "ebaymainstreet.com", - "ebaymall.com", - "ebaymarketplace.net", - "ebaymotors.ca", - "ebaymotors.com", - "ebaymotors.org", - "ebaymotorsblog.com", - "ebaynow.com", - "ebaynyc.com", - "ebayon.com", - "ebayon.net", - "ebayoncampus.com", - "ebayopen.com", - "ebayopensource.com", - "ebayopensource.net", - "ebaypakistan.net", - "ebaypark.com", - "ebayparts.com", - "ebayprivacycenter.com", - "ebayqq.com", - "ebayradio.com", - "ebayrtm.com", - "ebayseller.com", - "ebayshoesstore.com", - "ebayshop.com", - "ebayshop111.com", - "ebayshopping.org", - "ebaysocial.com", - "ebaysocial.ru", - "ebaysoho.com", - "ebaysohos.com", - "ebaystatic.com", - "ebaystore.com", - "ebaystore77.com", - "ebaystyle.com", - "ebaysweden.com", - "ebayt.com", - "ebaytechblog.com", - "ebaytopratedseller.net", - "ebaytrading.com", - "ebaytradingassistant.com", - "ebaytv.org", - "ebayuae.net", - "ebayvakantiehuizen.com", - "ebayvalet.com", - "ebayvietnam.net", - "ebayworlds.com", - "ebayy.com", - "ebc.net.tw", - "ebenporno.com", - "ebi.ac.uk", - "ebnet.ac.uk", - "ebony-beauty.com", - "ebonyinlove.com", - "ebonywebcamhub.com", - "eboobstore.com", - "ebookbrowse.com", - "ebookee.com", - "ebookforipad.com", - "ebrahimcollege.ac.uk", - "ebrc.ac.uk", - "ebs.ac.uk", - "ebsco.com", - "ebscohost.com", - "ebsl.ac.uk", - "ebslondon.ac.uk", - "ebtcbank.com", - "ebuyheadphones.com", - "eca.ac.uk", - "ecampus-leeds.ac.uk", - "ecc.ac.uk", - "ecchinohentai.ru", - "ecci.ac.uk", - "ecclescollege.ac.uk", - "ecdc.ac.uk", - "ecert.gov.hk", - "eceta.ac.uk", - "ecfa.org.tw", - "ecgapp.net", - "echainhost.com", - "echichimato.com", - "echocdn.com", - "echofon.com", - "echosign.com", - "ecimg.tw", - "eckosia.org", - "eclipse.ac.uk", - "eclw.ac.uk", - "ecministry.net", - "ecn.ac.uk", - "ecoforme.jp", - "economicfutures.ac.uk", - "economics.ac.uk", - "economicsnetwork.ac.uk", - "economist.com", - "economistgroup.com", - "economistgroupcareers.com", - "ecos.ac.uk", - "ecosystemservices.ac.uk", - "ecotect.com", - "ecotect.net", - "ecpa.fr", - "ecr.aws", - "ecsa.ac.uk", - "ecscad.com", - "ecspublisher.com", - "ecstart.com", - "ecu.ac.uk", - "ecuatorianas.best", - "ecw.ac.uk", - "ed-coll.ac.uk", - "ed.ac.uk", - "ed6.ac.uk", - "edam.ac.uk", - "edc.ac.uk", - "edcity.hk", - "edcoll.ac.uk", - "edengay.net", - "edge-hill-college.ac.uk", - "edgecastcdn.net", - "edgedatg.com", - "edgefonts.net", - "edgehill.ac.uk", - "edgehilluniversity.ac.uk", - "edgehotelschool.ac.uk", - "edgekey.net", - "edgemeplease.com", - "edgesuite.net", - "edhcc.ac.uk", - "edicypages.com", - "edifhe.ac.uk", - "edina.ac.uk", - "edinburgh.ac.uk", - "edinburghcollege.ac.uk", - "edinburghstelford.ac.uk", - "edinburghstelfordcollege.ac.uk", - "edinburghtc.ac.uk", - "edisebay.com", - "editorx.com", - "edlab.ac.uk", - "edmontonchina.cn", - "edmontonservice.com", - "edninfo.com", - "edns.biz", - "edoors.com", - "edshare.ac.uk", - "edtech.ac.uk", - "edu-research.org", - "edu.ir", - "edubridge.com", - "education-cadcam.com", - "educationlondonconnect.ac.uk", - "educationpartnershipne.ac.uk", - "educationpartnershipnortheast.ac.uk", - "eduplus.hk", - "edupro.org", - "eduroam.ac.uk", - "eduserv.ac.uk", - "edward-greene.ac.uk", - "edwardllwyd.ac.uk", - "edx-cdn.org", - "edx.org", - "eebay.com", - "eecm.ac.uk", - "eenike.com", - "eep.ac.uk", - "eera.ac.uk", - "ees.ac.uk", - "eesti.ee", - "eevl.ac.uk", - "eevlextra.ac.uk", - "eevlxtra.ac.uk", - "eevpn.com", - "efc.ac.uk", - "efcc.org.hk", - "efetedc.ac.uk", - "eff.org", - "effers.com", - "efficiencyexchange.ac.uk", - "efksoft.com", - "efproject.net", - "efreenews.com", - "efs.ac.uk", - "efukt.com", - "efutures.ac.uk", - "egghead.io", - "egmontbooks.co.uk", - "egotastic.com", - "egta.com", - "egyptrevolution2011.ac.uk", - "ehche.ac.uk", - "ehgt.org", - "ehtracker.org", - "ehu.ac.uk", - "ehv.cc", - "ehwiki.org", - "eic-av.com", - "eicdt.ac.uk", - "eidc.ac.uk", - "eighteen-store18x.jp", - "eilieili.cc", - "einfrastructureforum.ac.uk", - "einfrastructuresouth.ac.uk", - "einstein.com", - "eira.ac.uk", - "eireinikotaerukai.com", - "eisbb.com", - "eiu.com", - "eius.ac.uk", - "ekcgroup.ac.uk", - "ekhindi.com", - "ekhokavkaza.com", - "eklearning.ac.uk", - "ekolojik.org", - "eksisozluk.com", - "el-ladies.com", - "elanguages.ac.uk", - "elasticbeanstalk.com", - "elatt.ac.uk", - "elc.ac.uk", - "elconfidencial.com", - "elder-cove.ac.uk", - "elderscrolls.com", - "elearning.ac.uk", - "elearningnortheast.ac.uk", - "elearningresearch.ac.uk", - "electbabe.com", - "electionsmeter.com", - "electrek.co", - "electricalmachineshub.ac.uk", - "electricluxury.com", - "electrochem.org", - "electronicarts.com", - "electronicarts.fr", - "electronjs.org", - "element.io", - "elephantlist.com", - "elephantsdream.org", - "elephanttube.com", - "elephanttubenew.com", - "elgaronline.com", - "elgoog.im", - "elib.ac.uk", - "elifesciences.org", - "elihe.ac.uk", - "elite.ac.uk", - "elite.com", - "elitebabes.com", - "eliteindianporn.com", - "elitvip.ru", - "elixir-lang.org", - "elixir.ac.uk", - "elizabethmontagunetwork.ac.uk", - "ellawine.org", - "elliotthudsoncollege.ac.uk", - "elmwood.ac.uk", - "elne.ac.uk", - "elog-ch.com", - "elog-ch.net", - "elp.ac.uk", - "elpais.com", - "elpornoamateur.com", - "elpube-scat-movies.blogspot.com", - "elrah.ac.uk", - "elrc.ac.uk", - "elrepo.org", - "els-cdn.com", - "elsa-project.ac.uk", - "elsa.ac.uk", - "elsevier-ae.com", - "elsevier.com", - "elsevier.io", - "elt.ac.uk", - "eltondisney.com", - "elum.ac.uk", - "em-toolkit.ac.uk", - "emac.co.in", - "emac.in", - "emaga.com", - "emagic.de", - "emahsn.ac.uk", - "email-bimm.ac.uk", - "emanna.com", - "emas.ac.uk", - "embase.com", - "embed-cdn.com", - "embed.ly", - "embedly.com", - "ember3dp.com", - "emberprinter.com", - "embl-ebi.ac.uk", - "embl-hamburg.de", - "embl.de", - "embl.fr", - "embl.it", - "embl.org", - "emblstatic.net", - "embr.in", - "embs.ac.uk", - "embs.org", - "emc.ac.uk", - "emc.com", - "emcs.org", - "eme.ac.uk", - "emec.ac.uk", - "emedlab.ac.uk", - "emerald.com", - "emergingsolutions.com", - "emgrad.ac.uk", - "emidsvikings.ac.uk", - "emilylau.org.hk", - "emo-pain.ac.uk", - "emojipedia.org", - "emol.ac.uk", - "emome.net", - "emory.edu", - "empero-right.mom", - "empfil.com", - "empflix.com", - "emphasis.ac.uk", - "empornium.site", - "emr.ac.uk", - "ems-ph.org", - "ems.ac.uk", - "emttp.ac.uk", - "emua.ac.uk", - "emule-ed2k.com", - "emulefans.com", - "emuparadise.me", - "emwprep.ac.uk", - "en-compass.ac.uk", - "enablementadobe.com", - "enanyang.my", - "enbit.ac.uk", - "enca.com", - "encoretvb.com", - "encrypt.me", - "encuentroscasualesoecuador.com", - "encyclopedia.com", - "enema-porn.com", - "enema-videos.com", - "enemabasics.com", - "enemaexperiences.com", - "enemahistory.com", - "enemainformation.com", - "enemaporn.blogspot.com", - "enemarotica.com", - "enemas4fun.com", - "enemasexfetish.com", - "enematube.com", - "energy2050.ac.uk", - "energybiographies.ac.uk", - "energyforchange.ac.uk", - "energystarbuildings.com", - "energystorage-cdt.ac.uk", - "enewstree.com", - "enf-cmnf.com", - "enfa.co.id", - "enfa.com.vn", - "enfaaplus.com", - "enfababy.com", - "enfabebe.com", - "enfabebe.com.br", - "enfabebe.com.co", - "enfabebe.com.do", - "enfabebe.com.ec", - "enfabebe.com.mx", - "enfabebe.com.pe", - "enfabebe.com.ve", - "enfabebe3.com.ar", - "enfagrow.co.in", - "enfagrow.com.bn", - "enfagrow.com.my", - "enfagrow.com.ph", - "enfagrow.com.sg", - "enfagrow4.com", - "enfal.de", - "enfamama.com.ar", - "enfamama.com.ph", - "enfamil.ca", - "enfamil.com", - "enfamil.es", - "enfamil.pl", - "enfamil.pt", - "enfasmart.com", - "engadget.com", - "engagedaily.org", - "engageinresearch.ac.uk", - "engageni.ac.uk", - "engcetl.ac.uk", - "engineering.ac.uk", - "engineeringnonlinearity.ac.uk", - "engineeringsigns.ac.uk", - "engineeringvillage.com", - "englishassociation.ac.uk", - "englishforeveryone.org", - "englishfromengland.co.uk", - "englishpen.org", - "engsc.ac.uk", - "enhancementthemes.ac.uk", - "enjoyasianporn.com", - "enjoyfuck.com", - "enlighten.org.tw", - "enmat.ac.uk", - "enorf.ac.uk", - "enos.ac.uk", - "enpirion.com", - "ensa.ac.uk", - "ensemble.ac.uk", - "ensemblepurchasing.ac.uk", - "ensfc.ac.uk", - "enspireformula.com", - "enteentegeh.de", - "entensity.net", - "entermap.com", - "entermediadb.net", - "entermediadb.org", - "enterprise.ac.uk", - "enterprisebydesign.ac.uk", - "enterprisepaging.com", - "enterpriseresearch.ac.uk", - "enterprisessl.com", - "entnt.com", - "entrust.net", - "entrustdatacard.com", - "enveast.ac.uk", - "environment-health.ac.uk", - "environment.google", - "epa.gov.tw", - "epac.to", - "epc.ac.uk", - "epic.ac.uk", - "epic.network", - "epicbrowser.com", - "epicgames.com", - "epicgames.dev", - "epicgamescdn.com", - "epicreads.com", - "epics.ac.uk", - "epicure.ac.uk", - "epigeum.com", - "epikporn.com", - "epinions.com", - "episcopalchurch.org", - "episodic.com", - "epizy.com", - "epne.ac.uk", - "epoch.cloud", - "epoch.org.il", - "epochbase.com", - "epochbuy.com", - "epochcar.com", - "epochhk.com", - "epochmall.com", - "epochmediagroup.com", - "epochshop.com", - "epochstories.com", - "epochtime.com", - "epochtimes-bg.com", - "epochtimes-romania.com", - "epochtimes.bg", - "epochtimes.co.il", - "epochtimes.co.kr", - "epochtimes.co.uk", - "epochtimes.com", - "epochtimes.com.au", - "epochtimes.com.br", - "epochtimes.com.sg", - "epochtimes.com.tw", - "epochtimes.com.ua", - "epochtimes.cz", - "epochtimes.de", - "epochtimes.eu", - "epochtimes.fr", - "epochtimes.ie", - "epochtimes.it", - "epochtimes.jp", - "epochtimes.nl", - "epochtimes.pl", - "epochtimes.ru", - "epochtimes.se", - "epochtimeshk.org", - "epochtimestr.com", - "epochweek.com", - "epochweekly.com", - "eporner.com", - "eportfolios.ac.uk", - "eppi.ac.uk", - "epping-forest.ac.uk", - "eprc.com.hk", - "epress.ac.uk", - "eprice.com.hk", - "eprintsw.com", - "eps.ac.uk", - "epsilon.ac.uk", - "epsrc-centre-lime.ac.uk", - "epsrc-cim-macromoleculartherapies.ac.uk", - "epsrc.ac.uk", - "equal.ac.uk", - "equalityhigher.ac.uk", - "equator.ac.uk", - "equinenow.com", - "equistudy.ac.uk", - "era.ac.uk", - "erabaru.net", - "eracom.com.tw", - "eraofconnection.com", - "erasmus.ac.uk", - "eraysoft.com.tr", - "erbecdt.ac.uk", - "erc.ac.uk", - "erepublik.com", - "eres.ac.uk", - "eresearchsouth.ac.uk", - "eri.ac.uk", - "erights.net", - "erini.ac.uk", - "erito.com", - "eriversoft.com", - "erktv.com", - "erlang.org", - "ernestmandel.org", - "ernw.ac.uk", - "ero-anime.net", - "ero-comic-hunter.net", - "ero-kawa.com", - "ero-labs.cloud", - "ero-labs.com", - "ero-labs.fun", - "ero-labs.net", - "ero-labs.online", - "ero-labs.site", - "ero-ma-nia.com", - "ero-manga-platinum.net", - "ero-mangalife.com", - "eroan.xyz", - "erocurves.com", - "erodaizensyu.com", - "erodayo.com", - "erodougazo.com", - "erodoujinlog.com", - "erodoujinshi-world.com", - "erodoujinworld.com", - "eroelog.com", - "eroero69.work", - "erofights.com", - "erofullsets.net", - "erofus.com", - "erogames.com", - "erogazo-jp.net", - "erogazo-ngo.com", - "erogazopple.com", - "erogazou-pinkline.com", - "erogazoufactory.com", - "erohentai.net", - "erolabs.cloud", - "erolabs.com", - "erolabs.fun", - "erolabs.game", - "erolabs.net", - "erolabs.online", - "erolabsshare.xyz", - "eromanga-ace.com", - "eromanga-cafe.com", - "eromanga-kingdom.com", - "eromanga-kong.com", - "eromanga-mainichi.com", - "eromanga-school.com", - "eromangadouzin.com", - "eromangajukujo.com", - "eromazofu.com", - "erome.com", - "erome.it", - "eromon.net", - "eropasture.com", - "eropics.org", - "eropics.to", - "eroprofile.com", - "erosberry.com", - "eroshiko.net", - "erotelki.org", - "eroterest.net", - "erothots.co", - "erotic-artsites.com", - "erotic-hentai.com", - "erotic-photos.net", - "eroticart-top100.com", - "eroticbeauties.net", - "eroticbeautyhub.com", - "erotichdworld.com", - "eroticsaloon.net", - "erotictube.me", - "erotikaweb.hu", - "erovizor.ru", - "eroxia.com", - "erp.ac.uk", - "erpe.ac.uk", - "err.sh", - "ertk.net", - "es-visiontimes.com", - "esala.ac.uk", - "esbeatsbydrebuy.com", - "esc.ac.uk", - "escalate.ac.uk", - "escandinavia-arg.com", - "escape.com.au", - "escapestudios.ac.uk", - "escapestudios.co.uk", - "escg.ac.uk", - "escience-etf.ac.uk", - "escience.ac.uk", - "escobarvip.it", - "escoe.ac.uk", - "escort.guide", - "escortamsterdam1.com", - "escortdude.com", - "escortgirls.be", - "escortrankings.uk", - "escp-eap.ac.uk", - "esdi.ac.uk", - "esds.ac.uk", - "ese.ac.uk", - "eselondon.ac.uk", - "esg.ac.uk", - "eshcru.ac.uk", - "esher.ac.uk", - "esi.ac.uk", - "esim.ac.uk", - "esiss.ac.uk", - "eskimotube.com", - "eslite.com", - "esm.run", - "esmarthealth.com", - "esmatube.com", - "esmtp.biz", - "esnw.ac.uk", - "eso.ac.uk", - "esopworld.com", - "esp-scotland.ac.uk", - "esp32.com", - "esp8266.com", - "espa-headlines.ac.uk", - "espa.ac.uk", - "espadoldettol.com.ar", - "esperanzagomez.org", - "espn.co.uk", - "espn.com", - "espn.net", - "espncdn.com", - "espnqa.com", - "esposasymaridos.com", - "espressif.com", - "esrc.ac.uk", - "esrcfestival.ac.uk", - "esrcmanchesterfest.ac.uk", - "esrcsocietytoday.ac.uk", - "esri.com", - "essex.ac.uk", - "essexacl.ac.uk", - "estudio360.com.co", - "estudiopenthouse.com", - "esu.dog", - "esu.im", - "esurance.com", - "etaa.org.au", - "etadult.com", - "etaiwannews.com", - "etbc.com.hk", - "etc.ac.uk", - "etcfhe.ac.uk", - "eternum.io", - "etextbooks.ac.uk", - "etheadphones.com", - "etherdelta.com", - "ethereum.foundation", - "ethereum.org", - "ethermine.org", - "etherscan.io", - "ethicsguidebook.ac.uk", - "ethnicity.ac.uk", - "ethos.ac.uk", - "etizer.org", - "etnet.com.hk", - "etokki.com", - "etowns.net", - "etowns.org", - "etp-scotland.ac.uk", - "etpress.com.hk", - "ets.ac.uk", - "etsy.com", - "ettoday.net", - "ettrade.com.hk", - "etviet.com", - "etvonline.hk", - "etwealth.com", - "eu-consumer-empowerment.com", - "eu.org", - "eubluecardvisa.com", - "eucasino.com", - "eued.ac.uk", - "eueuropeansustainabledesign.net", - "eulam.com", - "eurekaselect.com", - "eurekavpt.com", - "eurobabeindex.com", - "eurobrox.ac.uk", - "eurocodesoftware.com", - "eurodasp.com", - "eurogirlsescort.com", - "euroipad.com", - "euromod.ac.uk", - "euronews.com", - "europa.eu", - "europalibera.org", - "europeansustainabledesign.com", - "europeansustainabledesign.net", - "europeansustainabledesigncouncil.com", - "europeansustainabledesigncouncil.net", - "europepmc.org", - "europeunit.ac.uk", - "europornstar.com", - "eurosexscene.com", - "eva.ac.uk", - "evaelfie.com", - "evalviewer.com", - "evanottyvideos.com", - "evemodels.com", - "eventsinfocus.org", - "evergage.com", - "everia.club", - "everipedia.org", - "evernote.com", - "every1dns.net", - "everydayporn.co", - "everymantheatrearchive.ac.uk", - "evesham.ac.uk", - "evilangel.com", - "evilx.su", - "evise.com", - "evolve.ac.uk", - "evolver.com", - "evolver3d.com", - "evolverpro.com", - "evozi.com", - "evropaelire.org", - "evschool.net", - "ewlc.ac.uk", - "eworld.com", - "ewrs.ac.uk", - "ewva.ac.uk", - "ex.ac.uk", - "exacttarget.com", - "exam-ta.ac.uk", - "exascale-tech.com", - "exblog.co.jp", - "exblog.jp", - "excedo.com", - "excellence.ac.uk", - "excellencelondon.ac.uk", - "exchange.ac.uk", - "exchristian.hk", - "excite.co.jp", - "excitebots.com", - "exe-coll.ac.uk", - "exec-appointments.com", - "exemplashe.ac.uk", - "exeter.ac.uk", - "exetercollege.ac.uk", - "exeterdeafacademy.ac.uk", - "exetermathematicsschool.ac.uk", - "exetermrcsdf.ac.uk", - "exeterms.ac.uk", - "exgfvideos.xxx", - "exgirlfriendmarket.com", - "exhentai.org", - "exiporn.com", - "exmo.com", - "exmormon.org", - "exoav.com", - "exondomesday.ac.uk", - "exotic-ghana.com", - "exoticuganda.com", - "exp-tas.com", - "expatshield.com", - "expecthim.com", - "expekt.com", - "experience-vmware.com", - "experiencebillmelater.com", - "experienceworks.ac.uk", - "expertmaker.com", - "experts-univers.com", - "experts.ac.uk", - "explicittube.com", - "exploader.net", - "exploitedcollegegirls.com", - "exploitedteensasia.com", - "exploreintel.com", - "explorespanking.com", - "expofutures.com", - "exporntoons.net", - "exposedlatinas.com", - "expressvpn.com", - "expresswifi.com", - "exrates.me", - "ext-twitch.tv", - "extensions4revit.com", - "extensionworkshop.com", - "extmatrix.com", - "extraasian.com", - "extrabux.com", - "extraindiansex.com", - "extrajapaneseporn.com", - "extreme-board.com", - "extremepornfilms.com", - "extremetube.com", - "exx.com", - "exxxtra.net", - "exxxtrasmall.com", - "exxxtrasmall1.com", - "eyevio.jp", - "eyny.com", - "ezpc.tk", - "ezpeer.com", - "ezua.com", - "f-boro-sfc.ac.uk", - "f-dro1d.org", - "f-droid.com", - "f-droid.org", - "f2pool.com", - "f5pf.com", - "f6988.com", - "f8.com", - "f95zone.to", - "fa.gov.tw", - "faacebok.com", - "faacebook.com", - "faam.ac.uk", - "faapy.com", - "faasbook.com", - "fabhairypussy.com", - "fablabplymouth.ac.uk", - "fabricmc.net", - "fabuye.top", - "fabuyemian.com", - "facbebook.com", - "facbeok.com", - "facboo.com", - "facbook.com", - "facbool.com", - "facboox.com", - "faccebook.com", - "faccebookk.com", - "facdbook.com", - "facdebook.com", - "face-book.com", - "face.ac.uk", - "face3d.ac.uk", - "faceabook.com", - "facebboc.com", - "facebbook.com", - "facebboook.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.com", - "facebokbook.com", - "facebokc.com", - "facebokk.com", - "facebokok.com", - "faceboks.com", - "facebol.com", - "facebolk.com", - "facebomok.com", - "faceboo.com", - "facebooa.com", - "faceboob.com", - "faceboobok.com", - "facebooc.com", - "faceboock.com", - "facebood.com", - "facebooe.com", - "faceboof.com", - "facebooi.com", - "facebooik.com", - "facebooik.org", - "facebooj.com", - "facebook-corp.com", - "facebook-covid-19.com", - "facebook-ebook.com", - "facebook-forum.com", - "facebook-hardware.com", - "facebook-inc.com", - "facebook-login.com", - "facebook-newsroom.com", - "facebook-newsroom.org", - "facebook-pmdcenter.com", - "facebook-pmdcenter.net", - "facebook-pmdcenter.org", - "facebook-privacy.com", - "facebook-program.com", - "facebook-studio.com", - "facebook-support.org", - "facebook-texas-holdem.com", - "facebook-texas-holdem.net", - "facebook.br", - "facebook.ca", - "facebook.cc", - "facebook.com", - "facebook.de", - "facebook.design", - "facebook.hu", - "facebook.in", - "facebook.net", - "facebook.nl", - "facebook.org", - "facebook.se", - "facebook.shop", - "facebook.tv", - "facebook.us", - "facebook.wang", - "facebook123.org", - "facebook30.com", - "facebook30.net", - "facebook30.org", - "facebook4business.com", - "facebookads.com", - "facebookadvertisingsecrets.com", - "facebookappcenter.info", - "facebookappcenter.net", - "facebookappcenter.org", - "facebookatschool.com", - "facebookawards.com", - "facebookblueprint.net", - "facebookbrand.com", - "facebookbrand.net", - "facebookcanadianelectionintegrityinitiative.com", - "facebookcareer.com", - "facebookcheats.com", - "facebookck.com", - "facebookclub.com", - "facebookcom.com", - "facebookconnect.com", - "facebookconsultant.org", - "facebookcoronavirus.com", - "facebookcovers.org", - "facebookcredits.info", - "facebookdating.net", - "facebookdevelopergarage.com", - "facebookdusexe.org", - "facebookemail.com", - "facebookenespanol.com", - "facebookexchange.com", - "facebookexchange.net", - "facebookfacebook.com", - "facebookflow.com", - "facebookgames.com", - "facebookgraphsearch.com", - "facebookgraphsearch.info", - "facebookgroups.com", - "facebookhome.cc", - "facebookhome.com", - "facebookhome.info", - "facebookhub.com", - "facebooki.com", - "facebookinc.com", - "facebookland.com", - "facebooklikeexchange.com", - "facebooklive.com", - "facebooklivestaging.net", - "facebooklivestaging.org", - "facebooklogin.com", - "facebooklogin.info", - "facebookloginhelp.net", - "facebooklogs.com", - "facebookmail.com", - "facebookmail.tv", - "facebookmanager.info", - "facebookmarketing.info", - "facebookmarketingpartner.com", - "facebookmarketingpartners.com", - "facebookmobile.com", - "facebookmsn.com", - "facebooknews.com", - "facebooknfl.com", - "facebooknude.com", - "facebookofsex.com", - "facebookook.com", - "facebookpaper.com", - "facebookpay.com", - "facebookphonenumber.net", - "facebookphoto.com", - "facebookphotos.com", - "facebookpmdcenter.com", - "facebookpoke.net", - "facebookpoke.org", - "facebookpoker.info", - "facebookpokerchips.info", - "facebookporn.net", - "facebookporn.org", - "facebookporno.net", - "facebookportal.com", - "facebookquotes4u.com", - "facebooks.com", - "facebooksafety.com", - "facebooksecurity.net", - "facebookshop.com", - "facebooksignup.net", - "facebooksite.net", - "facebookstories.com", - "facebookstudios.net", - "facebookstudios.org", - "facebooksupplier.com", - "facebooksuppliers.com", - "facebookswagemea.com", - "facebookswagstore.com", - "facebooksz.com", - "facebookthreads.net", - "facebooktv.net", - "facebooktv.org", - "facebookvacation.com", - "facebookw.com", - "facebookwork.com", - "facebookworld.com", - "facebool.com", - "facebool.info", - "facebooll.com", - "faceboom.com", - "faceboon.com", - "faceboonk.com", - "faceboooik.com", - "faceboook.com", - "faceboop.com", - "faceboot.com", - "faceboox.com", - "facebopk.com", - "facebpook.com", - "facebuk.com", - "facebuok.com", - "facebvook.com", - "facebyook.com", - "facebzook.com", - "facecbgook.com", - "facecbook.com", - "facecbook.org", - "facecook.com", - "facecook.org", - "facedbook.com", - "faceebok.com", - "faceebook.com", - "faceebot.com", - "facegbok.com", - "facegbook.com", - "faceid99.com", - "faceid99.net", - "faceidglobal.com", - "faceless.me", - "faceobk.com", - "faceobok.com", - "faceobook.com", - "faceook.com", - "facerbooik.com", - "facerbook.com", - "facesbooc.com", - "facesofnyfw.com", - "facesoftibetanselfimmolators.info", - "facesounds.com", - "facetime.net", - "facetook.com", - "facevbook.com", - "facewbook.co", - "facewook.com", - "facfacebook.com", - "facfebook.com", - "facilities.ac.uk", - "faciometrics.com", - "fackebook.com", - "faclair.ac.uk", - "facnbook.com", - "facoccmed.ac.uk", - "facrbook.com", - "factograph.info", - "factpedia.org", - "factwire.org", - "facultyopinions.com", - "facvebook.com", - "facwebook.com", - "facxebook.com", - "fadebook.com", - "faebok.com", - "faebook.com", - "faebookc.com", - "faeboook.com", - "faecebok.com", - "faesebook.com", - "fafacebook.com", - "faicbooc.com", - "fail.hk", - "failte.ac.uk", - "fairbairn.ac.uk", - "fairfieldfarmcollege.ac.uk", - "fairfieldopportunityfarm.ac.uk", - "fairmarket.com", - "faith100.org", - "faithfuleye.com", - "faiththedog.info", - "fakehub.com", - "fakeorfoto.com", - "fakeorphoto.com", - "faketaxi.com", - "fakings.com", - "fakku.net", - "faldgjalg.xyz", - "falkirkcollege.ac.uk", - "fallenark.com", - "falmouth.ac.uk", - "falmouthexeterplus.ac.uk", - "falmouthmarineschool.ac.uk", - "falsefire.com", - "falun-co.org", - "falun-ny.net", - "falunart.org", - "falunasia.info", - "falunau.org", - "falunaz.net", - "falundafa-dc.org", - "falundafa-florida.org", - "falundafa-nc.org", - "falundafa-pa.net", - "falundafa-sacramento.org", - "falundafa.org", - "falundafa.org.tw", - "falundafaindia.org", - "falundafamuseum.org", - "falungong.club", - "falungong.de", - "falungong.org.uk", - "falunhr.org", - "faluninfo.de", - "faluninfo.net", - "falunpilipinas.net", - "falunworld.net", - "fameregistry.com", - "famifun.com.tw", - "family-sex.me", - "family-simulator.io", - "family.co.jp", - "family.com.tw", - "familyfed.org", - "familylifestudy.ac.uk", - "familymart.com.my", - "familymart.com.ph", - "familypies.net", - "familyporn.tv", - "familypornhd.com", - "familysexsimulator.com", - "familysimulator.com", - "familysimulator.io", - "familystrokes.com", - "familyswap.xxx", - "famima.vn", - "famosascalvas.com", - "famous-nudes.com", - "famous.ac.uk", - "famousinternetgirls.com", - "famousinternetgirlsgalleries.com", - "famousnudes.com", - "famouspornstars.com", - "famunion.com", - "fan-qiang.com", - "fanaken.com", - "fanatical.com", - "fanbox.cc", - "fandango.com", - "fandom.com", - "fanfox.net", - "fangbinxing.com", - "fangeming.com", - "fangeqiang.com", - "fanglizhi.info", - "fangmincn.org", - "fangong.org", - "fangongheike.com", - "fangsung.com", - "fanhaodang.com", - "fanhaodian.com", - "fanhaolou.com", - "fanhowab.buzz", - "fank.ru", - "fanleakstoday.com", - "fanqiang.network", - "fanqiang.tk", - "fanqiangdang.com", - "fanqiangdang.org", - "fanqianghou.com", - "fanqianglu.com", - "fanqiangyakexi.net", - "fanqiangzhe.com", - "fans-here.com", - "fans17.com", - "fans66.tw", - "fansking.tw", - "fansnudes.com", - "fansone.co", - "fansta.me", - "fansteek.com", - "fanswong.com", - "fantasiasguatemala.com", - "fantasti.cc", - "fantv.hk", - "fanyue.info", - "fap-xxx.com", - "fap18.net", - "fap666.com", - "fapality.com", - "fapcat.com", - "fapdu.com", - "fapdude.com", - "fapello.com", - "faperoni.com", - "fapforfun.net", - "faphdporn.com", - "faphouse.com", - "fapmovz.com", - "fapnado.com", - "fapomania.com", - "fapopedia.net", - "fappcelebs.com", - "fappeningbook.com", - "fappeningthots.com", - "fappenist.com", - "fapphub.com", - "fapporn.me", - "faproulette.co", - "faproulette.online", - "faproxy.com", - "fapsafari.com", - "fapster.xxx", - "fapteencam.com", - "faptitans.com", - "fapvid.com", - "faqserv.com", - "faraday.ac.uk", - "fareastpornhub.com", - "fareham.ac.uk", - "farfetch-apps.com", - "farfetch-contents.com", - "farfetch.com", - "farfetch.net", - "farmington.ac.uk", - "farmplus.ac.uk", - "farn-ct.ac.uk", - "farnborough.ac.uk", - "farnboroughcollege.ac.uk", - "farnboroughsfc.ac.uk", - "farnboroughsfc2.ac.uk", - "farnham.ac.uk", - "faronics.ca", - "faronics.co.uk", - "faronics.com", - "faronics.com.au", - "faronics.com.sg", - "faronics.eu", - "faronics.tech", - "faronicslabs.com", - "faronicswise.co.uk", - "faronicswise.com", - "fartit.com", - "farwestchina.com", - "fasebokk.com", - "fasebook.com", - "faseboox.com", - "fashionbykakao.com", - "fashioningtheearlymodern.ac.uk", - "fashionnike.com", - "fashionretail.ac.uk", - "fashionretailacademy.ac.uk", - "fashiontechnologyacademy.ac.uk", - "fast.com", - "fastech.ac.uk", - "fastestvpn.com", - "fastindianporn.com", - "fastlane.ci", - "fastlane.tools", - "fastly-edge.com", - "fastly-terrarium.com", - "fastly.com", - "fastly.io", - "fastly.net", - "fastlylabs.com", - "fastlylb.net", - "fastpic.ru", - "fastssh.com", - "faststone.org", - "fasttext.cc", - "fasttrackreadysupport.com", - "fatakat-n.club", - "fatbtc.com", - "fatstube.com", - "fault-analysis-group.ac.uk", - "favebook.com", - "favelaporno.com", - "favepornmovs.com", - "favepornvids.com", - "favjapaneseporn.com", - "favotter.net", - "favstar.fm", - "fawanghuihui.org", - "faycbok.com", - "faydao.com", - "fayuanbooks.com", - "faz.net", - "fb.careers", - "fb.com", - "fb.gg", - "fb.me", - "fb.watch", - "fba.ac.uk", - "fbacebook.com", - "fbaddins.com", - "fbbmarket.com", - "fbboostyourbusiness.com", - "fbcdn.com", - "fbcdn.net", - "fbf8.com", - "fbfeedback.com", - "fbhome.com", - "fbidb.io", - "fbinc.com", - "fbinfer.com", - "fbinnovation.com", - "fbiqiyiav.buzz", - "fbjav.com", - "fblitho.com", - "fbmarketing.com", - "fbmessenger.com", - "fbooktaiwan.com", - "fbredex.com", - "fbreg.com", - "fbrell.com", - "fbrpms.com", - "fbsbx.com", - "fbsbx.net", - "fbsupport-covid.net", - "fbthirdpartypixel.com", - "fbthirdpartypixel.net", - "fbthirdpartypixel.org", - "fburl.com", - "fbwat.ch", - "fbworkmail.com", - "fc2.com", - "fc2blog.net", - "fc2china.com", - "fc2cn.com", - "fc2ppv.tv", - "fc2web.com", - "fca.ac.uk", - "fcacebook.com", - "fcaebook.com", - "fcebook.com", - "fcebookk.com", - "fcfacebook.com", - "fcot.ac.uk", - "fcrt.ac.uk", - "fcw.xxx", - "fcww0.com", - "fda.gov.tw", - "fdacebook.info", - "fdbox.com", - "fdc64.de", - "fdc64.jp", - "fdc64.org", - "fdc89.jp", - "fdf.ac.uk", - "fdiintelligence.com", - "fdroid.org", - "fdtl.ac.uk", - "feacboo.com", - "feacbook.com", - "feacbooke.com", - "feacebook.com", - "feanonlinear.com", - "featurecam.com", - "fecbbok.com", - "fecbooc.com", - "fecbook.com", - "feceboock.com", - "fecebook.net", - "feceboox.com", - "fececbook.com", - "federalschool.ac.uk", - "federalsurrey.ac.uk", - "fedoraforum.org", - "fedoramagazine.org", - "fedorapeople.org", - "fedoraproject.org", - "feedburner.com", - "feeder.co", - "feedherfuckher.com", - "feedly.com", - "feedx.net", - "feelssh.com", - "feer.com", - "feet9.com", - "fefc.ac.uk", - "fehesorp.ac.uk", - "fei.ru", - "feifeiss.com", - "feipang.link", - "feitian-california.org", - "feitianacademy.org", - "feixiaohao.com", - "felp.ac.uk", - "femalefounderscomp.com", - "femalestars.com", - "femdomcc.net", - "feministteacher.com", - "feminizingpolitics.ac.uk", - "femjoy.com", - "femscat.com", - "fengzhenghu.com", - "fengzhenghu.net", - "feook.com", - "ferabook.com", - "fermanaghcoll.ac.uk", - "ferronetwork.com", - "ferryclean.com", - "fescebook.com", - "fesebook.com", - "fesery-com.sbs", - "festinhasbrasil.com", - "fetalmedicine.ac.uk", - "fetish-bb.com", - "fetishbank.net", - "fetishdreamz.com", - "fetishes.cam", - "fetishfishcams.com", - "fetishpapa.com", - "fetishpornonly.com", - "fetishshrine.com", - "fetlife.com", - "fevernet.com", - "ff.im", - "ffacebook.com", - "ffc.ac.uk", - "fffdm.com", - "fffff.at", - "fffucked.com", - "fflick.com", - "fflm.ac.uk", - "fflnk.net", - "fflogs.com", - "ffmpeg.org", - "ffotolia.com", - "ffprofile.com", - "ffvpn.com", - "fgacebook.com", - "fgirl.ch", - "fgls.ac.uk", - "fgmtv.net", - "fgmtv.org", - "fhreports.net", - "fi11.com", - "fi11av1.com", - "fi11tv1.com", - "fibre-diffraction.ac.uk", - "ficeboock.com", - "ficm.ac.uk", - "fictionmania.tv", - "fifastreet.com", - "fifastreet3.com", - "fife.ac.uk", - "fifeglen.ac.uk", - "fightforux.com", - "figma.com", - "figprayer.com", - "fileflyer.com", - "fileforum.com", - "files2me.com", - "fileserve.com", - "filesmonster.vip", - "filesor.com", - "filipino-music.net", - "fillthesquare.org", - "filmandsound.ac.uk", - "filme2.xxx", - "filmeleporno.xxx", - "filmeporno.blog", - "filmeporno.xxx", - "filmesdesexo.blog", - "filmesporno.com.br", - "filmesporno.net.br", - "filmespornos.net", - "filmingfortibet.org", - "filmporno.it", - "filmsexeporno.com", - "filt-coll.ac.uk", - "filtercams.com", - "filthdump.com", - "filton-college.ac.uk", - "filton.ac.uk", - "fimfiction.net", - "finalcutpro.com", - "financeleadsonline.com", - "financetwitter.com", - "financialadvisoriq.com", - "financialsoccer.ca", - "finchvpn.com", - "find-apple.com", - "find-cdt.ac.uk", - "findacard.com", - "findasians.live", - "findbare.com", - "findbook.tw", - "findcams.live", - "finder.ac.uk", - "findhername.net", - "findmespot.com", - "findmybeats.com", - "findmyipad.com", - "findsav.com", - "findtubes.com", - "findvrporn.com", - "findyourlimits.com", - "findyoutube.com", - "findyoutube.net", - "fine-art-nude.org", - "fineart.ac.uk", - "fineartteens.com", - "finenike.com", - "finesse.ac.uk", - "finevids.xxx", - "fingerdaily.com", - "finish.at", - "finish.bg", - "finish.co.kr", - "finish.co.nz", - "finish.co.uk", - "finish.co.za", - "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.sk", - "finisharabia.com", - "finishbrasil.com.br", - "finishdishwashing.ca", - "finishdishwashing.com", - "finishinfo.be", - "finishinfo.cl", - "finishinfo.com", - "finishinfo.com.ar", - "finishinfo.com.au", - "finishinfo.cz", - "finishinfo.fi", - "finishinfo.it", - "finishinfo.jp", - "finishinfo.nl", - "finishinfo.no", - "finishinfo.ru", - "finishinfo.se", - "finishkilpailu.fi", - "finishwin.be", - "finler.net", - "finlitsummit.org", - "fiord.ru", - "fiotolia.com", - "fipc.ac.uk", - "fircroft.ac.uk", - "fire-emblem-heroes.com", - "firearmsworld.net", - "firebase.com", - "firebase.googleapis.com", - "firebase.io", - "firebaseapp.com", - "firebaseappcheck.googleapis.com", - "firebasedynamiclinks-ipv4.googleapis.com", - "firebasedynamiclinks-ipv6.googleapis.com", - "firebasedynamiclinks.googleapis.com", - "firebaseinappmessaging.googleapis.com", - "firebaseinstallations.googleapis.com", - "firebaseio.com", - "firebaselogging-pa.googleapis.com", - "firebaselogging.googleapis.com", - "firebaseperusertopics-pa.googleapis.com", - "firebaseremoteconfig.googleapis.com", - "fireemblemawakening.com", - "fireflyresearch.ac.uk", - "firefox.com", - "firefoxusercontent.com", - "fireofliberty.org", - "fireservicecollege.ac.uk", - "fireside.fm", - "firesidegatherings.com", - "firestone.cl", - "firestone.co.cr", - "firestone.com.ar", - "firestone.com.br", - "firestone.com.co", - "firestone.com.mx", - "firestonebpco.com", - "firestonecomercial.cl", - "firestonecomercial.co.cr", - "firestonecomercial.com.ar", - "firestonecomercial.com.br", - "firestonecomercial.com.co", - "firestonecomercial.com.mx", - "firestonecompleteautocare.com", - "firestonedrivestore.com", - "firestoneip.com", - "firestonerewards.com", - "firestonetire.ca", - "firestonetire.com", - "firetweet.io", - "firewire.cl", - "firewire.eu", - "firmaprofesional.com", - "first-ns.de", - "firstanalvideos.com", - "firstchancesfife.ac.uk", - "firstfivefollowers.com", - "firstgynexam.com", - "firstpelvicexam.com", - "firstpost.com", - "firstprivatebank.com.mm", - "firstrade.com", - "fiscalstudies.ac.uk", - "fishmpegs.com", - "fitbit.com", - "fitgirl-repacks.site", - "fitnakedgirls.com", - "five-d.com", - "fivestarpornsites.com", - "fixtracking.com", - "fiz-karlsruhe.de", - "fizzik.com", - "fjlkajhgfa.top", - "fkse.ac.uk", - "fl310.com", - "flagrasamadores.net", - "flagsonline.it", - "flame.ac.uk", - "flameunleashed.com", - "flaru.com", - "flashtranny.com", - "flatandfuckedmilfs.com", - "flathub.org", - "flatmates.com.au", - "flatpak.org", - "flavournetwork.ac.uk", - "fldz8.buzz", - "flecheinthepeche.fr", - "fleek.co", - "fleshbot.com", - "fleshlyx.com", - "fleursdeslettres.com", - "flexsig.com", - "flgg.us", - "flgjustice.org", - "fli8.xyz", - "flic.kr", - "flickr.com", - "flickr.net", - "flickrhivemind.net", - "flickriver.com", - "fling.com", - "flipboard.com", - "flipfap.com", - "flipkart.com", - "flipnotestudio.com", - "flipshare.com", - "flipwithsurface.com", - "flirt4free.com", - "flirtmoms.com", - "flirtyhoookup.com", - "flitto.com", - "fljmh.com", - "flnet.org", - "flog.tw", - "floorp.app", - "floppy-tits.com", - "flow.dev", - "flow.org", - "flowfront.com", - "flowfront.net", - "flowtype.org", - "fluidfxapp.com", - "fluidpreview.com", - "fluids.ac.uk", - "flurry.com", - "flutter.dev", - "flutterapp.com", - "flyflv.com", - "flyingjizz.com", - "flyvpn.com", - "flyyindh-cc.sbs", - "flyzy2005.com", - "fm4.jp", - "fmav.top", - "fmav51.icu", - "fmc.ac.uk", - "fmcebook.com", - "fmdesktop.com", - "fmdv.ac.uk", - "fmg.ac.uk", - "fmlm.ac.uk", - "fmnnow.com", - "fnac.be", - "fnac.com", - "fnacebook.com", - "fnlondon.com", - "fnmt.es", - "foampositeshoes.com", - "fochk.org", - "focus.ac.uk", - "focustaiwan.tw", - "focusvpn.com", - "fofg-europe.net", - "fofg.org", - "fofldfradio.org", - "foftolia.com", - "folkestonecollege.ac.uk", - "follasian.com", - "followpype.com", - "fom.ac.uk", - "fonolia.com", - "fontawesome.com", - "fontbook.com", - "fontexplorerx.com", - "fonts.com", - "fonts.net", - "fontshop-prod-responsive-images.s3.amazonaws.com", - "fontshop.com", - "fontsinuse.com", - "foodchain.ac.uk", - "foodsecurity.ac.uk", - "foofle.com", - "foolsmountain.com", - "fooooo.com", - "footprint.net", - "footprintdns.com", - "footseen.com", - "footstockings.com", - "footwear-cadcam.com", - "footwiball.com", - "forbes.com", - "forbesimg.com", - "forbiddenasian.com", - "forbiddenmomsarchive.com", - "force.com", - "forduck.cyou", - "foreignaffairs.com", - "foreignpolicy.com", - "forestsixth.ac.uk", - "forestyouth.ac.uk", - "forgecdn.net", - "forhertube.com", - "formission.ac.uk", - "formit360.com", - "formitfactory.com", - "forpojie.pics", - "forster.ac.uk", - "fortawesome.com", - "forte.ac.uk", - "forthebadge.com", - "forthethrone.com", - "forthvalley.ac.uk", - "fortitude-group.ac.uk", - "fortnite.com", - "fortune.ac.uk", - "fortunecentre.ac.uk", - "fortuneinsight.com", - "forum4hk.com", - "forums-free.com", - "forzamotorsport.net", - "forzaracingchampionship.com", - "forzarc.com", - "fosebook.com", - "fotile.me", - "fotiolia.com", - "fotoiia.com", - "fotolia-noticias.com", - "fotolia.cc", - "fotolia.com", - "fotolia.tv", - "fotolja.com", - "fotoscaserasx.com", - "foundationdb.org", - "foundationyear.ac.uk", - "fourthinternational.org", - "fout.jp", - "fox-corporation.com", - "fox-news.com", - "fox.com", - "fox.tv", - "fox10.tv", - "fox10news.com", - "fox10phoenix.com", - "fox11.com", - "fox13memphis.com", - "fox13news.com", - "fox23.com", - "fox23maine.com", - "fox247.com", - "fox247.tv", - "fox26.com", - "fox26houston.com", - "fox28media.com", - "fox29.com", - "fox2detroit.com", - "fox2news.com", - "fox32.com", - "fox32chicago.com", - "fox35orlando.com", - "fox38corpuschristi.com", - "fox42kptm.com", - "fox46.com", - "fox46charlotte.com", - "fox47.com", - "fox49.tv", - "fox4news.com", - "fox51tns.net", - "fox5atlanta.com", - "fox5dc.com", - "fox5ny.com", - "fox5storm.com", - "fox6now.com", - "fox7.com", - "fox7austin.com", - "fox9.com", - "foxacrossamerica.com", - "foxaffiliateportal.com", - "foxandfriends.com", - "foxbet.com", - "foxbusiness.com", - "foxbusiness.tv", - "foxbusinessgo.com", - "foxcanvasroom.com", - "foxcareers.com", - "foxcharlotte.com", - "foxcincy.com", - "foxcincy.jobs", - "foxcincy.net", - "foxcollegesports.com", - "foxcorporation.com", - "foxcreativeuniversity.com", - "foxcredit.com", - "foxcredit.org", - "foxd.tv", - "foxdcg.com", - "foxdeportes.com", - "foxdeportes.net", - "foxdeportes.tv", - "foxdie.us", - "foxdigitalmovies.com", - "foxdoua.com", - "foxentertainment.com", - "foxesacademy.ac.uk", - "foxest.com", - "foxfaq.com", - "foxfdm.com", - "foxfiles.com", - "foxgay.com", - "foxhq.com", - "foxinc.com", - "foxkansas.com", - "foxla.com", - "foxla.tv", - "foxlexington.com", - "foxmediacloud.com", - "foxnation.com", - "foxnebraska.com", - "foxneo.com", - "foxneodigital.com", - "foxnetworks.info", - "foxnetworksinfo.com", - "foxnews.cc", - "foxnews.com", - "foxnews.net", - "foxnews.org", - "foxnews.tv", - "foxnewsaffiliates.com", - "foxnewsaroundtheworld.com", - "foxnewsb2b.com", - "foxnewschannel.com", - "foxnewsgo.net", - "foxnewsgo.org", - "foxnewsgo.tv", - "foxnewshealth.com", - "foxnewslatino.com", - "foxnewsmagazine.com", - "foxnewsnetwork.com", - "foxnewsopinion.com", - "foxnewspodcasts.com", - "foxnewspolitics.com", - "foxnewsradio.com", - "foxnewsrundown.com", - "foxnewssunday.com", - "foxon.com", - "foxphiladelphia.com", - "foxplus.com", - "foxpoker.com", - "foxporns.com", - "foxrad.io", - "foxredeem.com", - "foxrelease.com", - "foxrichmond.com", - "foxrobots.com", - "foxsmallbusinesscenter.com", - "foxsmallbusinesscenter.net", - "foxsmallbusinesscenter.org", - "foxsoccer.net", - "foxsoccer.tv", - "foxsoccermatchpass.com", - "foxsoccerplus.com", - "foxsoccerplus.net", - "foxsoccerplus.tv", - "foxsoccershop.com", - "foxsports-chicago.com", - "foxsports-newyork.com", - "foxsports-world.com", - "foxsports.cl", - "foxsports.co", - "foxsports.co.ve", - "foxsports.com", - "foxsports.com.ar", - "foxsports.com.bo", - "foxsports.com.br", - "foxsports.com.co", - "foxsports.com.ec", - "foxsports.com.gt", - "foxsports.com.mx", - "foxsports.com.pe", - "foxsports.com.py", - "foxsports.com.uy", - "foxsports.com.ve", - "foxsports.gt", - "foxsports.info", - "foxsports.net", - "foxsports.net.br", - "foxsports.pe", - "foxsports.sv", - "foxsports.uy", - "foxsports2.com", - "foxsportsflorida.com", - "foxsportsgo.com", - "foxsportsla.com", - "foxsportsnetmilwaukee.com", - "foxsportsneworleans.com", - "foxsportsracing.com", - "foxsportssupports.com", - "foxsportsuniversity.com", - "foxsportsworld.com", - "foxstudiolot.com", - "foxsub.com", - "foxsuper6.com", - "foxtang.com", - "foxtel.com", - "foxtel.com.au", - "foxtelevisionstations.com", - "foxtube.com", - "foxtv.com", - "foxtvdvd.com", - "foxuv.com", - "foxweatherwatch.com", - "fpacebook.com", - "fpm.ac.uk", - "fpmt-osel.org", - "fpmt.org", - "fpmt.tw", - "fpmtmexico.org", - "fptolia.com", - "fqcebook.com", - "fqok.org", - "fqrouter.com", - "fr-beatsbydrestore.com", - "fra.ac.uk", - "fracebook.com", - "fragment.com", - "fragrancebay.com", - "francecasquebeatssolde.com", - "francemail.com", - "francistowne.ac.uk", - "franklc.com", - "franklin.ac.uk", - "fratec.net", - "frcasquesbeats.com", - "freakshare.com", - "free-3d-porn.com", - "free-aa.com", - "free-abbywinters.com", - "free-avx.jp", - "free-erobooks.com", - "free-gate.org", - "free-hada-now.org", - "free-proxy.cz", - "free-sns.com", - "free-ss.site", - "free-ssh.com", - "free-strip-games.com", - "free-wap-tube.com", - "free-xxx-porn.org", - "free.fr", - "free00.com", - "free18.net", - "free4u.com.ar", - "free64all.com", - "freeadultcomix.com", - "freeadultgames.tv", - "freealim.com", - "freeanimalporn.net", - "freearabsexx.com", - "freeav.tv", - "freeb.com", - "freebasics.com", - "freebasics.net", - "freebdsmxxx.org", - "freebeacon.com", - "freebearblog.org", - "freebigmovies.com", - "freebrowser.org", - "freebs.com", - "freebsd.org", - "freecamsfan.com", - "freecartoons.biz", - "freechal.com", - "freechatnow.com", - "freechina.net", - "freechina.news", - "freechinaforum.org", - "freechinaweibo.com", - "freecodecamp.org", - "freeddns.com", - "freeddns.org", - "freedirecttvspecial.com", - "freedl.org", - "freedomchina.info", - "freedomcollection.org", - "freedomhongkong.org", - "freedomhouse.org", - "freedomplatform.tv", - "freedomsherald.org", - "freefacebook.com", - "freefacebook.net", - "freefacebookads.net", - "freefblikes.com", - "freefbx.com", - "freeforums.org", - "freefq.com", - "freefuckvids.com", - "freegao.com", - "freegaypornhdtube.com", - "freegaysexgames.com", - "freehdinterracialporn.in", - "freehdvideos.xxx", - "freehentaipic.com", - "freehentaistream.com", - "freehongkong.org", - "freehqtube.com", - "freehulu.com", - "freeilhamtohti.org", - "freejavbt.com", - "freejavporn.mobi", - "freekazakhs.org", - "freekwonpyong.org", - "freelifetimefuckbook.com", - "freelotto.com", - "freeman-centre.ac.uk", - "freeman2.com", - "freematuresgallery.com", - "freemoren.com", - "freemorenews.com", - "freemuse.org", - "freenet-china.org", - "freenetproject.org", - "freenewscn.com", - "freenode.net", - "freeomovie.to", - "freeones.com", - "freeopenvpn.com", - "freeoz.org", - "freeporn.com", - "freepornhdonlinegay.com", - "freepornhentaigames.com", - "freeporno.asia", - "freepornpreview.net", - "freepornq.com", - "freepornvideos.life", - "freeproxylists.net", - "freerangecloud.com", - "freerk.com", - "freescotcoll.ac.uk", - "freesexalbum.com", - "freesexgames.games", - "freesexgames.ws", - "freesexvideos2k.com", - "freesexyindians.com", - "freesexyindians.org", - "freessh.us", - "freessl.com", - "freetcp.com", - "freetibet.net", - "freetibet.org", - "freetibetanheroes.org", - "freetribe.me", - "freeuseporn.com", - "freeviewmovies.com", - "freeviewplus.net.au", - "freevpn.me", - "freevpn.nl", - "freewallpaper4.me", - "freewebs.com", - "freewechat.com", - "freeweibo.com", - "freewww.biz", - "freewww.info", - "freexinwen.com", - "freexvideos.org", - "freexxx.best", - "freexxx.win", - "freexxxporn.org", - "freeyellow.com", - "freeyouporn.mobi", - "freeyoutubeproxy.net", - "freezeframe.ac.uk", - "freezhihu.org", - "freieporno.com", - "freindfeed.com", - "frenchhistorysociety.ac.uk", - "frescolib.org", - "freshporno.net", - "freshscat.com", - "freudbox.com", - "freyalist.com", - "friday.tw", - "friendbook.info", - "frienddy.com", - "friendfed.com", - "friendfeed-api.com", - "friendfeed-media.com", - "friendfeed.com", - "friendfeedmedia.com", - "friendfinder.com", - "friends-of-tibet.org", - "friendsoftibet.org", - "fring.com", - "fringenetwork.com", - "frishoes.com", - "fritchy.com", - "from-pr.com", - "from-sd.com", - "fromchinatousa.net", - "frommel.net", - "frontier.ac.uk", - "frontiersin.org", - "frontiersofoncology.ac.uk", - "frontlinedefenders.org", - "frontrow.com", - "froogle.com", - "frootvpn.com", - "frostbite.com", - "frprn.com", - "fruitycams.com", - "fsacebok.com", - "fsb.ac.uk", - "fscebook.com", - "fscked.org", - "fsdn.com", - "fse.tv", - "fsem.ac.uk", - "fslra.ac.uk", - "fsmone.com", - "fsmone.com.hk", - "fsmone.com.my", - "fssta.com", - "fst.ac.uk", - "fstopimages.com", - "fsurf.com", - "ft.com", - "ftadviser.com", - "ftcdn.net", - "ftchinese.com", - "fteproxy.org", - "ftiecla.com", - "ftop.ru", - "ftopx.com", - "ftp1.biz", - "ftpserver.biz", - "ftv.com.tw", - "ftvgirls.com", - "ftvmilfs.com", - "ftvnews.com.tw", - "ftx.com", - "fu62.vip", - "fucd.com", - "fuchsia.dev", - "fuck-xxx-movies.com", - "fuck.com", - "fuck.sc", - "fuck55.net", - "fuck6teen.com", - "fuckableteens.net", - "fuckbookecuador.com", - "fuckcnnic.net", - "fuckcuck.com", - "fuckgames.xxx", - "fuckgfw.org", - "fuckgfw233.org", - "fuckingawesome.com", - "fuckingfreemovies.com", - "fuckingmatures.com", - "fuckingthreesome.com", - "fuckmatureporn.com", - "fuckmaturepussy.com", - "fuckmeplease.net", - "fuckmoral.com", - "fuckmypakistanigf.com", - "fucksexhub.com", - "fuckteenvids.com", - "fuckthathussy.com", - "fucktube.com", - "fuckup.xxx", - "fuckvideos.biz", - "fuellearning.ac.uk", - "fuhouse.club", - "fujinkoron.jp", - "fujossy.jp", - "fukzr1.cc", - "fulanax.com", - "fulcrum.ac.uk", - "fuli-wangzhan.com", - "fuli3.net", - "fulib711.shop", - "fuliba2021.com", - "fuliba2023.net", - "fulione.com", - "fullbookmm.blogspot.com", - "fulldesisex.com", - "fullerconsideration.com", - "fullfuli.com", - "fullhdxxx.com", - "fullpornnetwork.com", - "fullsexmovs.com", - "fulltaboo.tv", - "fullxxxmovies.net", - "fulue.com", - "fundaiphone5s.com", - "fundfire.com", - "fundinginstitutional.com", - "fundingrates.xyz", - "fundpaypal.com", - "fundraisingwithfacebook.com", - "fundsupermart.com", - "funf.tw", - "funimation.com", - "funkyimg.com", - "funnyfacebook.org", - "funnyordie.com", - "funp.com", - "funshemale.com", - "fuq.com", - "fuqqt.com", - "furaffinity.net", - "furbo.org", - "furhhdl.org", - "furinkan.com", - "furl.net", - "furness.ac.uk", - "furrypornvideos.com", - "furuke.com", - "fury.blog", - "fury.co", - "fury.dev", - "fury.help", - "fury.io", - "fuse.ac.uk", - "fusion-cdt.ac.uk", - "fusion.ac.uk", - "fusionlifecycle.com", - "fusionproductionapps.com", - "fuskator.com", - "fusker.xxx", - "futanarihq.com", - "futhead.com", - "futoka.jp", - "futpromos.com", - "futunited.com", - "future-media.ac.uk", - "future-reserves-research.ac.uk", - "futurearmedforces.ac.uk", - "futurecat.ac.uk", - "futurechinaforum.org", - "futureme.ac.uk", - "futuremedia.ac.uk", - "futuremessage.org", - "futureofbritishmanufacturing.com", - "futureofbusinesssurvey.org", - "futureofmaktingthings.com", - "futureshop.ca", - "futuretrack.ac.uk", - "futurevehicles.ac.uk", - "futureworks.ac.uk", - "fux.com", - "fuxporn.com", - "fuyin.net", - "fuyindiantai.org", - "fuyu.org.tw", - "fuzokudx.com", - "fv-distribution-database.ac.uk", - "fw.cm", - "fxcm-chinese.com", - "fxcorporate.com", - "fxn.ws", - "fxnetwork.com", - "fxnetworks.com", - "fxplus.ac.uk", - "fxporn.net", - "fzdm.com", - "fzdshare.net", - "fzh999.com", - "fzh999.net", - "fzlm.com", - "g-area.org", - "g-desktop.ru", - "g-queen.com", - "g-technology.com", - "g-tun.com", - "g-tvapp.com", - "g-xxxhub.com", - "g.co", - "g.dev", - "g.page", - "g0v.social", - "g6hentai.com", - "gab.com", - "gabocorp.com", - "gacebook.com", - "gaelicstoryatgu.ac.uk", - "gaeproxy.com", - "gaforum.org", - "gagaoolala.com", - "gaia.ac.uk", - "gainsborough.ac.uk", - "gaito.xyz", - "galaxyappstore.com", - "galaxymacau.com", - "galaxymobile.jp", - "gale.com", - "galegroup.com", - "galenwu.com", - "gallery-dump.club", - "galleryarchives.com", - "gallup.com", - "galstars.net", - "galt.ac.uk", - "gamboporn.com", - "gamcore.com", - "game-platform.net", - "game-repack.site", - "game735.com", - "gamebase.com.tw", - "gamebeforethegame.com", - "gamejolt.com", - "gamelore.fun", - "gameon-masters.com", - "gamepass.com", - "gamepedia.com", - "gameplan.ac.uk", - "gamer.com.tw", - "gameroom.com", - "gamerotic.com", - "gamerp.jp", - "gamesathletes.com", - "gamesfuckgirls.com", - "gamesofdesire.com", - "gamesstack.com", - "gameuxmasterguide.com", - "gamez.com.tw", - "gaming-notebooks.com", - "gamousa.com", - "gandhara.ru", - "gandi.net", - "ganges.com", - "ganjing.com", - "ganjing.world", - "ganjingworld.com", - "gannett-cdn.com", - "gannett.com", - "gannettdigital.com", - "gao1.cc", - "gaofuwu.cc", - "gaoming.net", - "gaopi.net", - "gaozhisheng.net", - "gaozhisheng.org", - "gaozs18.buzz", - "gardennetworks.com", - "gardennetworks.org", - "garena.co.id", - "garena.co.th", - "garena.com", - "garena.live", - "garena.my", - "garena.ph", - "garena.sg", - "garena.tv", - "garena.tw", - "garena.vn", - "garenanow.com", - "garotaporno.com", - "gartlive.com", - "gashe.ac.uk", - "gastrointestinalexam.com", - "gate-project.com", - "gate.ac.uk", - "gate.cc", - "gate.io", - "gatecoin.com", - "gatedata.org", - "gateimg.com", - "gateio.live", - "gateio.services", - "gateshead.ac.uk", - "gatesheadcollege.ac.uk", - "gatesheadlearningskills.ac.uk", - "gateway.ac.uk", - "gateway.dev", - "gather.com", - "gatherproxy.com", - "gati.org.tw", - "gauleporno.xxx", - "gay.bingo", - "gay0day.com", - "gay1069sex.com", - "gay4tube.com", - "gayapatal.com", - "gayasianamateurs.com", - "gayasiantheater.com", - "gaybeeg.info", - "gaybf.com", - "gayboystube.com", - "gaybubble.com", - "gaycamvideos.net", - "gaycn.net", - "gaycock4u.com", - "gayforit.eu", - "gayfuckporn.com", - "gayfuror.com", - "gayharem.com", - "gayheaven.org", - "gayhub.com", - "gaymaletube.com", - "gaymap.cc", - "gaymenring.com", - "gayonthenet.net", - "gaypad.net", - "gaypinoyporn.com", - "gayporn.com", - "gayporn.pro", - "gaypornforyou.com", - "gaypornhdfree.com", - "gaypornlinks.com", - "gaypornlove.net", - "gaypornmenu.com", - "gayporno.fm", - "gaypornonly.com", - "gaypornsky.com", - "gayrawclub.com", - "gayroom.com", - "gaysheaven.blogspot.com", - "gaysonic.eu", - "gaystarnews.com", - "gaystream.pw", - "gaythebest.com", - "gaytopcams.com", - "gaytube.com", - "gayvl.net", - "gaywatch.com", - "gazotube.com", - "gazounabi.com", - "gbank.com.mm", - "gbluebooks.blogspot.com", - "gbmc.ac.uk", - "gbmolluscatypes.ac.uk", - "gbnews.uk", - "gbs3trial.ac.uk", - "gbxml.net", - "gca.ac.uk", - "gcadt.ac.uk", - "gcal.ac.uk", - "gcbp.ac.uk", - "gcc.ac.uk", - "gcc.org.hk", - "gceducationandskills.ac.uk", - "gcft-gla.ac.uk", - "gcft.ac.uk", - "gcg.ac.uk", - "gci.ac.uk", - "gcld-line.com", - "gclg.ac.uk", - "gclooney.com", - "gclubs.com", - "gcmasia.com", - "gcns.ac.uk", - "gcolle.net", - "gcpnews.com", - "gcr.io", - "gcrb.ac.uk", - "gcrtires.com", - "gcs.ac.uk", - "gcsp.ac.uk", - "gcu.ac.uk", - "gculondon.ac.uk", - "gda.ac.uk", - "gdaily.org", - "gdansk-amazon.com", - "gdbt.net", - "gdian-dh.mom", - "gdsrx888.com", - "gdzf.org", - "gears5.com", - "gearspop.com", - "gearstactics.com", - "geasontraining.ac.uk", - "geceguby.ru", - "gecko.ac.uk", - "geek-art.net", - "geek-squad-support.com", - "geek-squad.net", - "geek-squad.org", - "geek-squads.net", - "geekerhome.com", - "geekheart.info", - "geeksquad.ca", - "geeksquad.cc", - "geeksquad.com", - "geeksquad.net", - "geeksquad.tv", - "geeksquadcares.com", - "geeksquadcentral.com", - "geeksquadforums.com", - "geeksquadonline.com", - "geeksquadprotectionplan.org", - "geeksquadservices.org", - "geeksquadwebroot.org", - "geelongadvertiser.com.au", - "geforce.co.kr", - "geforce.co.uk", - "geforce.com", - "geforce.com.tw", - "geilegratisporno.com", - "geileomas.com", - "geinoueroch.com", - "geiriadur.ac.uk", - "gekikame.com", - "gelbooru.com", - "gelbooru.me", - "geller-pa.googleapis.com", - "gem.ac.uk", - "gemfire.net", - "gemfury.com", - "gemini.com", - "gen2.ac.uk", - "gendai.net", - "generated.photos", - "generationpup.ac.uk", - "generativeai.google", - "generativelanguage.googleapis.com", - "genesis.ac.uk", - "genesys.ac.uk", - "genet.ac.uk", - "geneticconstructor.com", - "geng8cn.xyz", - "gengba-av.mom", - "gengba.cc", - "genius.com", - "genkai-hounyo.com", - "genomeanalysiscentre.ac.uk", - "genomicsnetwork.ac.uk", - "genshin-porn.com", - "genshinh.com", - "genshinimpact.com", - "gentoo.org", - "geocities.co.jp", - "geocities.com", - "geocities.jp", - "geodesummit.com", - "geohazard.ac.uk", - "geolytics.com", - "geoport.com", - "george-monoux.ac.uk", - "geospatialimaging.com", - "geospatialinfo.com", - "geotrust.com", - "geoxwalk.ac.uk", - "geph.io", - "geraldoatlarge.com", - "gerc.ac.uk", - "gerefoundation.org", - "gerritcodereview.com", - "gesource.ac.uk", - "get.app", - "get.dev", - "get.how", - "get.new", - "get.page", - "get.rsvp", - "getadblock.com", - "getamoveon.ac.uk", - "getastrill.com", - "getbootstrap.com", - "getboxer.com", - "getbraintree.com", - "getbumptop.com", - "getbuzzsaw.com", - "getchu.com", - "getcloak.com", - "getcomposer.org", - "getdirect.tv", - "getdrebeatssale.com", - "getdropbox.com", - "getfappy.com", - "getfedora.org", - "getfoxyproxy.org", - "getfreedur.com", - "getgom.com", - "geti2p.net", - "getiton.com", - "getjetso.com", - "getlantern.org", - "getmalus.com", - "getmdl.io", - "getoutline.org", - "getpocket.com", - "getporn.tv", - "getprintersupports.com", - "getscorecash.com", - "getsexgames.com", - "getsocialscope.com", - "getsync.com", - "gettr.com", - "gettrials.com", - "gettyimages.ae", - "gettyimages.at", - "gettyimages.be", - "gettyimages.ca", - "gettyimages.ch", - "gettyimages.co.jp", - "gettyimages.co.nz", - "gettyimages.co.uk", - "gettyimages.com", - "gettyimages.com.au", - "gettyimages.com.br", - "gettyimages.com.mx", - "gettyimages.de", - "gettyimages.dk", - "gettyimages.es", - "gettyimages.fi", - "gettyimages.fr", - "gettyimages.hk", - "gettyimages.ie", - "gettyimages.in", - "gettyimages.it", - "gettyimages.nl", - "gettyimages.no", - "gettyimages.pt", - "gettyimages.se", - "getuploader.com", - "getws1.com", - "getwsone.com", - "getzola.org", - "gfacecbook.com", - "gfarchive.com", - "gfashion.com", - "gfbv.de", - "gfgold.com.hk", - "gfleaks.com", - "gfnormal05at.com", - "gfotolia.com", - "gfpics.com", - "gfpornbox.com", - "gfpornmovies.com", - "gfpornvideos.com", - "gfrevenge.com", - "gfsale.com", - "gfw.org.ua", - "gfw.press", - "gfw.report", - "gfx.ms", - "gfycat.com", - "gfysex.com", - "ggdiao.com", - "ggjav.com", - "ggoogle.com", - "ggpds.com", - "ggpht.com", - "ggsrv.com", - "ggssl.com", - "ghanely.me", - "ghcr.io", - "ghettotube.com", - "ghidra-sre.org", - "ghil.ac.uk", - "ghostgames.com", - "ghostpath.com", - "ghut.org", - "giantessbooru.com", - "giantessnight.com", - "giffgaff.com", - "giffgaff.design", - "gifnuki.com", - "gifree.com", - "gift-surg.ac.uk", - "giga-web.jp", - "gigabyte.com", - "gigacircle.com", - "giganews.com", - "gigantits.com", - "gigaporn.org", - "gigaxvideos.com", - "gigjam.com", - "gigporno.ru", - "gimsig.ac.uk", - "gimy.cc", - "gimy.co", - "gimy.to", - "gimy.tv", - "ginmoe.com", - "ginzasonypark.jp", - "gipscorp.com", - "giratina.com", - "girl-secret.com", - "girl7942.com", - "girlbanker.com", - "girlfriendgalleries.net", - "girlfriendhomeporn.com", - "girlfriendvideos.com", - "girlfriendvids.net", - "girlfuckshorse.net", - "girlfur.com", - "girls.xyz", - "girls2see.ch", - "girlscanner.cc", - "girlscv.com", - "girlsdelta.com", - "girlsfuck-tube.com", - "girlsheaven-job.net", - "girlsnudepic.com", - "girlsofdesire.org", - "girlsongirlstube.com", - "girlspoopingtube.com", - "girlssexxxx.com", - "girlstryanal.com", - "girlsway.com", - "girlswelustfor.com", - "girlsxxx.net", - "gisplanning.com", - "git-scm.com", - "git.io", - "gitbook.com", - "gitbook.io", - "gitbooks.io", - "githack.com", - "github-cloud.s3.amazonaws.com", - "github.blog", - "github.com", - "github.community", - "github.dev", - "github.io", - "githubapp.com", - "githubassets.com", - "githubcopilot.com", - "githubhackathon.com", - "githubnext.com", - "githubpreview.dev", - "githubstatus.com", - "githubuniverse.com", - "githubusercontent.com", - "gitlab-static.net", - "gitlab.com", - "gitlab.io", - "gitlab.net", - "gitstar.com", - "gitstar.net", - "gittigidiyor.net", - "gittigidiyorsikayet.com", - "givemebuzzsaw.com", - "gizlen.net", - "gizmoxxx.com", - "gjczz.com", - "gla.ac.uk", - "glaadh.ac.uk", - "gladporn.com", - "gladstudy.ac.uk", - "glam.ac.uk", - "glam0ur.com", - "glammies.ac.uk", - "glamorgan.ac.uk", - "glamourtits.com", - "glan-hafren.ac.uk", - "glasamerike.net", - "glasgow-caledonian.ac.uk", - "glasgow-nautical.ac.uk", - "glasgow.ac.uk", - "glasgowclyde.ac.uk", - "glasgowcolleges.ac.uk", - "glasgowkelvin.ac.uk", - "glasgowmedhums.ac.uk", - "glasgowmet.ac.uk", - "glasgowschoolofart.ac.uk", - "glasgowsciencecentre.ac.uk", - "glasgowsequencingsolutions.ac.uk", - "glass8.eu", - "gleline.com", - "glen-coll.ac.uk", - "glenfife.ac.uk", - "glenrothes-college.ac.uk", - "glhl.ac.uk", - "gllm.ac.uk", - "global-sci.org", - "globalbanking.ac.uk", - "globalbusinessofforcedlabour.ac.uk", - "globaledu.org", - "globaljihad.net", - "globalmediaoutreach.com", - "globalmuseumoncommunism.org", - "globalrescue.net", - "globalriskregulator.com", - "globalsecurity.org", - "globalshakespeare.ac.uk", - "globalsign-media.com", - "globalsign.be", - "globalsign.ch", - "globalsign.cloud", - "globalsign.co.uk", - "globalsign.com.au", - "globalsign.com.br", - "globalsign.com.hk", - "globalsign.com.sg", - "globalsign.es", - "globalsign.eu", - "globalsign.fr", - "globalsign.net", - "globalsign.nl", - "globalspec.com", - "globaltm.org", - "globalvoices.org", - "globalvoicesonline.org", - "globalvpn.net", - "globolakes.ac.uk", - "glock.com", - "gloknos.ac.uk", - "gloporn.com", - "gloryhole.com", - "gloryholeswallow.com", - "gloryofheracles.com", - "glorystar.me", - "glos.ac.uk", - "gloscat.ac.uk", - "gloscol.ac.uk", - "gloscolgov.ac.uk", - "gloscollege.ac.uk", - "glosnexus.ac.uk", - "gloucestershire.ac.uk", - "gloucestershirecollege.ac.uk", - "gloucestershirecolleges.ac.uk", - "gloucestershirelaunchpad.ac.uk", - "gloucs.ac.uk", - "glovitas.ac.uk", - "glow.ac.uk", - "glsms.ac.uk", - "gltc.ac.uk", - "gluckman.com", - "glyndwr.ac.uk", - "glyndwrlondonholdingslimited.ac.uk", - "glyndwrlondonschoolofmanagementandscience.ac.uk", - "glype.com", - "glyphsapp.com", - "gmail.com", - "gmc.ac.uk", - "gmcg.ac.uk", - "gmcyberfoundry.ac.uk", - "gmgard.com", - "gmhigher.ac.uk", - "gmhz.org", - "gmiddle.com", - "gmiddle.net", - "gmims.ac.uk", - "gmll.org", - "gmms.ac.uk", - "gmnetworks.net", - "gmodules.com", - "gmoney.org", - "gmossp-sp.jp", - "gmsa.ac.uk", - "gmx.net", - "gnai-dh.sbs", - "gnailapp.sbs", - "gnatwork.ac.uk", - "gnci.org.hk", - "gnews.org", - "gnom-cham.com", - "gnu.org", - "gnzi.xyz", - "gnzi1.top", - "go-disneyworldgo.com", - "go-gaytube.com", - "go-lang.com", - "go-lang.net", - "go-lang.org", - "go-pki.com", - "go.com", - "go.dev", - "go141.com", - "go2av.com", - "go4uni.ac.uk", - "go5.dev", - "go6.si", - "goagent.biz", - "goagentplus.com", - "goagle.de", - "goals.ac.uk", - "gobeatsye.com", - "gobet.cc", - "gobianywhere.com", - "gobuildx.net", - "gobuyonlinestore.net", - "gockhuatviet.com", - "godaddy.com", - "godalming.ac.uk", - "godfootsteps.org", - "godns.work", - "godoc.org", - "godsdirectcontact.co.uk", - "godsdirectcontact.org", - "godsdirectcontact.org.tw", - "godsimmediatecontact.com", - "goduckgo.com", - "goetec.ac.uk", - "gofile.me", - "gofit.ac.uk", - "gofucker.com", - "gofuckmenow.com", - "gofundme.com", - "gog-statics.com", - "gog.com", - "gogeo.ac.uk", - "gogle.com", - "gogle.de", - "gogo-load.com", - "gogoanime.vc", - "gogoanime.wiki", - "gogoanime3.co", - "gogocdn.net", - "gogole.com", - "gogotaku.info", - "gogotunnel.com", - "gohappy.com.tw", - "gohentai.net", - "gohigherwestyorks.ac.uk", - "gokbayrak.com", - "golang.com", - "golang.net", - "golang.org", - "gold-gay.com", - "gold.ac.uk", - "goldbet.com", - "goldbetsports.com", - "goldcoastbulletin.com.au", - "golden-ages.org", - "goldeneyevault.com", - "goldenfrog.com", - "goldengate.hu", - "goldgay.tv", - "goldjizz.com", - "goldnikeclub.com", - "goldproject.ac.uk", - "goldsexvideos.com", - "goldsmiths.ac.uk", - "goldstep.net", - "goldteenporn.com", - "goldvip.cyou", - "goldwave.com", - "golos-ameriki.ru", - "golosameriki.com", - "gongkou-cc.sbs", - "gonglchuangl.net", - "gongm.in", - "gongmeng.info", - "gongminliliang.com", - "gongwt.com", - "gonike.com", - "gonzo-movies.com", - "gonzo.com", - "goo.gl", - "goo.gle", - "goo.ne.jp", - "good-gay.com", - "gooday.xyz", - "gooddaychicago.com", - "gooddns.info", - "goodenough.ac.uk", - "goodhope.school", - "goodporn.to", - "goodporno.cc", - "goodreaders.com", - "goodreads.com", - "goodsdunk.net", - "goodsexporn.org", - "goodtv.com.tw", - "goodtv.tv", - "goofind.com", - "googel.com", - "googel.de", - "googil.com", - "googl.com", - "google-access.net", - "google-analytics-cn.com", - "google-analytics.com", - "google-base.de", - "google-syndication.com", - "google.ad", - "google.ae", - "google.al", - "google.am", - "google.as", - "google.at", - "google.az", - "google.ba", - "google.be", - "google.berlin", - "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", - "google.co", - "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.nf", - "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.dev", - "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.gp", - "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.net", - "google.nl", - "google.no", - "google.nr", - "google.nu", - "google.org", - "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.tk", - "google.tl", - "google.tm", - "google.tn", - "google.to", - "google.tt", - "google.ventures", - "google.vg", - "google.vu", - "google.ws", - "googleacquisitionmigration.com", - "googleadapis.com", - "googleads-cn.com", - "googleads.com", - "googleadservices-cn.com", - "googleadservices.com", - "googleadsserving.cn", - "googleanalytics.com", - "googleapis.cn", - "googleapis.com", - "googleapps.com", - "googlearth.com", - "googleartproject.com", - "googleblog.com", - "googlebot.com", - "googlecapital.com", - "googlecert.net", - "googlechinawebmaster.com", - "googlecode.com", - "googlecommerce.com", - "googlecompare.co.uk", - "googledanmark.com", - "googledomains.com", - "googledrive.com", - "googlee.com", - "googleearth.com", - "googlefiber.com", - "googlefiber.net", - "googlefinland.com", - "googlegroups.com", - "googlehosted.com", - "googleideas.com", - "googleinsidesearch.com", - "googlelabs.com", - "googlelocal.nl", - "googlemail.com", - "googlemaps.com", - "googlemaps.sv", - "googlemashups.com", - "googleoptimize-cn.com", - "googleoptimize.com", - "googlepagecreator.com", - "googlephotos.com", - "googleplay.com", - "googleplus.com", - "googlescholar.com", - "googlesile.com", - "googlesource.com", - "googlestore.com", - "googlesverige.com", - "googlesyndication-cn.com", - "googlesyndication.com", - "googletagmanager-cn.com", - "googletagmanager.com", - "googletagservices-cn.com", - "googletagservices.com", - "googletraveladservices-cn.com", - "googletraveladservices.com", - "googleusercontent.com", - "googlevads-cn.com", - "googleventures.com", - "googlevideo.com", - "googleweblight.com", - "googlezip.net", - "googlr.com", - "goole-college.ac.uk", - "goolge.com", - "gooogle.com", - "gopetition.com", - "gopivotal.com", - "gopivotal.net", - "goporngate.com", - "goproxing.net", - "goragay.com", - "gordonmoore.com", - "goreforum.com", - "goregrish.com", - "gorin.jp", - "gorseinon-bizcentre.ac.uk", - "gorseinon.ac.uk", - "gosc.ac.uk", - "gosexpod.com", - "goshemalecams.com", - "gospelherald.com", - "gosport.ac.uk", - "gosportmarineskillscentre.ac.uk", - "gosq.co", - "gosq.com", - "gossipfuli4511.xyz", - "gossipfuli5522.xyz", - "gossipfuli6883.xyz", - "gostorego.com", - "gostosanovinha.com", - "got-game.org", - "gotblop.com", - "gotcosmos.com", - "gotdns.ch", - "gotgayporn.com", - "gotgeeks.com", - "gothdporn.com", - "gotporn.com", - "gotraffic.net", - "gotrusted.com", - "gotw.ca", - "gouri.xyz", - "gov.taipei", - "gov.tw", - "governmentengineer.com", - "govforce.com", - "gowales.ac.uk", - "gower.ac.uk", - "gowercollege.ac.uk", - "gowercollegeswansea.ac.uk", - "gpkss.ac.uk", - "gpstheseries.com", - "gpucomputing.ac.uk", - "gputechconf.co.kr", - "gputechconf.com", - "gputechconf.com.au", - "gputechconf.com.tw", - "gputechconf.eu", - "gputechconf.in", - "gputechconf.jp", - "gqzmnav.cc", - "gr-assets.com", - "gr8domain.biz", - "gr8name.biz", - "grabhentai.com", - "grabpussy.com", - "grace.ac.uk", - "grad2teach.ac.uk", - "gradcareers-scotland.ac.uk", - "gradconnection.com", - "gradeuptube.com", - "gradschools.ac.uk", - "graduate-careers-wales.ac.uk", - "graduate-jobs-in-wales.ac.uk", - "graduate-jobs.ac.uk", - "graduatecareers-wales.ac.uk", - "graduateconnection.ac.uk", - "graduateoutcomes.ac.uk", - "graduateswales.ac.uk", - "graduatewales.ac.uk", - "grafolio.com", - "graias.com", - "graiasmovies.com", - "grammaly.com", - "grandepornogratis.com", - "grandfuckauto.xxx", - "grandtrial.org", - "granduniondtp.ac.uk", - "graneodin.com.mx", - "grangorz.org", - "grannygetsafacial.com", - "grannylister.com", - "grannylovesbbc.com", - "grannylovesyoungcock.com", - "grannytube.net", - "grantham.ac.uk", - "grantleyhall.ac.uk", - "graph.org", - "graphenecentre.ac.uk", - "graphengine.io", - "graphis.ne.jp", - "graphql.org", - "gravatar.com", - "gravitytank.com", - "gray.ac.uk", - "graylab.ac.uk", - "grazie.ai", - "grcb.ac.uk", - "gre.ac.uk", - "greasespot.net", - "great-firewall.com", - "great-roc.org", - "greatapedictionary.ac.uk", - "greatergothammini.com", - "greatermanchesterbiobankingnetwork.ac.uk", - "greatermanchestercolleges.ac.uk", - "greatermanchesterinternationalmedicalschool.ac.uk", - "greatermanchestermedicalschool.ac.uk", - "greatfire.org", - "greatfirewall.biz", - "greatfirewallofchina.net", - "greatfirewallofchina.org", - "greatretroporn.com", - "greatroc.org", - "greatroc.tw", - "greatwesternresearch.ac.uk", - "greatzhonghua.org", - "greenbankcollege.ac.uk", - "greenbuildingstudio.com", - "greenend.org.uk", - "greenfieldbookstore.com.hk", - "greenhead.ac.uk", - "greenhill.ac.uk", - "greenlakeaas.com", - "greenlakehybridcloud.com", - "greenparty.org.tw", - "greenpeace.com.tw", - "greenpeace.org", - "greenplum.net", - "greenreadings.com", - "greenvpn.net", - "greenvpn.org", - "greenwich-college.ac.uk", - "greenwich.ac.uk", - "greenwichdev.ac.uk", - "greginhollywood.com", - "gregynog.ac.uk", - "gresham-college.ac.uk", - "gresham.ac.uk", - "greshamcollege.ac.uk", - "grid-support.ac.uk", - "grid.ac.uk", - "gridaware.app", - "gridpp.ac.uk", - "grids.ac.uk", - "grimsby.ac.uk", - "grimsbytec.ac.uk", - "grindr.com", - "grooby.com", - "grotty-monday.com", - "groupfun.com", - "groups.com", - "grow.google", - "grows.ac.uk", - "grpeng.ac.uk", - "grss-ieee.org", - "grupobmw.com", - "gs-discuss.com", - "gsa.ac.uk", - "gscanada.info", - "gsccdn.com", - "gsearch.media", - "gslink.us", - "gsmd.ac.uk", - "gsmlondon.ac.uk", - "gsrc.io", - "gssw.ac.uk", - "gstatic.com", - "gstf.org", - "gsuite.com", - "gt536.top", - "gtc.ac.uk", - "gtricks.com", - "gts-vpn.com", - "gttr.ac.uk", - "gtv.org", - "gtv1.org", - "gtvmediagroupfairfund.com", - "gtyarmouthcoll.ac.uk", - "gu-chu-sum.org", - "gu-web.net", - "guaguass.com", - "guaguass.org", - "guambmw.com", - "guancha.org", - "guaneryu.com", - "guangming.com.my", - "guangming.org", - "guangnianvpn.com", - "guaranitermal.com", - "guardianapis.com", - "guardianapps.co.uk", - "guardianproject.info", - "guardster.com", - "gucci.com", - "guccimuseo.com", - "guccitimeless.com", - "guifw.xyz", - "guildford.ac.uk", - "guildhallschool.ac.uk", - "guildhe.ac.uk", - "guim.co.uk", - "guimcode.co.uk", - "guishan.org", - "gumroad.com", - "gumtree.sg", - "gun-world.net", - "gunsamerica.com", - "gunsandammo.com", - "guo.media", - "guochantube.com", - "guochanw.life", - "guruofporn.com", - "guruonline.hk", - "gutteruncensored.com", - "guysnightlife.com", - "gv.com", - "gvideo.de", - "gvlib.com", - "gvm.com.tw", - "gvt0.com", - "gvt1.com", - "gvt2.com", - "gvt3.com", - "gvt5.com", - "gvt6.com", - "gvt7.com", - "gvt9.com", - "gw-partnership.ac.uk", - "gw4-cat.ac.uk", - "gw4.ac.uk", - "gw4biomed.ac.uk", - "gwave.com", - "gwent.ac.uk", - "gwiki.net", - "gwins.org", - "gwktravelex.nl", - "gwr.ac.uk", - "gwtproject.org", - "gyakusimei.com", - "gyalwarinpoche.com", - "gyatsostudio.com", - "gyc.ac.uk", - "gynoexam.info", - "gyutte.site", - "gyutto.com", - "gzm.tv", - "gzone-anime.info", - "h-cdn.com", - "h-china.org", - "h-comic.com", - "h-doujinshi.xyz", - "h-flash.com", - "h-moe.com", - "h-webtoon.com", - "h0930.com", - "h18ani1.vip", - "h1n1china.org", - "h2porn.com", - "h528.com", - "h5dm.com", - "h5galgame.me", - "hace.ac.uk", - "hacg.club", - "hacg.in", - "hacg.li", - "hacg.me", - "hacg.red", - "hackday.com.au", - "hacken.cc", - "hacker.org", - "hackerfacebook.com", - "hackerguardian.com", - "hackfacebook.com", - "hackfacebookid.com", - "hacklang.org", - "hackmd.io", - "hackney.ac.uk", - "hacksear.ch", - "hackthatphone.net", - "hackthedrive.com", - "hackyourconsole.com", - "hadesex.com", - "hadlow.ac.uk", - "hadlowgroup.ac.uk", - "hae-acl.ac.uk", - "haha888.xyz", - "hahlo.com", - "haho.moe", - "haijiao.com", - "hairdressing.ac.uk", - "hairy-amateurs.com", - "hairy-beauty.com", - "hairy-women-pussy.net", - "hairyclassic.com", - "hairydivas.com", - "hairynature.com", - "hairyolder.com", - "hairypornsite.com", - "haisetu.net", - "haitenjp.com", - "haiwaikan.com", - "hakkatv.org.tw", - "halcyon.ac.uk", - "halesowen.ac.uk", - "half.com", - "half.tv", - "halfcanada.com", - "halfjapan.com", - "halktv.com.tr", - "halton-acl.ac.uk", - "haltoncollege.ac.uk", - "hamec.ac.uk", - "hami-mod.buzz", - "hampsteadscience.ac.uk", - "hamsterfucktube.com", - "hamsterporn.tv", - "hanbao-tv.lol", - "handbags-nike.com", - "handbagsoutletebay.com", - "handcraftedsoftware.org", - "handjobhub.com", - "handjobtube4free.com", - "handsworth.ac.uk", - "hanime.me", - "hanime.tv", - "hanime.xxx", - "hanime1.me", - "hanminzu.org", - "hannah.ac.uk", - "hanr-bao.mom", - "hanunyi.com", - "hao.news", - "hao123.com", - "hao123img.com", - "hao21.xyz", - "hao62.xyz", - "haori888.com", - "haplorrhini.com", - "happy-vpn.com", - "happymeal.co.nz", - "happymeal.com", - "happymeal.com.au", - "happymealdigital.com", - "haproxy.org", - "hardcore-sex-filme.com", - "hardcoregayblog.com", - "hardsex8.com", - "hardsextube.com", - "hardx.com", - "harica.gr", - "haringey6.ac.uk", - "harlaxton.ac.uk", - "harlech.ac.uk", - "harlow-college.ac.uk", - "harper-adams.ac.uk", - "harper.ac.uk", - "harperacademic.com", - "harperadams.ac.uk", - "harperapps.com", - "harpercollins.ca", - "harpercollins.co.in", - "harpercollins.co.uk", - "harpercollins.com", - "harpercollins.com.au", - "harpercollinsadvantage.com", - "harpercollinschildrensbooks.co.uk", - "harpercollinschristian.com", - "harpercollinsspeakersbureau.com", - "harperkeelevets.ac.uk", - "harperkeelevetschool.ac.uk", - "harrogate-college.ac.uk", - "harrogate.ac.uk", - "harrow.ac.uk", - "hartlepoolacademy.ac.uk", - "hartlepoolacl.ac.uk", - "hartlepoolfe.ac.uk", - "hartlepoolsixth.ac.uk", - "hartpury.ac.uk", - "hartpurycollege.ac.uk", - "hartpuryuni.ac.uk", - "hartpuryuniversity.ac.uk", - "hartpuryuniversitycentre.ac.uk", - "hartree.ac.uk", - "harunyahya.com", - "hashflow.com", - "hashicorp.com", - "hasi.wang", - "haskell.org", - "haskellstack.org", - "hastings.ac.uk", - "hastingsonline.ac.uk", - "hath.network", - "hau.ac.uk", - "hautelook.com", - "hautelookcdn.com", - "havant.ac.uk", - "havantandsouthdowns.ac.uk", - "havantsouthdowns.ac.uk", - "have8.com", - "haveibeenpwned.com", - "havering-college.ac.uk", - "havering-sfc.ac.uk", - "havering.ac.uk", - "hawaiibmw.com", - "hayabusa.dev", - "hayabusa.io", - "hayabusa.media", - "hayle.ac.uk", - "haywardsheath.ac.uk", - "hbabit.com", - "hbfile.net", - "hbg.com", - "hbo.com", - "hbo.map.fastly.net", - "hboasia.com", - "hbogo.co.th", - "hbogo.com", - "hbogo.eu", - "hbogoasia.com", - "hbogoasia.hk", - "hbogoasia.id", - "hbogoasia.ph", - "hbogoasia.sg", - "hbogoasia.tw", - "hbomax.com", - "hbomaxcdn.com", - "hbonow.com", - "hbox.jp", - "hbrowse.com", - "hbs.ac.uk", - "hbvc.ac.uk", - "hca.ac.uk", - "hcaptcha.com", - "hcaptchastatus.com", - "hcbdsm.com", - "hcctraining.ac.uk", - "hcebusiness.ac.uk", - "hcfe.ac.uk", - "hclips.com", - "hclrg.ac.uk", - "hcomic.net", - "hcomicbook.com", - "hcpdts.com", - "hcri.ac.uk", - "hct.ac.uk", - "hcuc.ac.uk", - "hd-tubes.com", - "hdabla.net", - "hdb1.app", - "hdbigass.com", - "hddgames.cc", - "hddirectv.com", - "hdfreeporn.net", - "hdgaytube.xxx", - "hdhole.com", - "hdjavonline.com", - "hdlt.me", - "hdouban.com", - "hdouban2.com", - "hdouga.com", - "hdporn1080.net", - "hdporn92.com", - "hdporncomics.com", - "hdpornfree.xxx", - "hdpornmax.net", - "hdpornt.com", - "hdpornvideo.xxx", - "hdready.xxx", - "hdreporn.com", - "hdrplusdata.org", - "hdruk.ac.uk", - "hdsex.pro", - "hdsexxx.net", - "hdsky.me", - "hdtube.co", - "hdtube1.com", - "hdtvb.net", - "hdvideosporn.net", - "hdxnxx.xxx", - "hdxx.tv", - "hdzog.com", - "he-purchasing.ac.uk", - "he.net", - "heacademy.ac.uk", - "headline.ac.uk", - "headlinejobs.hk", - "headphonepubs.com", - "headphones-cool.com", - "headphones-dre.com", - "headphones-outlet-online.com", - "headphonesbeatsaudio.com", - "headphonesbeatsbydre.com", - "headphoneses.com", - "headphoneshome.com", - "headphoneshotsales.com", - "headphonesol.com", - "headphonesretailer.com", - "headphonessupply.com", - "headphonezip.com", - "headset987.com", - "headteachers.ac.uk", - "health.ac.uk", - "health026.click", - "healthcare.ac.uk", - "healthcarecareeronline.com", - "healthcarescience.ac.uk", - "healthcaretechnologies.ac.uk", - "healthdataresearchuk.ac.uk", - "healtheducation.ac.uk", - "healthreach.hk", - "healthsciencescotland.ac.uk", - "healthyuniversities.ac.uk", - "hear.ac.uk", - "heart.ac.uk", - "heartbreakers.gallery", - "heartbreakers.info", - "heartofworcestershirecollege.ac.uk", - "heartofworcestershirelawschool.ac.uk", - "heartyit.com", - "heat.ac.uk", - "heated.ac.uk", - "heaven-burns-red.com", - "heavenlyhentai.com", - "heavy-r.com", - "heavyfetish.com", - "hebcon.ac.uk", - "hebetterregulation.ac.uk", - "hebiphone.com", - "hec.su", - "hecail.ac.uk", - "hecaitou.net", - "hecbiosim.ac.uk", - "hechaji.com", - "hecollegeadvisersinlondon.ac.uk", - "hecsu.ac.uk", - "hector.ac.uk", - "hedata.ac.uk", - "hedd.ac.uk", - "hedg.ac.uk", - "hediip.ac.uk", - "hedip.ac.uk", - "heeact.edu.tw", - "heefs.ac.uk", - "heeg.ac.uk", - "heep.ac.uk", - "heesf.ac.uk", - "heestates.ac.uk", - "hefce.ac.uk", - "hefcw.ac.uk", - "hefestis.ac.uk", - "hegovernance.ac.uk", - "hegre-art.com", - "hegre.com", - "hei-worcester.ac.uk", - "heia.ac.uk", - "heidi.ac.uk", - "heids.ac.uk", - "heiguab.top", - "heijidi.life", - "heilbronn.ac.uk", - "heinlondon.ac.uk", - "heinonline.org", - "heise360181.buzz", - "heise360182.buzz", - "helf.ac.uk", - "helixstudios.net", - "helloandroid.com", - "helloavgirls.com", - "hellofuture.ac.uk", - "hellokittybeats.com", - "helloqueer.com", - "hellosmartbook.com", - "helloss.pw", - "hellotxt.com", - "hellouk.org", - "hellporno.com", - "hellven.net", - "heloa.ac.uk", - "helpeachpeople.com", - "helplinfen.com", - "helpshift.com", - "helpster.de", - "helpuyghursnow.org", - "helpzhuling.org", - "hendon.ac.uk", - "henduohao.com", - "henley-cov.ac.uk", - "henley.ac.uk", - "henleycol.ac.uk", - "henleycollege.ac.uk", - "henleymc.ac.uk", - "henry-moore.ac.uk", - "henryfordcollege.ac.uk", - "hensa.ac.uk", - "henshaws.ac.uk", - "hentai-ani.me", - "hentai-archive.com", - "hentai-books.com", - "hentai-cosplays.com", - "hentai-covers.site", - "hentai-eroanime.net", - "hentai-for.net", - "hentai-fun.com", - "hentai-gamer.com", - "hentai-gif-anime.com", - "hentai-img.com", - "hentai-moon.com", - "hentai-vostfr.net", - "hentai.desi", - "hentai.game", - "hentai.io", - "hentai.name", - "hentai.pink", - "hentai.pro", - "hentai.to", - "hentai.toys", - "hentai.tv", - "hentai0.com", - "hentai01.com", - "hentai2.net", - "hentai2012.com", - "hentai247.net", - "hentai24h.org", - "hentai24h.tv", - "hentai2games.com", - "hentai2read.com", - "hentai2w.com", - "hentai3dvideo.biz", - "hentai44.com", - "hentai4free.net", - "hentai4manga.com", - "hentai69.life", - "hentai69.online", - "hentaia.net", - "hentaiaction.net", - "hentaiasmr.moe", - "hentaiathome.net", - "hentaibaka.one", - "hentaibar.com", - "hentaiblue.com", - "hentaibros.com", - "hentaicity.com", - "hentaicloud.com", - "hentaiclub.net", - "hentaicomic.ru", - "hentaicomics.asia", - "hentaicomics.life", - "hentaicore.net", - "hentaicore.org", - "hentaicovid.com", - "hentaidirectory.org", - "hentaidude.com", - "hentaidude.xxx", - "hentaienvy.com", - "hentaiera.com", - "hentaiero.net", - "hentaifc.com", - "hentaifox.com", - "hentaifox.tv", - "hentaifreak.org", - "hentaifromhell.org", - "hentaigamer.org", - "hentaigamesplanet.com", - "hentaigasm.com", - "hentaihand.com", - "hentaihaven.com", - "hentaihaven.io", - "hentaihaven.me", - "hentaihaven.red", - "hentaihaven.xxx", - "hentaiheadlines.com", - "hentaihere.com", - "hentaiheroes.com", - "hentaihub.xxx", - "hentaikey.com", - "hentaiknight.com", - "hentailabs.com", - "hentailegendado.com", - "hentaimama.io", - "hentaimangaporn.com", - "hentaimovieplanet.com", - "hentainanime.com", - "hentainhaven.com", - "hentainstream.com", - "hentaipapa.com", - "hentaipaw.com", - "hentaiplay.net", - "hentaiporn.com", - "hentaipornonly.com", - "hentaiprn.com", - "hentaiprno.com", - "hentaipros.com", - "hentairead.com", - "hentairead.info", - "hentairead.vip", - "hentairox.com", - "hentairules.net", - "hentais.tube", - "hentaisea.com", - "hentaiseason.com", - "hentaispark.com", - "hentaistream.com", - "hentaistream.tv", - "hentaistube.com", - "hentaisub.info", - "hentaitalk.com", - "hentaitk.com", - "hentaitokyo.com", - "hentaitube.online", - "hentaitube.tv", - "hentaiverse.org", - "hentaivideos.net", - "hentaivideoworld.com", - "hentaivn.de", - "hentaivn.la", - "hentaivn.net", - "hentaivvz.com", - "hentaiworld.eu", - "hentaiworld.tv", - "hentaiworldporn.com", - "hentaix.me", - "hentaixxx.vip", - "hentaixxxvids.com", - "hentaiyes.com", - "hentaiz.co", - "hentaiz.mobi", - "hentaiz.vip", - "hentaizap.com", - "hentaizilla.com", - "hentaizz.net", - "henti-night.com", - "hep.ac.uk", - "hepa.ac.uk", - "hepcw.ac.uk", - "hepi.ac.uk", - "hepp.ac.uk", - "heptio.com", - "heqinglian.net", - "hera.ac.uk", - "heraldsun.com.au", - "herbi.ac.uk", - "herc.ac.uk", - "here.com", - "hereford-art-col.ac.uk", - "hereford-tech.ac.uk", - "hereford.ac.uk", - "hereistheporn.com", - "hereward.ac.uk", - "herexxx.com", - "heriot-watt.ac.uk", - "heritage.org", - "heritageconsortium.ac.uk", - "heritagequay.ac.uk", - "heritagescience.ac.uk", - "hernudepics.com", - "heroero.com", - "heroesofdragonage.com", - "heroesofthestorm.com", - "heroku-app.com", - "heroku-charge.com", - "heroku.co", - "heroku.com", - "heroku.me", - "herokuapp.com", - "herokucdn.com", - "herokucharge.com", - "herokussl.com", - "heron.ac.uk", - "herringnetwork.com", - "hertfordshire.ac.uk", - "hertfordshirebusinessschool.ac.uk", - "hertreg.ac.uk", - "herts-e-learn.ac.uk", - "herts-he.ac.uk", - "herts-regional.ac.uk", - "herts.ac.uk", - "hesa.ac.uk", - "hesharedlegal.ac.uk", - "hesin.ac.uk", - "hespa.ac.uk", - "hestem.ac.uk", - "heswbusnet.ac.uk", - "hetzner.cloud", - "hetzner.com", - "hetzner.company", - "hetzner.de", - "heungkongdiscuss.com", - "hew.ac.uk", - "hewit.ac.uk", - "hewlett-packard.asia", - "hewlett-packard.ch", - "hewlett-packard.co", - "hewlett-packard.co.il", - "hewlett-packard.co.uk", - "hewlett-packard.com.cn", - "hewlett-packard.com.mx", - "hewlett-packard.com.sg", - "hewlett-packard.jp", - "hewlett-packard.mobi", - "hewlettpackard.enterprises", - "hex.pm", - "hexatronik.com", - "hexdocs.pm", - "hexieshe.com", - "hexieshe.xyz", - "hexxeh.net", - "hey.boo", - "heydoga.com", - "heydouga.com", - "heythrop.ac.uk", - "heythropcollege.ac.uk", - "heyuedi.com", - "heywire.com", - "heyzo.com", - "hf-iphone.com", - "hfaes.ac.uk", - "hfals.ac.uk", - "hfma.ac.uk", - "hg.cool", - "hgamefree.info", - "hgamer.pro", - "hgseav.com", - "hh-content.com", - "hhc.ac.uk", - "hhdcb3office.org", - "hhthesakyatrizin.org", - "hhvm.com", - "hi-on.org.tw", - "hibdontire.com", - "hiccears.com", - "hidden-advent.org", - "hiddenhistorieswwi.ac.uk", - "hiddenvoyeurspy.com", - "hiddify.com", - "hide.me", - "hidecloud.com", - "hidefporn.ws", - "hidein.net", - "hideipvpn.com", - "hideman.net", - "hideme.nl", - "hidemy.name", - "hidemyass.com", - "hidemycomp.com", - "hidive.com", - "hifacebook.info", - "hifiporn.fun", - "hifixxx.fun", - "hifuli.com", - "higfw.com", - "highbolt.net", - "highbury.ac.uk", - "highburygroup.ac.uk", - "highdefinitionbeatsbydre.com", - "higher-education.ac.uk", - "highfieldscentre.ac.uk", - "highlands-jersey.ac.uk", - "highlands.ac.uk", - "highpeak.ac.uk", - "highpeakspureearth.com", - "highporn.net", - "highrockmedia.com", - "hightail.com", - "hightopnikes.com", - "highwirepress.com", - "hihiforum.com", - "hihigv.com", - "hihistory.net", - "hiitch.com", - "hikinggfw.org", - "hilderstone.ac.uk", - "hilive.tv", - "hillcroft.ac.uk", - "hillsroad.ac.uk", - "hilostripper.com", - "himalaya.exchange", - "himalayan-foundation.org", - "himalayanglacier.com", - "himemix.com", - "himemix.net", - "hindawi.com", - "hindiweb.com", - "hindustantimes.com", - "hinet.net", - "hipaa6020.com", - "hiperduct.ac.uk", - "hiporn.net", - "hippyhillscomix.com", - "hipzoom.net", - "hison.ac.uk", - "historicalmusicpedagogy.ac.uk", - "historicalpageants.ac.uk", - "historicbooks.ac.uk", - "history-uk.ac.uk", - "history.ac.uk", - "historyofdota.com", - "historyofdota.net", - "historyofdota.org", - "historysubjectcentre.ac.uk", - "histparl.ac.uk", - "hiswifepussy.com", - "hitbdsm.com", - "hitbtc.com", - "hitomi.la", - "hitun.io", - "hitxhot.com", - "hiwifi.com", - "hizb-ut-tahrir.info", - "hizb-ut-tahrir.org", - "hizbuttahrir.org", - "hjb246.top", - "hjb7e9.top", - "hjclub.info", - "hjd.tw", - "hjd2048.com", - "hk-pub.com", - "hk01.com", - "hk1lib.org", - "hk32168.com", - "hkacg.com", - "hkacg.net", - "hkatvnews.com", - "hkbc.net", - "hkbf.org", - "hkbigman.net", - "hkbn.com.hk", - "hkbn.net", - "hkbnes.net", - "hkbookcity.com", - "hkchronicles.com", - "hkchurch.org", - "hkci.org.hk", - "hkcircleapp.com", - "hkcitizenmedia.com", - "hkcmi.edu", - "hkcnews.com", - "hkcoc.com", - "hkcsl.com", - "hkctu.org.hk", - "hkdailynews.com.hk", - "hkday.net", - "hkdc.us", - "hkdf.org", - "hkedcity.net", - "hkej.com", - "hkepc.com", - "hket.com", - "hketgroup.com", - "hkf2023.lat", - "hkf202311.site", - "hkf202312.shop", - "hkfaa.com", - "hkfreezone.com", - "hkfront.org", - "hkgalden.com", - "hkgolden.com", - "hkgolden.media", - "hkgpao.com", - "hkgreenradio.org", - "hkheadline.com", - "hkhkhk.com", - "hkhrc.org.hk", - "hkhrm.org.hk", - "hkip.org.uk", - "hkja.org.hk", - "hkjc.com", - "hkjp.org", - "hklft.com", - "hklts.org.hk", - "hkmap.live", - "hkopentv.com", - "hkpeanut.com", - "hkporn.net", - "hkptu.org", - "hkreadingcity.net", - "hkreporter.com", - "hkt-enterprise.com", - "hkt-eye.com", - "hkt.com", - "hkteducation.com", - "hktpremier.com", - "hktshop.com", - "hku.hk", - "hkusu.net", - "hkvets.ac.uk", - "hkvwet.com", - "hkwcc.org.hk", - "hkzone.org", - "hlbelygl.com", - "hlcollege.ac.uk", - "hlg.ac.uk", - "hlnsc.ac.uk", - "hlsp1.pw", - "hm.com", - "hmd.site", - "hmfby.com", - "hmfun.top", - "hmoegirl.com", - "hmonghot.com", - "hmovie-moe.us", - "hmsxpress.com", - "hmv.co.jp", - "hmvdigital.ca", - "hmvdigital.com", - "hnalady.com", - "hnext.jp", - "hnjhj.com", - "hnntube.com", - "ho5ho.com", - "hobonichielog.com", - "hochi.news", - "hockeyapp.net", - "hoes.com", - "hogarth.ac.uk", - "hojemacau.com.mo", - "hola.com", - "hola.org", - "holaporno.xxx", - "holdemstripem.com", - "holloporn.com", - "hollyrandall.com", - "holmelacy.ac.uk", - "hololens.com", - "holts.ac.uk", - "holycross.ac.uk", - "holymountaincn.com", - "holyspiritspeaks.org", - "home-made-porn-movies.com", - "home-made-videos.com", - "home-sex-tapes.com", - "home-song.com", - "homealonemilfs.com", - "homedepot-static.com", - "homedepot.com", - "homefieldcollege.ac.uk", - "homefuckingmovies.com", - "homegrownfreaks.net", - "homemade-porn-video.com", - "homemadeamateur.com", - "homemadeanalporn.com", - "homemadefucktube.com", - "homemadepornclip.com", - "homemadeporntubes.com", - "homemadevids.net", - "homemoviestube.com", - "homenetworks.ac.uk", - "homeperversion.com", - "homephoneplus.com", - "homepornbay.com", - "homepornking.com", - "homepornvideo.net", - "homeservershow.com", - "homesexmade.com", - "homestylerapp.com", - "homestylernews.com", - "hometrack.com.au", - "hominis.media", - "homo.xxx", - "homofans.blogspot.com", - "honawalaan.com", - "honestpornreviews.com", - "honey-monitoring.ac.uk", - "honeynet.org", - "hongjie10.xyz", - "hongjie11.xyz", - "hongkongdoll.tv", - "hongkongdollvideo.org", - "hongkongfp.com", - "hongkongpost.gov.hk", - "hongmeimei.com", - "hongzhi.li", - "honkaiimpact3.com", - "honkaistarrail.com", - "honnaka.jp", - "honven.xyz", - "hoodamateurs.com", - "hooligapps.com", - "hooloo.tv", - "hoolu.com", - "hoolu.tv", - "hootsuite.com", - "hoover.org", - "hoovers.com", - "hope.ac.uk", - "hopedialogue.org", - "hopstop.tv", - "hopto.org", - "hopwood.ac.uk", - "horizon.ac.uk", - "horizonscollege.ac.uk", - "horizontal-llc.com", - "horizontal-systems.com", - "horizontalglue.com", - "horizontalsystems.com", - "horniman.ac.uk", - "hornybitches.org", - "hornybutt.com", - "hornychat.net", - "hornyelephant.com", - "hornygamer.com", - "hornygfporn.com", - "hornygirlsonline.org", - "hornyjav.com", - "hornytrip.com", - "hornywhores.net", - "horrorporn.com", - "horse-cum.net", - "horse4sex.com", - "horsecock.guru", - "horsecumshot.net", - "horsedick.net", - "horsedicks.net", - "horsemecum.com", - "horseporn.tv", - "hostborneo.org", - "hostloc.com", - "hot-arab-films.com", - "hot-cartoon.com", - "hot-gayporn.com", - "hot-sex-photos.com", - "hot-sex-tube.com", - "hot-teens.com", - "hot2048.com", - "hotair.com", - "hotamateurblowjobs.com", - "hotasianbabes.com", - "hotav.tv", - "hotbeatsonsale.com", - "hotbed.ac.uk", - "hotcandyland.com", - "hotcoin.com", - "hotcuckoldwife.com", - "hotcumporn.com", - "hotels.cn", - "hotescortdusseldorf.com", - "hotfiesta.com", - "hotfrog.com.tw", - "hotfucktube.com", - "hotgaylist.com", - "hotgirl.asia", - "hotgirlsclips.com", - "hotgoo.com", - "hothdsex.xxx", - "hothomemade.com", - "hotindianbabe.com", - "hotindianxxxsex.com", - "hotjav.tv", - "hotladsworld.com", - "hotladyhere.com", - "hotmail.co", - "hotmail.com", - "hotmail.eu", - "hotmail.net", - "hotmail.org", - "hotmonsterbeats.com", - "hotmovies.com", - "hotmovs.com", - "hotntubes.com", - "hotnudegirls.net", - "hotporn.today", - "hotpornbible.com", - "hotpornfile.org", - "hotpornshow.com", - "hotporntubes.com", - "hotpot.hk", - "hotscope.tv", - "hotsexvideo.mobi", - "hotsexydolls.com", - "hotshame.com", - "hotspotshield.com", - "hotstar-cdn.net", - "hotstar-labs.com", - "hotstar.com", - "hotstarext.com", - "hotstunners.com", - "hotteenfreecam.com", - "hottestfilms.com", - "hottestheadphonesonline.com", - "hottg.com", - "hottystop.com", - "hotvpn.com", - "hotwifemovies.com", - "hotzxgirl.com", - "hougaige.com", - "houghall.ac.uk", - "house.gov", - "housefraserarchive.ac.uk", - "housing.com", - "housingcdn.com", - "housingevidence.ac.uk", - "howcollege.ac.uk", - "howfuck.me", - "howtoforge.com", - "howtogetmo.co.uk", - "howtohackfacebook-account.com", - "hoxx.com", - "hoyo.link", - "hoyolab.com", - "hoyoverse.com", - "hp-imagine.com", - "hp-infolab.com", - "hp-invent.com", - "hp-invent.info", - "hp-mns.com", - "hp-printing.com", - "hp-webplatform.com", - "hp-ww.com", - "hp.com", - "hp.company", - "hp.io", - "hp3d.com", - "hp3dmetals.com", - "hp3dprinter.com", - "hp3dsamplepromo.com", - "hpa.gov.tw", - "hpallinoneprinter.com", - "hpapplicationscenter.com", - "hpayshop.com", - "hpbestbuy.com", - "hpbluecarpet.com", - "hpbluecarpet.net", - "hpbuiltforlearning.com", - "hpbundle.com", - "hpc-diversity.ac.uk", - "hpc-midlands-plus.ac.uk", - "hpc-midlands.ac.uk", - "hpc-sc.ac.uk", - "hpc-uk.ac.uk", - "hpcampus.com", - "hpcatridge.com", - "hpccp.com", - "hpceo.com", - "hpci.ac.uk", - "hpcmw.net", - "hpcodewarsbcn.com", - "hpcomputers.com", - "hpcomputerservices.com", - "hpconnected.com", - "hpconnected.net", - "hpconnected.org", - "hpconnected.us", - "hpconnectedstage.com", - "hpcontinuum.com", - "hpcpi.com", - "hpcu.org", - "hpcustomersupport.com", - "hpcustomersupport.net", - "hpcx.ac.uk", - "hpdaas.com", - "hpdesignjetl25500.com", - "hpdesktopcomputer.com", - "hpdownloadstore.com", - "hpdreamcolor.com", - "hpdriver.com", - "hpdrivers.com", - "hpdrivers.org", - "hpe.com", - "hpeclipse.com", - "hpecyber.com", - "hpefonts.s3.amazonaws.com", - "hpengage.com", - "hpeprint.com", - "hpeprintcenter.com", - "hpeurope.com", - "hpeventcenter.com", - "hpfaqs.com", - "hpfeedback.com", - "hpgift.com", - "hpgpas.com", - "hpgraphicspartners.com", - "hpiie.org", - "hpinc.info", - "hpinc.net", - "hpindigopress.com", - "hpinkjet.com", - "hpinstantink.ca", - "hpinstantink.com", - "hpjav.tv", - "hpkeyboard.com", - "hplaptop.com", - "hplaptopbattery.com", - "hplargeformatremote.com", - "hplatexknowledgecenter.com", - "hplfmedia.com", - "hplip.net", - "hplipopensource.com", - "hpmarketplace.com", - "hpmemorychips.com", - "hpmicrcartridge.com", - "hpmini.com", - "hpmobile.com", - "hpofficejetprinter.com", - "hponlinehelp.com", - "hponlineprinting.com", - "hpoolsfc.ac.uk", - "hppage5000.com", - "hppavillionlaptop.com", - "hpphotoscanners.com", - "hpprinterdrivers.com", - "hpprinterinstalls.com", - "hpprintersupplies.com", - "hpsalescentral.com", - "hpserver.com", - "hpservices.com", - "hpshooping.com", - "hpshop.com", - "hpshoping.com", - "hpshopping.hk", - "hpsignage.com", - "hpsmart.com", - "hpsmarts.com", - "hpsmartstage.com", - "hpsmartupdate.com", - "hpsoftware.com", - "hpspeaker.com", - "hpsprocket.com", - "hpsso.com", - "hpstore-china.com", - "hpstore-emea.com", - "hpstore.com", - "hpstorethailand.com", - "hpsupport.com", - "hpsuresupply.com", - "hptechventures.com", - "hpto.net", - "hptouch.com", - "hptouchpointmanager.com", - "hptrainingcenter.com", - "hptv.fun", - "hpuae.com", - "hpuniversity.info", - "hpusertraining.com", - "hpveer.com", - "hpvirtualthin.com", - "hpwallart.com", - "hpwellnesscentral.com", - "hpwsn.com", - "hq69.com", - "hqbabes.com", - "hqbutt.com", - "hqcdp.org", - "hqdesexo.com", - "hqjapanesesex.com", - "hqmovies.com", - "hqporner.com", - "hqseek.com", - "hqtrannytube.com", - "hqtube.xxx", - "hqxxxmovies.com", - "hrbdt.ac.uk", - "hrc.ac.uk", - "hrcchina.org", - "hrcir.com", - "hrea.org", - "hrecords.jp", - "hri.ac.uk", - "hrichina.org", - "hrionline.ac.uk", - "hrntt.org", - "hrsaz.com", - "hrsfc.ac.uk", - "hrtsea.com", - "hrw.org", - "hrweb.org", - "hsad.ac.uk", - "hsbc-alternatives.de", - "hsbc-transactionservices.de", - "hsbc-zertifikate.de", - "hsbc.ae", - "hsbc.am", - "hsbc.bm", - "hsbc.ca", - "hsbc.co.id", - "hsbc.co.in", - "hsbc.co.jp", - "hsbc.co.kr", - "hsbc.co.mu", - "hsbc.co.nz", - "hsbc.co.th", - "hsbc.co.uk", - "hsbc.com", - "hsbc.com.ar", - "hsbc.com.au", - "hsbc.com.bd", - "hsbc.com.bh", - "hsbc.com.br", - "hsbc.com.cn", - "hsbc.com.eg", - "hsbc.com.hk", - "hsbc.com.mo", - "hsbc.com.mt", - "hsbc.com.mx", - "hsbc.com.my", - "hsbc.com.ph", - "hsbc.com.sg", - "hsbc.com.tr", - "hsbc.com.tw", - "hsbc.com.uy", - "hsbc.com.vn", - "hsbc.de", - "hsbc.fr", - "hsbc.lk", - "hsbc.net", - "hsbc.uk", - "hsbcamanah.com.my", - "hsbcinnovationbanking.com", - "hsbcinsurance.com.cn", - "hsbcnet.com", - "hsbcprivatebank.com", - "hsbcqh.com.cn", - "hsbctrinkaus.de", - "hsdc.ac.uk", - "hsdp.ac.uk", - "hsex.icu", - "hsex.men", - "hsex.tv", - "hsfacebook.com", - "hshsxkj.com", - "hsjp.net", - "hsm-works.com", - "hsm-xpress.com", - "hsmexpress.com", - "hsmworks.com", - "hsmxpress.com", - "hss.ac.uk", - "hsselite.com", - "hst.net.tw", - "hstern.net", - "hstt.net", - "hsxsp1.buzz", - "hsyy.vip", - "ht.ac.uk", - "ht.ly", - "hta.ac.uk", - "htkou.net", - "htl.li", - "html5rocks.com", - "htp.ac.uk", - "hts.ac.uk", - "httpfacebook.com", - "https443.net", - "https443.org", - "httpsfacebook.com", - "httpwwwfacebook.com", - "htvncdn.net", - "htx.com", - "htyj-bj.com", - "htznr.li", - "hu1u.com", - "hua-yue.net", - "huabansp.com", - "huabansp7.club", - "huaglad.com", - "huaibinmall.com", - "huanghuagang.org", - "huangse.love", - "huangyiyu.com", - "huanyuju.com", - "huaren.us", - "huaren4us.com", - "huarenav.com", - "huarenporn.com", - "huashangnews.com", - "huashundg.com", - "huasing.org", - "huati.cc", - "huawen.ac.uk", - "huaxia-news.com", - "huaxiabao.org", - "huaxin-lls.xyz", - "huaxin.ph", - "huaxin80.com", - "huaxinvip.top", - "huayuworld.org", - "hubbard-theory-consortium.ac.uk", - "hubblephone.com", - "hubg.org", - "hud.ac.uk", - "hudatoriq.web.id", - "huddcoll.ac.uk", - "huddersfield.ac.uk", - "huddnewcoll.ac.uk", - "hudson.org", - "huffingtonpost.ca", - "huffingtonpost.co.uk", - "huffingtonpost.co.za", - "huffingtonpost.com", - "huffingtonpost.com.au", - "huffingtonpost.com.mx", - "huffingtonpost.de", - "huffingtonpost.es", - "huffingtonpost.fr", - "huffingtonpost.gr", - "huffingtonpost.in", - "huffingtonpost.it", - "huffingtonpost.jp", - "huffingtonpost.kr", - "huffpost.com", - "huffpostarabi.com", - "huffpostbrasil.com", - "huffpostmaghreb.com", - "hugedildo.com", - "hugesex.tv", - "huggingface.co", - "hughbaird.ac.uk", - "hugoroy.eu", - "huhaitai.com", - "huhamhire.com", - "huhangfei.com", - "huiav.com", - "huigui.tw", - "huish.ac.uk", - "huiyi.in", - "huj-pizda.com", - "hulkshare.com", - "hull-college.ac.uk", - "hull.ac.uk", - "hullacl.ac.uk", - "hullschoolartdesign.ac.uk", - "hulltraining.ac.uk", - "huloo.cc", - "huloo.tv", - "hulu.com", - "hulu.jp", - "hulu.tv", - "hulu.us", - "huluaction.com", - "huluad.com", - "huluapp.com", - "huluasks.com", - "hulucall.com", - "hulufree.com", - "hulugans.com", - "hulugermany.com", - "hulugo.com", - "huluhuluhuluhulu10.work", - "huluim.com", - "huluinstantmessenger.com", - "huluitaly.com", - "hulunet.com", - "hulunetwork.com", - "huluplus.com", - "hulupremium.com", - "hulupurchase.com", - "huluqa.com", - "hulurussia.com", - "huluspain.com", - "hulusports.com", - "hulustream.com", - "huluteam.com", - "hulutv.com", - "huluusa.com", - "humanities-human-rights.ac.uk", - "humanities.ac.uk", - "humanmind.ac.uk", - "humanparty.me", - "humanrights-lse.ac.uk", - "humanrightsbriefing.org", - "humanrightspressawards.org", - "humber.ac.uk", - "humbermaritimecollege.ac.uk", - "humblebundle.com", - "humbox.ac.uk", - "humbug.ac.uk", - "humbul.ac.uk", - "hummingbird.ms", - "humoron.com", - "hung-ya.com", - "hungerford.ac.uk", - "hungerstrikeforaids.org", - "hungryclit.com", - "hunk.ws", - "huntingdon.ac.uk", - "huobi.co", - "huobi.com", - "huobi.me", - "huobi.pro", - "huobi.sc", - "huobi.vc", - "huobiasia.vip", - "huobigroup.com", - "huobipro.com", - "huobitoken.com", - "huohaore.net", - "huping.net", - "hurgokbayrak.com", - "hurriyet.com.tr", - "hussiepass.com", - "hustler.com", - "hustlercash.com", - "hut2.ru", - "hutao.cloud", - "hutianyi.net", - "hutong9.net", - "hutpromos.com", - "hutton.ac.uk", - "huyandex.com", - "hw.ac.uk", - "hwadzan.tw", - "hwayue.org.tw", - "hwcdn.net", - "hwgo.com", - "hwinfo.com", - "hwlc.ac.uk", - "hwlln.ac.uk", - "hwslabs.com", - "hxcsxs.pro", - "hxdoll.com", - "hxwk.org", - "hxwq.org", - "hxxn12.top", - "hybrid-analysis.com", - "hybrid-group.ac.uk", - "hyde.ac.uk", - "hydeclarendon.ac.uk", - "hydrogenaud.io", - "hydronationscholars.ac.uk", - "hyms.ac.uk", - "hyp.ac.uk", - "hyper.is", - "hyperdreams.com", - "hyperrate.com", - "hyperscan.io", - "hypnohub.net", - "hypnoporn.net", - "hypnotube.com", - "hyread.com.tw", - "hysbys.ac.uk", - "hysteria.network", - "hzmn.net", - "i-123-hp.com", - "i-book.com", - "i-book.net", - "i-cable.com", - "i-centralwm.ac.uk", - "i-lab.ac.uk", - "i-mobile.co.jp", - "i-o-u.info", - "i-part.com.tw", - "i-scmp.com", - "i.org", - "i1.hk", - "i2p2.de", - "i2runner.com", - "i69.com.tw", - "i818hk.com", - "i91dz.com", - "iaablog.com", - "iaac.ac.uk", - "iafd.com", - "iagp.ac.uk", - "iah.ac.uk", - "ial-wrecsam.ac.uk", - "ials.ac.uk", - "iam.soy", - "iamakamai.com", - "iamakamai.net", - "iamremarkable.org", - "iamtopone.com", - "iana.org", - "iapetus.ac.uk", - "iapetus2.ac.uk", - "iask.bz", - "iask.ca", - "iat.ac.uk", - "iau.ac.ir", - "iav19.com", - "iavnight.com", - "ibb.co", - "ibd-boost.ac.uk", - "ibeats-uk.com", - "ibeatsbydre.cc", - "ibeatsbydre.com", - "ibiblio.org", - "ibis.ac.uk", - "ibit.am", - "iblist.com", - "iblogserv-f.net", - "ibm.com", - "ibm.eu", - "ibm.net", - "ibm.us", - "ibonedyourmom.com", - "ibook.co.nz", - "ibook.com", - "ibook.eu", - "ibook.net", - "ibookpartner.com", - "ibooksauthor.com", - "ibradome.com", - "ibros.org", - "ibss.ac.uk", - "ibtimes.com", - "ibuild.ac.uk", - "ibvpn.com", - "ibytedtos.com", - "ic.ac.uk", - "icac.ac.uk", - "icair.ac.uk", - "icams.com", - "icashpassport.com.mx", - "icca.ac.uk", - "iccliverpool.ac.uk", - "ice-cse.ac.uk", - "iced.ac.uk", - "icedrive.net", - "icegay.tv", - "icegaytube.tv", - "iceporn.com", - "iceporncasting.com", - "icerocket.com", - "icevirtuallibrary.com", - "ichat.co.in", - "ichigocandy.com", - "ichineseporn.com", - "icif.ac.uk", - "icij.org", - "icit.ac.uk", - "icl-fi.org", - "icloud-content.com", - "icloud-isupport.com", - "icloud-sandbox.com", - "icloud.ch", - "icloud.com", - "icloud.de", - "icloud.ee", - "icloud.fi", - "icloud.fr", - "icloud.hu", - "icloud.ie", - "icloud.is", - "icloud.jp", - "icloud.lv", - "icloud.om", - "icloud.org", - "icloud.pt", - "icloud.ro", - "icloud.se", - "icloud.si", - "icloud.sk", - "icloud.vn", - "icloudads.net", - "icloudbox.net", - "icloudbrowser.net", - "icloude.com", - "icloudhome.com", - "icloudmail.net", - "icloudmusic.net", - "icloudnet.net", - "icloudo.com", - "icloudo.de", - "icloudo.net", - "icloudos.de", - "icloudos.net", - "icloudpay.net", - "icloudsecure.net", - "icloudsetup.com", - "icls.ac.uk", - "icma.ac.uk", - "icmacentre.ac.uk", - "icmp.ac.uk", - "icoco.com", - "iconcollege.ac.uk", - "iconfactory.net", - "iconnect.ac.uk", - "iconpaper.org", - "icr.ac.uk", - "ics.ac.uk", - "icsa.ac.uk", - "icsl.ac.uk", - "ictheatre.ac.uk", - "icu-project.org", - "icuminside.com", - "idaiwan.com", - "idarkdoll.com", - "idcore.ac.uk", - "idea-server.com", - "ideal-teens.com", - "idealse.ac.uk", - "ideapocket.com", - "idelreal.org", - "idemocracy.asia", - "identi.ca", - "identrust.co.uk", - "identrust.com", - "identrust.net", - "idgo.ac.uk", - "idiomconnection.com", - "idlcoyote.com", - "idnike.com", - "idol-sagasukun.com", - "idouga.com", - "idras.ac.uk", - "idreamx.com", - "ids-apple.com", - "ids.ac.uk", - "idsam.com", - "idv.tw", - "idvd.eu", - "idx.dev", - "ie10.com", - "ie11.com", - "ie8.co", - "ie9.com", - "ieasy5.com", - "iebay.com", - "ied2k.net", - "ieee-aess.org", - "ieee-cas.org", - "ieee-ccnc.org", - "ieee-ceda.org", - "ieee-ecce.org", - "ieee-edusociety.org", - "ieee-ies.org", - "ieee-ims.org", - "ieee-into-focus.org", - "ieee-isto.org", - "ieee-npss.org", - "ieee-pels.org", - "ieee-pes.org", - "ieee-ras.org", - "ieee-region6.org", - "ieee-sensors.org", - "ieee-tems.org", - "ieee-uffc.org", - "ieee-vics.org", - "ieee.ca", - "ieee.org", - "ieee.tv", - "ieeeaps.org", - "ieeecsc.org", - "ieeecss.org", - "ieeeday.org", - "ieeedeis.org", - "ieeefoundation.org", - "ieeemagnetics.org", - "ieeemce.org", - "ieeenano.org", - "ieeeoes.org", - "ieeer10.org", - "ieeer5.org", - "ieeer8.org", - "ieeesmc.org", - "ieeesystemscouncil.org", - "ieeeusa.org", - "ienergy1.com", - "iepl.us", - "ies.ac.uk", - "iesr.ac.uk", - "ietf.org", - "iexchange.ac.uk", - "ifanqiang.com", - "ifastcapital.com.my", - "ifastcorp.com", - "ifastfinancial.co.in", - "ifastfinancial.com.hk", - "ifastgb.com", - "ifastgp.com", - "ifastgp.com.hk", - "ifastnetwork.com", - "ifasttv.com", - "ifcss.org", - "ife.ac.uk", - "ifjc.org", - "ifl.ac.uk", - "ifm.ac.uk", - "ifontcloud.com", - "ifr.ac.uk", - "iframejav.com", - "ifreewares.com", - "ifs.ac.uk", - "ifslearning.ac.uk", - "ifstal.ac.uk", - "ift.tt", - "ifuckedmy.mom", - "ifuckedtheboss.com", - "ig.com", - "ig.me", - "igaychat.com", - "igayporn.tv", - "igcd.net", - "igcdn.com", - "iger.ac.uk", - "igetnaughty.com", - "igfw.net", - "igfw.tech", - "igi-global.com", - "igkbroker.com", - "igmg.de", - "igmm.ac.uk", - "ign.jp", - "ignite.ac.uk", - "ignitedetroit.net", - "ignites.com", - "ignitesasia.com", - "igniteseurope.com", - "igoogle.ae", - "igoogle.am", - "igoogle.as", - "igoogle.at", - "igoogle.az", - "igoogle.ba", - "igoogle.be", - "igoogle.bg", - "igoogle.ca", - "igoogle.cd", - "igoogle.ci", - "igoogle.co.id", - "igoogle.co.jp", - "igoogle.co.kr", - "igoogle.co.ma", - "igoogle.co.uk", - "igoogle.com", - "igoogle.de", - "igoogle.dj", - "igoogle.dk", - "igoogle.es", - "igoogle.fi", - "igoogle.fm", - "igoogle.fr", - "igoogle.gg", - "igoogle.gl", - "igoogle.gr", - "igoogle.ie", - "igoogle.is", - "igoogle.it", - "igoogle.jo", - "igoogle.kz", - "igoogle.mn", - "igoogle.ms", - "igoogle.nl", - "igoogle.no", - "igoogle.nu", - "igoogle.ro", - "igoogle.ru", - "igoogle.rw", - "igoogle.sc", - "igoogle.sh", - "igoogle.sm", - "igoogle.sn", - "igoogle.tk", - "igoogle.tm", - "igoogle.to", - "igoogle.tt", - "igoogle.vu", - "igoogle.ws", - "igoshopping.net", - "igotmail.com.tw", - "igotpornpics.com", - "igpublish.com", - "igsonar.com", - "igsqt.ac.uk", - "igtv.com", - "igvita.com", - "ihakka.net", - "ihao.org", - "ihgs.ac.uk", - "ihighbury.ac.uk", - "ihrinfo.ac.uk", - "ihsd-mp4.pics", - "ihsdav.cc", - "iicns.com", - "iijav.com", - "iillii.net", - "iina.io", - "iirmll.com", - "iis.ac.uk", - "ijavhd.com", - "ijavtorrent.com", - "ikanhm.xyz", - "ikanmh.xyz", - "ikea.ae", - "ikea.at", - "ikea.au", - "ikea.be", - "ikea.bg", - "ikea.bh", - "ikea.ca", - "ikea.ch", - "ikea.cl", - "ikea.co.at", - "ikea.co.ca", - "ikea.co.id", - "ikea.co.il", - "ikea.co.jp", - "ikea.co.kr", - "ikea.co.om", - "ikea.co.pl", - "ikea.co.th", - "ikea.co.uk", - "ikea.com", - "ikea.com.au", - "ikea.com.cy", - "ikea.com.de", - "ikea.com.do", - "ikea.com.eg", - "ikea.com.gr", - "ikea.com.hk", - "ikea.com.kw", - "ikea.com.lv", - "ikea.com.mx", - "ikea.com.my", - "ikea.com.om", - "ikea.com.pl", - "ikea.com.pr", - "ikea.com.pt", - "ikea.com.ro", - "ikea.com.ru", - "ikea.com.sa", - "ikea.com.sg", - "ikea.com.tr", - "ikea.com.tw", - "ikea.com.ua", - "ikea.cz", - "ikea.de", - "ikea.dk", - "ikea.do", - "ikea.ee", - "ikea.eg", - "ikea.es", - "ikea.fi", - "ikea.fr", - "ikea.gr", - "ikea.hk", - "ikea.hr", - "ikea.hu", - "ikea.ie", - "ikea.in", - "ikea.is", - "ikea.it", - "ikea.jo", - "ikea.jp", - "ikea.kr", - "ikea.lt", - "ikea.lv", - "ikea.ma", - "ikea.mx", - "ikea.my", - "ikea.net", - "ikea.nl", - "ikea.no", - "ikea.om", - "ikea.ph", - "ikea.pl", - "ikea.pr", - "ikea.pt", - "ikea.qa", - "ikea.ro", - "ikea.rs", - "ikea.ru", - "ikea.sa", - "ikea.sg", - "ikea.si", - "ikea.sk", - "ikea.ua", - "ikea.us", - "ikids.com", - "iknowthatgirl.com", - "ikstar.com", - "ikwb.com", - "ilab.ac.uk", - "ilbe.com", - "ilecture.co.nz", - "ilex-tutorial.ac.uk", - "ilhamtohtiinstitute.org", - "ilife.eu", - "ilife.gr", - "ilife.wang", - "illawarramercury.com.au", - "illianacomputerrecycling.com", - "illusion.co.jp", - "illusion.jp", - "illusion111.com", - "illusionas.com", - "illusionchn.com", - "illusionfactory.com", - "illusiongw.com", - "illusionh.com", - "illusionl.com", - "illusionn2.com", - "illusionn3.com", - "illusionn4.com", - "illusionn5.com", - "illusionxz.com", - "illusiony.com", - "illusionze.com", - "illusnoi.com", - "ilnk.info", - "ilongman.com", - "ilove-movies.com", - "ilove80.be", - "iloveinterracial.com", - "ilovelongtoes.com", - "ilovexs.com", - "ilt.ac.uk", - "ilthe.ac.uk", - "im-apps.net", - "im.tv", - "im88.tw", - "imac-apple.com", - "imac-applecomputer.com", - "imac.co", - "imac.co.nz", - "imac.com", - "imac.eu", - "imac.gr", - "imac.one", - "imac.rs", - "imacapple.com", - "imacapplecomputer.com", - "imacsources.com", - "image-guided-therapies.ac.uk", - "imageab.com", - "imagebam.com", - "imagecurl.com", - "imagecurl.org", - "imagefap.com", - "imageflea.com", - "imageglass.org", - "imagemodeler.com", - "imagepost.com", - "images-amazon.com", - "images-gaytube.com", - "imageshack.com", - "imageshack.us", - "imagetwist.com", - "imagevenue.com", - "imageworks.com", - "imageworkshop.ac.uk", - "imagezilla.net", - "imaginationsengine.com", - "imaginecup.pl", - "imagineecommerce.com", - "imago-images.com", - "imaypb.com", - "imb.org", - "imdb.com", - "imdb.to", - "imems.ac.uk", - "imessage.tv", - "imet.ac.uk", - "img.ly", - "imgasd.com", - "imgbb.com", - "imgchili.net", - "imgcrl.org", - "imgix.com", - "imgix.net", - "imgmega.com", - "imgsmail.ru", - "imgur.com", - "imgur.io", - "imgurinc.com", - "imhentai.xxx", - "imilfs.com", - "imkev.com", - "imlab.ac.uk", - "imlive.com", - "immidio.com", - "immigration.gov.tw", - "immoral.jp", - "immxd.com", - "imod.com", - "imonsterbeats.com", - "imovie.eu", - "imoviegallery.com", - "imoviestage.com", - "impact-ad.jp", - "impact-hei.ac.uk", - "impact.ac.uk", - "impact.org.au", - "impactdesignhub.com", - "impala-media-production.s3.amazonaws.com", - "impala.ac.uk", - "imperial.ac.uk", - "imperialbusiness.school", - "imperiodefamosas.com", - "impermium.com", - "impp.mn", - "imr-cdt.ac.uk", - "imrci.ac.uk", - "imstagram.com", - "imt.ac.uk", - "imtagram.com", - "imzog.com", - "in-disguise.com", - "in.com", - "in99.org", - "inaporn.com", - "inasian.club", - "incapdns.net", - "incentivetravelgifts.com", - "incestflix.com", - "incesto.blog.br", - "incestporn.xxx", - "incestvidz.com", - "incezt.net", - "incloak.com", - "inclusion.ac.uk", - "inclusivegrowthscore.com", - "incommon-rsa.org", - "incredibox.fr", - "ind.sh", - "indazn.com", - "indaznlab.com", - "indeedproject.ac.uk", - "independent.co.uk", - "independentoperatorcn.com", - "indexxx.com", - "india.com", - "indiablooms.com", - "indiaipad.com", - "indian-free-xnxx.com", - "indianarrative.com", - "indiancolleges.com", - "indiandefensenews.in", - "indianexpress.com", - "indianfuck2.com", - "indiangfvideos.com", - "indiangirlsclub.com", - "indianhiddencams.com", - "indianpornfast.com", - "indianporngirls.com", - "indianpornvideo.org", - "indianpornvideos2.com", - "indiansexmms2.com", - "indiansexpussy.com", - "indiansexstories.net", - "indiansexstories2.net", - "indiatimes.com", - "indiatoday.in", - "indiemerch.com", - "indienudes.com", - "indies-av.co.jp", - "indonesiaporn.name", - "indsr.org.tw", - "industrialtoys.com", - "infinitetoons.com", - "infinitetube.com", - "influencersgonewild.com", - "info-graf.fr", - "infocert.digital", - "infocert.it", - "infogov.ac.uk", - "infolinker.com.tw", - "inform25.ac.uk", - "information-systems.ac.uk", - "informedchoices.ac.uk", - "informer.com", - "informs.org", - "infosciscotland.ac.uk", - "infotimes.com.tw", - "infowars.com", - "infowarsmedia.com", - "infrapedia.com", - "infraworks.com", - "infura.io", - "ingads.com", - "ingka.com", - "ingka.dev", - "ingkacentres.com", - "ingress.com", - "inherd.mom", - "inhumanity.com", - "inikesneakers.com", - "init.shop", - "initiate.ac.uk", - "initiativesforchina.org", - "initproducts.com", - "inkbunny.net", - "inkchoice.com", - "inkedravens.com", - "inkui.com", - "inlang.com", - "inlethd.com", - "inmediahk.net", - "innermongolia.org", - "innogen.ac.uk", - "innovation-exchange.ac.uk", - "innovation.ac.uk", - "innovations-i.com", - "innovations.ac.uk", - "inoreader.com", - "inote.tw", - "inporn.com", - "inquisitionspostmortem.ac.uk", - "insecam.org", - "insendi.com", - "inshot.cc", - "inshot.com", - "inshotapp.com", - "inside.com.tw", - "insidefilms.com", - "insidemacintosh.com", - "insider-intelligence.com", - "insider.com", - "insiderdevtour.com", - "insiderintelligence.com", - "insidevoa.com", - "inspire-dtp.ac.uk", - "inspiretrust.ac.uk", - "inst-of-oceanographic-sci.ac.uk", - "instaadder.com", - "instabang.com", - "instachecker.com", - "instafallow.com", - "instafollower.com", - "instagainer.com", - "instagda.com", - "instagify.com", - "instagmania.com", - "instagor.com", - "instagram-brand.com", - "instagram-engineering.com", - "instagram-help.com", - "instagram-press.com", - "instagram-press.net", - "instagram.com", - "instagramci.com", - "instagramcn.com", - "instagramdi.com", - "instagramhashtags.net", - "instagramhilecim.com", - "instagramhilesi.org", - "instagramium.com", - "instagramizlenme.com", - "instagramkusu.com", - "instagramlogin.com", - "instagramm.com", - "instagramn.com", - "instagrampartners.com", - "instagramphoto.com", - "instagramq.com", - "instagramsepeti.com", - "instagramtakipcisatinal.net", - "instagramtakiphilesi.com", - "instagramtips.com", - "instagramtr.com", - "instagran.com", - "instagranm.com", - "instagrem.com", - "instagrm.com", - "instagtram.com", - "instagy.com", - "installbuzzsaw.com", - "instamgram.com", - "instangram.com", - "instantfap.com", - "instantfapgay.com", - "instanthq.com", - "instantink.com", - "instantssl.com", - "instanttelegram.com", - "instaplayer.net", - "instastyle.tv", - "instawank.com", - "instgram.com", - "institut-tibetain.org", - "institute-of-cancer-research.ac.uk", - "instituteofcoding.ac.uk", - "instituteofcounselling.ac.uk", - "instituteofwar.org", - "institutionofelectronics.ac.uk", - "insuyo.xyz", - "intagram.com", - "intagrm.com", - "intarch.ac.uk", - "intc.com", - "integral7.com", - "integrativebiology.ac.uk", - "intel-research.net", - "intel-university-collaboration.net", - "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.cm", - "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.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", - "intelamericasstore.com", - "intelapacstore.com", - "intelatom.net", - "intelcapital.com", - "intelcapital.net", - "intelcloudbuilders.com", - "intelcloudfinder.com", - "intelemeastore.com", - "inteleventexpress.com", - "intelforchange.com", - "intelfreepress.com", - "intelgo.net", - "intelinsight.com", - "inteliotmarketplace.com", - "intelisolve.com", - "intell.com", - "intellearningseries.com", - "intellij.com", - "intellij.net", - "intellij.org", - "intellinuxgraphics.com", - "intellinuxgraphics.net", - "intellinuxwireless.net", - "intelnervana.com", - "intelplay.com", - "intelquark.com", - "intelrealsense.com", - "intelrxt.com", - "intelsalestraining.com", - "intelsecurity.com", - "intelserveredge.com", - "intelsoftwarenetwork.com", - "intelstore.com", - "inteltechnologyprovider.com", - "intelvmwarecybersecurity.com", - "interactcbt.ac.uk", - "interactive-e.ac.uk", - "interactivebrokers.com", - "interactiveeducation.ac.uk", - "interactivesex.xxx", - "intercamcashpassport.com.mx", - "intercom.com", - "intercom.io", - "intercomassets.com", - "intercomcdn.com", - "international-house-london.ac.uk", - "international-union-crystallography.ac.uk", - "international.ac.uk", - "internationalcollegedundee.ac.uk", - "internationalconnectionsacademy.com", - "internationalsaimoe.com", - "internationalstaff.ac.uk", - "internationalstudies.ac.uk", - "internet.org", - "internetdefenseleague.org", - "internetdownloadmanager.com", - "internetexplorer.co", - "internetexplorer.com", - "internetfreedom.org", - "internetofeverything.com", - "internetpopculture.com", - "interracial-sites.com", - "intescort.com", - "intgram.com", - "intheknow.com.au", - "inthenameofconfuciusmovie.com", - "intimateinvasions.com", - "into-newcastle.ac.uk", - "intporn.com", - "intramuscularinjection.info", - "intunewiki.com", - "intute.ac.uk", - "inventor-certified.com", - "inventorfusion.com", - "inventorseries.com", - "inventorship.com.au", - "investorschronicle.co.uk", - "invity.io", - "inxian.com", - "inxporn.com", - "ioe.ac.uk", - "ioe.com", - "ioffergift.com", - "ioinformatics.org", - "iole.tv", - "ion.ac.uk", - "iooog.sbs", - "iop.org", - "ios-icloud.com", - "ios.ac.uk", - "iosinthecar.com", - "iotinactionevents.com", - "iownyour.biz", - "iownyour.org", - "ioz.ac.uk", - "ip.gs", - "ip.sb", - "ip73.com", - "ipa-iphone.net", - "ipad.co.kr", - "ipad.de", - "ipad.host", - "ipad.wang", - "ipad3.com", - "ipadair.cl", - "ipadair.cm", - "ipadair.com.br", - "ipadair.com.es", - "ipadair.fr", - "ipadair.hk", - "ipadair.ie", - "ipadair.jp", - "ipadair.tw", - "ipadaustralia.com", - "ipadmini.cm", - "ipadmini.com.lk", - "ipadmini.lk", - "ipadpro.buzz", - "ipalter.com", - "ipcc-wg3.ac.uk", - "ipdefenseforum.com", - "ipem.ac.uk", - "ipfire.org", - "ipforesightforum.ac.uk", - "ipfs-gateway.cloud", - "ipfs.io", - "ipfs.tech", - "ipgc.ac.uk", - "iphine.com", - "iphone-cd.com", - "iphone-cn.com", - "iphone-sh.com", - "iphone-vip1.com", - "iphone-vip2.com", - "iphone-vip3.com", - "iphone-vip4.com", - "iphone-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.com", - "iphone4.com.br", - "iphone4hongkong.com", - "iphone4s.com", - "iphone5.com", - "iphone5casescovers.com", - "iphone5s5case.com", - "iphoneacessorios.com.br", - "iphonecase2013.com", - "iphonecase5.com", - "iphonecases100.com", - "iphonecases5.com", - "iphoneclaro.com.br", - "iphonecollcase.com", - "iphonefc.com", - "iphonegermany.com", - "iphonehacks.com", - "iphonehangzhou.com", - "iphoneimessage.com", - "iphoneplus.wang", - "iphonerip.net", - "iphonese.tv", - "iphonetaiwan.org", - "iphoneunlockimei.com", - "iphonexs.tv", - "iphonix.fr", - "iphoto.eu", - "iphoto.no", - "iphoto.se", - "iphoto.wang", - "ipi.ac.uk", - "ipicture.ru", - "ipjetable.net", - "ipleadership.org", - "ipns.co", - "ipobar.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.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.nl", - "ipodcleaner.com", - "ipoditouch.com", - "ipodnano.com", - "ipodnano.net", - "ipodprices.com", - "ipodrip.ca", - "ipodrocks.com.au", - "ipods.com", - "ipodshop.com.au", - "ipodtouch.co", - "ipodtouch.com", - "ipoock.com", - "iporntoo.com", - "iporntv.net", - "iportal.me", - "ipostnaked.com", - "ipple.com", - "ippog.org", - "ippotv.com", - "ippstatic.com", - "ipredator.se", - "iproperty.com", - "iproperty.com.my", - "iproperty.com.sg", - "iptv.com.tw", - "iptvbin.com", - "ipv6.ac.uk", - "ipvanish.com", - "iqiyi.com", - "iqiyiavlive.buzz", - "iqq2.cc", - "iqq3.cc", - "iqqtv.net", - "iranianboobs.com", - "iranlms.ir", - "iransextv.com", - "iranx.net", - "irc-sphere.ac.uk", - "irdeto.com", - "ired.ac.uk", - "iredmail.org", - "irese.ac.uk", - "iri-scotland.ac.uk", - "irib.ir", - "iridiumbrowser.de", - "iris.ac.uk", - "iriss.ac.uk", - "ironna.jp", - "ironpython.net", - "ironsocket.com", - "irotv301.top", - "irribay.com", - "irscl.ac.uk", - "is-a-hunter.com", - "is.gd", - "isaacmao.com", - "isasecret.com", - "isbgpsafeyet.com", - "isc.ac.uk", - "isc.org", - "isca-speech.org", - "ischool.com", - "iscp.ac.uk", - "isexlove.tw", - "isfocus.net", - "isgame365.cc", - "isgreat.org", - "isheppc.com", - "isic.ac.uk", - "isiknowledge.com", - "isis.ac.uk", - "iskoot.com", - "islahhaber.net", - "islam-anatolia.ac.uk", - "islam.org.hk", - "islamawareness.net", - "islamhouse.com", - "islamic-college.ac.uk", - "islamicacademy.ac.uk", - "islamiccenterofnewlondon.com", - "islamicity.com", - "islamicpluralism.org", - "islamicstudiesnetwork.ac.uk", - "islamtoday.net", - "isle.ac.uk", - "isli.ac.uk", - "islington-acl.ac.uk", - "ism.ac.uk", - "ismaelan.com", - "ismalltits.com", - "ismg.ac.uk", - "ismprofessional.net", - "isohunt.com", - "ispan.ac.uk", - "israbox.com", - "iss138.com", - "issitedownrightnow.com", - "issquaredown.com", - "issquareup.com", - "issuu.com", - "istar.ac.uk", - "istars.co.nz", - "istarshine.com", - "istef.info", - "istent.co.kr", - "istiqlalhewer.com", - "istockphoto.com", - "istorytell.com", - "istripper.com", - "isunaffairs.com", - "isuntv.com", - "isupportuyghurs.org", - "isvc.ac.uk", - "it.nf", - "ita-do.com", - "itaboo.info", - "itaeromanga.com", - "itaiwan.gov.tw", - "italiabeatsbydrdre.com", - "italiatibet.org", - "itasoftware.com", - "itcanwait.com", - "itcfonts.com", - "itch.io", - "itchen.ac.uk", - "iteach.ac.uk", - "itec.ac.uk", - "itemdb.com", - "itemfix.com", - "itfromtheinside.com", - "ithome.com.tw", - "itlearningspace-scot.ac.uk", - "itnel.com", - "itnow.ac.uk", - "itol.ac.uk", - "itools.info", - "itrace.ac.uk", - "itripto.com", - "itsaol.com", - "itsbetterwhenyouwinit.com", - "itsfuck.com", - "itshidden.com", - "itsky.it", - "itsoc.org", - "itu.int", - "itun.es", - "itunbes.com", - "ituneas.com", - "itunes-radio.net", - "itunes.ca", - "itunes.co", - "itunes.co.th", - "itunes.com", - "itunes.hk", - "itunes.mx", - "itunes.org", - "itunes.rio", - "itunes.us", - "itunes12days.com", - "itunesessentials.com", - "itunesfestivals.com", - "itunesiradio.com", - "ituneslatino.com", - "ituneslogin.net", - "itunesmatch.com", - "itunesparty.com", - "itunesradio.com", - "itunesradio.rio", - "itunesradio.tv", - "itunesradio.tw", - "itunesstore.co", - "itunesu.com", - "itunesu.net", - "itutility.ac.uk", - "itweet.net", - "iu13.net", - "iu45.com", - "iucr.ac.uk", - "iuhrdf.org", - "iuksky.com", - "ius.io", - "iutunes.com", - "ivacy.com", - "iverycd.com", - "ivintageporn.com", - "ivonblog.com", - "ivpn.net", - "iwank.tv", - "iwantavnow.com", - "iwantgalleries.com", - "iwantmature.com", - "iwantporn.net", - "iwaponline.com", - "iwara.tv", - "iwcollege.ac.uk", - "iwcommunitylearning.ac.uk", - "iwightc.ac.uk", - "iwm.ac.uk", - "iwork.com", - "iwork.se", - "iwork.wang", - "iwyn138.com", - "ixnxx.tv", - "ixquick.com", - "ixxx.com", - "iyalc.com", - "iyf.tv", - "iyouport.com", - "iyouport.org", - "iza.ne.jp", - "izaobao.us", - "izihost.org", - "izles.net", - "izlesem.org", - "izmirautodeskegitimleri.com", - "j.mp", - "j2objc.org", - "jabcomix.com", - "jable.one", - "jable.org", - "jable.tv", - "jackjia.com", - "jade-net-home.com", - "jade.ac.uk", - "jadult.net", - "jamaat.org", - "jamanetwork.com", - "jambotube.com", - "jamesbondstudies.ac.uk", - "jamestown.org", - "jamyangnorbu.com", - "jan.ai", - "jandyx.com", - "janeausten.ac.uk", - "janet-brokerage.ac.uk", - "janet.ac.uk", - "janetbrokerage.ac.uk", - "janetcollaborate.ac.uk", - "janor6.net", - "janwongphoto.com", - "japan-forward.com", - "japan-whores.com", - "japan18tube.com", - "japanbeast.com", - "japanese-scat.net", - "japaneseasmr.com", - "japanesebeauties.net", - "japanesebeauties.one", - "japanesegirlspictures.com", - "japaneselovelygirl.com", - "japanfist.org", - "japanknowledge.com", - "japanporn.tv", - "japantimes.co.jp", - "japanxxxfilms.com", - "japon-girls.com", - "japteenx.com", - "japxtube.com", - "jas-mine.ac.uk", - "jasa3dmax.com", - "jasaautocad.com", - "jasmin.ac.uk", - "jasmin.com", - "jasper.ai", - "jav-angel.net", - "jav-subtitles.com", - "jav-vr.net", - "jav.com", - "jav.dog", - "jav.gallery", - "jav.guru", - "jav.la", - "jav.land", - "jav.place", - "jav.si", - "jav.wine", - "jav01.cc", - "jav101.com", - "jav168.cc", - "jav19.com", - "jav223.com", - "jav24.com", - "jav2be.com", - "jav321.com", - "jav4you.org", - "jav68.tv", - "jav777.cc", - "jav789.com", - "jav889.xyz", - "jav9999.com", - "java.com", - "java.net", - "javakiba.org", - "javbabe.net", - "javbangers.com", - "javbest.tv", - "javbobo.com", - "javbooks.com", - "javbraze.com", - "javbus.co", - "javbus.com", - "javbus22.com", - "javbuz.com", - "javcc.cc", - "javcc.com", - "javcdn.cc", - "javcl.com", - "javct.net", - "javcup.com", - "javdatabase.com", - "javday.tv", - "javdb.com", - "javdisk.com", - "javdock.com", - "javdoe.to", - "javdove.com", - "javdove8.xyz", - "javextreme.net", - "javfilms.com", - "javfor.me", - "javforme.ninja", - "javfree.la", - "javfree.me", - "javfree.sh", - "javfuck.net", - "javfull.net", - "javfun.me", - "javfv.com", - "javgg.net", - "javgrown.com", - "javhard.net", - "javhard.org", - "javhaven.com", - "javhay.net", - "javhd.com", - "javhd.icu", - "javhd.pro", - "javhd.today", - "javhd3x.com", - "javhdfree.net", - "javhdhello.com", - "javhdonline.com", - "javhdporn.com", - "javhdporn.net", - "javher.com", - "javheroine.com", - "javhihi.com", - "javhip.com", - "javhub.me", - "javhub.net", - "javhuge.com", - "javidol.org", - "javjack.com", - "javjunkies.com", - "javlands.net", - "javleak.com", - "javlibrary.com", - "javlibrary.tv", - "javmenu.com", - "javmix.me", - "javmix.tv", - "javmobile.mobi", - "javmobile.net", - "javmodel.com", - "javmoo.com", - "javmoo.xyz", - "javmost.com", - "javmost.cx", - "javmost.xyz", - "javmuch.com", - "javmulu.net", - "javnew.net", - "javopen.co", - "javout.co", - "javplatform.com", - "javpop.com", - "javpop.link", - "javporn.tech", - "javporn.ws", - "javpost.net", - "javprice.com", - "javprime.net", - "javpub.me", - "javpush.com", - "javqd.com", - "javrank.com", - "javrave.club", - "javroot.com", - "javscat.net", - "javscatsex.com", - "javscatting.com", - "javscreens.com", - "javseen.com", - "javseen.tv", - "javsex.asia", - "javsin.tv", - "javsky.tv", - "javspanking.com", - "javstar.club", - "javstore.net", - "javsx.com", - "javtag.com", - "javtag.net", - "javtasty.com", - "javteg.net", - "javtiful.com", - "javtorrent.me", - "javtrailers.com", - "javtrust.com", - "javtube.cc", - "javtube.com", - "javtube.net", - "javvids.com", - "javwide.com", - "javwide.tv", - "javxspot.com", - "javxxx.me", - "javynow.com", - "javzoo.com", - "javzz.com", - "jayspov.net", - "jb.gg", - "jb22.lol", - "jbe-platform.com", - "jbtalks.cc", - "jbtalks.com", - "jbtalks.my", - "jburl.top", - "jc11.tw", - "jca.ac.uk", - "jcc.ac.uk", - "jcmaxwell.ac.uk", - "jcpenney.com", - "jcpsg.ac.uk", - "jdav-css.shop", - "jdavsp.asia", - "jdavsp.com", - "jdavsp.info", - "jdavsp.pw", - "jdavsp.top", - "jdavsp.xyz", - "jdbimgs.com", - "jdbstatic.com", - "jdforum.net", - "jdwsy.com", - "jeanyim.com", - "jec.ac.uk", - "jeded.com", - "jenkins.io", - "jenner.ac.uk", - "jennylist.xyz", - "jenporno.cz", - "jerk-porn.com", - "jerk24.com", - "jerkdolls.com", - "jerkdude.com", - "jerkmate.com", - "jerkmate.tv", - "jerkmatelive.org", - "jerkofftocelebs.com", - "jessicaturner.com", - "jetbrains.ai", - "jetbrains.com", - "jetbrains.net", - "jetbrains.space", - "jetbrains.team", - "jetfuelapp.com", - "jetfuelapps.com", - "jetos.com", - "jevc.ac.uk", - "jewel-esk.ac.uk", - "jex.com", - "jfengtime.com", - "jfqu36.club", - "jfqu37.xyz", - "jfrog.com", - "jfrog.org", - "jga-group.ac.uk", - "jgg18.xyz", - "jgoodies.com", - "jhu.edu", - "jhxl.org", - "jhzyw.xyz", - "jiangweiping.com", - "jiaochuanba25.buzz", - "jiaochuanba26.buzz", - "jiaoyou8.com", - "jiayoulu.com", - "jibemobile.com", - "jic.ac.uk", - "jichangtj.com", - "jieav.com", - "jiehua.cz", - "jiepang.com", - "jieshibaobao.com", - "jigglegifs.com", - "jigong1024.com", - "jigsy.com", - "jihadology.net", - "jiji.com", - "jijiji.ca", - "jilhub.com", - "jimeng22.com", - "jims.net", - "jinbushe.org", - "jingpin.org", - "jingsim.org", - "jinhai.de", - "jinpianwang.com", - "jinroukong.com", - "jintian.net", - "jinx.com", - "jiruan.net", - "jisc-collections.ac.uk", - "jisc-content.ac.uk", - "jisc-liberate-migrate1.ac.uk", - "jisc-liberate-migrate2.ac.uk", - "jisc-liberate-migrate3.ac.uk", - "jisc-liberate.ac.uk", - "jisc-mau.ac.uk", - "jisc-services.ac.uk", - "jisc-tau.ac.uk", - "jisc.ac.uk", - "jiscadvance.ac.uk", - "jisccollections.ac.uk", - "jisccontent.ac.uk", - "jiscdigitalmedia.ac.uk", - "jiscecollections.ac.uk", - "jischistoricbooks.ac.uk", - "jischistories.ac.uk", - "jiscinfonet.ac.uk", - "jiscjournalarchives.ac.uk", - "jiscmail.ac.uk", - "jiscmediahub.ac.uk", - "jiscmu.ac.uk", - "jiscpas.ac.uk", - "jiscwell.ac.uk", - "jitouch.com", - "jitsi.org", - "jiuse.ai", - "jiuse.com.co", - "jiuse.icu", - "jiuse.io", - "jiuse6666.com", - "jiuse821.com", - "jiuse822.com", - "jiuse823.com", - "jiyou520.com", - "jiyu-kobo.co.jp", - "jizzboom.com", - "jizzbunker.com", - "jizzhut.com", - "jizzle.com", - "jizzonline.com", - "jizzthis.com", - "jjgirls.com", - "jjsuo.sbs", - "jkb.cc", - "jkbeats.com", - "jkf.net", - "jkface.net", - "jkforum.net", - "jkub.com", - "jkycjk.mom", - "jkzvz.shop", - "jkzw.shop", - "jlb0011.site", - "jm98.cc", - "jma.go.jp", - "jmc.ac.uk", - "jmcomic.ltd", - "jmcomic.me", - "jmcomic.mobi", - "jmcomic.moe", - "jmcomic1.city", - "jmcomic1.me", - "jmcomic1.mobi", - "jmcomic2.moe", - "jmlr.org", - "jmscult.com", - "jmu.ac.uk", - "jmvbt.com", - "jneurosci.org", - "jnt.ac.uk", - "joachims.org", - "joanabliss.com", - "jobmarket.com.hk", - "jobs.ac.uk", - "jobso.tv", - "jodic-forum.org", - "joeswall.com", - "johnpersons.com", - "johnruskin.ac.uk", - "johren.games", - "johren.net", - "joiasmr.com", - "joinbbs.net", - "joinclubhouse.com", - "joinmaidez.com", - "joinmastodon.org", - "joinpeertube.org", - "joins.com", - "joinside.org", - "joinup.ac.uk", - "jokerlu-go.buzz", - "jokerlu.asia", - "jokerlu.world", - "jokerlu1.cc", - "jokerlu1.info", - "jolt.ac.uk", - "joox.com", - "jornaldacidadeonline.com.br", - "jorropo.net", - "jorum.ac.uk", - "jos.com", - "joseph-chamberlain.ac.uk", - "joseph-priestley.ac.uk", - "joseph-priestly.ac.uk", - "josephwright6form.ac.uk", - "jotform.com", - "journalarchives.ac.uk", - "journalchretien.net", - "journalofdemocracy.org", - "journaltocs.ac.uk", - "jove.com", - "joyclub.de", - "joyjoy.net", - "joylovedolls.com", - "joymiihub.com", - "joyourself.com", - "joysporn.com", - "jp1lib.org", - "jpav.us", - "jpavcom.com", - "jpbabe.com", - "jpboy1069.net", - "jpg4.biz", - "jpg4.pw", - "jpg4us.net", - "jpopforum.net", - "jpvhub.com", - "jquery.com", - "jquerymobile.com", - "jqueryui.com", - "jr24h.com", - "jrf.org.tw", - "jrs.ac.uk", - "js.org", - "js7k.com", - "jsati.com", - "jsatmobile.com", - "jsbridgestone.com", - "jsdelivr.com", - "jsdelivr.net", - "jsfiddle.net", - "jshell.net", - "jsmc.ac.uk", - "jst.go.jp", - "jstor.ac.uk", - "jstor.org", - "jstv51.com", - "jstv52.com", - "jstv53.com", - "jsz91.com", - "jtap.ac.uk", - "jtltraining.ac.uk", - "jtt.ir", - "jtube.space", - "jtvnw.net", - "jubileecentre.ac.uk", - "jubushoushen.com", - "juc.ac.uk", - "judeporn.com", - "juggsjoy.com", - "juhuaren.com", - "juiceced.xyz", - "juicytwink.com", - "jukujo-club.com", - "julesjordan.com", - "juliamiles.com", - "juliamovies.com", - "juliepost.com", - "juliereyc.com", - "junauza.com", - "june4commemoration.org", - "junefourth-20.net", - "jungleheart.com", - "junglobal.net", - "juno.ac.uk", - "juoaa.com", - "jupyter.org", - "just.xxx", - "justav.net", - "justdied.com", - "justdoit.us", - "justduckit.com", - "justfamilyporn.com", - "justfreevpn.com", - "justfullporn.org", - "justhd.xyz", - "justhost.ru", - "justicefortenzin.org", - "justincraig.ac.uk", - "justindianporn.me", - "justlesbianpussy.com", - "justmysocks.net", - "justmysocks1.net", - "justmysocks2.net", - "justmysocks4.net", - "justnudepic.com", - "justpaste.it", - "justpicsplease.com", - "justporn.com", - "justporn.link", - "justporno.es", - "justporno.sex", - "justporno.tv", - "justswallows.com", - "justtristan.com", - "justusboys.com", - "juyangbee.xyz", - "juyangto.info", - "juyuange.org", - "juzi-js.shop", - "juzige.xyz", - "juziyue.com", - "jvid.com", - "jw.org", - "jwfl.ac.uk", - "jwheatley.ac.uk", - "jwide.co.kr", - "jwmusic.org", - "jwpcdn.com", - "jwplatform.com", - "jwplayer.com", - "jwpltx.com", - "jwpsrv.com", - "jwt.ms", - "jyxf.net", - "jzydh.com", - "k-doujin.net", - "k8s.io", - "k9vidz.com", - "ka-wai.com", - "kaamuu.com", - "kadokawa.co.jp", - "kaes.ac.uk", - "kaggle.com", - "kaggle.io", - "kaggle.net", - "kaggleusercontent.com", - "kagi.com", - "kagyu.org", - "kagyu.org.za", - "kagyumonlam.org", - "kagyunews.com.hk", - "kagyuoffice.org", - "kagyuoffice.org.tw", - "kairakudoujin.net", - "kaiyuan.de", - "kakao.co.kr", - "kakao.com", - "kakao.vc", - "kakaobank.com", - "kakaobank.io", - "kakaobankcontent.com", - "kakaobrain.com", - "kakaocdn.net", - "kakaocloud.com", - "kakaocorp.com", - "kakaoent.com", - "kakaoenterprise.com", - "kakaogamescorp.com", - "kakaohealthcare.com", - "kakaoilaas.com", - "kakaoinvestment.com", - "kakaomobility.com", - "kakaopay.com", - "kakaopaysec.com", - "kakaopiccoma.com", - "kakaostyle.com", - "kakaotalk.jp", - "kakaovx.com", - "kaktuz.com", - "kalachakralugano.org", - "kali.org", - "kama-nk.ru", - "kamababa.com", - "kamisama-day.jp", - "kamisama-maeda-lab.com", - "kampalaexclusiveescorts.com", - "kanav.info", - "kangye.org", - "kankan.today", - "kannewyork.com", - "kanporno.com", - "kanshifang.com", - "kantie.org", - "kanzhongguo.com", - "kanzhongguo.eu", - "kaob3.xyz", - "kaotic.com", - "karayou.com", - "karechat.ai", - "karger.com", - "karinahart.com", - "karkhung.com", - "karlajames.com", - "karmapa-teachings.org", - "karmapa.org", - "karupsha.com", - "karupspc.com", - "kastatic.org", - "katestube.com", - "kavkazr.com", - "kawaiikawaii.jp", - "kawase.com", - "kayako.com", - "kaydara.com", - "kba-tx.org", - "kbplus.ac.uk", - "kbzbank.com", - "kbzpay.com", - "kc3000.shop", - "kcb.ac.uk", - "kcc.ac.uk", - "kcl.ac.uk", - "kclwave.ac.uk", - "kcollege.ac.uk", - "kcoolonline.com", - "kcqsw-na.sbs", - "kdfuli.com", - "kdy202312.shop", - "ke-westyorkshire.ac.uk", - "keaiav.com", - "kebrum.com", - "kec-stourbridge.ac.uk", - "kechara.com", - "kechtube.com", - "kecnuneaton.ac.uk", - "kedst.ac.uk", - "keele.ac.uk", - "keepandshare.com", - "keepmovingwithmovefree.com", - "keepyourcad.com", - "keezmovies.com", - "keiba.net", - "keighleycollege.ac.uk", - "kemomi.me", - "kemono.party", - "kemono.su", - "kendal.ac.uk", - "kendalcollege.ac.uk", - "kendatire.com", - "kendincos.net", - "kendralist.com", - "kenengba.com", - "kennedy.ac.uk", - "kensingtoncoll.ac.uk", - "kent.ac.uk", - "kentadulteducation.ac.uk", - "kentcls.ac.uk", - "kentman.ac.uk", - "kenxxx.com", - "kenya4.com", - "kenyanporn.blogspot.com", - "kenyaraha.net", - "keontech.net", - "kepard.com", - "kernel.org", - "keso.cn", - "kess2.ac.uk", - "kew.ac.uk", - "kex.com", - "keybase.io", - "keybaseapi.com", - "keycdn.com", - "keyhole.com", - "keyporntube.com", - "keyseducation.ac.uk", - "keyskillbuilder.ac.uk", - "keytransparency.com", - "keytransparency.foo", - "keytransparency.org", - "kfd.me", - "kfs.io", - "kgslb.com", - "kgv.ac.uk", - "khabdha.org", - "khanacademy.org", - "khatrimaza.org", - "khayannpyar.blogspot.com", - "khmusic.com.tw", - "khotruyentranhx.com", - "kiad.ac.uk", - "kichiku-doujinko.com", - "kichikuou.com", - "kickporn.com", - "kickshatchannel.com", - "kicksnike1.com", - "kicu.tv", - "kiddercoll.ac.uk", - "kidderminster.ac.uk", - "kidgrid.tv", - "kidsfirst.ac.uk", - "kidsnikeshoes.com", - "kidspot.com.au", - "kiji.ca", - "kijii.ca", - "kijij.ca", - "kijiji.ca", - "kijijiauto.ca", - "kijijiautos.ca", - "kijijiforbusiness.ca", - "kijijii.ca", - "kijijiraps.ca", - "kijji.ca", - "kijjiji.ca", - "kik.com", - "kikdirty.com", - "killwall.com", - "kilmarnock.ac.uk", - "kilmeadeandfriends.com", - "kimchi.tv", - "kimogirl.cc", - "kimosex.com", - "kimy.com.tw", - "kindgirls.com", - "kindindianporn.com", - "kindle.co.jp", - "kindle.co.uk", - "kindle.com", - "kindle.de", - "kindle.es", - "kindle.fr", - "kindle.in", - "kindle.it", - "kindle.jp", - "kindle4rss.com", - "kindleoasis.com", - "kindleoasis.info", - "kindleoasis.jp", - "kindleoasis.org", - "kindleoasis.us", - "kindleoasisnews.com", - "kindleproject.com", - "kindleren.com", - "kindnudist.com", - "kinds.ac.uk", - "kindteenporn.com", - "king.ac.uk", - "kingalfreds.ac.uk", - "kingalfredsbasingstoke.ac.uk", - "kingcomix.com", - "kingdomsalvation.org", - "kinged6nun.ac.uk", - "kingextre.me", - "kingf-av.buzz", - "kingf-av.lol", - "kingf-av.mom", - "kingf-av.sbs", - "kingf-tv.buzz", - "kingfav.sbs", - "kinghost.com", - "kingkong.com.tw", - "kingkongapp.com", - "kingofpics.com", - "kings.ac.uk", - "kingshillinstitute.ac.uk", - "kingshurst.ac.uk", - "kingslondon.ac.uk", - "kingstagram.com", - "kingston-college.ac.uk", - "kingston.ac.uk", - "kingstonalumni.ac.uk", - "kingstone.com.tw", - "kingsway.ac.uk", - "kinguno.xyz", - "kink.com", - "kinkbook.com", - "kinklive.com", - "kinkoid.com", - "kinkyfamily.com", - "kinkypeepz.com", - "kinmen.org.tw", - "kinmen.travel", - "kinokuniya.com", - "kir.jp", - "kir2kos.net", - "kirbysepicyarn.com", - "kirbysuperstarultra.com", - "kirkleescollege.ac.uk", - "kirkley.ac.uk", - "kisharon.ac.uk", - "kismia.com", - "kissbbao.cn", - "kisscos.net", - "kissjav.com", - "kissjav.li", - "kitazawa.me", - "kitts.ac.uk", - "kiwi.kz", - "kiwibrowser.com", - "kk-whys.co.jp", - "kk.stream", - "kkbox.com", - "kkbox.com.tw", - "kkddsex7.com", - "kkfcc03.com", - "kkiah.com", - "kknews.cc", - "kktix.com", - "kktv.com.tw", - "kktv.me", - "kl.ac.uk", - "klik.me", - "klip.me", - "kmc.ac.uk", - "kmdhyy.com", - "kmeleonbrowser.org", - "kmff17.com", - "kmms.ac.uk", - "kmuh.org.tw", - "knightlearning.ac.uk", - "knovel.com", - "knowledge-house.ac.uk", - "knowledgehouse.ac.uk", - "knowledgerush.com", - "knowsleycc.ac.uk", - "knowsleycollege.ac.uk", - "knowswho.co.jp", - "knowyourmeme.com", - "knoxemm.com", - "knti.ac.uk", - "ko-fi.com", - "koalaporn.com", - "kobbeatssbydredk.com", - "kobe-pastel.com", - "kobo.com", - "kobobooks.com", - "kochudaho.me", - "kodi.tv", - "kodi.wiki", - "kodingen.com", - "kompoz.com", - "kompoz2.com", - "kompozer.net", - "konachan.com", - "konachan.net", - "kone.com", - "koolsolutions.com", - "koornk.com", - "kopfhorergunstigshop.com", - "koranmandarin.com", - "korea.net", - "koreanpornmovie.com", - "korenan2.com", - "korewaeroi.com", - "kostenlosepornoclips.com", - "kotlinlang.org", - "koubaibu.jp", - "kouwobb.com", - "kphimsex.net", - "kpht85.com", - "kpinsurances.com", - "kpptoto.info", - "kqes.net", - "kraken.com", - "krakenjs.com", - "krhentai.com", - "kristenbjorn.com", - "krosspictures.com", - "krtco.com.tw", - "krux.com", - "krymr.com", - "ksc.ac.uk", - "kscisco.com", - "ksd235qw.com", - "ksdl.org", - "ksep.ac.uk", - "ksescortclub.com", - "ksnews.com.tw", - "kspcoin.com", - "kssacademy.ac.uk", - "kssdeanery.ac.uk", - "ksyp10.com", - "ktvu.com", - "ktzhk.com", - "ku77.xyz", - "kuaimao-app.com", - "kuaipa.net", - "kuanrenxs.com", - "kubakuba.global", - "kubakuba1996.com", - "kubeacademy.com", - "kubeapps.com", - "kubernetes.io", - "kucoin.com", - "kucoin.plus", - "kui.name", - "kuke.com", - "kukuku.uk", - "kum.com", - "kumo.com", - "kun.im", - "kun66.xyz", - "kundun1069.com", - "kurashsultan.com", - "kurtmunger.com", - "kusocity.com", - "kusugurizanmai.com", - "kutjeporno.com", - "kwcg.ca", - "kwok7.com", - "kwongwah.com.my", - "kxsw.life", - "kynogon.com", - "kyodo-d.info", - "kyodo-d.jp", - "kyodoimages.jp", - "kyodonews.jp", - "kyodonews.net", - "kyofun.com", - "kyohk.net", - "kyoyue.com", - "kyurem.com", - "kyzyhello.com", - "kzeng.info", - "l-msedge.net", - "la-forum.org", - "la-mama.ru", - "laban.ac.uk", - "labiennale.org", - "labinacell.ac.uk", - "lackcoll.ac.uk", - "lackham.ac.uk", - "lacomics.org", - "ladbrokes.com", - "ladies.com", - "ladsp.com", - "ladybaba.net", - "ladyboygold.com", - "ladyboygold.eu", - "ladyboypornonly.com", - "lae.ac.uk", - "laetottenham.ac.uk", - "lagranepoca.com", - "lahp.ac.uk", - "laia.ac.uk", - "lain.la", - "lakescollege.ac.uk", - "lakescollegewestcumbria.ac.uk", - "lal.ac.uk", - "lala.im", - "lalulalu.com", - "lama.com.tw", - "lamayeshe.com", - "lambeth.ac.uk", - "lambethacl.ac.uk", - "lambethcollege.ac.uk", - "lamda.ac.uk", - "lamenhu.com", - "lamnia.co.uk", - "lamp.ac.uk", - "lampeter.ac.uk", - "lamrim.com", - "lanarkshirefederation.ac.uk", - "lanasbigboobs.com", - "lancashire.ac.uk", - "lancashirecompact.ac.uk", - "lancashireinstituteoftechnology.ac.uk", - "lancashirelawacademy.ac.uk", - "lancashirelawschool.ac.uk", - "lancaster.ac.uk", - "lancasterbeijingjiaotong.ac.uk", - "lancs-cumbrianti.ac.uk", - "lancs-initiative.ac.uk", - "lancs.ac.uk", - "lancsngfl.ac.uk", - "landmap.ac.uk", - "landmarks.ac.uk", - "landofhope.tv", - "landscape.ac.uk", - "langdoncollege.ac.uk", - "langpol.ac.uk", - "langside.ac.uk", - "langsuirs.com", - "languagebox.ac.uk", - "languagesmythsfinds.ac.uk", - "languagesresearch.ac.uk", - "languagessoutheast.ac.uk", - "lanik.us", - "lanmdh.net", - "lanniser-ylo.shop", - "lantern.io", - "lanternal.com", - "lanterncn.cn", - "lantosfoundation.org", - "laod.cn", - "laogai.org", - "laogairesearch.org", - "laomiu.com", - "laosijifuli9009.top", - "laowang.vip", - "laoyang.info", - "lapriere.jp", - "laps.ac.uk", - "laptoplockdown.com", - "laqingdan.net", - "laracasts.com", - "largecamtube.com", - "largeporntube.com", - "larsgeorge.com", - "lasersawapp.com", - "last.fm", - "lastcombat.com", - "lastfm.es", - "lastfm.freetls.fastly.net", - "lasvegasbmw.com", - "latampartneruniversity.com", - "latamvmwareforum.com", - "latelinenews.com", - "latencytop.com", - "latex-project.org", - "latibet.org", - "latinaabuse.com", - "latintubeporn.com", - "latticedata.com", - "launchpad.net", - "launchpad.wang", - "launchpadcontent.net", - "launchpadlibrarian.com", - "launchpadlibrarian.net", - "launchpadlibrarian.org", - "lausan.hk", - "lavteam.org", - "law.ac.uk", - "law.com", - "lawcabs.ac.uk", - "lawdata.com.tw", - "lawteacher.ac.uk", - "laxd.com", - "lazymike.com", - "lbank.info", - "lbc-northwood.ac.uk", - "lbc.ac.uk", - "lbfmaddiction.com", - "lbkrs.com", - "lboro.ac.uk", - "lborolondon.ac.uk", - "lbpresearch.ac.uk", - "lbs.ac.uk", - "lbtube.com", - "lbu.ac.uk", - "lcad.ac.uk", - "lcb.ac.uk", - "lcbs.ac.uk", - "lcbt.ac.uk", - "lcds.ac.uk", - "lcf.ac.uk", - "lcfi.ac.uk", - "lcgirls.com", - "lcgroup.ac.uk", - "lciot.ac.uk", - "lcirah.ac.uk", - "lcit.ac.uk", - "lcm.ac.uk", - "lcriconvergence.ac.uk", - "lcsmerch.com", - "lcssp.ac.uk", - "lct.ac.uk", - "lcuck.ac.uk", - "lcwc.ac.uk", - "ldoc-cdt.ac.uk", - "le-direct.tv", - "le-vpn.com", - "le.ac.uk", - "leadershipfoundation.ac.uk", - "leadershiphe.ac.uk", - "leafyvpn.net", - "leaguehighschool.com", - "leagueoflegends.ca", - "leagueoflegends.co.kr", - "leagueoflegends.com", - "leagueoflegends.info", - "leagueoflegends.kr", - "leagueoflegends.net", - "leagueoflegends.org", - "leagueoflegendsscripts.com", - "leaguesharp.info", - "leaguoflegends.com", - "leakedmeat.com", - "leakedzone.com", - "leaksmodels.com", - "leakxxx.com", - "leanhe.ac.uk", - "leanhehub.ac.uk", - "leannecrowvideos.com", - "leap.ac.uk", - "leapahead.ac.uk", - "learna.ac.uk", - "learnbaes.ac.uk", - "learndirect.ac.uk", - "learnedsocietywales.ac.uk", - "learnharrow.ac.uk", - "learnhigher.ac.uk", - "learningbites.ac.uk", - "learninglink.ac.uk", - "learningmathsonline.ac.uk", - "learningonscreen.ac.uk", - "learningstaffordshire.ac.uk", - "learningtogether.ac.uk", - "learningzone.ac.uk", - "learninscotland.ac.uk", - "learninworcestershire.ac.uk", - "learnit-northampton.ac.uk", - "learnnorthants.ac.uk", - "learnportsmouth.ac.uk", - "learnsafl.ac.uk", - "learntelford.ac.uk", - "learntogive.ac.uk", - "learnwithleague.com", - "leavinghpinc.com", - "lec.ac.uk", - "lecb.ac.uk", - "lecloud.net", - "lecoin.cc", - "ledas.ac.uk", - "lede-project.org", - "leder.ac.uk", - "ledger.com", - "leeao.com.cn", - "leecountytimes.com", - "leeds-art.ac.uk", - "leeds-ecampus.ac.uk", - "leeds-lcot.ac.uk", - "leeds-met.ac.uk", - "leeds-metropolitan.ac.uk", - "leeds.ac.uk", - "leedsadultlearning.ac.uk", - "leedsbeckett.ac.uk", - "leedsbeckettuniversity.ac.uk", - "leedscitycollege.ac.uk", - "leedscollege.ac.uk", - "leedsd.ac.uk", - "leedsmet.ac.uk", - "leedsmetcarnegie.ac.uk", - "leedsmetropolitan.ac.uk", - "leedssixthform.ac.uk", - "leedsthomasdanby.ac.uk", - "leedstrinity.ac.uk", - "leek.ac.uk", - "lefora.com", - "left21.hk", - "legacy.ac.uk", - "legalporno.com", - "legalscholars.ac.uk", - "legaltracker.com", - "leggott.ac.uk", - "legsex.com", - "legsjapan.com", - "leicester-poly.ac.uk", - "leicester.ac.uk", - "leicestercollege.ac.uk", - "leicesterlearns.ac.uk", - "leicestermuseums.ac.uk", - "leicp.ac.uk", - "leics-als.ac.uk", - "leighcollege.ac.uk", - "leirentv.ca", - "leis.ac.uk", - "leisurecafe.ca", - "leisurepro.com", - "leliao1.com", - "lematin.ch", - "lemoncams.com", - "lemonde.fr", - "lencr.org", - "lenkino.xxx", - "lenporno.red", - "lenwhite.com", - "leorockwell.com", - "leos-scot.ac.uk", - "leporno.org", - "lepornochaud.com", - "lepornofrais.com", - "lerosua.org", - "lers.google", - "lersnet.ac.uk", - "lesbian8.com", - "lesbianpics.org", - "lesbianpornvideos.com", - "lesbiansubmission.com", - "lesboerotica.net", - "lesoco.ac.uk", - "lesoir.be", - "lester850.info", - "letbsharedservice.ac.uk", - "letfap.com", - "lethalhardcore.com", - "lethalhardcorevr.com", - "letmejerk.com", - "letmejerk.fun", - "letou.com", - "letscorp.net", - "letsdoeit.com", - "letsencrypt.com", - "letsencrypt.org", - "letsfuckme.net", - "letsjerk.cc", - "lettherebeporn.com", - "lettol.ac.uk", - "levelsex.com", - "leverhulme.ac.uk", - "levyhsu.com", - "lewcol.ac.uk", - "lewdthots.com", - "lewdvrgames.com", - "lewdweb.net", - "lewestraining.ac.uk", - "lewisham.ac.uk", - "lewishamsouthwarkcollege.ac.uk", - "lexisnexis.com", - "lexuemei.com", - "leyton.ac.uk", - "lezpoo.com", - "lfa.ac.uk", - "lfai.foundation", - "lfhe.ac.uk", - "lflink.com", - "lflinkup.com", - "lflinkup.net", - "lflinkup.org", - "lfpcontent.com", - "lg.com", - "lgappstv.com", - "lgbtnonhe.ac.uk", - "lgbtq.games", - "lge.co.kr", - "lge.com", - "lgecareers.com", - "lghvac.com", - "lghvacstory.com", - "lgrecyclingprogram.com", - "lgsalesportal.com", - "lgu.ac.uk", - "lhakar.org", - "lhasocialwork.org", - "lhc.ac.uk", - "lhcb.ac.uk", - "lhec.ac.uk", - "li.taipei", - "liangyou.net", - "liangzhichuanmei.com", - "lianhonghong.com", - "lianjiajr.net", - "lianyue.net", - "liaowangxizang.net", - "liberal.org.hk", - "liberapay.com", - "liberapay.org", - "libertysculpturepark.com", - "libertytimes.com.tw", - "libf.ac.uk", - "libgen.fun", - "libgen.is", - "libgen.life", - "libgen.me", - "libgen.rs", - "libgen.st", - "liboggirls.net", - "library.lol", - "libraryinformationtechnology.com", - "librarylovefest.com", - "libraryofthumbs.com", - "libredd.it", - "librewolf.net", - "libsolutions.app", - "libsolutions.domains", - "libsolutions.net", - "licdn.com", - "licensebuttons.net", - "licenseparser.com", - "lichfield.ac.uk", - "lidc.ac.uk", - "lidecheng.com", - "lido-dtp.ac.uk", - "life-global.org", - "life.ac.uk", - "lifearc.ac.uk", - "lifeatkings.ac.uk", - "lifelab.ac.uk", - "lifelonglearning.ac.uk", - "lifemiles.com", - "lifeselector.com", - "lifesign.ac.uk", - "lifestudy.ac.uk", - "lifewire.com", - "liftapp.ac.uk", - "lightbridge.com", - "lighten.org.tw", - "lighthouselearningtrust.ac.uk", - "lighti.me", - "lightnovel.cn", - "lightxxxtube.com", - "lightyearvpn.com", - "lih.kg", - "lihe.ac.uk", - "lihkg.com", - "lihksnap.com", - "like.com", - "likeseiyu.com", - "liketruyen.net", - "liketwice.com", - "likuoo.video", - "lilaoshibushinilaoshi.com", - "lilhumpers.com", - "liliav.com", - "lilith-soft.com", - "limavady.ac.uk", - "lime.ac.uk", - "limedia.tw", - "limelight.com", - "limer.tw", - "limertw.cc", - "limeteensex.com", - "limiao.net", - "lims.ac.uk", - "lin.ee", - "lincoln.ac.uk", - "lincolncollege.ac.uk", - "lincolninstitute.ac.uk", - "lincolninstituteoftechnology.ac.uk", - "lincolnmedicalschool.ac.uk", - "lincolnshireinstituteoftechnology.ac.uk", - "lincsiot.ac.uk", - "lincsit.ac.uk", - "lindylist.org", - "line-apps-beta.com", - "line-apps-rc.com", - "line-apps.com", - "line-beta.me", - "line-cdn.net", - "line-scdn.net", - "line.biz", - "line.me", - "linearcollider.org", - "linecorp.com", - "linefriends.com", - "linefriends.com.tw", - "linegame.jp", - "linemobile.com", - "linemyshop.com", - "lineshoppingseller.com", - "linetv.tw", - "lingeriepornonly.com", - "linglingfa.com", - "lingualeo.com", - "linguee.com", - "linguistics.ac.uk", - "lingvodics.com", - "link-o-rama.com", - "link.com", - "link19college.ac.uk", - "link2galleries.com", - "link2learn-ni.ac.uk", - "link69.com", - "linkage.ac.uk", - "linkagecollege.ac.uk", - "linkedin.at", - "linkedin.com", - "linkideo.com", - "linkinglondon.ac.uk", - "linkjunkies.com", - "linksalpha.com", - "linkshit.com", - "linksintolanguages.ac.uk", - "linktr.ee", - "linkuswell.com", - "linotype.com", - "linpie.com", - "linseysworld.com", - "linst.ac.uk", - "linux.org", - "linux.org.hk", - "linuxfoundation.org", - "linuxfromscratch.org", - "linuxmint.com", - "linuxtoy.org", - "lionhearts.co.kr", - "lionsroar.com", - "lipa.ac.uk", - "liparm.ac.uk", - "lipidomics.ac.uk", - "lipsit.ac.uk", - "lipuman.com", - "liquiditytp.com", - "liquidtelecom.net", - "liquidvpn.com", - "liscol.ac.uk", - "lisiku.com", - "lisiku1.com", - "liss-dtp.ac.uk", - "list-manage.com", - "listar.ac.uk", - "listen-up.ac.uk", - "listennotes.com", - "listentoyoutube.com", - "listerpostgraduate.ac.uk", - "listinganalytics.net", - "listorious.com", - "litbus-anime.com", - "literatumonline.com", - "literotica.com", - "lithium.com", - "litt.ac.uk", - "littleasians.com", - "littlehampton.ac.uk", - "littlesexdolls.com", - "litv.tv", - "liu-xiaobo.org", - "liudejun.com", - "liuhanyu.com", - "liuhefabu.club", - "liujianshu.com", - "liuxiaobo.net", - "liuxiaotong.com", - "liv-coll.ac.uk", - "liv-e.ac.uk", - "liv.ac.uk", - "live-patreon-marketing.pantheonsite.io", - "live-video.net", - "live.ac.uk", - "live.com", - "live.com.au", - "live.eu", - "live.net", - "liveauction.com", - "livecamclips.com", - "livecoin.net", - "livedoor.biz", - "livedoor.blog", - "livedoor.jp", - "livefilestore.com", - "livehdcams.com", - "livejasmin.com", - "livejasminbabes.net", - "livekit.cloud", - "liveleak.com", - "livemint.com", - "livemodels.co", - "livenet.ac.uk", - "livephotos.tv", - "liveporngirls.com", - "liveprivates.com", - "liverail.com", - "liverail.tv", - "liverpool.ac.uk", - "liverpoolsas.ac.uk", - "livesandletters.ac.uk", - "livesex.com", - "livesexasian.com", - "livesketchshare.com", - "livestation.com", - "livestream.com", - "livevideo.com", - "livewell.ac.uk", - "livexxx.me", - "livhope.ac.uk", - "livingdigital.ac.uk", - "livinglab.ac.uk", - "livinglaboratory.ac.uk", - "livinglegacies1914-18.ac.uk", - "livingonline.us", - "livingstream.com", - "livingwithmachines.ac.uk", - "livingyourambition.com", - "livjm.ac.uk", - "livrariart.com.br", - "liwangyang.com", - "lizardporn.com", - "lizhizhuangbi.com", - "lizol.co.in", - "ljmu.ac.uk", - "lkcn.net", - "lkl.ac.uk", - "ll82y2ifdd.top", - "llakes.ac.uk", - "llambed.ac.uk", - "llandrillo.ac.uk", - "llas.ac.uk", - "llbd10.shop", - "llcaoxm-avi.sbs", - "lldns.net", - "lliusno.com", - "llnw-trials.com", - "llnw.com", - "llnw.net", - "llnwd.net", - "llnwi.net", - "llss.me", - "llwht88.xyz", - "llysfasi.ac.uk", - "lma.ac.uk", - "lmbru.ac.uk", - "lmc.ac.uk", - "lmd.ac.uk", - "lmi4he.ac.uk", - "lmm167.shop", - "lmmbtc.com", - "lms.ac.uk", - "lmsys.org", - "lmu.ac.uk", - "lnat.ac.uk", - "lncn.org", - "lnkd.in", - "lnstagram-help.com", - "load.to", - "loanbuilder.com", - "lobsangwangyal.com", - "lobstertube.com", - "localbitcoins.com", - "localbitcoinschain.com", - "localdomain.ws", - "localizecdn.com", - "localizejs.com", - "localizestatus.com", - "localpresshk.com", - "localxlist.org", - "locate.ac.uk", - "lockestek.com", - "lockssalliance.ac.uk", - "logbot.net", - "logi.com", - "logic.ac.uk", - "logicool.co.jp", - "logicoolg.com", - "login-account.net", - "login-paypal.com", - "login-paypal.info", - "logiqx.com", - "logitech.biz", - "logitech.com", - "logitech.com.cn", - "logitech.fr", - "logitech.io", - "logitechg.com", - "logitechg.com.cn", - "logitechg.fr", - "logitechio.com.cn", - "logmein.com", - "logos.com.hk", - "logosfilm.co.kr", - "loholidayhk.com", - "lojaiphone.com.br", - "lokinet.org", - "lol-europe.com", - "lolclub.org", - "lolespor.com", - "lolesports.com", - "lolfanart.net", - "lolhentai.net", - "loli.net", - "lolibus.cc", - "lolibus.top", - "lolislove.info", - "lolita.bet", - "lollipopescorts.com", - "lolo.ac.uk", - "lolpcs.com", - "lolshop.co.kr", - "lolstatic.com", - "lolusercontent.com", - "lon.ac.uk", - "london-college.ac.uk", - "london-fashion.ac.uk", - "london-guildhall.ac.uk", - "london-pgmde.ac.uk", - "london.ac.uk", - "londonbiblecollege.ac.uk", - "londonbusinessschool.ac.uk", - "londoncbs.ac.uk", - "londoncentre-hstm.ac.uk", - "londonchinese.ca", - "londonchurchillcollege.ac.uk", - "londondeanery.ac.uk", - "londoneastcove.ac.uk", - "londonexternal.ac.uk", - "londonfilmacademy.ac.uk", - "londonhigher.ac.uk", - "londonhotescort.com", - "londoninternational.ac.uk", - "londonknowledgelab.ac.uk", - "londonlinks.ac.uk", - "londonmedicine.ac.uk", - "londonmet.ac.uk", - "londonmetro.ac.uk", - "londonmetropolitan.ac.uk", - "londonmetropolitanuniversity.ac.uk", - "londonmetuniversity.ac.uk", - "londonmithraeum.com", - "londonp4p.ac.uk", - "londonreach.ac.uk", - "londonreal.tv", - "londonschooloftheology.ac.uk", - "londonscreenacademy.ac.uk", - "londonstudiocenter.ac.uk", - "londonstudiocentre.ac.uk", - "lonestarnaughtygirls.com", - "longbridge.cloud", - "longbridge.global", - "longbridge.hk", - "longbridge.sg", - "longbridgeapp.com", - "longeaton.ac.uk", - "longhair.hk", - "longley-park.ac.uk", - "longley-parksfc.ac.uk", - "longleypark.ac.uk", - "longleyparkcollege.ac.uk", - "longleyparksfc.ac.uk", - "longleyparksixthformcollege.ac.uk", - "longman.ch", - "longmusic.com", - "longportapp.com", - "longroad.ac.uk", - "longtailvideo.com", - "longtermly.net", - "longtoes.com", - "lonklab.ac.uk", - "lonmet.ac.uk", - "lonmetro.ac.uk", - "lonmt.ac.uk", - "lookinside.com", - "lookpic.com", - "looktoronto.com", - "loongese.com", - "looporn.com", - "looti.net", - "lordofultima.com", - "loreto.ac.uk", - "lostbetsgames.com", - "lotcrap.com", - "lothiancolleges.ac.uk", - "lotsawahouse.org", - "lotuslight.org.hk", - "lotuslight.org.tw", - "lou.ac.uk", - "loucoll.ac.uk", - "loughborough.ac.uk", - "loukky.com", - "love-sextoys.co.uk", - "love4porn.com", - "love6.tv", - "love7.xyz", - "loveamateurfacials.com", - "loveavdh15.cc", - "loveavdh21.cc", - "loveavvip.com", - "lovebeatsdr.com", - "loved.hk", - "lovedolltorso.com", - "lovegirls.cam", - "lovehomeporn.com", - "lovejav.net", - "loveloveskill.com", - "lovemarca.com", - "loveminiso.com.br", - "loveparents.org", - "lovepartners.life", - "loverslab.com", - "lovesexbody.com", - "lovesexdurex.com", - "lovethiscity.com", - "lovetvshow.com", - "lovex.life", - "lowergiseries.com", - "lowestoft.ac.uk", - "lowestoftsfc.ac.uk", - "lowestoftsixthformcollege.ac.uk", - "lowiro.com", - "lp99.pw", - "lpc.ac.uk", - "lpmde.ac.uk", - "lpsg.com", - "lqpjw.cyou", - "lrfdsoftware.com", - "lrfz.com", - "lrip.org", - "lrysgee.xyz", - "ls-uc.ac.uk", - "lsa.ac.uk", - "lsawards.com", - "lsbm.ac.uk", - "lsbu.ac.uk", - "lscollege.ac.uk", - "lscs.ac.uk", - "lsd.org.hk", - "lse-departments.ac.uk", - "lse-events.ac.uk", - "lse-global.ac.uk", - "lse-marketing.ac.uk", - "lse-nursery.ac.uk", - "lse-research.ac.uk", - "lse-residences.ac.uk", - "lse-sport.ac.uk", - "lse-students.ac.uk", - "lse.ac.uk", - "lseapplicants.ac.uk", - "lsec.ac.uk", - "lsecollaborators.ac.uk", - "lsejournals.ac.uk", - "lsestaff.ac.uk", - "lsfc.ac.uk", - "lsforum.net", - "lsgnt-cdt.ac.uk", - "lshtm.ac.uk", - "lsj2.shop", - "lsj40.xyz", - "lsjfuli308.xyz", - "lsjs.ac.uk", - "lsm.org", - "lsmchinese.org", - "lsme.ac.uk", - "lsmkorean.org", - "lsmradio.com", - "lsmwebcast.com", - "lso.ac.uk", - "lspimg.com", - "lsrc.ac.uk", - "lsrnw.ac.uk", - "lss55.com", - "lsst.ac.uk", - "lst.ac.uk", - "lstmed.ac.uk", - "lstmliverpool.ac.uk", - "lstonline.ac.uk", - "lsxszzg.com", - "ltcc.ac.uk", - "ltea.ac.uk", - "ltegroup.ac.uk", - "lthgav.buzz", - "ltn.com.tw", - "ltscotland.ac.uk", - "ltsn-01.ac.uk", - "ltsn.ac.uk", - "ltsneng.ac.uk", - "ltsports.com.tw", - "ltube.life", - "lu2100.com", - "lu2200.com", - "lu23.com", - "lu2300.cc", - "lua.org", - "luanlunmv.cc", - "lubetube.com", - "lucahmelayu.club", - "lucasentertainment.com", - "lucbjtu.ac.uk", - "lucid.ac.uk", - "luckydesigner.space", - "luckyissue.com", - "ludlow-college.ac.uk", - "lufton-college-fe.ac.uk", - "luftoncollege.ac.uk", - "luil.ac.uk", - "luke54.com", - "luke54.org", - "lululu.one", - "luminate.ac.uk", - "luminateeducation.ac.uk", - "luminateeducationgroup.ac.uk", - "luminategroup.ac.uk", - "lunchwithpype.com", - "luoli.info", - "luotihg-tv.buzz", - "luotihg.cc", - "lupc.ac.uk", - "lupm.org", - "lupoporno.com", - "luscious.net", - "lushstories.com", - "lustery.com", - "lusthero.com", - "lustylist.com", - "lut.ac.uk", - "luticlip.com", - "luton-acl.ac.uk", - "luton.ac.uk", - "lutonacl.ac.uk", - "lutonsfc.ac.uk", - "lutube2310.com", - "luvmov.com", - "luw666.xyz", - "luw666cm.cc", - "luxebc.com", - "luxuretv.com", - "luxuretv.fun", - "lvhai.org", - "lvv.ac.uk", - "lvv2.com", - "lwms.ac.uk", - "lww-cetl.ac.uk", - "lwwcn.buzz", - "lwwcn.xyz", - "lxxlxx.com", - "lyellcentre.ac.uk", - "lyfhk.net", - "lysol.ca", - "lysol.cl", - "lysol.co.cr", - "lysol.com", - "lysol.com.mx", - "lysol.net", - "lythamsixth.ac.uk", - "lyzsxx.com", - "lz.ac.uk", - "lzjscript.com", - "lzmtnews.org", - "m-power.com", - "m-rhex.ac.uk", - "m-sport.co.uk", - "m-team.cc", - "m.me", - "m12.vc", - "m25lib.ac.uk", - "m2m.com", - "m5servicedesk.ac.uk", - "m5universities.ac.uk", - "m8008.com", - "ma1lib.org", - "maa.plus", - "mabbank.com", - "mablethorpe.ac.uk", - "mac-migs.ac.uk", - "mac-mini.com", - "mac.com", - "mac.com.au", - "mac.eu", - "mac.rs", - "mac.wang", - "macappsto.re", - "macaulay.ac.uk", - "macbook.co", - "macbook.hk", - "macbook.tw", - "macbook.wang", - "macbookair.co.kr", - "macbookair.co.uk", - "macbookair.com", - "macbookair.com.au", - "macbookair.com.es", - "macbookair.es", - "macbookair.hk", - "macbookair.jp", - "macbookair.kr", - "macbookair.net", - "macbookpro.co", - "macbookpro.com", - "macbookpro.com.au", - "macbookpro.net", - "macbookpro.us", - "macbookpros.com", - "macbooksale.com", - "macboxset.com", - "macclesfield-college.ac.uk", - "macclesfield.ac.uk", - "macgamestore.com", - "mach-os.com", - "mach-os.net", - "machbbs.com", - "machigle-sp.com", - "machigoto.jp", - "machine-dna.com", - "machogaytube.com", - "machos.net", - "machosaonatural.com.br", - "machotube.tv", - "macintosh.eu", - "macintoshsoftware.com", - "mackworth-college.ac.uk", - "mackworth.ac.uk", - "macmini.com", - "macos.com.au", - "macosforge.org", - "macossierra.com", - "macosx.info", - "macosxlion.com", - "macpazar.com", - "macports.org", - "macreach.com", - "macreach.net", - "macromedia.com", - "macrovpn.com", - "macruby.com", - "macruby.net", - "macruby.org", - "macrumors.com", - "macts.com.tw", - "mad-ar.ch", - "madamlive.tv", - "madchensex.com", - "maddawgjav.net", - "maddenchampionship.com", - "maddenrewards.com", - "maddenseason.info", - "maddenseason.net", - "maddenseason.org", - "madewithcode.com", - "madewithmaya.com", - "madewithstudiotools.com", - "madhomemadeporn.com", - "madonna-av.com", - "madou.club", - "madou.la", - "madou.tv", - "madouav.one", - "madouqu.com", - "madrau.com", - "madshi.net", - "madthumbs.com", - "madvagina.com", - "madvr.com", - "madvr.net", - "maes.ac.uk", - "mafia-linkz.to", - "mageconf.com", - "mageconf.com.ua", - "magento.com", - "magento.net", - "magentocommerce.com", - "magentoliveconference.com", - "magentomobile.com", - "magestic.com", - "magic-net.info", - "magic.ac.uk", - "magicalmirai.com", - "magicmovies.com", - "maglue.ac.uk", - "magnacartacollege.ac.uk", - "mahabodhi.org", - "mahajantech.com", - "mahsc.ac.uk", - "maiio.net", - "mail-archive.com", - "mail.ru", - "mailchimp.com", - "maildns.xyz", - "maileoch.com", - "mailhealth.com", - "mailonline.co.uk", - "mailonline.com", - "mailonsunday.co.uk", - "mailonsunday.ie", - "mailtalk.ac.uk", - "main.jp", - "mainichi-athletepartners.jp", - "mainichi.jp", - "mainichibooks.com", - "maiplus.com", - "mairbeats.com", - "maizhong.org", - "makaan.com", - "makeanything.com", - "makebettercode.com", - "makecode.org", - "makeeu.com", - "makeitopen.com", - "makeitrealcontest.com", - "makemymood.com", - "makesenseofdata.com", - "makingassessmentcount.ac.uk", - "makingstartshere.com", - "makingthemostofmasters.ac.uk", - "makkahnewspaper.com", - "maktoob.com", - "malayalamanorama.com", - "malayporn.site", - "malayporn.space", - "malaypornhub.com", - "malaysiakini.com", - "mallandrinhas.net", - "mallheadphone.com", - "malvastudios.com", - "malvern.ac.uk", - "mamacitaz.com", - "mamingzhe.com", - "man.ac.uk", - "managed-pki.ch", - "managed-pki.de", - "managedmeetingrooms.com", - "managedpki.com", - "managedpki.ne.jp", - "management-azure-devices-int.net", - "management-azure-devices.net", - "managementcontrolassociation.ac.uk", - "mancat.ac.uk", - "manchester-business-school.ac.uk", - "manchester-city-coll.ac.uk", - "manchester-computing-centre.ac.uk", - "manchester-metropolitan-university.ac.uk", - "manchester-worldwide.ac.uk", - "manchester.ac.uk", - "manchesterbusinessschool.ac.uk", - "manchesterdentalschool.ac.uk", - "manchesterjmce.ac.uk", - "manchestermedicalschool.ac.uk", - "manchestermethod.ac.uk", - "manchesternti.ac.uk", - "manchesternursingmidwiferyandsocialworkschool.ac.uk", - "manchesternursingschool.ac.uk", - "manchesterpharmacyschool.ac.uk", - "manchesterpsychologyschool.ac.uk", - "manchesterschoolofdentistry.ac.uk", - "manchesterschoolofmedicine.ac.uk", - "manchesterschoolofnursing.ac.uk", - "manchesterschoolofnursingmidwiferyandsocialwork.ac.uk", - "manchesterschoolofpharmacy.ac.uk", - "manchesterschoolofpsychology.ac.uk", - "manchukuo.net", - "manchustate.org", - "mandatewire.com", - "mandiant.com", - "manga-mill.com", - "manga18.art", - "mangafox.com", - "mangafox.me", - "mangahasu.se", - "mangahentai.me", - "mangahome.com", - "mangoporn.net", - "mangotporn.com", - "manhuabika.com", - "manhuache.com", - "manhuagui.com", - "manhub.com", - "manhunt.net", - "manhuntdaily.com", - "manhwa24h.com", - "manhwahentai.me", - "maniakey.homes", - "maniash.com", - "manicur4ik.ru", - "manlitphil.ac.uk", - "manorama.com", - "manoramanews.com", - "manoramaonline.com", - "manoramayearbook.in", - "manoto1.tv", - "manototv.com", - "manporn.xxx", - "mansion.com", - "mansionglobal.com", - "mansionpoker.com", - "mansurfer.com", - "manta.com", - "mantais.ac.uk", - "mantochichi.com", - "manufacturingedc.ac.uk", - "manurefetish.com", - "manytoon.com", - "manyvids.com", - "manyvoices.news", - "maoeraobjects.ac.uk", - "maomi-shipin.com", - "maomiav.one", - "map-software.com", - "mapbox.com", - "mapguide.com", - "maple.finance", - "maplew.com", - "mapp.ac.uk", - "mappingonline.com", - "mappingthemedievalmargins.ac.uk", - "mappingtheunderworld.ac.uk", - "mappingwales.ac.uk", - "mappingwelshmarches.ac.uk", - "marble.ac.uk", - "marc.info", - "marchmont.ac.uk", - "maremap.ac.uk", - "marguerite.su", - "mariadb.org", - "marianstudies.ac.uk", - "marinecadcam.com", - "marinecentrewales.ac.uk", - "marioandluigidreamteam.com", - "mariobroswii.com", - "mariokart7.com", - "mariokart8.com", - "mariosupersluggers.com", - "marjon.ac.uk", - "marketexecutive.net", - "marketing-cloud.com", - "marketing-nirvana.com", - "marketingcloud.com", - "marketo.co.uk", - "marketo.com", - "marketo.net", - "marketo.tv", - "marketodesigner.com", - "marketolive.com", - "marketwatch.com", - "markingmenus.com", - "markzuckerberg.com", - "marlab.ac.uk", - "marlin.ac.uk", - "marplecollege.ac.uk", - "marranazas.com", - "martau.com", - "martincartoons.com", - "martinoei.com", - "martsangkagyuofficial.org", - "maruta.be", - "maruzen.co.jp", - "marvel.com", - "marvel10thanniversary.com", - "marveldimensionofheroes.com", - "marvelparty.net", - "marvelpinball.com", - "marvelsdoubleagent.com", - "marvelspotlightplays.com", - "marvelsuperheroseptember.com", - "marvelsuperwar.com", - "marxist.com", - "marxist.net", - "marxists.org", - "maryvale.ac.uk", - "maryward.ac.uk", - "marywardcentre.ac.uk", - "masalabin.com", - "masaladesi.com", - "masalaseen.net", - "masalladeloslimites.com", - "masc25.ac.uk", - "mash.to", - "mashaalradio.com", - "mashash.com", - "mashiro.site", - "maskedip.com", - "maskedsingerfox.com", - "massage-in-taipei.com", - "massagerepublic.com", - "masseffect.com", - "masseffectarchives.com", - "mastercad.com", - "mastercard-email.com", - "mastercard.ae", - "mastercard.at", - "mastercard.az", - "mastercard.ba", - "mastercard.be", - "mastercard.bg", - "mastercard.by", - "mastercard.ca", - "mastercard.ch", - "mastercard.cl", - "mastercard.co.id", - "mastercard.co.il", - "mastercard.co.in", - "mastercard.co.jp", - "mastercard.co.ke", - "mastercard.co.kr", - "mastercard.co.nz", - "mastercard.co.th", - "mastercard.co.uk", - "mastercard.co.ve", - "mastercard.co.za", - "mastercard.com", - "mastercard.com.ar", - "mastercard.com.au", - "mastercard.com.bh", - "mastercard.com.br", - "mastercard.com.bz", - "mastercard.com.co", - "mastercard.com.cy", - "mastercard.com.eg", - "mastercard.com.ge", - "mastercard.com.gt", - "mastercard.com.hk", - "mastercard.com.kw", - "mastercard.com.lb", - "mastercard.com.mx", - "mastercard.com.my", - "mastercard.com.ng", - "mastercard.com.pe", - "mastercard.com.ph", - "mastercard.com.sa", - "mastercard.com.sg", - "mastercard.com.tr", - "mastercard.com.tw", - "mastercard.com.ve", - "mastercard.com.vn", - "mastercard.cz", - "mastercard.de", - "mastercard.dk", - "mastercard.es", - "mastercard.eu", - "mastercard.fi", - "mastercard.fr", - "mastercard.gr", - "mastercard.hr", - "mastercard.hu", - "mastercard.ie", - "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.us", - "mastercardacademy.com", - "mastercardadvisors.com", - "mastercardbiz.ca", - "mastercardbiz.com", - "mastercardbusinessnetwork.com", - "mastercardcenter.com", - "mastercardcenter.org", - "mastercardcenterforinclusivegrowth.org", - "mastercardconnect.com", - "mastercardezsavings.com", - "mastercardidtheftalerts.com", - "mastercardmoments.com", - "mastercardrestaurant.com", - "mastercardservices.com", - "mastercardworldwide.com", - "masterclass.com", - "masterintelligence.com", - "masterpassteststore.com", - "mastersprojects.ac.uk", - "masterwanker.com", - "mastodon.cloud", - "mastodon.host", - "mastodon.online", - "mastodon.social", - "mastodon.xyz", - "masts.ac.uk", - "masturbate2gether.com", - "mat6tube.com", - "matainja.com", - "match.ac.uk", - "matchmover.com", - "material.io", - "materials.ac.uk", - "materialsnexus.ac.uk", - "mathable.io", - "mathcentre.ac.uk", - "mathematics.ac.uk", - "mathfit.ac.uk", - "mathgate.ac.uk", - "mathiew-badimon.com", - "mathoverflow.net", - "maths-magic.ac.uk", - "mathscentre.ac.uk", - "mathstore.ac.uk", - "mathsvideoclubs.ac.uk", - "mathtutor.ac.uk", - "matome-plus.com", - "matome-plus.net", - "matrix.ac.uk", - "matrix.org", - "matrix.to", - "matsushimakaede.com", - "matters.news", - "matters.one", - "matters.town", - "mattersprotocol.io", - "matthew-boulton.ac.uk", - "mattu.ac.uk", - "mattwilcox.net", - "matu.ac.uk", - "mature-amateur-sex.com", - "mature-nl.eu", - "mature-porn-flix.com", - "mature-tube.sexy", - "mature.nl", - "matureclub.com", - "maturefuck.cc", - "maturejp.com", - "matureladiesxxx.com", - "matureporner.com", - "maturepornonly.com", - "matures-loving-sex.com", - "maturescam.com", - "maturesexual.com", - "maturesinhd.com", - "maturetube.com", - "maturewifeporn.cc", - "maturewomenanal.com", - "maturexxxvideos.cc", - "mau.ac.uk", - "max.com", - "maxgo.com", - "maxillofacial-cadcam.com", - "maximize.ac.uk", - "maximumerotica.com", - "maxing.jp", - "maxis.com", - "maxwell.ac.uk", - "maya5.net", - "mayacomplete.com", - "mayaconductors.com", - "mayafluideffects.com", - "mayaformotiongraphics.com", - "mayagames.com", - "mayamasters.com", - "mayamentor.net", - "mayamentors.com", - "mayamentors.net", - "mayaonlinux.com", - "mayaonmac.com", - "mayaonosx.com", - "mayapressbooks.com", - "mayasucks.com", - "mayaunlimited.com", - "mayauser.com", - "mayauser.net", - "mayavisualization.com", - "mayijiejie.com", - "mayimayi.com", - "maying.co", - "mba.ac.uk", - "mbc.ac.uk", - "mbeats-tech.com", - "mbheadphone.com", - "mbn.ac.uk", - "mbro.ac.uk", - "mbs-worldwide.ac.uk", - "mbs.ac.uk", - "mc6.ac.uk", - "mca.ac.uk", - "mcadforums.com", - "mcaf.ee", - "mcb.com.mm", - "mcc.ac.uk", - "mcd-holdings.co.jp", - "mcd.com", - "mcdelivery.co.id", - "mcdelivery.co.in", - "mcdelivery.co.kr", - "mcdelivery.com.au", - "mcdelivery.com.my", - "mcdelivery.com.ph", - "mcdelivery.com.sg", - "mcdelivery.com.tw", - "mcdindia.com", - "mcdindonesia.com", - "mcdonalds-online.com", - "mcdonalds.be", - "mcdonalds.ca", - "mcdonalds.co.id", - "mcdonalds.co.jp", - "mcdonalds.co.kr", - "mcdonalds.co.nz", - "mcdonalds.co.uk", - "mcdonalds.com", - "mcdonalds.com.au", - "mcdonalds.com.hk", - "mcdonalds.com.lb", - "mcdonalds.com.my", - "mcdonalds.com.ph", - "mcdonalds.com.tw", - "mcdonalds.hk", - "mcdonalds.it", - "mcdonalds.no", - "mcdonalds.se", - "mcdonaldsapps.com", - "mcdonaldsarabia.com", - "mcdonaldsparties.co.nz", - "mcfog.com", - "mcisco.com", - "mcls.ac.uk", - "mcpeaceofmind.com", - "mcreasite.com", - "mcrouter.net", - "mcrouter.org", - "mcstories.com", - "mcsw.ac.uk", - "mctimoney-college.ac.uk", - "md-t.org", - "mdbankpublic.com", - "mdhcdn.com", - "mdialog.com", - "mdn.dev", - "mdnkids.com", - "mdnplay.dev", - "mdnyalp.dev", - "mdpi.com", - "mdpj-mov.shop", - "mdpjoin.buzz", - "mdr-good.sbs", - "mdr100ya.lat", - "mdtt-tv.sbs", - "mdx.ac.uk", - "mdyy.de", - "me-gay.com", - "me.com", - "me.me", - "meadjohnson.com", - "meadjohnson.com.hk", - "meadjohnson.com.tw", - "meadjohnson.net", - "meansys.com", - "mearki.com", - "meb.gov.mm", - "meddyliwchamgymru.ac.uk", - "mede-innovation.ac.uk", - "medev.ac.uk", - "medhist.ac.uk", - "media-amazon.com", - "media-imdb.com", - "media.org.hk", - "mediachinese.com", - "mediafiles-cisco.com", - "mediafire.com", - "mediafreakcity.com", - "mediahub.ac.uk", - "median.ac.uk", - "mediasama.com", - "mediawiki.org", - "medicalimplants-cadcam.com", - "medicalnewstoday.com", - "medicine.ac.uk", - "medievalchester.ac.uk", - "medievalfrancophone.ac.uk", - "medievalswansea.ac.uk", - "medipathways.ac.uk", - "medium.com", - "medium.systems", - "medow.ru", - "medrxiv.org", - "medschools.ac.uk", - "medway.ac.uk", - "medwayacl.ac.uk", - "mee6.xyz", - "meendo.com", - "meet.new", - "meetandfuck.games", - "meetandfuckgames.com", - "meetav.com", - "meetfasttrack.com", - "meetsmartbook.com", - "meetup.com", - "meetyourdevices.com", - "mefeedia.com", - "meforum.org", - "mefound.com", - "mega.co.nz", - "mega.io", - "mega.nz", - "megacamz.com", - "megafilmporno.com", - "megalodon.jp", - "megamon.co.kr", - "megaphone.fm", - "megapornfreehd.com", - "megaporno.com.br", - "megapornpics.com", - "megaproxy.com", - "megarotic.com", - "megatitsminka.com", - "megavideo.com", - "meguk.ac.uk", - "megurineluka.com", - "meguso.com", - "meijinsen.jp", - "meilleurpornos.com", - "meirion-dwyfor.ac.uk", - "meirixiaochao.com", - "meitula.net", - "meizhong.blog", - "meizhong.report", - "melon.com", - "melon365.com", - "melonbooks.co.jp", - "melonstube.com", - "meltoday.com", - "meme111.com", - "memehk.com", - "memes.tw", - "memorybbs.com", - "memri.org", - "memrijttm.org", - "men.com", - "men18.net", - "menai.ac.uk", - "menatplay.com", - "mendel.ac.uk", - "mendeley.com", - "mengnan.shop", - "menhdv.com", - "mensheaven.jp", - "menshin-channel.com", - "meoriental.com", - "meplg.ac.uk", - "mepn.com", - "meraki-go.com", - "meraki.hk", - "merakigo.com", - "merc.ac.uk", - "mercari.com", - "mercari.jp", - "mercatox.com", - "mercdn.net", - "mercyprophet.org", - "mergersandinquisitions.org", - "meridian-trust.org", - "meridian.net", - "meripet.biz", - "meripet.com", - "merit-times.com.tw", - "merlin.ac.uk", - "merlinblog.xyz", - "merops.ac.uk", - "merristwood.ac.uk", - "merseyandwestlancslln.ac.uk", - "merthyr.ac.uk", - "merton-acl.ac.uk", - "merton-adult-education.ac.uk", - "merton.ac.uk", - "mertonadulteducation.ac.uk", - "meshmixer.com", - "meshmixerforum.com", - "meshrep.com", - "mesotw.com", - "messenger.com", - "messengerdevelopers.com", - "messytube.com", - "met-nude.com", - "meta.ai", - "meta.com", - "metabolomics.ac.uk", - "metabora.io", - "metacafe.com", - "metacloud.com", - "metacpan.org", - "metacubex.one", - "metadac.ac.uk", - "metafilter.com", - "metalpha.finance", - "metamind.io", - "metanoia.ac.uk", - "metaporn.com", - "metart.com", - "metarthunter.com", - "metartnetwork.com", - "metcaerdydd.ac.uk", - "metcams.com", - "meteorr.ac.uk", - "meteorshowersonline.com", - "metfilm.ac.uk", - "metfilmschool.ac.uk", - "methnet.ac.uk", - "methodsnetwork.ac.uk", - "methodsnorthwest.ac.uk", - "metro.co.uk", - "metro.taipei", - "metrohk.com.hk", - "metrolife.ca", - "metropolitana.tokyo", - "metroradio.com.hk", - "metrotoons.com", - "meu.ac.uk", - "meuhentai.com", - "mewe.com", - "mexc.com", - "mexcsensors.com", - "meyou.jp", - "meyul.com", - "mfeed.ad.jp", - "mfg-inspector.com", - "mfmf.club", - "mfo.ac.uk", - "mfxmedia.com", - "mgo-images.com", - "mgo.com", - "mgoon.com", - "mgsdtp.ac.uk", - "mgstage.com", - "mh4u.org", - "mhdss.ac.uk", - "mhhanman.xyz", - "mhie.ac.uk", - "mhqwe.xyz", - "mhradio.org", - "mhrn.ac.uk", - "mhs-relay.ac.uk", - "mhs.ac.uk", - "mhshosting.com", - "mi.com", - "mi9.com.au", - "mi9cdn.com", - "miamifintechfestival.com", - "miaomwu.com", - "miaopa.net", - "mib.ac.uk", - "mic.ac.uk", - "micb.gov.mm", - "michaelanti.com", - "michaelmarketl.com", - "mickey.tv", - "mickybells.com", - "microad.co.jp", - "microad.jp", - "microbit.org", - "microbusiness.ac.uk", - "microgravity.ac.uk", - "micron.ac.uk", - "micronanoflows.ac.uk", - "microsimulation.ac.uk", - "microsoft-falcon.io", - "microsoft-give.com", - "microsoft-int.com", - "microsoft-ppe.com", - "microsoft-sap-events.com", - "microsoft-sbs-domains.com", - "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.net", - "microsoft.pl", - "microsoft.pt", - "microsoft.red", - "microsoft.ro", - "microsoft.rs", - "microsoft.ru", - "microsoft.se", - "microsoft.si", - "microsoft.tv", - "microsoft.ua", - "microsoft.uz", - "microsoft.vn", - "microsoft365.com", - "microsoftaccountguard.com", - "microsoftadc.com", - "microsoftads.com", - "microsoftadvertising.com", - "microsoftadvertisingregionalawards.com", - "microsoftaffiliates.com", - "microsoftapp.net", - "microsoftazuresponsorships.com", - "microsoftcloud.com", - "microsoftcloudsummit.com", - "microsoftcloudworkshop.com", - "microsoftcommunitytraining.com", - "microsoftdiplomados.com", - "microsofteca.com", - "microsoftedge.com", - "microsoftgamestack.com", - "microsofthouse.com", - "microsofthouse.net", - "microsoftinternetsafety.net", - "microsoftiotcentral.com", - "microsoftiotinsiderlabs.com", - "microsoftlatamaitour.com", - "microsoftlatamholiday.com", - "microsoftlinc.com", - "microsoftmxfilantropia.com", - "microsoftnews.cc", - "microsoftnews.com", - "microsoftnews.net", - "microsoftnews.org", - "microsoftnewsforkids.com", - "microsoftnewsforkids.net", - "microsoftnewsforkids.org", - "microsoftnewskids.com", - "microsoftnewskids.net", - "microsoftnewskids.org", - "microsoftonline-p.com", - "microsoftonline.com", - "microsoftpartnercommunity.com", - "microsoftpartnersolutions.com", - "microsoftreactor.info", - "microsoftreactor.net", - "microsoftreactor.org", - "microsoftready.com", - "microsoftsilverlight.com", - "microsoftsilverlight.net", - "microsoftsilverlight.org", - "microsoftsiteselection.com", - "microsoftsqlserver.com", - "microsoftstart.com", - "microsoftstore.com", - "microsoftstore.com.hk", - "microsoftstream.com", - "microsoftteams.com", - "microsofttradein.com", - "microsofttranslator.com", - "microsoftuwp.com", - "microvpn.com", - "micstl.com", - "midatlanticbmwmotorcycles.com", - "midchesh.ac.uk", - "middle-way.net", - "middlesbro.ac.uk", - "middlesex.ac.uk", - "midentsolutions.com", - "midfife.ac.uk", - "midhurst.ac.uk", - "midkent.ac.uk", - "midlands3cities.ac.uk", - "midlands4cities.ac.uk", - "midlandsenergyconsortium.ac.uk", - "midlandsphysicsalliance.ac.uk", - "midoushe.com", - "midplus.ac.uk", - "midrib.ac.uk", - "miexnoviadesnuda.com", - "mihe.ac.uk", - "mihk.hk", - "mihomeone.info", - "mihr.com", - "mihua.org", - "miitomo.com", - "miiverse.com", - "mikanani.me", - "mikesoltys.com", - "mikocon.com", - "mikrotik.com", - "miktex.org", - "mikuexpo.com", - "milehighmedia.com", - "milfav.icu", - "milfbundle.com", - "milfed.com", - "milffox.com", - "milfhunter.com", - "milflove.live", - "milfmaturesex.net", - "milfmovs.com", - "milfnut.com", - "milfporn.pro", - "milfpornonly.com", - "milfpornpics.xxx", - "milfprime.com", - "milfs-gone-wild.com", - "milfs-now.com", - "milfsexstart.nl", - "milfslesbian.com", - "milfsover30.com", - "milfthreesomes.com", - "milftube.pro", - "milftugs.com", - "milfvr.com", - "milfzr.com", - "miliav.com", - "milkmanbook.com", - "millionplus.ac.uk", - "millymarks.com", - "milofetch.com", - "milph.net", - "milsurps.com", - "mimas.ac.uk", - "mimei.store", - "mimi-zhibo.com", - "mimi2022.link", - "mimi22.top", - "mimi222.top", - "mimiai.net", - "mimistudio.com", - "mimistyler.com", - "mimivip.com", - "mimivv.com", - "mimizy-go.buzz", - "minbrowser.org", - "mindgeek.com", - "mindmeld.com", - "mindrolling.org", - "minecraft.net", - "minecraft.wiki", - "minecraftservices.com", - "minecraftshop.com", - "mineofinfo.ac.uk", - "minerva.ac.uk", - "mingdemedia.org", - "minghui-a.org", - "minghui-b.org", - "minghui-school.org", - "minghui.or.kr", - "minghui.org", - "mingjinglishi.com", - "mingjingnews.com", - "mingjingtimes.com", - "mingky.org", - "mingkyaa.com", - "mingpao.com", - "mingpaocanada.com", - "mingpaomonthly.com", - "mingpaonews.com", - "mingpaony.com", - "mingpaosf.com", - "mingpaotor.com", - "mingpaovan.com", - "mings-fashion.com", - "mings.hk", - "mingshengbao.com", - "mingw.org", - "mingwatch.com", - "minhajcollege.ac.uk", - "minhhue.net", - "mini-abudhabi.com", - "mini-antilles.fr", - "mini-bahrain.com", - "mini-bosnia.com", - "mini-clubs-international.com", - "mini-connected.at", - "mini-connected.be", - "mini-connected.ch", - "mini-connected.co.uk", - "mini-connected.com", - "mini-connected.cz", - "mini-connected.de", - "mini-connected.dk", - "mini-connected.ee", - "mini-connected.es", - "mini-connected.fi", - "mini-connected.fr", - "mini-connected.ie", - "mini-connected.it", - "mini-connected.lt", - "mini-connected.lu", - "mini-connected.lv", - "mini-connected.nl", - "mini-connected.no", - "mini-connected.pl", - "mini-connected.pt", - "mini-connected.se", - "mini-corporate-sales.com", - "mini-coupe.ca", - "mini-dubai.com", - "mini-e.com", - "mini-egypt.com", - "mini-georgia.com", - "mini-grouparchiv.de", - "mini-grouparchive.com", - "mini-jordan.com", - "mini-ksa.com", - "mini-kuwait.com", - "mini-lebanon.com", - "mini-me.com", - "mini-oman.com", - "mini-qatar.com", - "mini-srilanka.com", - "mini-stjohns.ca", - "mini-stjohns.com", - "mini-tahiti.com", - "mini-vietnam.com", - "mini-windsor.ca", - "mini-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.ca", - "miniargentina.com", - "minibrossard.ca", - "minibrossard.com", - "minicanada.ca", - "minicaribbean.com", - "miniccrc.ca", - "minicooper.ca", - "minid.no", - "minidealer.com", - "minidealernet.com", - "minidowntown.ca", - "minidowntown.com", - "minidrivingexperienceusa.com", - "minidurham.ca", - "minidurham.com", - "minie.com", - "miniforum.org", - "minifs.com", - "minigeorgian.ca", - "minigrandriver.com", - "minihalifax.ca", - "minihalifax.com", - "minihk.com", - "miniinvasion.ca", - "miniitalianjob.com", - "minikelowna.ca", - "minikelowna.com", - "minilangley.ca", - "minilangley.com", - "minilat.com", - "minilaval.ca", - "minilaval.com", - "minilondon.ca", - "minilondon.co", - "minim.ac.uk", - "minimarkham.ca", - "minimarkham.com", - "minimoncton.ca", - "minimoncton.com", - "minimontrealcentre.ca", - "minimontroyal.ca", - "minimontroyal.com", - "minimotoringrewards.com", - "minimotoringschool.com", - "minimotorsport.com", - "mininanaimo.ca", - "mininanaimo.com", - "minioakville.com", - "miniofmonrovia.com", - "minipetfriendly.com", - "minirichmond.ca", - "minirichmond.com", - "minisaskatoon.ca", - "minisaskatoon.com", - "minisexdoll.com", - "minishop.ca", - "miniso-au.com", - "miniso-bh.com", - "miniso-np.com", - "miniso-nz.com", - "miniso.by", - "miniso.ca", - "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", - "minisoindia.com", - "minisojordan.com", - "minisokorea.com", - "minisolife.co.za", - "minisothailand.com", - "minisovietam.vn", - "minispace.com", - "minispecialoffers.ca", - "minispygear.com", - "ministcatharines.ca", - "ministeagathe.com", - "ministjohns.ca", - "ministrybooks.org", - "minitakesthestates.com", - "minitoronto.ca", - "minitroisrivieres.ca", - "miniusa.com", - "miniusaservice.com", - "miniusatires.com", - "minivalueservice.com", - "minivancouver.ca", - "minivaughanwest.ca", - "minivaughanwest.com", - "minivictoria.ca", - "minivictoria.com", - "minivilledequebec.ca", - "minivilledequebec.com", - "miniwholesaleconnect.com", - "miniwidget.ca", - "miniwindsor.com", - "miniworkshop.com", - "miniyaletown.ca", - "minnano-av.com", - "minneapolisbmw.com", - "minneapolisbmw.net", - "minstercentre.ac.uk", - "minuporno.com", - "minzhuhua.net", - "minzhuzhanxian.com", - "minzhuzhongguo.org", - "miohentai.com", - "miraheze.org", - "mirailab.tech", - "mirandanet.ac.uk", - "miroguide.com", - "mirror.ac.uk", - "mirror.xyz", - "mirrorbooks.com", - "mirrormedia.com.tw", - "mirrormedia.mg", - "mirrorsedge.com", - "mirrorsedge.jp", - "mirrorsedge.net", - "mirrorsedge2.com", - "mirrorsedge2d.com", - "misoc.ac.uk", - "missav.com", - "missav.uno", - "missendenabbey.ac.uk", - "misshotgirls.com", - "misskey-square.net", - "misskey.art", - "misskey.cloud", - "misskey.design", - "misskey.flowers", - "misskey.gg", - "misskey.io", - "misskey.stream", - "misskeyusercontent.jp", - "mist.ac.uk", - "mist.vip", - "mistresskym.com", - "mit.edu", - "mit.net", - "mitao.bar", - "mitao.com.tw", - "mitbbs.com", - "mitbbsau.com", - "mitnaka.com", - "mitpressjournals.org", - "mixasiansex.com", - "mixero.com", - "mixi.jp", - "mixmaturesex.com", - "mixpod.com", - "mixvintagesex.com", - "mixx.com", - "mizzmona.com", - "mjib.gov.tw", - "mjv-art.org", - "mk5000.com", - "mkcollege.ac.uk", - "mkncc.ac.uk", - "mksa.top", - "mkt.com", - "mktdns.com", - "mkto-c0100.com", - "mktorest.com", - "mktroute.com", - "mlab.ac.uk", - "mlcool.com", - "mluri.ac.uk", - "mlzs.work", - "mm-cg.com", - "mm9841.cc", - "mmaaxx.com", - "mmbbank.com.mm", - "mmdnn.com", - "mmf.ac.uk", - "mmftb.gov.mm", - "mmgy.cc", - "mminsurance.gov.mm", - "mmmanual.com", - "mmmca.com", - "mmmhub.ac.uk", - "mmonsterheadphones.net", - "mmscdh.one", - "mmtongdao.xyz", - "mmtourismbank.com", - "mmtv.life", - "mmu.ac.uk", - "mmubs.ac.uk", - "mmwxl27.top", - "mnc.ac.uk", - "mndregister.ac.uk", - "mnewstv.com", - "mobatek.net", - "mobile.de", - "mobile01.com", - "mobilecumbria.ac.uk", - "mobilefacebook.com", - "mobileinternational.com", - "mobilemarketo.com", - "mobileme.dk", - "mobileporngames.com", - "mobilepornmovies.com", - "mobileview.page", - "mobilevrxxx.com", - "mobileways.de", - "mobilitymoodplace.ac.uk", - "mobmyanmar.com", - "moby.to", - "mobypicture.com", - "mochajs.org", - "mocloudplus.com", - "mod.io", - "modelmediaus.com", - "modeloswebcambogota.com", - "modelsfreecams.com", - "modelsofauthority.ac.uk", - "modeltv.com", - "modernchinastudies.org", - "modip.ac.uk", - "modmedmicro.ac.uk", - "modoo.at", - "modperl.pl", - "modrinth.com", - "modular.im", - "moeaic.gov.tw", - "moeero-library.com", - "moeerolibrary.com", - "moefuns.co", - "moegirl.org", - "moeimg.net", - "moez-m.com", - "mofa.gov.tw", - "mofaxiehui.com", - "mofos.com", - "mofosex.com", - "mofosnetwork.com", - "mog.com", - "mohu.club", - "mohu.ml", - "mohu.rocks", - "moidigital.ac.uk", - "mojang.com", - "mojim.com", - "mol.ac.uk", - "mol.gov.tw", - "mol.im", - "moldflow.com", - "moldflowexpress.com", - "mole.ac.uk", - "moleculardesigntoolkit.com", - "molecularsimulationtools.com", - "molecularviewer.com", - "molesports.com", - "molihua.org", - "mollnet.ac.uk", - "molviewer.com", - "mom-gfs.com", - "mom-sex-videos.com", - "mom50.com", - "momentumms.com", - "momesear-chs.buzz", - "momfucktube.com", - "momhomeporn.com", - "mommystoytime.com", - "momo.dm", - "momo5188.com", - "momomall.com.tw", - "momon-ga.com", - "momoniji.com", - "momoshop.com.tw", - "momotk.com", - "moms-sex-videos.com", - "momsbangteens.com", - "momsboysmovies.net", - "momsexypics.com", - "momsfuckingboys.net", - "momsgiveass.com", - "momshardcoreporn.com", - "momsneversayno.com", - "momsporn.su", - "momspornvideos.com", - "momsteachsex.com", - "momsteachsex.info", - "momsyoungboys.net", - "momtarts3d.com", - "momtube.club", - "monaitv.me", - "monar.ch", - "monash.ac.uk", - "monbeats2013.com", - "mondex.org", - "money-link.com.tw", - "moneyhome.biz", - "moneywithfacebook.com", - "mongodb.com", - "mongodb.org", - "monica.im", - "monitorchina.org", - "monitorware.com", - "monitrix.net", - "monkwear.ac.uk", - "monlamit.org", - "mono-project.com", - "monocloud.me", - "monogram.ac.uk", - "monotype.com", - "monotypeimaging.com", - "monster-beats-by-dr-dre.com", - "monster-beats-headphones.com", - "monster.com", - "monsterbeats-cheap.com", - "monsterbeats-headphone.com", - "monsterbeats-onsale.com", - "monsterbeats-solo.com", - "monsterbeats-solo.net", - "monsterbeats365buy.com", - "monsterbeats8beatsbydre.com", - "monsterbeatsale.com", - "monsterbeatsalestore.com", - "monsterbeatsau.com", - "monsterbeatsbydrdre-nz.com", - "monsterbeatsbydrdre-usa.com", - "monsterbeatsbydrdrecanada.com", - "monsterbeatsbydrdrestudio.com", - "monsterbeatsbydre-nz.com", - "monsterbeatsbydre-usa.com", - "monsterbeatsbydre2015.com", - "monsterbeatsbydreaustraliacheap.com", - "monsterbeatsbydrebilligde.com", - "monsterbeatsbydrefactory.com", - "monsterbeatsbydrenew.com", - "monsterbeatsbydres.com", - "monsterbeatsbydreshop.com", - "monsterbeatscasques.com", - "monsterbeatscommunity.com", - "monsterbeatsdrdrecheap.com", - "monsterbeatsfactory.net", - "monsterbeatsfinland.com", - "monsterbeatsforsale.com", - "monsterbeatsheadphone.com", - "monsterbeatsheadphones.net", - "monsterbeatshere.com", - "monsterbeatsitaly.com", - "monsterbeatsmall.com", - "monsterbeatsnegozi.net", - "monsterbeatsok.com", - "monsterbeatsonlinestoreuk.com", - "monsterbeatsoutlet.us", - "monsterbeatspascher.net", - "monsterbeatsru.com", - "monsterbeatssales.com", - "monsterbeatssalg.com", - "monsterbeatsshops.net", - "monsterbeatsstore.com", - "monsterbeatssydneyaustralia.com", - "monsterbeatstang.com", - "monsterbeatstienda.com", - "monsterbeatstudio.com", - "monsterbydrebeat.com", - "monstercasquebeatspascher.net", - "monstercheapbeatss.com", - "monstercockland.com", - "monsterdrebeats-canada.net", - "monsterdrebeats-usa.com", - "monsterdrebeats-usa.net", - "monsterheadphone.net", - "monsterproduct.net", - "monstersbeatbydres.com", - "monstersdebea.com", - "monstersexporn.net", - "monstershopcheapbeats.net", - "monthlyav.com", - "moodleshare-hw.ac.uk", - "moodstocks.com", - "moodyz.com", - "moomoo.com", - "moon.fm", - "moonbbs.com", - "moonbbs.info", - "moonbingo.com", - "mooo.com", - "moorlands.ac.uk", - "moov.hk", - "moozporn.com", - "moptt.tw", - "moray.ac.uk", - "morazzia.com", - "morbell.com", - "moredun.ac.uk", - "moreheadphones.com", - "moresci.sale", - "morewithautodesk.com", - "morganclaypool.com", - "morgannwg.ac.uk", - "morisawa.co.jp", - "morley.ac.uk", - "morleycollege.ac.uk", - "morleycollegelondon.ac.uk", - "morningsun.org", - "mornporn.com", - "moroneta.com", - "morphcharts.com", - "mortein.co.in", - "mortein.co.nz", - "mortein.co.za", - "mortein.com", - "mortein.com.au", - "mortein.com.br", - "mortein.com.ng", - "mortein.com.pk", - "morteincam.com", - "mos.ru", - "mostly.jp", - "mostpopularpornsites.com", - "mosucloud.site", - "motherless.com", - "motherwell.ac.uk", - "motiongraphicsandmore.com", - "motionpictureser.com", - "motiyun.com", - "motolia.com", - "motor4ik.ru", - "motorshowblog.com", - "mottainai.info", - "moulton.ac.uk", - "mountcollyer.ac.uk", - "mousebreaker.com", - "move-free.net", - "move.ac.uk", - "move.com", - "moveaws.com", - "movefreeoffers.com", - "movefreerewards.com", - "movefrees.com", - "movements.org", - "movenetworks.com", - "moveonmoveup.ac.uk", - "movetv.com", - "movidius.com", - "movidius.net", - "movie-erog.com", - "movie1000.xyz", - "moviefap.com", - "moviepost.com", - "moviesanywhere.com", - "moviesarena.com", - "moviesfree4u.xyz", - "moviesneek.com", - "movinghistory.ac.uk", - "movingmedicine.ac.uk", - "mox.moe", - "moxing.mobi", - "moxing.news", - "moystoys.com", - "mozgcp.net", - "mozilla.com", - "mozilla.community", - "mozilla.net", - "mozilla.org", - "mozillademos.org", - "mozit.cloud", - "moztw.org", - "mp-pxcdn.com", - "mp3buscador.com", - "mp3ye.eu", - "mpa-mpp.ac.uk", - "mpa-uk.ac.uk", - "mpags.ac.uk", - "mpese.ac.uk", - "mpettis.com", - "mpfinance.com", - "mpinews.com", - "mplstudios.com", - "mpnevolution.com", - "mponline.hk", - "mpsi.ac.uk", - "mpv.io", - "mpw.ac.uk", - "mpweekly.com", - "mql5.com", - "mqxd.org", - "mr-apple.com.tw", - "mr-tireman.jp", - "mray.club", - "mrbasic.com", - "mrbdsm.com", - "mrbonus.com", - "mrc.ac.uk", - "mrchewsasianbeaver.com", - "mrcieu.ac.uk", - "mrcollege.ac.uk", - "mrcong.com", - "mrcp.ac.uk", - "mrdeepfakes.com", - "mrface.com", - "mri.ac.uk", - "mrlivecam.com", - "mrloli.com", - "mrpinks.com", - "mrporngeek.com", - "mrpornlive.com", - "mrskin.com", - "mrslove.com", - "mrssiren.com", - "mrtweet.com", - "mrvideosdesexo.xxx", - "ms-studiosmedia.com", - "ms365surfaceoffer.com", - "ms4dre.com", - "msa-it.org", - "msa.ac.uk", - "msads.net", - "msauth.net", - "mscassessment.ac.uk", - "mschallenge2018.com", - "mscos.ac.uk", - "msdn.com", - "msec.ac.uk", - "msecnd.net", - "msedge.net", - "msft.info", - "msft.net", - "msftauth.net", - "msfteducation.ca", - "msftnet.org", - "msgamesresearch.com", - "msguancha.com", - "msha.gov", - "msinnovationchallenge.com", - "msn.com", - "msn.com.tw", - "msn.net", - "msnbc.com", - "msnewskids.com", - "msnewskids.net", - "msnewskids.org", - "msnkids.com", - "msocdn.com", - "msocsp.com", - "msoopent.com", - "msp.ac.uk", - "mspairlift.com", - "msportknowledge.ac.uk", - "msropendata.com", - "mssn.ac.uk", - "mstdn.social", - "msturing.org", - "msudalosti.com", - "msunlimitedcloudsummit.com", - "mswe1.org", - "mt.lv", - "mt0011.site", - "mtao.fun", - "mtec.ac.uk", - "mthruf.com", - "mti.ac.uk", - "mtt.org", - "mtvnservices.com", - "mtw.tl", - "mtzfile.pw", - "muarc.ac.uk", - "mubi.com", - "muchohentai.com", - "muchomasporno.com", - "muchosucko.com", - "mucinex.ca", - "mucinex.cn", - "mucinex.co.nz", - "mucinex.com", - "mucinex.com.cn", - "mucinex.net", - "mucinex.tv", - "mucinexprofessional.com", - "mucm.ac.uk", - "mudbox3d.com", - "mudfish.net", - "mudvod.tv", - "muji.com", - "muji.com.hk", - "muji.eu", - "muji.net", - "muji.tw", - "muji.us", - "mujikorea.net", - "mulheresafoder.com", - "mullvad.net", - "mult34.com", - "multicurrencycashpassport.com", - "multiply.com", - "multiplydiversity.com", - "multiproxy.org", - "multiupload.com", - "multporn.net", - "mummysgold.com", - "muncloud.dog", - "mundomais.com.br", - "mundus.ac.uk", - "muramura.tv", - "murg.ac.uk", - "murmur.tw", - "muryouav.net", - "muscdn.com", - "musclegirlflix.com", - "museumofwriting.ac.uk", - "museumwales.ac.uk", - "mushroomtrack.com", - "mushymush.tv", - "music-research.ac.uk", - "musicade.net", - "musical.ly", - "musicandphilosophy.ac.uk", - "musicbay.net", - "musiche.ac.uk", - "musickit.net", - "musiconline.ac.uk", - "musixmatch.com", - "muslimcollege.ac.uk", - "muslimvideo.com", - "mut.ch", - "muthead.com", - "muther.ac.uk", - "muycerdas.xxx", - "muyzorras.com", - "muzi.com", - "muzi.net", - "muzu.tv", - "mvdis.gov.tw", - "mvg.jp", - "mvideoporno.xxx", - "mvk.com", - "mwcu00.com", - "mwdbank.com", - "mwell.ac.uk", - "mwhentai.net", - "mwrc.ac.uk", - "mx981.com", - "mxmcdn.net", - "mxshm.site", - "my-enema.com", - "my-formosa.com", - "my-magazine.me", - "my-private-network.co.uk", - "my-proxy.com", - "my03.com", - "my13la.com", - "my1stflame.com", - "my20dc.com", - "my20houston.com", - "my29tv.com", - "my3dhentai.com", - "my45.com", - "my903.com", - "my9nj.com", - "myaccountglobalcash.com", - "myactimes.com", - "myamateurgirls.net", - "myamateurtv.com", - "myanniu.com", - "myappleid.com", - "myatos.net", - "myaudiocast.com", - "myautocad.com", - "myautodeskbenefits.com", - "myav.com.tw", - "myav886.buzz", - "myavfun.com", - "myavok.com", - "myavsuper.com", - "myavxx.xyz", - "mybabehotz.com", - "mybbs.us", - "mybeatsbydrestudio.com", - "mybeatsbydreuk.com", - "mybeatscheapbydre.com", - "mybestbuy.com", - "mybestbuyclaims.com", - "mybet.com", - "mybmw.ca", - "mybmw.com", - "myboylove.com", - "mybridgestoneeducation.com", - "mybukkakeporn.com", - "myca168.com", - "mycalderdale.ac.uk", - "mycams.com", - "mycanadanow.com", - "mycandi.ac.uk", - "mycardbenefits.com", - "mycartoonsexgames.com", - "mycdn.me", - "mychat.to", - "mychinamyhome.com", - "mychinanet.com", - "mychinanews.com", - "mychinese.news", - "mycib.ac.uk", - "myciscobenefits.com", - "myclitgames.com", - "myclyde.ac.uk", - "mycnnews.com", - "mycomicsxxx.com", - "myconstructionworld.net", - "mycould.com", - "mydad.info", - "mydati.com", - "myddns.com", - "mydirectgroove.com", - "mydirectvchannels.com", - "mydirtyhobby.com", - "myeasytv.com", - "myebay.com", - "myeclipseide.com", - "myeplg.ac.uk", - "myerscough.ac.uk", - "myfappening.org", - "myfavoritearcade.com", - "myfbfans.com", - "myferrariheadphones.com", - "myfirstflame.com", - "myfistingporn.com", - "myfonts.com", - "myfonts.net", - "myforum.com.hk", - "myfoxatlanta.com", - "myfoxaustin.com", - "myfoxboston.com", - "myfoxcharlotte.com", - "myfoxchicago.com", - "myfoxdc.com", - "myfoxdetroit.com", - "myfoxdfw.com", - "myfoxhouston.com", - "myfoxhurricane.com", - "myfoxla.com", - "myfoxlosangeles.com", - "myfoxlubbock.com", - "myfoxmaine.com", - "myfoxny.com", - "myfoxorlando.com", - "myfoxphilly.com", - "myfoxphoenix.com", - "myfoxsanfran.com", - "myfoxtampa.com", - "myfoxtampabay.com", - "myfoxtwincities.com", - "myfoxzone.com", - "myfreeblack.com", - "myfreecams.com", - "myfreepaysite.com", - "myfreeporngames.com", - "myfreshnet.com", - "myftp.info", - "myftp.name", - "myfun.com", - "mygaysites.com", - "myguide.hk", - "myhelpinglab.com", - "myhentaicomics.com", - "myhentaigallery.com", - "myhomemadesex.com", - "myhpsupport.com", - "myhulu.com", - "myicloud.net", - "myip.com", - "myiphide.com", - "myiphider.com", - "myipod.net", - "myjkwd.com", - "mykomica.org", - "mylabnotebook.ac.uk", - "mylcb.ac.uk", - "mylcloud.net", - "mylf.com", - "mylftv.com", - "mylittlenieces.com", - "mylogiclab.com", - "mylust.com", - "mymaji.com", - "mymapportal.com", - "mymasturbators.com", - "mymediarom.com", - "mymicrosoft.com", - "myminisexdoll.com", - "myminiso.com", - "mymmode.com", - "mymoe.moe", - "mymom.info", - "mymusclevideo.com", - "mymusic.net.tw", - "mynescol.ac.uk", - "mynetav.net", - "mynetav.org", - "mynetname.net", - "mynike.com", - "mynumber.org", - "myoctocat.com", - "myparagliding.com", - "mypearson.com", - "mypearsonenglish.ch", - "mypearsonshop.com.mx", - "mypearsonshop.mx", - "mypicasa.com", - "mypicture.info", - "mypikpak.com", - "mypikpak.net", - "myplace.ac.uk", - "mypop3.net", - "mypop3.org", - "mypopescu.com", - "mypornads.com", - "mypornadviser.com", - "mypornbookmarks.com", - "mypornfox.com", - "myporngay.com", - "mypornhere.com", - "myporno.cz", - "myporno.photos", - "mypornolab.click", - "mypornstarbook.net", - "mypornvid.fun", - "mypornwap.fun", - "myport.ac.uk", - "myq2.com", - "myqnapcloud.com", - "myradio.com.hk", - "myradio.hk", - "myreadingmanga.info", - "myrewardzone.com", - "myrimmingporn.com", - "myrz.com", - "myscience.ac.uk", - "mysdn.com", - "mysdn.info", - "mysdn.net", - "mysecondarydns.com", - "mysexgames.com", - "mysexygfs.com", - "myshopify.com", - "mysims.com", - "mysimsracing.com", - "mysinablog.com", - "mysinchew.com", - "mysocialworklab.com", - "myspace.com", - "myspacecdn.com", - "mysql.com", - "mystrikingly.com", - "mytalkbox.com", - "myteenwebcam.com", - "mythicentertainment.com", - "mythicentertainment.net", - "mythicgames.com", - "mytimesplus.co.uk", - "mytizi.com", - "mytokenapi.com", - "mytrannycams.com", - "mytvsuper.com", - "myvisaluxuryhotels.com", - "myvodafone.com.au", - "myvodafone.com.ws", - "mywaytopay.info", - "mywaytopay.net", - "mywife.cc", - "mywifecuckold.com", - "mywnsc.ac.uk", - "mywww.biz", - "myxvids.com", - "myxxgirl.com", - "myyoungmomisnude.com", - "myyoungwifeisnude.com", - "myz.info", - "mzed.com", - "mzstatic.com", - "n0vadesktop.com", - "n3ro.lol", - "n3ro.net", - "n3ro.wtf", - "n8agrifood.ac.uk", - "na-att-idns.net", - "na-me.ac.uk", - "naacoalition.org", - "naaktevrouwenporno.com", - "nab.com.au", - "nabble.com", - "nabtravellercard.com.au", - "nacro.ac.uk", - "nacstock.ac.uk", - "nactem.ac.uk", - "nado.ac.uk", - "naea.ac.uk", - "nafc.ac.uk", - "nagty.ac.uk", - "nahste.ac.uk", - "naiadsystems.com", - "naihenda.shop", - "naihendauou.lol", - "naijauncut.com", - "nailedhard.com", - "naitik.net", - "naizitv.top", - "nakadashi.to", - "naked-asian-porn.com", - "naked-girls.me", - "naked.com", - "nakedamateurmilf.com", - "nakedasiansex.com", - "nakedgirlpic.com", - "nakedgirls.biz", - "nakedmodelsxxx.com", - "nakednews.com", - "nakido.com", - "nakn.jp", - "nakuz.com", - "nalandabodhi.org", - "nalandawest.org", - "naln.ac.uk", - "nam.ac.uk", - "namemybeats.com", - "namethatporn.com", - "namethatpornad.com", - "namgyal.org", - "namgyalmonastery.org", - "namsisi.com", - "namss.ac.uk", - "nan-net.com", - "nanhuyt.com", - "nanocmos.ac.uk", - "nanyang.com", - "nanyangpost.com", - "nanzao.com", - "nao.ac.jp", - "naoconto.com", - "naol.ca", - "naol.cc", - "napier-cloud.ac.uk", - "napier.ac.uk", - "napiszex.com", - "narf.ac.uk", - "narod.ru", - "narti.ac.uk", - "nasa.gov", - "nash.ac.uk", - "nastranincad.com", - "nastrannx.com", - "nastrantraining.com", - "nastranworldwide.com", - "nasty.singles", - "nastyvids.com", - "nat.gov.tw", - "nat.moe", - "nat.ms", - "natado.com", - "nataliefiore.com", - "natcen.ac.uk", - "natcor.ac.uk", - "natdisteam.ac.uk", - "natgeokidsbooks.co.uk", - "natgeomaps.com", - "national-army-museum.ac.uk", - "national-confidential-inquiry.ac.uk", - "national-learning-network.ac.uk", - "national-lottery.co.uk", - "nationalacademiclibraries.ac.uk", - "nationalandacademiclibraries.ac.uk", - "nationalawakening.org", - "nationalcollegeforadvancedtransportinfrastructure.ac.uk", - "nationalcollegeforhighspeedrail.ac.uk", - "nationalcollegefornuclear.ac.uk", - "nationalgeographic.com", - "nationalgeographicpartners.com", - "nationalinterest.org", - "nationalnetworkforinterpreting.ac.uk", - "nationalnetworkfortranslation.ac.uk", - "nationalreview.com", - "nationalskillsacademy.ac.uk", - "nationaltechnicianscentre.ac.uk", - "nationsonline.org", - "nationwide.com", - "nativeincolour.com.au", - "natmatsci.ac.uk", - "natsal.ac.uk", - "natstar.ac.uk", - "naturalhistorymuseum.ac.uk", - "naturalvoices.com", - "nature.ac.uk", - "nature.com", - "naturemag.org", - "naughty.com", - "naughtyamerica.com", - "naughtyblog.org", - "naughtyfootjobs.com", - "naughtygamesource.com", - "naughtyhentai.biz", - "naughtymachinima.com", - "naughtymag.com", - "naughtysophie.com", - "naughtytugs.com", - "naughtywomenpics.com", - "naver.com", - "naver.jp", - "naver.me", - "naver.net", - "naverads.com", - "navercloudcorp.com", - "navercorp.com", - "naverfincorp.com", - "naverlabs.com", - "naverncp.com", - "navisworks.com", - "navisworks.net", - "navy.mil", - "naweeklytimes.com", - "nazarene.ac.uk", - "nbabot.net", - "nbc.co", - "nbc.com", - "nbcnews.com", - "nbcol.ac.uk", - "nbcolympics.com", - "nbcsports.com", - "nbcudigitaladops.com", - "nbcuni.com", - "nbcuniversal.com", - "nbdh15.buzz", - "nbe.ac.uk", - "nbi.ac.uk", - "nbolton-sfc.ac.uk", - "nbpa.ac.uk", - "nbria.ac.uk", - "nbs.ac.uk", - "nbtvpn.com", - "nbu.ac.uk", - "nbys.tv", - "nbys1.tv", - "nbyy.tv", - "nc3rs.ac.uk", - "nc4m.ac.uk", - "nca.ac.uk", - "ncas.ac.uk", - "ncati.ac.uk", - "ncaveo.ac.uk", - "ncb.ac.uk", - "ncbradford.ac.uk", - "ncc.ac.uk", - "nccadultlearning.ac.uk", - "nccc.ac.uk", - "ncccs.ac.uk", - "ncclondon.ac.uk", - "nccwatch.org.tw", - "ncdoncaster.ac.uk", - "nceo.ac.uk", - "ncess.ac.uk", - "ncfn.ac.uk", - "ncg.ac.uk", - "ncgc.ac.uk", - "ncgrp.ac.uk", - "nch.com.tw", - "nchlondon.ac.uk", - "nchp.ac.uk", - "nchrd.org", - "nchsr.ac.uk", - "nciul.ac.uk", - "ncl-coll.ac.uk", - "ncl-lyme.ac.uk", - "ncl-u-lyme.ac.uk", - "ncl.ac.uk", - "ncl.edu.tw", - "nclan.ac.uk", - "nclanarkshire.ac.uk", - "ncloud.com", - "ncls.ac.uk", - "nclt.ac.uk", - "ncn.ac.uk", - "ncn.org", - "ncol.com", - "ncpontefract.ac.uk", - "ncrcl.ac.uk", - "ncrm.ac.uk", - "ncs.ac.uk", - "ncse.ac.uk", - "nct.ac.uk", - "ncti.ac.uk", - "ncuk.ac.uk", - "nda.ac.uk", - "ndai.ac.uk", - "nde.de", - "ndff.ac.uk", - "ndi.org", - "ndonline.ac.uk", - "ndr.de", - "ndtc.ac.uk", - "ndtv.com", - "ne-worcs.ac.uk", - "ne-worcscol.ac.uk", - "neab.ac.uk", - "neaco.ac.uk", - "near.by", - "neath.ac.uk", - "nebay.net", - "neborder.com", - "nebula-emby.com", - "nec-arundel.ac.uk", - "nec.ac.uk", - "necah.ac.uk", - "nectar.ac.uk", - "ned.org", - "nedial.ac.uk", - "nedtc.ac.uk", - "nee4you.com", - "needforspeed.com", - "needforspeedboost.com", - "needforspeeddriftkings.com", - "needforspeedeliminator.com", - "needforspeedlightning.com", - "needforspeedoverdrive.com", - "needforspeedproven.com", - "needforspeedredline.com", - "needforspeedshowdown.com", - "needforspeedstreetkings.com", - "needforspeedtakedown.com", - "needforspeedtherun.com", - "needforspeedtimeattack.com", - "needforspeedundergroundeast.com", - "needgayporn.com", - "nefficient.co.kr", - "negozimonsterbeats.com", - "negoziomonsterbeats.com", - "nei.ac.uk", - "neicad.com", - "neiexplicit.com", - "neifea.com", - "neimotion.com", - "neinastranincad.com", - "neipdg.ac.uk", - "neisoftware.com", - "neisolutions.com", - "neiworks.com", - "nejm.org", - "nek.ac.uk", - "nekoslovakia.net", - "nekoxxx.com", - "nelcls.ac.uk", - "nelson.ac.uk", - "nelsoncollege.ac.uk", - "nelsongroup.ac.uk", - "nemcon.ac.uk", - "nemode.ac.uk", - "nenastran.com", - "nene.ac.uk", - "nengcard.com", - "nenitas.club", - "nentindo.net", - "neo-miracle.com", - "neodaas.ac.uk", - "neonatalsociety.ac.uk", - "neow.in", - "neowin.net", - "nepusoku.com", - "nerap.ac.uk", - "nerc-arsf.ac.uk", - "nerc-bangor.ac.uk", - "nerc-bas.ac.uk", - "nerc-belfast.ac.uk", - "nerc-bush.ac.uk", - "nerc-cardiff.ac.uk", - "nerc-cdt-oil-and-gas.ac.uk", - "nerc-dorset.ac.uk", - "nerc-east-kilbride.ac.uk", - "nerc-eskdalemuir.ac.uk", - "nerc-essc.ac.uk", - "nerc-gilmerton.ac.uk", - "nerc-hartland.ac.uk", - "nerc-keyworth.ac.uk", - "nerc-lancaster.ac.uk", - "nerc-lerwick.ac.uk", - "nerc-liv.ac.uk", - "nerc-loanhead.ac.uk", - "nerc-mst-radar.ac.uk", - "nerc-murchison.ac.uk", - "nerc-oban.ac.uk", - "nerc-oxford.ac.uk", - "nerc-pml.ac.uk", - "nerc-smru.ac.uk", - "nerc-solardome.ac.uk", - "nerc-southampton.ac.uk", - "nerc-swindon.ac.uk", - "nerc-wallingford.ac.uk", - "nerc-wytham.ac.uk", - "nerc.ac.uk", - "nercgw4plus.ac.uk", - "nerdnudes.com", - "neresc.ac.uk", - "nervanasys.com", - "nesaporn.com", - "nesaporn.mobi", - "nesc.ac.uk", - "nesci.ac.uk", - "nescol.ac.uk", - "nescot.ac.uk", - "nesi.ac.uk", - "nesli.ac.uk", - "nesli2.ac.uk", - "nesnode.com", - "nest.ac.uk", - "nest.com", - "net-fits.pro", - "netacad.com", - "netacad.net", - "netalert.me", - "netarabic.com", - "netbig.com", - "netbirds.com", - "netcolony.com", - "netcup-news.de", - "netcup-sonderangebote.de", - "netcup.com", - "netcup.de", - "netcup.eu", - "netcup.net", - "netfapx.com", - "netfirms.com", - "netflav.com", - "netflav1.com", - "netflav5.com", - "netflix.ca", - "netflix.com", - "netflix.net", - "netflixdnstest0.com", - "netflixdnstest1.com", - "netflixdnstest10.com", - "netflixdnstest2.com", - "netflixdnstest3.com", - "netflixdnstest4.com", - "netflixdnstest5.com", - "netflixdnstest6.com", - "netflixdnstest7.com", - "netflixdnstest8.com", - "netflixdnstest9.com", - "netflixinvestor.com", - "netflixtechblog.com", - "netlab.ac.uk", - "netlify.app", - "netlify.com", - "netlifystatus.com", - "netlock.hu", - "netme.cc", - "netname.com.br", - "netpornsex.com", - "netpornsex.net", - "netsarang.com", - "netscc.ac.uk", - "netskills.ac.uk", - "netsneak.com", - "netsolssl.com", - "netsurf-browser.org", - "nettyinternet.com", - "netvideogirls.com", - "netvigator.com", - "netwise.ac.uk", - "network54.com", - "networkedblogs.com", - "networktunnel.net", - "netzerobuildings.com", - "netzerobuildingstudio.com", - "netzwerkdeutsch.ac.uk", - "neuerporno.com", - "neupc.ac.uk", - "neuralink.com", - "neurogrid.ac.uk", - "neurohub.ac.uk", - "neurology.org", - "neverforget8964.org", - "nevex.com", - "new-3lunch.net", - "new-akiba.com", - "new-campus-basildon.ac.uk", - "new-coll-cf.ac.uk", - "new-jero.net", - "new-redtube.com", - "new.day", - "new2fea.com", - "new3dcomics.com", - "new96.ca", - "newark.ac.uk", - "newbasildon.ac.uk", - "newbattleabbeycollege.ac.uk", - "newbeatsblackfriday.com", - "newbemany.com", - "newbienudes.com", - "newbold.ac.uk", - "newbrazz.com", - "newbury-college.ac.uk", - "newcampusbasildon.ac.uk", - "newcampusglasgow.ac.uk", - "newcastle-college.ac.uk", - "newcastle.ac.uk", - "newcastlecitylearning.ac.uk", - "newcastlecollege.ac.uk", - "newcastlenewslocal.com.au", - "newcastlesfc.ac.uk", - "newcastlesixthformcollege.ac.uk", - "newcenturymc.com", - "newcenturynews.com", - "newceys.ac.uk", - "newchen.com", - "newcollege.ac.uk", - "newcollegedurham.ac.uk", - "newcollegeglasgow.ac.uk", - "newcollegetelford.ac.uk", - "newcollpont.ac.uk", - "newdirectionsreading.ac.uk", - "newdrediscount.com", - "newdur.ac.uk", - "neweconomyforum.com", - "newenergyfinance.com", - "newestbeatsbydre.com", - "newgrounds.com", - "newham-vic.ac.uk", - "newham.ac.uk", - "newhamcfe.ac.uk", - "newhampshirebmw.com", - "newhentai.org", - "newhighlandvision.com", - "newi.ac.uk", - "newipnow.com", - "newisiknowledge.com", - "newlandmagazine.com.au", - "newlineporn.com", - "newlysprung.net", - "newman.ac.uk", - "newmitbbs.com", - "newmonst1erbeatsto1re.com", - "newmonsterbeatsheadphones.com", - "newnews.ca", - "newphd.ac.uk", - "newport.ac.uk", - "newpppp.com", - "newroutephd.ac.uk", - "news.co.uk", - "news.com.au", - "news.net.au", - "news100.com.tw", - "news18.com", - "newsadds.com.au", - "newsamerica.com", - "newsancai.com", - "newsapi.com.au", - "newscareers.co.uk", - "newscdn.com.au", - "newschinacomment.org", - "newschristmasshopping.com", - "newscn.org", - "newscommercial.co.uk", - "newsconcierge.com.au", - "newscorp.com", - "newscorpaustralia.com", - "newsdetox.ca", - "newsdh.com", - "newsensations.com", - "newsextv.com", - "newsexwap.com", - "newsexxxx.com", - "newsfeed.com", - "newsfilm.ac.uk", - "newsgawakaru.com", - "newslicensing.co.uk", - "newsmagazine.asia", - "newsmart.jp", - "newsmax.com", - "newsmax.in", - "newsmaxtv.com", - "newsnowfox.com", - "newspeak.cc", - "newsprestigenetwork.com.au", - "newsprinters.co.uk", - "newssyndication.com", - "newstamago.com", - "newstapa.org", - "newstarnet.com", - "newstatesman.com", - "newsukadops.com", - "newsupermariobrosu.com", - "newsweek.com", - "newsxtend.com.au", - "newtaiwan.com.tw", - "newtalk.tw", - "newtec.ac.uk", - "newtofea.com", - "newton.ac.uk", - "newton.com", - "newtonfund.ac.uk", - "newtonrigg.ac.uk", - "newvic.ac.uk", - "newxxx24.cc", - "newyorker.com", - "newyorktimes.com", - "nexcat.com", - "nexitally.com", - "nexitallysafe.com", - "nexitcore.com", - "nexon.co.jp", - "nexon.com", - "nexon.io", - "nexoncdn.co.kr", - "nexpart.com", - "nexpart.tv", - "next-institute.ac.uk", - "next.com", - "next.hk", - "next11.co.jp", - "nextapple.com", - "nextapple.tw", - "nextdigital.com.hk", - "nextdigital.com.tw", - "nextechafrica.net", - "nextfilm.com.hk", - "nextgenerationcam.com", - "nextgenerationcenter.com", - "nextjs.org", - "nextmag.com.tw", - "nextmedia.com", - "nextmedia.com.tw", - "nextmgz.com", - "nexton-net.jp", - "nextplus.com.hk", - "nextstepssw.ac.uk", - "nextstop.com", - "nexttv.com.tw", - "nextwork.com.hk", - "nextwork.com.tw", - "nextwork.hk", - "nextwork.tw", - "nexusmods.com", - "nf.id.au", - "nfacstem.ac.uk", - "nfer.ac.uk", - "nfjtyd.com", - "nflhotsalejerseys.com", - "nflxext.com", - "nflximg.com", - "nflximg.net", - "nflxsearch.net", - "nflxso.net", - "nflxvideo.net", - "nfo.ac.uk", - "nfsc.global", - "nfscdict.com", - "nfscofficial.com", - "nfsworld.com", - "nftstorage.link", - "ng.mil", - "nga.mil", - "ngc.ac.uk", - "ngensis.com", - "ngeo.com", - "ngfl.ac.uk", - "ngflscotland.ac.uk", - "nginx.com", - "nginx.org", - "nginxconfig.io", - "ngodupdongchung.com", - "ngs.ac.uk", - "ngwnet.ac.uk", - "nhc.ac.uk", - "nhcscotland.ac.uk", - "nhentai.com", - "nhentai.io", - "nhentai.net", - "nhentai.to", - "nhentai.xxx", - "nhentaihaven.com", - "nhentaihaven.org", - "nheos.com", - "nhi.gov.tw", - "nhk-ondemand.jp", - "nhm.ac.uk", - "nhncorp.jp", - "niab.ac.uk", - "niace.ac.uk", - "nib.ac.uk", - "nibs.ac.uk", - "nibsc.ac.uk", - "nic.cz", - "nic.google", - "nic.gov", - "nicats.ac.uk", - "nicd.ac.uk", - "niceanimegames.com", - "niceporn.tv", - "nicer.ac.uk", - "nicesshop.net", - "nichepornsite.com", - "nichepornsites.com", - "nicis.ac.uk", - "nickscipio.com", - "nicky.xxx", - "nicodic.jp", - "nicolepeters.com", - "nicomanga.jp", - "niconico.com", - "nicoseiga.jp", - "nicovideo.jp", - "nict.jp", - "niees.ac.uk", - "niesr.ac.uk", - "nighost.org", - "nightclub.eu", - "nightlife141.com", - "nightline.ac.uk", - "nights.fun", - "nihcc.ac.uk", - "nihr.ac.uk", - "nii.ac.jp", - "niimle.ac.uk", - "nijiclamp.com", - "nijidoujin.com", - "nijie.info", - "nijifeti.com", - "nijigen-daiaru.com", - "nijimiss.moe", - "nijinchu.com", - "nijioma.blog", - "nijiyome.jp", - "nike-air-max.com", - "nike-dunksb.com", - "nike-fr.com", - "nike-org.com", - "nike-uk.com", - "nike-us.com", - "nike-usa.com", - "nike.ci", - "nike.com", - "nike.com.br", - "nike.com.hk", - "nike.gy", - "nike.hk", - "nike.host", - "nike.shop", - "nike.us", - "nike0594.com", - "nike23.com", - "nikeadidas.com", - "nikeairhuarache.com", - "nikeairmax.com", - "nikeairmaxs.com", - "nikeairmaxshoes.com", - "nikeairrift.com", - "nikeasia.com", - "nikeaustralia.com", - "nikeaw77.com", - "nikeb.com", - "nikebbn.com", - "nikebetrue.com", - "nikebetterworld.com", - "nikebetterworld.info", - "nikebetterworld.net", - "nikebetterworld.org", - "nikebiz.info", - "nikebuy.com", - "nikeby.com", - "nikecdn.com", - "nikechosen.com", - "nikecloud.com", - "nikeclub.com", - "nikecompany.com", - "nikeconfluence.com", - "nikecraft.com", - "nikedawn.com", - "nikedunks.net", - "nikedunksshoes.com", - "nikeelite.com", - "nikefactorystore.com", - "nikefind.com", - "nikefirm.com", - "nikefoamposites.com", - "nikefoampositeshoes.com", - "nikefootballcleats.com", - "nikefootballgloves.com", - "nikefootballjersey.com", - "nikefoundation.org", - "nikefr.com", - "nikefrance.com", - "nikefree.com", - "nikefreeshoes.com", - "nikefuelband.com", - "nikegadgets.com", - "nikegenealogy.com", - "nikegolf.ca", - "nikegrid.com", - "nikehelp.com", - "nikehightops.com", - "nikehyperdunk.com", - "nikeidshoes.com", - "nikeinc.com", - "nikeincchemistry.com", - "nikeinstock.com", - "nikeit.com", - "nikeitalia.com", - "nikeitaly.com", - "nikekd.com", - "nikekid.com", - "nikelink.com", - "nikeliuxiang.com", - "nikelives.com", - "nikelunarglide.com", - "nikemarketing.com", - "niken7.com", - "nikenews.com", - "nikeonlinestore.com", - "nikeoutletstore.com", - "nikeoutletstores.com", - "nikepioneer.com", - "nikeplus.com", - "nikeplus.org", - "nikepress.com", - "nikeprice.com", - "nikeproduct.com", - "nikepromax.com", - "nikeresponsibility.com", - "nikereuseashoe.com", - "nikerunner.com", - "nikerunningshoes.com", - "nikesb.com", - "nikesbdunks.net", - "nikeseason.com", - "nikeselling.com", - "nikesellorder.com", - "nikeshoemarket.com", - "nikeshoes-store.com", - "nikeshoes21.com", - "nikeshoes4u.com", - "nikeshoescity.com", - "nikeshoesgroup.com", - "nikeshoesinc.com", - "nikeshoesmarket.com", - "nikeshoesretro.com", - "nikeshoeswon.com", - "nikeshoponline.com", - "nikeshoxsale.com", - "nikesku.com", - "nikesnowboarding.com", - "nikesoccercleats.com", - "nikesportswear.com", - "nikestares.com", - "nikestore.com", - "nikestore.com.au", - "nikestyles.com", - "nikeswim.com", - "niketaiwan.net", - "niketracking.com", - "niketradeweb.com", - "niketrainer.com", - "niketrainers.com", - "niketraining.com", - "nikeusa.com", - "nikewear.com", - "nikey.com", - "nikezoom.com", - "nikkan-gendai.com", - "nikkansports.com", - "nikke-de.com", - "nikke-en.com", - "nikke-fr.com", - "nikke-jp.com", - "nikke-kr.com", - "nikke-sea.com", - "nikkei-cnbc.co.jp", - "nikkei.co.jp", - "nikkei.com", - "nikkei.jp", - "nikkei4946.com", - "nikkeibp.co.jp", - "nimg.jp", - "nine.com.au", - "ninecommentaries.com", - "ninedtp.ac.uk", - "nineentertainment.com.au", - "nineentertainmentco.com.au", - "ninemediaroom.com.au", - "ninemsn.com.au", - "nineteentube.com", - "ning.com", - "ninjacloak.com", - "ninjaproxy.ninja", - "ninpu.cyou", - "nintendium.com", - "nintendo-europe-sales.com", - "nintendo-europe.com", - "nintendo.at", - "nintendo.be", - "nintendo.ch", - "nintendo.co.jp", - "nintendo.co.kr", - "nintendo.co.uk", - "nintendo.co.za", - "nintendo.com", - "nintendo.com.hk", - "nintendo.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.tw", - "nintendo3ds.com", - "nintendodsi.com", - "nintendoeurope.com", - "nintendonetwork.net", - "nintendonyc.com", - "nintendostore.com", - "nintendoswitch.com", - "nintendoswitch.net", - "nintendoswitchtogether.com", - "nintendowii.com", - "ninth.biz", - "niosii.com", - "niosii.net", - "niran.ac.uk", - "nismod.ac.uk", - "nist.gov", - "nitter.cc", - "nitter.net", - "niu.moe", - "niuc2.com", - "niusnews.com", - "nivod.tv", - "nivodi.tv", - "nivodz.com", - "nixos.org", - "niziero.info", - "njactb.org", - "njav.tv", - "njncscotlandscolleges.ac.uk", - "njuice.com", - "nkc.ac.uk", - "nke6.com", - "nkw.ac.uk", - "nlc.ac.uk", - "nlfreevpn.com", - "nlgs.ac.uk", - "nlincs-coll.ac.uk", - "nlm.io", - "nln.ac.uk", - "nlow.ac.uk", - "nls.ac.uk", - "nlsexfilmpjes.com", - "nlt-media.com", - "nmahp-ru.ac.uk", - "nmahp.ac.uk", - "nmap.ac.uk", - "nmbmw.com", - "nmgm.ac.uk", - "nmgw.ac.uk", - "nmh.ac.uk", - "nmite.ac.uk", - "nmm.ac.uk", - "nms.ac.uk", - "nmsi.ac.uk", - "nmsl.website", - "nmssc.ac.uk", - "nmwcte.ac.uk", - "nna.jp", - "nnc.ac.uk", - "nnews.eu", - "nnotts-col.ac.uk", - "nnuf.ac.uk", - "no-ip.com", - "no-ip.org", - "noa.ac.uk", - "nobel.se", - "nobelprize.org", - "nobodycanstop.us", - "noc.ac.uk", - "nocn.ac.uk", - "nocookie.net", - "nocs.ac.uk", - "nodejs.org", - "nodes.ac.uk", - "nodesnoop.com", - "nodesource.com", - "noellabo.jp", - "nofile.io", - "noisullifb.com", - "nokiantyres.com", - "nokogiri.org", - "nokola.com", - "nomachine.com", - "nomadlandmovie.ch", - "nomadproject.io", - "nomulus.foo", - "nondh-room.mom", - "nonktube.com", - "nonlinearnastran.com", - "nonstopfap.com", - "noodlemagazine.com", - "noodlevpn.com", - "noonvob.com", - "norbulingka.org", - "nordcdn.com", - "nordstrom.com", - "nordstromimage.com", - "nordstrommedia.com", - "nordstromrack.com", - "nordvpn.com", - "norfolkcove.ac.uk", - "norland.ac.uk", - "normanmanagedservices.ac.uk", - "noroutetohost.net", - "norsk.mobi", - "nortcoll.ac.uk", - "north-gla.ac.uk", - "north-london.ac.uk", - "north-trafford-college.ac.uk", - "northampton.ac.uk", - "northamptonapps.ac.uk", - "northamptoncoll.ac.uk", - "northamptoncollege.ac.uk", - "northbham.ac.uk", - "northbrook-online.ac.uk", - "northbrook.ac.uk", - "northbrookcollege.ac.uk", - "northderbycollege.ac.uk", - "northeast.ac.uk", - "northeastoutreachhub.ac.uk", - "northern-consortium.ac.uk", - "northern.ac.uk", - "northernart.ac.uk", - "northernbridge.ac.uk", - "northernenterpriseschools.ac.uk", - "northerngrid.ac.uk", - "northernlogisticsacademy.ac.uk", - "northglasgowcollege.ac.uk", - "northgrid.ac.uk", - "northhighland.ac.uk", - "northkent.ac.uk", - "northland.ac.uk", - "northlindsey.ac.uk", - "northscotland-research.ac.uk", - "northtrafford.ac.uk", - "northumberland-acl.ac.uk", - "northumberland.ac.uk", - "northumbria.ac.uk", - "norwichresearchpark.ac.uk", - "notebooklm.google", - "notepad-plus-plus.org", - "notion-static.com", - "notion.com", - "notion.new", - "notion.site", - "notion.so", - "notionusercontent.com", - "notredamecoll.ac.uk", - "nott.ac.uk", - "nottingham-trent.ac.uk", - "nottingham.ac.uk", - "nottinghamartsandhumanitiesresearchinstitute.ac.uk", - "nottinghamcollege.ac.uk", - "nottinghamcourses.ac.uk", - "nottinghameuniversity.ac.uk", - "nottinghamgraduateschoolofbusiness.ac.uk", - "nottinghaminnovation.ac.uk", - "nottinghaminternationalbusinessschool.ac.uk", - "nottinghamknowledge.ac.uk", - "nottinghampost.com", - "nottinghamtrentadfs.ac.uk", - "nottm-coll.ac.uk", - "nottsmaternity.ac.uk", - "novelasia.com", - "novella.ac.uk", - "noveltrove.com", - "novids.com", - "novinhabucetuda.com", - "novinhagostosa10.com", - "novinhasdozapzap.com", - "novojoy.com", - "novostrong.com", - "novus.ac.uk", - "novuscambria.ac.uk", - "now-ashare.com", - "now-tv.com", - "now.com", - "now.com.hk", - "now.im", - "now.sh", - "nowal.ac.uk", - "nowe.com", - "nowe.hk", - "nowjav.com", - "nownews.com", - "nowtorrents.com", - "nox.ac.uk", - "noxinfluencer.com", - "noypf.com", - "nozomi.la", - "npa.go.jp", - "npa.gov.tw", - "npcrdc.ac.uk", - "nphcardiac-research.ac.uk", - "npm.ac.uk", - "npm.community", - "npm.edu.tw", - "npm.gov.tw", - "npmjs.com", - "npmjs.org", - "npnt.me", - "npr.org", - "nps.gov", - "npsboost.com", - "npsc.ac.uk", - "nptc.ac.uk", - "nptcgroup.ac.uk", - "nptsibinbank.com", - "nradio.me", - "nrc.ac.uk", - "nrc.ca", - "nrdh99.buzz", - "nrk.no", - "nrn-lcee.ac.uk", - "nrooms-dh.sbs", - "nrp.ac.uk", - "nrs.ac.uk", - "ns.ci", - "ns01.biz", - "ns01.info", - "ns01.us", - "ns02.biz", - "ns02.info", - "ns02.us", - "ns1.name", - "ns2.name", - "ns3.name", - "nsad.ac.uk", - "nsals.ac.uk", - "nsamr.ac.uk", - "nsc.ac.uk", - "nsc.gov.tw", - "nsccs.ac.uk", - "nscd.ac.uk", - "nscg.ac.uk", - "nsea.ac.uk", - "nsf.ac.uk", - "nsfnet-relay.ac.uk", - "nsfw.xxx", - "nsfw247.to", - "nsfwmemes.com", - "nsimg.net", - "nsirc.ac.uk", - "nso.ac.uk", - "nspcr.ac.uk", - "nss.ac.uk", - "nsu.ac.uk", - "nsw.ac.uk", - "ntb.ac.uk", - "ntbk.gov.tw", - "ntbna.gov.tw", - "ntbt.gov.tw", - "ntc.ac.uk", - "ntc.party", - "ntd.com", - "ntd.tv", - "ntdc.ac.uk", - "ntdca.com", - "ntdimg.com", - "ntdsf.tv", - "ntdtv-dc.com", - "ntdtv.ca", - "ntdtv.co.kr", - "ntdtv.com", - "ntdtv.com.tw", - "ntdtv.cz", - "ntdtv.jp", - "ntdtv.kr", - "ntdtv.org", - "ntdtv.ru", - "ntdtvla.com", - "ntdvn.com", - "ntec.ac.uk", - "ntfs.ac.uk", - "ntidagenham.ac.uk", - "ntnews.com.au", - "ntp.org", - "ntp.se", - "ntrfun.com", - "ntsna.gov.tw", - "ntten-mg.buzz", - "ntu.ac.uk", - "ntu.edu.tw", - "ntyneside.ac.uk", - "nu-bay.com", - "nu-sense.ac.uk", - "nu.nl", - "nu36.vip", - "nua.ac.uk", - "nubilefilms.com", - "nubiles-casting.com", - "nubiles-porn.com", - "nubiles.net", - "nubileset.com", - "nubilesunscripted.com", - "nuc.ac.uk", - "nuca.ac.uk", - "nucarts.ac.uk", - "nuccam.ac.uk", - "nuccat.ac.uk", - "nucfs.ac.uk", - "nuclear.ac.uk", - "nuclear2050.ac.uk", - "nuclearcollege.ac.uk", - "nucleartheory.ac.uk", - "nuclearuniversities.ac.uk", - "nuddess.com", - "nude-pics.org", - "nude-share.com", - "nude.hu", - "nudeandhairy.com", - "nudebeachpussy.com", - "nudecams.cam", - "nudecelebforum.com", - "nudedrawer.com", - "nudedxxx.com", - "nudeeroticteens.com", - "nudefiles.net", - "nudegfporn.com", - "nudekenya.com", - "nudelive.com", - "nudematurewomenpics.com", - "nudemilfporn.com", - "nudes7.com", - "nudespree.com", - "nudeteen.org", - "nudeteenboys.net", - "nudeteenladies.com", - "nudevietnam.com", - "nudevista.best", - "nudevista.club", - "nudevista.com", - "nudevista.es", - "nudevista.fun", - "nudevista.link", - "nudevista.net", - "nudevista.vip", - "nudewifeporn.com", - "nudewomenpics.net", - "nudezz.com", - "nudify.online", - "nudistbeachporn.com", - "nudistic.com", - "nudistlog.com", - "nudistsexvideos.com", - "nudistvoyeurbeach.com", - "nudity911.com", - "nudogram.com", - "nudography.com", - "nudostar.tv", - "nuespournous.com", - "nuexpo.com", - "nuget.org", - "nugettest.org", - "nuita.net", - "nukemanga.com", - "nuki-dokoro.com", - "nukistream.com", - "nulc.ac.uk", - "nulcollege.ac.uk", - "nunuyy.cc", - "nupha.ac.uk", - "nuqmu-2kt.ac.uk", - "nurgay.to", - "nurgo-software.com", - "nuro.jp", - "nurofen.at", - "nurofen.bg", - "nurofen.co.il", - "nurofen.co.nz", - "nurofen.co.uk", - "nurofen.co.za", - "nurofen.com", - "nurofen.com.au", - "nurofen.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.ru", - "nurofen.sk", - "nurofengel.com", - "nurofensk-prod-env.eu-west-1.elasticbeanstalk.com", - "nurse.ac.uk", - "nurture.ac.uk", - "nurumassage.net", - "nurxxx.mobi", - "nusatrip.com", - "nushemale.com", - "nutaku.com", - "nutaku.net", - "nutramigen.net", - "nutramigen.pl", - "nutsvpn.work", - "nuuporn.com", - "nuuvem.com", - "nuvid.com", - "nuzcom.com", - "nvdst.com", - "nvidia.asia", - "nvidia.at", - "nvidia.be", - "nvidia.ch", - "nvidia.co.at", - "nvidia.co.in", - "nvidia.co.jp", - "nvidia.co.kr", - "nvidia.co.uk", - "nvidia.com", - "nvidia.com.au", - "nvidia.com.br", - "nvidia.com.mx", - "nvidia.com.pe", - "nvidia.com.pl", - "nvidia.com.tr", - "nvidia.com.tw", - "nvidia.com.ua", - "nvidia.com.ve", - "nvidia.cz", - "nvidia.de", - "nvidia.dk", - "nvidia.es", - "nvidia.eu", - "nvidia.fi", - "nvidia.fr", - "nvidia.in", - "nvidia.it", - "nvidia.jp", - "nvidia.lu", - "nvidia.mx", - "nvidia.nl", - "nvidia.no", - "nvidia.pl", - "nvidia.ro", - "nvidia.ru", - "nvidia.se", - "nvidia.tw", - "nvidiaforhp.com", - "nvidiagrid.net", - "nvquan.org", - "nvtongzhisheng.org", - "nw-grid.ac.uk", - "nwba.ac.uk", - "nwcdtp.ac.uk", - "nwcs.ac.uk", - "nwdtc.ac.uk", - "nwhc.ac.uk", - "nwi.ac.uk", - "nwifhe.ac.uk", - "nwkc.ac.uk", - "nwkcollege.ac.uk", - "nwkent.ac.uk", - "nwl.ac.uk", - "nwlcc.ac.uk", - "nwman.ac.uk", - "nwmentoring.ac.uk", - "nwrc.ac.uk", - "nwsgc.ac.uk", - "nwslc.ac.uk", - "nwspm.ac.uk", - "nwssdtp.ac.uk", - "nwstudentandgraduate.ac.uk", - "nwtca.org", - "nwtf.ac.uk", - "nwua.ac.uk", - "nwueu.ac.uk", - "nwupc.ac.uk", - "nwworkbank.ac.uk", - "nwxs8.com", - "nwy.ac.uk", - "nxta.org", - "nxtdig.com.hk", - "nxtdig.com.tw", - "nyaa.eu", - "nyaa.net", - "nyaa.si", - "nyahentai.re", - "nyansa.com", - "nybooks.com", - "nydailynews.com", - "nydus.ca", - "nylon-angel.com", - "nylonstockingsonline.com", - "nym97.net", - "nypost.com", - "nypost.help", - "nypostreprints.com", - "nyt.com", - "nyt.net", - "nytchina.com", - "nytcn.me", - "nytco.com", - "nyti.ms", - "nytimes.com", - "nytimes.map.fastly.net", - "nytimg.com", - "nytlog.com", - "nytstyle.com", - "nyu.ac.uk", - "nzchinese.com", - "nzchinese.net.nz", - "o2action.co.kr", - "o365weve-dev.com", - "o365weve-ppe.com", - "o365weve.com", - "o3o.ca", - "oaa-anaes.ac.uk", - "oaistatic.com", - "oaiusercontent.com", - "oakhill.ac.uk", - "oaklands.ac.uk", - "oakley.ac.uk", - "oakwoodcourt.ac.uk", - "oanda.com", - "oanencore.com", - "oann.com", - "oas.ac.uk", - "oasis.ac.uk", - "oasiscollege.ac.uk", - "oasp.ac.uk", - "oath.cloud", - "oath.com", - "oatridge.ac.uk", - "oauth.net", - "oauthz.com", - "obc.ac.uk", - "obhe.ac.uk", - "objectarx.com", - "obs.ac.uk", - "observable.net", - "observechina.net", - "obsrvbl.com", - "obutsumania.com", - "obutu.com", - "obyte.org", - "oca.ac.uk", - "ocaspro.com", - "ocbmwdealers.com", - "occ.ac.uk", - "occupytiananmen.com", - "oceanography.ac.uk", - "ocfe.ac.uk", - "ochjs.ac.uk", - "oclc.org", - "oclp.hk", - "ocms.ac.uk", - "ocn.ad.jp", - "ocnkm.ac.uk", - "ocreampies.com", - "ocry.com", - "ocsp-certum.com", - "ocsp-responder.com", - "october-review.org", - "ocul.us", - "oculus-china.com", - "oculus.com", - "oculus2014.com", - "oculus3d.com", - "oculusblog.com", - "oculusbrand.com", - "oculuscasino.net", - "oculuscdn.com", - "oculusconnect.com", - "oculusdiving.com", - "oculusforbusiness.com", - "oculusrift.com", - "oculusvr.com", - "ocvc.ac.uk", - "odysee.com", - "oecd-ilibrary.org", - "oed.com", - "oekakiskey.com", - "oen.tw", - "oeps.ac.uk", - "oercymru.ac.uk", - "oerwales.ac.uk", - "oex.com", - "offbeatchina.com", - "offerairjordanlebron.com", - "office.com", - "office.net", - "office365.com", - "office365love.com", - "office365tw.com", - "officeforstudents.ac.uk", - "officeoftibet.com", - "officialbeatsbydreshop.com", - "officialbeatsbydrestore.com", - "officialblog.jp", - "officialdrdre.com", - "officialheadphone.com", - "offresspecialesbmw.ca", - "offrezdesipods.com", - "offshorerenewables.ac.uk", - "ofile.org", - "ofs.ac.uk", - "ogameblog.com", - "ogaoga.org", - "ogate.org", - "oge.ac.uk", - "ogp.me", - "ogsa-dai.ac.uk", - "ohchr.org", - "ohentai.org", - "ohgratisporrfilm.com", - "ohmyrss.com", - "ohpornocasero.com", - "ohpornovideo.com", - "ohsesso.com", - "ohsexfilm.com", - "ohsexotube.com", - "ohu.ac.uk", - "ohyeah1080.com", - "oibc.ac.uk", - "oikos.com.tw", - "oiktv.com", - "oiobbs.com", - "oizoblog.com", - "ok.ru", - "ok.xxx", - "okaapps.com", - "okayfreedom.com", - "okazudouga.tokyo", - "okcoin.com", - "okex.com", - "okk.tw", - "okkisokuho.com", - "okx-dns.com", - "okx-dns1.com", - "okx-dns2.com", - "okx.com", - "olabloga.pl", - "old-cat.net", - "oldbury.ac.uk", - "older-women-movies.com", - "older-women-porn.com", - "older.tube", - "oldham-sfc.ac.uk", - "oldham.ac.uk", - "oldhornymilfs.com", - "oldje.com", - "oldroyd.ac.uk", - "olds.ac.uk", - "oldvic.ac.uk", - "olehd.com", - "olehdtv.com", - "olelive.com", - "olemovienews.com", - "olevod.com", - "olevod.io", - "olevod.tv", - "olevodtv.com", - "olf.ac.uk", - "oli-school.com", - "oli.ac.uk", - "olumpo.com", - "olympicwatch.org", - "omafotze.com", - "omagh.ac.uk", - "omaghcollege.ac.uk", - "omandrilling.ac.uk", - "omaps.app", - "omcrg.ac.uk", - "omct.org", - "omekinteractive.com", - "omg.adult", - "omg.blog", - "omghk.com", - "omgili.com", - "omgteens.com", - "omii.ac.uk", - "omni.ac.uk", - "omni7.jp", - "omniroot.com", - "omnitalk.com", - "omnitalk.org", - "omnitek.tv", - "omniture.com", - "omny.fm", - "omobi.cc", - "omoplanet.com", - "omorashi.jp", - "omorashi.org", - "omscr.com", - "omsiirc.ac.uk", - "omtrdc.net", - "omy.sg", - "on.cc", - "on.here", - "on.net", - "on2.com", - "onahodouga.com", - "onani-daisuki.com", - "onapp.com", - "onbeatsbydresale.com", - "oncars.in", - "one.one", - "one889.app", - "oneapi.com", - "onedinesfree.com", - "onedrive.co", - "onedrive.co.uk", - "onedrive.com", - "onedrive.eu", - "onedrive.net", - "onedrive.org", - "onedumb.com", - "onefifteen.net", - "onefifteen.org", - "onejapanese.com", - "onejav.com", - "onekey-asset.com", - "onekey.so", - "onekeycn.com", - "onenote.com", - "onenote.net", - "onepornlist.com", - "onesiterip.com", - "onesto.re", - "onestore.co.kr", - "onestore.ms", - "oneteamconference.com", - "onetrust.com", - "oneworldmanystories.com", - "onindiansex.com", - "oninstagram.com", - "onion.city", - "onion.ly", - "onion666.com", - "onionshare.org", - "onkakao.net", - "online-deals.net", - "online-instagram.com", - "onlineapplestore.com", - "onlinecha.com", - "onlinefucktube.com", - "onlinegeeksquad.com", - "onlineinstagram.com", - "onlinemonsterbeatsonsale.com", - "onlineporn-vids.com", - "onlinesurveys.ac.uk", - "onlineteenhub.com", - "onlinexxxgames.com", - "onlineyoutube.com", - "onlinm.ac.uk", - "only-xxx-porn.com", - "only-xxx.com", - "only3x.com", - "onlyams.com", - "onlycartoonsex.com", - "onlydudes.com", - "onlyfanspw.com", - "onlyfreelatinaporn.com", - "onlygayvideo.com", - "onlyhdporn.com", - "onlyhentaistuff.com", - "onlyhomemadeanal.com", - "onlyincestporn.com", - "onlyindianporn.tv", - "onlyindianporn2.com", - "onlyiphone5case.com", - "onlyleaks.me", - "onlynudes.org", - "onlyprime.ru", - "onlysiterip.com", - "onlytweets.com", - "onmanorama.com", - "onmoon.com", - "onmoon.net", - "onmypc.biz", - "onmypc.info", - "onmypc.net", - "onmypc.org", - "onmypc.us", - "onsalekey.com", - "onsaletrend.com", - "onstream.cc", - "onthehunt.com", - "ontrac.com", - "ontrack.ac.uk", - "onxxxtube.com", - "onxxxvideo.com", - "oocdtp.ac.uk", - "ooni.org", - "oopsforum.com", - "ootbstudio.co.kr", - "op.gg", - "op7979.com", - "opdems.ac.uk", - "open-assistant.io", - "open.ac.uk", - "open.com.hk", - "openai.com", - "openallweb.com", - "openamt.com", - "openapiplatform.com", - "openapiservice.com", - "openart.ai", - "opencollective.com", - "opencreate.org", - "opendemocracy.net", - "opendn.xyz", - "opendroneid.org", - "opened.ac.uk", - "openengineeringlaboratory.ac.uk", - "openervpn.in", - "openfields.ac.uk", - "opengraphprotocol.com", - "opengraphprotocol.org", - "opengw.net", - "openid.net", - "openjsf.org", - "openleaks.org", - "openlibrary.org", - "openmaps.org", - "openreality.com", - "openresty.org", - "opensciencelab.ac.uk", - "opensciencelaboratory.ac.uk", - "opensea.io", - "opensource.ac.uk", - "opensource.google", - "opensource.guide", - "opensourceinsight.dev", - "opensourceinsights.dev", - "openssl.org", - "openstemlab.ac.uk", - "openstemlabs.ac.uk", - "openstreetmap.com", - "openstreetmap.net", - "openstreetmap.org", - "openstreetmaps.org", - "opensuse.org", - "opentech.fund", - "opentgc.com", - "openthread.io", - "opentranslatorstothings.org", - "openuniversity.ac.uk", - "openurl.ac.uk", - "openvinotoolkit.org", - "openvpn.net", - "openvpn.org", - "openweather.co.uk", - "openweathermap.org", - "openweave.io", - "openwebster.com", - "openwrt.org", - "openwrt.org.cn", - "opera-archive.ac.uk", - "opera-mini.net", - "opera.com", - "opinionjournal.com", - "oppai-doga.info", - "oppainorakuen.com", - "opsource.net", - "optanedifference.com", - "opte.org", - "optica.org", - "opticore.com", - "opticsforthecloud.net", - "optima-cdt.ac.uk", - "optimumssl.com", - "opus-gaming.com", - "opwall.ac.uk", - "oracle.com", - "oraclecloud.com", - "oraclefoundation.org", - "oracleimg.com", - "oracleinfinity.io", - "oranum.com", - "orbitalsouthcolleges.ac.uk", - "orbitera.com", - "orchardhill.ac.uk", - "orchestra.ac.uk", - "orchid.ac.uk", - "orchidbbs.com", - "orcon.net.nz", - "oreil.ly", - "oreilly.com", - "oreilly.review", - "oreillystatic.com", - "oreno3d.com", - "organcare.org.tw", - "organharvestinvestigation.net", - "organiccrap.com", - "organicmaps.app", - "orgasm.com", - "orgasmlist.com", - "orgfree.com", - "orgypornonly.com", - "orgyxxxhub.com", - "oricon.co.jp", - "orient-doll.com", - "orientalasianporn.com", - "orientaldaily.com.my", - "orientalmed.ac.uk", - "origin.com", - "origin.tv", - "originalhulu.com", - "originalindianporn.com", - "orithegame.com", - "orl.ly", - "orlandohurricane.com", - "ormskirk.ac.uk", - "orn.jp", - "orpington.ac.uk", - "orsas.ac.uk", - "orsm.net", - "orthopaedic-cadcam.com", - "orthotics-cadcam.com", - "orzdream.com", - "orzistic.org", - "osakamotion.net", - "osapublishing.org", - "osc.ac.uk", - "oscar.ac.uk", - "oscg.ac.uk", - "osdn.net", - "osfc.ac.uk", - "osfoora.com", - "osianxiety.ac.uk", - "osier.ac.uk", - "osiri-suki-club.com", - "osl.com", - "osm.org", - "osmfoundation.org", - "osmosis.ac.uk", - "ospray.net", - "ospray.org", - "oss-watch.ac.uk", - "otaku-168.com", - "otaku18a.info", - "otaku55.xyz", - "otbm.com", - "otcbtc.com", - "otleycollege.ac.uk", - "otleyeaston.ac.uk", - "otleyonline.ac.uk", - "otnd.org", - "otokonokoland.com", - "otto.de", - "otzo.com", - "ou.ac.uk", - "oubs.ac.uk", - "oudoll.com", - "oup.com", - "ouplaw.com", - "ourdearamy.com", - "ourhobby.com", - "ourjourney.ac.uk", - "ouroath.com", - "oursexgames.com", - "ourshdtv.com", - "ourshemales.com", - "oursogo.com", - "oursteps.com.au", - "oursweb.net", - "ourtv.hk", - "oustudios.ac.uk", - "outbound.io", - "outdoorpublicsex.com", - "outduction.ac.uk", - "outingsapp.com", - "outletbeatsshop.com", - "outletnike.com", - "outlook.com", - "outofhourshelp.ac.uk", - "ovc.ac.uk", - "over-blog.com", - "over18arcade.com", - "overapple.com", - "overcast.fm", - "overdaily.org", - "overleaf.com", - "overplay.net", - "overthumbs.com", - "ovi.com", - "ovid.com", - "ovpn.com", - "ow.ly", - "owind.com", - "owl-elearning.ac.uk", - "owl.li", - "owltail.com", - "owsc.ac.uk", - "ox.ac.uk", - "oxademy.ac.uk", - "oxahsc.ac.uk", - "oxcis.ac.uk", - "oxdent.ac.uk", - "oxford-brookes.ac.uk", - "oxford-cherwell.ac.uk", - "oxford.ac.uk", - "oxfordaasc.com", - "oxfordadvancedstudies.ac.uk", - "oxfordartonline.com", - "oxfordbibliographies.com", - "oxfordbrookes.ac.uk", - "oxfordbusinesscollege.ac.uk", - "oxfordclinicalpsych.com", - "oxfordcollege.ac.uk", - "oxforddnb.com", - "oxforddrama.ac.uk", - "oxfordfirstsource.com", - "oxfordgsb.ac.uk", - "oxfordhandbooks.com", - "oxfordlawtrove.com", - "oxfordmedicine.com", - "oxfordmusiconline.com", - "oxfordpoliticstrove.com", - "oxfordre.com", - "oxfordreference.com", - "oxfordscholarlyeditions.com", - "oxfordscholarship.com", - "oxfordtutorialcollege.ac.uk", - "oxfordwesternmusic.com", - "oxid.it", - "oxilp.ac.uk", - "oxlife.co", - "oxwasp-cdt.ac.uk", - "oyax.com", - "oyeloca.com", - "oyghan.com", - "ozchinese.com", - "ozeex.com", - "ozodi.org", - "ozodlik.org", - "ozvoice.org", - "ozxw.com", - "ozyoyo.com", - "pa9pal.com", - "paaypal.com", - "pachosting.com", - "pacifickitchenandhome.com", - "pacificpoker.com", - "packaging-cadcam.com", - "packagingcadcam.com", - "packagist.org", - "packer.io", - "packetix.net", - "pacloudflare.com", - "pacopacomama.com", - "pact.ac.uk", - "padmanet.com", - "pads.ac.uk", - "paerosnen.club", - "page.link", - "page.tl", - "page2rss.com", - "page3.com", - "pagecdn.com", - "pagecdn.io", - "pages.dev", - "pagespeedmobilizer.com", - "pageview.mobi", - "pagodabox.com", - "pahabicilemezsurprizler.com", - "pahc.ac.uk", - "paheal.net", - "paidpornguide.com", - "paidpornsites.com", - "paily.net", - "paily.org", - "paimon.moe", - "painfulpussytortures.com", - "painnovel.com", - "paipal.com", - "paipancon.com", - "paisapay.cc", - "paisapay.info", - "paisapay.tv", - "paisley.ac.uk", - "pakistanporntube.net", - "pala.ac.uk", - "palacemoon.com", - "palaeography.ac.uk", - "palatine.ac.uk", - "palcomix.com", - "paldengyal.com", - "palemoon.org", - "palestineremix.com", - "pali.ltd", - "paljorpublications.com", - "palmers.ac.uk", - "palmislife.com", - "pals.ac.uk", - "paltalk.com", - "panasonic.com", - "panasonic.jp", - "pancolle-movie.jp", - "panda.ac.uk", - "panda30.shop", - "pandamovies.pw", - "pandanet-igs.com", - "pandapow.co", - "pandapow.net", - "pandavpn-jp.com", - "pandavpnpro.com", - "pandora.com", - "pandora.tv", - "pankwire.com", - "panluan.net", - "panorama-dtp.ac.uk", - "panoramio.com", - "pantswalker.net", - "pao-pao.net", - "paofu.cloud", - "paofuyun.me", - "paon.site", - "papalah.com", - "paper-attachments.s3.amazonaws.com", - "paper.li", - "paperb.us", - "paperclip.tk", - "papermc.io", - "paradigm.ac.uk", - "paradisehill.cc", - "paradisehotelquizfox.com", - "paradisepoker.com", - "paragon.com", - "paramount.com", - "paramountplus.com", - "parastorage.com", - "pardot.com", - "park-college.ac.uk", - "park-now.com", - "parkansky.com", - "parkcol.ac.uk", - "parkinfo.com", - "parklane.ac.uk", - "parklanecoll.ac.uk", - "parksandgardens.ac.uk", - "parkvv.com", - "parler.com", - "parse.com", - "parsevideo.com", - "parstream.com", - "parstream.net", - "parstream.org", - "particlephysics.ac.uk", - "partmaker.com", - "partneriaethaberbangor.ac.uk", - "partycasino.com", - "partylikeits1986.org", - "partypoker.com", - "pascherbeatsmonster.com", - "pase.ac.uk", - "pashtovoa.com", - "pasionmujeres.com", - "paskoocheh.com", - "passion-hd.com", - "passion.com", - "passiontimes.hk", - "passport.net", - "passwords.google", - "pastahealth.com", - "paste.ee", - "pastebin.com", - "pastie.org", - "paston.ac.uk", - "patentgold.net", - "patenttruth.org", - "path.ac.uk", - "pathcal.ac.uk", - "pathtosharepoint.com", - "pathways.ac.uk", - "pathwaystohe.ac.uk", - "patreon.com", - "patreoncommunity.com", - "patreonusercontent.com", - "patsy.ac.uk", - "paul-mellon-centre.ac.uk", - "paulmelloncentre.ac.uk", - "paulsimon-music.com", - "pavpal.com", - "pawoo.net", - "paxful.com", - "paxlicense.org", - "paydiant.com", - "paygonline.com", - "payhulu.com", - "paylike.com", - "paypa1.com", - "paypa1.org", - "paypaal.com", - "paypal-activate.com", - "paypal-activate.info", - "paypal-activate.org", - "paypal-apac.com", - "paypal-apps.com", - "paypal-biz.com", - "paypal-brandcentral.com", - "paypal-business.com", - "paypal-business.net", - "paypal-business.org", - "paypal-cardcash.com", - "paypal-cash.com", - "paypal-center.com", - "paypal-center.info", - "paypal-center.net", - "paypal-center.org", - "paypal-communication.com", - "paypal-communications.com", - "paypal-communications.net", - "paypal-community.com", - "paypal-community.net", - "paypal-comunidad.com", - "paypal-corp.com", - "paypal-database.com", - "paypal-database.us", - "paypal-donations.com", - "paypal-dynamic.com", - "paypal-engineering.com", - "paypal-europe.com", - "paypal-excelinvoicing.com", - "paypal-exchanges.com", - "paypal-forward.com", - "paypal-galactic.com", - "paypal-gift.com", - "paypal-gifts.com", - "paypal-gpplus.com", - "paypal-here.com", - "paypal-hrsystem.com", - "paypal-innovationlab.com", - "paypal-integration.com", - "paypal-japan.com", - "paypal-knowledge.com", - "paypal-labs.com", - "paypal-latam.com", - "paypal-learning.com", - "paypal-login.com", - "paypal-login.info", - "paypal-login.org", - "paypal-login.us", - "paypal-luxury.com", - "paypal-mainstreet.net", - "paypal-marketing.com", - "paypal-media.com", - "paypal-merchantloyalty.com", - "paypal-mobilemoney.com", - "paypal-network.org", - "paypal-notice.com", - "paypal-notify.com", - "paypal-online.info", - "paypal-online.net", - "paypal-online.org", - "paypal-optimizer.com", - "paypal-pages.com", - "paypal-photocard.com", - "paypal-plaza.com", - "paypal-portal.com", - "paypal-prepagata.com", - "paypal-prepagata.net", - "paypal-prepaid.com", - "paypal-profile.com", - "paypal-proserv.com", - "paypal-qrshopping.org", - "paypal-recargacelular.com", - "paypal-redeem.com", - "paypal-referral.com", - "paypal-retail.com", - "paypal-scoop.com", - "paypal-search.com", - "paypal-secure.net", - "paypal-secure.org", - "paypal-security.net", - "paypal-security.org", - "paypal-service.org", - "paypal-signin.com", - "paypal-signin.us", - "paypal-special.com", - "paypal-specialoffers.com", - "paypal-sptam.com", - "paypal-status.com", - "paypal-support.com", - "paypal-survey.com", - "paypal-survey.org", - "paypal-team.com", - "paypal-viewpoints.net", - "paypal.ca", - "paypal.com", - "paypal.com.hk", - "paypal.com.sg", - "paypal.hk", - "paypal.info", - "paypal.jp", - "paypal.me", - "paypal.so", - "paypal.us", - "paypalbeacon.com", - "paypalbenefits.com", - "paypalbrasil.com", - "paypalcommunity.com", - "paypalcommunity.net", - "paypalcommunity.org", - "paypalcorp.com", - "paypalcredit.com", - "paypalcreditcard.com", - "paypalgivingfund.org", - "paypalhere.com", - "paypalhere.info", - "paypalhere.net", - "paypalhere.org", - "paypalhere.tv", - "paypali.net", - "paypalinc.com", - "paypalindia.com", - "paypalinsuranceservices.org", - "paypall.com", - "paypallabs.com", - "paypalme.com", - "paypalnet.net", - "paypalnet.org", - "paypalnetwork.info", - "paypalnetwork.net", - "paypalnetwork.org", - "paypalobjects.com", - "paypalonline.net", - "paypalonline.org", - "paypalprepagata.com", - "paypalprepagata.net", - "paypalservice.com", - "paypalshopping.com", - "paypalshopping.net", - "paypalsurvey.com", - "paypalx.com", - "paypaly.com", - "paypass.net", - "payppal.com", - "payserve.com", - "paysitesreviews.net", - "payypal.com", - "pbabes.com", - "pbjar1205.pro", - "pble.ac.uk", - "pbs.org", - "pbwiki.com", - "pbworks.com", - "pbxes.com", - "pbxes.org", - "pc.com", - "pca.ac.uk", - "pca.st", - "pcad.ac.uk", - "pcae.ac.uk", - "pcanywhere.net", - "pcc.gov.tw", - "pccw.com", - "pccwglobal.com", - "pccwsolutions.com", - "pcdvd.com.tw", - "pcfe.ac.uk", - "pcfeonline.ac.uk", - "pcgamestorrents.com", - "pchome.com.tw", - "pchomeec.tw", - "pchomeonline.com.tw", - "pchomepay.com.tw", - "pcij.org", - "pcl.ac.uk", - "pcloud.com", - "pcloud.tw", - "pcmarket.com.hk", - "pcmd.ac.uk", - "pcre.org", - "pcstore.com.tw", - "pct.org.tw", - "pctlwm.com", - "pcydds.ac.uk", - "pdetails.com", - "pdf.new", - "pdi.ac.uk", - "pdncommunity.com", - "pdproxy.com", - "pds.ac.uk", - "pdxbmw.com", - "peace.ca", - "peacefire.org", - "peacehall.com", - "peach-cherry.com", - "peachy18.com", - "peachyforum.com", - "peacocktv.com", - "pearl.ac.uk", - "pearlher.org", - "pearson-anaya.com", - "pearson-intl.com", - "pearson-schule.ch", - "pearson-studium.ch", - "pearson.ch", - "pearson.cl", - "pearson.co.in", - "pearson.co.jp", - "pearson.com", - "pearson.com.ar", - "pearson.com.au", - "pearson.com.hk", - "pearson.com.uy", - "pearson.es", - "pearson.fr", - "pearson.pl", - "pearsonactivelearn.com", - "pearsonassessment.be", - "pearsonassessment.de", - "pearsonassessment.dk", - "pearsonassessment.fr", - "pearsonassessment.nl", - "pearsonassessment.no", - "pearsonassessment.se", - "pearsonassessments.com", - "pearsonbusinessschool.ac.uk", - "pearsoncanada.ca", - "pearsonclinical.be", - "pearsonclinical.ca", - "pearsonclinical.co.uk", - "pearsonclinical.com.au", - "pearsonclinical.com.br", - "pearsonclinical.de", - "pearsonclinical.dk", - "pearsonclinical.es", - "pearsonclinical.eu", - "pearsonclinical.fr", - "pearsonclinical.in", - "pearsonclinical.nl", - "pearsonclinical.no", - "pearsonclinical.se", - "pearsoncmg.com", - "pearsoncollege.ac.uk", - "pearsoncollegelondon.ac.uk", - "pearsoncred.com", - "pearsoned.co.nz", - "pearsoned.com", - "pearsoneducacion.net", - "pearsoneducationbooks.com", - "pearsonelt.ch", - "pearsonelt.com", - "pearsonenespanol.com", - "pearsonhighered.com", - "pearsoninstitute.ac.za", - "pearsonlongman.ch", - "pearsononlineacademy.com", - "pearsonperu.pe", - "pearsonplaces.com.au", - "pearsonschoolsandfecolleges.co.uk", - "pearsonvue.com", - "pearsonvue.net", - "peas.ac.uk", - "pec.ac.uk", - "pedagogicequality.ac.uk", - "peeasian.com", - "peekvids.com", - "peep.ac.uk", - "peepholecam.com", - "peerj.com", - "peerlearning.ac.uk", - "peing.net", - "pekingduck.org", - "pelvicexam.info", - "pembrokeshire.ac.uk", - "pembs.ac.uk", - "pemulihan.or.id", - "pen.io", - "penchinese.com", - "penchinese.net", - "pencoed.ac.uk", - "pendcoll.ac.uk", - "pengwerncollege.ac.uk", - "peninsula.ac.uk", - "peninsular.ac.uk", - "penisbot.com", - "pennine.ac.uk", - "pensions-expert.com", - "pentalogic.net", - "penthouse.com", - "pentium.com", - "pentium.net", - "pentoy.hk", - "penwith.ac.uk", - "penwithcollege.ac.uk", - "penybont.ac.uk", - "penzance.ac.uk", - "peoplebookcafe.com", - "peopledreamfunding.com", - "peoplelikeyou.ac.uk", - "peoplenews.tw", - "peoples.ac.uk", - "peopo.org", - "pepa.ac.uk", - "percy.in", - "perfect-privacy.com", - "perfected.ac.uk", - "perfectgirls.net", - "perfectgonzo.com", - "perfectkickz.net", - "perfectnaked.com", - "perfectsexnow.com", - "perfectshemales.com", - "perfecttitspics.com", - "perfectvpn.net", - "performancescience.ac.uk", - "periscope.tv", - "perl.org", - "perplexity.ai", - "persagg.com", - "persecutionblog.com", - "pershore.ac.uk", - "persianepochtimes.com", - "persiankitty.com", - "person.com", - "personaltrainermath.com", - "personeelsland.com", - "perth.ac.uk", - "perthcoll.ac.uk", - "pervclips.com", - "perverse.sex", - "perverttube.com", - "petardas.com", - "petardas.xxx", - "petardashd.com.ve", - "peterborough.ac.uk", - "petite.one", - "petiteamateurteen.com", - "petiteballerinasfucked.com", - "petitehdporn.com", - "petroc.ac.uk", - "pfd.org.hk", - "pggc.ac.uk", - "pgreen.ac.uk", - "pgyy67.top", - "phantomjs.org", - "phapluan.org", - "pharmacy.ac.uk", - "pharmacyschools.ac.uk", - "pharmacyschoolscouncil.ac.uk", - "phayul.com", - "phc.ac.uk", - "phdcymru.ac.uk", - "pheds-dtc.ac.uk", - "pheonix.money", - "phes.ac.uk", - "philborges.com", - "philtar.ac.uk", - "phimsex47.club", - "phimsexhentai.me", - "phimsexkhongche.cyou", - "phimsexnhanh.club", - "phmsociety.org", - "phncdn.com", - "phoenix.ac.uk", - "phonegap.com", - "photo-image.monster", - "photodharma.net", - "photofocus.com", - "photolia.net", - "photonics.ac.uk", - "photonicssociety.org", - "photos18.com", - "photoshop.com", - "php.net", - "phprcdn.com", - "phptutorial.net", - "phr.ac.uk", - "phun.org", - "phuquocservices.com", - "phxbmw.com", - "physicalexam.info", - "physiology.org", - "pi-project.ac.uk", - "pi-vr.com", - "piapp.com.tw", - "piapro.net", - "picacg2022.com", - "picacgp.com", - "picacgy.com", - "picacn.xyz", - "picacomic.com", - "picacomic.xyz", - "picacomiccn.com", - "picasa.com", - "picasaweb.com", - "picasaweb.net", - "picasaweb.org", - "pichunter.com", - "picidae.net", - "picker.ac.uk", - "pickereurope.ac.uk", - "pickering.ac.uk", - "pickinguppussy.com", - "picknicekicks.net", - "pickshoesclothes.com", - "picnik.com", - "picpost.com", - "pics.ee", - "pics.vc", - "picsee.co", - "picsee.pro", - "pictoa.com", - "pictocum.com", - "picturedip.com", - "picturesocial.com", - "pieceofplastic.com", - "pier18.ac.uk", - "pifpafarabia.com", - "pigav.com", - "piirus.ac.uk", - "pikabu.monster", - "pikpak.me", - "pikpakdrive.com", - "pilgrimageandcathedrals.ac.uk", - "pilgrimagestudies.ac.uk", - "pillbeatsblackfridaysale.com", - "pimg.tw", - "pin-cong.com", - "pin.it", - "pin6.com", - "pinata.cloud", - "pincong.rocks", - "pinduck.com", - "pinflix.com", - "ping.fm", - "ping.pe", - "ping.sx", - "pingguotv.xyz", - "pingxiangpuer.com", - "pinimg.com", - "pinkcore.com", - "pinkcore.net", - "pinkdh-bb.sbs", - "pinkdino.com", - "pinkporno.com", - "pinkpussy.tv", - "pinkrod.com", - "pinksporn.com", - "pinkvelvetvault.com", - "pinkworld.com", - "pinoy-n.com", - "pinterest.at", - "pinterest.be", - "pinterest.ca", - "pinterest.ch", - "pinterest.cl", - "pinterest.co", - "pinterest.co.at", - "pinterest.co.in", - "pinterest.co.kr", - "pinterest.co.nz", - "pinterest.co.uk", - "pinterest.com", - "pinterest.com.au", - "pinterest.com.bo", - "pinterest.com.ec", - "pinterest.com.mx", - "pinterest.com.pe", - "pinterest.com.py", - "pinterest.com.uy", - "pinterest.com.vn", - "pinterest.de", - "pinterest.dk", - "pinterest.ec", - "pinterest.engineering", - "pinterest.es", - "pinterest.fr", - "pinterest.hu", - "pinterest.id", - "pinterest.ie", - "pinterest.in", - "pinterest.info", - "pinterest.it", - "pinterest.jp", - "pinterest.kr", - "pinterest.map.fastly.net", - "pinterest.mx", - "pinterest.net", - "pinterest.nl", - "pinterest.nz", - "pinterest.pe", - "pinterest.ph", - "pinterest.pt", - "pinterest.ru", - "pinterest.se", - "pinterest.th", - "pinterest.tw", - "pinterest.uk", - "pinterest.vn", - "pinterestmail.com", - "pintool.com", - "pion.ac.uk", - "pionex.com", - "pipebots.ac.uk", - "pipii.tv", - "piposay.com", - "piraattilahti.org", - "piratecams.com", - "pirates-forum.org", - "pirbright.ac.uk", - "piring.com", - "pirouvr.com", - "piru.ac.uk", - "pise.pw", - "pitch-in.ac.uk", - "pittpatt.com", - "pivotalinitiative.com", - "piwheels.org", - "pixanalytics.com", - "pixapp.net", - "pixate.com", - "pixeldrain.com", - "pixelqi.com", - "pixfs.net", - "pixhost.to", - "pixinsight.com.tw", - "pixiv.co.jp", - "pixiv.me", - "pixiv.net", - "pixiv.org", - "pixlr-o-matic.com", - "pixlromatic.com", - "pixnet.cc", - "pixnet.in", - "pixnet.net", - "pixnet.pro", - "pixnet.tw", - "pixplug.in", - "pixtronix.com", - "pjbyj.top", - "pjful-app.lol", - "pjgirls.com", - "pk.com", - "pki-post.ch", - "pki-posta.ch", - "pki-poste.ch", - "pki.goog", - "placemix.com", - "placemyad.com.au", - "placesdocs.com", - "plala.or.jp", - "planetminecraft.com", - "planetsuzy.org", - "plansondemand.com", - "plant-phenomics.ac.uk", - "plantsvszombies2.com", - "plasticlabs.com", - "plastics-cadcam.com", - "platinumlinks.org", - "play-asia.com", - "play-bmm.shop", - "play-bmmer.buzz", - "play-fe.googleapis.com", - "play.googleapis.com", - "play4free.com", - "playapex.com", - "playartifact.com", - "playbar.biz", - "playbeasts.com", - "playboy.com", - "playboyplus.com", - "playbydurex.com", - "playcover.io", - "player.fm", - "playerjs.io", - "playforceone.com", - "playhearthstone.com", - "playmation.com", - "playmeow.com", - "playnintendo.com", - "playno1.com", - "playoverwatch.com", - "playparagon.com", - "playpcesor.com", - "playporngame.com", - "playporngames.com", - "playpornogames.com", - "plays.com.tw", - "playsexgames.xxx", - "playsexygame.com", - "playshow.io", - "playshowtv.com", - "playstation.com", - "playstation.net", - "playvalorant.com", - "playvids.com", - "playwarcraft3.com", - "playyoungtube.com", - "playz.jp", - "pldfscotland.ac.uk", - "pleasefuck.org", - "pleasurebabe.com", - "pleasuregirl.net", - "pleasuremore.com", - "plexvpn.pro", - "plixi.com", - "plm.org.hk", - "plos.org", - "plug-into.com", - "plug.game", - "plumperpass.com", - "plumpton.ac.uk", - "plumptononline.ac.uk", - "plunder.com", - "plurk.com", - "plus.ac.uk", - "plus.codes", - "plus28.com", - "plusbb.com", - "plusone8.com", - "plusporn.net", - "pluto.tv", - "plutotv.net", - "plym.ac.uk", - "plymouth-marine-laboratory.ac.uk", - "plymouth.ac.uk", - "plymouthart.ac.uk", - "plymouthcfe.ac.uk", - "plymsea.ac.uk", - "plzpf.com", - "pm.me", - "pmatehunter.com", - "pmates.com", - "pml.ac.uk", - "pms.ac.uk", - "pnas.org", - "po2b.com", - "pobieramy.top", - "pobl-content.com", - "pocketbiketrader.com", - "pocketcasts.com", - "podbean.com", - "podcast.app", - "podcast.co", - "podictionary.com", - "podium.ac.uk", - "poe.com", - "poecdn.net", - "pogo.com", - "pogobeta.com", - "poi.moe", - "point.ac.uk", - "pointblank.ac.uk", - "pointblankmusicschool.ac.uk", - "poisontube.com", - "pojapp.cfd", - "pojbayj1030.top", - "pojie7.com", - "pojiefuli20033.xyz", - "pojiefuli9113.xyz", - "pokedex3d.com", - "pokemon-moon.com", - "pokemon-sun.com", - "pokemon-sunmoon.com", - "pokemon-unitepgame.com", - "pokemon.com", - "pokemonbank.com", - "pokemonblackwhite.com", - "pokemonbw.com", - "pokemonchampionships.com", - "pokemongoldsilver.com", - "pokemonhome.com", - "pokemonletsgoeevee.com", - "pokemonletsgopikachu.com", - "pokemonmysterydungeon.com", - "pokemonpicross.com", - "pokemonplatinum.com", - "pokemonrubysapphire.com", - "pokemonsunmoon.com", - "pokemonswordshield.com", - "pokemonultrasunmoon.com", - "pokemonvgc.com", - "pokemonwifi.net", - "pokerstars.com", - "pokerstars.net", - "pokerstrategy.com", - "pol.ac.uk", - "political-science.ac.uk", - "politicalchina.org", - "politicalconsultation.org", - "politico.eu", - "politicsblog.ac.uk", - "politicsinaction.ac.uk", - "politiscales.net", - "poloniex.com", - "poly-of-wales.ac.uk", - "polygon.com", - "polymer-project.org", - "polymerhk.com", - "polymerproject.org", - "poms.ac.uk", - "pone.ac.uk", - "pontypridd.ac.uk", - "ponyanimalsex.com", - "poofetish.com", - "pooleacl.ac.uk", - "poolin.com", - "poop-pee.online", - "poopee-puke.com", - "poopeegirls.com", - "popcap.com", - "popjav.tv", - "popo.tw", - "popo8.com", - "popporn-world.com", - "popvote.hk", - "popxi.click", - "popyard.com", - "popyard.org", - "porcore.com", - "poringa.net", - "porkahd.co", - "porkbun.com", - "porm.club", - "porn-bokep.com", - "porn-comic.com", - "porn-discounts.com", - "porn-discounts.xxx", - "porn-gratis.info", - "porn-images-xxx.com", - "porn-list.site", - "porn-portal.com", - "porn-sex-video.me", - "porn-star.com", - "porn.biz", - "porn.com", - "porn.to", - "porn.xxx", - "porn2.com", - "porn2012.com", - "porn300.com", - "porn300.online", - "porn34.me", - "porn3dgalleries.com", - "porn4days.cc", - "porn4fap.com", - "porn5.com", - "porn555.com", - "porn5f.com", - "porn62.com", - "porn7.net", - "porn7.xxx", - "porn87.com", - "porn91.org", - "porn93.cc", - "pornachi.com", - "pornacho.com", - "pornadoo.com", - "pornaf.com", - "pornaffected.com", - "pornandxxxvideos.com", - "pornaroma.com", - "pornav.co", - "pornaxo.com", - "pornbase.org", - "pornbest.org", - "pornbit.cc", - "pornbl.com", - "pornbozz.com", - "pornbraze.com", - "pornburger.com", - "pornburst.xxx", - "porncana.com", - "porncoil.com", - "porncomics.com", - "porncomics.me", - "porncomixonline.net", - "porncore.net", - "porncoven.com", - "porncrash.com", - "porndabster.com", - "porndeals.com", - "porndeepfake.net", - "porndex.com", - "porndiamond.com", - "porndig.com", - "porndigger.me", - "porndiscount.org", - "porndiscounts.com", - "porndish.com", - "porndisk.com", - "pornditos.com", - "porndoe.com", - "porndoepremium.com", - "porndork.com", - "porndr.com", - "porndroids.com", - "porndude2.com", - "porndudecasting.com", - "pornelephant.com", - "pornenix.com", - "porner.tv", - "pornerbros.com", - "pornexpress.net", - "pornfactory.info", - "pornfhd.com", - "pornfidelity.com", - "pornfind.org", - "pornfinder.biz", - "pornflip.com", - "pornfoolery.com", - "pornfu.tv", - "pornfuck.net", - "pornfuror.com", - "porngames.club", - "porngames.com", - "porngames.games", - "porngames.tv", - "porngameshub.com", - "porngamesverse.com", - "porngeek.com", - "porngem.com", - "porngifs.xxx", - "porngladiator.com", - "porngo.com", - "porngo.tube", - "porngrabbz.com", - "porngub.com", - "pornguide.blog", - "pornguz.com", - "pornhail.com", - "pornhat.com", - "pornhat.one", - "pornhat.tv", - "pornhd.com", - "pornhd3x.tv", - "pornhd8k.net", - "pornhdfuck.com", - "pornhdtube.tv", - "pornhdvideos.tv", - "pornheed.com", - "pornheli.com", - "pornhits.com", - "pornhoho.com", - "pornhost.com", - "pornhub-deutsch.info", - "pornhub-deutsch.net", - "pornhub-german.com", - "pornhub-sexfilme.net", - "pornhub.com", - "pornhub.org", - "pornhub00.com", - "pornhubapparel.com", - "pornhubdeutsch.net", - "pornhubpremium.com", - "pornhubs.video", - "pornhubselect.com", - "pornhun.xyz", - "pornhutdeutsch.com", - "pornicom.com", - "pornid.xxx", - "pornimg.xyz", - "porniq.com", - "pornirani.com", - "pornjam.com", - "pornjav.org", - "pornjk.com", - "pornkai.com", - "pornkind.net", - "pornking.fun", - "pornkino.cc", - "pornkro.com", - "pornktube.com", - "pornky.com", - "pornlaundry.com", - "pornlegendsclub.com", - "pornlist18.com", - "pornlistdude.com", - "pornloser.com", - "pornlulu.com", - "pornluxme.com", - "pornma.com", - "pornmadeathome.com", - "pornmagnet.org", - "pornmaki.com", - "pornmaster.fun", - "pornmate.com", - "pornmaturetube.com", - "pornmd.com", - "pornmegaload.com", - "pornmemo.com", - "pornmm.net", - "pornmonde.com", - "pornmovies2.me", - "pornmoviescave.com", - "pornmz.com", - "pornmz.net", - "pornnetworkdeals.com", - "pornnut.com", - "porno-erotica.com", - "porno.org.in", - "porno365.net", - "porno365.website", - "porno49.com", - "pornoaid.com", - "pornoamateurlatino.net", - "pornobae.com", - "pornobengala.com", - "pornoboard.net", - "pornoboliviaxxx.com", - "pornobom.com.br", - "pornobox.net", - "pornobrasil.blog.br", - "pornobrasil.com", - "pornobrasil.org", - "pornobrasileiro.tv", - "pornobrasileiro.xyz", - "pornobuzz.net", - "pornocarioca.com", - "pornocaserotube.com", - "pornocd.ru", - "pornocomic.net", - "pornodanke.com", - "pornodoido.com", - "pornodrome.tv", - "pornoecuadorxxx.com", - "pornoelena.net", - "pornofiles.ru", - "pornofilmlist.com", - "pornofint.com", - "pornofrog.com", - "pornogayphy.com", - "pornogids.net", - "pornogram.xxx", - "pornogramxxx.com", - "pornogratis.vlog.br", - "pornogrund.com", - "pornohd.blue", - "pornohd.plus", - "pornohd.porn", - "pornohoo.com.mx", - "pornohut.info", - "pornohutdeutsch.net", - "pornoid.com", - "pornoincreible.com", - "pornoingyen.hu", - "pornoirado.com", - "pornoitaliano.com", - "pornojefe.com", - "pornojux.com", - "pornoko.net", - "pornokrol.com", - "pornolab.net", - "pornolaba.mobi", - "pornolandia.xxx", - "pornomasse.com", - "pornomineiro.com", - "pornomovies.mobi", - "pornone.com", - "pornoorzel.com", - "pornoprive.xxx", - "pornoreino.com", - "pornorips.com", - "pornos.live", - "pornoscanner.com", - "pornosex.cam", - "pornosfilmes.com", - "pornoslon.me", - "pornosphere.com", - "pornotime.net", - "pornotree.com", - "pornotron.net", - "pornotube.blog.br", - "pornotube69.nl", - "pornov1080.name", - "pornovenezolano.com.ve", - "pornovenezolanox.com", - "pornovideosfree.net", - "pornovideoshub.com", - "pornovideow.com", - "pornoweb.hu", - "pornoweb.win", - "pornoxo.com", - "pornozona.tv", - "pornpair.com", - "pornpander.com", - "pornpaw.com", - "pornpen.ai", - "pornper.com", - "pornpics.com", - "pornpost.net", - "pornpros.com", - "pornprosnetwork.com", - "pornproxy.app", - "pornqd.com", - "pornrabbit.com", - "pornrapidshare.com", - "pornreactor.cc", - "pornrips.cc", - "pornrox.com", - "pornscat.org", - "pornscum.com", - "pornsexer.com", - "pornshare.biz", - "pornsharing.com", - "pornsites.com", - "pornsites.xxx", - "pornsitesnow.com", - "pornsocket.com", - "pornsoldiers.com", - "pornsos.com", - "pornspark.com", - "pornstarbyface.com", - "pornstarclub.com", - "pornstreams.tv", - "pornstripgames.com", - "porntea.com", - "pornteen123.com", - "porntn.com", - "porntop.com", - "porntoplinks.com", - "porntrex.com", - "porntry.com", - "porntsunami.com", - "porntube.com", - "porntubenews.com", - "porntubent.com", - "porntv.com", - "porntvblog.com", - "pornuj.cz", - "pornultras.com", - "pornv.org", - "pornve.com", - "pornvibe.org", - "pornvideobb.com", - "pornvideos.casa", - "pornvideotop.com", - "pornvideotube.online", - "pornvidhd.club", - "pornvisit.com", - "pornwatchers.com", - "pornwebmasters.com", - "pornwhite.com", - "pornwhitelist.com", - "pornwild.to", - "pornworld.to", - "pornxnxxmovies.com", - "pornxp.com", - "pornxp.net", - "pornxp.org", - "pornxs.com", - "pornxvideos.tv", - "pornxvideos.win", - "pornxxxmovies.cc", - "pornxxxplace.com", - "pornxxxweb.com", - "pornyeah.com", - "pornyteen.com", - "pornzog.com", - "pornzone.com", - "porstoporno.site", - "port.ac.uk", - "port25.biz", - "portablevpn.nl", - "portfolio.ac.uk", - "portfoliowall.com", - "porth.ac.uk", - "portland.ac.uk", - "portsmouth-college.ac.uk", - "portsmouth.ac.uk", - "portsmouthuni.ac.uk", - "porzo.com", - "porzo.tv", - "poshtestgallery.cloudapp.net", - "poshtestgallery.com", - "positivessl.com", - "poskotanews.com", - "post01.com", - "post76.com", - "post852.com", - "postadult.com", - "postegro.it", - "postgrad.ac.uk", - "postgraducas.ac.uk", - "postgresql.org", - "postimages.org", - "postimg.cc", - "postimg.org", - "postini.com", - "posty.kr", - "postyourgirls.ws", - "potato.im", - "potenza.jp", - "potteries.ac.uk", - "potterieseducationaltrust.ac.uk", - "potvpn.com", - "pourquoi.tw", - "poverty.ac.uk", - "povpornonly.com", - "povr.com", - "pow.ac.uk", - "power.com", - "poweranimator.com", - "powerapple.com", - "powerappscdn.net", - "powerautomate.com", - "powerbeats2wireless.com", - "powerbeatsbydrdre.com", - "powerbeatsbydre.com", - "powerbi.com", - "powerbook.eu", - "powercx.com", - "poweredbyintel.com", - "powerelectronics.ac.uk", - "powerinspect.com", - "powermill.com", - "powermillna.com", - "powerofresolve.ca", - "powerofresolve.com", - "powerphoto.org", - "powerpointninja.com", - "powershape-e.com", - "powershape.com", - "powershellgallery.com", - "powersunitedvr.com", - "powia.ac.uk", - "pp-soc.com", - "pp.ru", - "pp6.info", - "pparc.ac.uk", - "ppaypal.com", - "ppb-mod.buzz", - "ppe.lawyer", - "pplah.com", - "pplusstatic.com", - "ppp91.cc", - "pppds.com", - "ppre.ac.uk", - "ppy.sh", - "practicalbusinessskills.com", - "practicalmoneyskills.ca", - "practicalmoneyskills.jp", - "practicum.ac.uk", - "pramu.ac.uk", - "prastitutki.ru", - "prayforchina.net", - "pre-bmwgroup.jobs", - "predictivetechnologies.com", - "premeforwindows7.com", - "premia.ac.uk", - "premium-beauty.com", - "premiumfs.de", - "premiumhd.net", - "premiumpornlist.com", - "premobay.com", - "premproxy.com", - "preprod-publicca.googleapis.com", - "prepsure.com", - "prescribe.ac.uk", - "prescribingsafetyassessment.ac.uk", - "presentationzen.com", - "presidencylondoncollege.ac.uk", - "presidentlee.tw", - "press.vin", - "pressreader.com", - "prestige-av.com", - "preston.ac.uk", - "prestoncoll.ac.uk", - "pretty-ass.xyz", - "prettynubiles.com", - "prettyvirgin.com", - "priceless.com", - "priceless.org", - "pricelessafrica.com", - "pricelessarabia.com", - "pricelessaruba.com", - "pricelessbeijing.com", - "pricelesshongkong.com", - "pricelesshonolulu.com", - "pricelessmarketingengine.com", - "pricelesspick.com", - "pricelesssantiago.com", - "pricelesssurprises.com", - "pricelesssydney.com", - "pricelesstoronto.ca", - "pricelesstv.com", - "priconne-redive.jp", - "pride.google", - "pridetube.com", - "priestley.ac.uk", - "priestleycollege.ac.uk", - "prifysgolioncymru.ac.uk", - "primarygoal.ac.uk", - "prime-video.com", - "primecurves.com", - "primeday.info", - "primeindianporn.com", - "primematures.com", - "primepornlist.com", - "primevideo.cc", - "primevideo.com", - "primevideo.info", - "primevideo.org", - "primevideo.tv", - "princesscum.com", - "princeton.edu", - "principlesinpatterns.ac.uk", - "printeron.com", - "printersetupsupport.com", - "printfriendly.com", - "printspots.com", - "printspots.net", - "prioned.ac.uk", - "prism-break.org", - "prism.ac.uk", - "prismic.io", - "prismlauncher.org", - "prismlive.com", - "prisoneralert.com", - "pritunl.com", - "privacybox.de", - "privacysandbox.com", - "privacysimplified.com", - "privacytools.io", - "private.com", - "privatebrowsingmyths.com", - "privatecasting-x.com", - "privateclassics.com", - "privateinternetaccess.com", - "privatemarketplaces.net", - "privatemarketplaces.us", - "privatepaste.com", - "privatetunnel.com", - "privatevoyeurvideos.com", - "privatevpn.com", - "privelt.ac.uk", - "privilege.hk", - "privilege.tw", - "privoxy.org", - "proactivebackend-pa.googleapis.com", - "procat.ac.uk", - "procatdigital.ac.uk", - "procatstudent.ac.uk", - "procopytips.com", - "proctoscopeexam.com", - "prodrive-japan.com", - "product.co.jp", - "productivemargins.ac.uk", - "profile.ac.uk", - "profilemaster.com", - "profreeporno.com", - "programme3.ac.uk", - "prohashing.com", - "project-syndicate.org", - "projectapex.com", - "projectara.com", - "projectbaseline.com", - "projecteuclid.org", - "projectjav.com", - "projectmurphy.net", - "projectpoint.com", - "projectpoint.net", - "projectsangam.com", - "projectshoreline.com", - "projectvasari.com", - "projectvoyeur.com", - "promonsterbeatsbydre.com", - "promotingpartnership.ac.uk", - "proms.ac.uk", - "pron.guru", - "propagandastudies.ac.uk", - "property.com.au", - "propertysex.com", - "proporn.com", - "proptiger.com", - "proquest.com", - "pros.ee", - "prosiben.de", - "prospects.ac.uk", - "prostoporno.net", - "prostores.com", - "prostudiobeatscybersale.com", - "proteus.ac.uk", - "prothots.com", - "proton.me", - "protondb.com", - "protonmail.ch", - "protonmail.com", - "protonstatus.com", - "protonvpn.com", - "proudman-oceanographic-lab.ac.uk", - "provide.ac.uk", - "provideocoalition.com", - "provpnaccounts.com", - "prowe.ac.uk", - "proxfree.com", - "proxifier.com", - "proxlet.com", - "proxomics.ac.uk", - "proxomitron.info", - "proxpn.com", - "proxy.org", - "proxy1.xyz", - "proxyadult.org", - "proxyanonimo.es", - "proxydns.com", - "proxylist.org.uk", - "proxynetwork.org.uk", - "proxypy.net", - "proxyrarbg.org", - "proxyroad.com", - "proxytunnel.net", - "proyectoclubes.com", - "prozz.net", - "prpops.com", - "prs-ltsn.ac.uk", - "prts.plus", - "prucomm.ac.uk", - "ps-exchange.com", - "psa.ac.uk", - "psblog.name", - "psc.ac.uk", - "pscdn.co", - "psci-com.ac.uk", - "pscp.tv", - "psds.ac.uk", - "pse.is", - "psg-int-centralus.cloudapp.net", - "psg-int-eastus.cloudapp.net", - "pshvpn.com", - "psigate.ac.uk", - "psiphon.ca", - "psiphon3.com", - "psiphontoday.com", - "pssru.ac.uk", - "pstatic.net", - "pstorage.space", - "psyccareers.com", - "pt.im", - "ptapjmp.com", - "pts.org.tw", - "ptt.cc", - "ptt.sex", - "ptt2.cc", - "ptt3.cc", - "pttgame.com", - "ptthito.com", - "pttvan.org", - "pttweb.cc", - "pttyes.com", - "ptzwx.com", - "pu82.vip", - "pub.dev", - "public-sex-porn.com", - "public-trust.com", - "publicagentxxx.com", - "publicca.googleapis.com", - "publicengagement.ac.uk", - "publicinterest.ac.uk", - "publicpornvideo.com", - "publicservices.ac.uk", - "publicsexhub.com", - "publicspace.ac.uk", - "publishproxy.com", - "pubmatic.co.jp", - "pubmatic.com", - "pubu.com.tw", - "puffin.com", - "puffinbrowser.com", - "puffstore.com", - "pugetsoundbmw.com", - "pugetsoundmini.com", - "pugpig-dev.com", - "pugpig-stage.com", - "pugpig.com", - "pullfolio.com", - "pullstring.net", - "pulsebrowser.app", - "punishbang.com", - "punishworld.com", - "punjab.gov.in", - "punjab.gov.pk", - "punyu.com", - "puppiesofourtime.ac.uk", - "pure18.com", - "pureapk.com", - "pureconcepts.net", - "pureinsight.org", - "purelov5.com", - "purelyceleb.com", - "purenudism.com", - "purepdf.com", - "puretaboo.com", - "purevpn.com", - "purextc.com", - "puripuriunkomura.com", - "purplelotus.org", - "pursglove.ac.uk", - "pursuestar.com", - "pururin.to", - "pushchinawall.com", - "pussthecat.org", - "pussy-pics.net", - "pussy3dporn.com", - "pussyboy.net", - "pussymomsex.com", - "pussyporntubes.com", - "pussysexgames.com", - "pussyshine.info", - "pussyspace.com", - "pussyspace.net", - "putihome.org", - "putinho.net", - "putlocker.com", - "putty.org", - "puuko.com", - "pvp.net", - "pvp.tv", - "pvt.sexy", - "pvue1.com", - "pvue2.com", - "pvzgw2.com", - "pvzheroes.com", - "pwabuilder.com", - "pwmnet.com", - "pwned.com", - "pwnedpasswords.com", - "pximg.net", - "pxt.io", - "pycon.org", - "pypa.io", - "pypi.io", - "pypi.org", - "pypl.com", - "pypl.info", - "pypl.net", - "pypl.tv", - "pyrobot.org", - "python.com", - "python.com.tw", - "python.org", - "pythonhackers.com", - "pythonhosted.org", - "pythonic.life", - "pytorch.org", - "pzforever.skin", - "pzforever01.homes", - "pzhanfor.today", - "q10.jp", - "q13.com", - "q13fox.com", - "qaa.ac.uk", - "qac.ac.uk", - "qacollege.ac.uk", - "qanote.com", - "qatarescortsvip.com", - "qattdh.cc", - "qattdh.top", - "qattdh1.cc", - "qattdh2.cc", - "qattdh6.top", - "qbittorrent.org", - "qbmengmei6.mom", - "qbsc.ac.uk", - "qcmod.xyz", - "qctconnect.com", - "qdiehzz7.me", - "qeliz.ac.uk", - "qgirl.com.tw", - "qhigh.com", - "qi-gong.me", - "qianbai.tw", - "qiandao.today", - "qiangwaikan.com", - "qiangyou.org", - "qidian.ca", - "qienkuen.org", - "qinav.com", - "qingse.one", - "qise100.com", - "qiwen.lu", - "qixianglu.cn", - "qkshare.com", - "qlink.to", - "qmap.pub", - "qmbsc.ac.uk", - "qmc.ac.uk", - "qmced.ac.uk", - "qml.ac.uk", - "qmov.com", - "qmov.net", - "qmpgmc.ac.uk", - "qmttqg3k.me", - "qmu.ac.uk", - "qmuc.ac.uk", - "qmul.ac.uk", - "qmw.ac.uk", - "qmzdd.com", - "qnap.com", - "qombol.com", - "qoo10.jp", - "qooqlevideo.com", - "qoos.com", - "qorno.com", - "qoru.ac.uk", - "qpoe.com", - "qporno.xxx", - "qprize.com", - "qq.co.za", - "qqbs.asia", - "qqbs.work", - "qr.ae", - "qsi.ac.uk", - "qso.ac.uk", - "qstatus.com", - "qt-project.org", - "qt.io", - "qtlglb.com", - "qtrac.eu", - "qtweeter.com", - "quadram.ac.uk", - "quadraminstitute.ac.uk", - "quadrat.ac.uk", - "qualcomm-email.com", - "qualcomm.co.id", - "qualcomm.co.in", - "qualcomm.co.jp", - "qualcomm.co.kr", - "qualcomm.co.uk", - "qualcomm.com", - "qualcomm.com.br", - "qualcomm.com.tw", - "qualcomm.de", - "qualcomm.fr", - "qualcommhalo.com", - "qualcommlabs.com", - "qualcommmea.com", - "qualcommretail.com", - "qualcommventures.cn", - "qualcommventures.com", - "qualidata.ac.uk", - "qualphone.com", - "quanben-xiaoshuo.com", - "quanben.io", - "quannengshen.org", - "quantic.ac.uk", - "quantil.com", - "quantitativemethods.ac.uk", - "quantumbooter.net", - "quatrowireless.com", - "quatrum.com.br", - "quay.io", - "quayside.ac.uk", - "qub.ac.uk", - "queens-belfast.ac.uk", - "queens.ac.uk", - "queensu.ac.uk", - "quercus.ac.uk", - "questvisual.com", - "quicinc.com", - "quickconnect.to", - "quickiepage.com", - "quickoffice.com", - "quicktake.video", - "quicktime.cc", - "quicktime.com", - "quicktime.com.au", - "quicktime.eu", - "quicktime.net", - "quicktime.tv", - "quiksee.com", - "quiltmc.org", - "quip-cdn.com", - "quip.com", - "quipelements.com", - "quitccp.net", - "quitccp.org", - "quiz.directory", - "qumingwz.com", - "qumrancavesdispersed.ac.uk", - "quora.com", - "quoracdn.net", - "quotable.com", - "quovadisglobal.com", - "quran.com", - "quranexplorer.com", - "qusi8.net", - "qutebrowser.org", - "qvodzy.org", - "qwant.com", - "qwant.de", - "qwant.fr", - "qwant.it", - "qwapi.com", - "qx.net", - "qxbbs.org", - "qysg.cc", - "qysg7.buzz", - "qysg8.buzz", - "qz.com", - "qzav.tv", - "r-project.org", - "r0.ru", - "r10s.com", - "r10s.jp", - "r18.com", - "r18av.com", - "r18lu-avi.shop", - "r18lu.com", - "r34porn.net", - "ra-review.ac.uk", - "ra.gg", - "raa.ac.uk", - "rabbitscams.com", - "rabbitscams.sex", - "rabbitsreviews.com", - "rac.ac.uk", - "racals.ac.uk", - "racc.ac.uk", - "racked.com", - "rad-sat.ac.uk", - "rada.ac.uk", - "radeon.com", - "radian6.com", - "radicalparty.org", - "radiko.jp", - "radio-canada.ca", - "radio.garden", - "radioaustralia.net.au", - "radiofarda.com", - "radiohilight.net", - "radioline.co", - "radiomango.fm", - "radiomarsho.com", - "radioresearch.ac.uk", - "radiosvoboda.org", - "radiotavisupleba.ge", - "radiotime.com", - "radiovaticana.org", - "radiovncr.com", - "radiyoyacuvoa.com", - "rae.ac.uk", - "rael.org", - "raft.ac.uk", - "raggedbanner.com", - "raidcall.com.tw", - "raidtalk.com.tw", - "rainbowplan.org", - "raindrop.io", - "raizoji.or.jp", - "rajwaphq.com", - "rakuten-static.com", - "rakuten.ca", - "rakuten.co.jp", - "rakuten.com", - "rakuten.com.tw", - "rakuten.ne.jp", - "rakuten.tw", - "rakuya.com.tw", - "ram.ac.uk", - "ramcity.com.au", - "randd.ac.uk", - "randomsystems-cdt.ac.uk", - "randyblue.com", - "rangwang.biz", - "rangzen.com", - "rangzen.net", - "rangzen.org", - "ranranhome.info", - "ranxiang.com", - "ranyunfei.com", - "rapbull.net", - "rapefilms.net", - "rapetube.me", - "rapid.ac.uk", - "rapidmoviez.com", - "rapidprototyping-cadcam.com", - "rapidssl.com", - "rapidvpn.com", - "raponlinereview.com", - "raratutor.ac.uk", - "rarbg.is", - "rarbg.me", - "rarbg.to", - "rarbgaccess.org", - "rarbgaccessed.org", - "rarbgget.org", - "rarbggo.org", - "rarbgmirror.com", - "rarbgmirror.org", - "rarbgproxy.org", - "rarbgprx.org", - "rarbgto.org", - "rarbgunblock.com", - "rarbgunblock.org", - "rarbgunblocked.org", - "rarbgway.org", - "raremovie.cc", - "raremovie.net", - "rareview.ac.uk", - "ras.ac.uk", - "rascal.ac.uk", - "rascommunity.ac.uk", - "raspberrypi.org", - "raspbian.org", - "rat.xxx", - "ratedgross.com", - "rateyourmusic.com", - "rationalwiki.org", - "ratx.com", - "rau.ac.uk", - "rave.ac.uk", - "ravemedia.ac.uk", - "ravensbourne.ac.uk", - "ravensbourneuniversitylondon.ac.uk", - "ravm.tv", - "rawgit.com", - "rawgithub.com", - "raxcdn.com", - "razer.com", - "razerofficial.com", - "razersupport.com", - "razerzone.jp", - "razyboard.com", - "rb-crisis.com", - "rb.com", - "rb.gy", - "rb.net", - "rbbusinessshop.com", - "rbc007.com", - "rbdigitalab.com", - "rbdigitallab.com", - "rbe996.com", - "rbeopp.com", - "rbeuroinfo.com", - "rbge.ac.uk", - "rbgkew.ac.uk", - "rbgrads.com", - "rbgraduates.com", - "rbmavericks.com", - "rbnainternational.com", - "rbplc.com", - "rbrandlibrary.com", - "rbsgr.com", - "rbsl.ac.uk", - "rbslondon.ac.uk", - "rbspeakup.com", - "rc-harwell.ac.uk", - "rca.ac.uk", - "rcahmw.ac.uk", - "rcc.ac.uk", - "rcds.ac.uk", - "rcem.ac.uk", - "rcinet.ca", - "rcl.ac.uk", - "rcl07.xyz", - "rclon.com", - "rcm.ac.uk", - "rcnde.ac.uk", - "rcni.ac.uk", - "rcoa.ac.uk", - "rcog.ac.uk", - "rcophth.ac.uk", - "rcp.ac.uk", - "rcpch.ac.uk", - "rcpe.ac.uk", - "rcplondon.ac.uk", - "rcpnorth.ac.uk", - "rcpsg.ac.uk", - "rcpsglasg.ac.uk", - "rcpsych.ac.uk", - "rcr.ac.uk", - "rcs.ac.uk", - "rcsed.ac.uk", - "rcseng.ac.uk", - "rcuk.ac.uk", - "rcukssc.ac.uk", - "rcvs.ac.uk", - "rd.com", - "rdf.ac.uk", - "rdg.ac.uk", - "rdi.ac.uk", - "rdio.com", - "rdmrsc.ac.uk", - "rdnet.ac.uk", - "rds-yes.buzz", - "rdtcdn.com", - "re-net.ac.uk", - "re25.vip", - "rea-asia.com", - "rea-group.com", - "rea.design", - "rea.global", - "rea.io", - "rea.tech", - "reabble.com", - "reach.ac.uk", - "reachingwider.ac.uk", - "reachporn.com", - "reachtheworldonfacebook.com", - "react.com", - "reactjs.com", - "reactjs.org", - "read01.com", - "read100.com", - "readerswivesonline.com", - "reading-college.ac.uk", - "reading.ac.uk", - "readingosi.ac.uk", - "readingtimes.com.tw", - "readmoo.com", - "readthedocs-hosted.com", - "readthedocs.com", - "readthedocs.io", - "readthedocs.org", - "readydown.com", - "readytoresearch.ac.uk", - "real-homemade-movies.com", - "real-mature-porn.com", - "real-thaipussy.com", - "realamericanstories.com", - "realamericanstories.info", - "realamericanstories.net", - "realamericanstories.org", - "realamericanstories.tv", - "realcaledonian.ac.uk", - "realclear.com", - "realclearbooks.com", - "realcleardefense.com", - "realcleareducation.com", - "realclearenergy.org", - "realclearfoundation.org", - "realclearhealth.com", - "realclearhistory.com", - "realclearinvestigations.com", - "realclearlife.com", - "realclearmarkets.com", - "realclearpolicy.com", - "realclearpolitics.com", - "realclearpublicaffairs.com", - "realclearreligion.org", - "realclearscience.com", - "realclearworld.com", - "realcommercial.com.au", - "realcourage.org", - "realcuckoldsex.com", - "realdoll.com", - "realestate.com.au", - "realestatejournal.com", - "realgfporn.com", - "realisingopportunities.ac.uk", - "reality-computing.com", - "realitykings.com", - "reallesbianexposed.com", - "reallifemethods.ac.uk", - "realmaturesfuck.com", - "realmilwaukeenow.com", - "realpeople-realprojects.com", - "realpeoplerealprojects.com", - "realpornclip.com", - "realraptalk.com", - "realsexdoll.com", - "realsexpass.com", - "realteengirls.com", - "realtor.com", - "realtype.co.jp", - "realtype.jp", - "realvision.com", - "realviz.com", - "realzoomovies.com", - "reap.ac.uk", - "reaseheath.ac.uk", - "reason.com", - "reastatic.net", - "reaxys.com", - "rebates.jp", - "rebatesrule.net", - "rebrandly.com", - "rebuildingmacroeconomics.ac.uk", - "recaptcha.net", - "recelebrity.com", - "reckitt.net", - "reckittbenckiser.com", - "reckittbenckiser.net", - "reckittbenckiser.tv", - "reckittprofessional.com", - "recode.net", - "recoiljs.org", - "reconinstruments.com", - "reconjet.com", - "recordhistory.org", - "recordingachievement.ac.uk", - "recovery.org.tw", - "recoveryversion.com.tw", - "recoveryversion.org", - "red-lang.org", - "redamateurtube.com", - "redballoonsolidarity.org", - "redbridge-college.ac.uk", - "redbridge-iae.ac.uk", - "redbridge.ac.uk", - "redbridgeinstitute.ac.uk", - "redbubble.com", - "redcar.ac.uk", - "redchinacn.net", - "redchinacn.org", - "redcliffe.ac.uk", - "redd.it", - "reddit.com", - "reddit.map.fastly.net", - "redditblog.com", - "reddithelp.com", - "redditinc.com", - "redditlist.com", - "redditmail.com", - "redditmedia.com", - "redditspace.com", - "redditstatic.com", - "redditstatus.com", - "redfaptube.com", - "redgifs.com", - "redhat.com", - "redhat.org", - "redhdtube.xxx", - "redhotlabs.com", - "redino.tw", - "redis.io", - "redislabs.com", - "redkix.com", - "redlightcenter.com", - "redmatureporn.com", - "redporn.xxx", - "redporno.cz", - "redpornpictures.com", - "redsexhub.com", - "redteenporn.com", - "redtub3xxx.com", - "redtube.blog", - "redtube.com", - "redtube.com.br", - "redtube9.com", - "redtubepremium.com", - "redvideo.io", - "redwap-xxx.com", - "redwap.me", - "redwap.pro", - "redxxx.cc", - "redxxxvideo.tv", - "redzonechannel.com", - "ree007.xyz", - "reednet.ac.uk", - "ref.ac.uk", - "referer.us", - "reflectivecode.com", - "reform-apple.com", - "refrain.ac.uk", - "regard.ac.uk", - "regener8.ac.uk", - "regent-academy.ac.uk", - "regent-college.ac.uk", - "regentcollegelondon.ac.uk", - "regents-tc.ac.uk", - "regents.ac.uk", - "regentscollege.ac.uk", - "regex101.com", - "regional-studies-assoc.ac.uk", - "regionalhpc.ac.uk", - "regionalsciencecentreoldham.ac.uk", - "regionalvisions.ac.uk", - "regiongold.com", - "registerhulu.com", - "registeridm.com", - "registry.google", - "reid-kerr.ac.uk", - "reidkerr.ac.uk", - "reigate.ac.uk", - "reiporno.com", - "relateinstitute.ac.uk", - "relateiq.com", - "relaxbbs.com", - "relay.com.tw", - "releaseinternational.org", - "religionnews.com", - "religioustolerance.org", - "reload.ac.uk", - "relu.ac.uk", - "rememberingslavery.ac.uk", - "remirepo.net", - "rems-cdt.ac.uk", - "renaissanceskin.ac.uk", - "renchead.com", - "renderos.com", - "reneerossvideos.com", - "renminbao.com", - "renovacionoffice.com", - "renovacionxboxlive.com", - "rentaride.com", - "rentaride.de", - "renu.ac.uk", - "renyurenquan.org", - "renzhe.cloud", - "repe21.com", - "repo.new", - "repositorynet.ac.uk", - "repsils.no", - "repsneakermall.com", - "repswing.com", - "rerc.ac.uk", - "rerouted.org", - "resao.com", - "research-clinician.ac.uk", - "research-councils.ac.uk", - "research-scotland.ac.uk", - "research-socialsciences.ac.uk", - "research.google", - "research4justice.ac.uk", - "researchandcare.org", - "researchconcordat.ac.uk", - "researchers14.ac.uk", - "researchgate.net", - "researchintel.com", - "researchkit.hk", - "researchkit.net", - "researchkit.org", - "researchkit.tv", - "researchscotland.ac.uk", - "researchwales.ac.uk", - "resilient-decarbonised-energy-cdt.ac.uk", - "resilient-decarbonised-energy-dtc.ac.uk", - "resilio.com", - "resistchina.org", - "resl.ac.uk", - "resoubanana.buzz", - "resoubang.buzz", - "resourceshare.ac.uk", - "respawnbyrazer.com", - "restore.ac.uk", - "results.ac.uk", - "rethink.net", - "retimer.com", - "retroclassicporn.com", - "retrohomevideos.com", - "retroxxxmovs.com", - "retweeteffect.com", - "retweetist.com", - "retweetrank.com", - "reurl.cc", - "reut.rs", - "reuters.com", - "reuters.tv", - "reutersagency.cn", - "reutersmedia.net", - "revenue-performance-management.com", - "revit.com", - "revitcc.com", - "revitsucks.net", - "revleft.com", - "revocationcheck.com", - "revolv.com", - "revver.com", - "rewind.ac.uk", - "rewrite-anime.tv", - "rexcha.com", - "rexxx.org", - "rfa.org", - "rfachina.com", - "rfamobile.org", - "rfaweb.org", - "rfdc.ac.uk", - "rferl.org", - "rfhsm.ac.uk", - "rfi.ac.uk", - "rfi.fr", - "rfi.my", - "rgo.ac.uk", - "rgpub.io", - "rgu.ac.uk", - "rh.ac.uk", - "rhacc.ac.uk", - "rhbnc.ac.uk", - "rhcda-aac.ac.uk", - "rhees.ac.uk", - "rhfc.ac.uk", - "rhodeislandbmw.com", - "rhs.ac.uk", - "rhul.ac.uk", - "rhyac.ac.uk", - "rhyw.me", - "rhyw31.life", - "ri.ac.uk", - "ricefever.com", - "richardtaunton.ac.uk", - "richardtaunton6thformcollege.ac.uk", - "richardtauntons.ac.uk", - "richardwilsononline.ac.uk", - "richmond-utcoll.ac.uk", - "richmond.ac.uk", - "richmondbusinessschool.ac.uk", - "richuish.ac.uk", - "ridepenguin.com", - "riding.ac.uk", - "right-2.ac.uk", - "rightbtc.com", - "rightster.com", - "rigpa.org", - "rigums.xyz", - "riku.me", - "rileyguide.com", - "rimg.com.tw", - "rin.ac.uk", - "ring.gr.jp", - "rinvdh7.xyz", - "riot-games.com", - "riot.com", - "riot.im", - "riot.net", - "riotcdn.net", - "riotforgegames.com", - "riotgames.co.kr", - "riotgames.com", - "riotgames.info", - "riotgames.jp", - "riotgames.net", - "riotgames.tv", - "riotpin.com", - "riotpoints.com", - "ripe.net", - "ripon-cuddesdon.ac.uk", - "ripple.com", - "riscl.ac.uk", - "riseholme.ac.uk", - "riseup.net", - "risextube.com", - "ritouki.jp", - "ritter.vg", - "riverside.ac.uk", - "riversidecollege.ac.uk", - "riversidecollegehalton.ac.uk", - "riversidemusiccollege.ac.uk", - "rivic.ac.uk", - "rixcloud.com", - "rixcloud.us", - "rjgsp.buzz", - "rjgsp1.buzz", - "rk.com", - "rl.ac.uk", - "rlcdn.com", - "rlczdo.xyz", - "rlg.ac.uk", - "rln.ac.uk", - "rlo-cetl.ac.uk", - "rluk.ac.uk", - "rlwlw.com", - "rm2029.com", - "rma.ac.uk", - "rmas.ac.uk", - "rmbl.ws", - "rmjdw.com", - "rmjdw132.info", - "rnc.ac.uk", - "rncb.ac.uk", - "rncm.ac.uk", - "rnib-redhill.ac.uk", - "rnibcollege.ac.uk", - "rnibncw.ac.uk", - "rnibvocoll.ac.uk", - "rnn.ac.uk", - "rnngroup.ac.uk", - "ro89.com", - "road-crew.com", - "roadshow.hk", - "robobat.com", - "roboforex.com", - "roborecall.com", - "robotoffice.com", - "robustnessiskey.com", - "rochdalesfc.ac.uk", - "rocket-inc.net", - "rocketbbs.com", - "rocketfishproducts.com", - "rockettube.com", - "rocksdb.com", - "rocksdb.net", - "rocksdb.org", - "rocksextube.com", - "rockstargames.com", - "rodbaston.ac.uk", - "roe.ac.uk", - "roedu.net", - "roehampton-online.ac.uk", - "roehampton.ac.uk", - "roffeypark.ac.uk", - "roisolutions.ac.uk", - "rojo.com", - "roku.com", - "rokutime.com", - "rolfoundation.org", - "rolia.net", - "rolls-roycecullinan.com", - "rolls-roycemotorcars.com", - "rolls-roycemotorcarsna.com", - "roloflix.com", - "roloxxx.com", - "rolsociety.org", - "romanrepublic.ac.uk", - "romansocietyrac.ac.uk", - "romantic-sex-video.com", - "romeo.ac.uk", - "ronjoneswriter.com", - "roodo.com", - "root-signing.ch", - "rootsigning.com", - "rosechina.net", - "rosemarydoll.com", - "rosemount.ac.uk", - "roses.ac.uk", - "rosetta.ac.uk", - "roshy.tv", - "roslin.ac.uk", - "rothamsted.ac.uk", - "rotherham-coll.ac.uk", - "rotherham.ac.uk", - "rothervalley.ac.uk", - "rotten.com", - "rou.video", - "roucdn.link", - "roudao6.buzz", - "roudaosp.cc", - "roughebonysex.com", - "roughman.net", - "roundtable.ac.uk", - "routerboard.com", - "routesintolanguages.ac.uk", - "routledgehandbooks.com", - "rowett.ac.uk", - "rowleycollege.ac.uk", - "royagcol.ac.uk", - "royal-institution.ac.uk", - "royalacademyofmusic.ac.uk", - "royalarmouries.ac.uk", - "royalcams.com", - "royalholloway.ac.uk", - "royalhollowaycommunication.ac.uk", - "royalhollowaycommunications.ac.uk", - "royalhollowayinternational.ac.uk", - "royalhollowayuniforum.ac.uk", - "royalmarsdenschool.ac.uk", - "royalsoc.ac.uk", - "royalsociety.ac.uk", - "royalsocietypublishing.org", - "royce-institute.ac.uk", - "royce.ac.uk", - "roysocmed.ac.uk", - "rpglogs.com", - "rplay.live", - "rpmfusion.org", - "rprimelab.com", - "rps.ac.uk", - "rrl28.buzz", - "rrs1.xyz", - "rrtis.com", - "rs1024.com", - "rs2022.com", - "rsa-ls.ac.uk", - "rsamd.ac.uk", - "rsc-cymru.ac.uk", - "rsc-east-midlands.ac.uk", - "rsc-east.ac.uk", - "rsc-eastern.ac.uk", - "rsc-em.ac.uk", - "rsc-london.ac.uk", - "rsc-ne-scotland.ac.uk", - "rsc-ni.ac.uk", - "rsc-north.ac.uk", - "rsc-northern.ac.uk", - "rsc-northwest.ac.uk", - "rsc-scotland.ac.uk", - "rsc-south-east.ac.uk", - "rsc-southeast.ac.uk", - "rsc-sw-scotland.ac.uk", - "rsc-wales.ac.uk", - "rsc-westmidlands.ac.uk", - "rsc-wm.ac.uk", - "rsc-yh.ac.uk", - "rsc-yorkshire-humber.ac.uk", - "rsc-yorkshire-humberside.ac.uk", - "rsc.org", - "rscem.ac.uk", - "rsd-exeter.ac.uk", - "rsdlmonitor.com", - "rse.ac.uk", - "rsf-chinese.org", - "rsf.org", - "rsg.sc", - "rsgamen.org", - "rslg.ac.uk", - "rslondon.ac.uk", - "rslp.ac.uk", - "rsm.ac.uk", - "rsms.ac.uk", - "rsp.ac.uk", - "rspao.com", - "rsshub.app", - "rssing.com", - "rssmeme.com", - "rstatic.net", - "rt.com", - "rtalabel.org", - "rthk.hk", - "rthk.org.hk", - "rti.org.tw", - "rti.tw", - "rtings.com", - "rtycminnesota.org", - "rua-project.ac.uk", - "ruanyifeng.com", - "ruby-lang.org", - "rubygems.org", - "rude.com", - "rugby-coll.ac.uk", - "rugby-college.ac.uk", - "rugby.ac.uk", - "rugbycoll.ac.uk", - "rugit.ac.uk", - "ruinedking.com", - "rukoebxx.com", - "rukor.org", - "rul.ac.uk", - "rulaisc-tv.buzz", - "rule34.xxx", - "rule34h.com", - "rule34pornvids.com", - "rule34video.com", - "ruleporn.com", - "rumah123.com", - "rumble.com", - "run.app", - "runbtx.com", - "runfission.com", - "runnike.com", - "runningnike.com", - "runporn.com", - "runshaw.ac.uk", - "runshawcollege.ac.uk", - "runwayescorts.com", - "rupress.org", - "ruru.ac.uk", - "rus.ec", - "rushbee.com", - "rushporn.online", - "rushporn.xxx", - "ruskin.ac.uk", - "russell-group.ac.uk", - "russellgroup.ac.uk", - "russianrape.org", - "rust-lang.org", - "rustdesk.com", - "rustup.rs", - "rusvpn.com", - "rutc.ac.uk", - "ruten.com.tw", - "rutherford.ac.uk", - "rutlandcollege.ac.uk", - "rutracker.net", - "rutracker.org", - "rutube.ru", - "ruvideos.net", - "ruyiseek.com", - "rvc.ac.uk", - "rwcmd.ac.uk", - "rxhj.net", - "ryokoyomiuri.co.jp", - "s-bluemix.net", - "s-books.com", - "s-cashonmobile.com", - "s-cat.ac.uk", - "s-cheshire.ac.uk", - "s-cute.com", - "s-dc-msedge.net", - "s-devon.ac.uk", - "s-dragon.org", - "s-microsoft.com", - "s-msedge.net", - "s-msft.com", - "s-msn.com", - "s-nbcnews.com", - "s-rewards.hk", - "s-xoom.com", - "s.team", - "s1heng.com", - "s1s1s1.com", - "s2stagehance.com", - "s3-accelerate.amazonaws.com", - "s3-ap-northeast-1.amazonaws.com", - "s3-ap-southeast-2.amazonaws.com", - "s3.amazonaws.com", - "s3.ap-northeast-1.amazonaws.com", - "s4miniarchive.com", - "s81c.com", - "s8ds5gfm.xyz", - "s8forum.com", - "saasexch.com", - "saasexch.io", - "saboom.com", - "sabuibo.net", - "sac.ac.uk", - "sacduc.com", - "sacks.com", - "saclnet.ac.uk", - "sacom.hk", - "sacredhentai.com", - "sacwg.ac.uk", - "sadistic-v.com", - "sadpanda.us", - "sae.org", - "saeima.lv", - "saerock.com", - "saes.ac.uk", - "saet.ac.uk", - "safa.ac.uk", - "safebooru.org", - "safecampuscommunities.ac.uk", - "safechat.com", - "safeguarddefenders.com", - "safepodnetwork.ac.uk", - "safervpn.com", - "safety.google", - "saffrontech.com", - "sagepub.com", - "sagernet.org", - "sages.ac.uk", - "sahabatsetiasmartone.com", - "sahfos.ac.uk", - "sainsbury-laboratory.ac.uk", - "sainsburycentre.ac.uk", - "sainsburyinstituteforart.ac.uk", - "saintyculture.com", - "saiq.me", - "sakura-paris.org", - "sakuralive.com", - "sakya.org", - "sale-nikeshoes.com", - "salebeatslasteststyle4you.com", - "saleblackfridaydrebeats.com", - "salecheaphandbags.com", - "salesforce.com", - "salesforce.org", - "salesforceiq.com", - "salesforceliveagent.com", - "salesforcemarketingcloud.com", - "salford-col.ac.uk", - "salford.ac.uk", - "salfordcc.ac.uk", - "salfordcitycollege-trinity.ac.uk", - "salfordcitycollege.ac.uk", - "salg.ac.uk", - "salisbury-college.ac.uk", - "salisbury.ac.uk", - "salisbury6c.ac.uk", - "salisburycollege.ac.uk", - "saltash.ac.uk", - "salts.ac.uk", - "salvation.org.hk", - "salvationarmy.ac.uk", - "samair.ru", - "sambaporno.com", - "sambhota.org", - "samc.ac.uk", - "samebags.com", - "sams.ac.uk", - "samsung.com", - "samsungapps.com", - "samsungcloud.com", - "samsungdm.com", - "samsunggalaxyfriends.com", - "samsungknox.com", - "samsungqbe.com", - "sandisk.ae", - "sandisk.co.jp", - "sandisk.co.kr", - "sandisk.co.uk", - "sandisk.com", - "sandisk.com.au", - "sandisk.com.br", - "sandisk.com.tr", - "sandisk.com.tw", - "sandisk.de", - "sandisk.es", - "sandisk.fr", - "sandisk.hk", - "sandisk.id", - "sandisk.in", - "sandisk.it", - "sandisk.nl", - "sandisk.sg", - "sandscotaicentral.com", - "sandwell.ac.uk", - "sandwellcollege.ac.uk", - "sanger.ac.uk", - "sanjesh.org", - "sankakucomplex.com", - "sankei-ad-info.com", - "sankei-ad.net", - "sankei-books.co.jp", - "sankei-call.jp", - "sankei-digital.co.jp", - "sankei-eiga.co.jp", - "sankei-kaihatsu.co.jp", - "sankei-kurashi.com", - "sankei-shougakukai.jp", - "sankei-tours.com", - "sankei.co.jp", - "sankei.com", - "sankei.jp", - "sankeibiz.jp", - "sankeishop.jp", - "sankie.net", - "sanmin.com.tw", - "sans.edu", - "sanspo.com", - "sanvaras.com", - "saobjpg.com", - "saoni91.xyz", - "saonia.xyz", - "saonidh-one.sbs", - "saonidh.world", - "saonidh01.cc", - "sapc.ac.uk", - "sapikachu.net", - "sapphicerotica.com", - "sapphicpornonly.com", - "sapphire.ac.uk", - "sarajevopodopsadom.com", - "sarapbabe.com", - "sarennasworld.com", - "sari.ac.uk", - "sartre.ac.uk", - "sarum.ac.uk", - "sas.ac.uk", - "satan18av.com", - "satnym.com", - "satoshilabs.com", - "satsixthformacademiestrust.ac.uk", - "satv01.me", - "saveliuxiaobo.com", - "savemedia.com", - "savethedate.foo", - "savethesounds.info", - "savetibet.de", - "savetibet.fr", - "savetibet.nl", - "savetibet.org", - "savetibet.ru", - "savetibetstore.org", - "saveuighur.org", - "savevid.com", - "savitabhabhi.com", - "savitabhabhi.vip", - "savitahd.net", - "savoycomputing.com", - "savvyshopper.net.au", - "say2.info", - "saynow.com", - "sb-cd.com", - "sb-mobile.jp", - "sb-telecom.net", - "sb.sb", - "sbc.ac.uk", - "sbgkstv.shop", - "sbirmc.ac.uk", - "sbitravelcard.com", - "sbme.me", - "sbnation.com", - "sbrc-nottingham.ac.uk", - "sbrn.ac.uk", - "sbs.ac.uk", - "sbs.com.au", - "sbu.ac.uk", - "sbusinesslondon.ac.uk", - "sbux.com.my", - "sbuxcard.com", - "sc-cdn.net", - "sc-toolkit.ac.uk", - "sc1.ac.uk", - "sca-tolo.info", - "scaan.ac.uk", - "scadr.ac.uk", - "scae.ac.uk", - "scala-lang.org", - "scala-sbt.org", - "scaleflex.com", - "scaleform.com", - "scandalplanet.com", - "scanlover.com", - "scapa.ac.uk", - "scarb-6-form.ac.uk", - "scarboroughtec.ac.uk", - "scarboroughuniversity.ac.uk", - "scarboroughuniversitycampus.ac.uk", - "scarboroughuniversitycentre.ac.uk", - "scarboroughuniversitycollege.ac.uk", - "scasino.com", - "scat-enema.com", - "scat-japan.com", - "scat-shop.net", - "scat.gold", - "scatfap.com", - "scatfinder.com", - "scathd.com", - "scatkings.com", - "scatnetwork.com", - "scatshop.com", - "scatsite.com", - "scatvids.club", - "scatville.com", - "scc.ac.uk", - "sccb.ac.uk", - "sccc.ac.uk", - "sccjr.ac.uk", - "scct.ac.uk", - "scde.ac.uk", - "scdn.co", - "scene7.com", - "scenesource.me", - "scentro.ac.uk", - "scep.ac.uk", - "scg.ac.uk", - "scharferporno.com", - "schema.org", - "schemer.com", - "schiffvitamins.com", - "schml.ac.uk", - "scholarpedia.org", - "scholarsschool.ac.uk", - "schome.ac.uk", - "schoms.ac.uk", - "school-economic-science.ac.uk", - "sci-hub.ee", - "sci-hub.se", - "sci-hub.st", - "sci.ac.uk", - "sciculture.ac.uk", - "science-museum-group.ac.uk", - "science.com", - "science.org", - "sciencedirect.com", - "sciencedirectassets.com", - "sciencemag.org", - "sciencemuseum.ac.uk", - "sciencemuseumgroup.ac.uk", - "sciencenets.com", - "scienceonline.org", - "sciencesigns.ac.uk", - "scientificamerican.com", - "scientificlinux.org", - "scieron.com", - "scifisex.net", - "scills.ac.uk", - "scilly-acl.ac.uk", - "scinet.ac.uk", - "scip.ac.uk", - "scir.ac.uk", - "scisci.ac.uk", - "scitation.org", - "scitech.ac.uk", - "scival.com", - "sclondon.ac.uk", - "scmp.com", - "scmpchinese.com", - "scnshop.cc", - "scnsrc.me", - "scoc.ac.uk", - "scola.ac.uk", - "scolle.net", - "sconul.ac.uk", - "scoop.sh", - "scoopstudy.ac.uk", - "scop.ac.uk", - "scope-uk.ac.uk", - "scopic.ac.uk", - "scopus.com", - "score.ac.uk", - "scoreclassics.com", - "scorediscounts.club", - "scoregroup.com", - "scoreland.com", - "scoreland2.com", - "scorepass.com", - "scoretv.tv", - "scoreuniverse.com", - "scorevideos.com", - "scot-hip.ac.uk", - "scot-reman.ac.uk", - "scot-ship.ac.uk", - "scot.ac.uk", - "scotcatproject.ac.uk", - "scotchem.ac.uk", - "scotcit.ac.uk", - "scotcol.ac.uk", - "scotdist.ac.uk", - "scotgem.ac.uk", - "scotgrid.ac.uk", - "scotland-aspirenorth.ac.uk", - "scotland-northforum.ac.uk", - "scotlandscolleges.ac.uk", - "scotssyntaxatlas.ac.uk", - "scottishborderscampus.ac.uk", - "scottishciviljustice.ac.uk", - "scottishcollegegovernance.ac.uk", - "scottishcorpus.ac.uk", - "scottishdisabilityteam.ac.uk", - "scottisheconomics.ac.uk", - "scottishelections.ac.uk", - "scottishinsight.ac.uk", - "scottishmarineinstitute.ac.uk", - "scottishresearch.ac.uk", - "scottishresearchpools.ac.uk", - "scottishuniversitygovernance.ac.uk", - "scp-wiki.net", - "scpdb.org", - "scphrp.ac.uk", - "scpic.net", - "scpr.ac.uk", - "scpwiki.com", - "scramble.io", - "scrambledmessages.ac.uk", - "scran.ac.uk", - "scre.ac.uk", - "screenacademyscotland.ac.uk", - "screenfilmschool.ac.uk", - "screens-lab.jp", - "screenspace.ac.uk", - "screenwisetrends.com", - "screenwisetrendspanel.com", - "screw-my-wife.com", - "scri.ac.uk", - "scribd.com", - "scriptspot.com", - "scrolla.ac.uk", - "scrolller.com", - "scrr.ac.uk", - "scrsj.ac.uk", - "sculpoly.com", - "scunthorpeinstituteoftechnology.ac.uk", - "scurl.ac.uk", - "scutrea.ac.uk", - "scva.ac.uk", - "scvs.ac.uk", - "scweims.ac.uk", - "sda.ac.uk", - "sdc.ac.uk", - "sdcountybmw.com", - "sdeo.ac.uk", - "sdf.ac.uk", - "sdhi.ac.uk", - "sdn.ac.uk", - "sdnice.one", - "sdnitube.buzz", - "sdos.ac.uk", - "sdss.ac.uk", - "sdt.ac.uk", - "se-derbys.ac.uk", - "se-essex-college.ac.uk", - "sea-mammal-research-unit.ac.uk", - "seacams.ac.uk", - "seagroup.com", - "seaha-cdt.ac.uk", - "seamonkey-project.org", - "seancody.com", - "seaofsolitude.com", - "seaporn.org", - "seapuff.com", - "search.ac.uk", - "search.com", - "search.xxx", - "search25.ac.uk", - "searchtruth.com", - "searx.me", - "seas.ac.uk", - "seasidestory.tokyo", - "seatguru.com", - "seattlefdc.com", - "secom.co.jp", - "secomtrust.net", - "second-ns.com", - "second-ns.de", - "secret-flirt-hub.com", - "secretbabes.co.uk", - "secretchina.com", - "secretgarden.no", - "secretsline.biz", - "secretubes.com", - "sectigo.com", - "secure-paypal.info", - "secureharvests.ac.uk", - "securepaypal.info", - "secureservercdn.net", - "securetunnel.com", - "securityinabox.org", - "securitykiss.com", - "seda.ac.uk", - "sedc.ac.uk", - "sedg.ac.uk", - "see.xxx", - "seecoll.ac.uk", - "seed4.me", - "seedmov18.com", - "seedstor.ac.uk", - "seehorsepenis.com", - "seehua.com", - "seeingspeech.ac.uk", - "seematureporn.com", - "seemilfporn.com", - "seemygf.com", - "seemyporn.com", - "seesmic.com", - "seevic-college.ac.uk", - "seevic.ac.uk", - "seevpn.com", - "seezone.net", - "sefton-acl.ac.uk", - "sefton.ac.uk", - "sego8.cc", - "sego8.co", - "sego8.xyz", - "sehuatang.net", - "sehuatang.org", - "seintiaucymru.ac.uk", - "seiroganmania.com", - "seiron-sankei.com", - "sejie.com", - "sejie80.com", - "seju.life", - "seksmet.nl", - "sekswebsite.nl", - "sekur1213.guru", - "selby.ac.uk", - "selcog.ac.uk", - "seldensociety.ac.uk", - "selectanescort.com", - "selectyourgame.com", - "selfloversworld.com", - "sellclassics.com", - "sellercommunity.com", - "sellyoak.ac.uk", - "selsey.ac.uk", - "semanticaudio.ac.uk", - "semanticscholar.org", - "sena.co.kr", - "senatehouselibrary.ac.uk", - "sendsmtp.com", - "sendspace.com", - "seneporno.com", - "seniortgp.com", - "senpaiheat.com", - "sense-east.ac.uk", - "sensorcity.ac.uk", - "sensortower.com", - "sensorynetworks.com", - "senss-dtp.ac.uk", - "sensualgirls.org", - "sensualmothers.com", - "sensueel.net", - "sentry.io", - "senzuritv.net", - "sepnet.ac.uk", - "seqing.one", - "seqingwangzhan.pro", - "seqingx.com", - "sequence.com", - "ser7.cc", - "sera.ac.uk", - "seraph.me", - "serbiporno.net", - "serc.ac.uk", - "serena.ac.uk", - "serialssolutions.com", - "serio.ac.uk", - "serl.ac.uk", - "serlucap.lol", - "serlutv258.xyz", - "servehttp.com", - "serverfault.com", - "serverlesslibrary.net", - "serveuser.com", - "serveusers.com", - "services-apple.net", - "services-exchange.com", - "serviceshp.com", - "servicetalk.io", - "serving-sys.com", - "serviporno.com", - "ses.ac.uk", - "sesawe.net", - "sesawe.org", - "seselah.com", - "sesenovel.com", - "sesez.com", - "sessoamatorialeitaliano.com", - "setapp.com", - "sethwklein.net", - "seti.ac.uk", - "setn.com", - "setsquared.ac.uk", - "settv.com.tw", - "setty.com.tw", - "sevenload.com", - "severeporn.com", - "severreal.org", - "sevgikurtulmaz.com", - "sex-11.com", - "sex-amateur-clips.com", - "sex-av.com", - "sex-douga.jp", - "sex-for-work.com", - "sex-gif.org", - "sex-hay.pro", - "sex-hot-sites.com", - "sex-ly.com", - "sex-teen.net", - "sex-young.com", - "sex.cam", - "sex.com", - "sex.sex", - "sex.xxx", - "sex0098.com", - "sex021.net", - "sex3.com", - "sex3.mobi", - "sex4arabxxx.com", - "sex588.net", - "sex8.cc", - "sexaidh.com", - "sexalarab.com", - "sexandsplash.com", - "sexandsubmission.com", - "sexanimalvideos.com", - "sexanime.net", - "sexarea.org", - "sexasia.net", - "sexavidols.com", - "sexbebin.com", - "sexbomba.ru", - "sexbombo.com", - "sexbookecuador.com", - "sexbot.com", - "sexbq.com", - "sexcartoon.biz", - "sexcelebrity.net", - "sexcord.com", - "sexdollpornhd.com", - "sexdolls.com", - "sexdollsshow.com", - "sexdug.com", - "sexecherche.com", - "sexedanslepre.net", - "sexei.net", - "sexemulator.com", - "sexfilm4free.com", - "sexfilmeporno.com", - "sexfilmstube.com", - "sexfl.xyz", - "sexflashgame.org", - "sexflexible.com", - "sexgalaxy.net", - "sexgame.com", - "sexgamefun.com", - "sexgames.cc", - "sexgames.xxx", - "sexgamesbox.com", - "sexgamesclub.com", - "sexguide.ro", - "sexhd.fun", - "sexhd.pics", - "sexhdmovs.com", - "sexhotgames.com", - "sexhu.com", - "sexhuang.com", - "sexhub.red", - "sexhubhd.com", - "sexidude.com", - "sexifilm.top", - "sexiframe.com", - "sexindians.cc", - "sexinsex.net", - "sexiranian.party", - "sexjk.com", - "sexjobs.it", - "sexkomix2.com", - "sexkorea.net", - "sexlikereal.com", - "sexmadeathome.com", - "sexmature.club", - "sexmerci.com", - "sexmex.xxx", - "sexmix.net", - "sexmomsex.com", - "sexmovies24.com", - "sexmummy.com", - "sexmutant.com", - "sexnaweb.net", - "sexnudo.com", - "sexo123.net", - "sexodama.com", - "sexodeamor.com", - "sexopornolive.com", - "sexoquente.blog", - "sexpornimg.com", - "sexpornpictures.com", - "sexpornvideoasian.com", - "sexsaoy.com", - "sexsex1.com", - "sexsiam.com", - "sexsim.com", - "sexsimulator.com", - "sexsiteinc.com", - "sexstoriespost.com", - "sextb.net", - "sextime.tv", - "sextop.net", - "sextop1.net", - "sextorso.com", - "sextoystop.com", - "sextreffen-portale.com", - "sextreffensite.com", - "sextube.desi", - "sextube.fm", - "sextube69free.net", - "sextubebox.com", - "sextubedot.com", - "sextubehub.com", - "sextubeset.com", - "sextubespot.com", - "sextubexxl.com", - "sextubish.com", - "sextvx.com", - "sextw.net", - "sexu.com", - "sexualhentai.net", - "sexuria.com", - "sexvid.xxx", - "sexvideo10.com", - "sexvideo12com.pro", - "sexvideos.host", - "sexvideos.tel", - "sexvideosxxx.mobi", - "sexvids.cc", - "sexvr.com", - "sexwebvideo.com", - "sexwenheav.shop", - "sexwithhorse.net", - "sexxhd.de", - "sexxx8.xyz", - "sexxxdoll.com", - "sexxxtape.net", - "sexxxx.rodeo", - "sexxxxfilms.com", - "sexxxy.biz", - "sexy-babe-pics.com", - "sexy-beauties.com", - "sexy-models.net", - "sexy-more.com", - "sexy-older-women.com", - "sexy-photos.net", - "sexy-torrents.com", - "sexy3dtoon.com", - "sexyandfunny.com", - "sexyasiangirls.cc", - "sexyavenue.com", - "sexybabesz.com", - "sexycandidgirls.com", - "sexyculo.com", - "sexyfeet.tv", - "sexyfuckgames.com", - "sexyfucking.ru", - "sexygirlfriendtube.com", - "sexygirlspics.com", - "sexyhomewives.com", - "sexyhub.com", - "sexyhumorgames.com", - "sexykittenporn.com", - "sexyoung.me", - "sexypornpictures.org", - "sexyseeker.com", - "sexysexdoll.com", - "sexysites.com.ph", - "sexyteenssite.com", - "sexytuber.com", - "sexywetpussy.com", - "sexzy4.com", - "sf.net", - "sfbassets.com", - "sfbassets.net", - "sfc.ac.uk", - "sfdcstatic.com", - "sfefc.ac.uk", - "sfeu.ac.uk", - "sfhub.ac.uk", - "sfileydy.com", - "sfmcompile.club", - "sforce.com", - "sfps.ac.uk", - "sfra.ac.uk", - "sfs.ac.uk", - "sfshibao.com", - "sfsstudents.ac.uk", - "sftindia.org", - "sftuk.org", - "sfx.ac.uk", - "sfx.ms", - "sfxc.ac.uk", - "sg120.me", - "sg1lib.org", - "sgeulnagaidhlig.ac.uk", - "sghms.ac.uk", - "sgiliaith.ac.uk", - "sgm.ac.uk", - "sgmc.ac.uk", - "sgp1.fun", - "sgpe.ac.uk", - "sgsah.ac.uk", - "sgscol.ac.uk", - "sgspe.de", - "sgspt.buzz", - "sgsss.ac.uk", - "sgul.ac.uk", - "sgwritings.com", - "sgzhan.com", - "sh-xuxingda.com", - "sh83.xyz", - "shadbase.com", - "shadeyouvpn.com", - "shadow.ma", - "shadowcomplex.com", - "shadowsky.xyz", - "shadowslaves.com", - "shadowsocks-r.com", - "shadowsocks.asia", - "shadowsocks.be", - "shadowsocks.com", - "shadowsocks.com.hk", - "shadowsocks.nl", - "shadowsocks.org", - "shadowsocks9.com", - "shafaqna.com", - "shahit.biz", - "shahvani.com", - "shahvani.site", - "shakethesnake.com", - "shambalapost.com", - "shambhalasun.com", - "shameless.com", - "shangfang.org", - "shanxivideo.com", - "shapelcounset.xyz", - "shapeservices.com", - "sharebee.com", - "sharecool.org", - "shared-ed.ac.uk", - "shared-es.ac.uk", - "sharedsolutions.ac.uk", - "sharegeo.ac.uk", - "sharepoint.com", - "sharepointonline.com", - "sharethis.com", - "sharif.edu", - "sharif.ir", - "sharingpractice.ac.uk", - "sharizelvideos.com", - "sharks-lagoon.fr", - "sharkyporn.com", - "sharmota.com", - "sharpdaily.com.hk", - "sharpdaily.hk", - "sharpdaily.tw", - "shat-tibet.com", - "shattered.io", - "shazam.com", - "shc.ac.uk", - "shdd.ink", - "shdf.ac.uk", - "sheef.ac.uk", - "sheets.new", - "shef.ac.uk", - "shefc.ac.uk", - "sheffcol.ac.uk", - "sheffield-hallam.ac.uk", - "sheffield-lls.ac.uk", - "sheffield.ac.uk", - "sheffield2.ac.uk", - "sheffieldcareersfairs.ac.uk", - "sheffieldcetle.ac.uk", - "sheffieldlegalfair.ac.uk", - "sheffieldrobotics.ac.uk", - "sheflix.com", - "shegg.com", - "shegods.com", - "sheikyermami.com", - "sheilingcollege.ac.uk", - "shelfstuff.com", - "shellcheck.net", - "shellfire.de", - "shemale-porn-galls.com", - "shemalebestlabel.com", - "shemalehd.sex", - "shemaleleaks.com", - "shemalemodelstube.com", - "shemaleporn.fun", - "shemaleporn.xxx", - "shemalepornonly.com", - "shemaleporntube.tv", - "shemalespoiledwhore.com", - "shemalestardb.com", - "shemalestube.com", - "shemaletrannypics.com", - "shemaletube.pro", - "shemaletubevideos.com", - "shemalez.com", - "shenasimon.ac.uk", - "shenshi-cha.com", - "shenshou.org", - "shenyun.com", - "shenyun.org", - "shenyuncreations.com", - "shenyunperformingarts.org", - "shenyunshop.com", - "shenzhoufilm.com", - "shenzhouzhengdao.org", - "sheppeycollege.ac.uk", - "shequ8.cam", - "shequdaohang.com", - "sherabgyaltsen.com", - "sherif.ac.uk", - "sherpa-leap.ac.uk", - "sherpa.ac.uk", - "shesfreaky.com", - "sheshaft.com", - "shiatv.net", - "shibashuwu.net", - "shicheng.org", - "shields.io", - "shikorina.net", - "shiksha.com", - "shiksha.ws", - "shinhangmc.com", - "shinychan.com", - "shipcamouflage.com", - "shiplay.ac.uk", - "shipley.ac.uk", - "shireyishunjian.com", - "shiroutoav.net", - "shishijump001.com", - "shit-porn.net", - "shitaotv.org", - "shithd.com", - "shitjav.com", - "shittytube.com", - "shixiao.org", - "shizhao.org", - "shkspr.mobi", - "shockingmovies.com", - "shodanhq.com", - "shoers.com", - "shoestop2.com", - "shooshtime.com", - "shootershill.ac.uk", - "shop-headphones.net", - "shop.app", - "shop2000.com.tw", - "shopbeatsdre.com", - "shopbmwmotorcycles.com", - "shopbmwusa.com", - "shopbydre.com", - "shopcustomizedbeats.com", - "shopdisney.com", - "shopdrebeats.com", - "shopdurex.com", - "shopee.cl", - "shopee.co.id", - "shopee.co.th", - "shopee.com", - "shopee.com.br", - "shopee.com.co", - "shopee.com.mx", - "shopee.com.my", - "shopee.es", - "shopee.fr", - "shopee.id", - "shopee.in", - "shopee.io", - "shopee.ph", - "shopee.sg", - "shopee.tw", - "shopee.vn", - "shopeemobile.com", - "shopfacebook.com", - "shopibay.net", - "shopify.com", - "shopify.dev", - "shopifycdn.com", - "shopifycloud.com", - "shopifystatus.com", - "shopifysvc.com", - "shoping.com", - "shopminiusa.com", - "shopmonsterbeats.com", - "shoppercentre.com", - "shopping-days.net", - "shopping.com", - "shoppinguheadphones.com", - "shops-disney.com", - "shopspeedtv.com", - "shoptraivip.com", - "shorturl.at", - "shotgridsoftware.com", - "shotgridstudio.com", - "shotguncloud.com", - "shotgunfx.com", - "shotgunlocalhost.com", - "shotgunsoftware.com", - "shotgunsoftware.net", - "shotgunstudio-test.com", - "shotgunstudio.com", - "shotgunvfx.com", - "shotwithgeforce.com", - "showhaotu.com", - "shownote.com", - "showtime.com", - "showtime.jp", - "showtimeanytime.com", - "showup.tv", - "showwe.tw", - "showybeauty.com", - "shp.ee", - "shrewsbury.ac.uk", - "shrimpia.network", - "shrkurl.com", - "shsh201.com", - "shu.ac.uk", - "shuangmawei.xyz", - "shufflesex.com", - "shutterstock.com", - "shuttleworth.ac.uk", - "shuttleworthcollege.ac.uk", - "shuziyimin.org", - "shvoong.com", - "shwchurch.org", - "shwchurch3.com", - "shwebank.com", - "shymysex.com", - "shywifeswap.com", - "siam.org", - "sibreal.org", - "sicsa.ac.uk", - "siddharthasintent.org", - "side.ac.uk", - "sidelinesnews.com", - "sidelinessportseatery.com", - "sie.ac.uk", - "siege-amazon.com", - "sierrafriendsoftibet.org", - "sifa.ac.uk", - "sifangclub.com", - "sigma-cetl.ac.uk", - "sigma-network.ac.uk", - "sigmoidoscopeexam.com", - "sign.ac.uk", - "sign.new", - "signal.art", - "signal.org", - "signalbar.com", - "signalprocessingsociety.org", - "signalr.net", - "signalusers.org", - "sihe.ac.uk", - "sijihuisuo.club", - "sijihuisuo.com", - "sikh-uni.ac.uk", - "sikiswap.com", - "silkbook.com", - "silkengirl.com", - "silverchair-cdn.com", - "silversluts.com", - "simbios.ac.uk", - "simbolostwitter.com", - "simcity-buildit.com", - "simcity.com", - "simg.jp", - "simgbb.com", - "simian.ac.uk", - "similar-porn.fun", - "simility.com", - "simonsgirls.com", - "simpcity.su", - "simplecd.org", - "simpleproductivityblog.com", - "simplify.com", - "simplifycommerce.com", - "simply-hentai.com", - "simplyipod.com", - "simsquad.com", - "simulationsquad.com", - "sina.com", - "sina.com.hk", - "sina.com.tw", - "sinapse.ac.uk", - "sinchew.com.my", - "sinchew.my", - "sinet.ac.uk", - "sing4.lat", - "sing68.com", - "singaporepools.com.sg", - "singfortibet.com", - "singlelogin.app", - "singlelogin.me", - "singlelogin.re", - "singlelogin.site", - "singpao.com.hk", - "singtao.ca", - "singtao.com", - "singtaobooks.com", - "singtaola.com", - "singtaonewscorp.com", - "singtaoopo.com", - "singtaousa.com", - "sinica.ac.uk", - "sino-cs.ac.uk", - "sino-monthly.com", - "sinoants.com", - "sinoca.com", - "sinocast.com", - "sinocism.com", - "sinoinsider.com", - "sinomontreal.ca", - "sinonet.ca", - "sinopitt.info", - "sinoquebec.com", - "sinto.ac.uk", - "sip.ac.uk", - "sipher.ac.uk", - "sipml5.org", - "siport.com", - "sipr.ac.uk", - "sipriyearbook.org", - "sircharleslyellcentre.ac.uk", - "sire.ac.uk", - "sirenxxxstudios.com", - "siri.com", - "sirius.ac.uk", - "sirm.ac.uk", - "sis.la", - "sis.xxx", - "sis001.com", - "sis001.us", - "siscache.com", - "siser.ac.uk", - "sisisl.com", - "siska.video", - "sislovesme.com", - "sissc.ac.uk", - "sissy-university.com", - "sissy.eu.org", - "sissy.game", - "sissyporncrossdresser.com", - "site.com", - "site2unblock.com", - "site90.net", - "sitebro.tw", - "sitekreator.com", - "sitemaps.org", - "sitepoint.com", - "siterips.org", - "siteripz.com", - "siteripz.net", - "siti.ac.uk", - "situero.com", - "siva.ac.uk", - "six-degrees.io", - "six9dy.pw", - "sixte.st", - "sixth.biz", - "sjcollect.com", - "sjd.ac.uk", - "sjhsp1.buzz", - "sjr.ac.uk", - "sjrt.org", - "sjum.cn", - "skate2.com", - "skebetter.com", - "skegnesstec.ac.uk", - "skelmersdale.ac.uk", - "sketchappsources.com", - "sketchbookdesigner.com", - "sketchbookmobile.com", - "sketchbooknews.com", - "sketchbookpro.com", - "skillsbridge.ac.uk", - "skillscompetitionwales.ac.uk", - "skillsgroupuk.ac.uk", - "skillshare.com", - "skillswestyorks.ac.uk", - "skimtube.com", - "skinstrip.net", - "skk.moe", - "skokka.com", - "sksarab.top", - "skunkgirl.cc", - "sky.com", - "skyassets.com", - "skybet.com", - "skyking.com.tw", - "skykiwi.com", - "skymansion.net", - "skymatter.com", - "skynet.be", - "skyoceanrescue.com", - "skyoceanrescue.de", - "skyoceanrescue.it", - "skype.com", - "skype.net", - "skypeassets.com", - "skypeassets.net", - "skyperfectjsat.space", - "skyperfectv.co.jp", - "skyporn.online", - "skyrmions.ac.uk", - "skysports.com", - "skysports.fr", - "skysports.ie", - "skysportsonline.com", - "skysportsracing.com", - "skyvegas.com", - "skyxvpn.com", - "sl-reverse.com", - "sl99mod.buzz", - "slack-core.com", - "slack-edge.com", - "slack-files.com", - "slack-imgs.com", - "slack-msgs.com", - "slack-redir.net", - "slack.com", - "slackb.com", - "slackcertified.com", - "slackdemo.com", - "slacker.com", - "slackhq.com", - "slandr.net", - "slashdot.org", - "slashine.onl", - "slaytizle.com", - "slc.ac.uk", - "slcollege.ac.uk", - "slcs.ac.uk", - "sldo.ac.uk", - "sldolls.com", - "sleaford.ac.uk", - "sleazydream.com", - "sleazyneasy.com", - "sleepandwakefulnessresearch.ac.uk", - "slg.ac.uk", - "slheng.com", - "sli-institute.ac.uk", - "slickvpn.com", - "slides.new", - "slideshare.com", - "slideshare.net", - "slidesharecdn.com", - "slime.com.tw", - "sling.com", - "slinginternational.com", - "slingshot.co.nz", - "slinkset.com", - "sloan.ac.uk", - "slobodnaevropa.mk", - "slotbitches.com", - "slsa.ac.uk", - "slss.ac.uk", - "slt-cdt.ac.uk", - "slutload.com", - "slutmoonbeam.com", - "sluts.xyz", - "sluttyrat.com", - "slyip.com", - "slyip.net", - "sm-miracle.com", - "sm.ms", - "sm3ha.ru", - "sma.ac.uk", - "small-angle.ac.uk", - "smallteenpussy.com", - "smart-edge.com", - "smart.ac.uk", - "smartcommunitiescoalition.com", - "smartcommunitiescoalition.org", - "smartdnsproxy.com", - "smartexpos.com", - "smartfea.com", - "smarthide.com", - "smartline.com.au", - "smartmailcloud.com", - "smartnastran.com", - "smartone.com", - "smartoneholdings.com", - "smartonerobotics.com", - "smartonesolutions.com.hk", - "smartonesolutions.hk", - "smashed.xxx", - "smashwords.com", - "smbgroup.ac.uk", - "smc.ac.uk", - "smca.ac.uk", - "smcblackburn.ac.uk", - "smchbooks.com", - "smcl.ac.uk", - "smedevelopmentbank.com.mm", - "smg.ac.uk", - "smh.com.au", - "smhric.org", - "smi.ac.uk", - "smith.edu", - "smithinst.ac.uk", - "sml.ac.uk", - "smmsp.xyz", - "smokinmovies.com", - "smplace.com", - "smpte.org", - "smru.ac.uk", - "smsj.ac.uk", - "smstc.ac.uk", - "smu.ac.uk", - "smuc.ac.uk", - "smucb.ac.uk", - "smul.ac.uk", - "smutcam.com", - "smutcams.com", - "smutindia.com", - "smutstone.com", - "smutty.com", - "smuttymoms.com", - "smyw.org", - "smyxy.org", - "snap-dev.net", - "snap-telemetry.io", - "snap.com", - "snapads.com", - "snapchat.com", - "snapcraft.io", - "snapdragon.cn", - "snapdragonbooth.com", - "snapkit.co", - "snapseed.com", - "snapstore.io", - "snaptu.com", - "snapvolumes.com", - "snapwebcams.com", - "snc.ac.uk", - "sndcdn.com", - "sneaker666.com", - "sneakerpage.net", - "sneakerskick.com", - "sneakme.net", - "snjulebu.com", - "snk-corp.co.jp", - "snkplaymore.info", - "snow.me", - "snowcorp.com", - "snowlionpub.com", - "snowmiku.com", - "snug.ac.uk", - "so-net.ne.jp", - "so-net.net.tw", - "soas.ac.uk", - "soasta-dswb.com", - "soav.com", - "sobees.com", - "soc.ac.uk", - "soc.mil", - "socailcam.com", - "socalbmw.com", - "socbcdt.ac.uk", - "soccerfanz.com.my", - "soccerfinancier.ca", - "soccermatchpass.com", - "socdm.com", - "social.com", - "social.edu.ci", - "socialblade.com", - "socialcam.com", - "socialcammail.com", - "socialkam.com", - "socialmediagirls.com", - "socialpolicy.ac.uk", - "socialsciences.ac.uk", - "socialwhale.com", - "societycentral.ac.uk", - "societyofjewelleryhistorians.ac.uk", - "societyoflegalscholars.ac.uk", - "sociolotron.com", - "socks-proxy.net", - "sockscap64.com", - "sockslist.net", - "socrec.org", - "socres.ac.uk", - "socsciscotland.ac.uk", - "sod.co.jp", - "soficdt.ac.uk", - "softbank-ipo.com", - "softbank-jp.com", - "softbank-robotics.com", - "softbank-telecom.com", - "softbank-telecom.net", - "softbank.jp", - "softbank.tv", - "softbankbb.com", - "softbankbb.net", - "softbankci.com", - "softbankhawksstore.jp", - "softbankmobile.net", - "softbankrobotics.com", - "softbanktelecom.com", - "softbankusa.net", - "softbankventuresasia.com", - "softbankworld.com", - "softeng-support.ac.uk", - "softether-download.com", - "softether.co.jp", - "softether.org", - "softfamous.com", - "softlayer.net", - "softmattercdt.ac.uk", - "softmodels.net", - "softnology.biz", - "softonic.cn", - "softsmirror.cf", - "software.ac.uk", - "softwarebychuck.com", - "softwareoutlook.ac.uk", - "sogclub.com", - "sogoo.org", - "sogrady.me", - "soh.tw", - "sohcradio.com", - "sohfrance.org", - "soifind.com", - "soillse.ac.uk", - "sojiy1124.top", - "sokamonline.com", - "sokmil.com", - "solana.com", - "solarcity.com", - "solent-university.ac.uk", - "solent.ac.uk", - "solentmarineacademy.ac.uk", - "solentuniversity.ac.uk", - "solidaritetibet.org", - "solidfiles.com", - "solihull.ac.uk", - "solihullsfc.ac.uk", - "solostudioksale.com", - "solsfc.ac.uk", - "solutions-worcestershire.ac.uk", - "solv.finance", - "solveforx.com", - "somee.com", - "somerset.ac.uk", - "somersetcolleges.ac.uk", - "songjianjun.com", - "sonicbbs.cc", - "sonidodelaesperanza.org", - "sonorousporn.com", - "sony-africa.com", - "sony-asia.com", - "sony-europe.com", - "sony-hes.co.jp", - "sony-latin.com", - "sony-mea.com", - "sony-olympus-medical.com", - "sony-promotion.eu", - "sony-semicon.co.jp", - "sony-semicon.com", - "sony.at", - "sony.ba", - "sony.be", - "sony.bg", - "sony.biz", - "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.com", - "sonybuilding.jp", - "sonyclassics.com", - "sonydesign.com", - "sonydna.com", - "sonyentertainmentnetwork.com", - "sonyglobalsolutions.jp", - "sonykigyo.jp", - "sonylatvija.com", - "sonynetwork.co.jp", - "sonypcl.jp", - "sonypictures.com", - "sonypicturesanimation.com", - "sonypicturesmuseum.com", - "sonypicturesstudios.com", - "sonypicturestelevision.com", - "sonypicturestelevisiongames.com", - "sonyprotechnosupport.co.jp", - "sonystoragemedia.co.jp", - "sonytc.co.jp", - "soolakhi.com", - "soooyinfor.lol", - "sopcast.com", - "sopcast.org", - "sophos.com", - "soporn.com", - "sora.com", - "sora6.com", - "sorazone.net", - "sorcerersarena.com", - "sorting-algorithms.com", - "sos.org", - "sos44.com", - "soso7778.com", - "sosreader.com", - "sostibet.org", - "sothebys-institute.ac.uk", - "soton.ac.uk", - "sots.ac.uk", - "sotwe.com", - "sou-tong.org", - "soubory.com", - "souka.xyz", - "soul-plus.net", - "soulcaliburhentai.net", - "soumo.info", - "sound-heritage.ac.uk", - "soundcloud.com", - "soundofhope.eu", - "soundofhope.kr", - "soundofhope.org", - "soundon.fm", - "soundsoftware.ac.uk", - "soundwell.ac.uk", - "soup.io", - "soupofmedia.com", - "source.ac.uk", - "sourceforge.com", - "sourceforge.net", - "sourcehut.org", - "sourcewadio.com", - "sourcingforebay.com.cn", - "sourcingforebay.net", - "sourcingforebay.tv", - "south-lanarkshire-college.ac.uk", - "south-plus.net", - "south-plus.org", - "south-thames.ac.uk", - "southampton-city.ac.uk", - "southampton-institute.ac.uk", - "southampton-solent-university.ac.uk", - "southampton.ac.uk", - "southamptonalumni.ac.uk", - "southamptonbusiness.ac.uk", - "southamptonsolentuniversity.ac.uk", - "southbank-university.ac.uk", - "southcheshirecollege.ac.uk", - "southcoastdtp.ac.uk", - "southcoll-bolton.ac.uk", - "southdevon.ac.uk", - "southdowns.ac.uk", - "southeastdtc.ac.uk", - "southeastessex.ac.uk", - "southend-acl-college.ac.uk", - "southend-adult.ac.uk", - "southend.ac.uk", - "southendcollege.ac.uk", - "southessex.ac.uk", - "southessexcollege.ac.uk", - "southfloridamini.com", - "southgate.ac.uk", - "southgrid.ac.uk", - "southkent.ac.uk", - "southnews.com.tw", - "southport-college.ac.uk", - "southport.ac.uk", - "southsefton6thform.ac.uk", - "southsefton6thformcollege.ac.uk", - "southseftoncollege.ac.uk", - "southstaffs.ac.uk", - "southwales.ac.uk", - "southwark.ac.uk", - "southwestcollege.ac.uk", - "southwestiot.ac.uk", - "southwestnuclearhub.ac.uk", - "sovec.net", - "sowers.org.hk", - "sowiki.net", - "soyinyj.top", - "soylent.com", - "soylentnews.org", - "sp.cool", - "spa.ac.uk", - "spaceexplored.com", - "spacely.com.au", - "spacemail.com", - "spaceship.com", - "spaceuniversitiesnetwork.ac.uk", - "spaceweather.ac.uk", - "spacex.com", - "spaindisney.com", - "spalding.ac.uk", - "span.ac.uk", - "spankandbang.com", - "spankbang.com", - "spankbang.party", - "spankbang1.com", - "spanking.wiki", - "spankingstudio.com", - "spankingtube.com", - "spankmonster.com", - "spankred3d.com", - "spankwire.com", - "sparc.ac.uk", - "sparqs.ac.uk", - "sparsholt.ac.uk", - "sparsholtcollegegroup.ac.uk", - "sparsholtcollegeservices.ac.uk", - "sparsholtservices.ac.uk", - "spatial.io", - "spatialeconomics.ac.uk", - "spb.com", - "spc.ac.uk", - "spcc-sp.com", - "spcollege.ac.uk", - "speakerdeck.com", - "spearhead.kr", - "specialtyheadphones.com", - "spectraltube.com", - "spectrum.ac.uk", - "speeddreamride.com", - "speedfantasybid.com", - "speedhunters.com", - "speedify.com", - "speedproject.ac.uk", - "speedracegear.com", - "speedrun.com", - "speedtest.com.hk", - "speedxtra.com", - "spektral.cc", - "spelthorne.ac.uk", - "spem.at", - "spencertipping.com", - "spendee.com", - "spermyporn.com", - "spero.ac.uk", - "speybay.com", - "spice.ac.uk", - "spicebar.de", - "spicevpn.com", - "spiceworks.com", - "spiceworksstatic.com", - "spicybigtits.com", - "spider.ac.uk", - "spideroak.com", - "spiedigitallibrary.org", - "spiegel.de", - "spike.com", - "spinesurgeons.ac.uk", - "spiritclubs.com", - "spiritofecstasy.com", - "spiritstudios.ac.uk", - "spitfire.ac.uk", - "spizoo.com", - "splatoon2tournament.com", - "splint-cetl.ac.uk", - "spokenword.ac.uk", - "sponichi.co.jp", - "spore.com", - "sportsfacebook.com", - "sportstream.com", - "sportswomanoftheyear.co.uk", - "sportswomenoftheyear.co.uk", - "spotflux.com", - "spoti.fi", - "spotify-everywhere.com", - "spotify.com", - "spotify.design", - "spotify.map.fastly.net", - "spotify.map.fastlylb.net", - "spotifycdn.com", - "spotifycdn.net", - "spotifycharts.com", - "spotifycodes.com", - "spotifyforbrands.com", - "spotifyjobs.com", - "spr.ac.uk", - "spraynwash.com", - "spreadprivacy.com", - "spreadshirt.es", - "sprg.ac.uk", - "spring-plus.net", - "spring4u.info", - "springboardplatform.com", - "springer.com", - "springerlink.com", - "springernature.com", - "springwood.me", - "sprinklesapp.com", - "sprint.ac.uk", - "sprite.org", - "sproutcore.com", - "sproxy.info", - "spsrn.ac.uk", - "sptvbroadcast.com", - "spurgeons.ac.uk", - "spyjinx.com", - "sqhwesternconsortium.ac.uk", - "sqlite.org", - "sqlserveronlinux.com", - "squ1.com", - "squarecapital.com", - "squarecdn.com", - "squarecloudservices.com", - "squarefoot.com.hk", - "squareup.com", - "squidplatform.com", - "squirly.info", - "squirrelgroup.net", - "squirrelvpn.com", - "sqyzh-dh.sbs", - "sr.ht", - "src.ac.uk", - "srebrenica360.com", - "srf.ac.uk", - "srhe.ac.uk", - "srip.ac.uk", - "sroc.ac.uk", - "srocket.us", - "srpe.ac.uk", - "srs.ac.uk", - "srtcdn.net", - "srttu.edu", - "sruc.ac.uk", - "ss-link.com", - "ss2.us", - "ss7.app", - "ssdevrd.com", - "ssees.ac.uk", - "ssfc.ac.uk", - "ssglobal.co", - "ssglobal.me", - "ssh91.com", - "sshm.ac.uk", - "sshs.club", - "sshs.pw", - "sshs.xyz", - "ssl-certificate.ch", - "ssl-images-amazon.com", - "ssl.com", - "ssl443.org", - "sslpaypal.org", - "ssmh.ac.uk", - "sspanel.net", - "sspanel.org", - "sspc.ac.uk", - "sspf.ac.uk", - "ssphr.ac.uk", - "ssplive.pw", - "sspro.ml", - "ssr.tools", - "ssrpass.pw", - "ssrshare.com", - "sss.camp", - "sss.xxx", - "sssfc.ac.uk", - "ssshuqian.xyz", - "sssins.com", - "sssjav.com", - "sssuo1.xyz", - "sstatic.net", - "sstm.moe", - "sstmlt.moe", - "sstmlt.net", - "ssttest.net", - "ssu.ac.uk", - "ssx3.com", - "st-and.ac.uk", - "st-andrews.ac.uk", - "st-austell.ac.uk", - "st-davids-coll.ac.uk", - "st-ives.ac.uk", - "st-patricks.ac.uk", - "st.com", - "stac.ac.uk", - "stackage.org", - "stackapps.com", - "stackauth.com", - "stackcommerce.net", - "stackexchange.com", - "stackmod.blog", - "stackoverflow.blog", - "stackoverflow.co", - "stackoverflow.com", - "stackoverflow.email", - "stackoverflowbusiness.com", - "stackoverflowcareers.com", - "stackpath.com", - "stackpath.dev", - "stacksnippets.net", - "stacksocial.com", - "stacyvandenbergboobs.com", - "stadia.dev", - "staffhub.ms", - "stafford.ac.uk", - "staffordcoll.ac.uk", - "staffordshire.ac.uk", - "staffs.ac.uk", - "stage64.hk", - "stak.ac.uk", - "stamford.ac.uk", - "stamfordparktrust.ac.uk", - "standardsuniversity.org", - "standupfortibet.org", - "standwithhk.org", - "stanford.edu", - "stanmore.ac.uk", - "stanstedairportcollege.ac.uk", - "star-brasil.com", - "star-latam.com", - "star.ac.uk", - "starbucks-stars.com", - "starbucks.ad", - "starbucks.at", - "starbucks.be", - "starbucks.bg", - "starbucks.ca", - "starbucks.ch", - "starbucks.co.id", - "starbucks.co.jp", - "starbucks.co.nz", - "starbucks.co.th", - "starbucks.co.uk", - "starbucks.co.za", - "starbucks.com", - "starbucks.com.ar", - "starbucks.com.bn", - "starbucks.com.co", - "starbucks.com.cy", - "starbucks.com.gr", - "starbucks.com.hk", - "starbucks.com.kh", - "starbucks.com.kz", - "starbucks.com.mx", - "starbucks.com.my", - "starbucks.com.pe", - "starbucks.com.sg", - "starbucks.com.tr", - "starbucks.com.uy", - "starbucks.de", - "starbucks.dk", - "starbucks.es", - "starbucks.fr", - "starbucks.hu", - "starbucks.ie", - "starbucks.in", - "starbucks.it", - "starbucks.nl", - "starbucks.no", - "starbucks.ph", - "starbucks.pl", - "starbucks.pt", - "starbucks.rs", - "starbucks.ru", - "starbucks.se", - "starbucks.tt", - "starbucks.vn", - "starbucksathome.com", - "starbucksavie.ca", - "starbuckscard.ph", - "starbuckscardb2b.com", - "starbuckscoffee.cz", - "starbuckscoffeegear.com", - "starbuckscoffeegearstore.com", - "starbucksforlife.ca", - "starbucksforlife.com", - "starbuckspoq.com", - "starbucksreserve.com", - "starbucksrewardsstarland.ca", - "starbucksrewardsstarland.com", - "starbucksromania.ro", - "starbucksrtd.com", - "starbucksslovakia.sk", - "starbuckssummergame.ca", - "starbuckssummergame.com", - "starcraft.com", - "starcraft2.com", - "starfieldtech.com", - "starfishfx.com", - "starfox.com", - "stark-verlag.ch", - "starlink.ac.uk", - "starott.com", - "starp2p.com", - "starplus.com", - "stars.ac.uk", - "starship-ent.com", - "starsze.icu", - "start.com", - "startpage.com", - "startpath.com", - "startupjournal.com", - "startuplivingchina.com", - "startupschool.org", - "starwars.com", - "starwarsbattlefront.com", - "starwarsbattlefront2.com", - "starwarsfallenorder.com", - "starwarsgalacticstarcruiser.com", - "starwarsjedifallenorder.com", - "starwarskids.com", - "starwarstheoldrepublic.com", - "stat.gov.tw", - "state.gov", - "stateofthemap.com", - "stateofthemap.org", - "static-cisco.com", - "static-economist.com", - "static-nike.com", - "static-verizon.com", - "static.fun", - "static9.net.au", - "staticflickr.com", - "statistics.ac.uk", - "statsig.com", - "statsmakemecry.com", - "statstutor.ac.uk", - "statueofdemocracy.org", - "statuspage.io", - "staugustinescollege.ac.uk", - "staxus.com", - "stboy.net", - "stbr.ac.uk", - "stbrendans.ac.uk", - "stbrn.ac.uk", - "stc-server.com", - "stc.ac.uk", - "stc.com.sa", - "stcg.ac.uk", - "stchads.ac.uk", - "stcharles-mail.ac.uk", - "stcharles.ac.uk", - "stclares.ac.uk", - "stcoll.ac.uk", - "stcroixmosquito.com", - "stcroixmosquitoproject.com", - "stdavidscollege.ac.uk", - "stdavidsdaygroup.ac.uk", - "stdoms.ac.uk", - "steam-api.com", - "steam-chat.com", - "steam.tv", - "steamcommunity.com", - "steamcontent.com", - "steamdb.info", - "steamdeck.com", - "steamgames.com", - "steamhouse.ac.uk", - "steamofporn.com", - "steampowered.com", - "steamserver.net", - "steamstatic.com", - "steamunlocked.net", - "steamusercontent.com", - "steamygamer.com", - "stec.ac.uk", - "steel-storm.com", - "steelbrick.com", - "steemit.com", - "steezylist.com", - "steganos.com", - "steganos.net", - "stem.ac.uk", - "stemacademy.ac.uk", - "stemequals.ac.uk", - "stepchina.com", - "stepdaughter.love", - "stepfamilyporn.com", - "stephaniered.com", - "stephenson.ac.uk", - "stephensoncoll.ac.uk", - "stepmaturesex.com", - "stepmom.one", - "stepsiblingscaught.com", - "sterling.ac.uk", - "stets.ac.uk", - "stfc.ac.uk", - "stgeorges.ac.uk", - "stgloballink.com", - "sth-leic-coll.ac.uk", - "stheadline.com", - "sthelens.ac.uk", - "sthelensacl.ac.uk", - "sthoo.com", - "stickam.com", - "stickeraction.com", - "stickofjoy.com", - "stileproject.com", - "stimorolsex.com", - "stin31.ru", - "stingrayengine.com", - "stir.ac.uk", - "stirling.ac.uk", - "stjohns-nottm.ac.uk", - "stlouisbmw.net", - "stloyes.ac.uk", - "stlukes.ac.uk", - "stmartins.ac.uk", - "stmarys-belfast.ac.uk", - "stmarys-blackburn.ac.uk", - "stmarys-sfc.ac.uk", - "stmarys.ac.uk", - "stmarysblackburn.ac.uk", - "stmaryslondon.ac.uk", - "stmellitus.ac.uk", - "stmellituscollege.ac.uk", - "stmichaels.ac.uk", - "sto.cc", - "stockagainstphotography.com", - "stockbill.ac.uk", - "stocking-tease.com", - "stockingfetishvideo.com", - "stockport.ac.uk", - "stockton.ac.uk", - "stocktonlearningandskillsservice.ac.uk", - "stocktonsfc.ac.uk", - "stocsf.ac.uk", - "stokecoll.ac.uk", - "stokecollege.ac.uk", - "stokesfc.ac.uk", - "stomp.ac.uk", - "stonefoxlingerie.com", - "stonefoxproductions.com", - "stonyhurst.ac.uk", - "stoporganharvesting.org", - "stoptibetcrisis.net", - "storage.googleapis.com", - "storagenewsletter.com", - "storcuram.ac.uk", - "store-bridgestonesports.com", - "storesense.com", - "stories.google", - "storiesofchange.ac.uk", - "storiesonline.net", - "storify.com", - "storj.io", - "storm.mg", - "stormmediagroup.com", - "storyful.com", - "stourbridge.ac.uk", - "stow.ac.uk", - "stoweboyd.com", - "stpadarns.ac.uk", - "straightouttasomewhere.com", - "straightpornstuds.com", - "straitstimes.com", - "stran.ac.uk", - "stranabg.com", - "straplessdildo.com", - "strat-avon.ac.uk", - "stratavoncol.ac.uk", - "stratford.ac.uk", - "stratfordislanduniversitycentre.ac.uk", - "stratforduniversitycentre.ac.uk", - "stratgroup.ac.uk", - "strath.ac.uk", - "strathclyde.ac.uk", - "strathmore.ac.uk", - "stream-mydirtyhobby.biz", - "streamable.com", - "streamate.com", - "streamingdisney.net", - "streamingporn.xyz", - "streamingthe.net", - "streamlatina.com", - "streamporn.cc", - "streamporn.pw", - "streamsex.com", - "streema.com", - "streetmeatasia.com", - "streetvoice.com", - "strepsils.at", - "strepsils.ch", - "strepsils.co.kr", - "strepsils.co.nz", - "strepsils.co.za", - "strepsils.com.ar", - "strepsils.com.au", - "strepsils.com.br", - "strepsils.com.co", - "strepsils.com.hk", - "strepsils.com.ph", - "strepsils.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.us", - "strepsilsarabia.com", - "streva.ac.uk", - "striek.com", - "strikingly.com", - "strikinglycdn.com", - "strip-poker.xxx", - "stripcamfun.com", - "stripchat.com", - "stripe-terminal-local-reader.net", - "stripe.ac.uk", - "stripe.com", - "stripe.network", - "stripecdn.com", - "stripparadise.com", - "stripselector.com", - "stripskunk.com", - "stripst.com", - "strode-coll.ac.uk", - "strode-college.ac.uk", - "strodes.ac.uk", - "strodeslanguages.ac.uk", - "strongvpn.com", - "strongwindpress.com", - "stroud.ac.uk", - "stroudcol.ac.uk", - "stroudcollege.ac.uk", - "sttc.ac.uk", - "student.tw", - "studentengagement.ac.uk", - "studentsforafreetibet.org", - "studentshows.ac.uk", - "studentvoteregistration.ac.uk", - "studentvoterregistration.ac.uk", - "studiobeatsbydrdre.com", - "studiofow.com", - "studiolico.com", - "studioluxus.com", - "studioncorp.com", - "studiopaint.com", - "studiosucks.com", - "studygroup.ac.uk", - "studyhigher.ac.uk", - "studyinengland.ac.uk", - "studyingeconomics.ac.uk", - "studyinglanguages.ac.uk", - "studyinwales.ac.uk", - "studylondon.ac.uk", - "studywatchbyverily.com", - "studywatchbyverily.org", - "studywithplymouth.ac.uk", - "stufferdb.com", - "stuidok110.com", - "stuk.ac.uk", - "stumbleupon.com", - "stunnel.org", - "stupidcams.com", - "stupidvideos.com", - "stvincent.ac.uk", - "stweetly.com", - "stxmosquito.com", - "stxmosquitoproject.com", - "stxmosquitoproject.net", - "stxmosquitoproject.org", - "sub147.com", - "sublimedirectory.com", - "sublimetext.com", - "submarin.online", - "submittal-log.com", - "submityourflicks.com", - "subscene.com", - "substack.com", - "suburbansolutions.ac.uk", - "succeeds.ac.uk", - "successfn.com", - "successwithteams.com", - "sucksex.com", - "sueddeutsche.de", - "suffolk-maag.ac.uk", - "suffolk.ac.uk", - "suffolkacademiestrust.ac.uk", - "suffolkbusinessschool.ac.uk", - "suffolkone.ac.uk", - "sugarsync.com", - "sugobbs.com", - "sugumiru18.com", - "suissl.com", - "sukafeti.jp", - "sukebelinks.com", - "sulc.ac.uk", - "sulian.me", - "sulne.ac.uk", - "sulsa.ac.uk", - "sulwerphoto.com", - "sumac.ac.uk", - "summify.com", - "sumomo-ch.com", - "sumrando.com", - "sums.ac.uk", - "sumsconsulting.ac.uk", - "sun.com", - "sun1911.com", - "sunbingo.co.uk", - "suncat.ac.uk", - "suncol.ac.uk", - "sund.ac.uk", - "sundanceignite2016.com", - "sundayguardianlive.com", - "sundayready.com", - "sunderland.ac.uk", - "sunderlandcollege.ac.uk", - "sunderlandsixthform.ac.uk", - "sunglassessale2014.com", - "sunitec.ac.uk", - "sunmedia.ca", - "suno.ai", - "sunporno.com", - "sunskyforum.com", - "sunta.com.tw", - "sunvpn.net", - "suoluo.org", - "supa.ac.uk", - "supanimegames.com", - "supc.ac.uk", - "supchina.com", - "superadultgames.com", - "supercell.com", - "supercell.net", - "supercoach.com.au", - "supercomputingwales.ac.uk", - "superdarn.ac.uk", - "superearsenjoy.com", - "superfreevpn.com", - "supergratisporno.com", - "superhqporn.com", - "superjanet.ac.uk", - "superjapanesesex.com", - "superjournal.ac.uk", - "supermario.com", - "supermario3dworld.com", - "supermariogalaxy.com", - "supermariorun.com", - "superokayama.com", - "superpages.com", - "superpapermario.com", - "supersexeamateur.com", - "superstation.com.tw", - "superstem.ac.uk", - "supertop-100.com", - "superuser.com", - "supervpn.net", - "superzooi.com", - "supjav.com", - "suppig.net", - "supply-chain.ac.uk", - "supplybestjerseys.com", - "supportfacebook.com", - "supremacy.com", - "supremacy.net", - "suprememastertv.com", - "sureporn.com", - "surf.ac.uk", - "surface.com", - "surfeasy.com", - "surfeasy.com.au", - "surflite.co", - "surflite.net", - "surfshark.com", - "suroot.com", - "surrart.ac.uk", - "surrealismcentre.ac.uk", - "surrenderat20.net", - "surrey.ac.uk", - "surreyadultlearning.ac.uk", - "surreyibc.ac.uk", - "surreyspace.ac.uk", - "suruga-ya.com", - "suruga-ya.jp", - "surveynet.ac.uk", - "suschem-nottingham-cdt.ac.uk", - "sushi.ski", - "susiewildin.com", - "sussex.ac.uk", - "sussexbusinessschool.ac.uk", - "sussexcoast.ac.uk", - "sussexdowns.ac.uk", - "sussexmedicalschool.ac.uk", - "sussexvirtualcollege.ac.uk", - "sussp.ac.uk", - "sustain.ac.uk", - "sustainability.google", - "sustainabilityexchange.ac.uk", - "sustainablebuildingstudio.com", - "sustainabledesigncouncil.com", - "sustainabledesigncouncil.net", - "sustainablehydrogen-cdt.ac.uk", - "sustainablelifestyles.ac.uk", - "sustainablepractices.ac.uk", - "sustainableproperty.ac.uk", - "sustainableprosperity.ac.uk", - "sustainabletechnologies.ac.uk", - "sustainsteel.ac.uk", - "sustainthesound.com", - "susx.ac.uk", - "sutcol.ac.uk", - "sutcoll.ac.uk", - "suttoncollege.ac.uk", - "suxib.com", - "suxiebu.com", - "suyangg.com", - "svaboda.org", - "svc.ms", - "svensksexfilm.com", - "sverigebeatsbydrdre.com", - "svipshipin.store", - "svoboda.org", - "svobodnaevropa.bg", - "svp-team.com", - "svpply.com", - "svscomics.asia", - "svscomics.com", - "svsfx.com", - "svsgames.org", - "sw-iot.ac.uk", - "swag-live.co", - "swag.live", - "swagbucks.com", - "swan.ac.uk", - "swancoll.ac.uk", - "swanmet.ac.uk", - "swansea-institute.ac.uk", - "swansea.ac.uk", - "swanseamet.ac.uk", - "swap.ac.uk", - "swapbox.ac.uk", - "swapsmut.com", - "swapspace.co", - "swarf.ac.uk", - "sway-cdn.com", - "sway.com", - "swbio.ac.uk", - "swbusdev.com", - "swc.ac.uk", - "swdtc.ac.uk", - "swdtp.ac.uk", - "sweep.ac.uk", - "sweetadult-tube.com", - "sweetandmaxwell.co.uk", - "sweetsext.com", - "sweetsinner.com", - "swegold.com", - "sweltec.ac.uk", - "swift.ac.uk", - "swift.org", - "swiftbank.info", - "swiftbank.us", - "swiftcapital.com", - "swiftfinancial.com", - "swiftfinancial.info", - "swiftfinancial.net", - "swincoll.ac.uk", - "swindon-college.ac.uk", - "swindon.ac.uk", - "swindonart.ac.uk", - "swingercuckoldporn.com", - "swingerpornfun.com", - "swingerporntube.com", - "swingers-homemade-videos.com", - "swingersexorgy.com", - "swingexpert.nl", - "swiot.ac.uk", - "swiss-machining.com", - "swiss-turn.com", - "swissid.ch", - "swissign.com", - "swissign.li", - "swissinfo.ch", - "swisssign-group.ch", - "swisssign-group.com", - "swisssign-group.li", - "swisssign.ch", - "swisssign.com", - "swisssign.li", - "swisssign.net", - "swisssign.org", - "swisssigner.ch", - "swisssigner.com", - "swisssigngroup.ch", - "swisssigngroup.com", - "swissstick.com", - "swisstsa.ch", - "swisstsa.li", - "swissvpn.net", - "switch1.jp", - "switchvpn.net", - "swjedifallenorder.com", - "swjfo.com", - "swlacademicnetwork.ac.uk", - "swlc.ac.uk", - "swoo.sh", - "swoosh.com", - "swoosh.tv", - "sworcs.ac.uk", - "swrac.ac.uk", - "swtor.com", - "swtor.net", - "swurcc.ac.uk", - "sww-ahdtp.ac.uk", - "swwcte.ac.uk", - "swwhep.ac.uk", - "sx.ac.uk", - "sxarab.top", - "sxshentai.com", - "sxyprn.com", - "sybj91.one", - "sybjav.online", - "sycolleges.ac.uk", - "sydneytoday.com", - "syfec.ac.uk", - "syfor.click", - "syhacked.com", - "sylfoundation.org", - "symantec.com", - "symcb.com", - "symcd.com", - "symonds.ac.uk", - "synaptic.net", - "synbio-cdt.ac.uk", - "syncback.com", - "syncbak.com", - "synergyse.com", - "synology.com", - "synologydownload.com", - "synologyupdate.com", - "synsym.ac.uk", - "syntheticbiology.ac.uk", - "syosetu.com", - "sysinternals.com", - "sysmic.ac.uk", - "sysresccd.org", - "systemicrisk.ac.uk", - "sytes.net", - "syx86.cn", - "syx86.com", - "syzbj36.xyz", - "szabadeuropa.hu", - "szbbs.net", - "szcheapmonsterheadphones.com", - "szetowah.org.hk", - "szexvideo.top", - "szwinnertechnology.com", - "t-g.com", - "t-mus.ac.uk", - "t-splines.com", - "t.co", - "t.me", - "t35.com", - "t35hosting.com", - "t66y.com", - "t91y.com", - "taa-usa.org", - "taaze.tw", - "tablesgenerator.com", - "tablet-academy.ac.uk", - "taboola.com", - "tabooporn.tv", - "tabooporns.com", - "tabootube.xxx", - "tabtter.jp", - "tabustudios.co", - "tacamateurs.com", - "tacc.ac.uk", - "tacem.org", - "tachusz.xyz", - "taconet.com.tw", - "taedp.org.tw", - "tafm.org", - "tagapie.com.tw", - "tagesschau.de", - "tags.ac.uk", - "tagwa.org.au", - "tagwalk.com", - "tahr.org.tw", - "taiav.com", - "tail-f.com", - "tailf.com", - "tailscale.com", - "tailscale.io", - "tailwindtraders.com", - "taiolongdh.sbs", - "taipei.gov.tw", - "taipeisociety.org", - "taipeitimes.com", - "taisounds.com", - "tait.ac.uk", - "taiwan-sex.com", - "taiwanadultexpo.com", - "taiwanbible.com", - "taiwancon.com", - "taiwandaily.net", - "taiwandc.org", - "taiwanhot.net", - "taiwanjobs.gov.tw", - "taiwanjustice.com", - "taiwanjustice.net", - "taiwankiss.com", - "taiwannation.com", - "taiwannation.com.tw", - "taiwanncf.org.tw", - "taiwannews.com.tw", - "taiwanonline.cc", - "taiwansex.tw", - "taiwantp.net", - "taiwantt.org.tw", - "taiwanus.net", - "taiwanyes.com", - "take2games.com", - "takegoto.com", - "takens.tw", - "takeyourplace.ac.uk", - "taknai.com", - "takporn.com", - "talentlens.com", - "taleofthenight.com", - "talk853.com", - "talkboxapp.com", - "talkcc.com", - "talkinghealthmatters.ac.uk", - "talkonly.net", - "talksport.com", - "tamescol.ac.uk", - "tameside-acl.ac.uk", - "tameside.ac.uk", - "tamesidecollege.ac.uk", - "tamiaode.tk", - "tamilsexvideos.cc", - "tampabay.com", - "tamworth.ac.uk", - "tamworthandlichfield.ac.uk", - "tanc.org", - "tandberg-china.com", - "tandberg.com", - "tandf.co.uk", - "tandfonline.com", - "tanflix.com", - "tangben.com", - "tangbr.net", - "tangren.us", - "tantaly.com", - "taoil-cn.sbs", - "taoism.net", - "taolun.info", - "taose.in", - "tapanwap.com", - "tapatalk.com", - "tapb.ac.uk", - "tapestry.ac.uk", - "taptotokyo.com", - "taqunuhai.vip", - "taradinhos.com", - "taragana.com", - "tarf-lcv.ac.uk", - "target.com", - "targetedgrad.ac.uk", - "targetimg1.com", - "tarn.ac.uk", - "tasc.ac.uk", - "tascn.com.au", - "tasexy.com", - "tasexy.top", - "taste.com.au", - "tasteofpremium.jp", - "tastyblacks.com", - "tati-log.com", - "tau.ac.uk", - "tauntons.ac.uk", - "taup.net", - "taup.org.tw", - "tavi-port.ac.uk", - "tavistockandportman.ac.uk", - "tavistockrelationships.ac.uk", - "taweet.com", - "tawny-peaks.com", - "taxi69.com", - "taxidrivermovie.com", - "tay.ac.uk", - "taylorandfrancis.com", - "taylorfrancis.com", - "tbcollege.org", - "tbi.org.hk", - "tbib.org", - "tbicn.org", - "tbjyt.org", - "tbm.ac.uk", - "tbpic.info", - "tbrc.org", - "tbs-rainbow.org", - "tbsec.org", - "tbsmalaysia.org", - "tbsn.org", - "tbsseattle.org", - "tbssqh.org", - "tbswd.org", - "tbtemple.org.uk", - "tbthouston.org", - "tcat.ac.uk", - "tcch.ac.uk", - "tccr.ac.uk", - "tccwonline.org", - "tcewf.org", - "tcg.ac.uk", - "tchrd.org", - "tcm.ac.uk", - "tcnynj.org", - "tcpartnership.ac.uk", - "tcpspeed.co", - "tcpspeed.com", - "tcsofbc.org", - "tcsovi.org", - "tdesktop.com", - "tdm.com.mo", - "tdotp.ac.uk", - "teachenergy.ac.uk", - "teacherfucksteens.com", - "teachingaccessibility.ac.uk", - "teachingshakespeare.ac.uk", - "teachmyass.com", - "teachparentstech.org", - "teamamericany.com", - "teamneedforspeed.com", - "teamskeet.com", - "teamviewer.com", - "teamviewer.us", - "teamwork.ac.uk", - "tean.ac.uk", - "tearapeak.com", - "teatroporno.com", - "tec.ac.uk", - "techatbloomberg.com", - "techcrunch.com", - "techextra.ac.uk", - "techhub.ms", - "techliquidators.com", - "techne.ac.uk", - "technews.tw", - "technics.com", - "technologyandsociety.org", - "techradar.com", - "techspot.com", - "techstreet.com", - "techtimes.com", - "techviz.net", - "techxtra.ac.uk", - "teck.in", - "teco-hk.org", - "teco-mo.org", - "ted.com", - "tedcdn.com", - "teddysun.com", - "tedi-london.ac.uk", - "tedi.ac.uk", - "teds.ac.uk", - "teen-girl.net", - "teen-lover.net", - "teen-sexy.com", - "teen3x.mobi", - "teenagefucking.com", - "teenchoice.com", - "teendreams.com", - "teenfucks.org", - "teengirlfriendtube.com", - "teeniefuck.net", - "teenporngallery.net", - "teenporntube.xxx", - "teenpornvideo.xxx", - "teenport.com", - "teenpussypicture.com", - "teenqueens.net", - "teenrave.org", - "teensex.me", - "teensinasia.com", - "teensloveanal.com", - "teensloveporn.net", - "teensnow.com", - "teensnow.link", - "teentube.pro", - "teenwebcamtube.com", - "teepr.com", - "tees.ac.uk", - "teeslearn.ac.uk", - "teesside.ac.uk", - "teesvalley-acl.ac.uk", - "teeztube.com", - "tegrazone.co", - "tegrazone.co.kr", - "tegrazone.com", - "tegrazone.jp", - "tegrazone.kr", - "tehrantimes.com", - "tel.ac.uk", - "telebay.com", - "telecomspace.com", - "telega.one", - "telegra.ph", - "telegram-cdn.org", - "telegram-porn.com", - "telegram.dog", - "telegram.me", - "telegram.org", - "telegram.space", - "telegramdownload.com", - "telegraph.co.uk", - "telekom.com", - "telekom.de", - "telesco.pe", - "telesec.de", - "telesell.com", - "telex.cc", - "telfordcollege.ac.uk", - "tellapart.com", - "tellme.pw", - "tellmewhygame.com", - "tellusgb.ac.uk", - "telri.ac.uk", - "temenos.ac.uk", - "temetube.xyz", - "tempusuk.ac.uk", - "tenacy.com", - "tenbyfotolia.com", - "tenor.com", - "tensorflow.org", - "tentowns.ac.uk", - "tenzinpalmo.com", - "terabox.com", - "terapeack.com", - "terapeak.ca", - "terapeak.com", - "terapeak.com.hk", - "terapeak.hk", - "terapeak.info", - "teraperk.com", - "terc.ac.uk", - "terk.nl", - "termius.com", - "termux.com", - "termux.dev", - "termux.org", - "terraform.io", - "terragraph.com", - "terrapeak.com", - "tesla.com", - "tesla.services", - "teslaenergy.services", - "teslamotors.com", - "teslazta.net", - "test-ipv6.cl", - "test-ipv6.com", - "test-ipv6.cz", - "test-ipv6.hu", - "test-ipv6.is", - "test-ipv6.se", - "testa.ac.uk", - "testipv6.de", - "testonfox.com", - "tettediferro.it", - "tew.org", - "tex-talk.net", - "tex.ac.uk", - "textminingcentre.ac.uk", - "textnow.me", - "texttobuy.org", - "texture.com", - "tferwq.com", - "tfhub.dev", - "tfiflve.com", - "tfsallin.net", - "tg.dev", - "tgac.ac.uk", - "tgirlcentral.com", - "tgirlpostop.com", - "tgp6.com", - "tgstat.com", - "tgtube.com", - "tgutube.com", - "thai-xxx.com", - "thai69.com", - "thaichix.com", - "thaicn.com", - "thaicuties.com", - "thaigirls.net", - "thaigirls100.net", - "thamesgatewaycollege.ac.uk", - "thamesvalleytraining.ac.uk", - "thanet.ac.uk", - "thanetcollege.ac.uk", - "thanksloyalty.com", - "thatcham.ac.uk", - "thawte.com", - "thawte.de", - "thawte.fr", - "thb.gov.tw", - "thdh.cc", - "the-area.com", - "the-british-museum.ac.uk", - "the-britishmuseum.ac.uk", - "the-etc.ac.uk", - "the-japan-news.com", - "the-m-festival.com", - "the-monster-beats.com", - "the-tls.co.uk", - "the123d.com", - "theadulthub.com", - "theaffairs.com", - "theage.com.au", - "thealanturinginstitute.ac.uk", - "thearden.ac.uk", - "theatlantic.com", - "theatrum-belli.com", - "theaustralian.com.au", - "theav.cc", - "theav.xyz", - "theb.ai", - "thebanker.com", - "thebankerdatabase.com", - "thebayuk.com", - "thebcc.ac.uk", - "thebcomplex.com", - "thebeatsbydre.com", - "thebeatsbydre.net", - "thebeatsheadphonesale.com", - "thebestfetishsites.com", - "theblaze.com", - "theblemish.com", - "theblock.co", - "thebobs.com", - "thebodyshop-usa.com", - "thebondagefiles.com", - "thebritishacademy.ac.uk", - "thebritishmuseum.ac.uk", - "thecamdude.com", - "thecandidbay.com", - "thecandidforum-voyeur.ru", - "thechesterfieldcollegegroup.ac.uk", - "thechinabeat.org", - "thechinacollection.org", - "thechinaproject.com", - "thechinastory.org", - "thechronicle.com.au", - "theclasshroom.com", - "thecleversense.com", - "theclub.com.hk", - "theclubprive.com", - "thecobaltstudy.ac.uk", - "thecompaqstore.com", - "thecontactpartnership.ac.uk", - "theconversation.com", - "thecpc.ac.uk", - "thecuckold.com", - "thecuckoldporn.com", - "thedailysnkr.com", - "thedalailamamovie.com", - "thedesignworkshop.com", - "thedesk.com", - "thedigitalpicture.ac.uk", - "thediplomat.com", - "thedreadwolfrises.com", - "thedw.us", - "theebayshop.com", - "theepochtimes.com", - "theepochtimessubscribe.com", - "theetc.ac.uk", - "thefacebook.com", - "thefacebook.net", - "thefappening.pro", - "thefappening.wiki", - "thefappeningblog.com", - "thefind.com", - "thefoxnation.com", - "thefrontier.hk", - "thegatewaypundit.com", - "thegay.com", - "thegayoffice.com", - "thegeorgiascene.com", - "thegioitinhoc.vn", - "thegithubshop.com", - "theglobalsite.ac.uk", - "thegly.com", - "thegooglestore.com", - "thegraduationproject.ac.uk", - "theguardian.com", - "theguardiandns.com", - "thehabibshow.com", - "thehealthsite.com", - "thehenleycollege.ac.uk", - "thehentaiworld.com", - "thehindu.com", - "thehots.info", - "thehousenews.com", - "thehulubraintrust.com", - "thehun.net", - "theindianleaks.com", - "theinitium.com", - "theinstagramhack.com", - "theintelstore.com", - "theinternetlawschool.ac.uk", - "theinventionworks.com", - "theinventionworks.net", - "thekarups.com", - "theknowledgeacademy.ac.uk", - "thelancet.com", - "theleakbay.com", - "thelearningcentrebexley.ac.uk", - "thelearningconsortium.ac.uk", - "thelearningmatrix.ac.uk", - "thelegendarystarfy.com", - "theletterspage.ac.uk", - "thelittleslush.com", - "thelondonknowledgelab.ac.uk", - "theman.in", - "themanchestercollege.ac.uk", - "themarvelexperiencetour.com", - "themathsfactor.com", - "themercury.com.au", - "themessengeradelaide.com.au", - "themilfmovies.com", - "themis.ac.uk", - "themoviedb.org", - "thenationalpulse.com", - "thenewgirlspooping.com", - "thenewporn.com", - "thenewslens.com", - "thenextweb.com", - "thenipslip.com", - "theoca.ac.uk", - "theopportunityproject.org", - "thepaypalshop.com", - "thepervs.com", - "thepiratebay.ee", - "thepiratebay.org", - "theplatform.com", - "theporn.cc", - "thepornarea.com", - "thepornbest.com", - "thepornbet.com", - "thepornbin.com", - "thepornblender.com", - "theporndude.cc", - "theporndude.com", - "theporndude.vip", - "thepornguy.org", - "thepornlinks.com", - "thepornlist.com", - "thepornlist.net", - "thepornlistdude.com", - "thepornmap.com", - "thepornscat.com", - "theporntoplist.com", - "theporny.com", - "theportalwiki.com", - "theprint.in", - "thereallove.kr", - "therock.net.nz", - "theroslininstitute.ac.uk", - "thesafeporn.com", - "thesaturdaypaper.com.au", - "thesaurus.ac.uk", - "thescottishsun.co.uk", - "thesenses.ac.uk", - "thesesalive.ac.uk", - "thesffblog.com", - "theshoppingexpresslane.net", - "thesims.com", - "thesims3.com", - "thesims4.com", - "thesimssocial.com", - "theskillsco.ac.uk", - "thespeeder.com", - "thestandard.com.hk", - "thestandnews.com", - "thestar.com", - "thestationbymaker.com", - "thesun.co.uk", - "thesun.ie", - "thesundaytimes.co.uk", - "thethothub.com", - "thetibetcenter.org", - "thetibetconnection.org", - "thetibetmuseum.org", - "thetibetpost.com", - "thetimes.co.uk", - "thetimes.ie", - "thetinhat.com", - "thetranny.com", - "thetread.com", - "thetrotskymovie.com", - "thetvdb.com", - "thetype.com", - "theuab.net", - "theverge.com", - "thevirtualsexreview.com", - "thevivekspot.com", - "theweek.in", - "thewgo.org", - "thewomenslibrary.ac.uk", - "thewonderful101.com", - "theync.com", - "theyxxx.com", - "thieme-connect.com", - "thieme-connect.de", - "thieme.com", - "thieme.de", - "thinkboxsoftware.com", - "thinkdifferent.us", - "thinkgeek.com", - "thinkhigher.ac.uk", - "thinkhk.com", - "thinking3d.ac.uk", - "thinkingtaiwan.com", - "thinkofliving.com", - "thinkquarterly.co.uk", - "thinkquarterly.com", - "thinkwales.ac.uk", - "thinkwithgoogle.com", - "thisav.com", - "thisismoney.co.uk", - "thisispolaris.com", - "thismon.ee", - "thisvid.com", - "thisvidscat.net", - "thlib.org", - "thomasbernhard.org", - "thomasdanby.ac.uk", - "thomashpc.ac.uk", - "thomasway.ac.uk", - "thomroth.ac.uk", - "thomsonreuters.ca", - "thomsonreuters.cn", - "thomsonreuters.co.jp", - "thomsonreuters.co.kr", - "thomsonreuters.co.nz", - "thomsonreuters.co.uk", - "thomsonreuters.com", - "thomsonreuters.com.ar", - "thomsonreuters.com.au", - "thomsonreuters.com.br", - "thomsonreuters.com.hk", - "thomsonreuters.com.my", - "thomsonreuters.com.pe", - "thomsonreuters.com.sg", - "thomsonreuters.com.tr", - "thomsonreuters.es", - "thomsonreuters.in", - "thomsonreuters.ru", - "thomsonreutersmexico.com", - "thongdreams.com", - "thornbeck.ac.uk", - "thotbook.tv", - "thothub.ru", - "thothub.to", - "thottok.com", - "thotvids.com", - "threadreaderapp.com", - "threads.net", - "threatchaos.com", - "thri.xxx", - "thrixxx.com", - "thron.com", - "throughnightsfire.com", - "thtmod1.com", - "thumbnailseries.com", - "thumbzilla.com", - "thunderbird.net", - "thunderbolttechnology.net", - "thurrock.ac.uk", - "thurrockcampus.ac.uk", - "thywords.com", - "thywords.com.tw", - "thz7.net", - "thzu.cc", - "tiananmenduizhi.com", - "tiananmenmother.org", - "tiananmenuniv.com", - "tiananmenuniv.net", - "tiandixing.org", - "tianhuayuan.com", - "tianlawoffice.com", - "tiantang.today", - "tianti.io", - "tiantibooks.org", - "tianyantong.org.cn", - "tianzhu.org", - "tiava.com", - "tiava1.com", - "tiaz.site", - "tiberiumalliances.com", - "tibet-envoy.eu", - "tibet-foundation.org", - "tibet-house-trust.co.uk", - "tibet-info.net", - "tibet-initiative.de", - "tibet-munich.de", - "tibet.a.se", - "tibet.at", - "tibet.ca", - "tibet.com", - "tibet.fr", - "tibet.net", - "tibet.nu", - "tibet.org", - "tibet.org.tw", - "tibet.sk", - "tibet.to", - "tibet3rdpole.org", - "tibetaction.net", - "tibetaid.org", - "tibetalk.com", - "tibetan-alliance.org", - "tibetan.fr", - "tibetanaidproject.org", - "tibetanarts.org", - "tibetanbuddhistinstitute.org", - "tibetancommunity.org", - "tibetancommunityuk.net", - "tibetanculture.org", - "tibetanentrepreneurs.org", - "tibetanfeministcollective.org", - "tibetanhealth.org", - "tibetanjournal.com", - "tibetanlanguage.org", - "tibetanliberation.org", - "tibetanpaintings.com", - "tibetanphotoproject.com", - "tibetanpoliticalreview.org", - "tibetanreview.net", - "tibetansports.org", - "tibetanwomen.org", - "tibetanyouth.org", - "tibetanyouthcongress.org", - "tibetcharity.dk", - "tibetcharity.in", - "tibetchild.org", - "tibetcity.com", - "tibetcollection.com", - "tibetcorps.org", - "tibetexpress.net", - "tibetfocus.com", - "tibetfund.org", - "tibetgermany.com", - "tibetgermany.de", - "tibethaus.com", - "tibetheritagefund.org", - "tibethouse.jp", - "tibethouse.org", - "tibethouse.us", - "tibetinfonet.net", - "tibetjustice.org", - "tibetkomite.dk", - "tibetmuseum.org", - "tibetnetwork.org", - "tibetoffice.ch", - "tibetoffice.com.au", - "tibetoffice.eu", - "tibetoffice.org", - "tibetonline.com", - "tibetonline.tv", - "tibetoralhistory.org", - "tibetpolicy.eu", - "tibetrelieffund.co.uk", - "tibetsites.com", - "tibetsociety.com", - "tibetsun.com", - "tibetsupportgroup.org", - "tibetswiss.ch", - "tibettelegraph.com", - "tibettimes.net", - "tibettruth.com", - "tibetwrites.org", - "tiburon.com", - "tic.ac.uk", - "tickdata.com", - "ticket.com.tw", - "tictoc.video", - "tictocs.ac.uk", - "tidal.com", - "tidalhifi.com", - "tidelift.com", - "tiendabestbuy.com", - "tiffany-towers.com", - "tig-ol-bitties.live", - "tigervpn.com", - "tiipple.ac.uk", - "tik-tokapi.com", - "tiktok.com", - "tiktokcdn-eu.com", - "tiktokcdn-us.com", - "tiktokcdn.com", - "tiktokd.net", - "tiktokd.org", - "tiktokv.com", - "tiktokv.eu", - "tiktokv.us", - "tiktokw.eu", - "tiktokw.us", - "tilehill.ac.uk", - "tiltbrush.com", - "timdir.com", - "time.com", - "time.gov", - "timefxapp.com", - "timelinestoryteller.com", - "timesmembership.com", - "timesnownews.com", - "timestalks.com", - "timi1.me", - "timo0.com", - "timsah.com", - "timtales.com", - "tinc-vpn.org", - "tiney.com", - "tineye.com", - "ting53.xyz", - "tinhduc.org", - "tinkerboxapp.com", - "tinkercad.com", - "tinkerentertainment.com", - "tinkerplay.net", - "tintuc101.com", - "tiny.cc", - "tiny4k.com", - "tinychat.com", - "tinypaste.com", - "tinyurl.com", - "tiohentai.com", - "tipas.net", - "tipo.gov.tw", - "tipple.ac.uk", - "tire-cadcam.com", - "tiresplus.com", - "tistory.com", - "titanfall.com", - "title.sh", - "titsandtugs.com", - "titsbox.com", - "titsintops.com", - "tittykings.com", - "tkb008.xyz", - "tkb2233.life", - "tkbqf2.life", - "tkcs-collins.com", - "tktube.com", - "tl.ac.uk", - "tl.gd", - "tla.ac.uk", - "tlc.ac.uk", - "tlcbexley.ac.uk", - "tlccollege.ac.uk", - "tlcmd.ac.uk", - "tlcmoodle.ac.uk", - "tltp.ac.uk", - "tma.co.jp", - "tmagazine.com", - "tmc.ac.uk", - "tmcs.ac.uk", - "tmdb.org", - "tmdfish.com", - "tmei-taoyuan.com", - "tmi.me", - "tmn.ac.uk", - "tmpp.org", - "tmsnrt.rs", - "tnaflix.com", - "tnatryouts.com", - "tngrnow.com", - "tngrnow.net", - "tnntoday.com", - "tnp.org", - "tnt-ea.com", - "to-porno.com", - "toget.com.tw", - "togetter.com", - "toh.info", - "tohoku.ac.jp", - "tokyo-247.com", - "tokyo-hot.com", - "tokyo-porn-tube.com", - "tokyo-sports.co.jp", - "tokyo-tosho.net", - "tokyocn.com", - "tokyomotion.com", - "tokyomotion.net", - "tokyonightstyle.com", - "tokyoporns.com", - "tokyotosho.info", - "tokyotosho.se", - "tomatespodres.com", - "tombola.ac.uk", - "tomonews.net", - "tomsguide.com", - "tonec.com", - "tongil.or.kr", - "tonicmovies.com", - "tono-oka.jp", - "tonyyan.net", - "toodoc.com", - "toolforge.org", - "toolmaking-cadcam.com", - "toomadporn.pro", - "toon-3d.com", - "toonel.net", - "toonsearch.net", - "toonsexblog.com", - "top.tv", - "top100nl.net", - "top100sexgames.com", - "top10vpn.com", - "top81.ws", - "topadultgames.biz", - "topanime.biz", - "topartporn.com", - "topaz.ne.jp", - "topbabesblog.org", - "topbeatsbydrdreoutlet.com", - "topbeatsdealer.com", - "topbeatsforsale.com", - "topbtc.com", - "topcartoonsites.com", - "topcelebnudes.com", - "topchats.com", - "topchineseporn.com", - "topcoder.com", - "topcuckolds.com", - "toperoticartsites.com", - "topescort.nl", - "topescortbabes.com", - "topexhib.net", - "topface.com", - "topfantasyart.com", - "topfreepornvideos.com", - "tophd.xxx", - "tophdsex.com", - "tophentai.biz", - "tophentaicomics.com", - "toplayerserver.com", - "topmanga.biz", - "topnews.in", - "topnudemalecelebs.com", - "topobase.com", - "topporn.me", - "toppornguide.com", - "toppornoduro.com", - "toppornsites.com", - "toppornsites.net", - "toprealvideos.com", - "topsexart.com", - "topsexhdvideos.com", - "topsexygames.com", - "topshareware.com", - "topsy.com", - "toptip.ca", - "toptoonsites.com", - "topvids.net", - "topxxxpornvids.com", - "topyoungporn.com", - "tora.to", - "torcidadeouro.com", - "torcn.com", - "torguard.net", - "torlock.com", - "toroporno.com", - "torproject.org", - "torrentgalaxy.to", - "torrentkitty.tv", - "torrentprivacy.com", - "torrentproject.se", - "torrenty.org", - "torrentz.eu", - "torrindex.net", - "tortoisesvn.net", - "torvpn.com", - "tospo-keiba.jp", - "totalmateria.com", - "totalvpn.com", - "totoleak.com", - "totton.ac.uk", - "toucan-network.ac.uk", - "touchid.tv", - "touchid.wang", - "touchsmartpc.com", - "touchsmartpc.net", - "touchsmartpc.org", - "touhouwiki.net", - "tourporno.com", - "tousatu.fun", - "toutapp.com", - "toutiaoabc.com", - "tower.ac.uk", - "towerauction.com", - "towerhamletscollege.ac.uk", - "towerhamletsllls.ac.uk", - "towerhamletslls.ac.uk", - "towngain.com", - "townofsins.com", - "townsvillebulletin.com.au", - "toxin-up.sbs", - "toxinzoo.sbs", - "toy-cadcam.com", - "toycadcam.com", - "toypark.in", - "toythieves.com", - "toytractorshow.com", - "tparents.org", - "tpc.ac.uk", - "tpea.ac.uk", - "tpi.org.tw", - "tpmde.ac.uk", - "tpornstars.com", - "tr.com", - "trac.ac.uk", - "tracfone.com", - "tracingnetworks.ac.uk", - "tracking-location.com", - "tradevip1.com", - "tradingview.com", - "traffcoll.ac.uk", - "traffichaus.com", - "trafficmanager.net", - "trafford.ac.uk", - "traffordcollege.ac.uk", - "traindelayprediction.ac.uk", - "traintogainstoke.ac.uk", - "tranny.one", - "trannygem.com", - "trannytube.tv", - "trannyvideosxxx.com", - "trans.ac.uk", - "trans500.com", - "transangels.com", - "transarmuito.com", - "transcamslive.com", - "transcocon.ac.uk", - "transferwise.com", - "transforming-musicology.ac.uk", - "transformingmusicology.ac.uk", - "transit.ac.uk", - "transitwestyorkshire.ac.uk", - "translate-medtech.ac.uk", - "translate.goog", - "translatetheweb.com", - "translatewiki.net", - "translatewiki.org", - "transnationalmodernlanguages.ac.uk", - "transparency.org", - "transpharmtech-cdt.ac.uk", - "transpharmtech-dtc.ac.uk", - "transpornsites.com", - "travelcontroller.com", - "travelex.be", - "travelex.bh", - "travelex.ca", - "travelex.co.in", - "travelex.co.jp", - "travelex.co.nz", - "travelex.co.uk", - "travelex.com", - "travelex.com.au", - "travelex.com.hk", - "travelex.com.my", - "travelex.com.om", - "travelex.com.tr", - "travelex.de", - "travelex.fr", - "travelex.it", - "travelex.qa", - "travelexae.com", - "travelexch.com", - "travelexmoneycard.com", - "travelgirls.com", - "travelinkcard.com", - "trc.ac.uk", - "treemall.com.tw", - "trello.com", - "trellocdn.com", - "trendmicro.com", - "trendsmap.com", - "trendyporn.com", - "tresham.ac.uk", - "trezor.io", - "tri-london.ac.uk", - "trialofccp.org", - "triballo.net", - "tribler.org", - "trickip.net", - "trickip.org", - "tricky-topics-guide.ac.uk", - "trident.ac.uk", - "trikepatrol.com", - "trilt.ac.uk", - "trimondi.de", - "trinity-bris.ac.uk", - "trinity-cm.ac.uk", - "trinitycollegebristol.ac.uk", - "trinitylaban.ac.uk", - "trinitysaintdavid.ac.uk", - "triokini.com", - "tristatebmw.com", - "trithucvn.net", - "trithucvn.org", - "trixhentai.com", - "trmini.com", - "trocoll.ac.uk", - "troisrivieresmini.com", - "tron.network", - "tronscan.org", - "tropictube.com", - "tropmed.ac.uk", - "trouw.nl", - "trpger.us", - "trs.ac.uk", - "trt.net.tr", - "trtc.com.tw", - "trueamateurmodels.com", - "trueamateurs.com", - "trueanal.com", - "truebeachporn.com", - "truebim.com", - "truebuddha-md.org", - "truedepth3d.com", - "truedwg.com", - "truefi.io", - "trulyergonomic.com", - "trunest.com", - "truro-penwith.ac.uk", - "truro.ac.uk", - "trurocollege.ac.uk", - "truropenwith.ac.uk", - "trust-provider.com", - "trustcor.ca", - "trustcor.com", - "trustdoc.ch", - "trusted-dwg.com", - "trustedanalytics.com", - "trustedanalytics.net", - "trusteddwg.com", - "trustedpeach.com", - "trustisfps.com", - "trustsign.ch", - "trustwave.com", - "truthontour.org", - "truthordarepics.com", - "truthsocial.com", - "truveo.com", - "truyen-hentai.com", - "truyen-hentai.fr", - "truyen-hentai.ru", - "truyen18.xyz", - "truyengihay.net", - "truyenhentai.xyz", - "truyenkk1.com", - "truyentranh86.com", - "truyenwk.com", - "tryalias.com", - "tryboobs.com", - "trycloudflare.com", - "trycuckold.com", - "trydesign.com", - "trydurex.net", - "trydurex.tv", - "tryengineering.org", - "tryfuckmenow.com", - "tryfunctions.com", - "tryheart.jp", - "tryquinn.com", - "tryrating.com", - "tryst.link", - "ts.la", - "ts.net", - "tsctv.net", - "tsd.ac.uk", - "tsdlondon.ac.uk", - "tse.ac.uk", - "tsec-biosys.ac.uk", - "tsemtulku.com", - "tsescortsdirectory.com", - "tsi.ai", - "tsl.ac.uk", - "tsmodelstube.com", - "tspline.com", - "tsplines.com", - "tsquare.tv", - "tsrc.ac.uk", - "tssp.best", - "tsthai.com", - "tsu.org.tw", - "tsumino.com", - "tsunagarumon.com", - "tsundora.com", - "tsyum.com", - "tt1069.com", - "ttc.ac.uk", - "tte-lisa.ac.uk", - "tteshop.com", - "ttetraining.ac.uk", - "ttk.ru", - "ttlivecdn.com", - "ttrb.ac.uk", - "tttan.com", - "ttv.com.tw", - "ttvnw.net", - "ttwstatic.com", - "tu8964.com", - "tubaholic.com", - "tube-pornomovs.com", - "tube-sex-videos.com", - "tube.bz", - "tube.com", - "tube18.sex", - "tube188.com", - "tube2011.com", - "tube2012.com", - "tube2017.com", - "tube4sex.com", - "tube4world.com", - "tube8.com", - "tube8.fr", - "tube8zoo.com", - "tube911.com", - "tubebdsm.com", - "tubecaptain.com", - "tubecop.com", - "tubecup.com", - "tubedna.com", - "tubedupe.com", - "tubeenema.com", - "tubefuckme.net", - "tubegalore.com", - "tubegals.com", - "tubegold.xxx", - "tubeislam.com", - "tubelombia.net", - "tubemature.tv", - "tubemogul.com", - "tubemovies4k.com", - "tubeorigin.com", - "tubepatrol.org", - "tubepornclassic.com", - "tubepornlist.com", - "tubepornstars.com", - "tubepornup.com", - "tubesafari.com", - "tubesex.me", - "tubeshemales.com", - "tubestack.com", - "tubetop69.com", - "tubetria.mobi", - "tubetubetube.com", - "tubev.pro", - "tubev.sex", - "tubevintageporn.com", - "tubewolf.com", - "tubexclips.com", - "tubinge.com", - "tubsexer.com", - "tubxporn.com", - "tubxporn.xxx", - "tuca.ac.uk", - "tuco.ac.uk", - "tudorpartbooks.ac.uk", - "tufos.com.br", - "tug.org", - "tuibeitu.net", - "tuidang.net", - "tuidang.org", - "tuidang.se", - "tuitui.info", - "tuitwit.com", - "tukaani.org", - "tukif.com", - "tumblr.com", - "tumutanzi.com", - "tumview.com", - "tuncommercialbank.com", - "tunein.com", - "tunnelbear.com", - "tunnelblick.net", - "tunnelr.com", - "tunsafe.com", - "tuo8.blue", - "tuo8.cc", - "tuo8.club", - "tuo8.fit", - "tuo8.hk", - "tuo8.in", - "tuo8.ninja", - "tuo8.org", - "tuo8.pw", - "tuo8.red", - "tuo8.space", - "turansam.org", - "turbobit.net", - "turbogvideos.com", - "turbohide.com", - "turborepo.org", - "turbotwitter.com", - "turbulence.ac.uk", - "turing.ac.uk", - "turingsafehaven.ac.uk", - "turkeyblocks.org", - "turkistantimes.com", - "turntable.fm", - "tushy.com", - "tushycash.com", - "tut.ac.jp", - "tuta.io", - "tutanota.com", - "tuvpn.com", - "tuzaijidi.com", - "tv.com", - "tv.google", - "tvants.com", - "tvappstore.net", - "tvb.com", - "tvb.com.au", - "tvbanywhere.com", - "tvbanywhere.com.sg", - "tvbeventpower.com.hk", - "tvboxnow.com", - "tvbs.com.tw", - "tvbusa.com", - "tvbweekly.com", - "tvc.ac.uk", - "tver.co.jp", - "tver.jp", - "tvider.com", - "tvmedia.net.au", - "tvmost.com.hk", - "tvnaviweb.jp", - "tvof.ac.uk", - "tvplayvideos.com", - "tvpromise.com", - "tvu.ac.uk", - "tvunetworks.com", - "tw-blog.com", - "tw-npo.org", - "tw01.org", - "tw985.com", - "twaitter.com", - "twapperkeeper.com", - "twaud.io", - "twavi.com", - "twavking.com", - "twbbs.net.tw", - "twbbs.org", - "twbbs.tw", - "twblogger.com", - "twca.com.tw", - "twcomix.com", - "tweakadmin.com", - "tweakfilms.com", - "tweaksoftware.com", - "tweepguide.com", - "tweeplike.me", - "tweepmag.com", - "tweepml.org", - "tweetbackup.com", - "tweetboard.com", - "tweetboner.biz", - "tweetcs.com", - "tweetdeck.com", - "tweetedtimes.com", - "tweetmylast.fm", - "tweetphoto.com", - "tweetrans.com", - "tweetree.com", - "tweettunnel.com", - "tweetwally.com", - "tweetymail.com", - "tweez.net", - "twelve.today", - "twenty65.ac.uk", - "twerkingbutt.com", - "twftp.org", - "twgreatdaily.com", - "twgreatnews.com", - "twhentai.com", - "twi-videos.net", - "twibase.com", - "twibble.de", - "twibbon.com", - "twibs.com", - "twicountry.org", - "twicsy.com", - "twidouga.net", - "twidouga.tv", - "twiends.com", - "twifan.com", - "twiffo.com", - "twifuli.com", - "twiggit.org", - "twilightsex.com", - "twilio.com", - "twilog.org", - "twimbow.com", - "twimg.com", - "twin-research.ac.uk", - "twindexx.com", - "twinkboyfriends.tv", - "twinkspornos.com", - "twinkybf.com", - "twinprime.com", - "twinsuk.ac.uk", - "twip.me", - "twipple.jp", - "twirl.ac.uk", - "twishort.com", - "twistar.cc", - "twistedlinks.net", - "twister.net.co", - "twisterio.com", - "twisternow.com", - "twistory.net", - "twistys.com", - "twit2d.com", - "twitbrowser.net", - "twitcause.com", - "twitch.tv", - "twitchcdn.net", - "twitchsvc.net", - "twitcomike.jp", - "twitgether.com", - "twitgoo.com", - "twitiq.com", - "twitlonger.com", - "twitmania.com", - "twitoaster.com", - "twitonmsn.com", - "twitpic.com", - "twitstat.com", - "twittbot.net", - "twitter.biz", - "twitter.com", - "twitter.jp", - "twitter4j.org", - "twittercommunity.com", - "twittercounter.com", - "twitterfeed.com", - "twitterflightschool.com", - "twittergadget.com", - "twitterinc.com", - "twitterkr.com", - "twittermail.com", - "twitteroauth.com", - "twitterrific.com", - "twitterstat.us", - "twittertim.es", - "twitthat.com", - "twitturk.com", - "twitturly.com", - "twitvid.com", - "twitzap.com", - "twiyia.com", - "twlegs.com", - "twline5.com", - "twnextdigital.com", - "twnorth.org.tw", - "twoo.com", - "twporn.net", - "twreporter.org", - "twskype.com", - "twstar.net", - "twt.tl", - "twtkr.com", - "twtrdns.net", - "twtrland.com", - "twttr.com", - "twttr.net", - "twurl.nl", - "twvid.com", - "twyac.org", - "tx.me", - "tx5254.com", - "txcloud.net", - "txdirectv.com", - "txqzz34r.com", - "txvia.com", - "txvlog.com", - "txxx.com", - "txxx1.com", - "tycool.com", - "tyler-brown.com", - "tyms2022.com", - "tyndall.ac.uk", - "tynecoast.ac.uk", - "tynecoll.ac.uk", - "tynemet.ac.uk", - "typeisbeautiful.com", - "typekit.com", - "typekit.net", - "typenetwork.com", - "typepad.com", - "typesquare.com", - "typography.com", - "typora.io", - "tyre-cadcam.com", - "tyrecadcam.com", - "tytng189.com", - "tytporno.online", - "u-tokyo.ac.jp", - "u.nu", - "u15.info", - "u3c3.com", - "u4heusergroup.ac.uk", - "u9a9.cc", - "u9a9.com", - "u9un.com", - "ua92.ac.uk", - "uaa.com", - "uab.com.mm", - "uad.ac.uk", - "uag.ac.uk", - "ual.ac.uk", - "uall.ac.uk", - "uas.ac.uk", - "ub0.cc", - "ubdc.ac.uk", - "ubddns.org", - "ubel-dtp.ac.uk", - "uber-assets.com", - "uber.com", - "ubereats.com", - "uberproxy.net", - "ubi.com", - "ubisoft-orbit-savegames.s3.amazonaws.com", - "ubisoft-uplay-savegames.s3.amazonaws.com", - "ubisoft.com", - "ubisoftconnect.com", - "ubn.ac.uk", - "ubncloud.com", - "ubnw.net", - "ubuntu-touch.io", - "ubuntu.com", - "ubuntu.net", - "ubuntuforums.org", - "uc-japan.org", - "uc-scarborough.ac.uk", - "uca.ac.uk", - "ucam.ac.uk", - "ucam.org", - "ucanews.com", - "ucas.ac.uk", - "ucas01.ac.uk", - "ucasgraduate.ac.uk", - "ucaspg.ac.uk", - "ucaspostgrad.ac.uk", - "ucaspostgraduate.ac.uk", - "ucat.ac.uk", - "ucav.ac.uk", - "ucb.ac.uk", - "ucc.ac.uk", - "ucdc1998.org", - "uce.ac.uk", - "ucea.ac.uk", - "ucem.ac.uk", - "ucenmanchester.ac.uk", - "ucet.ac.uk", - "ucf.ac.uk", - "ucfb.ac.uk", - "ucg.ac.uk", - "uchicago.edu", - "ucisa.ac.uk", - "ucl-status.ac.uk", - "ucl.ac.uk", - "ucla.edu", - "uclan.ac.uk", - "uclanresearch.ac.uk", - "ucleeds.ac.uk", - "uclglobal.ac.uk", - "ucmk.ac.uk", - "ucml.ac.uk", - "ucn.ac.uk", - "ucnl.ac.uk", - "uco.ac.uk", - "ucp.ac.uk", - "ucpmarjon.ac.uk", - "ucq.ac.uk", - "ucreaseheath.ac.uk", - "ucreative.ac.uk", - "ucs.ac.uk", - "ucsalf.ac.uk", - "ucsalford.ac.uk", - "ucsd.ac.uk", - "ucshrewsbury.ac.uk", - "ucsm.ac.uk", - "ucsp.ac.uk", - "ucss.ac.uk", - "ucw.ac.uk", - "ucwa.ac.uk", - "ucy.ac.uk", - "udacity.com", - "udel.ac.uk", - "udemy.com", - "udemycdn.com", - "uderzo.it", - "udfs.com", - "udn.com", - "udn.com.tw", - "udnbkk.com", - "udndata.com", - "udnfunlife.com", - "udtrucksmeena.com", - "uea.ac.uk", - "ueberamazon.de", - "uec.ac.uk", - "uedu.ac.uk", - "uee.ac.uk", - "ueharlax.ac.uk", - "uel.ac.uk", - "uetcollege.ac.uk", - "ufe.cz", - "uflash.tv", - "ufm.ac.uk", - "uforadio.com.tw", - "ufreevpn.com", - "ugo.com", - "uguisupapa.net", - "uhairy.com", - "uhdwallpapers.org", - "uhi.ac.uk", - "uhicloud.ac.uk", - "uhmlg.ac.uk", - "uhovi.ac.uk", - "uhr.ac.uk", - "uhrp.org", - "uhsl.ac.uk", - "uhub.com", - "ui.com", - "uighur.nl", - "uighurbiz.net", - "uiporn.com", - "uisp.com", - "ujapanesesex.com", - "ujizzcn.com", - "uk-cdi.ac.uk", - "uk-data-service.ac.uk", - "uk-exhibitionist.com", - "uk-imr.ac.uk", - "uk-india-energynetwork.ac.uk", - "uk.to", - "ukadia.ac.uk", - "ukaea.ac.uk", - "ukaff.ac.uk", - "ukandeu.ac.uk", - "ukarc.ac.uk", - "ukbiobank.ac.uk", - "ukc.ac.uk", - "ukca.ac.uk", - "ukcasa.ac.uk", - "ukcat.ac.uk", - "ukcbc.ac.uk", - "ukccsrc.ac.uk", - "ukcdp.co.uk", - "ukceh.ac.uk", - "ukcge.ac.uk", - "ukchinab4g.ac.uk", - "ukcle.ac.uk", - "ukclt.ac.uk", - "ukcmri.ac.uk", - "ukcp.ac.uk", - "ukcpmn.ac.uk", - "ukctas.ac.uk", - "ukda.ac.uk", - "ukdataservice.ac.uk", - "ukdementiaresearchinstitute.ac.uk", - "ukdri.ac.uk", - "ukds.ac.uk", - "ukerc.ac.uk", - "ukerna.ac.uk", - "ukesm.ac.uk", - "ukfast.ac.uk", - "ukgeos.ac.uk", - "ukgrad.ac.uk", - "ukhec.ac.uk", - "ukhls.ac.uk", - "ukimr.ac.uk", - "ukipad.com", - "ukirc.ac.uk", - "uklibrariesplus.ac.uk", - "ukliferadio.co.uk", - "uklight.ac.uk", - "ukm.ac.uk", - "ukmed.ac.uk", - "ukmhd.ac.uk", - "ukmhr.ac.uk", - "ukmsn.ac.uk", - "ukndn.ac.uk", - "uknet.ac.uk", - "ukngi.ac.uk", - "uknibc.ac.uk", - "ukoln.ac.uk", - "ukorea.ac.uk", - "ukpass.ac.uk", - "ukpmc.ac.uk", - "ukpmcplus.ac.uk", - "ukpubmedcentral.ac.uk", - "ukqcd.ac.uk", - "ukresearchandinnovation.ac.uk", - "ukrheeo.ac.uk", - "ukri.ac.uk", - "ukro.ac.uk", - "ukrr.ac.uk", - "ukscl.ac.uk", - "ukserp.ac.uk", - "uksrn.ac.uk", - "ukssdc.ac.uk", - "ukt0.ac.uk", - "uktrc.ac.uk", - "uku.im", - "ukupc.ac.uk", - "ukwhoswho.com", - "ukzikaresponse.ac.uk", - "ulcc.ac.uk", - "ulh.ac.uk", - "ulifestyle.com.hk", - "ulike.net", - "ull.ac.uk", - "ulol.com", - "ulop.net", - "ulsop.ac.uk", - "ulst.ac.uk", - "ulster.ac.uk", - "ulth.ac.uk", - "ultimaforever.com", - "ultimaonline.com", - "ultradonkey.com", - "ultralab.ac.uk", - "ultravpn.fr", - "ultraxs.com", - "umagazine.com.hk", - "umass.edu", - "umd.edu", - "umds.ac.uk", - "umich.edu", - "umis.ac.uk", - "umist.ac.uk", - "ums.ac.uk", - "umslg.ac.uk", - "umtc.ac.uk", - "un.org", - "unblock-us.com", - "unblock.cn.com", - "unblockdmm.com", - "unblocker.yt", - "unblocksit.es", - "unbrandedproducts.com", - "uncams.com", - "uncensoredhentai.xxx", - "uncensoredsexparties.com", - "uncyclomedia.org", - "uncyclopedia.hk", - "uncyclopedia.tw", - "underhentai.net", - "underlords.com", - "underpinningexcellenceinhe.ac.uk", - "understanding-inequalities.ac.uk", - "understandingsociety.ac.uk", - "underwoodammo.com", - "unfiltered.news", - "unholyknight.com", - "uni-east.ac.uk", - "uni.cc", - "unialliance.ac.uk", - "unicode.org", - "unidesk.ac.uk", - "unification.net", - "unification.org.tw", - "unilang.ac.uk", - "uninhibitedcomix.com", - "union.ac.uk", - "unirule.cloud", - "unis4ne.ac.uk", - "unisat.io", - "unistats.ac.uk", - "unisurreydirect.ac.uk", - "uniswales.ac.uk", - "uniswap.org", - "unitedcollegegroup.ac.uk", - "unitedcollegesgroup.ac.uk", - "unitedsocialpress.com", - "unity.ac.uk", - "unity.cn", - "unity.com", - "unity3d.com", - "unitychina.cn", - "univault.ac.uk", - "universalorlando.com", - "universalpictures.com", - "universalpicturesinternational.com", - "universalstudioshollywood.com", - "universities-scotland.ac.uk", - "universitiesengland.ac.uk", - "universitiesfornottingham.ac.uk", - "universitieshr.ac.uk", - "universitiesinlondon.ac.uk", - "universitiesireland.ac.uk", - "universitiesnorthernireland.ac.uk", - "universitiesscotland.ac.uk", - "universitiesuk.ac.uk", - "universitieswales.ac.uk", - "universitiesweek.ac.uk", - "universitieswm.ac.uk", - "university-alliance.ac.uk", - "university-central-england.ac.uk", - "university-of-cambridge.ac.uk", - "universityacademy92.ac.uk", - "universitycampusscarborough.ac.uk", - "universitycentreharlow.ac.uk", - "universitycentrehastings.ac.uk", - "universitycentresouthend.ac.uk", - "universitycentrestratford.ac.uk", - "universitycentrethurrock.ac.uk", - "universitychairs.ac.uk", - "universitycollegefalmouth.ac.uk", - "universitycollegescarborough.ac.uk", - "universityenglish.ac.uk", - "universityofcambridge.ac.uk", - "universityofchichester.ac.uk", - "universityoflondon.ac.uk", - "universityofscarborough.ac.uk", - "universityofscarboroughcollege.ac.uk", - "universityofsuffolk.ac.uk", - "universityofwestlondon.ac.uk", - "universitypressscholarship.com", - "universityquarter-stoke.ac.uk", - "universitysquarestratford.ac.uk", - "unix100.com", - "unknownspace.org", - "unkoscene.com", - "unl.ac.uk", - "unlocklimitlesslearning.com", - "unlocktool.net", - "unn.ac.uk", - "unodedos.com", - "unpkg.com", - "unpo.org", - "unravel2.com", - "unraveltwo.com", - "unrealengine.com", - "unrealtournament.com", - "unseen.is", - "unstable.icu", - "unstyle.us", - "untraceable.us", - "unusualporn.net", - "unwire.hk", - "uo.com", - "uocn.org", - "uod.ac.uk", - "uoherald.com", - "uol.ac.uk", - "uos.ac.uk", - "up01.cc", - "upa.ac.uk", - "updates.ac.uk", - "updatestar.com", - "updatetube.com", - "upen.ac.uk", - "upenn.edu", - "upfrontcfd.com", - "upfrontfea.com", - "upghsbc.com", - "upholdjustice.org", - "upjav.cc", - "uplay-istrip.com", - "uplay.com", - "uplinq.com", - "upload4u.info", - "uploaded.net", - "uploaded.to", - "uploadstation.com", - "uplust.com", - "uplynk.com", - "upmedia.mg", - "upmg.ac.uk", - "upornia.com", - "uporno.xxx", - "uproxy.org", - "uptodown.com", - "upwill.org", - "ur7s.com", - "ura-akiba.jp", - "uraban.me", - "urasma.com", - "urbanbigdatacentre.ac.uk", - "urbandictionary.com", - "urbanfloodresilience.ac.uk", - "urbanflows.ac.uk", - "urbanlivinglab.ac.uk", - "urbanobservatory.ac.uk", - "urbansurvival.com", - "urchin.com", - "urduvoa.com", - "url.com.tw", - "urlborg.com", - "urlgalleries.net", - "urlparser.com", - "urukawa.com", - "us-west-2.amazonaws.com", - "us.to", - "usa-beatsbydreheadphonesonsale.net", - "usablepast.ac.uk", - "usacn.com", - "usaco.org", - "usaip.eu", - "usatoday.com", - "usatodaynetworkservice.com", - "usc.edu", - "uscardforum.com", - "uscnpm.org", - "use-of-mans.ac.uk", - "usefreevpn.com", - "uselessjunk.com", - "usembassy.gov", - "useplannr.com", - "userapi.com", - "usercontent.dev", - "userpxt.io", - "usertrust.com", - "usfk.mil", - "ushare.ac.uk", - "ushaw.ac.uk", - "usma.edu", - "usmc.mil", - "usocctn.com", - "uspcollege.ac.uk", - "uspto.gov", - "usstratford.ac.uk", - "ust.ac.uk", - "ustc.ac.uk", - "ustibetcommittee.org", - "ustream.tv", - "usunitednews.com", - "usus.cc", - "usvimosquito.com", - "usvimosquitoproject.com", - "usw.ac.uk", - "utcreading.ac.uk", - "utopianpal.com", - "uu-gg.com", - "uug22.com", - "uug23.com", - "uug25.com", - "uug26.com", - "uug27.com", - "uuk.ac.uk", - "uuk28.com", - "uukanshu.com", - "uun78.com", - "uun79.com", - "uun82.com", - "uun83.com", - "uun85.com", - "uun86.com", - "uun87.com", - "uun89.com", - "uun92.com", - "uun93.com", - "uun95.com", - "uun96.com", - "uun97.com", - "uun98.com", - "uun99.com", - "uup76.com", - "uusexdoll.com", - "uusextoy.com", - "uux68.com", - "uvac.ac.uk", - "uverse.com", - "uvwxyz.xyz", - "uwants.com", - "uwants.net", - "uwaterloo.ca", - "uwb-global.ac.uk", - "uwcatlantic.ac.uk", - "uwchgyfrifiaduracymru.ac.uk", - "uwe-bristol.ac.uk", - "uwe.ac.uk", - "uwern.ac.uk", - "uwic.ac.uk", - "uwinat.ac.uk", - "uwl.ac.uk", - "uwpcommunitytoolkit.com", - "uws.ac.uk", - "uwtsd.ac.uk", - "uwtsdlondon.ac.uk", - "uxbridge.ac.uk", - "uxbridgecollege.ac.uk", - "uyghur-archive.com", - "uyghur-j.org", - "uyghur.co.uk", - "uyghuraa.org", - "uyghuramerican.org", - "uyghurbiz.org", - "uyghurcanadian.ca", - "uyghurcanadiansociety.org", - "uyghurcongress.org", - "uyghurensemble.co.uk", - "uyghurpen.org", - "uyghurpress.com", - "uyghurstudies.org", - "uyghurtribunal.com", - "uygur.org", - "uymaarip.com", - "v-av.com", - "v-has.com", - "v-resort.ac.uk", - "v.gd", - "v2board.com", - "v2ex.com", - "v2fly.org", - "v2mm.tech", - "v2ph.com", - "v2ray.com", - "v2ray.cool", - "v2raya.org", - "v2raycn.com", - "v2raytech.com", - "v7hds.com", - "v8.dev", - "v8project.org", - "vaccine.ac.uk", - "vads.ac.uk", - "vagabundasdoorkut.net", - "vagina.nl", - "vaginacontest.com", - "vaginal-ultrasound.com", - "vaginalultrasound.info", - "vaginapics.pro", - "vagrantcloud.com", - "vagrantup.com", - "valeursactuelles.com", - "valoryirene.com", - "valuegb.com", - "valvesoftware.com", - "vam.ac.uk", - "vamsas.ac.uk", - "van001.com", - "van698.com", - "vancouverbmwretailers.ca", - "vanemu.cn", - "vanilla-jp.com", - "vanish.at", - "vanish.be", - "vanish.ch", - "vanish.cl", - "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.sk", - "vanisharabia.com", - "vanishbancaseulook.com.br", - "vanishcentroamerica.com", - "vanishinfo.cz", - "vanishstains.com", - "vanishstains.com.au", - "vanitaonline.com", - "vanitha.in", - "vanithaveedu.com", - "vanpeople.com", - "vansky.com", - "varndean.ac.uk", - "vast.ac.uk", - "vastenm.com", - "vaticannews.va", - "vatn.org", - "vaughan.ac.uk", - "vaultify.com", - "vaultify.info", - "vaultify.net", - "vaultproject.io", - "vbejeyv.shop", - "vcanedge.com", - "vcf-online.org", - "vcfbuilder.org", - "vcloudair.net", - "vcol.ac.uk", - "vcoll.ac.uk", - "vct.news", - "vday.io", - "vdoav.com", - "vecchiescopate.casa", - "vector.im", - "veet.at", - "veet.be", - "veet.ca", - "veet.ch", - "veet.cl", - "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.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.us", - "veetarabia.com", - "veetbangladesh.com", - "veetcentroamerica.com", - "veetclub.it", - "vegasred.com", - "velaserver.com", - "velastaging.com", - "velasync.com", - "velasystems.com", - "velatest.com", - "velkaepocha.cz", - "velkaepocha.sk", - "velocloud.com", - "velostrata.com", - "venbbs.com", - "venchina.com", - "vendu.com", - "venetianmacao.com", - "venezporn.com", - "venmo-touch.com", - "venmo.com", - "venmo.info", - "venmo.net", - "venmo.org", - "venmo.s3.amazonaws.com", - "ventureswell.com", - "veoh.com", - "veporn.com", - "vepornhd.club", - "veporno.net", - "vercel-dns.com", - "vercel-status.com", - "vercel.app", - "vercel.blog", - "vercel.com", - "vercel.events", - "vercel.live", - "vercel.pub", - "vercel.sh", - "vercel.store", - "vercomicsporno.xxx", - "verhentai.tv", - "verifid.ac.uk", - "verily.com", - "verilylifesciences.com", - "verilystudyhub.com", - "verilystudywatch.com", - "verilystudywatch.org", - "verisign.asia", - "verisign.biz", - "verisign.ch", - "verisign.co.in", - "verisign.co.uk", - "verisign.com", - "verisign.com.au", - "verisign.com.br", - "verisign.com.cn", - "verisign.com.es", - "verisign.com.hk", - "verisign.com.sg", - "verisign.com.tw", - "verisign.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.vn", - "verisigninc.com", - "verizon.com", - "verizon.net", - "verizonbusinessfios.com", - "verizondigitalmedia.com", - "verizonenterprise.com", - "verizonfios.com", - "verizonmedia.com", - "verizonwireless.com", - "vermonttibet.org", - "verpeliculasporno.gratis", - "versavpn.com", - "versign.net", - "versly.com", - "vervesex.com", - "verybs.com", - "verygoodnike.com", - "veryladyboy.com", - "veryshortintroductions.com", - "vetgate.ac.uk", - "vetnetlln.ac.uk", - "vetschools.ac.uk", - "vetschoolscouncil.ac.uk", - "vetset2go.ac.uk", - "vetvaccnet.ac.uk", - "vevo.com", - "vfabric.net", - "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.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", - "vfsforgit.com", - "vfsforgit.org", - "vft.com.tw", - "vgcareers.net", - "vge.ac.uk", - "vgg8.com", - "vgta.ac.uk", - "vhx.tv", - "vhxqa1.com", - "vhxqa2.com", - "vhxqa3.com", - "vhxqa4.com", - "vhxqa6.com", - "via0.com", - "viacbs.com", - "viacom.com", - "viacomcbs.com", - "viacomcbspressexpress.com", - "viber.com", - "vica.info", - "vicarious.ac.uk", - "victimsofcommunism.org", - "victoriacountyhistory.ac.uk", - "vid.me", - "vidble.com", - "video-jav.net", - "video-one.com", - "video01.org", - "videoactive.ac.uk", - "videobam.com", - "videobreakdown.com", - "videochampion.com", - "videodelivery.net", - "videodesexo.blog", - "videodetective.com", - "videoindexer.ai", - "videojs.com", - "videolan.org", - "videoleak.me", - "videomarket.jp", - "videomega.tv", - "videomo.com", - "videopediaworld.com", - "videopress.com", - "videos4sale.com", - "videosamadoresreais.com", - "videosdemadurasx.com", - "videosdepornografia.blog.br", - "videosdesexo.br.com", - "videosdesexo.com.br", - "videosection.com", - "videoshorny.com", - "videoskaseros.com", - "videosmadeathome.com", - "videosporno.com.br", - "videosporno.life", - "videostravestis.xxx", - "videoxxxporn.biz", - "videozzz.com", - "vidinfo.org", - "vidlearn.ac.uk", - "vidmpreview.com", - "vidown.com", - "vidspornoduro.com", - "viet.sex", - "viet69.dev", - "viet69.link", - "viet69.news", - "vietdaikynguyen.com", - "viewerswives.net", - "viewgals.com", - "viewpointsfromfacebook.com", - "vijayatemple.org", - "vikiporn.com", - "vilavpn.com", - "vilavpn.xyz", - "vilavpn1.xyz", - "vilavpn2.xyz", - "vilavpn3.xyz", - "vilavpn4.xyz", - "vilavpn5.xyz", - "vilavpn6.xyz", - "vilavpn7.xyz", - "vim.org", - "vimeo-staging.com", - "vimeo-staging2.com", - "vimeo.com", - "vimeo.fr", - "vimeobusiness.com", - "vimeocdn.com", - "vimeogoods.com", - "vimeoondemand.com", - "vimeostatus.com", - "vimperator.org", - "vincnd.com", - "vine.co", - "vinniev.com", - "vintage-erotica-forum.com", - "vintageamateurporn.com", - "vintagehomemadesex.com", - "vintagemedicalpictures.com", - "vintagexxxfilms.com", - "vip-beats.com", - "vip-enterprise.com", - "vipbeatsbydre.com", - "vipergirls.to", - "vipheadphones.com", - "vipissy.com", - "vipmatureporn.com", - "vipoo.es", - "vipshoes2.com", - "vipstudiocali.com", - "viralcum.com", - "viralporn.com", - "virginia.edu", - "virginpornlinks.com", - "viriondb.com", - "virsto.com", - "virsto.net", - "virtualbox.org", - "virtualcollege.ac.uk", - "virtualearth.net", - "virtualpartyworld.com", - "virtualporn.com", - "virtualrealgay.com", - "virtualrealporn.com", - "virtualrealtrans.com", - "virtualtaboo.com", - "virtuata.com", - "virulogenome.ac.uk", - "visa-atm.com", - "visa-news.jp", - "visa.be", - "visa.ca", - "visa.cl", - "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.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.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", - "visabank.org", - "visabg.com", - "visabusinessinsights.com", - "visacarddesignlab.com", - "visacards.com", - "visacheckout.net", - "visacheckout.org", - "visaconciergelac.com", - "visadigital.com", - "visadigitalconcierge.com", - "visadns.com", - "visadpsonline.us", - "visaeurope.at", - "visaeurope.ch", - "visaeurope.lu", - "visaeurope.si", - "visaeverywhereshop.com", - "visafintechfasttrack.com", - "visafulfillment.com", - "visagiftcard.us", - "visaglobalfinance.com", - "visaicsdirect.com", - "visainfinite.ca", - "visainfiniteluxuryhotels.ca", - "visaitalia.com", - "visakorea.com", - "visaluxuryhotelcollection.com", - "visaluxuryhotelcollection.com.br", - "visaluxuryhotelcollection.com.mx", - "visaluxuryhotels.com", - "visaluxuryhotels.com.ar", - "visamiddleeast.com", - "visanet.net", - "visapcsdirect.com", - "visaplus.com", - "visasavingsedge.ca", - "visasignature.co.kr", - "visasignaturehotels.com", - "visasoutheasteurope.com", - "visb.org", - "visceralgames.com", - "visibletweets.com", - "visionnaires.ac.uk", - "visiontimes.com", - "visiontimes.de", - "visiontimes.fr", - "visiontimes.it", - "visiontimes.net", - "visiontimesjp.com", - "visnet.ac.uk", - "vista.ac.uk", - "visual-arts.jp", - "visual-evidence.ac.uk", - "visualarts.gr.jp", - "visuallearninglab.ac.uk", - "visualrhetoric.ac.uk", - "visualstudio-staging.com", - "visualstudio.co", - "visualstudio.co.uk", - "visualstudio.com", - "visualstudio.eu", - "visualstudio.net", - "vitae.ac.uk", - "vital.ac.uk", - "vital247.org", - "vitukali.com", - "viu.com", - "viu.tv", - "vivahentai4u.net", - "vivaldi.com", - "vivatube.com", - "vivaxnxx.com", - "vivthomas.com", - "vixen.com", - "vixvids.to", - "viznet.ac.uk", - "vizvaz.com", - "vjav.com", - "vjmedia.com.hk", - "vk-cdn.me", - "vk-cdn.net", - "vk-portal.net", - "vk.cc", - "vk.com", - "vk.design", - "vk.link", - "vk.me", - "vk.ru", - "vkcache.com", - "vkgo.app", - "vklive.app", - "vkmessenger.app", - "vkmessenger.com", - "vkontakte.ru", - "vkuseraudio.com", - "vkuserlive.net", - "vkuservideo.com", - "vkuservideo.net", - "vl4x.net", - "vllcs.org", - "vmglobal.net", - "vmixcore.com", - "vmmark.com", - "vmpsoft.com", - "vmtestdrive.com", - "vmw.com", - "vmware-cloudmanagement.com", - "vmware-techcenter.com", - "vmware.com", - "vmware20mosaic.com", - "vmwareausnews.com", - "vmwarecertificationvideos.com", - "vmwarecloud.com", - "vmwaredemandcenter.com", - "vmwareemeablog.com", - "vmwaregrid.com", - "vmwarehorizon.com", - "vmwareidentity.com", - "vmwarelearning.com", - "vmwarelearningplatform.com", - "vmwarestuff.com", - "vmwareusergroupstore.com", - "vmwareviewpoint.com", - "vmwarevmc.com", - "vmwdemo.com", - "vmwgcomms.com", - "vmwhorizonair.com", - "vmwidm-ads.com", - "vmwidm.com", - "vmwlabconnect.com", - "vmwlearningplatform.com", - "vmworld.com", - "vmworld2010.com", - "vmworld2013.com", - "vmwsalesrewards.com", - "vmwservices.com", - "vmwxw.com", - "vnanchoi.ca", - "vnet.link", - "vnware.net", - "voa.gov", - "voa.mobi", - "voaafaanoromoo.com", - "voaafrique.com", - "voabambara.com", - "voabangla.com", - "voacambodia.com", - "voacantonese.com", - "voachinese.com", - "voachineseblog.com", - "voadeewanews.com", - "voadeewaradio.com", - "voagd.com", - "voahausa.com", - "voaindonesia.com", - "voakorea.com", - "voalingala.com", - "voandebele.com", - "voanews.com", - "voanews.eu", - "voanoticias.com", - "voanouvel.com", - "voaportugues.com", - "voashona.com", - "voasomali.com", - "voaswahili.com", - "voathai.com", - "voatibetan.com", - "voatibetanenglish.com", - "voatiengviet.com", - "voatour.com", - "voazimbabwe.com", - "vocativ.com", - "vocn.tv", - "vocus.cc", - "vod360.net", - "vodafone.co.uk", - "vodafone.com", - "vodafone.com.au", - "vodafone.com.tr", - "vodafone.de", - "vodafone.it", - "voi.id", - "voicettank.org", - "voila.ac.uk", - "vokevr.com", - "vol.moe", - "volstudy.ac.uk", - "volvo-truck.nl", - "volvo.ca", - "volvo.com", - "volvo.se", - "volvobrandshop.com", - "volvobuses.at", - "volvobuses.be", - "volvobuses.ca", - "volvobuses.ch", - "volvobuses.co", - "volvobuses.co.nz", - "volvobuses.co.uk", - "volvobuses.co.za", - "volvobuses.com", - "volvobuses.com.ar", - "volvobuses.com.au", - "volvobuses.com.br", - "volvobuses.com.kw", - "volvobuses.com.pt", - "volvobuses.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.com", - "volvodefense.com", - "volvogroup.be", - "volvogroup.com", - "volvogroup.com.br", - "volvogroup.de", - "volvogroup.fr", - "volvogroup.jp", - "volvogroup.kr", - "volvogroup.mx", - "volvogroup.nl", - "volvogroup.pe", - "volvogroup.pl", - "volvogroup.ru", - "volvogroup.se", - "volvogrouptruckcenter.nl", - "volvomerchandise.com", - "volvopenta.com", - "volvopenta.com.br", - "volvopenta.de", - "volvopenta.es", - "volvopenta.fr", - "volvopenta.it", - "volvopenta.nl", - "volvopenta.se", - "volvopenta.us", - "volvosaatio.fi", - "volvospares.com", - "volvotruckcenter.be", - "volvotruckcenter.dk", - "volvotruckcenter.es", - "volvotruckcenter.fi", - "volvotruckcenter.it", - "volvotruckcenter.kr", - "volvotruckcenter.kz", - "volvotruckcenter.nl", - "volvotruckcenter.no", - "volvotruckcenter.se", - "volvotruckrental.be", - "volvotrucks.ae", - "volvotrucks.al", - "volvotrucks.am", - "volvotrucks.at", - "volvotrucks.az", - "volvotrucks.ba", - "volvotrucks.be", - "volvotrucks.bg", - "volvotrucks.by", - "volvotrucks.ch", - "volvotrucks.cl", - "volvotrucks.co.ao", - "volvotrucks.co.bw", - "volvotrucks.co.il", - "volvotrucks.co.mz", - "volvotrucks.co.na", - "volvotrucks.co.nz", - "volvotrucks.co.uk", - "volvotrucks.co.za", - "volvotrucks.co.zm", - "volvotrucks.co.zw", - "volvotrucks.com", - "volvotrucks.com.ar", - "volvotrucks.com.au", - "volvotrucks.com.bn", - "volvotrucks.com.br", - "volvotrucks.com.co", - "volvotrucks.com.kw", - "volvotrucks.com.pt", - "volvotrucks.com.tr", - "volvotrucks.com.tw", - "volvotrucks.com.ua", - "volvotrucks.cz", - "volvotrucks.de", - "volvotrucks.dk", - "volvotrucks.ee", - "volvotrucks.es", - "volvotrucks.fi", - "volvotrucks.fr", - "volvotrucks.ge", - "volvotrucks.gr", - "volvotrucks.hk", - "volvotrucks.hr", - "volvotrucks.hu", - "volvotrucks.id", - "volvotrucks.in", - "volvotrucks.it", - "volvotrucks.jp", - "volvotrucks.kg", - "volvotrucks.kr", - "volvotrucks.kz", - "volvotrucks.lt", - "volvotrucks.lv", - "volvotrucks.ma", - "volvotrucks.md", - "volvotrucks.mk", - "volvotrucks.mn", - "volvotrucks.my", - "volvotrucks.net", - "volvotrucks.nl", - "volvotrucks.no", - "volvotrucks.pe", - "volvotrucks.ph", - "volvotrucks.pk", - "volvotrucks.pl", - "volvotrucks.ps", - "volvotrucks.qa", - "volvotrucks.ro", - "volvotrucks.rs", - "volvotrucks.ru", - "volvotrucks.se", - "volvotrucks.sg", - "volvotrucks.si", - "volvotrucks.sk", - "volvotrucks.tm", - "volvotrucks.tn", - "volvotrucks.uy", - "vomitkings.com", - "vortexmachining.com", - "vot.org", - "votolia.com", - "vovo2000.com", - "vows.ac.uk", - "vox-cdn.com", - "vox.com", - "voxcreative.com", - "voxer.com", - "voxfieldguide.com", - "voxmedia.com", - "voxops.net", - "voy.com", - "voyeureye.com", - "voyeurhit.com", - "voyeurhouse.com", - "voyeurmonkey.com", - "voyeurpapa.com", - "voyeurporntapes.com", - "voyeurstyle.com", - "voyeurweb.com", - "vpn.ac", - "vpn4all.com", - "vpnaccount.org", - "vpnaccounts.com", - "vpnbook.com", - "vpncomparison.org", - "vpncoupons.com", - "vpncup.com", - "vpndada.com", - "vpnfan.com", - "vpnfire.com", - "vpnfires.biz", - "vpnforgame.net", - "vpngate.jp", - "vpngate.net", - "vpngratis.net", - "vpnhq.com", - "vpnhub.com", - "vpninja.net", - "vpnintouch.com", - "vpnintouch.net", - "vpnjack.com", - "vpnmaster.com", - "vpnmentor.com", - "vpnpick.com", - "vpnpop.com", - "vpnpronet.com", - "vpnreactor.com", - "vpnreviewz.com", - "vpnsecure.me", - "vpnshazam.com", - "vpnshieldapp.com", - "vpnsp.com", - "vpntraffic.com", - "vpntunnel.com", - "vpnuk.info", - "vpnunlimitedapp.com", - "vpnvip.com", - "vpnworldwide.com", - "vporn.com", - "vpornvideos.com", - "vpro.com", - "vpro.net", - "vpser.net", - "vr.org", - "vraiesagesse.net", - "vrbgay.com", - "vrcams.io", - "vred-essentials.com", - "vredessentials.com", - "vredprofessional.com", - "vrfun18.com", - "vrmtr.com", - "vrnastran.com", - "vrporn.com", - "vrporncat.com", - "vrpornjack.com", - "vrpornmania.com", - "vrpornranked.com", - "vrsexgames.biz", - "vrsmash.com", - "vrsumo.com", - "vrv.co", - "vs.com", - "vsallin.net", - "vsassets.io", - "vscode-cdn.net", - "vscode-unpkg.net", - "vscode.dev", - "vsezoo.com", - "vsphere.com", - "vsphere.net", - "vssn.ac.uk", - "vtri.ac.uk", - "vts.ac.uk", - "vtsociety.org", - "vtstutorials.ac.uk", - "vtunnel.com", - "vtvan.com", - "vuku.cc", - "vulgarx.com", - "vultr.com", - "vultryhw.com", - "vuvuzela.io", - "vyprvpn.com", - "vzw.com", - "w-mt.co", - "w.org", - "w.wiki", - "w0512.com", - "w3.org", - "w3schools.com", - "w6un.com", - "wa.me", - "waa.tw", - "wac.ac.uk", - "wacc.ac.uk", - "waes.ac.uk", - "waf.ac.uk", - "waffle1999.com", - "wahas.com", - "waigaobu.com", - "waikeung.org", - "wailaike.net", - "wainao.me", - "waisongcha.com", - "waiwaier.com", - "wakcoll.ac.uk", - "wakefield.ac.uk", - "wakwak.com", - "wal-mart.com", - "wal.co", - "walc.ac.uk", - "walcat.ac.uk", - "wales.ac.uk", - "wales1801-1919.ac.uk", - "walesdtc.ac.uk", - "walesdtp.ac.uk", - "walesglobalcampus.ac.uk", - "walesmep.ac.uk", - "walker-institute.ac.uk", - "walker.ac.uk", - "wallet.com", - "walletconnect.com", - "wallhaven.cc", - "wallmama.com", - "wallornot.org", - "wallpapercasa.com", - "wallproxy.com", - "wallsttv.com", - "walmart-content.com", - "walmart.com", - "walmart.pharmacy", - "walmartimages.com", - "walsall-coce.ac.uk", - "walsallcollege.ac.uk", - "waltermartin.com", - "waltermartin.org", - "waltham.ac.uk", - "walthamintcollege.ac.uk", - "wan-press.org", - "wana-tv.sbs", - "wancctv.asia", - "wandan-dh.buzz", - "wanderinghorse.net", - "wanduww.buzz", - "wangafu.net", - "wangjinbo.org", - "wanglixiong.com", - "wango.org", - "wangruoshui.net", - "wangruowang.org", - "wankgames.com", - "wankizer.com", - "wankoz.com", - "wankz.com", - "wankzvr.com", - "wanokokorosoh.com", - "want-daily.com", - "want-media.com", - "want520.com", - "wantblogger.com", - "wantmywife.com", - "wanz-factory.com", - "wapedia.mobi", - "waplog.com", - "wapm.io", - "waranlov.com", - "warddogs.com", - "warehouse333.com", - "wariolandshakeit.com", - "wariowarediy.com", - "warkscol.ac.uk", - "warnermediacdn.com", - "warp.plus", - "warr.ac.uk", - "warrington.ac.uk", - "warroom.org", - "warwick.ac.uk", - "warwickequine.ac.uk", - "warwickhri.ac.uk", - "warwickshire.ac.uk", - "wasdj.com", - "waselpro.com", - "washa.tv", - "washeng.net", - "washingtondcbmw.com", - "washingtonpost.com", - "waskucity.com", - "wasmer.io", - "watch-ebay.org", - "watch-my-gf.com", - "watch-porn.net", - "watch8x.com", - "watchanimeattheoffice.com", - "watchdisneyfe.com", - "watchersweb.com", - "watchespn.com", - "watchindianporn.net", - "watchinese.com", - "watchjavonline.com", - "watchmyexgf.net", - "watchmygf.me", - "watchmygf.net", - "watchmygf.to", - "watchmygirlfriend.tv", - "watchout.tw", - "watchteencam.com", - "water-and-power.com", - "waterdamagesandiego.org", - "waterfox.net", - "watersex.com", - "waterwisercdt.ac.uk", - "wattpad.com", - "wav.tv", - "waveomoney.com.mm", - "waveprotocol.org", - "waverleyabbeycollege.ac.uk", - "waymo.com", - "waze.com", - "wballiance.com", - "wbd.ms", - "wbdnbo.net", - "wbrks.com", - "wbs.ac.uk", - "wbvm4s.com", - "wcc.ac.uk", - "wccsj.ac.uk", - "wcg.ac.uk", - "wcmd.ac.uk", - "wcoh.ac.uk", - "wcs.ac.uk", - "wct.ac.uk", - "wd.bible", - "wd.com", - "wda.gov.tw", - "wdc.com", - "wddcp.ac.uk", - "wdf5.com", - "wdfiles.com", - "wea.ac.uk", - "weald.ac.uk", - "wealth.com.tw", - "weareebay.com", - "wearehairy.com", - "wearn.com", - "wearside.ac.uk", - "weather.com.hk", - "weav.xyz", - "web-instagram.net", - "web.app", - "web.dev", - "web2project.net", - "webappfieldguide.com", - "webbang.net", - "webcam-teen.net", - "webcamgirls.chat", - "webcamjackers.com", - "webcammedellin.co", - "webcams.tv", - "webcamtubexxx.com", - "webevader.org", - "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.hk", - "webex.com.mx", - "webex.de", - "webex.es", - "webex.fr", - "webflow.com", - "webfreer.com", - "webgata.net", - "webgirlsonline.net", - "webhosting.com", - "webjb.org", - "webkit.org", - "webkitgtk.org", - "weblagu.com", - "webmoneyinfo.com", - "webmproject.org", - "webnovel.com", - "webobjects.co.uk", - "webobjects.com", - "webobjects.de", - "webobjects.eu", - "webobjects.net", - "webofknowledge.com", - "webofscience.com", - "webpa.ac.uk", - "webpack.de", - "webpkgcache.com", - "webra.ru", - "webrtc.org", - "webrush.net", - "webs-tv.net", - "websitepulse.com", - "websnapr.com", - "webster.ac.uk", - "webtoons.com", - "webtoonscorp.com", - "webtype.com", - "webwarper.net", - "webworkerdaily.com", - "wechatlawsuit.com", - "weebly.com", - "weekly-economist.com", - "weeklytimesnow.com.au", - "weekmag.info", - "wefightcensorship.org", - "wefong.com", - "weiboleak.com", - "weihuo.org", - "weijingsheng.org", - "weimi180.com", - "weiming.info", - "weinvoiceit.com", - "weiquanwang.org", - "weisuo.ws", - "weitt.us", - "weiyuksj.com", - "weknowporn.com", - "welbeck.ac.uk", - "welcometobestbuy.ca", - "welcomix.com", - "welfareconditionality.ac.uk", - "well.ac.uk", - "wellbeing.ac.uk", - "wellcome.ac.uk", - "wellfuckedwife.com", - "wellmaturetube.com", - "welovecock.com", - "welsh-dictionary.ac.uk", - "welshmediumhe.ac.uk", - "welshsaints.ac.uk", - "welt.de", - "weltweitwachsen.de", - "wemigrate.org", - "wen21.xyz", - "wengewang.com", - "wengewang.org", - "wenhui.ch", - "wenweipo.com", - "wenxuecity.com", - "wenyunchao.com", - "wenzhao.ca", - "wern.ac.uk", - "wesc.ac.uk", - "wescfoundation.ac.uk", - "wess.ac.uk", - "wessex.ac.uk", - "wessexsfc.ac.uk", - "west-cheshire.ac.uk", - "west-lothian.ac.uk", - "west-thames.ac.uk", - "westca.com", - "westchem.ac.uk", - "westcollegescotland.ac.uk", - "westcumbcoll.ac.uk", - "westdean.ac.uk", - "westengland.ac.uk", - "westerndigital.com", - "westernshugdensociety.org", - "westernwolves.com", - "westherts.ac.uk", - "westhill.ac.uk", - "westkent.ac.uk", - "westkentandashford.ac.uk", - "westking.ac.uk", - "westkit.net", - "westlancs.ac.uk", - "westlaw.com", - "westlondon.ac.uk", - "westlondoncollege.ac.uk", - "westlondoniot.ac.uk", - "westlondonuniversity.ac.uk", - "westminster-cfe.ac.uk", - "westminster.ac.uk", - "westminsterutc.ac.uk", - "westnotts.ac.uk", - "westofscotland.ac.uk", - "weston.ac.uk", - "westonstudents.ac.uk", - "westpoint.edu", - "westsuffolk.ac.uk", - "westsuffolkcollege.ac.uk", - "westyorkshirecolleges.ac.uk", - "wet-ass-pussy.com", - "wetandpuffy.com", - "wetchicks.org", - "wetnhorny.com", - "wetplace.com", - "wetpussygames.com", - "wetsextube.com", - "weverse.io", - "wexiaobo.org", - "weymouth.ac.uk", - "weymouthcollege.ac.uk", - "wezhiyong.org", - "wezone.net", - "wfdc.ac.uk", - "wfm.com", - "wforum.com", - "wgu.ac.uk", - "wha.la", - "whasil.xyz", - "what-fan.net", - "whatblocked.com", - "whatboyswant.com", - "whatbrowser.org", - "whatisairwatch.com", - "whatisworkspaceone.com", - "whats.new", - "whatsapp-plus.info", - "whatsapp-plus.me", - "whatsapp-plus.net", - "whatsapp.cc", - "whatsapp.com", - "whatsapp.info", - "whatsapp.net", - "whatsapp.org", - "whatsapp.tv", - "whatsappbrand.com", - "whatscotlandthinks.ac.uk", - "whatsonweibo.com", - "whatthefox.com", - "whatworksscotland.ac.uk", - "whcgroup.ac.uk", - "wheatseeds.org", - "wheb.ac.uk", - "wheelockslatin.com", - "wheelpop.com", - "wheelworks.net", - "whelf.ac.uk", - "whengirlsplay.com", - "whentai.com", - "whereilive.com.au", - "whereiskpkuang.com", - "whereiswerner.com", - "wheretowatch.com", - "wherl.ac.uk", - "whichav.com", - "whichav.video", - "whimn.com.au", - "whippedass.com", - "whisolutions.com", - "whispersystems.org", - "whitegates-feu.ac.uk", - "whiterose-mechanisticbiology-dtp.ac.uk", - "whiterose-social-science-doctoral-training-centre.ac.uk", - "whiterose.ac.uk", - "whitexxxtube.com", - "who.int", - "who.is", - "whodns.xyz", - "whoer.net", - "wholecitiesfoundation.org", - "wholefoods.com", - "wholefoodsmarket.co.uk", - "wholefoodsmarket.com", - "wholekidsfoundation.org", - "wholeplanetfoundation.org", - "wholesale-exporter1.com", - "wholesalediscountpurses.com", - "wholesalefine.com", - "wholesaleonlinemart.com", - "wholesem.ac.uk", - "wholevideos.com", - "whonix.org", - "whoreasianporn.com", - "whoreshub.com", - "whoreslag.com", - "whoreteensex.com", - "whorevintagesex.com", - "whosthehost.com", - "whotalking.com", - "whvuxtub.com", - "whychoosehorizon.com", - "whychooseview.com", - "whychoosevmwareeuc.com", - "whyfacebook.com", - "whyiwantciscotelepresence.com", - "whylover.com", - "whynotbi.com", - "whystudyamerica.ac.uk", - "whystudyeconomics.ac.uk", - "whystudyenglish.ac.uk", - "whystudylanguages.ac.uk", - "whystudymaterials.ac.uk", - "whyx.org", - "wias.ac.uk", - "wicn.ac.uk", - "widevine.com", - "widnesandruncornsixthformcollege.ac.uk", - "widnesruncorn.ac.uk", - "widnessixthformcollege.ac.uk", - "wife-home-videos.com", - "wifehomeporn.com", - "wifeinlove.com", - "wifeinterracialfuck.com", - "wifeloversporn.com", - "wifemovies.net", - "wifesexorgy.com", - "wifesharingpics.com", - "wifevideos.net", - "wifewantstoplay.com", - "wifi-mx.com", - "wifiman.com", - "wigan-leigh.ac.uk", - "wigs.ac.uk", - "wigstoncollege.ac.uk", - "wii-u.com", - "wiifit.com", - "wiifitu.com", - "wiipartyu.com", - "wiisports.com", - "wiisportsresort.com", - "wiiugamepad.com", - "wiivc.net", - "wikaba.com", - "wikawika.xyz", - "wikia.com", - "wikia.org", - "wikibooks.org", - "wikidata.org", - "wikidot.com", - "wikifeet.com", - "wikihow.com", - "wikileaks-forum.com", - "wikileaks.ch", - "wikileaks.com", - "wikileaks.de", - "wikileaks.eu", - "wikileaks.lu", - "wikileaks.org", - "wikileaks.pl", - "wikilivres.info", - "wikimapia.org", - "wikimedia.org", - "wikimediacloud.org", - "wikimediafoundation.org", - "wikinews.org", - "wikipedia-on-ipfs.org", - "wikipedia.org", - "wikiporn.tv", - "wikiquote.org", - "wikisexguide.com", - "wikisource.org", - "wikiunblocked.org", - "wikiversity.org", - "wikivoyage.org", - "wikiwand.com", - "wikiwiki.jp", - "wiktionary.org", - "wilberforce.ac.uk", - "wildammo.com", - "wildcamporn.com", - "wildfanny.com", - "wildfreevideos.com", - "wildxxxhardcore.com", - "wiley.com", - "williamhill.com", - "willw.net", - "willyporn.com", - "wiltscoll.ac.uk", - "wiltshire.ac.uk", - "wiltshirecollege.ac.uk", - "wimbledon-school.ac.uk", - "wimbledon.ac.uk", - "wimcs.ac.uk", - "wimpmusic.com", - "winchester.ac.uk", - "wincoll.ac.uk", - "windows-int.net", - "windows.com", - "windows.net", - "windows.nl", - "windows8.hk", - "windowsazure.com", - "windowscommunity.net", - "windowsmarketplace.com", - "windowsphone-int.com", - "windowsphone.com", - "windowsphoneme.com", - "windowssearch.com", - "windowsuem.com", - "windowsupdate.com", - "windscribe.com", - "windsor-forest.ac.uk", - "windy.com", - "wingamestore.com", - "wingy.site", - "winhec.com", - "winhec.net", - "winncop.ac.uk", - "winning11.com", - "winningstudents-scotland.ac.uk", - "winstanley.ac.uk", - "wintermute.com", - "winticket.jp", - "winudf.com", - "winwhispers.info", - "wionews.com", - "wipower.com", - "wire.com", - "wired.com", - "wiredbytes.com", - "wiredpen.com", - "wireguard.com", - "wireless.radio", - "wirelessgroup.co.uk", - "wirelessreach.com", - "wiremoneytoirelandwithxoomeasierandcheaper.com", - "wireshark.org", - "wirralmet.ac.uk", - "wisdompubs.org", - "wise-research.com", - "wise.com", - "wisecoin.com", - "wiseid.com", - "wisekey.com", - "wisekey.com.hk", - "wiserd.ac.uk", - "wisevid.com", - "wish.com", - "wistia.com", - "wistia.net", - "witcmi.ac.uk", - "withgoogle.com", - "withyoutube.com", - "witnessleeteaching.com", - "witopia.net", - "wittgen-cam.ac.uk", - "wivc.ac.uk", - "wix-code.com", - "wix.com", - "wixanswers.com", - "wixapps.net", - "wixipedia.net", - "wixmp.com", - "wixsite.com", - "wixstatic.com", - "wiz-s.jp", - "wizcrafts.net", - "wjbk.org", - "wjcodes.com", - "wjny-one.sbs", - "wkac.ac.uk", - "wkap.nl", - "wkc.ac.uk", - "wkcic.ac.uk", - "wlc.ac.uk", - "wlcbms.ac.uk", - "wlcbs.ac.uk", - "wlpms.ac.uk", - "wlu.ac.uk", - "wlv.ac.uk", - "wm-air.ac.uk", - "wm18s.buzz", - "wma.ac.uk", - "wmc.ac.uk", - "wmcc.ac.uk", - "wmcloud.org", - "wmcollege.ac.uk", - "wmcu.ac.uk", - "wmflabs.org", - "wmfusercontent.org", - "wmhea.ac.uk", - "wmin.ac.uk", - "wmsf.ac.uk", - "wmt.co", - "wmucs.ac.uk", - "wn.com", - "wnacg.com", - "wnacg.link", - "wnacg.org", - "wnc.ac.uk", - "wnoaissulli1.com", - "wnsc.ac.uk", - "wo.tc", - "wocns.ac.uk", - "woeser.com", - "wofl.tv", - "woflthenewsstation.com", - "wogx.com", - "wokar.org", - "woking.ac.uk", - "wolcol.ac.uk", - "wolfatbestbuy.com", - "wolfatbestbuy.net", - "wolfax.com", - "wolfsex-me.sbs", - "wolseymanuscripts.ac.uk", - "wolterskluwer.com", - "wolvcoll.ac.uk", - "wolverhampton.ac.uk", - "wolverhamptonline.ac.uk", - "wombo.ai", - "womensnikeshox.com", - "womenwill.com", - "womenwill.com.br", - "womenwill.id", - "womenwill.in", - "womenwill.mx", - "won.ac.uk", - "wonporn.com", - "wonporn.net", - "woodhouse.ac.uk", - "woodmancastingx.com", - "woolite.ca", - "woolite.com", - "woolite.pl", - "woolite.us", - "woolitecarpet.com", - "woolyss.com", - "woopie.jp", - "woopie.tv", - "worc.ac.uk", - "worcester.ac.uk", - "wordpress.com", - "wordpress.org", - "wordpress.tv", - "workandhome.ac.uk", - "workatruna.com", - "workerdemo.org.hk", - "workerempowerment.org", - "workers.dev", - "workersthebig.net", - "workflow.is", - "workingclasswriting.ac.uk", - "workingtogethernorthwest.ac.uk", - "workplace.com", - "workplacementscotland.ac.uk", - "workplaceusecases.com", - "worksmobile.com", - "workspaceair.com", - "workspaceone.com", - "workstations.tv", - "world3d.biz", - "worldbank.org", - "worldcat.org", - "worldcoinpay.com", - "worldcurrencycard.co.za", - "worldemojiawards.com", - "worldemojiday.com", - "worldescortindex.com", - "worldflipper.jp", - "worldhack.com", - "worldjournal.com", - "worldofslaves.io", - "worldofwarcraft.com", - "worldpopulationreview.com", - "worldpornvideos.com", - "worldscientific.com", - "worldsecureemail.com", - "worldsecuresystems.com", - "worldsex.com", - "worldsfastestgamer.net", - "worldvpn.net", - "wortech.ac.uk", - "worthing.ac.uk", - "wovs.tk", - "wow-life.net", - "wow.com", - "wowgirls.com", - "wowhead.com", - "wowindianporn.com", - "wowlegacy.ml", - "wowporn.com", - "wowpornlist.xyz", - "wowrk.com", - "wowstars.com", - "wowyoungporn.com", - "woxinghuiguo.com", - "woyaolian.org", - "wozy.in", - "wp-themes.com", - "wp.com", - "wpewebkit.org", - "wpoforum.com", - "wpvip.com", - "wqe.ac.uk", - "wqeic.ac.uk", - "wqyd.org", - "wrapp.ac.uk", - "wrchina.org", - "wrdtc.ac.uk", - "wrdtp.ac.uk", - "wrekincollege.ac.uk", - "wren.ac.uk", - "wrenchead.com", - "wretch.cc", - "wrexham.ac.uk", - "wripa.ac.uk", - "writenow.ac.uk", - "writesonic.com", - "writing-pad.ac.uk", - "writtle.ac.uk", - "writtlecollege.ac.uk", - "writtleuniversitycollege.ac.uk", - "wrocah.ac.uk", - "wroxton-college.ac.uk", - "wrssdtp.ac.uk", - "wsc.ac.uk", - "wscinternational.ac.uk", - "wsfc.ac.uk", - "wsimg.com", - "wsj.com", - "wsj.jobs", - "wsj.net", - "wsjbarrons.com", - "wsjhk.com", - "wsjmediakit.com", - "wsjplus.com", - "wsjshop.com", - "wsjwine.com", - "wspcr.ac.uk", - "wtbn.org", - "wtc.ac.uk", - "wtfpeople.com", - "wto.org", - "wton-acl.ac.uk", - "wton-adulteducation.ac.uk", - "wttw.ac.uk", - "wuerkaixi.com", - "wufafangwen.com", - "wufi.org.tw", - "wuguoguang.com", - "wujie.net", - "wujieliulan.com", - "wukangrui.net", - "wulfrun.ac.uk", - "wun.ac.uk", - "wunvb.com", - "wuso.me", - "wuw.red", - "wuxiapple.com", - "wuyanblog.com", - "wuyefuli.org", - "wvlln.ac.uk", - "wvm0agb4.me", - "wvn.ac.uk", - "wvr.ac.uk", - "ww9094.com", - "wwapple.net", - "wwe.com", - "wwe9.com", - "wwitv.com", - "wwmpcrn.ac.uk", - "wwtbam.com", - "www-bestbuystores.com", - "www-facebook.com", - "www-paypal.info", - "www-paypal.us", - "www-sms-apple.com", - "www.sb", - "www1.biz", - "www8-hp.com", - "wwwapple.com", - "wwwapple.net", - "wwwapplemusic.com", - "wwwdecide.com", - "wwwebay.com", - "wwwebay.net", - "wwwfacebok.com", - "wwwfacebook.com", - "wwwhost.biz", - "wwwhuluplus.com", - "wwwicloud.com", - "wwwinstagram.com", - "wwwipodlounge.com", - "wwwitunes.com", - "wwwlapple.com", - "wwwmacbookair.com", - "wwwmfacebook.com", - "wwwpaypass.com", - "wwwpornhub.pro", - "wwwwebay.com", - "wwwxoom.com", - "wxoyt.com", - "wyams.ac.uk", - "wyke.ac.uk", - "wylln.ac.uk", - "wynd.network", - "wyndlabs.ai", - "wyqqdz.com", - "wzlthw.com", - "wzmyg.com", - "wztv8.com", - "wzyboy.im", - "wzzyw.buzz", - "x-art.com", - "x-artvideo.net", - "x-berry.com", - "x-caprice.com", - "x-fetish.org", - "x-wall.org", - "x.ai", - "x.co", - "x.com", - "x.company", - "x.org", - "x.team", - "x0rd38.xyz", - "x1337x.eu", - "x1337x.se", - "x1337x.ws", - "x18r.co", - "x18r.com", - "x1949x.com", - "x24hr.com", - "x365x.com", - "x3guide.com", - "x3vid.com", - "x6av.com", - "x99av.com", - "xamarin.com", - "xandr.com", - "xanga.com", - "xanimeporn.com", - "xanimeporn.tv", - "xapplist.com", - "xattractive.com", - "xaverian.ac.uk", - "xavs.ac.uk", - "xaxy.xyz", - "xb18.me", - "xbabe.com", - "xbabe.mobi", - "xbanny.com", - "xbase.ac.uk", - "xbeegtube.com", - "xbhuijiab.info", - "xbnat.com", - "xbookcn.com", - "xbookcn.net", - "xbooks.work", - "xbooru.com", - "xbox.co", - "xbox.com", - "xbox.eu", - "xbox.org", - "xbox360.co", - "xbox360.com", - "xbox360.eu", - "xbox360.org", - "xboxab.com", - "xboxgamepass.com", - "xboxgamestudios.com", - "xboxlive.com", - "xboxone.co", - "xboxone.com", - "xboxone.eu", - "xboxplayanywhere.com", - "xboxservices.com", - "xboxstudios.com", - "xboyvids.com", - "xbrasilporno.com", - "xbtce.com", - "xbx.lv", - "xcafe.com", - "xcafe.in", - "xcams.com", - "xcg123.com", - "xchina.co", - "xchina.fun", - "xcity.jp", - "xcritic.com", - "xcum.com", - "xda-cdn.com", - "xda-developers.com", - "xdaddy.in", - "xdaforums.com", - "xdh999.one", - "xdir.vip", - "xdporner.com", - "xdsummit.com", - "xdty.org", - "xecce.com", - "xemales.com", - "xenoblade.com", - "xeon.com", - "xerotica.com", - "xfantazy.com", - "xfemaledom.com", - "xfiles.to", - "xfinity.com", - "xfockers.com", - "xfreehd.com", - "xfuckonline.com", - "xgames.zone", - "xgaytube.com", - "xgaytube.tv", - "xgirls.webcam", - "xgmyd.com", - "xgroovy.com", - "xgsp.tv", - "xgtd3.com", - "xgtdr.buzz", - "xh-porn.com", - "xh.video", - "xhamster.com", - "xhamster.desi", - "xhamster.xxx", - "xhamster18.com", - "xhamster18.desi", - "xhamster2.com", - "xhamsterlive.com", - "xhcdn.com", - "xhot.pro", - "xhub.tv", - "xianba.net", - "xianchawang.net", - "xiangrikui-app.com", - "xianir.xyz", - "xianjian.tw", - "xianqiao.net", - "xiaobaiwu.com", - "xiaochuncnjp.com", - "xiaod.in", - "xiaofu.me", - "xiaogirls.com", - "xiaohexie.com", - "xiaolan.me", - "xiaoma.org", - "xiaomi.eu", - "xiaoou.io", - "xiaoou.tv", - "xiaoshuobb.life", - "xiaoyaoge.xyz", - "xiaxiaoqiang.net", - "xie56.xyz", - "xiezhua.com", - "xihua.es", - "xii.jp", - "xin21.xyz", - "xinaia-av.buzz", - "xinbao.de", - "xindelu.com", - "xinfhw.com", - "xing.com", - "xing66.life", - "xing840.info", - "xinggan77.vip", - "xingrz.me", - "xinhuanet.org", - "xinjiangpolicefiles.org", - "xinlan995.xyz", - "xinmeitulu.com", - "xinmiao.com.hk", - "xinsheng.net", - "xinshijue.com", - "xinyubbs.net", - "xiongpian.com", - "xiuren.org", - "xixicui.icu", - "xizang-zhiye.org", - "xjavporn.com", - "xjp.cc", - "xjtravelguide.com", - "xkeezmovies.com", - "xkiwi.tk", - "xknoop.com", - "xkontakt18.com", - "xkorean.cam", - "xl-gaytube.com", - "xlecx.org", - "xlfmtalk.com", - "xlfmwz.info", - "xlgirls.com", - "xlinkz.to", - "xlovecam.com", - "xlstudio.com", - "xlydh.cc", - "xm.com", - "xmalay.com", - "xmas.ac.uk", - "xmat.ac.uk", - "xmature.su", - "xmav99.com", - "xmbsyj.top", - "xmforever.rest", - "xmissy.nl", - "xml-training-guide.com", - "xmm.ac.uk", - "xmonk.net", - "xmovies.com", - "xmoviesforyou.com", - "xmulib.org", - "xn--096-4g6em5t.com", - "xn--201-4g6em5t.com", - "xn--202-4g6em5t.com", - "xn--203-4g6em5t.com", - "xn--204-4g6em5t.com", - "xn--205-4g6em5t.com", - "xn--2vxsp6vi4j.com", - "xn--3et96bj49ahpq.com", - "xn--4gq171p.com", - "xn--4vq475g.com", - "xn--4vq477m.com", - "xn--6eup7j.com", - "xn--6eup7j.net", - "xn--74q434dwff.com", - "xn--74q434dwff.net", - "xn--7hv594h.com", - "xn--8uq428d76d.tokyo", - "xn--90wwvt03e.com", - "xn--9kr7l.com", - "xn--9pr62r24a.com", - "xn--9trs65b.com", - "xn--av-o44ep1d.com", - "xn--cck4d8b3009a.com", - "xn--colegsirgr-c5a.ac.uk", - "xn--czq75pvv1aj5c.org", - "xn--d4ty0ojsqzfd.com", - "xn--flw351e.com", - "xn--ggle-55da.com", - "xn--gmq348bujlxrb.com", - "xn--gmq92kd2rm1kx34a.com", - "xn--gogl-0nd52e.com", - "xn--gogl-1nd42e.com", - "xn--gtvz22d.wang", - "xn--hb4aw0g.com", - "xn--hckl3e1e8a8ajin0czf.net", - "xn--hhr917d3fecva.xyz", - "xn--i2ru8q2qg.com", - "xn--mts47c3w9b1qr.net", - "xn--mtswd61ejxq.com", - "xn--ngstr-lra8j.com", - "xn--oiq.cc", - "xn--pearsonenespaol-brb.com", - "xn--q41am8x.com", - "xn--qoq462m.com", - "xn--r8jwklh769h2mc880dk1o431a.com", - "xn--r8jwklh769hk43amcfoyl3z3a.com", - "xn--sgt856gbjl.cc", - "xn--sjqr38j.com", - "xn--tkry91n.com", - "xn--ubt498knmf.com", - "xn--uis17aj9kmuf.com", - "xn--urs05q.jp", - "xn--x-qeu1ji09tzlg.biz", - "xn--x-qeu1ji09tzlg.net", - "xn--xsq421m.com", - "xn--xsq605n.com", - "xn--xsq959n.com", - "xn--yf1at58a.com", - "xn--yt8h.la", - "xn--ztsq84g.cn", - "xnalgas.com", - "xnertv.shop", - "xnostars.com", - "xnxvideos.org", - "xnxx-cdn.com", - "xnxx-sex-tube.com", - "xnxx-sex-videos.com", - "xnxx-teens.com", - "xnxx-tv.net", - "xnxx-xxx.win", - "xnxx.com", - "xnxx.health", - "xnxx.net", - "xnxx.tv", - "xnxx18.pro", - "xnxx2.info", - "xnxx2.it", - "xnxx2.org", - "xnxx2.pro", - "xnxx3.com", - "xnxx4porn.com", - "xnxxarab.cc", - "xnxxarabsex.com", - "xnxxcom.club", - "xnxxcom.xyz", - "xnxxcomvideos.com", - "xnxxfap.info", - "xnxxhamster.net", - "xnxxhd.biz", - "xnxxhd.tv", - "xnxxmovies.com", - "xnxxporn.de", - "xnxxporn.fun", - "xnxxpornvid.com", - "xnxxsexclips.com", - "xnxxsexmovies.com", - "xnxxtime.com", - "xnxxvideos.rest", - "xnxxx.cc", - "xo.com", - "xo104.com", - "xogogo.com", - "xomfsp.xyz", - "xoom-experience.com", - "xoom.com", - "xoom.io", - "xoom.us", - "xoomcom.com", - "xoteens.com", - "xoxoteiras.com", - "xozilla.com", - "xpaja.net", - "xpdo.net", - "xpee.com", - "xplr.co", - "xpoleuno.com", - "xpornblog.com", - "xpornplease.com", - "xposed.info", - "xpud.org", - "xqwherb.sbs", - "xrentdvd.com", - "xsava.xyz", - "xscale.com", - "xsden.info", - "xsden.org", - "xsela.cc", - "xshaker.net", - "xshr.online", - "xsijishe.com", - "xskywalker.com", - "xskywalker.net", - "xslist.org", - "xstas.biz", - "xsvod.xyz", - "xsz-av.com", - "xtapes.to", - "xtegvk.xyz", - "xtracloud.net", - "xtube.com", - "xtubebdsm.com", - "xtubezoo.com", - "xu97.vip", - "xuchao.net", - "xuchao.org", - "xuehua.us", - "xuite.net", - "xujan.com", - "xuzhiyong.net", - "xv1.monster", - "xvbelink.com", - "xvds.tv", - "xvedo.net", - "xvideo-jp.com", - "xvideo.cc", - "xvideo.com", - "xvideo.run", - "xvideo.vlog.br", - "xvideoporno.tv", - "xvideos-cdn.com", - "xvideos-dl.top", - "xvideos-porn-video.com", - "xvideos-xxxx.com", - "xvideos.blog", - "xvideos.co", - "xvideos.com", - "xvideos.es", - "xvideos.la", - "xvideos.red", - "xvideos.tv.br", - "xvideos2.com", - "xvideos3.com", - "xvideos5.com.br", - "xvideosamadoras.com", - "xvideosbrasil.com", - "xvideosbrasileiro.net", - "xvideoscom.me", - "xvideosincesto.com", - "xvideosjingxiang.com", - "xvideosnovinha.com", - "xvideosnovinha.com.br", - "xvideosnovinhas.com", - "xvideostravestis.xxx", - "xvideosup.com.br", - "xvideosx.com.br", - "xvideoz.win", - "xvidios.blog", - "xvidios.xxx", - "xvidzz.com", - "xvinlink.com", - "xvirtual.com", - "xvxx.stream", - "xvxxtube.com", - "xwbo.com", - "xx-map.com", - "xx9.app", - "xxbay.com", - "xxbbx.com", - "xxbook.cc", - "xxbrits.com", - "xxeronetxx.info", - "xxfbiaa.xyz", - "xxgasm.com", - "xxindianporn.com", - "xxiqiyiavxx.buzz", - "xxlmovies.com", - "xxmovz.com", - "xxnx.rest", - "xxnxx-porn.com", - "xxnxx-sex.com", - "xxu.mobi", - "xxuz.com", - "xxvideo.mobi", - "xxvideos.xxx", - "xxvideoss.org", - "xxvids.net", - "xxx-av.com", - "xxx-com.cfd", - "xxx-fap.com", - "xxx-files.org", - "xxx-hentai.blogspot.com", - "xxx-porn-fuck.com", - "xxx-porn-tube.com", - "xxx-porn.info", - "xxx-video.cfd", - "xxx-videos.tv", - "xxx-ways.com", - "xxx.com", - "xxx.xxx", - "xxx18.uno", - "xxx18teen.net", - "xxx2022.com", - "xxx2023.com", - "xxx4hindi.com", - "xxxaporn.com", - "xxxassfuck.com", - "xxxbit.com", - "xxxbolivianas.com", - "xxxbule.com", - "xxxbullet.com", - "xxxbunker.com", - "xxxclub.club", - "xxxcomics.org", - "xxxdan.com", - "xxxdesi.cc", - "xxxdinotube.com", - "xxxengine.net", - "xxxfile.org", - "xxxfiles.com", - "xxxflare.com", - "xxxforte.com", - "xxxfree.watch", - "xxxfuckmom.com", - "xxxgames.biz", - "xxxgames.games", - "xxxgirls88.com", - "xxxgratisfilms.com", - "xxxhd.pro", - "xxxhdporn.cc", - "xxxhentai.net", - "xxxhentaipics.com", - "xxxhentaipics.pro", - "xxxhomefuck.com", - "xxxhub123.com", - "xxxhubvideos.com", - "xxxifuck.com", - "xxxindianporn2.com", - "xxxindiantv.com", - "xxxjapanesemovies.com", - "xxxland.net", - "xxxlesbians.me", - "xxxlucah.com", - "xxxmaturepussypics.com", - "xxxmatures.net", - "xxxmofo.com", - "xxxmomporn.tube", - "xxxmovies.fun", - "xxxmovies.pro", - "xxxn.me", - "xxxn.tv", - "xxxner.com", - "xxxnewvideos.com", - "xxxnu.com", - "xxxnxx.me", - "xxxpenguin.com", - "xxxpicz.com", - "xxxporn.su", - "xxxporn123.com", - "xxxporndig.com", - "xxxpornhd.pro", - "xxxpornmovs.com", - "xxxpornotuber.com", - "xxxpornozinho.blog.br", - "xxxpornzeed.com", - "xxxreal.com", - "xxxscenes.net", - "xxxsexanal.com", - "xxxsexcinema.com", - "xxxsexocasero.com", - "xxxsextubes.com", - "xxxsexzoo.com", - "xxxshame.com", - "xxxstreams.eu", - "xxxstreams.org", - "xxxstreams.watch", - "xxxteenanal.net", - "xxxtube1.com", - "xxxtubeasian.net", - "xxxtubedot.com", - "xxxtubegf.com", - "xxxtubenote.com", - "xxxtubeset.com", - "xxxtubezoo.com", - "xxxv.mobi", - "xxxvideo.blog.br", - "xxxvideo.one", - "xxxvideo.vip", - "xxxvideo.world", - "xxxvideoamatoriali.com", - "xxxvideor.com", - "xxxvideos247.com", - "xxxvideoszoo.com", - "xxxvidos.vip", - "xxxvidso.com", - "xxxvirtualworld.com", - "xxxvogue.net", - "xxxwow.net", - "xxxx.com.au", - "xxxxvideo.uno", - "xxxy.biz", - "xxxy.info", - "xxxyaom.xyz", - "xxxymovies.com", - "xxxyoungxxx.com", - "xys.org", - "xysblogs.org", - "xyy69.com", - "xyy69.info", - "xzone.to", - "xzxxporn.com", - "xzxxtube.com", - "y2mate.com", - "ya.ru", - "yaddal.tv", - "yadi.sk", - "yadori.club", - "yaeby.info", - "yahoo-news.com.hk", - "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.cm", - "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.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", - "yahooapis.com", - "yahoodns.net", - "yahoofinance.com", - "yahoohealth.com", - "yahoomusic.com", - "yahoosandbox.com", - "yahoosportsbook.com", - "yakbutterblues.com", - "yale-wrexham.ac.uk", - "yale.ac.uk", - "yale.edu", - "yam.com", - "yam.org.tw", - "yamaxun.com", - "yamibo.com", - "yammer.com", - "yamoon.club", - "yande.re", - "yandex.aero", - "yandex.az", - "yandex.by", - "yandex.co.il", - "yandex.com", - "yandex.com.ge", - "yandex.com.ru", - "yandex.com.tr", - "yandex.com.ua", - "yandex.de", - "yandex.ee", - "yandex.eu", - "yandex.fi", - "yandex.fr", - "yandex.jobs", - "yandex.kg", - "yandex.kz", - "yandex.lt", - "yandex.lv", - "yandex.md", - "yandex.net", - "yandex.org", - "yandex.pl", - "yandex.ru", - "yandex.st", - "yandex.sx", - "yandex.tj", - "yandex.tm", - "yandex.ua", - "yandex.uz", - "yandexcloud.net", - "yanghengjun.com", - "yangjianli.com", - "yantaqu.com", - "yaohubaba.com", - "yaoimangaonline.com", - "yaoiotaku.com", - "yaole91.xyz", - "yaoliuno.fun", - "yaoyaomumu.com", - "yaptube.com", - "yarininsuyu.com", - "yarnpkg.com", - "yasarang.net", - "yasni.co.uk", - "yastatic.net", - "yavtube.com", - "yaya.cyou", - "yayabay.com", - "yayadizhi.xyz", - "yazhouse8.com", - "ycc.ac.uk", - "ycoastco.ac.uk", - "ycombinator.com", - "ycuc.ac.uk", - "ycw.ac.uk", - "ydds.ac.uk", - "ydn.com.tw", - "ydrindoddewisant.ac.uk", - "ydy.com", - "yeahteentube.com", - "yecl.net", - "yeelou.com", - "yeeyi.com", - "yegle.net", - "yeonda.com", - "yeovil-college.ac.uk", - "yeovil.ac.uk", - "yepporn.com", - "yes-news.com", - "yes.xxx", - "yes123.com.tw", - "yesasia.com", - "yesasia.com.hk", - "yespornfree.com", - "yespornplease.com", - "yespornpleasexxx.com", - "yeswegays.com", - "yeyeclub.com", - "yft-mv.sbs", - "ygto.com", - "ygugu4.com", - "yhcw.net", - "yhelln.ac.uk", - "yhgwgtv.xyz", - "yho.com", - "yhua.ac.uk", - "yhy.cool", - "yibada.com", - "yibaochina.com", - "yibei.org", - "yidio.com", - "yigeni.com", - "yilubbs.com", - "yimg.com", - "yimg.jp", - "yinac.xyz", - "yinac5.top", - "yingpianqu.com", - "yingsuoss.com", - "yinhdhan.sbs", - "yinhuafish.lat", - "yinlei.org", - "yinmh.com", - "yinshuiger.info", - "yinya.shop", - "yipub.com", - "yiqiedoushiganggangkaishi.org", - "yizhihongxing.com", - "yjcontentdelivery.com", - "ymail.com", - "ymca-wales.ac.uk", - "ymca.ac.uk", - "ymhsf.top", - "ymhsf1.top", - "ync.ne.jp", - "ynoproject.net", - "yo1health.com", - "yobit.net", - "yobt.com", - "yobt.tv", - "yogalayout.com", - "yogichen.org", - "yogify.com", - "yolasite.com", - "yomabank.com", - "yomikyo.or.jp", - "yomilogi.com", - "yomiuri-johkai.co.jp", - "yomiuri-ryokou.co.jp", - "yomiuri-systec.co.jp", - "yomiuri.co.jp", - "yong.hu", - "yopo.work", - "yopornshop.com", - "york-sfc.ac.uk", - "york.ac.uk", - "yorkbbs.ca", - "yorkcollege.ac.uk", - "yorkcollegeapps.ac.uk", - "yorkshireuniversities.ac.uk", - "yorksj.ac.uk", - "yorkstonemasonrycove.ac.uk", - "yoshisnewisland.com", - "you-get.org", - "you.com", - "youassporn.com", - "youav.com", - "youdontcare.com", - "youflix.is", - "youjism.com", - "youjizz.com", - "youjizz.sex", - "youlucky.com", - "youmaker.com", - "young-amateur-movies.com", - "young-webcam.net", - "young-xxx.net", - "youngamateursporn.com", - "younger19.com", - "youngerbabes.com", - "youngermommy.com", - "youngfoundation.ac.uk", - "youngheaven.com", - "younglibertines.com", - "youngmommyfucksme.com", - "youngpornhd.com", - "youngpornonly.com", - "youngpornvideos.com", - "youngsex.sexy", - "youngsex.video", - "youngspiration.hk", - "youngteenhomeporn.com", - "youngtube.me", - "youpai.org", - "youporn-germany.com", - "youporn.com", - "youporner.eu", - "youporngay.com", - "youpornlist.com", - "youpornpremium.com", - "youpornru.com", - "youpornxvideos.net", - "your-freedom.net", - "your-objectstorage.com", - "your-server.de", - "youramateurporn.com", - "yourassbig.com", - "yourbrain.com", - "yourdailypornvideos.ws", - "yourdirtymind.com", - "yourdoll.com", - "yourepeat.com", - "yourfantasybeginsnow.com", - "yourflashporn.com", - "yourfreeporn.tv", - "yourfuture-eastmidlands.ac.uk", - "yourgynexam.com", - "yourlisten.com", - "yourlust.com", - "yourmomlovesanal.com", - "yourmomsgotbigtits.com", - "yourmonsterbeats.com", - "yourpelvicexam.com", - "yourporn.sexy", - "yourporndump.com", - "yourporngod.com", - "yourprivatevpn.com", - "yourtrap.com", - "yourtv.com.au", - "yourupskirt.com", - "yourvoyeurvideos.com", - "yourwifemymeat.com", - "yourxxxvideos.pro", - "yousendit.com", - "youshare.ac.uk", - "youshun12.com", - "youskbe.com", - "youthforfreechina.org", - "youthnetradio.org", - "youthwant.com.tw", - "youtrannytube.com", - "youtu.be", - "youtube-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.com", - "youtube.com.ar", - "youtube.com.au", - "youtube.com.az", - "youtube.com.bd", - "youtube.com.bh", - "youtube.com.bo", - "youtube.com.br", - "youtube.com.by", - "youtube.com.co", - "youtube.com.do", - "youtube.com.ec", - "youtube.com.ee", - "youtube.com.eg", - "youtube.com.es", - "youtube.com.gh", - "youtube.com.gr", - "youtube.com.gt", - "youtube.com.hk", - "youtube.com.hn", - "youtube.com.hr", - "youtube.com.jm", - "youtube.com.jo", - "youtube.com.kw", - "youtube.com.lb", - "youtube.com.lv", - "youtube.com.ly", - "youtube.com.mk", - "youtube.com.mt", - "youtube.com.mx", - "youtube.com.my", - "youtube.com.ng", - "youtube.com.ni", - "youtube.com.om", - "youtube.com.pa", - "youtube.com.pe", - "youtube.com.ph", - "youtube.com.pk", - "youtube.com.pt", - "youtube.com.py", - "youtube.com.qa", - "youtube.com.ro", - "youtube.com.sa", - "youtube.com.sg", - "youtube.com.sv", - "youtube.com.tn", - "youtube.com.tr", - "youtube.com.tw", - "youtube.com.ua", - "youtube.com.uy", - "youtube.com.ve", - "youtube.cr", - "youtube.cz", - "youtube.de", - "youtube.dk", - "youtube.ee", - "youtube.es", - "youtube.fi", - "youtube.fr", - "youtube.ge", - "youtube.googleapis.com", - "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.vn", - "youtubecisco.com", - "youtubecn.com", - "youtubeeducation.com", - "youtubeembeddedplayer.googleapis.com", - "youtubefanfest.com", - "youtubegaming.com", - "youtubego.co.id", - "youtubego.co.in", - "youtubego.com", - "youtubego.com.br", - "youtubego.id", - "youtubego.in", - "youtubei.googleapis.com", - "youtubekids.com", - "youtubemobilesupport.com", - "youversion.com", - "youwin.com", - "youwuss.com", - "youx.xxx", - "youxu.info", - "youyu.services", - "yoyoav.net", - "ypmate.com", - "ypncdn.com", - "yporth.ac.uk", - "yra.ac.uk", - "ysav184.xyz", - "ysg-link.sbs", - "ysj.ac.uk", - "yskg-ber.buzz", - "ysporn.com", - "ystrad-mynach.ac.uk", - "ysulondon.ac.uk", - "ysx-mm.com", - "yt.be", - "ytht.net", - "ytimg.com", - "ytn.co.kr", - "yts.ag", - "yts.am", - "yts.lt", - "yts.mx", - "yuanming.net", - "yuanzhengtang.org", - "yuenuge113.xyz", - "yuenuge18.cc", - "yukineko.me", - "yulghun.com", - "yunchao.net", - "yunlaopo.cc", - "yunlaopo.com", - "yunlaopo.net", - "yuntipub.com", - "yusercontent.com", - "yusjb.com", - "yuvutu.com", - "yvesgeleyn.com", - "ywoos.com", - "ywpw.com", - "yx51.net", - "yy55.tv", - "yy7y.com", - "yy8y.com", - "yyfb.cyou", - "yyii.org", - "yyjlymb.xyz", - "yysub.net", - "yzld188.top", - "yzzk.com", - "z-lib.org", - "z-library.se", - "z00.world", - "z18r.co", - "z18r.com", - "z3x-team.com", - "z5.app", - "z5.com", - "z676869.com", - "za77.xyz", - "zacebook.com", - "zakzak.co.jp", - "zalmos.com", - "zamimg.com", - "zannel.com", - "zaobao.com", - "zaobao.com.sg", - "zaobao.sg", - "zaozon.com", - "zapper.fi", - "zapto.org", - "zatrahal.online", - "zattoo.com", - "zavat.pw", - "zazzybabes.com", - "zb.app", - "zb.com", - "zb.io", - "zb.live", - "zbporn.com", - "zctb.buzz", - "zdassets.com", - "zdnet.com", - "zdnet.com.tw", - "zdusercontent.com", - "zee.com", - "zee5.com", - "zee5.in", - "zee5.tv", - "zeebioskop.com", - "zeebiz.com", - "zeeentertainment.com", - "zeenews-fonts.s3.amazonaws.com", - "zeenews.com", - "zeenite.com", - "zeetv.co.uk", - "zeetv.com", - "zeeuk.com", - "zeit-world.co.uk", - "zeit-world.com", - "zeit-world.net", - "zeit-world.org", - "zeit.co", - "zeit.sh", - "zeitworld.com", - "zello.com", - "zen8ok.xyz", - "zencdn.net", - "zencoder.com", - "zendesk.com", - "zengjinyan.org", - "zenlesszonezero.com", - "zenmate.com", - "zenmate.com.ru", - "zenodo.org", - "zeplerinstitute.ac.uk", - "zeplin.dev", - "zeplin.io", - "zergpool.com", - "zeriamerikes.com", - "zerochan.net", - "zerohedge.com", - "zeronet.io", - "zert.ch", - "zettai-ero.com", - "zeutch.com", - "zfreet.com", - "zgsddh.com", - "zgzcjj.net", - "zh99.net", - "zhaimankan.com", - "zhainanjidi.xyz", - "zhainanjidid.top", - "zhanbin.net", - "zhangboli.net", - "zhangboz1.xyz", - "zhangtianliang.com", - "zhanlve.org", - "zhenghui.org", - "zhengjian.org", - "zhengwunet.org", - "zhenlibu.info", - "zhenlibu1984.com", - "zhenxiang.biz", - "zhimeishe888.com", - "zhinengluyou.com", - "zhongguo.ca", - "zhongguorenquan.org", - "zhongguotese.net", - "zhongmeng.org", - "zhoushuguang.com", - "zhreader.com", - "zhtv01.com", - "zhuangbi.me", - "zhuanxing.cn", - "zhuatieba.com", - "zhuichaguoji.org", - "zhujiget.com", - "zhuzhushipin-app.com", - "zi.media", - "zi5.me", - "zibacity.com", - "ziddu.com", - "zigzag.kr", - "zillionk.com", - "zim.vn", - "zind.cloud", - "zingtruyen.net", - "zinio.com", - "zipcine.com", - "ziporn.com", - "zippyshare.com", - "zishy.com", - "zkaip.com", - "zkiz.com", - "zlib.life", - "zlibcdn.com", - "zlibcdn2.com", - "zmw.cn", - "zndsk.com", - "zodgame.us", - "zoho.com", - "zoho.com.au", - "zoho.eu", - "zoho.in", - "zohocdn.com", - "zohomeetups.com", - "zohomerchandise.com", - "zohopublic.com", - "zohoschools.com", - "zohostatic.com", - "zohostatic.in", - "zohouniversity.com", - "zohowebstatic.com", - "zoig.com", - "zomobo.net", - "zonaeuropa.com", - "zonghexinwen.com", - "zonghexinwen.net", - "zoo-hardcore.com", - "zoo-porno.biz", - "zoo-tube8.com", - "zoo-xnxx.com", - "zoofiction.com", - "zoofilianet.com", - "zoogvpn.com", - "zoohun.com", - "zoom.com", - "zoom.com.cn", - "zoom.us", - "zoomingin.tv", - "zoomobileporn.com", - "zoonoses.ac.uk", - "zoonosis.ac.uk", - "zoophilist.net", - "zooporn.pro", - "zooporn.shiksha", - "zooporn.video", - "zoopornmd.com", - "zooporno.biz", - "zooredtube.com", - "zoosexfarm.com", - "zoosexnet.com", - "zooskoolvideos.com", - "zootool.com", - "zootube1.com", - "zooxxxsexporn.red", - "zooyouporn.com", - "zoozhamster.com", - "zoozle.net", - "zophar.net", - "zopim.com", - "zorglist.com", - "zorrovpn.com", - "zozotown.com", - "zpn.im", - "zqqpwz.com", - "zsdxzk.com", - "zsh.org", - "zspeeder.me", - "zsrhao.com", - "zsuxtx-ktv.shop", - "zteman.net", - "zuckerberg.com", - "zuckerberg.net", - "zukunftswerkstatt.de", - "zunked.com", - "zuo.la", - "zuobiao.me", - "zuola.com", - "zvereff.com", - "zweiporn.com", - "zwtvusa.com", - "zynaima.com", - "zynamics.com", - "zyns.com", - "zyxel.com", - "zyzc9.com", - "zzcartoon.com", - "zzcloud.me", - "zzdh.biz", - "zzdh.cc", - "zzdh.pw", - "zzdh.run", - "zzdh.ws", - "zzdh77.com", - "zzdh808.com", - "zzdh99.com", - "zzgays.com", - "zzux.com", - "zzycdz.com" - ] - ], - [ - [], - [] - ] + [ + [], + [ + "000webhost.com", + "01.org", + "02weqj32.com", + "030buy.com", + "04.si", + "04647.club", + "0cgdklr5sfwj.com", + "0emm.com", + "0plkijj.vip", + "0rz.tw", + "0x0.st", + "0xxx.ws", + "1-apple.com.tw", + "10.tt", + "1000giri.net", + "100beatscheap.com", + "100bucksbabes.com", + "100classicbooks.com", + "100ke.org", + "1010.com.hk", + "101boyvideos.com", + "101tubeporn.com", + "101xxx.xyz", + "10beasts.net", + "10bet.com", + "10c10qoo.one", + "10conditionsoflove.com", + "10musume.com", + "10xfotolia.com", + "110xnxx.com", + "1111mod-tube.buzz", + "1111mode.xyz", + "1111modpo.info", + "112263.com", + "114av.xyz", + "119474.xyz", + "11jav.com", + "123-hp.com", + "123bin.cc", + "123dapp.com", + "123dappipad.com", + "123dartisan.com", + "123dcatch.com", + "123dcircuits.com", + "123dcreature.com", + "123dcreaturenews.com", + "123ddesign.com", + "123ddoodler.com", + "123dmake.com", + "123dnews.com", + "123dpro.com", + "123dpro.net", + "123dsculpt.com", + "123hplaserjet.com", + "123rf.com", + "123sex.top", + "123videos.tv", + "126728.net", + "128100.xyz", + "12bet.com", + "12diasdepresentesdeitunes.com", + "12diasderegalosdeitunes.cl", + "12diasderegalosdeitunes.co", + "12diasderegalosdeitunes.co.cr", + "12diasderegalosdeitunes.co.ni", + "12diasderegalosdeitunes.co.ve", + "12diasderegalosdeitunes.com", + "12diasderegalosdeitunes.com.co", + "12diasderegalosdeitunes.com.hn", + "12diasderegalosdeitunes.com.ni", + "12diasderegalosdeitunes.com.ve", + "12diasderegalosdeitunes.cr", + "12diasderegalosdeitunes.gt", + "12diasderegalosdeitunes.hn", + "12diasderegalosdeitunes.pe", + "12joursdecadeauxdeitunes.com", + "12vpn.com", + "12vpn.net", + "1337x.gd", + "1337x.is", + "1337x.st", + "1337x.to", + "1337x.tw", + "1337xto.to", + "1337xx.to", + "138.com", + "13mei13.top", + "140033.xyz", + "141-hk.com", + "141hongkong.com", + "141jav.com", + "141jj.com", + "141tube.com", + "159i.com", + "161sex.com", + "1688.com.au", + "16885858.com", + "168sex.top", + "16fhgdty.xyz", + "16honeys.com", + "17.live", + "170.icu", + "1717se.cc", + "171xx.com", + "173ng.com", + "177pic.info", + "177picyy.com", + "179na.com", + "17lu.xyz", + "17mimei.club", + "17mimei.com", + "17supxxx.com", + "17t17p.com", + "18-teen-porn.com", + "18-teen-xxx.com", + "188channel.com", + "18acg.us", + "18av.pro", + "18avx.com", + "18board.com", + "18board.info", + "18comic-god.cc", + "18comic-god.club", + "18comic-god.xyz", + "18comic.cc", + "18comic.company", + "18comic.org", + "18comic.vip", + "18commic.com", + "18doujin.com", + "18doujinshi.xyz", + "18eighteen.com", + "18exgfs.com", + "18fby.com", + "18h.tv", + "18hmanga.click", + "18hmanga.com", + "18insta.com", + "18j.tv", + "18jms.com", + "18novel.xyz", + "18onlygirls.com", + "18p2p.com", + "18porncomic.com", + "18porno.tv", + "18push.com", + "18qt.com", + "18sex.org", + "18tube.xxx", + "18virginsex.com", + "18ww.life", + "18yiren.tv", + "191porn.com", + "1949er.org", + "1984.city", + "1984bbs.com", + "1984bbs.org", + "1991way.com", + "1992qq.xyz", + "1994group.ac.uk", + "1998cdp.org", + "1bao.org", + "1bigclub.com", + "1bokeponline.top", + "1classtube.com", + "1degree.com.au", + "1drv.com", + "1drv.ms", + "1dumb.com", + "1e100.net", + "1eew.com", + "1inch.io", + "1jjdg2.vip", + "1lib.cloud", + "1lib.cz", + "1lib.domains", + "1lib.education", + "1lib.eu", + "1lib.limited", + "1lib.pl", + "1lib.to", + "1lib.tw", + "1mobile.com", + "1mobile.tw", + "1monsterbeatsbydreus.com", + "1pondo.tv", + "1pornlist.com", + "1thek.com", + "1to1computing.com.au", + "1to1conference.com.au", + "1ucrs.com", + "1watchmygf.com", + "1xbet.cm", + "1xbet.co.ke", + "2-hand.info", + "2000fun.com", + "2008xianzhang.info", + "2013beatsbydrdreonline.com", + "2013beatsbydrdreshop.com", + "2013beatsbydreshop.com", + "2013beatshdcybermonday.com", + "2013cheapestbeats.com", + "2013newbeatsworld.com", + "2013pascherbeatsbydre.com", + "2014cheapbeatsbydre.com", + "2017.hk", + "2019baidu.xyz", + "2021hkcharter.com", + "2047.name", + "2047.one", + "2049bbs.xyz", + "20thcenturystudios.com.au", + "20thcenturystudios.com.br", + "20thcenturystudios.jp", + "20yearsoffea.com", + "21andy.com", + "21centuryaccess.com", + "21heise360dh.cc", + "21hub.com", + "21join.com", + "21naturals.com", + "21pron.com", + "21sextury.com", + "21vv.cc", + "228.net.tw", + "233abc.com", + "233v2.com", + "2371tom.com", + "24hjav.com", + "24hrs.ca", + "24porn.com", + "24porn.pro", + "24smile.org", + "25u.com", + "265sdwe3.com", + "2789av.com", + "27mmwmmw.top", + "2adultflashgames.com", + "2beatsdre.com", + "2beeg.me", + "2bit8.com", + "2buybeatsbydre.com", + "2ch.hk", + "2ch.net", + "2chav.com", + "2dgen.com", + "2drdrebeats.com", + "2du5.com", + "2gayboys.com", + "2k.com", + "2kcoretech.online", + "2kgames.com", + "2lib.org", + "2lipstube.com", + "2mdn-cn.net", + "2mdn.net", + "2o7.net", + "2shared.com", + "2waky.com", + "3-a.net", + "30boxes.com", + "30plusgirls.com", + "315lz.com", + "32bm.cc", + "32red.com", + "35s4.com", + "360autodesk.com", + "360nexus.com", + "360nexus.net", + "360plm.com", + "360trailers.com", + "365buymy.com", + "36717.info", + "36rain.com", + "3789av.com", + "39group.info", + "3a5a.com", + "3aaa.ac.uk", + "3animalsextube.com", + "3arabporn.com", + "3arabtv.com", + "3boys2girls.com", + "3d-comics.com", + "3d-december.com", + "3d-fossils.ac.uk", + "3d-game.com", + "3d-toon.com", + "3d-xxx.com", + "3dadultgames.net", + "3danimeworld.com", + "3ddecember.com", + "3december.com", + "3decemberonline.com", + "3devilattack.net", + "3dfuckhouse.com", + "3dhentai.tv", + "3dhentaix.com", + "3drules.com", + "3dsexgames.biz", + "3dsexmovies.biz", + "3dsexplay.xyz", + "3dsexvilla.com", + "3dsexy.net", + "3dstudio.com", + "3dtin.com", + "3dtin.net", + "3go.fun", + "3hentai.net", + "3lib.net", + "3movs.com", + "3movs.xyz", + "3naked.com", + "3pornhere.com", + "3pornstarmovies.com", + "3proxy.ru", + "3ren.ca", + "3sixty-ucc.ac.uk", + "3tui.net", + "3xplanet.com", + "3xplanet.net", + "3xplanetimg.com", + "3xxx.pro", + "404museum.com", + "40momporntube.com", + "40shopping.com", + "40somethingmag.com", + "41maonn.com", + "43110.cf", + "444.coffee", + "445gei.com", + "445jun.com", + "445nan.com", + "44yu.cc", + "4550.fun", + "45porn.com", + "466453.com", + "47gyosei.jp", + "47news.jp", + "4beatsbydre.com", + "4bluestones.biz", + "4cdn.org", + "4chan.com", + "4chan.org", + "4channel.org", + "4club.com", + "4dq.com", + "4ebaytraders.com", + "4ertik.live", + "4ertik.one", + "4everland.io", + "4everproxy.com", + "4gls.ac.uk", + "4greedy.com", + "4gtv.tv", + "4hu.one", + "4hu.tv", + "4irc.com", + "4kporn.xxx", + "4ksex.me", + "4kup.net", + "4mydomain.com", + "4myminicard.com", + "4pcdn.org", + "4pig.com", + "4plebs.org", + "4porn.com", + "4porn4.com", + "4pu.com", + "4rbtv.com", + "4shared.com", + "4sqi.net", + "4tube.com", + "4tubefree.net", + "4u4c.com", + "5-d.com", + "500caocao.com", + "50dh.app", + "50plusmilfs.com", + "50webs.com", + "51.ca", + "51cg1.com", + "51dh.site", + "51jav.org", + "51luoben.com", + "51luoli.info", + "51mh.app", + "51pincha.cc", + "51tuqiang.com", + "520aa.tv", + "520avtv.com", + "5238.me", + "5278.cc", + "5299.tv", + "52av.be", + "52av.com", + "52av.one", + "52fuliji.cc", + "52hyse.com", + "52kmz.com", + "531tr.com", + "53world.com", + "53worldsweeps.com", + "54647.global", + "54647.io", + "54647.online", + "54647.org", + "55comic.com", + "55dndn.com", + "567321.online", + "568xe.com", + "58avgo.com", + "592r.com", + "59mvmv.com", + "5aimiku.com", + "5axis-machining.com", + "5beatsbydre.com", + "5ch.net", + "5fang.cc", + "5i01.com", + "5isotoi5.org", + "5lml.com", + "5maodang.com", + "5mb48g.com", + "5mo.fun", + "5q5zu9f1.me", + "5w.ag", + "5xsq.com", + "6-ar.com", + "60plusmilfs.com", + "61jxbs42.xyz", + "62fh1bnj.me", + "634.tv", + "63i.com", + "64museum.org", + "64tianwang.com", + "64wiki.com", + "66.ca", + "666kb.com", + "66lu.link", + "66wwmm.com", + "66xing.cc", + "67maoab.com", + "69-sexgames.com", + "69av.one", + "69bag.xyz", + "69dys.pw", + "69femdom.com", + "69flv.com", + "69games.xxx", + "69gayporno.com", + "69hongdq6.buzz", + "69hongdq7.buzz", + "69loli.com", + "69luolie.com", + "69re.net", + "69shu.com", + "69story.com", + "69tubesex.com", + "69vj.com", + "69xporn.com", + "69xx.one", + "69xx560.xyz", + "6arabs.com", + "6do.news", + "6do.world", + "6e8xr2gk.me", + "6japaneseporn.com", + "6kea.com", + "6mature9.com", + "6neek.com", + "6park.com", + "6parkbbs.com", + "6parker.com", + "6parknews.com", + "6sextube.com", + "6twseb.com", + "6xxxvideos.com", + "720video.tv", + "721av.com", + "748av.com", + "75m.co", + "7719.me", + "777tv.net", + "777xporn.com", + "77maott.com", + "7capture.com", + "7cow.com", + "7jp.info", + "7mm.tv", + "7mmtv.sx", + "7mmtv.tv", + "7tb.cc", + "8-d.com", + "8008206616.com", + "8111y.top", + "81jia.tv", + "81tower.com", + "82mvmv.com", + "85cc.net", + "85cc.us", + "85st.com", + "85tube.com", + "8664av.com", + "881903.com", + "888.com", + "888poker.com", + "88av.one", + "88gals.com", + "88kkn.com", + "88manhua.top", + "88square.com", + "89-64.org", + "89.com", + "8964museum.com", + "8kcosplay.com", + "8kpornvids.com", + "8muses.com", + "8muses.io", + "8muses.xxx", + "8news.com.tw", + "8sp.biz", + "8teenxxx.com", + "8thstreetlatinas.com", + "8world.com", + "8xxx.net", + "8z1.net", + "9001700.com", + "908taiwan.org", + "90seconds.asia", + "91av.one", + "91avfuli.com", + "91beiyong.com", + "91cy.app", + "91dy.club", + "91fans.org", + "91gay.me", + "91jinman.com", + "91md.me", + "91moxiong.com", + "91oo.xyz", + "91porn.com", + "91pornplus.com", + "91porny.com", + "91porny.store", + "91qk41rf.com", + "91quanji.com", + "91rb.com", + "91rb.net", + "91rb99.com", + "91se.fun", + "91sesex.xyz", + "91sew.xyz", + "91sew40.buzz", + "91vhome.com", + "91vps.club", + "920share.com", + "921bb.com", + "922tp.com", + "928.plus", + "92ccav.com", + "92hm.life", + "92hm.top", + "941tube.com", + "9527.rocks", + "9550.fun", + "978.life", + "97dounai.top", + "991.com", + "99btgc01.com", + "99cn.info", + "99quse.cc", + "99re.com", + "99thz.cc", + "99thz.com", + "9anime.cz", + "9anime.id", + "9anime.to", + "9anime.ws", + "9bis.com", + "9bis.net", + "9cache.com", + "9cao9.com", + "9cdn.net", + "9gag.com", + "9hentai.ru", + "9hentai.to", + "9hentaiz.com", + "9ineverse.com", + "9k6v4y.cyou", + "9nation.com.au", + "9news.com.au", + "9now.com.au", + "9tak-nav.buzz", + "9to5google.com", + "9to5mac.com", + "9to5terminal.com", + "9to5toys.com", + "9xav.cc", + "9xlove.xyz", + "9zipai.net", + "a-hentai.tv", + "a-msedge.net", + "a-normal-day.com", + "a-tap.ac.uk", + "a-teenz.com", + "a0pple.net", + "a1av.xyz", + "a2z.com", + "a5.com.ru", + "a5vpn.com", + "a7sex.com", + "aa77kk.com", + "aaacymru.ac.uk", + "aaagradeheadphones.com", + "aaapp.cyou", + "aabb1802.com", + "aabb1803.com", + "aacrjournals.org", + "aadmv.com", + "aaex.uk", + "aalah.me", + "aamacau.com", + "aanaan.com", + "aapl.tw", + "aaplimg.com", + "aaschool.ac.uk", + "aau.ac.uk", + "aave.com", + "aavs.xyz", + "abank.com.mm", + "abbeygatesfc.ac.uk", + "abbeygatesixthformcollege.ac.uk", + "abbywintersfree.com", + "abc-studios.com", + "abc.com", + "abc.net.au", + "abc.xyz", + "abcheadphones.com", + "abchinese.com", + "abclider.com", + "abclite.net", + "abcol.ac.uk", + "abcolstudents.ac.uk", + "abdn-access-biomedical.ac.uk", + "abdn-online.ac.uk", + "abdn.ac.uk", + "abeatsbydrdre.com", + "abebooks.com", + "abellalist.com", + "abema-tv.com", + "abema.io", + "abema.tv", + "abematv.co.jp", + "aber.ac.uk", + "aberbangorpartnership.ac.uk", + "aberbangorstrategicalliance.ac.uk", + "aberdare.ac.uk", + "aberdeen-isc.ac.uk", + "aberdeen.ac.uk", + "aberdeenenergy.ac.uk", + "aberdeenrescon.ac.uk", + "abertawe.ac.uk", + "abertay.ac.uk", + "abertaydundee.ac.uk", + "aberystwyth.ac.uk", + "abgsp1.buzz", + "abhsc.ac.uk", + "abicollege.ac.uk", + "abigass.com", + "abingdon-witney.ac.uk", + "abira.ac.uk", + "ablmm.com", + "ablwang.com", + "aboluowang.com", + "about.google", + "about.me", + "aboutamazon.co.uk", + "aboutamazon.com", + "aboutamazon.com.au", + "aboutamazon.de", + "aboutamazon.es", + "aboutamazon.eu", + "aboutamazon.fr", + "aboutamazon.in", + "aboutamazon.it", + "aboutamazon.jp", + "aboutamazon.pl", + "aboutfacebook.com", + "aboutgfw.com", + "aboutmcdonalds.com", + "aboutporno.net", + "aboutyourmini.com", + "abow.jp", + "abrsm.ac.uk", + "abs.ac.uk", + "abs.edu", + "absoluporn.com", + "absolutewhores.com", + "ac-pocketcamp.com", + "ac.ir", + "ac.jp", + "acacia.ac.uk", + "academic-clinician.ac.uk", + "academicpaediatricsassociation.ac.uk", + "academicpeerlearning.ac.uk", + "academyforhealthcarescience.ac.uk", + "academynetriders.com", + "academyofmusic.ac.uk", + "acaric.co.jp", + "acasadasbrasileirinhas.com.br", + "acast.com", + "accbusiness.com", + "acceleratedcomputing.ac.uk", + "acces-vod.com", + "access-summit.ac.uk", + "accesscollege.ac.uk", + "accesscreative.ac.uk", + "accessfacebookfromschool.com", + "accesshe.ac.uk", + "accessheonline.ac.uk", + "accesstohe.ac.uk", + "accesstohighereducation.ac.uk", + "accesstomusic.ac.uk", + "accim.org", + "account-paypal.info", + "account-paypal.net", + "account-paypal.org", + "accountancylearning.ac.uk", + "accountkit.com", + "accountpaypal.com", + "accountpaypal.net", + "accountpaypal.org", + "accross.ac.uk", + "accs.ac.uk", + "accuweather.com", + "accv.es", + "acdocs.com", + "ace-lp.ac.uk", + "acebooik.com", + "acebook.com", + "aced.ac.uk", + "acer-group.com", + "acer.ac.uk", + "acer.com", + "aceros-de-hispania.com", + "aces.ac.uk", + "acets.ac.uk", + "acevpn.com", + "acg18.me", + "acgbox.link", + "acgbox.org", + "acgcf.com", + "acgdg.com", + "acgdv.com", + "acgfabu.com", + "acgfbw.com", + "acgkj.com", + "acgnmanhua.com", + "acgnx.se", + "acgvipss.com", + "acgwr.com", + "acgww.cyou", + "achat-followers-instagram.com", + "acheter-followers-instagram.com", + "acheterdesfollowersinstagram.com", + "acheterfollowersinstagram.com", + "achievementanalytics.com", + "acjj.net", + "aclweb.org", + "acm.ac.uk", + "acm.org", + "acmedia365.com", + "acmedsci.ac.uk", + "acmetoy.com", + "acmvalidations.com", + "acmvalidationsaws.com", + "acnw.com.au", + "acoustics.ac.uk", + "acp.ac.uk", + "acpica.com", + "acpme.ac.uk", + "acrobat.com", + "acs.org", + "acsis.ac.uk", + "actalis.com", + "actalis.it", + "actfortibet.org", + "actimes.com.au", + "activatelearning.ac.uk", + "activelearnprimary.co.uk", + "activelearnprimary.com.au", + "activeteachonline.com", + "activpn.com", + "actofunion.ac.uk", + "actris.ac.uk", + "actual.ac.uk", + "acu.ac.uk", + "aculo.us", + "ad69.com", + "ada.ac.uk", + "ada.support", + "adacollege.ac.uk", + "adalovelacecentre.ac.uk", + "adams-institute.ac.uk", + "adamsmith.ac.uk", + "adamsmithcollege.ac.uk", + "adanaatikhaber.com", + "adapt.ac.uk", + "adaptivecards.io", + "adas.ac.uk", + "adbecrsl.com", + "adbkm.com", + "adblockplus.org", + "adcex.com", + "adcommerce.tv", + "addictedtocoffee.de", + "addison-wesley.ch", + "addison.ac.uk", + "addthis.com", + "addthiscdn.com", + "addthisedge.com", + "addtoany.com", + "addyoutube.com", + "adelaidebbs.com", + "adelaidenow.com.au", + "adeptt.ac.uk", + "adgoogle.net", + "adguard-dns.com", + "adguard-dns.io", + "adguard-vpn.com", + "adguard-vpn.online", + "adguard.app", + "adguard.com", + "adguard.info", + "adguard.io", + "adguard.org", + "adguardvpn.com", + "adhelpnews.com", + "adidas.at", + "adidas.be", + "adidas.ch", + "adidas.co.in", + "adidas.co.uk", + "adidas.com", + "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", + "adinst.com", + "adlib.ac.uk", + "adls.ac.uk", + "admeld.com", + "admob-cn.com", + "admob.com", + "adobe-aemassets-value.com", + "adobe-audience-finder.com", + "adobe-video-partner-finder.com", + "adobe.com", + "adobe.io", + "adobe.ly", + "adobeaemcloud.com", + "adobeaemcloud.net", + "adobeawards.com", + "adobecc.com", + "adobecce.com", + "adobeccstatic.com", + "adobecontent.io", + "adobecreativityawards.com", + "adobedc.net", + "adobedemo.com", + "adobedtm.com", + "adobeereg.com", + "adobeexchange.com", + "adobeexperienceawards.com", + "adobegov.com", + "adobehiddentreasures.com", + "adobejanus.com", + "adobeku.com", + "adobelanding.com", + "adobelogin.com", + "adobeoobe.com", + "adobeplatinumclub.com", + "adobepress.ch", + "adobeprojectm.com", + "adobesc.com", + "adobesign.com", + "adobesigncdn.com", + "adobespark.com", + "adobess.com", + "adobestock.com", + "adobetag.com", + "adobetarget.com", + "adobetcstrialdvd.com", + "adobetechcomm.com", + "adobetechcommcallback.com", + "adobetechcommdemo.com", + "adobexdplatform.com", + "adorevids.com", + "adpl.org.hk", + "adporn.cc", + "adpornu.xyz", + "adrc-e.ac.uk", + "adrn.ac.uk", + "ads-pixiv.net", + "ads-twitter.com", + "ads.ac.uk", + "adsense.com", + "adsensecustomsearchads.com", + "adsenseformobileapps.com", + "adskcloud.com", + "adskcloud.net", + "adskeng.net", + "adskengineering.net", + "adskengpp.net", + "adskengpr.net", + "adtcc.com", + "adtidy.net", + "adtidy.org", + "adult-h.com", + "adult-home-videos.com", + "adult-list.com", + "adult-sex-games.com", + "adult-web-site.net", + "adult3dcomics.com", + "adult3dfantasycomics.com", + "adult3dporno.com", + "adult3dtoons.com", + "adultartsites.com", + "adultbay.org", + "adultblogranking.com", + "adultblogtoplist.com", + "adultcamslover.com", + "adultclinic.jp", + "adultdeepfakes.com", + "adultdvdmarketplace.com", + "adultdvdtalk.com", + "adultempire.com", + "adultepic.com", + "adulterfree.com", + "adulters.org", + "adultexpo.com.tw", + "adultfilmdatabase.com", + "adultfreex.com", + "adultfriendfinder.com", + "adultgamereviews.com", + "adultgames.games", + "adultgames.me", + "adultgames18.com", + "adultgamesapk.com", + "adultgamescollector.com", + "adultgameson.com", + "adultgamesportal.com", + "adultgamestop.com", + "adultgamingroom.com", + "adultgeek.net", + "adulti01.com", + "adultinfojpn.com", + "adultism.com", + "adultkeep.net", + "adultlearningbcc.ac.uk", + "adultlister.com", + "adultmagazinespdf.com", + "adulto.vip", + "adultpornvideos.net", + "adultrental.com", + "adultsexgame.biz", + "adultsexgames.biz", + "adultsextoys.com", + "adulttime.com", + "adulttoontube.com", + "adultvideodump.com", + "adultvideotop.com", + "adultvirtualworlds.net", + "advance-he.ac.uk", + "advanced-he.ac.uk", + "advanced-radiotherapy.ac.uk", + "advancedhe.ac.uk", + "advancediddetection.com", + "advancedtherapeutics-cdt.ac.uk", + "advancehe.ac.uk", + "advancingaccess.ac.uk", + "advanscene.com", + "advantagenottinghamshire.ac.uk", + "adventofcode.com", + "adventuresbydisney.com", + "advertfan.com", + "advertisercommunity.com", + "advertiserscommunity.com", + "adwords-community.com", + "adwords.com", + "adwordsexpress.com", + "adx.promo", + "ae.org", + "aeasyshop.com", + "aebn.com", + "aecc-chiropractic.ac.uk", + "aecc.ac.uk", + "aecexcellence.com", + "aei.org", + "aemap.ac.uk", + "aengd.ac.uk", + "aenhancers.com", + "aerogard.com.au", + "aerogardcn.com", + "aerosol-cdt.ac.uk", + "aerospace-cadcam.com", + "aerospace-design.com", + "aerospace-training-wales.ac.uk", + "aes.ac.uk", + "aesworkshops.com", + "aex.com", + "af.mil", + "afantibbs.com", + "afao.ac.uk", + "afappyending.com", + "afewmomentswith.com", + "affect3dstore.com", + "affirmtrust.com", + "afi.ac.uk", + "afkv28.com", + "aflamporn.com", + "aflamsex.net", + "aflamsexhd.com", + "afp.com", + "afpforum.com", + "afr.com", + "afreecatv.com", + "afriboyz.com", + "africadesk.ac.uk", + "africanplants.ac.uk", + "afsni.ac.uk", + "afterenglish.ac.uk", + "aga-expo.com", + "agag.tw", + "agdbank.com", + "age.tv", + "agedm.app", + "agedm.org", + "agedm.tv", + "agefans.com", + "agemys.net", + "agemys.org", + "agendaweek.com", + "agenet.ac.uk", + "agnesb.fr", + "agocg.ac.uk", + "agoogleaday.com", + "agrd.io", + "agressofinanceroyalholloway.ac.uk", + "agrifoodatp.ac.uk", + "agrifor.ac.uk", + "agriforwards-cdt.ac.uk", + "agro.hk", + "agroforestry.ac.uk", + "ags.ac.uk", + "agu.org", + "agzy1.com", + "ah-me.com", + "ahc.ac.uk", + "ahcathyxxx.com", + "ahcs.ac.uk", + "ahds.ac.uk", + "ahegao.online", + "ahentaitv.com", + "ahessc.ac.uk", + "ahgtm.ac.uk", + "ahlxs-me.buzz", + "ahlxsdh.sbs", + "ahmia.fi", + "ahorsecock.com", + "ahpd.ac.uk", + "ahpornogratuit.com", + "ahpornotube.com", + "ahrc.ac.uk", + "ahrcfoodnetwork.ac.uk", + "ahsexfilme.com", + "ahswingerporno.com", + "ahtops.com", + "ahtranny.com", + "ahua.ac.uk", + "ahvideosexe.com", + "ahxxx.club", + "ai-kan.net", + "ai-wen.net", + "ai.com", + "ai.google", + "ai3sd.ac.uk", + "ai7995.site", + "ai91porn.cc", + "aiaa.org", + "aiasahi.jp", + "aib.ac.uk", + "aim25.ac.uk", + "aimei133.com", + "aimhighergreatermerseyside.ac.uk", + "aimhighernorthamptonshire.ac.uk", + "aimhighernw.ac.uk", + "aimhigherscotland.ac.uk", + "aimhighersurrey.ac.uk", + "aimhighersw.ac.uk", + "aimhigherwm-alps.ac.uk", + "aimhigherwm.ac.uk", + "aims.ac.uk", + "aimsciences.org", + "aipa553.com", + "aiph.net", + "air-nike-shoes.com", + "air-watch.com", + "airasia.com", + "airav.cc", + "airav.wiki", + "airconsole.com", + "aircrack-ng.org", + "aire-wharf-coll.ac.uk", + "airgonetworks.com", + "airgunstudio.com", + "airhorn.solutions", + "airhornbot.com", + "airiti.com", + "airitilibrary.com", + "airmax360.com", + "airmay.com", + "airport-gov-cn.com", + "airport.brussels", + "airport.com", + "airport.eu", + "airsextube.com", + "airsupportapp.com", + "airtunes.com", + "airtunes.info", + "airtunes.net", + "airvpn.org", + "airwatchexpress.com", + "airwatchqa.com", + "airwick.at", + "airwick.be", + "airwick.ca", + "airwick.ch", + "airwick.cl", + "airwick.co.in", + "airwick.co.nz", + "airwick.co.uk", + "airwick.co.za", + "airwick.com", + "airwick.com.au", + "airwick.com.br", + "airwick.com.mx", + "airwick.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.us", + "airwickarabia.com", + "aisejushi.com", + "aisex.com", + "aishegw.com", + "ait.org.tw", + "aiv-cdn.net", + "aiv-delivery.net", + "aiweiwei.com", + "aiweiweiblog.com", + "aiwucm-us.sbs", + "aixingge2.cc", + "aizyk.buzz", + "aizyk.xyz", + "ajplus.net", + "ajsands.com", + "ajsjx.com", + "ajtalk.com", + "ak1.net", + "aka-ai.com", + "aka-ai.net", + "aka.ms", + "akacrypto.net", + "akadeem.net", + "akademiye.org", + "akadns.com", + "akadns.net", + "akadns6.net", + "akaeai.com", + "akafms.net", + "akagtm.org", + "akahost.net", + "akaint.net", + "akam.net", + "akamaa.com", + "akamah.com", + "akamai-access.com", + "akamai-access.net", + "akamai-cdn.com", + "akamai-platform-internal.net", + "akamai-platform-staging.com", + "akamai-platform.net", + "akamai-regression.net", + "akamai-staging.net", + "akamai-sucks.net", + "akamai-thailand.com", + "akamai-thailand.net", + "akamai-trials.com", + "akamai.co.kr", + "akamai.net", + "akamaiedge.net", + "akamaientrypoint.net", + "akamaietpcnctest.com", + "akamaietpcompromisedcnctest.com", + "akamaietpcompromisedmalwaretest.com", + "akamaietpmalwaretest.com", + "akamaietpphishingtest.com", + "akamaihd-staging.net", + "akamaihd.com", + "akamaihd.net", + "akamaimagicmath.net", + "akamainewzealand.com", + "akamaiphillipines.com", + "akamaiphillipines.net", + "akamaisingapore.net", + "akamaistream.net", + "akamaitech.com", + "akamaitech.net", + "akamaitechnologies.com", + "akamaitechnologies.net", + "akamaized-staging.net", + "akamaized.net", + "akamaizercentral.com", + "akamak.com", + "akamam.com", + "akamci.com", + "akami.com", + "akami.net", + "akamii.com", + "akamqi.com", + "akasha.world", + "akastream.com", + "akastream.net", + "akatns.net", + "akiba-online.com", + "akiba-web.com", + "akinator.com", + "akow.org", + "akthelp.com", + "al-islam.com", + "al-qimmah.net", + "al.ru", + "alabout.com", + "alanhou.com", + "alarab.qa", + "alasbarricadas.org", + "albagals.com", + "albastudio.co", + "albeats.com", + "alc.ac.uk", + "alchemysynth.com", + "alcs.ac.uk", + "aldinhe.ac.uk", + "alexa.com", + "alexanderlondoncollege.ac.uk", + "alexanderstreet.com", + "alexlur.org", + "alfera.com.hk", + "alfera.com.my", + "alfera.in", + "alfera.my", + "alforattv.net", + "alhayat.com", + "alhs.link", + "alhs.xyz", + "alias.com", + "aliasadvantage.com", + "aliasimaginationsengine.com", + "aliasple.com", + "aliasshowcase.com", + "aliassketchbook.com", + "aliassketchbookpro.com", + "aliassystems.com", + "aliasvisualizationstudio.com", + "aliaswavefront.com", + "alibabacloud.co.in", + "alibabacloud.com", + "alibabacloud.com.au", + "alibabacloud.com.hk", + "alibabacloud.com.my", + "alibabacloud.com.sg", + "alibabacloud.com.tw", + "alicejapan.co.jp", + "alicloud.com", + "aliengu.com", + "alis-wales.ac.uk", + "alive.bar", + "aliveipc.com", + "aliveitsm.com", + "aliveprofiler.com", + "alivercm.com", + "aliverewind.com", + "alivertsm.com", + "alivevm.com", + "alivevmax.com", + "alivevue.com", + "aliyuncs.com", + "aljazeera.com", + "aljazeera.net", + "alkasir.com", + "all-sex-links.com", + "all3dsexpics.com", + "all4mom.org", + "allcoin.com", + "allconnected.co", + "allcu.ac.uk", + "alldrawingshere.com", + "alldrawnsex.com", + "allervpn.com", + "allfet.net", + "allfinegirls.com", + "allgirlmassage.com", + "allgirlsallowed.org", + "allgravure.com", + "allhen.online", + "allhorsesex.com", + "alliance.org.hk", + "alliancemanchester.ac.uk", + "alliancemanchesterbusinessschool.ac.uk", + "alliancembs.ac.uk", + "alliancesages.com", + "allinfa.com", + "allinternal.com", + "allizom.net", + "allizom.org", + "alljackpotscasino.com", + "alljapanesepass.com", + "allmomsex.com", + "allmovie.com", + "allnations.ac.uk", + "allover30.com", + "allowed.org", + "allpasswords.com", + "allporncomic.com", + "allpornsites.net", + "allpornsitespass.com", + "allspyclips.com", + "allswingersclubs.org", + "allthefallen.moe", + "alma.ac.uk", + "almasdarnews.com", + "almcollege.ac.uk", + "almostmy.com", + "aloe.ac.uk", + "alohatube.com", + "alotporn.com", + "alphabet.asia", + "alphabet.at", + "alphabet.be", + "alphabet.biz", + "alphabet.ch", + "alphabet.co.hu", + "alphabet.co.uk", + "alphabet.co.za", + "alphabet.com", + "alphabet.com.es", + "alphabet.com.lv", + "alphabet.com.mx", + "alphabet.com.pl", + "alphabet.com.pt", + "alphabet.cz", + "alphabet.de", + "alphabet.es", + "alphabet.eu", + "alphabet.fr", + "alphabet.info", + "alphabet.jp", + "alphabet.lt", + "alphabet.lu", + "alphabet.lv", + "alphabet.mx", + "alphabet.no", + "alphabet.org.uk", + "alphabet.pl", + "alphabet.pt", + "alphabet.uk", + "alphabet.us", + "alphabetfinance.net", + "alphaporno.com", + "alphera-finance.co.in", + "alphera-finance.com.hk", + "alphera-finance.in", + "alphera.ca", + "alphera.co.in", + "alphera.co.nz", + "alphera.com", + "alphera.com.es", + "alphera.com.hk", + "alphera.com.my", + "alphera.de", + "alphera.es", + "alphera.ie", + "alphera.in", + "alphera.my", + "alphera.net", + "alpherafinance.com.hk", + "alpherafinancialservices.es", + "alpherafinancialservices.in", + "alpherafs.ca", + "alpherafs.co.nz", + "alpherafs.com.hk", + "alpherafs.com.my", + "alpherafs.ie", + "alpherafs.in", + "alpherafs.my", + "alpinedc.ch", + "alpinelinux.org", + "alps-cetl.ac.uk", + "alps-wm.ac.uk", + "alsalam.ac.uk", + "alsod.ac.uk", + "alt.ac.uk", + "alt.com", + "altera.com", + "alteraforum.com", + "alteraforums.com", + "alteraforums.net", + "alterauserforum.com", + "alterauserforum.net", + "alterauserforums.com", + "alterauserforums.net", + "altereco.ac.uk", + "alternate-tools.com", + "alternativeto.net", + "altis.ac.uk", + "altmetric.com", + "alton.ac.uk", + "altoncollege.ac.uk", + "altporn.net", + "altrec.com", + "alvinalexander.com", + "always-we-need.games", + "alwaysdata.com", + "alwaysdata.net", + "alwaysvpn.com", + "alwcymru.ac.uk", + "alzheimers.ac.uk", + "am730.com.hk", + "amaaozn.com", + "amabitch.com", + "amakings.com", + "amamanualofstyle.com", + "amandalist.com", + "amanmi.com", + "amapornofilme.com", + "amateur-cougar.com", + "amateur-exhibitionist.org", + "amateur-fetish.com", + "amateur-gallery-post.com", + "amateur-home-sex.com", + "amateur-porn-clips.com", + "amateur-porn-tube.net", + "amateur-pussies.com", + "amateur-threesomes.com", + "amateuralbum.net", + "amateuranalporn.com", + "amateuranalvideos.com", + "amateurarchiver.com", + "amateurbdsmporn.com", + "amateurblondegirls.com", + "amateurblowjobporn.com", + "amateurcool.com", + "amateurcuckoldporn.com", + "amateure-xtreme.com", + "amateurest.com", + "amateurgalore.net", + "amateurgirlfriends.net", + "amateurhomevids.com", + "amateurhousewifefuck.com", + "amateurmommymovies.com", + "amateuroldsluts.com", + "amateurpages.com", + "amateurporn.photos", + "amateurpornhouse.com", + "amateurpornonly.com", + "amateurpornsexvideos.com", + "amateurs-fuck.com", + "amateurs-gone-wild.com", + "amateursecrets.net", + "amateursexpussy.com", + "amateursexstart.nl", + "amateurslovesporn.com", + "amateursvid.com", + "amateurswingersmovies.com", + "amateurthreesomeporn.com", + "amateurwifefuck.com", + "amateurwifetits.com", + "amateurwifevideos.com", + "amateurwivesvideos.com", + "amateurxx.org", + "amatorialesesso.com", + "amatporn.com", + "amatura.com", + "amazingcuckold.com", + "amazon-adsystem.com", + "amazon-fashions.com", + "amazon-jp-recruiting.com", + "amazon-lantern.com", + "amazon-launchpad.com", + "amazon.ae", + "amazon.ca", + "amazon.co.jp", + "amazon.co.uk", + "amazon.com", + "amazon.com.au", + "amazon.com.br", + "amazon.com.mx", + "amazon.com.tr", + "amazon.de", + "amazon.dev", + "amazon.es", + "amazon.fr", + "amazon.in", + "amazon.it", + "amazon.jobs", + "amazon.jp", + "amazon.nl", + "amazon.red", + "amazon.sg", + "amazonalexavoxcon.com", + "amazonauthorinsights.com", + "amazonaws-china.com", + "amazonaws.biz", + "amazonaws.co.uk", + "amazonaws.com", + "amazonaws.info", + "amazonaws.net", + "amazonaws.org", + "amazonaws.tv", + "amazonbusiness.org", + "amazonbusinessblog.com", + "amazondevicesupport.com", + "amazonfctours.com", + "amazonianblog.com", + "amazonimages.com", + "amazonlaunchpad.com", + "amazonliterarypartnership.com", + "amazonlumberyard.wang", + "amazonpay.com", + "amazonpay.in", + "amazonprimevideos.com", + "amazonsdi.com", + "amazonses.com", + "amazonstudiosguilds.com", + "amazontrust.com", + "amazonvideo.cc", + "amazonvideo.com", + "amazonvideodirect.com", + "amazonworkdocs.com", + "ambs.ac.uk", + "amc.com", + "amcn.com", + "amcnetworks.com", + "amcplus.com", + "amd.com", + "amd.com.cn", + "amdfanstore.com", + "amdigital.co.uk", + "ameba.jp", + "amebame.com", + "amebaownd.com", + "amebaowndme.com", + "ameblo.jp", + "amerc.ac.uk", + "america.gov", + "americabrox.ac.uk", + "american.edu", + "americangreencard.com", + "americanunfinished.com", + "americasvoice.news", + "americorps.gov", + "amerikaninsesi.com", + "amerikaninsesi.org", + "amerikaovozi.com", + "amerikayidzayn.com", + "amerikiskhma.com", + "amersham.ac.uk", + "amerwyc-coll.ac.uk", + "amf.ac.uk", + "amgueddfacymru.ac.uk", + "amh.ac.uk", + "ami.ac.uk", + "amiblockedornot.com", + "amigobbs.net", + "amiibo.com", + "amitabhafoundation.us", + "amity.ac.uk", + "amlg.io", + "amnesty.org", + "amnesty.org.hk", + "amnesty.tw", + "amnestyusa.org", + "amnyemachen.org", + "amodoll.com", + "amof.ac.uk", + "amoiist.com", + "amourangels.com", + "amp.dev", + "amplifi.com", + "amplifyapp.com", + "amplifyframework.com", + "ampproject.com", + "ampproject.net", + "ampproject.org", + "amrtraining.ac.uk", + "ams.org", + "ams02.space", + "amsterdamhotescort.com", + "amsterdamluxescort.com", + "amtb-taipei.org", + "amytele.com", + "amzn.asia", + "amzn.com", + "amzn.to", + "amznl.com", + "anacams.com", + "anaconda.cloud", + "anaconda.com", + "anaconda.org", + "anaesthetistswales.ac.uk", + "anal-f.net", + "anal-pantyhose.com", + "anal.casa", + "anal.media", + "analamateursex.com", + "analcamshow.com", + "analdin.com", + "analfuckvideo.com", + "analhomeporn.com", + "anallivecams.com", + "analpornhouse.com", + "analpornonly.com", + "analpornosex.com", + "analqts.com", + "analsaga.com", + "analscreen.com", + "analtime.org", + "analvids.com", + "analytictech.com", + "anandtech.com", + "anatomy.tv", + "anb.org", + "ancensored.com", + "anchor.fm", + "anchorfree.com", + "ancientcyprus.ac.uk", + "ancientwisdoms.ac.uk", + "ancsconf.org", + "andfaraway.net", + "andover.ac.uk", + "andovercollege.ac.uk", + "android-x86.org", + "android.com", + "androidauthority.com", + "androidcombo.com", + "androidfilehost.com", + "androidify.com", + "androidplus.co", + "androidpolice.com", + "androidtv.com", + "andygod.com", + "andysparis.com", + "anfutong.com", + "angel-gto.com", + "angel.ac.uk", + "angela-merkel.de", + "angelbeats.jp", + "angelfire.com", + "angelweb.jp", + "angle.com.tw", + "anglia-polytechnic.ac.uk", + "anglia-ruskin.ac.uk", + "anglia.ac.uk", + "angola.org", + "angulardart.org", + "angularjs.org", + "angus.ac.uk", + "anguscollege.ac.uk", + "anibooru.com", + "anic.ac.uk", + "anidom.com", + "anigema.jp", + "anilos.com", + "animal-hentai.com", + "animal-porn.net", + "animalforsex.com", + "animalincum.com", + "animalporn.me", + "animalpornxxx.me", + "animalsporn.net", + "animalsporn.tv", + "animalzoosex.me", + "anime-pictures.net", + "anime-tube.pw", + "animecrazy.net", + "animedao-tv.com", + "animegal.net", + "animehentaihub.com", + "animeidhentai.com", + "animepornhd.com", + "animesex.me", + "animesexhq.com", + "animeshippuuden.com", + "animestigma.com", + "animezilla.com", + "aniscartujo.com", + "anistreaming.xyz", + "ankarazirvesi2018.com", + "anm.co.uk", + "annamilk.com", + "annas-archive.org", + "annatam.com", + "anniesland-fe.ac.uk", + "anniesland.ac.uk", + "annstores.net", + "annualpelvicexam.com", + "annualreviews.org", + "anobii.com", + "anon-v.com", + "anon-v.lol", + "anonfiles.com", + "anontext.com", + "anonymise.us", + "anonymitynetwork.com", + "anonymize.com", + "anonymizer.com", + "anonymouse.org", + "anpopo.com", + "answering-islam.org", + "antarctic.ac.uk", + "antarctica.ac.uk", + "antarvasnaclips.com", + "antarvasnax.com", + "antd.org", + "antenna.co.kr", + "antf.ac.uk", + "anthemgame.com", + "anthemthegame.com", + "anthonycalzadilla.com", + "anthropic.com", + "anthropology.ac.uk", + "anti1984.com", + "antichristendom.com", + "anticipate.ac.uk", + "antiquity.ac.uk", + "antislavery.ac.uk", + "antislaverylaw.ac.uk", + "antisocial.science", + "antiwave.net", + "anudetube.com", + "anws.gov.tw", + "anxiangxing.com", + "anybunny.org", + "anybunny.tv", + "anydesk.com", + "anyhentai.com", + "anyporn.com", + "anypornhd.com", + "anypornsexxx.com", + "anysex.com", + "anyshemale.com", + "anyxxx.me", + "anyxxx.pro", + "ao3.org", + "aobo.com.au", + "aoc.ac.uk", + "aoc.cat", + "aocc.ac.uk", + "aofriend.com", + "aofriend.com.au", + "aojiao.org", + "aokwholesale.net", + "aol.ca", + "aol.co.uk", + "aol.com", + "aolnews.com", + "aomedia.org", + "aomiwang.com", + "aopcuk.ac.uk", + "aorus.com", + "aoxx69.net", + "ap.org", + "ap0le.com", + "apa.org", + "apache.org", + "apartmentratings.com", + "apartments.com", + "apat1989.org", + "apetube.com", + "apexlegends.com", + "apexprint.com.hk", + "aphe.ac.uk", + "api-extractor.com", + "api.ai", + "api.news", + "apiary.io", + "apibay.org", + "apigee.com", + "apina.biz", + "apis.ac.uk", + "apisof.net", + "apk-dl.com", + "apk.support", + "apk.tw", + "apkcombo.com", + "apkmirror.com", + "apkmonk.com", + "apkplz.com", + "apkpure.com", + "apkpure.net", + "aple.com", + "aplestore.com", + "aplleipods.com", + "aplustraining.ac.uk", + "aplusvpn.com", + "apnews.com", + "apole.com", + "apollo.ac.uk", + "apollocampus.ac.uk", + "apollocrewe.ac.uk", + "apornotube.net", + "aporntv.com", + "apornvideo.com", + "app-dynamics.com", + "app-measurement-cn.com", + "app-measurement.com", + "app-store.wang", + "app.link", + "app0le.com", + "app756.com", + "appbrain.com", + "appbridge.ca", + "appbridge.io", + "appbridge.it", + "appcenter.ms", + "appcloud.com", + "appdomain.cloud", + "appdownloader.net", + "appdynamics.co.uk", + "appdynamics.com", + "appdynamics.de", + "appdynamics.fr", + "appdynamics.info", + "appdynamics.jp", + "appdynamics.org", + "appe-store.com", + "appexchange.com", + "apphb.com", + "appl-e.com", + "appl.com", + "appl4e.com", + "appla.com", + "apple-cloudkit.com", + "apple-darwin.com", + "apple-darwin.net", + "apple-darwin.org", + "apple-dns.com", + "apple-dns.net", + "apple-enews.com", + "apple-expo.com", + "apple-expo.eu", + "apple-hk.com", + "apple-imac.com", + "apple-inc.net", + "apple-livephotoskit.com", + "apple-mapkit.com", + "apple-online.com", + "apple-pay.com", + "apple-pay.rs", + "apple-pay.wang", + "apple-store.net", + "apple-store.wang", + "apple-usa.net", + "apple-watch.com.ru", + "apple.ae", + "apple.at", + "apple.be", + "apple.bg", + "apple.bs", + "apple.ca", + "apple.ch", + "apple.cl", + "apple.cm", + "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.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.news", + "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.us", + "apple.xyz", + "appleaccount.net", + "appleafrica.com", + "appleantilles.com", + "appleappstore.net", + "appleappstore.tv", + "appleaustralia.com", + "appleaustralia.com.au", + "appleaustralia.net.au", + "applebk.net", + "applecarbon.com", + "applecard.tv", + "applecare.berlin", + "applecare.cc", + "applecare.eu", + "applecare.hamburg", + "applecare.wang", + "applecensorship.com", + "applecentar.co.rs", + "applecentar.rs", + "applecentre.com.au", + "applecentre.info", + "appleclassicipod.com", + "appleclub.com.hk", + "applecom.com", + "applecomputer-imac.com", + "applecomputer.co.in", + "applecomputer.co.nz", + "applecomputer.com", + "applecomputer.com.hk", + "applecomputer.com.tw", + "applecomputer.hu", + "applecomputer.kr", + "applecomputerimac.com", + "applecomputerinc.info", + "applecomputers.co.nz", + "applecoronavirus.com", + "appledaily.com", + "appledaily.com.hk", + "appledaily.com.tw", + "appledaily.hk", + "appledarwin.com", + "appledarwin.net", + "appleenews.com", + "appleexpo.eu", + "appleexpo.info", + "applefilmaker.com", + "applefilmmaker.com", + "applefinalcutproworld.com", + "applefinalcutproworld.net", + "applefinalcutproworld.org", + "applefruity.com", + "applehealth.com.hk", + "applehongkong.com", + "applehongkong.com.hk", + "appleid-applemx.com", + "appleid-applemx.us", + "appleid-iclou.com", + "appleid-uk.us", + "appleid.berlin", + "appleid.com", + "appleid.hamburg", + "appleid.hk", + "appleimac.com", + "appleinclegal.com", + "appleinsider.com", + "appleiphone.hu", + "appleiphone.net", + "appleiphonecell.com", + "appleipodsettlement.com", + "appleiservices.com", + "applelink.com", + "applemagickeyboard.com", + "applemalaysia.com.my", + "applemasters.info", + "applemusic.berlin", + "applemusic.co", + "applemusic.com", + "applemusic.com.au", + "applemusic.hamburg", + "applemusic.wang", + "applemusicconnect.com", + "applemusicfestival.com", + "applemx-icloud.com", + "applenews.berlin", + "applenews.hamburg", + "applenews.tv", + "applenewsformat.com", + "appleone.audio", + "appleone.blog", + "appleone.chat", + "appleone.cloud", + "appleone.club", + "appleone.community", + "appleone.film", + "appleone.guide", + "appleone.host", + "appleone.space", + "appleone.tech", + "appleone.website", + "appleonline.com", + "appleonline.net", + "appleoriginalproductions.com", + "appleos.tv", + "applepay.berlin", + "applepay.co.rs", + "applepay.com.tw", + "applepay.hamburg", + "applepay.hk", + "applepay.info", + "applepay.jp", + "applepay.rs", + "applepay.tv", + "applepaycash.net", + "applepaycash.tv", + "applepaymerchantsupplies.info", + "applepaysupplies.berlin", + "applepaysupplies.com", + "applepaysupplies.info", + "applepaysupplies.net", + "applepaysupplies.tv", + "applepencil.net", + "applepodcasts.com", + "applepremiumreseller.com.au", + "applepremiumresellers.com.au", + "applereach.com", + "applereach.net", + "apples-msk.ru", + "applescreensavers.com", + "applescript.info", + "appleshare.info", + "appleshop.co.uk", + "applestor.com", + "applestore.bg", + "applestore.cc", + "applestore.ch", + "applestore.cm", + "applestore.co.hu", + "applestore.co.jp", + "applestore.co.ug", + "applestore.co.uk", + "applestore.com", + "applestore.com.au", + "applestore.com.bn", + "applestore.com.ee", + "applestore.com.eg", + "applestore.com.gr", + "applestore.com.hk", + "applestore.com.hr", + "applestore.com.jo", + "applestore.com.my", + "applestore.com.ph", + "applestore.com.pl", + "applestore.com.pt", + "applestore.com.ro", + "applestore.com.ru", + "applestore.com.sn", + "applestore.com.tw", + "applestore.de", + "applestore.hk", + "applestore.kr", + "applestore.me", + "applestore.net", + "applestore.net.gr", + "applestore.ph", + "applestore.qa", + "applestore.sg", + "applestore.wang", + "applestoreonline.com", + "applestorepro.eu", + "applesurveys.com", + "appleswift.com", + "appletaiwan.com", + "appletips.net", + "appletv.com", + "appletv.fr", + "appletv.wang", + "appletvapp.apple", + "applewallet.com", + "applewallet.tv", + "applewatch.hk", + "applewatch.tv", + "applewatch.tw", + "applewatch.wang", + "applewatchedition.com", + "applewatchseries3.net", + "applewatchsport.com", + "appleweb.net", + "applexpo.net", + "applezh.com", + "applf.com", + "applfe.com", + "applicationinsights.io", + "applicationinsights.net", + "applle.com", + "applw.com", + "appmediagroup.com", + "approvedusedbmw.com", + "appsflayer.com", + "appshopper.com", + "appsocks.net", + "appsonebay.net", + "appspot-preview.com", + "appspot.com", + "appsto.re", + "appstore.co.id", + "appstore.hk", + "appstore.my", + "appstore.ph", + "appule.com", + "appye.com", + "appyq.com", + "apr.ac.uk", + "apress.com", + "aps.org", + "apt.ac.uk", + "aptoide.com", + "apts.ac.uk", + "apture.com", + "apu.ac.uk", + "apuc-scot.ac.uk", + "apyarstorybooks.blogspot.com", + "apyle.com", + "aqdlt.net", + "aqmen.ac.uk", + "aquinas.ac.uk", + "arabianchicks.com", + "arabidopsis.org", + "arabnek.com", + "arabxn.com", + "arabxnxx.org", + "arabysexy.com", + "arabysexy.mobi", + "aragon.network", + "aranzadi.es", + "arauc.br", + "arc.ac.uk", + "arcadewank.com", + "arcgis.com", + "arcgisonline.com", + "archaeologydataservice.ac.uk", + "archangel.ac.uk", + "archer.ac.uk", + "archie-west.ac.uk", + "architectural-cadcam.com", + "archive-it.org", + "archive.ac.uk", + "archive.fo", + "archive.is", + "archive.li", + "archive.md", + "archive.org", + "archive.ph", + "archive.today", + "archiveofourown.com", + "archiveofourown.net", + "archiveofourown.org", + "archives.gov", + "archives.gov.tw", + "archiveshub.ac.uk", + "archivx.to", + "archlinux.org", + "archlinuxarm.org", + "archway.ac.uk", + "arcom.ac.uk", + "arctic.ac.uk", + "arctosia.com", + "arden.ac.uk", + "ardencampus.ac.uk", + "ardencollege.ac.uk", + "ardenu.ac.uk", + "ardenuni.ac.uk", + "ardenuniversity.ac.uk", + "area120.com", + "area51.to", + "areca-backup.org", + "arena.taipei", + "arethusa.su", + "arewereadyyet.com", + "areyoucreditwise.com", + "argotunnel.com", + "argyllcollege.ac.uk", + "aria.ms", + "ariadne.ac.uk", + "aricd.ac.uk", + "aries-dtp.ac.uk", + "ark-genomics.ac.uk", + "ark.ac.uk", + "ark.to", + "arlingtoncemetery.mil", + "arm.ac.uk", + "arma.ac.uk", + "armagh.ac.uk", + "armovs.com", + "army.mil", + "arnold-carlton.ac.uk", + "arnoldrenderer.com", + "arphic.com", + "arphic.com.cn", + "arphic.com.tw", + "arrc.ac.uk", + "ars.ac.uk", + "art1lib.com", + "art4tibet1998.org", + "artcam.com", + "artcamexpress.com", + "artcaminsignia.com", + "artcamjewelsmith.com", + "artcampro.com", + "artdesignhull.ac.uk", + "arte.tv", + "artifact.ac.uk", + "artixlinux.org", + "artnudegalleries.com", + "artoferotica.info", + "artofmaking.ac.uk", + "artofpeacefoundation.org", + "arts-inst-bournemouth.ac.uk", + "arts.ac.uk", + "artsigns.ac.uk", + "artsmethodsnorthwest.ac.uk", + "artsresearchatnorthampton.ac.uk", + "artstation.com", + "artstationmedia.com", + "artstor.org", + "artsy.net", + "aru.ac.uk", + "arunachalforests.gov.in", + "arupoc.ac.uk", + "arxiv.org", + "arzon.jp", + "as-hp.ca", + "asacp.org", + "asagaku.com", + "asahi.com", + "asahicom.jp", + "asakonet.co.jp", + "ascelibrary.org", + "ascent.ac.uk", + "ascentis.ac.uk", + "ascorpus.ac.uk", + "ascr.ac.uk", + "ascribed.ac.uk", + "asdfg.jp", + "asearch.ac.uk", + "asebay.com", + "asen.ac.uk", + "asexdoll.com", + "asextube.net", + "asfc.ac.uk", + "asg.to", + "asgp.ac.uk", + "asha.org", + "ashemaletube.com", + "ashemaletv.com", + "ashford.ac.uk", + "ashleysageellison.com", + "ashridge.ac.uk", + "ashtoninstitute.ac.uk", + "asia-gaming.com", + "asiabrox.ac.uk", + "asiacrazy.xyz", + "asiaharvest.org", + "asiamap.ac.uk", + "asiamoviepass.com", + "asian-anal-sex.com", + "asianage.com", + "asianboygay.com", + "asiancamgirllive.com", + "asiancamly.com", + "asianews.it", + "asianfreeforum.com", + "asianfreeporn.net", + "asiangfvideos.com", + "asiangirlsnextdoor.com", + "asianphd.com", + "asianporn.rest", + "asianporn.sexy", + "asianpornjav.com", + "asianpornlabs.com", + "asianpornmovies.com", + "asianpornonly.com", + "asianporntrends.com", + "asianpornup.com", + "asianscreens.com", + "asiansex.sexy", + "asiansexdiary.com", + "asiansmaster.com", + "asianspiss.com", + "asianthumbs.org", + "asianwifeporn.com", + "asianwomensfilm.de", + "asianxxxvideos.cc", + "asiaone.com", + "asiatgp.com", + "asiatimes.com", + "asiatoday.us", + "ask-sam.ac.uk", + "ask.com", + "askfacebook.net", + "askfacebook.org", + "askham-bryan.ac.uk", + "askham.ac.uk", + "askhambryan.ac.uk", + "asknudes.com", + "askstudent.com", + "askubuntu.com", + "askynz.net", + "asm.org", + "asme.org", + "asmhentai.com", + "asminternational.org", + "asmrbuluo.com", + "asn-online.org", + "asp-cc.com", + "asp.net", + "aspbjournals.org", + "aspect.ac.uk", + "aspectnetwork.ac.uk", + "aspenpublishing.com", + "aspi.org.au", + "aspire.ac.uk", + "aspiretrainingteam.ac.uk", + "aspistrategist.org.au", + "aspnetcdn.com", + "asproex.com", + "asproexapi.com", + "asra.ac.uk", + "asredas.com", + "asrockind.com", + "ass4all.com", + "assap.ac.uk", + "assembla.com", + "assemblesystems.com", + "assesphoto.com", + "assetsadobe.com", + "assimp.org", + "assistirhentai.com", + "assoass.com", + "associates-amazon.com", + "associationforpoliticalthought.ac.uk", + "assylum.com", + "astec.ac.uk", + "asthma-allergy.ac.uk", + "astm.org", + "asto.re", + "aston.ac.uk", + "astrill.com", + "astrobiology.ac.uk", + "astrogrid.ac.uk", + "astronomy.ac.uk", + "asus.com", + "asuscloud.com", + "asuswebstorage.com", + "asvin.ac.uk", + "atandt.com", + "atc.org.au", + "atchinese.com", + "atdmt.com", + "atdmt2.com", + "ateam-oracle.com", + "atgfw.org", + "athenaeizou.com", + "athens.ac.uk", + "atkgallery.com", + "atlanta168.com", + "atlantaminidealers.com", + "atlars.ac.uk", + "atlas.ac.uk", + "atlasdmt.com", + "atlasonepoint.com", + "atlaspost.com", + "atlassian.com", + "atlassian.net", + "atnext.com", + "atom.io", + "atos.net", + "atp.ac.uk", + "atscaleconference.com", + "atsip.ac.uk", + "att-bundles.com", + "att-idns.net", + "att-japan.com", + "att-mail.com", + "att-promotions.com", + "att-rsvp.com", + "att.com", + "att.jobs", + "att.net", + "att.tv", + "attackers.net", + "attalascom.com", + "attbelieves.com", + "attbusiness.net", + "attcenter.com", + "attcollaborate.com", + "attdns.com", + "attdns.net", + "attexperts.com", + "attglobal.net", + "atthelimits.ac.uk", + "attic.io", + "attinnovationspace.com", + "attinternetservice.com", + "attjoy.com", + "attnetclient.com", + "attonlineoffers.com", + "attproxy.com", + "attpublicpolicy.com", + "attpurchasing.com", + "attsavings.com", + "attspecial.com", + "attssl.com", + "attstadium.com", + "attsuppliers.com", + "atttvnow.com", + "attuverseoffers.com", + "attuverseonline.com", + "attvoip.com", + "attwatchtv.com", + "attwifi.com", + "attwirelessinternet.com", + "attwirelessonline.com", + "attwirelesssolutions.com", + "atube.sex", + "atube.xxx", + "atubex.com", + "atwiki.jp", + "atypi.org", + "aua.ac.uk", + "aub.ac.uk", + "auc.ac.uk", + "aucb.ac.uk", + "aucheapbeats.com", + "aucyfrwngcymraeg.ac.uk", + "aude.ac.uk", + "audelondon.ac.uk", + "audible.com", + "audiencenetwork.com", + "audiencenetwork.tv", + "audiobeatsau.com", + "audiobeatsbydre.com", + "audiomonsterbeatsonline.com", + "audionow.com", + "aue.ac.uk", + "auee.ac.uk", + "aukcar.ac.uk", + "aulic.ac.uk", + "auntymaza.com", + "auphf.ac.uk", + "auricularemonsterbeats.com", + "auricularesbeatsbaratosshop.com", + "auricularesbeatsmarkt.com", + "auroraoss.com", + "ausbeatsbydrdre.com", + "auth0.com", + "authorizeddns.net", + "authorizeddns.org", + "authorizeddns.us", + "authorxml.com", + "authy.com", + "autocad-schulungen.com", + "autocad.com", + "autocad360.com", + "autocad3d.com", + "autocadarchitecturecc.com", + "autocadexpert.com", + "autocadformac.com", + "autocadfreestyle.com", + "autocadlt.com", + "autocadltbg.com", + "autocadmac.com", + "autocadmobile.com", + "autocadsucks.com", + "autocadsucks.net", + "autocadws.com", + "autocadws.net", + "autodesk-aia-me.com", + "autodesk-events.com", + "autodesk-kickoff.com", + "autodesk-mm.com", + "autodesk-news.com", + "autodesk-online.com", + "autodesk-service.com", + "autodesk-services.com", + "autodesk-support.com", + "autodesk-university.com", + "autodesk-usability.com", + "autodesk.com", + "autodesk.dev", + "autodesk.net", + "autodesk123d.com", + "autodesk123dnews.com", + "autodesk360.com", + "autodesk360access.com", + "autodesk360beta.com", + "autodesk360bim.com", + "autodesk360express.com", + "autodesk360forbim.com", + "autodesk360forplm.com", + "autodesk360nexus.com", + "autodesk360nexus.net", + "autodesk360plm.com", + "autodesk360pro.com", + "autodesk360solutionforbim.com", + "autodesk360solutionforplm.com", + "autodesk360vault.com", + "autodeskaecfeed.com", + "autodeskandcitrix.com", + "autodeskarcade.com", + "autodeskautocadlt.com", + "autodeskautomotive.com", + "autodeskbim360.com", + "autodeskbookrequest.com", + "autodeskbuild.com", + "autodeskbuildingops.com", + "autodeskbuildspc.com", + "autodeskcave.com", + "autodeskchronicle.com", + "autodeskcommunications.com", + "autodeskcompetitions.com", + "autodeskdesigncompetition.com", + "autodeskdesigncompetitions.com", + "autodeskdiscussions.com", + "autodeskdocandmedia.com", + "autodeskdocandmediaamericas.com", + "autodeskdocandmediaasia.com", + "autodeskdocandmediaemea.com", + "autodeskdocandmediaeurope.com", + "autodeskegitimleri.com", + "autodeskenterprise.com", + "autodeskevents.com", + "autodeskfashionstyler.com", + "autodeskforgames.com", + "autodeskforge.com", + "autodeskformit.com", + "autodeskfoundation.com", + "autodeskfusionlifecycle.com", + "autodeskgovernment.net", + "autodeskgreenbuildingstudio.com", + "autodeskhelp.com", + "autodeskicpcouncil.com", + "autodeskimpression.com", + "autodeskinform.com", + "autodeskinstant.com", + "autodeskjournal.com", + "autodesklearning.com", + "autodesklistens.com", + "autodesklivedesign.com", + "autodesklms.com", + "autodeskmanufacturingacademy.com", + "autodeskmayaformotiongraphics.com", + "autodeskmedbookrequest.com", + "autodeskmedia.com", + "autodeskmediarequest.com", + "autodeskmeetings.com", + "autodeskmfg.com", + "autodeskmotiongraphicsandmore.com", + "autodesknews.com", + "autodeskonline.com", + "autodeskpartner.com", + "autodeskplm.com", + "autodeskplm360.com", + "autodeskplm360.net", + "autodeskproductreviews.com", + "autodeskprofiles.com", + "autodeskprograms.com", + "autodeskresearch.com", + "autodeskrevit.com", + "autodeskrevit.net", + "autodeskrevitsucks.com", + "autodeskrevitsucks.net", + "autodeskseek.com", + "autodesksketchbook.com", + "autodesksketchbookdesigner.com", + "autodeskstylebook.com", + "autodesksubscription.com", + "autodesksucks.com", + "autodesksucks.net", + "autodesktechdays.com", + "autodesktechx.com", + "autodesktinkerbox.com", + "autodesktravel.com", + "autodeskturkiye.com", + "autodeskuniversity.com", + "autodeskuniversity2013.com", + "autodeskvasari.com", + "autodeskvasari.net", + "autodeskvietnam.com", + "autodeskviewer.com", + "autodeskworkshop.com", + "autodeskworkshop.net", + "autodraw.com", + "automobile.fr", + "automotive-cadcam.com", + "autosketch.com", + "autosub.ac.uk", + "autumn-jade.com", + "auxdubai.com", + "av-baron.com", + "av-channel.com", + "av-e-body.com", + "av-movie.cc", + "av-th.net", + "av-top.com", + "av.com", + "av.movie", + "av01.tv", + "av11.org", + "av1688.cc", + "av369.net", + "av4.us", + "av69.tv", + "av69.us", + "av6k.com", + "av6k.vip", + "avaaz.org", + "avant.ac.uk", + "avatara.com", + "avbebe.com", + "avbody.tv", + "avcar.vip", + "avcens.xyz", + "avcity.tv", + "avcnn.com", + "avcool.com", + "avcrempie.com", + "avday.tv", + "avdb.in", + "avdb.tv", + "avdby-up.buzz", + "avdudu.top", + "avdwang.xyz", + "avelip.com", + "aventertainments.com", + "avfantasy.com", + "avfox.cc", + "avg.com", + "avgigi.com", + "avgle.com", + "avgle.net", + "avgod.club", + "avh.world", + "avhbo.com", + "avhd101.com", + "avhome.one", + "avhu.com", + "avidemux.org", + "avinetworks.com", + "avinin.com", + "avizoon.site", + "avizoone.com", + "avjb.com", + "avjiasu.com", + "avjoy.me", + "avjzy67.xyz", + "avking-mp4.sbs", + "avlulu.cc", + "avmo.pw", + "avmoo.click", + "avmoo.com", + "avmoo.net", + "avmoo.pw", + "avn.com", + "avnana5.com", + "avnight-shipin.com", + "avoision.com", + "avpanda.cc", + "avphd.ac.uk", + "avple.tv", + "avprc.ac.uk", + "avrila.cc", + "avrila2.cc", + "avrila2023.top", + "avrila23.cc", + "avriri.top", + "avsee01.tv", + "avseesee.com", + "avsforum.com", + "avstar.me", + "avstar01.me", + "avstar02.me", + "avstar03.me", + "avstar04.com", + "avstar04.me", + "avstar05.me", + "avstar06.me", + "avstar07.com", + "avstar07.me", + "avstar09.com", + "avstar09.me", + "avstar1.com", + "avstar2.com", + "avstar3.com", + "avstar4.com", + "avstar5.com", + "avstar6.com", + "avstar8.com", + "avstar9.com", + "avwong.com", + "avwto.com", + "avxde.org", + "avxhm.is", + "avxhm.se", + "avxlive.icu", + "avxxc.com", + "avyahoo.com", + "awayoutgame.com", + "aweencore.com", + "awempire.com", + "awesomeent.co.kr", + "awetv.com", + "awfdcp.ac.uk", + "awflapp.top", + "awjq.cc", + "awlc.ac.uk", + "aws-iot-hackathon.com", + "awsautopilot.com", + "awsautoscaling.com", + "awsbraket.com", + "awscommandlineinterface.com", + "awsedstart.com", + "awseducate.com", + "awseducate.net", + "awseducate.org", + "awsglobalaccelerator.com", + "awsloft-johannesburg.com", + "awsloft-stockholm.com", + "awssecworkshops.com", + "awsstatic.com", + "awsthinkbox.com", + "awstrack.me", + "awstrust.com", + "awwcn.buzz", + "awwcn.xyz", + "axbdoll.com.tw", + "axios.com", + "axureformac.com", + "ayabank.com", + "aylesbury.ac.uk", + "ayrcoll.ac.uk", + "ayrshire.ac.uk", + "ayshdade.info", + "ayshdee.xyz", + "ayudanintendo.com", + "azadiradio.com", + "azadliq.org", + "azathabar.com", + "azatliq.org", + "azattyk.org", + "azattyq.org", + "azatutyun.am", + "azerbaycan.tv", + "azerimix.com", + "aziani.com", + "azirevpn.com", + "aznude.com", + "azubu.tv", + "azure-devices-int.net", + "azure-devices.net", + "azure-dns.com", + "azure-dns.info", + "azure-dns.net", + "azure-dns.org", + "azure-mobile.net", + "azure-sphere.com", + "azure-test.net", + "azure.com", + "azure.net", + "azurecomcdn.net", + "azurecomm.net", + "azurecontainer.io", + "azurecosmos.net", + "azurecosmosdb.com", + "azurecosmosdb.info", + "azurecosmosdb.net", + "azurecr.io", + "azuredatabricks.net", + "azuredevopslaunch.com", + "azuredigitaltwin.com", + "azuredigitaltwins.com", + "azuredigitaltwins.net", + "azuredns-prd.info", + "azuredns-prd.org", + "azureedge-test.net", + "azureedge.net", + "azurefd.net", + "azureiotcentral.com", + "azureiotsolutions.com", + "azureiotsuite.com", + "azureplanetscale.info", + "azureplanetscale.net", + "azureserviceprofiler.com", + "azuresmartspaces.net", + "azurestackvalidation.com", + "azurewebsites.net", + "b-cdn.net", + "b-eroland.net", + "b-ok.africa", + "b-ok.asia", + "b-ok.cc", + "b-ok.global", + "b-ok.org", + "b0ne.com", + "b3boos.com", + "b6b33.com", + "b6fc.ac.uk", + "baa.ac.uk", + "baap.ac.uk", + "baas.ac.uk", + "baazee.com", + "babble.com", + "babecentrum.com", + "babeimpact.com", + "babeltech.ac.uk", + "babepedia.com", + "babes.com", + "babes34.com", + "babes34.pro", + "babesandbitches.net", + "babesandgirls.com", + "babesandstars.com", + "babesaround.com", + "babesbang.com", + "babesinporn.com", + "babesmachine.com", + "babesnetwork.com", + "babesofindia.com", + "babesource.com", + "babestube.com", + "babosas.com", + "babraham.ac.uk", + "babushky.club", + "baby-kingdom.com", + "baby-me-nrt.ac.uk", + "babycondom.com", + "babylonbee.com", + "babylongirls.co.uk", + "babynet.com.hk", + "babypink.to", + "babyzone.com", + "bach.ac.uk", + "backchina.com", + "backdoorlesbians.com", + "backoncourse.ac.uk", + "backpackers.com.tw", + "backroomcastingcouch.com", + "backstage.ac.uk", + "backtotiananmen.com", + "bacl.ac.uk", + "baclaw.ac.uk", + "bacoll.ac.uk", + "bacon.com", + "bacsitinhyeu.vn", + "bad.news", + "badaas.com", + "badasianpussy.com", + "badc.ac.uk", + "badgen.net", + "badiucao.com", + "badjojo.com", + "badoinkvr.com", + "badoo.com", + "badsexygirl.com", + "badteenspunished.com", + "badvirtue.com", + "baeb.com", + "baec.ac.uk", + "baes.ac.uk", + "bafa.ac.uk", + "bag-glasses1.com", + "bahamut.com.tw", + "bahcesehir.ac.uk", + "bai29.xyz", + "baicaonetwork.com", + "baice.ac.uk", + "baidu.jp", + "baijie.org", + "bailandaily.com", + "bailer.ac.uk", + "bais.ac.uk", + "baixing.me", + "baizhi.org", + "baj.ac.uk", + "bakgeekhome.tk", + "balance.ac.uk", + "ballbustingtube.com", + "balletwest.ac.uk", + "baltimorebmw.com", + "bam.ac.uk", + "bamgrid.com", + "bams.ac.uk", + "bamtoki.com", + "banan.tv", + "banana-vpn.com", + "banatfun.com", + "banbury-bicester.ac.uk", + "banbury-college.ac.uk", + "band.us", + "bandag.cc", + "bandag.com", + "bandcamp.com", + "bandgirlz.com", + "bandp.ac.uk", + "bandpage.com", + "bandpcoll.ac.uk", + "bandwagonhost.com", + "banff-buchan.ac.uk", + "bang-movies.com", + "bangbros.com", + "bangbrosnetwork.com", + "bangchen.net", + "bangdream.space", + "bangher.net", + "bangkokpost.com", + "bangkokstreetwhores.com", + "bangor-university-london.ac.uk", + "bangor.ac.uk", + "bangyoulater.com", + "bangyourwife.com", + "bankmobilevibe.com", + "banned.video", + "bannedbook.net", + "bannedbook.org", + "bannednews.org", + "banorte.com", + "baraero.com", + "baramangaonline.com", + "barefootnetworks.com", + "barelist.com", + "barenakedislam.com", + "bareporno.com", + "barfuck.com", + "barium-enema.com", + "barkadahansasmartone.com", + "barking-coll.ac.uk", + "barkingcollege.ac.uk", + "barkingdagenhamcollege.ac.uk", + "barnabu.co.uk", + "barnet.ac.uk", + "barnetsouthgate.ac.uk", + "barnfield.ac.uk", + "barnsley.ac.uk", + "barony.ac.uk", + "barricades.ac.uk", + "barrons-advisor.com", + "barrons-conferences.com", + "barrons.com", + "barrow6fc.ac.uk", + "barry.ac.uk", + "bars.ac.uk", + "barss1207.pro", + "barton-peveril.ac.uk", + "barton.ac.uk", + "barton.de", + "bartvpn.com", + "bas.ac.uk", + "baselinestudy.com", + "baselinestudy.org", + "basford-hall.ac.uk", + "basildon.ac.uk", + "basilisk-browser.org", + "basingstoke.ac.uk", + "basketry.ac.uk", + "basp.ac.uk", + "basr.ac.uk", + "bastillepost.com", + "bastropfirestone.com", + "baterias-hp.com", + "bath.ac.uk", + "bathcollege.ac.uk", + "bathnortheastsomerset-acl.ac.uk", + "bathspa.ac.uk", + "batsa.me", + "battle.net", + "battlebreakers.com", + "battlefield.com", + "battlefield1943.com", + "battlefield3.com", + "battlefield4.com", + "battlefield5.com", + "battlefieldbadcompany2.com", + "battlefieldheroes.com", + "battlefieldv.com", + "battleforcecomix.com", + "battlefront2.com", + "battlefrontii.com", + "battlelog.com", + "bavs.ac.uk", + "baxsound.com", + "bayareabmw.com", + "bayvoice.net", + "baywords.com", + "bazel.build", + "bb-chat.tv", + "bb33.net", + "bbbaihu.vip", + "bbc-anal.com", + "bbc-reporting-api.app", + "bbc.ac.uk", + "bbc.co.uk", + "bbc.com", + "bbc.in", + "bbc.net.uk", + "bbcchinese.com", + "bbchat.tv", + "bbci.co.uk", + "bbcmedia.co.uk", + "bbcpersian.com", + "bbcpornonly.com", + "bbcslln.ac.uk", + "bbcverticals.com", + "bbe.ac.uk", + "bbestmall.com", + "bbg.gov", + "bbgevent.com", + "bbgwatch.com", + "bbhub.io", + "bbk.ac.uk", + "bbkz.com", + "bbnradio.org", + "bbqm1.xyz", + "bbs-cove.ac.uk", + "bbs-tw.com", + "bbsdigest.com", + "bbsfeed.com", + "bbsland.com", + "bbsmo.com", + "bbsone.com", + "bbsrc.ac.uk", + "bbthat.com", + "bbtoystore.com", + "bbw-yoyo.buzz", + "bbwmilftube.com", + "bbwyoyo.info", + "bby.com", + "bbycastatic.ca", + "bbycloud.com", + "bbycontent.com", + "bbycontent.net", + "bbyintl.com", + "bbystatic.com", + "bbyurl.us", + "bca.ac.uk", + "bcam.ac.uk", + "bcast.ac.uk", + "bcast.co.nz", + "bcbits.com", + "bcc.ac.uk", + "bcc.com.tw", + "bcchinese.net", + "bccolleges.ac.uk", + "bcex.ca", + "bcftcs.ac.uk", + "bcicdn.com", + "bcmorning.com", + "bcno.ac.uk", + "bcom.ac.uk", + "bcomstudents.ac.uk", + "bcot.ac.uk", + "bcove.video", + "bcovlive.io", + "bcrncdn.com", + "bctcs.ac.uk", + "bcu.ac.uk", + "bcuc.ac.uk", + "bcvp0rtal.com", + "bcy01.com", + "bdc.ac.uk", + "bdn.dev", + "bdsm-mov.net", + "bdsm.com", + "bdsm123.xyz", + "bdsmboard.org", + "bdsmbunker.com", + "bdsmcafe.com", + "bdsmhd.cc", + "bdsmland.org", + "bdsmlibrary.com", + "bdsmlr.com", + "bdsmpornonly.com", + "bdsmsexgame.com", + "bdsmstreak.com", + "bdsmtubexxx.com", + "bdsmtv.cc", + "bdsmvideos.net", + "beaa.ac.uk", + "beaconevents.com", + "beanfun.com", + "beascoremodel.com", + "beastiegals.com", + "beastysexlinks.com", + "beastythumbs.com", + "beatbd.com", + "beatbydre2013.com", + "beatbydreheadphonesonsale.com", + "beatbydrekopen.com", + "beatbydremonster.com", + "beatbydreuk2014.com", + "beatdrdres.com", + "beatfactoryoutlets.com", + "beatmonstersaustralia.net", + "beats-by-dre-australia.com", + "beats-bydrdre.net", + "beats-bydre-mall.com", + "beats-bydrecheapsale.com", + "beats-bydreoutletonline.com", + "beats-bydreoutletsale.com", + "beats-bydreoutletsale.net", + "beats-bydreoutletssale.net", + "beats-bydrestore.com", + "beats-bydreuk.com", + "beats-deal.com", + "beats-dre-us.com", + "beats-headphones-buy-cheap.com", + "beats-headphones.us", + "beats-sale.com", + "beats-seller.com", + "beats-soaho.com", + "beats1.cc", + "beats1.tv", + "beats123.com", + "beats4.net", + "beats4outlets.com", + "beats4salecheap.com", + "beatsallsale.com", + "beatsaudifonos.com", + "beatsaudiobydre.com", + "beatsaudiobydre.net", + "beatsaudios.net", + "beatsbeatsmonster.com", + "beatsbestdeals.com", + "beatsblackfridaydeals.net", + "beatsblackfridayretails.com", + "beatsboxingdayuksale.com", + "beatsbydrdre-headphones.com", + "beatsbydrdre-officials5.com", + "beatsbydrdre-online.com", + "beatsbydrdre-onsale.com", + "beatsbydrdre-store.com", + "beatsbydrdre-store.us", + "beatsbydrdre4sale.com", + "beatsbydrdrebiz.com", + "beatsbydrdrecustom.com", + "beatsbydrdredanmark.com", + "beatsbydrdremall.com", + "beatsbydrdreoutlet.com", + "beatsbydrdres.com", + "beatsbydrdresale.net", + "beatsbydrdrestore.com", + "beatsbydrdreus.com", + "beatsbydre-beatsheadphone.com", + "beatsbydre-chen.com", + "beatsbydre-club.com", + "beatsbydre-headphones.com", + "beatsbydre-headphonesshop.com", + "beatsbydre-mall.com", + "beatsbydre-outlet.com", + "beatsbydre-outletsale.net", + "beatsbydre-outletstore.com", + "beatsbydre-sell.com", + "beatsbydre-store.com", + "beatsbydre-studio.com", + "beatsbydre-us.com", + "beatsbydre.jp", + "beatsbydre2081.com", + "beatsbydre411.com", + "beatsbydre4usales.com", + "beatsbydreauofficial.com", + "beatsbydreausale.net", + "beatsbydreaustralia-sale.com", + "beatsbydreaustraliaonline.com", + "beatsbydreaustraliaonlines.com", + "beatsbydreaustraliasales.com", + "beatsbydrebeatsby.com", + "beatsbydreblackfriday2013.com", + "beatsbydreblackfridaypro.com", + "beatsbydreboxingdayca.com", + "beatsbydrecasquesfr.com", + "beatsbydrecheap-outletstore.com", + "beatsbydrecheaper.com", + "beatsbydrecheaponlinesales.com", + "beatsbydrecolors.com", + "beatsbydrecustomwireless.com", + "beatsbydrecybermondaydeals2013.com", + "beatsbydrecybermondaydeals2013.net", + "beatsbydredanmarks.com", + "beatsbydredealsblackfriday.com", + "beatsbydredealscybermonday.com", + "beatsbydrediscount.com", + "beatsbydrediscountonline.net", + "beatsbydredr.com", + "beatsbydreexecutivesale.com", + "beatsbydreformall2013-nl.com", + "beatsbydreforsalesonline.com", + "beatsbydreforshop2013-nl.com", + "beatsbydreforstore.com", + "beatsbydreforyououtlet.com", + "beatsbydrefr.com", + "beatsbydrefrcasquepascher.com", + "beatsbydrefriday.com", + "beatsbydregot.com", + "beatsbydrehd.com", + "beatsbydrehd.net", + "beatsbydreheadphones-nz.com", + "beatsbydreheadphonesolo.com", + "beatsbydrehut.com", + "beatsbydreinexpensive.com", + "beatsbydreireland-sales.com", + "beatsbydreirelandonlines.com", + "beatsbydreirelandsale.com", + "beatsbydreirelandsonline.com", + "beatsbydremall2013.com", + "beatsbydremonsteraustralia.com", + "beatsbydrenls.com", + "beatsbydrenorge1.net", + "beatsbydreofficialdanmark.com", + "beatsbydreoksale.com", + "beatsbydreol.com", + "beatsbydreonlie2013-nl.com", + "beatsbydreonlines-ireland.com", + "beatsbydreonlines-uk.com", + "beatsbydreonlinesale-nz.com", + "beatsbydreoordopjes.com", + "beatsbydreoslo.com", + "beatsbydreoutletsale.com", + "beatsbydreoutletscheap.com", + "beatsbydrerealstore.com", + "beatsbydres-shop.com", + "beatsbydresale-uk.com", + "beatsbydresalemall2013.com", + "beatsbydresaleonlines-nz.com", + "beatsbydresales.us", + "beatsbydresalesonline-australia.com", + "beatsbydresdanmark.net", + "beatsbydreshop-uk.com", + "beatsbydreshops.net", + "beatsbydresingapores.com", + "beatsbydresingaporesale.com", + "beatsbydresold.com", + "beatsbydresolohdonline-canada.com", + "beatsbydresonline-nz.com", + "beatsbydrespeakers.com", + "beatsbydressale.com", + "beatsbydressolo.com", + "beatsbydresstudio.com", + "beatsbydrestorevip.com", + "beatsbydrestudio-australia.com", + "beatsbydrestudio.com", + "beatsbydretoutlet.com", + "beatsbydreuk.com", + "beatsbydreuk.net", + "beatsbydreus.com", + "beatsbydrevipde.com", + "beatsbydrew.com", + "beatsbydrsmonsterinusa.com", + "beatsbymusic.net", + "beatsbysdrbre.com", + "beatsbysdrdres.com", + "beatscasque-france.com", + "beatscheap-nz.com", + "beatscheap-uk.com", + "beatscheapforsale.com", + "beatscollection2014.com", + "beatscustomblackfriday.com", + "beatsdanmark2013.com", + "beatsdrdre-headphones.com", + "beatsdrdre-it.com", + "beatsdrdre-solo.com", + "beatsdrdre2014.com", + "beatsdrdrecuffie.net", + "beatsdrdrekaufenschweiz.net", + "beatsdrdreneon.com", + "beatsdre-monster.com", + "beatsdre.net", + "beatsdre4cheap.com", + "beatsdrecheap.com", + "beatsdredreheadphones.com", + "beatsdreforsale.com", + "beatsdreinau.com", + "beatsdremonster-uk.com", + "beatsdrenewcolorful4usale.com", + "beatsdreoutletsale.com", + "beatsdresale2013.com", + "beatsdresalestore.com", + "beatsdresolo2013.com", + "beatsdreus.com", + "beatsearbudsheadphoness.com", + "beatselectronic.net", + "beatselectronics.com", + "beatsep.com", + "beatsep.net", + "beatsfacstore.com", + "beatsfactoroutlets.com", + "beatsfactorycollection.com", + "beatsfactoryoutles.com", + "beatsforcheap-usa.com", + "beatsforme.com", + "beatsfranceofficiel.com", + "beatsheadphones-discount.com", + "beatsheadphones1.com", + "beatsheadphones2u.com", + "beatsheadphonesale.com", + "beatsheadphonesdealer.com", + "beatsheadphonesforcheap.net", + "beatsheadphonesonline.com", + "beatsheadphoness.com", + "beatsheadphonestudio.com", + "beatsheadphonesusamall.com", + "beatshopuk.com", + "beatsincanada.com", + "beatsinsingapore.com", + "beatsireland.net", + "beatsjoy.com", + "beatsmonstersales.com", + "beatsmusic.com", + "beatsmusic.wang", + "beatsneon.com", + "beatsnzsale.com", + "beatsodre.com", + "beatsofdre-usa.com", + "beatsonblackfriday2013.com", + "beatsone.net", + "beatsoutlet.net", + "beatsoutletanytime.com", + "beatsoutletonlines.com", + "beatspascher-bydre.com", + "beatspascher-fr.net", + "beatspascher.net", + "beatspaschers.net", + "beatspillnewcolor.com", + "beatspills.com", + "beatspromonsterjp.com", + "beatspromotions.com", + "beatssales.com", + "beatssaleus.com", + "beatssaustraliabuy.com", + "beatssbyaustralia.com", + "beatssbydredanmark.com", + "beatsshop-uk.com", + "beatsshop-usa.com", + "beatsshopstore.com", + "beatssingapores.com", + "beatssingaporeshop.com", + "beatsstudiohodetelefoner.com", + "beatsstudiosite.com", + "beatstoreusa.com", + "beatsua.com", + "beatswholesale.us", + "beatswirelesscheap.com", + "beatswirelesscuffie.com", + "beatthatquote.com", + "beaumontcollege.ac.uk", + "beautifulandbusty.com", + "beautyandthebeastmusical.co.uk", + "beautyescortsamsterdam.com", + "bebepremium3.com.bo", + "bebirkbeck.ac.uk", + "bebo.com", + "beck.de", + "becomeindex.com", + "becoming-a-teacher.ac.uk", + "beddit.tv", + "bede.ac.uk", + "bedford.ac.uk", + "bedfordshire.ac.uk", + "bedfordsixthform.ac.uk", + "beds.ac.uk", + "bedsacl.ac.uk", + "bedstegratisporno.com", + "beeg.com", + "beeg.rest", + "beegfree.com", + "beejp.net", + "beep.ac.uk", + "bees.ac.uk", + "beevpn.com", + "befuck.com", + "befuck.net", + "begellhouse.com", + "begin-trade.com", + "behance.net", + "behaviour4learning.ac.uk", + "behavioural-science.ac.uk", + "behindkink.com", + "behindthescreenz.com", + "bei.ac.uk", + "beibao.com", + "beijing1989.com", + "beijing2022.art", + "beijingnike.com", + "beijingspring.com", + "beijingzx.org", + "beinghumanfestival.ac.uk", + "beinspiredatstaffs.ac.uk", + "beirc.ac.uk", + "beiyongzhan1.com", + "bejav.net", + "bejeweledstars.com", + "bejewled-stars.com", + "bekijkporno.nl", + "belamionline.com", + "belfastinstitute.ac.uk", + "belfastmet.ac.uk", + "belfastmetropolitan.ac.uk", + "belfastmetropolitancollege.ac.uk", + "belfordcollege.ac.uk", + "bell.ac.uk", + "bell.wiki", + "bellebound.com", + "bellerbys.ac.uk", + "bellesa.co", + "bellotube.com", + "bellsouth.net", + "belwue.net", + "bemix.ac.uk", + "bemywife.cc", + "benaughty.fun", + "benc.ac.uk", + "bengalisexvideos.com", + "benliton.com", + "bentobox.tv", + "bep.ac.uk", + "bera.ac.uk", + "beric.me", + "berkanawireless.com", + "berkeley.edu", + "berks-coll-ag.ac.uk", + "berkscollag.ac.uk", + "berlincompanions.com", + "berlinerbericht.de", + "berlintwitterwall.com", + "berm.co.nz", + "bern.ac.uk", + "bernards.ac.uk", + "besa.ac.uk", + "besc.ac.uk", + "beside.ac.uk", + "bess.ac.uk", + "best-practice.se", + "best-sex-games.com", + "best.ac.uk", + "best4bim.com", + "bestbeats4u.com", + "bestbhy.com", + "bestbim.com", + "bestbuy-audio.com", + "bestbuy-communityrelations.com", + "bestbuy-giftcard.info", + "bestbuy-int.com", + "bestbuy-jobs.com", + "bestbuy.ca", + "bestbuy.com", + "bestbuy.com.mx", + "bestbuy.info", + "bestbuy24x7solutions.com", + "bestbuybusiness.com", + "bestbuybusinessadvantageaccount.com", + "bestbuycanada.ca", + "bestbuycanada.com", + "bestbuycanadaltd.ca", + "bestbuycharityclassic.com", + "bestbuycoffeemakers.com", + "bestbuyethics.com", + "bestbuyforbusiness.ca", + "bestbuygsm.com", + "bestbuyideax.com", + "bestbuyphotoworkshoptours.com", + "bestbuyrewards.com", + "bestbuyrewardzone.ca", + "bestbuys.com", + "bestbuysgeeksquad.com", + "bestbuysolutions.net", + "bestbuystores.com", + "bestbuytradein.com", + "bestbuyus.com", + "bestcamsites.net", + "besterpornos.com", + "bestescortgirls.nl", + "bestforchina.org", + "bestfreecams.club", + "bestfreesexgames.com", + "bestfreetube.net", + "bestfreetube.xxx", + "bestgames-2022.com", + "bestgore.com", + "besthandjobporn.com", + "besthentaitube.com", + "bestiality.guru", + "bestialitysextaboo.com", + "bestialitytaboo.tv", + "bestialityvideo.us", + "bestiphonestuff.com", + "bestjapanesepornsites.com", + "bestjavporn.com", + "bestjavporn.net", + "bestkinky.com", + "bestlistofporn.com", + "bestmallawards.com", + "bestofu.ac.uk", + "bestporn.su", + "bestpornclip.com", + "bestporncomix.com", + "bestporngames.com", + "bestpornsites.eu", + "bestpornsites.guide", + "bestpornstardb.com", + "bestporntube.me", + "bestpremiumpornsite.com", + "bestrecipes.com.au", + "bestsexcam.com", + "bestshoesale2014.net", + "besttitstube.com", + "bestvpn.com", + "bestvpnanalysis.com", + "bestvpnserver.com", + "bestvpnservice.com", + "bestvpnusa.com", + "bestxxxsites.com", + "besuty99.com", + "besztbuy.com", + "bet365.com", + "betfair.com", + "beth.games", + "bethesda.net", + "bethesdagamestudios.com", + "bethsoft.com", + "betterbim.com", + "betterexplained.com", + "betterhdporn.com", + "betternet.co", + "betternike.com", + "bettertogether.ac.uk", + "bettervpn.com", + "betterwithautodesk.com", + "bettween.com", + "betvictor.com", + "between-legs.com", + "beurettesvideo.com", + "beverleycollege.ac.uk", + "bewww.net", + "bexhillcollege.ac.uk", + "bexley.ac.uk", + "bexleycollege.ac.uk", + "bextbuy.com", + "beyondcore.com", + "beyondfirewall.com", + "beyondtext.ac.uk", + "bffshd.com", + "bfmat.ac.uk", + "bfnn.org", + "bfsh.hk", + "bftv.ac.uk", + "bgc.ac.uk", + "bgme.me", + "bgov.com", + "bgr.in", + "bgs.ac.uk", + "bgu.ac.uk", + "bgvpn.com", + "bham.ac.uk", + "bhamcity.ac.uk", + "bhamcityuniversity.ac.uk", + "bhasvic.ac.uk", + "bhent.co.kr", + "bhggn.xyz", + "bhpgms.ac.uk", + "bhpms.ac.uk", + "bhrc.ac.uk", + "bhzyk.buzz", + "bhzyw2.top", + "biaa.ac.uk", + "biab.ac.uk", + "bianlei.com", + "biantailajiao.com", + "biantailajiao.in", + "biaoqs.xyz", + "biaoqs1.xyz", + "biaoqs2.xyz", + "biblesforamerica.org", + "bibliography.ac.uk", + "bibox.com", + "bic2011.org", + "bicc.ac.uk", + "bicpa.ac.uk", + "bicton.ac.uk", + "bidbay.com", + "bidi.net.uk", + "bidong25.com", + "bidong9.com", + "bidorbuyindia.com", + "bids.ac.uk", + "bidswitch.net", + "bidvestbank.co.za", + "biea.ac.uk", + "biedian.me", + "bienvenuechezbestbuy.ca", + "big.one", + "bigassporn.tv", + "bigbeans.solutions", + "bigbigchannel.com.hk", + "bigbigshop.com", + "bigblackdicklover.com", + "bigboobbundle.com", + "bigboobsalert.com", + "bigboobsandhotsex.com", + "bigboobsonline.org", + "bigboobspov.com", + "bigboobswives.com", + "bigboss.video", + "bigbuckbunny.org", + "bigcharts.com", + "bigcocker.com", + "bigdata-cdt.ac.uk", + "bigdata.ac.uk", + "bigdick.com", + "bigdickorgasm.com", + "bigf.ac.uk", + "bigfools.com", + "biggggg.com", + "biggo.com.tw", + "bighead.group", + "bighealthactuarialdata.ac.uk", + "bigidea.ac.uk", + "bigindiansex.mobi", + "bigjapanesesex.com", + "bigmoney.biz", + "bignews.org", + "bigone.com", + "bigporn.com", + "bigsex.tv", + "bigsound.org", + "bigtitangelawhite.com", + "bigtithitomi.com", + "bigtithooker.com", + "bigtitsextapes.com", + "bigtitsgallery.net", + "bigtitsmodelsdirectory.com", + "bigtitsthreesomes.com", + "bigtitterrynova.com", + "bigtitvenera.com", + "bigtopsites.com", + "biguz.net", + "bihg.ac.uk", + "biitii.com", + "bijukujo.club", + "bikaa.xyz", + "bikac.xyz", + "bikaios.xyz", + "bil.ac.uk", + "bilborough.ac.uk", + "bild.de", + "bileta.ac.uk", + "bili2.cc", + "bili888.com", + "bili999.com", + "bilibili.tv", + "biliplus.com", + "biliworld.com", + "bilk.ac.uk", + "bill-safe.com", + "billmelater.com", + "billmelater.info", + "billmelater.net", + "billpoint.com", + "billpoint.info", + "billpoint.tv", + "billpoint.us", + "billpointnewzealand.com", + "billypan.com", + "bilston.ac.uk", + "bim-360.com", + "bim360.com", + "bim360.net", + "bim360field.com", + "bim360glue.com", + "bim360ops.com", + "bim3dcontent.com", + "bimacademy.ac.uk", + "bimadsk.com", + "bimbim.com", + "bimbolive.com", + "bimglue.com", + "bimlibrary.com", + "bimm.ac.uk", + "bimmstudents.ac.uk", + "bimseeker.com", + "bimsource.com", + "bimworld.com", + "binads.com", + "binance.cc", + "binance.cloud", + "binance.co", + "binance.com", + "binance.info", + "binance.me", + "binance.net", + "binance.org", + "binance.us", + "binance.vision", + "binanceapi.com", + "binancecnt.com", + "binancezh.be", + "binancezh.biz", + "binancezh.cc", + "binancezh.co", + "binancezh.com", + "binancezh.info", + "binancezh.ink", + "binancezh.kim", + "binancezh.link", + "binancezh.live", + "binancezh.mobi", + "binancezh.net", + "binancezh.pro", + "binancezh.sh", + "binancezh.top", + "bing.com", + "bing.net", + "bing123.com", + "bingads.com", + "bingagencyawards.com", + "bingapis.com", + "bingapistatistics.com", + "bingparachute.com", + "bingsandbox.com", + "bingvisualsearch.com", + "bingworld.com", + "binoculus.com", + "bintray.com", + "binux.me", + "binwang.me", + "biobank.ac.uk", + "biobankingsolutions.ac.uk", + "biobankuk.ac.uk", + "biochar.ac.uk", + "bioethics.ac.uk", + "bioethicsweb.ac.uk", + "biofilms.ac.uk", + "bioinf.ac.uk", + "bioinfo.ac.uk", + "bioinformatics.ac.uk", + "biologists.com", + "biome.ac.uk", + "biomedcentral.com", + "bioone.org", + "bioporno.com", + "bioresearch.ac.uk", + "biorxiv.org", + "bioss.ac.uk", + "bioville.ac.uk", + "bioware.com", + "biowarestore.com", + "bioyork.ac.uk", + "bipic.net", + "bips.ac.uk", + "biqle.org", + "biqle.ru", + "birbeckstratford.ac.uk", + "bird.so", + "birkbeck.ac.uk", + "birkbeckstratford.ac.uk", + "birmingham-nottingham.ac.uk", + "birmingham.ac.uk", + "birminghamcity.ac.uk", + "birminghamcityuniversity.ac.uk", + "birminghamschoolofacting.ac.uk", + "bisa.ac.uk", + "bishopaucklandcollege.ac.uk", + "bishopb-college.ac.uk", + "bishopburton.ac.uk", + "bishopburtoncollege.ac.uk", + "bishopg.ac.uk", + "bisi.ac.uk", + "bisq.io", + "bisq.network", + "bit-z.com", + "bit.do", + "bit.ly", + "bitballoon.com", + "bitbank.cc", + "bitbay.net", + "bitbucket.io", + "bitbucket.org", + "bitchesgirls.com", + "bitchmomporn.com", + "bitchute.com", + "bitcoin.org", + "bitcointalk.org", + "bitcoinworld.com", + "bite.ac.uk", + "bitfinex.com", + "bitflyer.com", + "bitflyer.jp", + "bitget.com", + "bithumb.com", + "bitinka.com.ar", + "bitly.com", + "bitly.is", + "bitmex.com", + "bitnami.com", + "bitnamiapp.com", + "bitnamistudio.com", + "bitporno.com", + "bitquick.co", + "bitshare.com", + "bitsnoop.com", + "bitsquare.io", + "bitstamp.net", + "bitstream.com", + "bitterwinter.org", + "bittrex.com", + "bitvise.com", + "bitwarden.com", + "bitwarden.eu", + "bitwarden.net", + "bitz.ai", + "bitz.com", + "bizarresexuality.com", + "bizhat.com", + "bizographics.com", + "bjini.cc", + "bjnewlife.org", + "bjs.org", + "bjzc.org", + "bkkdown.site", + "bl-doujinsouko.com", + "black-country.ac.uk", + "blackamateurfuck.com", + "blackamateursvideos.com", + "blackandasiangrad.ac.uk", + "blackandstacked.com", + "blackboxgames.com", + "blackburn.ac.uk", + "blackcountryandmarchesiot.ac.uk", + "blacked.com", + "blackfridaydrebeatsnew.com", + "blackfridaydrebeatsshop.com", + "blackhomeporn.com", + "blacklogic.com", + "blackmonsterterror.com", + "blackpool-acl.ac.uk", + "blackpool.ac.uk", + "blackpoolsixth.ac.uk", + "blackshemalevideo.com", + "blacksonblondes.com", + "blackstonespoliceservice.com", + "blacktowhite.net", + "blackvpn.com", + "blake.ac.uk", + "blaoshi.cc", + "blazor.net", + "blc.ac.uk", + "ble.ac.uk", + "blend-ed.ac.uk", + "blender.org", + "blewpass.com", + "blingblingsquad.net", + "blink.org", + "blinkload.zone", + "blinkx.com", + "blinw.com", + "blip.tv", + "blizzak-juken.jp", + "blizzard.com", + "blizzardgearstore.com", + "blms.ac.uk", + "blockcast.it", + "blockcn.com", + "blockedbyhk.com", + "blockfrost.io", + "blockless.com", + "blocktempo.com", + "blog.de", + "blog.google", + "blog.jp", + "blogblog.com", + "blogcatalog.com", + "blogcity.me", + "blogdns.org", + "blogebay.com", + "blogger.com", + "bloggrowup.com", + "blogimg.jp", + "blogism.jp", + "bloglines.com", + "bloglovin.com", + "blogo.jp", + "blogoverflow.com", + "blogs.com", + "blogspot.ae", + "blogspot.al", + "blogspot.am", + "blogspot.ba", + "blogspot.be", + "blogspot.bg", + "blogspot.bj", + "blogspot.ca", + "blogspot.cat", + "blogspot.cf", + "blogspot.ch", + "blogspot.cl", + "blogspot.co.at", + "blogspot.co.id", + "blogspot.co.il", + "blogspot.co.ke", + "blogspot.co.nz", + "blogspot.co.uk", + "blogspot.co.za", + "blogspot.com", + "blogspot.com.ar", + "blogspot.com.au", + "blogspot.com.br", + "blogspot.com.by", + "blogspot.com.co", + "blogspot.com.cy", + "blogspot.com.ee", + "blogspot.com.eg", + "blogspot.com.es", + "blogspot.com.mt", + "blogspot.com.ng", + "blogspot.com.tr", + "blogspot.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", + "blogtd.net", + "blogtd.org", + "blogterest.net", + "bloodshed.net", + "bloomberg.cn", + "bloomberg.co.jp", + "bloomberg.co.kr", + "bloomberg.com", + "bloomberg.com.br", + "bloomberg.de", + "bloomberg.fm", + "bloomberg.tv", + "bloombergapps.com", + "bloombergarcade.com", + "bloombergbeta.com", + "bloombergbna.com", + "bloombergbreakaway.com", + "bloombergbriefs.com", + "bloombergchina.com", + "bloombergenvironment.com", + "bloombergforeducation.com", + "bloomberggovernment.com", + "bloombergindices.com", + "bloombergindustry.com", + "bloomberglabs.com", + "bloomberglaw.com", + "bloomberglive.com", + "bloomberglp.com", + "bloombergmedia.com", + "bloombergnext.com", + "bloombergpolarlake.com", + "bloombergprep.com", + "bloombergquint.com", + "bloombergradio.com", + "bloombergsef.com", + "bloombergspace.com", + "bloombergstatus.com", + "bloombergsurvey.com", + "bloombergtax.com", + "bloombergtax1.com", + "bloombergtaxtech.com", + "bloombergtradingchallenge.com", + "bloombergtv.mn", + "bloombergvault.com", + "bloombergview.com", + "bloomfortune.com", + "bloommicroventures.com", + "bloomsbury.ac.uk", + "bloomsburycollections.com", + "bloomsburydesignlibrary.com", + "bloomsburydtc.ac.uk", + "bloomsburyinstitute.ac.uk", + "blowjobit.com", + "blowjobqueens.net", + "blpcareers.com", + "blpevents.com", + "blpprofessional.com", + "blubrry.com", + "blueangellive.com", + "bluearchive.jp", + "bluefootcms.com", + "bluegreencities.ac.uk", + "bluehatil.com", + "bluehatnights.com", + "bluekai.com", + "bluemix.com", + "bluemix.net", + "bluestacks.com", + "bluestone.ac.uk", + "bluffyporn.com", + "blurams.com", + "blws.ac.uk", + "blylq.buzz", + "blz-contentstack.com", + "bm14.ac.uk", + "bmac.ac.uk", + "bmc.ac.uk", + "bme.ac.uk", + "bmet.ac.uk", + "bmetc.ac.uk", + "bmfinn.com", + "bmia.org", + "bmj.com", + "bml.info", + "bms.ac.uk", + "bmth-poole-cad.ac.uk", + "bmth.ac.uk", + "bmva.ac.uk", + "bmw-abudhabi.com", + "bmw-adventskalender.com", + "bmw-albania.com", + "bmw-antilles.fr", + "bmw-art-journey.com", + "bmw-arts-design.com", + "bmw-asia.com", + "bmw-auslieferungszentrum.com", + "bmw-authority-vehicles.com", + "bmw-bahrain.com", + "bmw-businessdrive.com", + "bmw-calgary.ca", + "bmw-carit.de", + "bmw-classic.com", + "bmw-clubs-international.com", + "bmw-connected-drive.com", + "bmw-connecteddrive.ae", + "bmw-connecteddrive.at", + "bmw-connecteddrive.be", + "bmw-connecteddrive.bg", + "bmw-connecteddrive.ca", + "bmw-connecteddrive.ch", + "bmw-connecteddrive.co.nz", + "bmw-connecteddrive.co.uk", + "bmw-connecteddrive.co.za", + "bmw-connecteddrive.com", + "bmw-connecteddrive.com.au", + "bmw-connecteddrive.com.br", + "bmw-connecteddrive.com.cy", + "bmw-connecteddrive.com.hr", + "bmw-connecteddrive.com.kw", + "bmw-connecteddrive.com.mt", + "bmw-connecteddrive.cz", + "bmw-connecteddrive.de", + "bmw-connecteddrive.dk", + "bmw-connecteddrive.ee", + "bmw-connecteddrive.es", + "bmw-connecteddrive.fi", + "bmw-connecteddrive.fr", + "bmw-connecteddrive.gr", + "bmw-connecteddrive.hu", + "bmw-connecteddrive.ie", + "bmw-connecteddrive.it", + "bmw-connecteddrive.jp", + "bmw-connecteddrive.kr", + "bmw-connecteddrive.lt", + "bmw-connecteddrive.lu", + "bmw-connecteddrive.lv", + "bmw-connecteddrive.mx", + "bmw-connecteddrive.my", + "bmw-connecteddrive.nl", + "bmw-connecteddrive.no", + "bmw-connecteddrive.pl", + "bmw-connecteddrive.pt", + "bmw-connecteddrive.ro", + "bmw-connecteddrive.ru", + "bmw-connecteddrive.se", + "bmw-connecteddrive.sg", + "bmw-connecteddrive.si", + "bmw-connecteddrive.sk", + "bmw-connecteddrive.tw", + "bmw-corporate-sales.com", + "bmw-diplomatic-sales.com", + "bmw-driving-center.co.kr", + "bmw-drivingexperience.com", + "bmw-dubai.com", + "bmw-eg.com", + "bmw-fleet.net", + "bmw-ghana.com", + "bmw-golfsport.com", + "bmw-group.com", + "bmw-group.net", + "bmw-grouparchiv.de", + "bmw-grouparchives.com", + "bmw-gta.ca", + "bmw-i-pure-impulse.com", + "bmw-i.jp", + "bmw-int1.com", + "bmw-iraq.com", + "bmw-jordan.com", + "bmw-konzernarchiv.de", + "bmw-ksa.com", + "bmw-kuwait.com", + "bmw-lao.la", + "bmw-lebanon.com", + "bmw-m-safetycar.com", + "bmw-m.com", + "bmw-mdrivetour.com", + "bmw-me.com", + "bmw-military-sales.com", + "bmw-motorcycle.com", + "bmw-motorcycles.vn", + "bmw-motorrad-abudhabi.com", + "bmw-motorrad-authorities.com", + "bmw-motorrad-dubai.com", + "bmw-motorrad-motorsport.com", + "bmw-motorrad-now-or-never.com", + "bmw-motorrad-service-inclusive.com", + "bmw-motorrad-test-ride.com", + "bmw-motorrad.at", + "bmw-motorrad.be", + "bmw-motorrad.bg", + "bmw-motorrad.bh", + "bmw-motorrad.bo", + "bmw-motorrad.ca", + "bmw-motorrad.ch", + "bmw-motorrad.cl", + "bmw-motorrad.co", + "bmw-motorrad.co.id", + "bmw-motorrad.co.kr", + "bmw-motorrad.co.nz", + "bmw-motorrad.co.th", + "bmw-motorrad.co.uk", + "bmw-motorrad.co.za", + "bmw-motorrad.com", + "bmw-motorrad.com.ar", + "bmw-motorrad.com.au", + "bmw-motorrad.com.br", + "bmw-motorrad.com.do", + "bmw-motorrad.com.hr", + "bmw-motorrad.com.mx", + "bmw-motorrad.com.my", + "bmw-motorrad.com.pe", + "bmw-motorrad.com.py", + "bmw-motorrad.com.tr", + "bmw-motorrad.cr", + "bmw-motorrad.cz", + "bmw-motorrad.de", + "bmw-motorrad.dk", + "bmw-motorrad.dz", + "bmw-motorrad.ec", + "bmw-motorrad.ee", + "bmw-motorrad.es", + "bmw-motorrad.fi", + "bmw-motorrad.fr", + "bmw-motorrad.gr", + "bmw-motorrad.gt", + "bmw-motorrad.hu", + "bmw-motorrad.in", + "bmw-motorrad.it", + "bmw-motorrad.jp", + "bmw-motorrad.lu", + "bmw-motorrad.ma", + "bmw-motorrad.nl", + "bmw-motorrad.no", + "bmw-motorrad.pa", + "bmw-motorrad.pl", + "bmw-motorrad.pt", + "bmw-motorrad.ro", + "bmw-motorrad.rs", + "bmw-motorrad.ru", + "bmw-motorrad.sa", + "bmw-motorrad.se", + "bmw-motorrad.si", + "bmw-motorrad.sk", + "bmw-motorrad.sv", + "bmw-motorrad.tw", + "bmw-motorrad.ua", + "bmw-motorrad.uy", + "bmw-motorsport.com", + "bmw-mountains.com", + "bmw-museum.com", + "bmw-museum.net", + "bmw-nigeria.com", + "bmw-oman.com", + "bmw-ottawa.ca", + "bmw-pakistan.com", + "bmw-plant-munich.com", + "bmw-pma.com.sg", + "bmw-powertrain.com", + "bmw-product-highlights.com", + "bmw-qatar.com", + "bmw-routes.com", + "bmw-rp.com", + "bmw-rrdays.com", + "bmw-saudiarabia.com", + "bmw-security-vehicles.com", + "bmw-special-sales.com", + "bmw-sports.com", + "bmw-sudan.com", + "bmw-tahiti.com", + "bmw-tunisia.com", + "bmw-vancouver.ca", + "bmw-voli.me", + "bmw-welt.com", + "bmw-welt.net", + "bmw-welt.tv", + "bmw-werk-berlin.de", + "bmw-world.com", + "bmw-world.net", + "bmw-world.tv", + "bmw-worldfinal.com", + "bmw-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.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.de", + "bmwartjourney.com", + "bmwasia.com", + "bmwauslieferungszentrum.com", + "bmwbikes.com", + "bmwbkk.de", + "bmwccrc.ca", + "bmwcenternet.com", + "bmwchampionship.com", + "bmwchampionshipusa.com", + "bmwcharitygolf.com", + "bmwcitychallenge.com", + "bmwclassic.com", + "bmwcolorado.com", + "bmwconnecteddrive.com", + "bmwcustomapparel.com", + "bmwdcsnet.net", + "bmwdealercareers.com", + "bmwdealerdirect.com", + "bmwdelawarevalley.com", + "bmwfilms.com", + "bmwgroup-classic-heart.com", + "bmwgroup-classic.com", + "bmwgroup-gaad.com", + "bmwgroup-plants.com", + "bmwgroup-posdigital.com", + "bmwgroup-werke.com", + "bmwgroup.at", + "bmwgroup.com", + "bmwgroup.jobs", + "bmwgroup.net", + "bmwgroupclassic.com", + "bmwgroupdesignworks.com", + "bmwgroupdirect.com", + "bmwgroupfs.com", + "bmwgroupinfobahn.com", + "bmwgroupna.com", + "bmwhk.com", + "bmwi.ca", + "bmwi.jp", + "bmwiventures.com", + "bmwjamaica.com", + "bmwlat.com", + "bmwlifestyle.ca", + "bmwm.com", + "bmwmagazine.com", + "bmwmagazine.de", + "bmwmass.com", + "bmwmass.net", + "bmwmc.net", + "bmwmontreal.ca", + "bmwmotorcycles.com", + "bmwmotorcycleusa.com", + "bmwmotorrad.co.kr", + "bmwmotorrad.com.au", + "bmwmotorrad.com.ph", + "bmwmotorrad.com.sg", + "bmwmotorradhk.com", + "bmwmotorshowblog.com", + "bmwmotorsport.com", + "bmwmperformance.com", + "bmwmuseum.net", + "bmwmyanmar.com", + "bmwofannapolis.com", + "bmwofcentralpa.com", + "bmwoftulsa.com", + "bmwondemandusa.com", + "bmworegon.com", + "bmwperformancecenter.com", + "bmwpittsburgh.com", + "bmwproductnews.com", + "bmwsafari.com", + "bmwsfl.com", + "bmwsfl.net", + "bmwshop.ca", + "bmwspecialoffers.ca", + "bmwsports.com", + "bmwstartupgarage.com", + "bmwstep.com", + "bmwstepconnections.com", + "bmwsummerschool.com", + "bmwtampabay.com", + "bmwusa.com", + "bmwusaservice.com", + "bmwusatires.com", + "bmwusfactory.com", + "bmwusrideracademy.com", + "bmwvalueservice.com", + "bmwwholesaleconnect.com", + "bmwworld.com", + "bmwworld.net", + "bmwworld.tv", + "bmwzentrum.com", + "bn5x.net", + "bnac.ac.uk", + "bnbstatic.com", + "bnef.com", + "bnews.co", + "bnext.com.tw", + "bnn.co", + "bnrmetal.com", + "bntrace.com", + "bnu.ac.uk", + "boa.ac.uk", + "boardreader.com", + "bobble.ac.uk", + "boboporn.com", + "boboporn.net", + "bobovip.cc", + "bobs-tube.com", + "bobvoyeur.com", + "bocici.buzz", + "bod.asia", + "bodc.ac.uk", + "bodgirls.com", + "bodog88.com", + "bodyandsoul.com.au", + "bodyfluids-jav.com", + "bognor-training.ac.uk", + "bognor.ac.uk", + "bokep.net", + "bokepseks.org", + "bokepvidz.com", + "bolehvpn.net", + "bollywoodlife.com", + "bolt.ac.uk", + "boltdns.net", + "bolton-college.ac.uk", + "bolton-community-college.ac.uk", + "bolton-sfc.ac.uk", + "bolton.ac.uk", + "boltoncc.ac.uk", + "boltoncollege.ac.uk", + "boltoncollege365.ac.uk", + "boltoncollegestem.ac.uk", + "boltonsix.ac.uk", + "bon.ac.uk", + "bonbonme.com", + "bonbonsex.com", + "bondagecomixxx.net", + "bondagesex-xxx.com", + "bondagesm.xyz", + "bone.ac.uk", + "bonedathome.com", + "bonfoundation.org", + "bongacams.com", + "bonyu.cyou", + "boobieblog.com", + "boobpedia.com", + "boobsrealm.com", + "boobstagram.com", + "boodigo.com", + "boodigogo.com", + "book.com.tw", + "book18.org", + "book4you.org", + "bookclubcorner.com", + "bookclubgirl.com", + "bookdepository.com", + "bookepub.com", + "bookfi.net", + "bookhad.ac.uk", + "booking.com", + "bookmark.xxx", + "bookmybridgestonetyre.com", + "bookonsky.net", + "books.com.tw", + "booksc.eu", + "booksc.me", + "booksc.org", + "booksc.xyz", + "bookshome.info", + "bookshome.net", + "bookshome.world", + "booksinprint.com", + "bookstagram.com", + "booktopia.com.au", + "booloo.com", + "boomba.club", + "boomerang.com", + "boomssr.com", + "booru.org", + "booth.pm", + "bootstrapcdn.com", + "bootyliciousmag.com", + "bootysource.com", + "bopcris.ac.uk", + "boqimod.com", + "boqitube.cc", + "borderlessprepaid.com", + "bordersandborderlands.ac.uk", + "borderscollege.ac.uk", + "borgenmagazine.com", + "boringcompany.com", + "borneo.world", + "borneoasia.com", + "borneoschematic.com", + "borwap.com", + "bosco.ac.uk", + "boshancy.com", + "bosharso.net", + "boslife.biz", + "boslife.net", + "bossae.com", + "bossagency.co.uk", + "bosta.ac.uk", + "bostaa.ac.uk", + "boston.ac.uk", + "bostoncentre.ac.uk", + "boswp.com", + "bot.nu", + "botanwang.com", + "botframework.com", + "botorch.org", + "botstop.com", + "boulx.com", + "boundhub.com", + "bountyhunterporn.com", + "bourne.ac.uk", + "bournemouth.ac.uk", + "bournemouthandpoole-cfe.ac.uk", + "bournville.ac.uk", + "bowenpress.com", + "bowlroll.net", + "bowsersinsidestory.com", + "box.com", + "box.net", + "box57.one", + "boxofficemojo.com", + "boxpn.com", + "boxun.com", + "boxun.tv", + "boxunblog.com", + "boxunclub.com", + "boy18tube.com", + "boyangu.com", + "boycall.com", + "boyfriendtv.com", + "boylabs.net", + "boylove.cc", + "boylove.com", + "boylove.live", + "boylove1.cc", + "boyloves.cc", + "boypost.com", + "boysfood.com", + "boysmaster.com", + "boyspornpics.com", + "boyvid.com", + "boyztube.com", + "bpa.ac.uk", + "bpc.ac.uk", + "bpcoll.ac.uk", + "bpmf.ac.uk", + "bppuniversity.ac.uk", + "bps.ac.uk", + "br.st", + "bracknell.ac.uk", + "brad.ac.uk", + "bradcoll.ac.uk", + "bradford.ac.uk", + "bradfordcollege.ac.uk", + "bradforduni-recruitment.ac.uk", + "braeburncapital.com", + "brain.ac.uk", + "brainsimagebank.ac.uk", + "braintree.ac.uk", + "braintreegateway.com", + "braintreegateway.tv", + "braintreepayments.com", + "braintreepayments.info", + "braintreepayments.org", + "braintreepayments.tv", + "braintreepaymentsolutions.com", + "braintreeps.com", + "brainyquote.com", + "brais.ac.uk", + "brams.ac.uk", + "branchportal.com", + "brand-protection-team.com", + "brandeasygo.com", + "brandelectronic.com", + "brandonhutchinson.com", + "brandporno.com", + "brandproducts1688.com", + "brands098.com", + "brasilincesto.com", + "brasiltudoliberado.com", + "brasshouse.ac.uk", + "braumeister.org", + "brave.com", + "braventures.com", + "braveux.com", + "bravoerotica.com", + "bravoporn.com", + "bravoteens.com", + "bravotube.net", + "bravotube.tv", + "brazilpartneruniversity.com", + "brazzer.com", + "brazzers-porno.online", + "brazzers-xxx.net", + "brazzers.com", + "brazzers.xxx", + "brazzersnetwork.com", + "brazzersporn.mobi", + "brazzfan.com", + "brc.ac.uk", + "brdteengal.com", + "breached.to", + "break.com", + "breakdown.me", + "breakgfw.com", + "breaking911.com", + "breakingofbritain.ac.uk", + "breakingtweets.com", + "breakwall.net", + "breasthealthinfo.com", + "breath-takers.com", + "breitbart.com", + "brent-acl.ac.uk", + "brentstart.ac.uk", + "brepolis.net", + "bretton.ac.uk", + "brew.sh", + "brewmp.com", + "briantreepayments.net", + "briantreepayments.tv", + "bricoltech.ac.uk", + "bridgce.ac.uk", + "bridge-studio.co.uk", + "bridgebim.com", + "bridgecollege.ac.uk", + "bridgend.ac.uk", + "bridgendcollege.ac.uk", + "bridgestone-asiapacific.com", + "bridgestone-bandag.com", + "bridgestone-brand.com", + "bridgestone-business-service.jp", + "bridgestone-korea.co.kr", + "bridgestone-plt-eng.com", + "bridgestone-tac-oman.com", + "bridgestone.cl", + "bridgestone.co.cr", + "bridgestone.co.id", + "bridgestone.co.in", + "bridgestone.co.jp", + "bridgestone.co.th", + "bridgestone.com", + "bridgestone.com.ar", + "bridgestone.com.br", + "bridgestone.com.co", + "bridgestone.com.mx", + "bridgestone.com.sg", + "bridgestone.com.tw", + "bridgestone.com.vn", + "bridgestoneamericas.com", + "bridgestonearena.com", + "bridgestonecntc.com", + "bridgestonecomercial.cl", + "bridgestonecomercial.co.cr", + "bridgestonecomercial.com.ar", + "bridgestonecomercial.com.br", + "bridgestonecomercial.com.co", + "bridgestonecomercial.com.mx", + "bridgestonegolf.com", + "bridgestonegz.com", + "bridgestonela.com", + "bridgestonemarketing.com", + "bridgestonemerchandise.com", + "bridgestonenationalfleet.com", + "bridgestoneperformance.com", + "bridgestoneperformancemedia.net", + "bridgestonerapiddelivery.com", + "bridgestonerewards.com", + "bridgestonesyb.com", + "bridgestonetire.ca", + "bridgestonetire.com", + "bridgestonetyre.com.my", + "bridgestonevan.com", + "bridgestonewx.com", + "bridgwater.ac.uk", + "briefdream.com", + "brightcove.com", + "brightcove.net", + "brightcove.services", + "brightcovecdn.com", + "brightline.tv", + "brighton.ac.uk", + "brightonandsussexmedicalschool.ac.uk", + "brightoncity.ac.uk", + "brightoncitycollege.ac.uk", + "brightonlegacy.ac.uk", + "brightonmedicalschool.ac.uk", + "brightstudy.ac.uk", + "briian.com", + "brilcom.ac.uk", + "brill.com", + "brilliant.org", + "brin.ac.uk", + "brinsbury.ac.uk", + "brinsburycollege.ac.uk", + "brinscoll.ac.uk", + "bris.ac.uk", + "brismes.ac.uk", + "bristol-baptist.ac.uk", + "bristol.ac.uk", + "bristolinstituteoflegalpractice.ac.uk", + "bristollawschool.ac.uk", + "bristolroboticslaboratory.ac.uk", + "bristoltheological.ac.uk", + "bristoluwe.ac.uk", + "britac.ac.uk", + "britarch.ac.uk", + "britcollege.ac.uk", + "british-antarctic-survey.ac.uk", + "british-geological-survey.ac.uk", + "british-history.ac.uk", + "british-museum.ac.uk", + "britishacademy.ac.uk", + "britishart.ac.uk", + "britishartstudies.ac.uk", + "britishelectionstudy.ac.uk", + "britishlibrary.ac.uk", + "britishludwigwittgensociety.ac.uk", + "britishmuseum.ac.uk", + "britishwittgensteinsociety.ac.uk", + "britsexcash.com", + "brizzly.com", + "brkmd.com", + "brl.ac.uk", + "brnc.ac.uk", + "brni.com", + "broadbandreports.com", + "broadbook.com", + "broadpressinc.com", + "broadstairscollege.ac.uk", + "brocaproject.com", + "brock.ac.uk", + "brockbbs.com", + "brokenteens.com", + "bromite.org", + "bromley.ac.uk", + "bromleyadulteducation.ac.uk", + "bromleyapps.ac.uk", + "bromo.com", + "bronch.ac.uk", + "bronto.com", + "brookehouse.ac.uk", + "brookes.ac.uk", + "brookings.edu", + "brooklands.ac.uk", + "brooks.ac.uk", + "brooksby.ac.uk", + "brooksbymelton.ac.uk", + "broomfield.ac.uk", + "broomsbarn.ac.uk", + "brotli.org", + "brourou.com", + "browser-intake-datadoghq.com", + "browserleaks.com", + "brox-coll.ac.uk", + "broxtowe.ac.uk", + "brucewang.net", + "bruford.ac.uk", + "brunel.ac.uk", + "bruneldigital.ac.uk", + "bruneluniversitylondon.ac.uk", + "brutalbdsmtube.com", + "brutalfetish.com", + "brutaltgp.com", + "bs-adreview.com", + "bs-awh.ne.jp", + "bsa.ac.uk", + "bsaw.ac.uk", + "bsbec.ac.uk", + "bsdc.ac.uk", + "bsfc.ac.uk", + "bsg.ac.uk", + "bshm.ac.uk", + "bsix.ac.uk", + "bsixbrookehouse.ac.uk", + "bsixbrookehousesixthformcollege.ac.uk", + "bsixcollege.ac.uk", + "bsky.app", + "bsky.network", + "bsky.social", + "bsls.ac.uk", + "bsmb.ac.uk", + "bsms.ac.uk", + "bsmslegacy.ac.uk", + "bsnti.ac.uk", + "bso.ac.uk", + "bsom.ac.uk", + "bsr.ac.uk", + "bsrg.ac.uk", + "bssd.ac.uk", + "bssh.ac.uk", + "bstatic.com", + "bsu.ac.uk", + "bsw.co.jp", + "bsw.jp", + "bsxm1213.pro", + "bt2mag.com", + "bt95.com", + "btaia.com", + "btas.ac.uk", + "btbtav.com", + "btc.ac.uk", + "btc98.com", + "btcbank.bank", + "btcbox.co.jp", + "btctrade.im", + "btdig.com", + "btdigg.org", + "btec.co.uk", + "btku.me", + "btku.org", + "bton.ac.uk", + "btrp-hyperpolarised.ac.uk", + "btspread.com", + "btsynckeys.com", + "btt804.com", + "btt904.com", + "bttzyw.com", + "bttzyw.net", + "btwrdn.com", + "buba.ac.uk", + "bubbaporn.com", + "bubl.ac.uk", + "buck.ac.uk", + "buck.build", + "buckbuild.com", + "bucketeer.jp", + "buckingham.ac.uk", + "buckinghamshire.ac.uk", + "bucks.ac.uk", + "buckscol.ac.uk", + "buckscollege.ac.uk", + "buckscollegegroup.ac.uk", + "bucksnewuni.ac.uk", + "budaedu.org", + "budatt.com", + "buddhanet.com.tw", + "buddhistchannel.tv", + "buddymedia.com", + "bufdg.ac.uk", + "buffered.com", + "bufvc.ac.uk", + "bugzilla.org", + "buhidoh.net", + "bui.ac.uk", + "buic.ac.uk", + "buicha.social", + "buila.ac.uk", + "building3dcontent.com", + "builtenvsigns.ac.uk", + "builtfromebay.com", + "bukkake-jav.com", + "bullguard.com", + "bullog.org", + "bullogger.com", + "bululusexdoll.com", + "bumingbai.net", + "bumpshare.com", + "bumptop.ca", + "bumptop.com", + "bumptop.net", + "bumptop.org", + "bumptunes.com", + "bunbunhk.com", + "bunnylust.com", + "burningcamel.com", + "burnley.ac.uk", + "burstly.net", + "burstlyrewards.com", + "burton-college.ac.uk", + "burton-southderbyshirecollege.ac.uk", + "burton.ac.uk", + "burtonandsouthderbyshirecollege.ac.uk", + "buryacl.ac.uk", + "burycollege.ac.uk", + "busayari.com", + "business-humanrights.org", + "business-i.jp", + "business-intelligence.ac.uk", + "business.page", + "business.site", + "businessaccess.ac.uk", + "businesscatalyst.com", + "businesscove-blackcountry.ac.uk", + "businessfocus.io", + "businessinsider.co.za", + "businessinsider.com", + "businessinsider.com.au", + "businessinsider.com.pl", + "businessinsider.de", + "businessinsider.es", + "businessinsider.fr", + "businessinsider.in", + "businessinsider.jp", + "businessinsider.mx", + "businessinsider.my", + "businessinsider.nl", + "businessinsider.sg", + "businesstoday.com.tw", + "businesswebwise.com", + "businessweek.com", + "businessweekly.com.tw", + "businessweekmag.com", + "bustyangelique.com", + "bustyarianna.com", + "bustydanniashe.com", + "bustydustystash.com", + "bustyinescudna.com", + "bustykellykay.com", + "bustykerrymarie.com", + "bustylornamorgan.com", + "bustymerilyn.com", + "bustymomsvideo.com", + "bustynudebabes.com", + "bustyoldsluts.com", + "bustysammieblack.com", + "busu.org", + "busytrade.com", + "butex.ac.uk", + "buugaa.com", + "buxtoncollege.ac.uk", + "buy-from-shanghai.com", + "buyaapl.com", + "buyaapl.net", + "buyaltera.com", + "buyaple.com", + "buybeatsbydre-uk.com", + "buybeatsheadphonesbydre.com", + "buycheapbeatsbus.com", + "buycheapbeatsbydre.com", + "buycheapbeatsbydreshop.com", + "buycheapbeatsdreuk.com", + "buydrdrebeatbox.com", + "buyfast-paysmart.net", + "buyingfacebooklikes.com", + "buyitnow.com", + "buyitnow.net", + "buyitnow.org", + "buyitnow.tv", + "buyitnowshop.net", + "buymeacoff.ee", + "buymeacoffee.com", + "buyminibeatbox.com", + "buynikechina.com", + "buyoculus.com", + "buyonlineheadphones.com", + "buypass-ssl.com", + "buypass.com", + "buypass.no", + "buypass.se", + "buyshoponly.com", + "buzzardflapper.com", + "buzzav.com", + "buzzhand.com", + "buzzhand.net", + "buzzorange.com", + "buzzsprout.com", + "bvdinfo.com", + "bvpn.com", + "bwbx.io", + "bwgyhw.com", + "bwh1.net", + "bwh8.net", + "bwh81.net", + "bwh88.net", + "bwh89.net", + "bwhstatus.com", + "bwin.com", + "bwrhub.ac.uk", + "bws.ac.uk", + "bwsj.hk", + "bx.in.th", + "bx.tl", + "byam-shaw.ac.uk", + "byapis.com", + "bybeatsdre.com", + "bybit-exchange.github.io", + "bybit.com", + "bycbe.com", + "bycsi.com", + "bydrebeats.com", + "bygpp1207.world", + "byjav.me", + "byjhd.com", + "bymj.io", + "bynet.co.il", + "bypasscensorship.org", + "byrut.org", + "byspotify.com", + "byteoversea.com", + "bytick.com", + "byzantine-ahrb-centre.ac.uk", + "byzantium.ac.uk", + "c-est-simple.com", + "c-ij.com", + "c-scaipe.ac.uk", + "c-span.org", + "c-spanvideo.org", + "c0930.com", + "c100tibet.org", + "c2cx.com", + "c4ccetl.ac.uk", + "c4rex.co", + "c4slive.com", + "ca.gov", + "caacentre.ac.uk", + "caadoc.ac.uk", + "caagcc.ac.uk", + "caban.ac.uk", + "cableav.tv", + "cableav.xyz", + "cablegatesearch.net", + "cabletv.com.hk", + "cabletvdirectv.com", + "cabot.ac.uk", + "cachefly.com", + "cachefly.net", + "cachinese.com", + "cacnw.com", + "cactusvpn.com", + "cad-mep.com", + "cadarn.ac.uk", + "cadarnskillscentre.ac.uk", + "cadbury.ac.uk", + "cadburycollege.ac.uk", + "cadcamsystemsinc.com", + "cadcol.ac.uk", + "cadduct.com", + "cade.ac.uk", + "cadise.ac.uk", + "cadmep.com", + "cadoverlay.com", + "cadren.com", + "cadres.ac.uk", + "caepr.ac.uk", + "caerdydd.ac.uk", + "cafepress.com", + "cafmad.ac.uk", + "cafr.ca", + "cafre.ac.uk", + "cahr.org.tw", + "cai21.xyz", + "caice.com", + "caijinglengyan.com", + "caime.xyz", + "cairn.info", + "cairnspost.com.au", + "calam.ac.uk", + "calameo.com", + "calat.ac.uk", + "calderdale-acl.ac.uk", + "calderdale.ac.uk", + "calderdaletraining.ac.uk", + "calebelston.com", + "caledonian.ac.uk", + "calendarserver.org", + "calendarz.com", + "calgarychinese.ca", + "calgarychinese.com", + "calgarychinese.net", + "calgon.at", + "calgon.be", + "calgon.ch", + "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.tv", + "calgoncarbon-china.com", + "calgoncarbon.com", + "calgonit.com", + "calibre-ebook.com", + "callabitch.org", + "callersbane.com", + "callhulu.com", + "calls.ac.uk", + "callywith.ac.uk", + "caltech.edu", + "cam-duct.com", + "cam-man-cic.ac.uk", + "cam-pgmc.ac.uk", + "cam.ac.uk", + "cam4.com", + "cam4.jp", + "cam4.sg", + "cam69.com", + "cambaddies.com", + "cambb.xxx", + "camborne.ac.uk", + "cambria.ac.uk", + "cambridge-university.ac.uk", + "cambridge.ac.uk", + "cambridge.org", + "cambridgedigital.net", + "cambridgeislamiccollege.ac.uk", + "cambridgemaths.org", + "cambridgemuslimcollege.ac.uk", + "cambridgeschoolshakespeare.com", + "cambridgeshireskills.ac.uk", + "cambridgeuniversity.ac.uk", + "cambro.tv", + "cambslearning.ac.uk", + "camcam.cc", + "camden-acl.ac.uk", + "camdolls.com", + "camduct.com", + "camelot-europe.com", + "camelotherald.com", + "camelotherald.net", + "camelphat.com", + "camelspaceeffect.com", + "camera.ac.uk", + "cameraboys.com", + "camerfirma.com", + "camfinder.com", + "camfox.com", + "camfrog.com", + "camgirlfinder.net", + "camgirlstemple.com", + "camgoddess.tv", + "camonster.com", + "campaignforuyghurs.org", + "camphill.ac.uk", + "campushp.com", + "campuslondon.com", + "campwsbydeangcymru.ac.uk", + "camrabbit.com", + "camre.ac.uk", + "camri.ac.uk", + "cams.com", + "cams.org.sg", + "camsfc.ac.uk", + "camsoda.com", + "camsoda1.com", + "camstagestudio.com", + "camster.com", + "camstreams.tv", + "camsvids.tv", + "camvideos.org", + "camvideos.tv", + "camvideoshub.com", + "camwhores-tv.com", + "camwhores.forum", + "camwhores.tv", + "camwhores.video", + "camwhoresbay.com", + "camwhoreshd.com", + "camwhoria.com", + "can.ac.uk", + "canada-beatsbydre.com", + "canadameet.com", + "canalporno.com", + "cancerandsociety.ac.uk", + "candi.ac.uk", + "candidforum-videos.com", + "cando.ac.uk", + "candycumcity.com", + "candypleasure.com", + "cannington.ac.uk", + "cannock.ac.uk", + "canolfansgiliaucadarn.ac.uk", + "canolfanyramgylcheddolcymru.ac.uk", + "canon-cee.com", + "canon-cmos-sensors.com", + "canon-cna.com", + "canon-ebm.com.hk", + "canon-emea.com", + "canon-emirates.ae", + "canon-europa.com", + "canon-europe.com", + "canon-me.com", + "canon-ois.qa", + "canon-se.com.tw", + "canon.am", + "canon.at", + "canon.az", + "canon.ba", + "canon.be", + "canon.bg", + "canon.ca", + "canon.ch", + "canon.co.il", + "canon.co.uk", + "canon.co.za", + "canon.com", + "canon.com.al", + "canon.com.au", + "canon.com.by", + "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.uz", + "canonfoundation.org", + "canonical.com", + "canonproprinters.com", + "cant-col.ac.uk", + "cant.ac.uk", + "cantab.ac.uk", + "canterbury.ac.uk", + "canterburycollege.ac.uk", + "canterburytrust.ac.uk", + "cantonese.asia", + "canyu.org", + "cao.im", + "caobian.info", + "caochangqing.com", + "cap.org.hk", + "cape.ac.uk", + "capel.ac.uk", + "capitalccg.ac.uk", + "capitalcct.ac.uk", + "capitalcitycg.ac.uk", + "capitalgames.com", + "capitaliq.com", + "capitalisingoncreativity.ac.uk", + "capsule.ac.uk", + "captainfawcett.com", + "carabinasypistolas.com", + "carbo-biocrop.ac.uk", + "carbobiocrop.ac.uk", + "carbon.com", + "carcare-and-tireshop.jp", + "card.io", + "cardiff-institute.ac.uk", + "cardiff.ac.uk", + "cardiffandvalecollege.ac.uk", + "cardiffmet.ac.uk", + "cardiffmetropolitanuniversity.ac.uk", + "cardinalkungfoundation.org", + "cardinalnewman.ac.uk", + "cardonald.ac.uk", + "carebay.com", + "careerengine.us", + "careerfundas.com", + "careerjournal.com", + "careersatfb.com", + "careersinresearch.ac.uk", + "careerswales.ac.uk", + "carekit.org", + "carfax.com", + "cargigileads.com", + "cari.com.my", + "caribbeancom.com", + "caribbeancompr.com", + "carlisle.ac.uk", + "carmel.ac.uk", + "carmer.ac.uk", + "carmotorshow.com", + "carnegie.ac.uk", + "carnegiecollege.ac.uk", + "carnet.hr", + "carousell.com.hk", + "carr-lse.ac.uk", + "carrd.co", + "carryzhou.com", + "carshalton.ac.uk", + "carstagram.com", + "cartoon-sex.tv", + "cartoon18.com", + "cartoon3thumbs.com", + "cartoonmovement.com", + "cartoonporn.com", + "cartoonporno.xxx", + "cartoonpornonly.com", + "cartoonpornvideos.com", + "cartoonregistry.com", + "cartoons.ac.uk", + "cartoonscity.com", + "cartoonsexfantazy.com", + "cartoontube.com", + "cartoonville.net", + "cas.org", + "casadeltibetbcn.org", + "casatibet.org.mx", + "casaw.ac.uk", + "cash.app", + "cash2.com", + "cashback69.com", + "cashbycashapp.com", + "cashify.com", + "cashify.net", + "cashpassport.ca", + "cashpassport.co.za", + "cashpassport.com", + "cashpassport.com.br", + "cashpassport.net", + "cashpassportglobe.com", + "cashvideotube.com", + "casim.ac.uk", + "casimages.com", + "casinobellini.com", + "casinoking.com", + "casinoriva.com", + "casms.ac.uk", + "casnewydd.ac.uk", + "casoneexchange.com", + "casque-fr.com", + "casquebeatsbydrdresolohd.com", + "casquebeatsdocteurdre.com", + "casquebeatsdre2013.com", + "casquebeatsenligne.com", + "casquebeatsfracheter.com", + "casquebeatsmer.net", + "casquebeatsofficiel-fr.com", + "casquebeatspascher2013.com", + "casquebeatssolo.net", + "casquedrdrebeatssfr.com", + "casquemonsterbeats.com", + "casquemonsterbeatsbydre2013.com", + "casquesbeatsaudio.com", + "cast.ac.uk", + "castbox.fm", + "castingcouch-x.com", + "castle-coll.ac.uk", + "castle.ac.uk", + "castlecollege.ac.uk", + "castlereagh.ac.uk", + "castro.fm", + "catalina.hk", + "catalinacruz.com", + "cataloguementalhealth.ac.uk", + "catalysis-cdt.ac.uk", + "catbox.moe", + "catcert.cat", + "catch22.net", + "catchgod.com", + "catchplay.com", + "catfightpayperview.xxx", + "cathedralsgroup.ac.uk", + "catholic.org.hk", + "catholic.org.tw", + "cathvoice.org.tw", + "catmiimi.com", + "cato.org", + "cattt.com", + "causeway.ac.uk", + "cava.ac.uk", + "cavc.ac.uk", + "cave.ac.uk", + "cavendish.ac.uk", + "cavhot.com", + "cavporn.com", + "cavporn.github.io", + "caw.ac.uk", + "caxton.ac.uk", + "cayt.ac.uk", + "cbart.net", + "cbbank.com.mm", + "cbc.ca", + "cbcdc.ac.uk", + "cbm.com.mm", + "cbpar.ac.uk", + "cbrl.ac.uk", + "cbs.ac.uk", + "cbs.com", + "cbsaavideo.com", + "cbscorporation.com", + "cbsi.com", + "cbsi.video", + "cbsiam.com", + "cbsig.net", + "cbsimg.net", + "cbsinteractive.com", + "cbsistatic.com", + "cbsivideo.com", + "cbsnews.com", + "cbspressexpress.com", + "cbssports.com", + "cbsstatic.com", + "cbssvideo.com", + "cbtc.org.hk", + "cc.com", + "cc18.biz", + "cc18.tv", + "cc18tv.com", + "ccad.ac.uk", + "ccap.ac.uk", + "ccav69.info", + "ccav69.me", + "ccav691api.com", + "ccavb.tv", + "ccb.ac.uk", + "ccc.ac.uk", + "cccat.cc", + "cccat.co", + "cccep.ac.uk", + "cccr.ac.uk", + "cccu.ac.uk", + "ccdc.ac.uk", + "ccdtr.org", + "ccesd.ac.uk", + "ccfe.ac.uk", + "cch.ac.uk", + "cchere.com", + "cchsr.ac.uk", + "cci.ac.uk", + "cciernslabs.com", + "cciesecuritylabs.com", + "ccievoicelabs.com", + "ccim.org", + "ccl.ac.uk", + "cclife.ca", + "cclife.org", + "cclifefl.org", + "cclrc.ac.uk", + "ccm.ac.uk", + "ccms.ac.uk", + "ccn.ac.uk", + "ccna5.net", + "ccnsite.com", + "ccol.ac.uk", + "ccp-mag.ac.uk", + "ccp-wsi.ac.uk", + "ccp.ac.uk", + "ccp1.ac.uk", + "ccp11.ac.uk", + "ccp13.ac.uk", + "ccp14.ac.uk", + "ccp2.ac.uk", + "ccp3.ac.uk", + "ccp4.ac.uk", + "ccp5.ac.uk", + "ccp6.ac.uk", + "ccp9.ac.uk", + "ccpb.ac.uk", + "ccpbiosim.ac.uk", + "ccpem.ac.uk", + "ccpforge.ac.uk", + "ccpi.ac.uk", + "ccplymouth.ac.uk", + "ccpn.ac.uk", + "ccpnc.ac.uk", + "ccpp.ac.uk", + "ccppetmr.ac.uk", + "ccpq.ac.uk", + "ccpsx.com", + "ccri.ac.uk", + "ccs.ac.uk", + "ccscfe-cdt.ac.uk", + "ccse.ac.uk", + "ccsr.ac.uk", + "ccstatic.org", + "ccsw.ac.uk", + "ccta.ac.uk", + "ccthere.com", + "ccthere.net", + "cctmweb.net", + "cctongbao.com", + "ccu.edu.tw", + "ccue.ca", + "ccue.com", + "ccvoice.ca", + "ccw.org.tw", + "ccwp.ac.uk", + "cdbook.org", + "cdcparty.com", + "cdd.ac.uk", + "cdef.org", + "cdig.info", + "cdjp.org", + "cdkworkshop.com", + "cdmatech.com", + "cdn-apple.com", + "cdn-telegram.org", + "cdn-terapeak.com", + "cdn.ac.uk", + "cdn20.com", + "cdn77.com", + "cdn77.org", + "cdnews.com.tw", + "cdninstagram.com", + "cdnjs.com", + "cdnlab.live", + "cdnpure.com", + "cdp1989.org", + "cdp1998.org", + "cdp2006.org", + "cdpa.url.tw", + "cdpeu.org", + "cdpusa.org", + "cdpweb.org", + "cdpwu.org", + "cdrc.ac.uk", + "cdt-art-ai.ac.uk", + "cdt-cmp.ac.uk", + "cdt-piads.ac.uk", + "cdtceltic.ac.uk", + "cdw.com", + "cebay.com", + "cecan.ac.uk", + "cecc.gov", + "cecos.ac.uk", + "ceda.ac.uk", + "cedar.ac.uk", + "cee.ac.uk", + "ceeds.ac.uk", + "ceelbas-cdt.ac.uk", + "ceelbas.ac.uk", + "ceesi.ac.uk", + "cefims.ac.uk", + "ceg.ac.uk", + "ceh-nerc.ac.uk", + "ceh-wallingford.ac.uk", + "ceh.ac.uk", + "cehuk.ac.uk", + "ceicdata.com", + "celebforum.co", + "celebgramme.com", + "celebmasta.live", + "celebritygay.com", + "celebritynakeds.com", + "celebrityslips.com", + "celebritystorysite.com", + "celebsporno.com", + "celebsroulette.com", + "celeron.com", + "celeron.net", + "celestiallight.org", + "cell.com", + "cellulo.info", + "celluloidfilmfutures.ac.uk", + "cem.ac.uk", + "cem1.ac.uk", + "ceme.ac.uk", + "cemmap.ac.uk", + "cemp.ac.uk", + "cencoastbmw.com", + "cenews.eu", + "cenkei.com", + "censorship.ai", + "censorship.no", + "census-registration.ac.uk", + "census.ac.uk", + "centa.ac.uk", + "centauro.com.br", + "centerforhumanreprod.com", + "centervillage.co.jp", + "centos.org", + "central-glasgow.ac.uk", + "central-lancashire.ac.uk", + "centralbeds.ac.uk", + "centralcollege.ac.uk", + "centralnation.com", + "centralnottingham.ac.uk", + "centralstmichaels.ac.uk", + "centralsussex.ac.uk", + "centralvalidation.com", + "centreformacroeconomics.ac.uk", + "centreforsustainablecities.ac.uk", + "centreforyouthministry.ac.uk", + "centreonconstitutionalchange.ac.uk", + "centrino.com", + "centrino.net", + "centurys.net", + "ceoi.ac.uk", + "cepacol.ca", + "cepacol.com", + "ceramics-cadcam.com", + "cercia.ac.uk", + "cerdas.com", + "ceredigion.ac.uk", + "ceri.ac.uk", + "cerlim.ac.uk", + "cern.ch", + "certificat2.com", + "certificate-transparency.org", + "certinomis.com", + "certinomis.fr", + "certsign.ro", + "certum.pl", + "ceruk.ac.uk", + "ceskeporno.cz", + "cetc.ac.uk", + "cetis.ac.uk", + "cetl4healthne.ac.uk", + "cetl4musicne.ac.uk", + "ceug.ac.uk", + "cex.io", + "cf-ipfs.com", + "cf.ac.uk", + "cfake.com", + "cfas.ac.uk", + "cfblob.com", + "cfd-tv.com", + "cfdesign.com", + "cfhks.org.hk", + "cfl.re", + "cfldcol.ac.uk", + "cfna.com", + "cfos.de", + "cfr.org", + "cfs.ac.uk", + "cftfc.com", + "cfwives.com", + "cgdepot.org", + "cgh.ac.uk", + "cglas.ac.uk", + "cgst.edu", + "ch9.ms", + "chace.ac.uk", + "championshipseriesleague.com", + "change.org", + "changeip.name", + "changeip.net", + "changeip.org", + "changing-arctic-ocean.ac.uk", + "changp.com", + "changsa.net", + "channel8news.sg", + "channelnewsasia.com", + "chaoex.com", + "chapm25.com", + "chargenow.com", + "chargenowusa.com", + "charlemagne-icon.ac.uk", + "charlemagneseurope.ac.uk", + "charleslyellcentre.ac.uk", + "charlestonroadregistry.com", + "charlotte-anime.jp", + "charmescorts.com", + "chart.ac.uk", + "charteredcollegeofteaching.ac.uk", + "charticulator.com", + "chase.ac.uk", + "chasestudy.ac.uk", + "chat.com", + "chatango.com", + "chatgpt.com", + "chatgptvideo.xyz", + "chatgptvideob.buzz", + "chatnook.com", + "chatsex.xxx", + "chatter.com", + "chatterbate.io", + "chaturbate.com", + "chatwhores.com", + "chatwhores.net", + "chatwhores.org", + "chatwhores.sex", + "chatwhores.tv", + "chcc.ac.uk", + "che.ac.uk", + "chea-nmidlands.ac.uk", + "chead.ac.uk", + "cheadlecollege.ac.uk", + "cheap-beats-by-dre.net", + "cheap-beatsbydre.com", + "cheap-nike.com", + "cheapbagshoes.com", + "cheapbeats.us", + "cheapbeats365.com", + "cheapbeats4sale.net", + "cheapbeatsaustraliasale.com", + "cheapbeatsbus.com", + "cheapbeatsbydr.com", + "cheapbeatsbydrdrepro.com", + "cheapbeatsbydre-au.com", + "cheapbeatsbydre99.com", + "cheapbeatsbydrefau.com", + "cheapbeatsbydremall.com", + "cheapbeatsbydremonster.com", + "cheapbeatsbydrenz.net", + "cheapbeatsbydreonsale.com", + "cheapbeatsbydreoutlet-nz.com", + "cheapbeatsbydreoutlet.com", + "cheapbeatsbydreoutlets2013.com", + "cheapbeatsbydresale.com", + "cheapbeatsbydreshop.com", + "cheapbeatsbydrestudioedition.com", + "cheapbeatsbydrestudioutlet.com", + "cheapbeatsdrdresolo.com", + "cheapbeatsdrestudios.com", + "cheapbeatsheadphone2014.com", + "cheapbeatsheadphones.us", + "cheapbeatsie.com", + "cheapbeatsla.com", + "cheapbeatssale4u.com", + "cheapbeatsshopbydre.com", + "cheapcustombeatsbydre.com", + "cheapdrdrebeats8.com", + "cheapdrdrebeatsca.com", + "cheapdrebeats8.net", + "cheaperbeatsbydresale.com", + "cheapestbeatsdrdre.com", + "cheapheadphonesland.com", + "cheapheadphonessale.com", + "cheapheadsetmall.com", + "cheapheadsetshop.com", + "cheapmonsterbeatsbydrdre.com", + "cheapmonsterbeatsheadsets.com", + "cheapmonsterbeatssale.com", + "cheapmonsterbeatsusa.us", + "cheapmonstersbeatsonsale.com", + "cheapnewbeatsbydre.com", + "cheapnikedunks.com", + "cheapnikeoutlet.com", + "cheapsalemonster.com", + "cheapshoesvip.com", + "cheapwireless04.com", + "cheapwirelessbeats.com", + "checkgfw.com", + "cheep.ac.uk", + "cheerwholesale.us", + "chegg.com", + "cheggcdn.com", + "cheia.ac.uk", + "cheib.ac.uk", + "chelmsford-college.ac.uk", + "chelmsford.ac.uk", + "chelt.ac.uk", + "cheltenham-he.ac.uk", + "chemequations.com", + "chemicalbiology.ac.uk", + "chemnetbase.com", + "chemreact.ac.uk", + "chenel.ac.uk", + "chengjuanseo.com", + "chengmingmag.com", + "chengrendouyin-app.com", + "chengrenshipin-app.com", + "chenguangcheng.com", + "chenpokong.com", + "chenpokong.net", + "chenpokongvip.com", + "cherry-tale.com", + "cherryasia.com", + "cherrybrady.com", + "cherrynudes.com", + "cherrypai.com", + "cherrypanpan.com", + "cherrypimps.com", + "cherrypornhd.com", + "cherrysave.com", + "cheshire.ac.uk", + "cheshirecolleges.ac.uk", + "cheshirehe.ac.uk", + "chest.ac.uk", + "chester.ac.uk", + "chesterfield.ac.uk", + "chesterfieldcollegegroup.ac.uk", + "chhongbi.org", + "chi-med.ac.uk", + "chi.ac.uk", + "chialumni.ac.uk", + "chianxv.buzz", + "chicagolandbmw.com", + "chicagoncmtv.com", + "chichester.ac.uk", + "chichestercollegegroup.ac.uk", + "chickstagram.com", + "chickteases.com", + "chicloud.ac.uk", + "chid.com.mm", + "chigroup.ac.uk", + "chihair-straightener.com", + "chikiporn.com", + "chilbolton.ac.uk", + "childrenofthe90s.ac.uk", + "chillingo.com", + "chimeforchange.org", + "china-autodesk.com", + "china-facebook.com", + "china-mmm.jp.net", + "china-mmm.net", + "china-mmm.sa.com", + "china-review.com.ua", + "china-week.com", + "china101.com", + "china18.org", + "china21.com", + "china21.org", + "china5000.us", + "chinaaffairs.org", + "chinaaid.me", + "chinaaid.net", + "chinaaid.org", + "chinaaid.us", + "chinachange.org", + "chinachannel.hk", + "chinacitynews.be", + "chinaclothesstore.com", + "chinacomments.org", + "chinaculturalvisitinghub.ac.uk", + "chinadecoding.com", + "chinadialogue.net", + "chinadigitaltimes.net", + "chinaeconomicreview.com", + "chinaelections.org", + "chinaeweekly.com", + "chinafile.com", + "chinafreepress.org", + "chinagate.com", + "chinageeks.org", + "chinagfw.org", + "chinagonet.com", + "chinagreenparty.org", + "chinahorizon.org", + "chinahrc.org", + "chinahush.com", + "chinainperspective.com", + "chinainterimgov.org", + "chinalaborwatch.org", + "chinalawandpolicy.com", + "chinalawtranslate.com", + "chinamule.com", + "chinamz.org", + "chinanewscenter.com", + "chinapost.com.tw", + "chinapress.com.my", + "chinarightsia.org", + "chinasex.com.es", + "chinasmile.net", + "chinasocialdemocraticparty.com", + "chinasoul.org", + "chinasucks.net", + "chinatimes.com", + "chinatimes.com.tw", + "chinatopsex.com", + "chinatown.com.au", + "chinatweeps.com", + "chinaway.org", + "chinaworker.info", + "chinaxchina.com", + "chinayouth.org.hk", + "chinayuanmin.org", + "chinchuqi-av.lat", + "chinese-empires.ac.uk", + "chinese-hermit.net", + "chinese-leaders.org", + "chinese-memorial.org", + "chinese-porn-videos.com", + "chinese-xnxx.com", + "chinesedaily.com", + "chinesedailynews.com", + "chinesedemocracy.com", + "chinesegay.org", + "chinesen.de", + "chinesenews.net.au", + "chinesepen.org", + "chineseradioseattle.com", + "chinesespanking.com", + "chinesetalks.net", + "chineseupress.com", + "chinesexxxporn.net", + "chingcheong.com", + "chinman.net", + "chipcoll.ac.uk", + "chipmong13g.buzz", + "chippcoll.ac.uk", + "chips.com", + "chipscohort.ac.uk", + "chithu.org", + "chiuni.ac.uk", + "chla3.com", + "chlamydia.ac.uk", + "chlg.ac.uk", + "chloesworld.com", + "chms.ac.uk", + "chobit.cc", + "chocam.com", + "chocolatey.org", + "choicereviews.org", + "chomp.com", + "chopinonline.ac.uk", + "chosun.com", + "chped.com", + "chrdnet.com", + "christianfreedom.org", + "christianstudy.com", + "christiantimes.org.hk", + "christredeemer.ac.uk", + "christusrex.org", + "christymarks.com", + "chrlawyers.hk", + "chrome.com", + "chromebook.com", + "chromecast.com", + "chromeenterprise.google", + "chromeexperiments.com", + "chromeos.dev", + "chromercise.com", + "chromestatus.com", + "chromium.org", + "chronicle.security", + "chroniclesec.com", + "chrysaliscourses.ac.uk", + "chs.ac.uk", + "cht.com.tw", + "chtf.org.tw", + "chuang-yen.org", + "chuangb15.xyz", + "chubbypornonly.com", + "chubold.com", + "chubun.com", + "chugd.ac.uk", + "chuizi.net", + "chuls.ac.uk", + "chuneo.xyz", + "chunja19.net", + "chuokoron.jp", + "chuporno.com", + "churchill.ac.uk", + "churchinhongkong.org", + "chushigangdrug.ch", + "chutuno.fun", + "chuzs2.xyz", + "chwr7s8u.com", + "chyoa.com", + "ci-en.jp", + "ci-en.net", + "cia.ac.uk", + "cia.gov", + "cias.ac.uk", + "ciattackers.com", + "cib.ac.uk", + "ciciai.com", + "cicl.ac.uk", + "cied.ac.uk", + "ciemap.ac.uk", + "cienen.com", + "cignet.ac.uk", + "cile.ac.uk", + "cilexlawschool.ac.uk", + "cilk.com", + "cilk.net", + "cim-laser.ac.uk", + "cimcomp.ac.uk", + "cindymovies.com", + "cineastentreff.de", + "cinemax.com", + "cinepornogratis.com", + "cios.org", + "ciota.ac.uk", + "cipfg.org", + "circlethebayfortibet.org", + "cirencester.ac.uk", + "cirius.ac.uk", + "cirosantilli.com", + "cirre.ac.uk", + "cirrus.ac.uk", + "cisban.ac.uk", + "cisco-returns.com", + "cisco-warrantyfinder.com", + "cisco.com", + "cisco.mobi", + "ciscoccservice.com", + "ciscoconnectcloud.com", + "ciscoconnectcloud.net", + "ciscoconnectcloud.org", + "ciscocontest.com", + "ciscoerate.com", + "ciscofax.com", + "ciscoinvestments.com", + "ciscojabbervideo.net", + "ciscokinetic.com", + "ciscoknowledgenetwork.com", + "ciscolearningsociety.org", + "ciscolearningsystem.com", + "ciscolive.com", + "cisconetapp.com", + "cisconetspace.com", + "cisconetspace.info", + "cisconetspace.net", + "ciscopartnermarketing.com", + "ciscopowercube.com", + "ciscopress.ch", + "ciscoprice.com", + "ciscoresearch.com", + "ciscosoftware.com", + "ciscospark.ca", + "ciscospark.com", + "ciscospark.jp", + "ciscotaccc.com", + "ciscotr.com", + "ciscoturk.net", + "ciscovideo.com", + "ciscowebseminars.com", + "cispaletter.com", + "cispaletter.org", + "citas-para-mayoresde50.ec", + "citasecuador.com", + "citizencn.com", + "citizenlab.ca", + "citizenlab.org", + "citizenpowerforchina.org", + "citizenscommission.hk", + "citizensradio.org", + "citrixandautodesk.com", + "citscapes.ac.uk", + "city-and-guilds.ac.uk", + "city-hentai.com", + "city-poly.ac.uk", + "city.ac.uk", + "city365.ca", + "city9x.com", + "cityandguilds.ac.uk", + "cityandguildsartschool.ac.uk", + "citybathcoll.ac.uk", + "citycol.ac.uk", + "citycollege.ac.uk", + "citycollegebrighton.ac.uk", + "citycollegepeterborough.ac.uk", + "citycollegeplymouth.ac.uk", + "citycollegesoton.ac.uk", + "cityheaven.net", + "citylab.com", + "citylit.ac.uk", + "cityofbristol.ac.uk", + "cityofglacol.ac.uk", + "cityofglasgowcollege.ac.uk", + "cityoflondonbschool.ac.uk", + "cityoflove.com", + "cityofoxford.ac.uk", + "cityplym.ac.uk", + "citypopulation.de", + "citysun.ac.uk", + "citytalk.tw", + "citytourgirls.com", + "cityuniversitybirmingham.ac.uk", + "ciu.ac.uk", + "civicparty.hk", + "civil3d.com", + "civilcc.com", + "civildisobediencemovement.org", + "civilhrfront.org", + "civiliangunner.com", + "civilmedia.tw", + "civilsoftware.net", + "civilwarpetitions.ac.uk", + "civisec.org", + "civitai.com", + "cixp.net", + "ciyuanjie.cc", + "cjb.net", + "ck101.com", + "ckcdn.com", + "ckck.fun", + "ckeene.ac.uk", + "ckss98.com", + "clackmannan-college.ac.uk", + "clacks.ac.uk", + "clacton.ac.uk", + "clad.ac.uk", + "clannad-movie.jp", + "claravenger.com", + "clarendon.ac.uk", + "clarin.ac.uk", + "clarionproject.org", + "clarivate.com", + "clasporno.org", + "classicalguitarblog.net", + "classicnike.com", + "classics.ac.uk", + "classymomsex.com", + "claude.ai", + "claudeusercontent.com", + "clb.org.hk", + "clc-london.ac.uk", + "clco.cc", + "clean-cooling.ac.uk", + "cleansite.biz", + "cleansite.info", + "cleansite.us", + "clearasil.us", + "clearflo.ac.uk", + "clearharmony.net", + "clearlinux.org", + "clearpool.finance", + "clearsurance.com", + "clearwisdom.net", + "clementine-player.org", + "cleveland.ac.uk", + "clh.ac.uk", + "click-url.com", + "clickandgovideo.ac.uk", + "clickedu.co.uk", + "clickme.net", + "cliffcollege.ac.uk", + "climate-lab-book.ac.uk", + "climate-server.com", + "climatechangewales.ac.uk", + "climateone.blogspot.co.id", + "climb.ac.uk", + "clinica-tibet.ru", + "clinical-videos.com", + "clinicalkey.com", + "clinicalnotes.ac.uk", + "clinicalskillscentre.ac.uk", + "clip16.com", + "clipcake.com", + "clipdrop.co", + "clipfish.de", + "cliphayho.com", + "cliphunter.com", + "clips4sale.com", + "clipsaoyai.com", + "clipsbai.com", + "clipseksi.com", + "clipsex.asia", + "clitgames.com", + "cln.ac.uk", + "cloakpoint.com", + "clojure.org", + "clonoth.com", + "closer.ac.uk", + "cloud.ac.uk", + "cloudapp.net", + "cloudappsecurity.com", + "cloudburstresearch.com", + "cloudc.one", + "cloudchoose.com", + "cloudcone.com", + "cloudcone.net", + "cloudconvert.com", + "cloudcraze.com", + "cloudcredibility.com", + "cloudflare-dns.com", + "cloudflare-ech.com", + "cloudflare-esni.com", + "cloudflare-gateway.com", + "cloudflare-ipfs.com", + "cloudflare-quic.com", + "cloudflare.com", + "cloudflare.net", + "cloudflare.tv", + "cloudflareaccess.com", + "cloudflareapps.com", + "cloudflarebolt.com", + "cloudflareclient.com", + "cloudflareinsights.com", + "cloudflareok.com", + "cloudflarepartners.com", + "cloudflareportal.com", + "cloudflarepreview.com", + "cloudflareresolve.com", + "cloudflaressl.com", + "cloudflarestatus.com", + "cloudflarestorage.com", + "cloudflarestream.com", + "cloudflaretest.com", + "cloudflarewarp.com", + "cloudfront.com", + "cloudfront.net", + "cloudfunctions.net", + "cloudhealthtech.com", + "cloudimage.io", + "cloudimg.io", + "cloudinary.com", + "cloudinary.net", + "cloudinsights.com", + "cloudlatex.io", + "cloudlive.com", + "cloudlock.com", + "cloudn.me", + "cloudokyo.cloud", + "cloudproxy.app", + "cloudrobotics.com", + "cloudsync-prod.s3.amazonaws.com", + "cloudvolumes.com", + "cloudworks.ac.uk", + "cloudyzgirl.com", + "cloupia.com", + "cloupia.net", + "clova.ai", + "clp.ac.uk", + "clrc.ac.uk", + "club1069.com", + "clubhouse.com", + "clubhouseapi.com", + "clubseventeen.com", + "clubsweethearts.com", + "clubtubes.com", + "clusterconnection.com", + "clydebank.ac.uk", + "clyp.it", + "clzz2.xyz", + "cmac.ac.uk", + "cmcn.org", + "cmcnet.ac.uk", + "cmcsm.ac.uk", + "cmegroup.com", + "cmhalq.com", + "cmi.org.tw", + "cmmedia.com.tw", + "cmoinc.org", + "cmpaas.com", + "cmpcp.ac.uk", + "cms-twdigitalassets.com", + "cms.ac.uk", + "cms.gov", + "cmu.ac.uk", + "cmu.edu", + "cmule.com", + "cmule.org", + "cmx.im", + "cn-proxy.com", + "cn6.eu", + "cna.com.tw", + "cnabc.com", + "cnbc.com", + "cnbcfm.com", + "cnbeta.com", + "cnbeta.com.tw", + "cnbetacdn.com", + "cncrivals.com", + "cnd.org", + "cnet.co.kr", + "cnet.com", + "cnet.de", + "cnetfrance.fr", + "cnex.org.cn", + "cnineu.com", + "cnitter.com", + "cnivogue.com.au", + "cnix-gov-cn.com", + "cnmd.ac.uk", + "cnn.com", + "cnn.io", + "cnn.it", + "cnnamador.com", + "cnnarabic.com", + "cnnikebrand.com", + "cnnlabs.com", + "cnnmoney.ch", + "cnnmoney.com", + "cnnmoneystream.com", + "cnnpolitics.com", + "cnpmjs.org", + "cnpolitics.org", + "cnproxy.com", + "cnshopin.com", + "cnwl.ac.uk", + "cnyes.com", + "cnzjp.xyz", + "co-op.ac.uk", + "co-opcollege.ac.uk", + "co-operative-university.ac.uk", + "co-operative.ac.uk", + "co-operativeuniversity.ac.uk", + "co.de", + "co.ph", + "co.tv", + "coat.co.jp", + "coatbridge.ac.uk", + "cobatt.com", + "cobinhood.com", + "cobra.ac.uk", + "cobrasearch.com", + "coccfea.ac.uk", + "cochina.co", + "cochina.org", + "cochrane-airways.ac.uk", + "cochrane.ac.uk", + "cochranelibrary.com", + "cock4stepmom.com", + "cockcroft.ac.uk", + "cockofhorse.com", + "cocksuckersguide.com", + "cocktailsandcocktalk.com", + "cockyboys.com", + "cocorees.ac.uk", + "cod-health.ac.uk", + "code.ac.uk", + "code.org", + "code1984.com", + "codeberg.org", + "codeberg.page", + "codecademy.com", + "codeforaliving.io", + "codeforces.com", + "codei.sh", + "codeish.co", + "codeish.io", + "codeplex.com", + "codeshare.io", + "codeskulptor.org", + "codespot.com", + "codethemicrobit.com", + "codima.ac.uk", + "codivorexxx.com", + "cods-nursing.ac.uk", + "coedcherry.com", + "coem.ac.uk", + "cof.ac.uk", + "cogc.ac.uk", + "coin2co.in", + "coinalyze.net", + "coinbase.com", + "coinbene.com", + "coindesk.com", + "coinegg.com", + "coinex.com", + "coingecko.com", + "coingi.com", + "coinglass.com", + "coinmap.org", + "coinmarketcap.com", + "coinone.co.kr", + "coinonecore.com", + "coinonecorp.com", + "coinrail.co.kr", + "cointiger.com", + "cointobe.com", + "coinut.com", + "coithienthai.com", + "coitustube.com", + "col-westanglia.ac.uk", + "col.ac.uk", + "colc.ac.uk", + "colcc.ac.uk", + "colch-inst.ac.uk", + "colchester.ac.uk", + "colchsfc.ac.uk", + "coleg-powys.ac.uk", + "colegaucymru.ac.uk", + "colegcymraeg.ac.uk", + "colegdewisant.ac.uk", + "colegelidyr.ac.uk", + "coleggwent.ac.uk", + "coleggwyrabertawe.ac.uk", + "colegialasdeverdad.com", + "colegialasreales.com", + "colegmorgannwg.ac.uk", + "colegpenybont.ac.uk", + "colegsirbenfro.ac.uk", + "colegsirgar.ac.uk", + "coliriodemacho.com.br", + "collabora.co.uk", + "collabora.com", + "collabora.org", + "collaboraoffice.com", + "collaborateni.ac.uk", + "collateralmurder.com", + "collateralmurder.org", + "collection-3d.com", + "collectionofbestporn.com", + "collective99.com", + "college-falmouth.ac.uk", + "collegecareearlyed.ac.uk", + "collegedevelopmentnetwork.ac.uk", + "collegejournal.com", + "collegeofosteopaths.ac.uk", + "collegeofteachers.ac.uk", + "collegeofteaching.ac.uk", + "collegepornonly.com", + "collegesexgames.com", + "collegesni.ac.uk", + "collegesscotland.ac.uk", + "collegeswales.ac.uk", + "collegewebsites.ac.uk", + "collemergencymed.ac.uk", + "colliderporn.com", + "collins.co.uk", + "collins.in", + "collyers.ac.uk", + "colombianas.webcam", + "colorfulpalette.org", + "colorfulstage.com", + "colorprotechnology.com", + "colpet.ac.uk", + "com.am", + "com.google", + "com.in", + "com.kn", + "com.uk", + "combinedhonours.ac.uk", + "comcast.net", + "comdotgame.com", + "come29.xyz", + "comedycentral.com", + "comefromchina.com", + "comet-study.ac.uk", + "cometotheduckside.com", + "comic-mega.me", + "comicbox.xyz", + "comico.tw", + "comics.ac.uk", + "comicscartoonporn.com", + "comicsporno.es", + "comicunivers.com", + "comicuniverse.org", + "comixzilla.com", + "comm-coll-hackney.ac.uk", + "commandandconquer.com", + "commandarms.com", + "comments.app", + "commentshk.com", + "commerceos.com", + "commnet.ac.uk", + "communistcrimes.org", + "communitychoicecu.com", + "como-hackearfacebook.com", + "comodo.com", + "comodo.net", + "comodoca.com", + "comodoca2.com", + "comodoca3.com", + "comodoca4.com", + "compaq.org", + "comparitech.com", + "compass-system.com", + "compass-systems.com", + "compass.is", + "competitionpolicy.ac.uk", + "compileheart.com", + "complex.ac.uk", + "componentkit.org", + "compose-spec.io", + "compress.to", + "compresspdf.new", + "computer.org", + "computing.ac.uk", + "computingreviews.com", + "compython.net", + "comscoreresearch.com", + "comsoc.org", + "conair.me", + "conan.xxx", + "concordat.ac.uk", + "concordats.ac.uk", + "conda.io", + "condenastcollege.ac.uk", + "condovercollege.ac.uk", + "conductrics.com", + "conductus.ac.uk", + "conel.ac.uk", + "confetti.ac.uk", + "conform.ac.uk", + "confuciusinstitute.ac.uk", + "congyu.moe", + "connaissancesfinancierespratiques.ca", + "connect-ed.ac.uk", + "connect-in-canada.com", + "connect.ac.uk", + "connectcommerce.hk", + "connectcommerce.info", + "connectcommerce.tv", + "connected-drive.com", + "connectedcommerce.com", + "connectedcommerce.tv", + "connectedeverything.ac.uk", + "connectionsacademy.com", + "connectionseducation.com", + "connectionslearning.com", + "connell.ac.uk", + "conoha.jp", + "conquerwithcharacter.com", + "conscrypt.com", + "conscrypt.org", + "conservatoiresuk.ac.uk", + "consilience.ac.uk", + "constitutionalism.solutions", + "constructware.com", + "consul.io", + "consultants.ac.uk", + "contactmagazine.net", + "contactossexoecuador.com", + "containersonaws.com", + "contechacademy.com", + "contemp-hist-arch.ac.uk", + "contentful.com", + "contest.com", + "convio.net", + "convrgencegame.com", + "coobay.com", + "cooer.su", + "cookiechoices.org", + "cookielaw.org", + "cookiepro.com", + "cool-comics.com", + "cool18.com", + "coolaler.com", + "coolder.com", + "coolinet.net", + "cooliphonecasesstore.com", + "coolloud.org.tw", + "coolmonster.net", + "coolncute.com", + "coolsexnew.com", + "coolstuffinc.com", + "coomer.party", + "coova.com", + "coova.net", + "coova.org", + "copac.ac.uk", + "copim.ac.uk", + "copior.ac.uk", + "copro.pw", + "cops.ac.uk", + "copstat.ac.uk", + "coqnu.com", + "corbinfisher.com", + "cordcloud.org", + "cordwainers.ac.uk", + "core.ac.uk", + "coreduo.com", + "coreextreme.com", + "corel.com", + "corel.net", + "coreldraw.app", + "coreldraw.com", + "corelstore.com", + "coreml.net", + "coreoptics.net", + "corepublishingsolutions.com", + "cornell-brown-penn.ac.uk", + "cornwall-acl.ac.uk", + "cornwall-vithform.ac.uk", + "cornwall.ac.uk", + "coronavirusnow.com", + "corpasnagaidhlig.ac.uk", + "corpmerchandise.com", + "corporatecashpassport.com", + "cortanaanalytics.com", + "cortanaskills.com", + "cortexrpg.com", + "corumcollege.com", + "cos-moe.com", + "cosc.ac.uk", + "coseelis.ac.uk", + "cosfans-tw.com", + "cosmosdb.info", + "cosmosdb.net", + "cosplay-jav.com", + "cosplayeromania.jp", + "cosplayjav.pl", + "cosplayporntube.com", + "cosplayworld.net", + "cospop.ac.uk", + "costco-static.com", + "costco.com", + "costcobusinessdelivery.com", + "cot.ac.uk", + "cotolia.com", + "cotr.ac.uk", + "cotweet.com", + "cougarsexmovies.com", + "coulsdon.ac.uk", + "councilofhealthcarescience.ac.uk", + "counsellingresearch.ac.uk", + "counter.social", + "countytraining.ac.uk", + "coup.ac.uk", + "coupang.com", + "coupangcdn.com", + "couplecam.co.uk", + "couriermail.com.au", + "coursehero.com", + "coursera-for-business.org", + "coursera.community", + "coursera.help", + "coursera.org", + "courtauld.ac.uk", + "cov.ac.uk", + "covcollege.ac.uk", + "cove4careinkent.ac.uk", + "coventry.ac.uk", + "coventrycollege.ac.uk", + "coventryuniversity.ac.uk", + "covid19-rx.org", + "covid19rx.org", + "covuni.ac.uk", + "covuniapps.ac.uk", + "cowboom.com", + "cowc.ac.uk", + "cowork.ac.uk", + "coze.com", + "cozydrdrebeats.com", + "cp44.net", + "cpan.org", + "cpc.ac.uk", + "cpd25.ac.uk", + "cpd4phd.ac.uk", + "cpdnoticeboard.ac.uk", + "cpedge.com", + "cpel.ac.uk", + "cphc.ac.uk", + "cpib.ac.uk", + "cpj.org", + "cppe.ac.uk", + "cppr.ac.uk", + "cptt.ac.uk", + "cpz.to", + "cq99.us", + "cqcorea.com", + "crabporn.com", + "crackle.com", + "craigslist.org", + "cral.ac.uk", + "cran.ac.uk", + "cranfield.ac.uk", + "crankplayer.com", + "crash.ac.uk", + "crates.io", + "craven-college.ac.uk", + "crawley-college.ac.uk", + "crawley.ac.uk", + "crazy-amateurs.com", + "crazyav.xyz", + "crazybook.xyz", + "crazycloud.ru", + "crazyfiction.xyz", + "crazylivecams.com", + "crazynovel.xyz", + "crazys.cc", + "crazyshit.com", + "crazyxxx3dworld.com", + "crazyxxx3dworld.net", + "crazyxxx3dworld.org", + "crazyxxxworld.com", + "crbug.com", + "crchina.org", + "crd-net.org", + "creaders.net", + "creadersnet.com", + "cream.ac.uk", + "creamasia.com", + "creamlemon.info", + "creampieforgranny.com", + "create.ac.uk", + "createspace.com", + "createwhatsnext.com", + "creativecloud.com", + "creativecommons.engineering", + "creativecommons.org", + "creativeindustries.ac.uk", + "creativelab5.com", + "creativepass.com", + "creativesdk.com", + "creativity-cetl.ac.uk", + "creatwhatsnext.com", + "crececonebay.com", + "creditcardsbay.com", + "creditlink-east.ac.uk", + "creds.ac.uk", + "cresc.ac.uk", + "crescentlearning.ac.uk", + "crest.ac.uk", + "crestresearch.ac.uk", + "crew.ac.uk", + "crfr.ac.uk", + "crh.ac.uk", + "cri.ac.uk", + "cric.ac.uk", + "cricbristol.ac.uk", + "crichton.ac.uk", + "crick.ac.uk", + "cricketcountry.com", + "cricklade.ac.uk", + "crisisresponse.google", + "cristyli.com", + "crit-staging.com", + "critica.ac.uk", + "critical.ac.uk", + "criticalfriend.ac.uk", + "criticaltheology.ac.uk", + "crmdynint-gcc.com", + "crmdynint.com", + "crocels.ac.uk", + "crocotube.com", + "cromite.org", + "cronton.ac.uk", + "crontonsixthform.ac.uk", + "crontonsixthformcollege.ac.uk", + "cropdiversity.ac.uk", + "cropyields.ac.uk", + "cros.ac.uk", + "crossborderexpansion.com", + "crossfire.co.kr", + "crossfitfirestone.com", + "crossmediapanel.com", + "crossthewall.net", + "crossvpn.net", + "crosswalk-project.com", + "crosswalk-project.net", + "crowdtangle.com", + "croxyproxy.com", + "croydon.ac.uk", + "croydon6f.ac.uk", + "croydonacl.ac.uk", + "croydonhe.ac.uk", + "croydonsec.ac.uk", + "crr.com", + "crrev.com", + "crsbi.ac.uk", + "crsp.ac.uk", + "crtsgfb1.top", + "crucial.com", + "crucible-cetl.ac.uk", + "cruel-furies.com", + "cruisse.ac.uk", + "crunchyroll.com", + "crustwebsites.net", + "crwdcntrl.net", + "crypto.com", + "cryptocompare.com", + "cryptographyengineering.com", + "crypton.co.jp", + "crysis.jp", + "crystalgunnsworld.com", + "crystalmiss.com", + "cs.co", + "cs4hs.com", + "csakporno.hu", + "csc.ac.uk", + "cscd.ac.uk", + "csct.ac.uk", + "cscuk.ac.uk", + "csd3.ac.uk", + "csdparty.com", + "csec.ac.uk", + "cser.ac.uk", + "cserge.ac.uk", + "csg.ac.uk", + "cshive.com", + "cshl.ac.uk", + "csifund.org", + "csis-prod.s3.amazonaws.com", + "csis.org", + "csm.ac.uk", + "csmen.ac.uk", + "csmonitor.com", + "csn-cetl.ac.uk", + "csrankings.org", + "csrf.ac.uk", + "csrs.ac.uk", + "csrw.ac.uk", + "cssd.ac.uk", + "cstatic.net", + "csu.ac.uk", + "csuchen.de", + "csw.org.uk", + "ct-toolkit.ac.uk", + "ct.org.tw", + "cta-observatory.ac.uk", + "ctan.org", + "ctao.org", + "ctc.ac.uk", + "ctcrm.ac.uk", + "ctee.com.tw", + "ctfassets.net", + "ctfriend.net", + "ctg.ac.uk", + "ctitv.com.tw", + "ctk.ac.uk", + "ctkaquinas.ac.uk", + "ctkemmanuel.ac.uk", + "ctksfc.ac.uk", + "ctkstmarys.ac.uk", + "ctotires.com", + "ctowc.org", + "ctr-math-phys.ac.uk", + "cts.ac.uk", + "cts.com.tw", + "cttoolkit.ac.uk", + "ctv.com.tw", + "ctwant.com", + "ctyun.online", + "cubo.ac.uk", + "cuc.ac.uk", + "cuckfilmswifefuck.com", + "cuckold69.com", + "cuckoldfuck.com", + "cuckoldingwifey.com", + "cuckoldinterracialporn.com", + "cuckoldinterracialwife.com", + "cuckoldplacetube.com", + "cuckoldporntube.com", + "cuckoldwifesex.com", + "cuckoldwifesexxx.com", + "cuckoldwifetube.com", + "cuckporn.com", + "cuckvideos.com", + "cuckwatchingwife.com", + "cuckwimp.com", + "cudah.ac.uk", + "cudassh.ac.uk", + "cudos.ac.uk", + "cue.ac.uk", + "cuebic.biz", + "cuffiesaldi.com", + "cuhk.edu.hk", + "cuhkacs.org", + "cuhop.ac.uk", + "cuihua.org", + "cuinc.tw", + "cuiweiping.net", + "cukas.ac.uk", + "culham.ac.uk", + "cullenproject.ac.uk", + "cultiva.ac.uk", + "cultoferotica.com", + "cultura-kolomna.ru", + "culture.tw", + "cultureofthecountryside.ac.uk", + "cum4k.cc", + "cumasianporn.com", + "cumberlandlodge.ac.uk", + "cumbernauld.ac.uk", + "cumbria.ac.uk", + "cumbriacad.ac.uk", + "cumbriahigherlearning.ac.uk", + "cumlouder.com", + "cumshotlist.com", + "cumswappingsis.com", + "cumteenporn.com", + "cunhua.pics", + "cuntcrack.com", + "cuntempire.com", + "cuntwars.com", + "cunw.ac.uk", + "cup.com.hk", + "cups.org", + "curator.ac.uk", + "curbed.com", + "curdev-fe-ni.ac.uk", + "curioustravellers.ac.uk", + "curl.ac.uk", + "currently.com", + "currently.net", + "currenttime.tv", + "cursecdn.com", + "curseforge.com", + "cursor-cdn.com", + "cursor.com", + "cursor.sh", + "cursorapi.com", + "curve.fi", + "curvefish.com", + "curvybbwwives.com", + "curvyerotic.com", + "cusp.ac.uk", + "cusp.hk", + "cusplondon.ac.uk", + "custom-iphonecase.com", + "custombeatsbydrebuy.com", + "custombeatsdeals.com", + "custombeatsforcheap.com", + "custombeatsny.com", + "custombeatssbydreus.com", + "customdrdrebeats.com", + "customercontrolpanel.de", + "customizedbeatbydre.com", + "customizedbeatsbydre.com", + "customizedbeatsdre.com", + "customnikeshoes.com", + "cusu.hk", + "cutg.ac.uk", + "cutscenes.net", + "cutt.ly", + "cuv.ac.uk", + "cuwm.ac.uk", + "cvcp.ac.uk", + "cvma.ac.uk", + "cvr.ac.uk", + "cvs.ac.uk", + "cvu.ac.uk", + "cw.com.tw", + "cwa.ac.uk", + "cwb.gov.tw", + "cwc.ac.uk", + "cwcams.com", + "cwcfe.ac.uk", + "cwrc.ac.uk", + "cws.ac.uk", + "cy22.tv", + "cyber-bay.info", + "cyber-bay.org", + "cyber-college.ac.uk", + "cyberctm.com", + "cyberghostvpn.com", + "cybermondaybeats4sale.com", + "cybersecurity-cdt.ac.uk", + "cybersecuritycdt.ac.uk", + "cybertrust.co.jp", + "cybertrust.ne.jp", + "cyberx.com", + "cyclops-network.ac.uk", + "cygames.co.jp", + "cygames.jp", + "cygwin.com", + "cylink.pro", + "cylink0122.icu", + "cym.ac.uk", + "cymdeithasddysgedig.ac.uk", + "cymdeithasddysgedigcymru.ac.uk", + "cymoedd.ac.uk", + "cymru.ac.uk", + "cynghrairstrategolaberbangor.ac.uk", + "cynscribe.com", + "cython.org", + "cytode.us", + "cz.cc", + "czechav.com", + "czechbiporn.com", + "czechcasting.com", + "czechhunter.com", + "czechlesbians.com", + "czechmassage.com", + "czechstreets.com", + "czechvr.com", + "czechwifeswap.com", + "cztv117.shop", + "d-fukyu.com", + "d-trust.net", + "d-upp.com", + "d0z.net", + "d100.net", + "d1b183sg0nvnuh.cloudfront.net", + "d1c37gjwa26taa.cloudfront.net", + "d1g1f25tn8m2e6.cloudfront.net", + "d1k2us671qcoau.cloudfront.net", + "d1m7jfoe9zdc1j.cloudfront.net", + "d1mhjrowxxagfy.cloudfront.net", + "d1oca24q5dwo6d.cloudfront.net", + "d1w2poirtb3as9.cloudfront.net", + "d1xhnb4ptk05mw.cloudfront.net", + "d1ymi26ma8va5x.cloudfront.net", + "d29vzk4ow07wi7.cloudfront.net", + "d2aba1wr3818hz.cloudfront.net", + "d2anahhhmp1ffz.cloudfront.net", + "d2bay.com", + "d2dylwb3shzel1.cloudfront.net", + "d2e2de1etea730.cloudfront.net", + "d2mrry2to5rg.com", + "d2nvs31859zcd8.cloudfront.net", + "d2pass.com", + "d2um2qdswy1tb0.cloudfront.net", + "d2vjef5jvl6bfs.cloudfront.net", + "d2xmjdvx03ij56.cloudfront.net", + "d33wubrfki0l68.cloudfront.net", + "d36nr0u3xmc4mm.cloudfront.net", + "d3aqoihi2n8ty8.cloudfront.net", + "d3c27h4odz752x.cloudfront.net", + "d3c33hcgiwev3.cloudfront.net", + "d3rhr7kgmtrq1v.cloudfront.net", + "d3vd9lfkzbru3h.cloudfront.net", + "d6d4ismr40iw.cloudfront.net", + "d6tizftlrpuof.cloudfront.net", + "da-files.com", + "da3dsoul.dev", + "daboja18.com", + "dabr.co.uk", + "dabr.eu", + "dabr.me", + "dabr.mobi", + "dacebook.com", + "dachix.com", + "dadazim.com", + "daddyslilangel.com", + "dadi360.com", + "dafabet.com", + "dafagood.com", + "dafahao.com", + "dafanhao-app.com", + "dafni.ac.uk", + "dafoh.org", + "daft.sex", + "daftporn.com", + "daftsex-hd.com", + "daftsex.com", + "dagelijksestandaard.nl", + "dagfs.com", + "daidostup.ru", + "dailidaili.com", + "dailybasis.com", + "dailym.ai", + "dailymail.co.uk", + "dailymail.com", + "dailymail.com.au", + "dailymail.dk", + "dailymailonline.com", + "dailymotion.com", + "dailyporn.club", + "dailysabah.com", + "dailytelegraph.com.au", + "dailyview.tw", + "daindianporn.com", + "daiphapinfo.net", + "dajiyuan.com", + "dajiyuan.de", + "dajiyuan.eu", + "dalailama-archives.org", + "dalailama.com", + "dalailama.mn", + "dalailama.ru", + "dalailama80.org", + "dalailamacenter.org", + "dalailamafellows.org", + "dalailamafilm.com", + "dalailamafoundation.org", + "dalailamahindi.com", + "dalailamainaustralia.org", + "dalailamajapanese.com", + "dalailamaprotesters.info", + "dalailamaquotes.org", + "dalailamatrust.org", + "dalailamavisit.org.nz", + "dalailamaworld.com", + "dalianmeng.org", + "daliulian.org", + "damduc.org", + "damplips.com", + "dance-archives.ac.uk", + "dandalinvoa.com", + "dandanzan.cc", + "danemarket.com", + "danke4china.net", + "danmarkbeatsbydrdre.com", + "danskpornofilm.com", + "dansmovies.com", + "danwei.org", + "daoc.net", + "daolan.net", + "daozhongxing.org", + "daresbury.ac.uk", + "daretoku-eromanga.info", + "darivoa.com", + "darkageofcamelot.com", + "darkcategories.com", + "darknaija.com", + "darkness-risen.com", + "darknessporn.com", + "darknun.com", + "darksidemagazine.com", + "darktech.org", + "darktoy.net", + "darlington.ac.uk", + "darlingtonlearningandskills.ac.uk", + "darpa.mil", + "darrenliuwei.com", + "dart.dev", + "dartington.ac.uk", + "dartlang.org", + "dartpad.dev", + "darts.ac.uk", + "dartsearch.net", + "darwin.ac.uk", + "darwindimensions.com", + "darwinproject.ac.uk", + "darwinsource.com", + "darwinsource.org", + "darwinsourcecode.com", + "dasaob.online", + "dasg.ac.uk", + "dash-1.ac.uk", + "dashlane.com", + "dashwood360.com", + "dassh.ac.uk", + "dastanhisexy.cc", + "dastrassi.org", + "dat.foundation", + "data-archive.ac.uk", + "data-intensive-cdt.ac.uk", + "data-service.ac.uk", + "data-vocabulary.org", + "data.ac.uk", + "data.com", + "data.gov.tw", + "datafuturesalphapilot.ac.uk", + "datagrid.ac.uk", + "datalabour.com", + "dataliberation.org", + "datalore.io", + "datasheets360.com", + "datashield.ac.uk", + "datasig.ac.uk", + "datawav.club", + "date2night.xyz", + "daum.net", + "daumcdn.net", + "daumkakao.io", + "daumpcbang.com", + "davcoll.ac.uk", + "daventrylearningpartnership.ac.uk", + "david-kilgour.com", + "david-laserscanner.com", + "davidlewis.ac.uk", + "dawangidc.com", + "dawngate.com", + "dawngatechronicles.com", + "daxa.cn", + "dayabook.com", + "daylenerio.com", + "daylife.com", + "daytonbmw.com", + "daytontrucktires.com", + "dazn-api.com", + "dazn.com", + "dazndn.com", + "db.tt", + "dba.dk", + "dbc.hk", + "dbgjd.com", + "dc-msedge.net", + "dca.ac.uk", + "dcard.cc", + "dcard.io", + "dcard.link", + "dcard.tw", + "dcc.ac.uk", + "dcd.ac.uk", + "dcdp.ac.uk", + "dcg.ac.uk", + "dcmilitary.com", + "dct.ac.uk", + "dctbeatsbydre.com", + "ddacn6pr5v0tl.cloudfront.net", + "ddc.com.tw", + "ddd-smart.net", + "ddff66.com", + "ddff77.com", + "ddg.co", + "ddg.gg", + "ddh.gg", + "ddhw.info", + "ddi.ac.uk", + "dditsadn.com", + "dditscdn.com", + "ddns.info", + "ddns.me.uk", + "ddns.mobi", + "ddns.ms", + "ddns.name", + "ddns.net", + "ddns.us", + "de-montfort.ac.uk", + "de-sci.org", + "de1lib.org", + "deadline.com", + "deadspacegame.com", + "deafandcreative.ac.uk", + "deafheritagenetwork.ac.uk", + "deaftone.com", + "dealbay.com", + "dealerspeed.net", + "dealsbeatsblackfriday.com", + "dealtime.com", + "dealtree.org", + "deansofscience.ac.uk", + "dearne-coll.ac.uk", + "deas.ac.uk", + "deasians.com", + "debank.com", + "debian.org", + "debs.ac.uk", + "debug.com", + "debugproject.com", + "dec.ac.uk", + "decentr.net", + "dechamora.com", + "deck.ly", + "decodet.co", + "decorativemodels.com", + "decrypt.day", + "decymru.ac.uk", + "deed.ac.uk", + "deepdiscount.com", + "deeper.com", + "deepfake-porn.com", + "deepfakeporn.net", + "deepfreeze.co.uk", + "deepfreeze.com", + "deepfreeze.com.br", + "deepfreeze.eu", + "deepfreeze.net", + "deepfreeze.tech", + "deeping.ac.uk", + "deepl.com", + "deepmind.com", + "deepmind.google", + "deeside.ac.uk", + "deezer.com", + "defac.ac.uk", + "defenceacademy.ac.uk", + "definebabe.com", + "definefetish.com", + "degruyter.com", + "deja.com", + "delcam-ams.com", + "delcam-electrode.com", + "delcam-na.com", + "delcam-robotics.com", + "delcam-services.com", + "delcam.com", + "delcamconsulting.com", + "delcamforsolidworks.com", + "delcamna.com", + "delcamp.net", + "delcamtv.com", + "delcamuniversity.com", + "delcamusa.com", + "delicious.com", + "delicious.com.au", + "dell-brand.com", + "dell.com", + "dellcdn.com", + "dellsupportcenter.com", + "delltechnologies.com", + "deluxe.com.hk", + "delvenetworks.com", + "demand.ac.uk", + "demandware.com", + "demarco-archive.ac.uk", + "demdex.net", + "dementianet.ac.uk", + "dementiaresearchinstitute.ac.uk", + "democracy.earth", + "democrats.org", + "demonoid.is", + "demoprint.com", + "demos.ac.uk", + "demosisto.hk", + "den.ac.uk", + "dengeamerika.com", + "dengiamerika.com", + "deno.com", + "deno.land", + "dentalhypotheses.com", + "dentalschoolscouncil.ac.uk", + "dentpostgradwales.ac.uk", + "dependabot.com", + "depositphotos.com", + "deps.dev", + "deps.info", + "derby-college.ac.uk", + "derby.ac.uk", + "derbyals.ac.uk", + "derbycollege.ac.uk", + "derbyonline.ac.uk", + "derbyshire.ac.uk", + "derekhsu.homeip.net", + "deribit.com", + "derpibooru.org", + "derweb.ac.uk", + "derwen.ac.uk", + "derwencollege.ac.uk", + "derwentside.ac.uk", + "desc.se", + "descargasgay.com", + "desertbmw.com", + "design-ledrev.com", + "design-ledrevolution.com", + "design.google", + "designeriphonescases.com", + "designledrevolution.com", + "designsformovement.com", + "designxml.com", + "designxml.net", + "desihoes.com", + "desiporn.tube", + "desipornfilms.com", + "desipro.de", + "desiraesworld.com", + "desiresecrets.com", + "desk.com", + "desktopmovie.com", + "desktopmovie.net", + "desktopmovie.org", + "desktopmovies.net", + "desktopmovies.org", + "dessci.com", + "destinationbim.com", + "destroy-china.jp", + "detaliczny.com", + "detentiongirls.com", + "detroitnews.com", + "dettol-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.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.ru", + "dettolarabia.com", + "dettolcleannaija.com", + "dettolsitishield.co.in", + "dettolthailand.com", + "deutsch-sexfilme.com", + "deutsche-pornos-kostenlos.xxx", + "deutsche-welle.de", + "deutschepornos-kostenlos.net", + "deutschsex.com", + "dev-guardianapis.com", + "dev-theguardian.com", + "dev.to", + "devcon.org", + "developebp.ac.uk", + "developer-advisor.com", + "developria.com", + "deviantart.com", + "deviantart.net", + "deviantclip.com", + "device-manager.us", + "devilsfilm.com", + "devio.us", + "devm2m.com", + "devolution.ac.uk", + "devopsassessment.net", + "devopsms.com", + "devpn.com", + "devsitetest.how", + "devtools-paypal.com", + "devv.ai", + "dewcol.ac.uk", + "dewitwithdurex.com", + "dewsbury.ac.uk", + "dexterhorn.com", + "dezyred.com", + "dfas.mil", + "dfn.org", + "dfp6rglgjqszk.cloudfront.net", + "dgaqp.com", + "dgeft87wbj63p.cloudfront.net", + "dgg.gg", + "dghe.ac.uk", + "dgwav.com", + "dh44.lol", + "dharamsalanet.com", + "dharmakara.net", + "dhcp.biz", + "dhi.ac.uk", + "dhlestudio.com.co", + "diabetes-healthnet.ac.uk", + "diablo3.com", + "diabloimmortal.com", + "dialga.com", + "dialogflow.com", + "diamantewebcam.com", + "diamm.ac.uk", + "diamond.ac.uk", + "diamondgirls.co.uk", + "diamondgirlstudio.com", + "dianapost.com", + "dianepoppos.com", + "diaoyuislands.org", + "diasporas.ac.uk", + "dice.se", + "dicela.com", + "dicela.net", + "dickeomas.com", + "dickhardon.com", + "dickwhiteacademy.ac.uk", + "dictate.ms", + "didce.com", + "diddykongracing.com", + "didet.ac.uk", + "didilist.com", + "dierectv.com", + "dietandhealth.ac.uk", + "difangwenge.org", + "dify.ai", + "digg.com", + "digicert-cn.com", + "digicert-validation.com", + "digicert.com", + "digiland.tw", + "digimap.ac.uk", + "digisfera.com", + "digital-anime.com", + "digital-id.ch", + "digital-rb.com", + "digitalassetlinks.org", + "digitalcertvalidation.com", + "digitalcreativity.ac.uk", + "digitaldesire.com", + "digitalhub.com", + "digitalid.ch", + "digitallifespan.ac.uk", + "digitalnomadsproject.org", + "digitalocean.com", + "digitaloceanspaces.com", + "digitalpack.com", + "digitalplayground.com", + "digitalplaygroundnetwork.com", + "digitalprototyping.com", + "digitalscholarship.ac.uk", + "digitalsocialresearch.ac.uk", + "digitaltransformations.ac.uk", + "digitaltrends.com", + "digitisingscotland.ac.uk", + "digitop.ac.uk", + "digitrans.ac.uk", + "digitwin.ac.uk", + "diigo.com", + "dilber.se", + "dilcdn.com", + "dilstoncollege.ac.uk", + "dingchin.com.tw", + "dinotube.com", + "dipity.com", + "dippam.ac.uk", + "dirac.ac.uk", + "dirctv.com", + "direcpath.com", + "direcpath.net", + "directcreative.com", + "directtv-deals.tv", + "directtv-dish.com", + "directtv.net", + "directtvdeals.tv", + "directtvreviews.com", + "directv-4-you.com", + "directv-newyork.com", + "directv.com", + "directvadsales.com", + "directvatlantaga.com", + "directvboston.com", + "directvbundles.com", + "directvbusiness.com", + "directvbusinessmarket.com", + "directvcincinnatioh.com", + "directvcinema.com", + "directvconnect.com", + "directvcookevilletn.com", + "directvcrossvilletn.com", + "directvdealer.com", + "directvdeals.com", + "directvdealsnow.com", + "directvdsl.tv", + "directvforhotels.com", + "directvgrandslam.com", + "directvhouston.com", + "directvinternet.com", + "directvkentucky.com", + "directvlebanontn.com", + "directvlosangeles.com", + "directvmetropolisil.com", + "directvmonitoring.com", + "directvmurfreesborotn.com", + "directvnewhampshire.com", + "directvnow.com", + "directvoffercodes.com", + "directvonline.com", + "directvplans.com", + "directvpomise.com", + "directvpromise.com", + "directvpromotions.com", + "directvrebate.com", + "directvrichmond.com", + "directvsavings.com", + "directvsports.com", + "directvsundayticket.com", + "direectv.com", + "diretv.com", + "dirty.games", + "dirtyasiantube.com", + "dirtydoglinks.com", + "dirtyfarmer.com", + "dirtyflix.com", + "dirtyhomefuck.com", + "dirtyleague.com", + "dirtyonline.com", + "dirtypornvids.com", + "dirtyscat.org", + "dirtyshack.com", + "dirtyship.com", + "dis.gd", + "disability.ac.uk", + "disabilitytoolkits.ac.uk", + "disco-api.com", + "discoins.com", + "discomax.com", + "disconnect.me", + "discord-activities.com", + "discord.co", + "discord.com", + "discord.design", + "discord.dev", + "discord.gg", + "discord.gift", + "discord.gifts", + "discord.media", + "discord.new", + "discord.store", + "discord.tools", + "discordactivities.com", + "discordapp.com", + "discordapp.io", + "discordapp.net", + "discordcdn.com", + "discordmerch.com", + "discordpartygames.com", + "discordsays.com", + "discordstatus.com", + "discountbeatsbydre-us.com", + "discountbeatsstore.com", + "discountedporn.com", + "discountporn.club", + "discover.ac.uk", + "discovereconomics.ac.uk", + "discovery.ac.uk", + "discoveryinvestigations.ac.uk", + "discoveryplus.com", + "discreet.com", + "discuss.com.hk", + "discuss4u.com", + "discussionsapple.com", + "dish.com", + "dishworld.com", + "disinhe.ac.uk", + "disk.yandex", + "disney-asia.com", + "disney-discount.com", + "disney-plus.net", + "disney-studio.com", + "disney-studio.net", + "disney.asia", + "disney.be", + "disney.bg", + "disney.ca", + "disney.ch", + "disney.co.il", + "disney.co.jp", + "disney.co.kr", + "disney.co.th", + "disney.co.uk", + "disney.co.za", + "disney.com", + "disney.com.au", + "disney.com.br", + "disney.com.hk", + "disney.com.tw", + "disney.cz", + "disney.de", + "disney.dk", + "disney.es", + "disney.fi", + "disney.fr", + "disney.gr", + "disney.hu", + "disney.id", + "disney.in", + "disney.io", + "disney.it", + "disney.my", + "disney.nl", + "disney.no", + "disney.ph", + "disney.pl", + "disney.pt", + "disney.ro", + "disney.ru", + "disney.se", + "disney.sg", + "disneyadsales.com", + "disneyarena.com", + "disneyaulani.com", + "disneybaby.com", + "disneycareers.com", + "disneychannelonstage.com", + "disneychannelroadtrip.com", + "disneycruisebrasil.com", + "disneyenconcert.com", + "disneyhentai.com", + "disneyiejobs.com", + "disneyinflight.com", + "disneyinternational.com", + "disneyinternationalhd.com", + "disneyjunior.com", + "disneyjuniortreataday.com", + "disneylatino.com", + "disneymagicmoments.co.il", + "disneymagicmoments.co.uk", + "disneymagicmoments.co.za", + "disneymagicmoments.de", + "disneymagicmoments.es", + "disneymagicmoments.fr", + "disneymagicmoments.gen.tr", + "disneymagicmoments.gr", + "disneymagicmoments.it", + "disneymagicmoments.pl", + "disneymagicmomentsme.com", + "disneyme.com", + "disneymeetingsandevents.com", + "disneymovieinsiders.com", + "disneymusicpromotion.com", + "disneynewseries.com", + "disneynow.com", + "disneypeoplesurveys.com", + "disneyplus.com", + "disneyredirects.com", + "disneysrivieraresort.com", + "disneystore.com", + "disneystreaming.com", + "disneysubscription.com", + "disneytickets.co.uk", + "disneyturkiye.com.tr", + "disneytvajobs.com", + "disneyworld-go.com", + "disp.cc", + "disqus.com", + "disquscdn.com", + "disqusservice.com", + "distillate.ac.uk", + "distinct.ac.uk", + "dit-inc.us", + "divas.com.uy", + "diversityuk.ac.uk", + "diyarbakirescort.com", + "diyuser.buzz", + "dizhidizhi.com", + "dizhuzhishang.com", + "djangosnippets.org", + "djkav.mom", + "djorz.com", + "djreprints.com", + "dkbeatsbydre.com", + "dkcloud.cc", + "dkk37.com", + "dkr.com", + "dkrecttv.com", + "dl-iphone.com", + "dl-laby.jp", + "dl.ac.uk", + "dl4d.ac.uk", + "dlap001.xyz", + "dlap301.com", + "dldlinks.com", + "dldshare.net", + "dlercloud.com", + "dlercloud.me", + "dlercloud.org", + "dleris.best", + "dlfacebook.com", + "dlhe.ac.uk", + "dlive.tv", + "dls.ac.uk", + "dlsite.com", + "dlsite.com.tw", + "dlsite.jp", + "dlsitenews.com", + "dlsitestudio.com", + "dlyoutube.com", + "dm-event.net", + "dm530.net", + "dmarcnetworks.com", + "dmc.nico", + "dmcdn.net", + "dmed.technology", + "dmgmediaprivacy.co.uk", + "dmhy.org", + "dml.ac.uk", + "dmm-extension.com", + "dmm.co.jp", + "dmm.com", + "dmmapis.com", + "dmmrex.com", + "dmu.ac.uk", + "dmuk.ac.uk", + "dna-network.ac.uk", + "dna.ac.uk", + "dnaav.com", + "dnai.in", + "dnaindia.com", + "dnaspaces.io", + "dncolleges.ac.uk", + "dndbeyond.com", + "dns-dns.com", + "dns-stuff.com", + "dns.google", + "dns.sb", + "dns04.com", + "dns05.com", + "dns1.us", + "dns2.us", + "dns2go.com", + "dnscrypt.org", + "dnset.com", + "dnsrd.com", + "dnssec.net", + "dnsvisa.com", + "dnvod.tv", + "dnvodcdn.me", + "do.co", + "dobbyporn.com", + "dobendan.de", + "doceapower.com", + "docker.com", + "docker.io", + "dockerizer.com", + "docleradn.com", + "doclercdn.com", + "docs.com", + "docs.new", + "docs.rs", + "doctor-videos.com", + "doctorvoice.org", + "documentforce.com", + "documentingreality.com", + "docusend.ac.uk", + "dodgersexcartoons.com", + "dodi-repacks.download", + "dodi-repacks.site", + "dodv.com", + "doeda.com", + "dogatch.jp", + "dogcumshot.net", + "dogecoin.com", + "dogfart.com", + "dogfartnetwork.com", + "dogmovie.net", + "dogofcum.com", + "dogslife.ac.uk", + "dogspics.net", + "doi.info", + "doi.org", + "doitpoms.ac.uk", + "dojin-dl.com", + "dojin.com", + "dojindb.net", + "dojinmanga.net", + "dojinwatch.com", + "dok-forum.net", + "dokusho-ojikan.jp", + "dolc.de", + "dolf.org.hk", + "dollarfotoclub.com", + "dollarphotoclub.com", + "dollarphotosclub.com", + "dollf.com", + "dolphiners.com", + "domain.club.tw", + "domain.glass", + "domains.google", + "domaintoday.com.au", + "dombosco.com.br", + "domesticabuserisk.ac.uk", + "domywife.com", + "don.ac.uk", + "donatecarsoh.org", + "doncaster.ac.uk", + "donga.com", + "dongtaiwang.com", + "dongtaiwang.net", + "dongyangjing.com", + "donkeykongcountryreturns.com", + "donkparty.com", + "donmai.us", + "donpornogratis.com", + "donsnaughtymodels.com", + "dontbubble.us", + "dontfilter.us", + "dontmovetochina.com", + "donttrack.us", + "doodhwali.com", + "doom.com", + "doom9.org", + "dopaminegirl.com", + "dorjeshugden.com", + "dorset-acl.ac.uk", + "dorset-al.ac.uk", + "doseofporn.com", + "dot-mac.de", + "dot.net", + "dotcernpilot.info", + "dotdeb.org", + "dotfacebook.com", + "dotfacebook.net", + "dotfreesex.com", + "dotherex.com", + "dothq.org", + "dotmac.de", + "dotplane.com", + "dotrural.ac.uk", + "dotsub.com", + "dotvpn.com", + "doub.io", + "doubibackup.com", + "doubleclick-cn.net", + "doubleclick.cn", + "doubleclick.com", + "doubleclick.net", + "doublethinklab.org", + "doubmirror.cf", + "douchi.space", + "doufurufabu.xyz", + "dougscripts.com", + "douhokanko.net", + "doujin-eromanga.com", + "doujin-freee.com", + "doujin-info.net", + "doujin-night.com", + "doujincafe.com", + "doujinfree.com", + "doujinland.info", + "doujinnomori.com", + "doujins.com", + "doure.net", + "douwriteright.com", + "douya.org", + "douyintt10.me", + "douzinnsi-eromannga.com", + "dovercollege.ac.uk", + "dovertechnicalcollege.ac.uk", + "dowei.org", + "dowjones.com", + "dowjones.io", + "dowjoneson.com", + "download.com", + "downloadpass.com", + "downloadsforipod.com", + "dphk.org", + "dpoc.ac.uk", + "dpp.org.tw", + "dpr.info", + "dpscitt.ac.uk", + "dqrpb9wgowsf5.cloudfront.net", + "draftjs.org", + "dragonage.com", + "dragonagekeep.com", + "dragonagemovie.com", + "dragonex.io", + "dragonhentai.net", + "dragonip.ac.uk", + "dragoniscoming.com", + "dragonsprings.org", + "drainage.com", + "drakemarineinstitute.ac.uk", + "drawnevidence.ac.uk", + "drbdsmporn.com", + "drbeatsukmart.com", + "drbizzaro.com", + "drbl.in", + "drdre-beats.com", + "drdrebeats-chen.com", + "drdrebeats-headphone.com", + "drdrebeats-usa.com", + "drdrebeatsale.com", + "drdrebeatsbillig.com", + "drdrebeatsdesale.com", + "drdrebeatsdiscount.com", + "drdrebeatsforu.com", + "drdrebeatsretail2013.com", + "drdrebeatssale7.com", + "drdrebeatsuk.com", + "drdrefnac.com", + "drdreheadphonebeats.com", + "drdreheadphonekey.com", + "drdreheadphonesusstore.com", + "drdremonster-beats.com", + "drdremonsterdre.com", + "drdreprobeatssale.com", + "dream-cdt.ac.uk", + "dreamamateurs.com", + "dreambmw.ca", + "dreamforce.com", + "dreammovies.com", + "dreamteamfc.com", + "dreamtoplay.com", + "dreamworks.com", + "drebeats-australia.com", + "drebeats-france.com", + "drebeats-monster.com", + "drebeats-monsteraustralia.com", + "drebeats-monsterusa.com", + "drebeats-singapore.com", + "drebeats-singapore.net", + "drebeats-singaporecheap.com", + "drebeats-singaporecheap.net", + "drebeats-solo.com", + "drebeats-studio.com", + "drebeatsaustralia-cheap.com", + "drebeatsaustralia-cheap.net", + "drebeatsbuy.com", + "drebeatsbydreoutlet.com", + "drebeatscanada.com", + "drebeatsdeutschland.net", + "drebeatsforsaleus.com", + "drebeatsheadphones-nz.com", + "drebeatshome.com", + "drebeatsoldes.com", + "drebeatsoutletstore.com", + "drebeatspill.com", + "drebeatssite.com", + "drebeatssolocybermondaysale.com", + "drebeatsstudio2013.com", + "drebeatstudio.com", + "drebyby.com", + "dreeam.ac.uk", + "dremonsterbeatsoutlets.com", + "dreprobeats.com", + "dreprofy.com", + "drepung.org", + "drg.ac.uk", + "drgan.net", + "dri.ac.uk", + "dribbble.com", + "drindod.ac.uk", + "driverxxx.com", + "drivevideo.xyz", + "driving.co.uk", + "drkogyi.com", + "drmario-world.com", + "drmgmggyi-mm.blogspot.com", + "drmingxia.org", + "drnastran.com", + "drns.ac.uk", + "dronedj.com", + "dropbooks.tv", + "dropbox-dns.com", + "dropbox.com", + "dropbox.tech", + "dropboxapi.com", + "dropboxbusiness.com", + "dropboxcaptcha.com", + "dropboxforum.com", + "dropboxforums.com", + "dropboxinsiders.com", + "dropboxmail.com", + "dropboxpartners.com", + "dropboxstatic.com", + "dropboxusercontent.com", + "drsunacademy.com", + "drtuber.com", + "drunk6.com", + "drunkenstepfather.com", + "drunkentop.com", + "drweb-av.de", + "drweb-av.es", + "drweb-av.it", + "drweb-av.pl", + "drweb.by", + "drweb.cn", + "drweb.co.jp", + "drweb.com", + "drweb.fr", + "drweb.kz", + "drweb.uz", + "ds0h3roq6wcgc.cloudfront.net", + "dscis.ac.uk", + "dscn.info", + "dses.ac.uk", + "dsex.to", + "dsfc.ac.uk", + "dsl.ac.uk", + "dslr.net", + "dslreports.com", + "dsmtp.com", + "dssott.com", + "dst-dtc.ac.uk", + "dstk.dk", + "dsw.ac.uk", + "dswz88.xyz", + "dsyiren.com", + "dt-toolkit.ac.uk", + "dtc-online.ac.uk", + "dtci.co", + "dtci.technology", + "dtdns.net", + "dtiblog.com", + "dtic.mil", + "dtlgalleryint.cloudapp.net", + "dtsell.com", + "dtv2009offers.com", + "dtvce.com", + "dtwang.org", + "dualeotruyen1s.com", + "duanzhihu.com", + "dubai-escort-list.com", + "dubox.com", + "ducere.ac.uk", + "duchy.ac.uk", + "duck.co", + "duck.com", + "duckdns.org", + "duckduckco.com", + "duckduckco.de", + "duckduckgo.ca", + "duckduckgo.co", + "duckduckgo.co.uk", + "duckduckgo.com", + "duckduckgo.com.mx", + "duckduckgo.com.tw", + "duckduckgo.de", + "duckduckgo.dk", + "duckduckgo.in", + "duckduckgo.jp", + "duckduckgo.ke", + "duckduckgo.mx", + "duckduckgo.nl", + "duckduckgo.org", + "duckduckgo.pl", + "duckduckgo.sg", + "duckduckgo.uk", + "duckduckhack.com", + "duckgo.com", + "duckload.com", + "duckmovie.com", + "duckmylife.com", + "ducksear.ch", + "duckside.com", + "dudethrill.com", + "dudley.ac.uk", + "dudleycol.ac.uk", + "dudleylearners.ac.uk", + "dudleylearning.ac.uk", + "duga.jp", + "duihua.org", + "duihuahrjournal.org", + "dukgo.com", + "dulceecuador.com", + "dumb1.com", + "dumgal.ac.uk", + "dump.xxx", + "dumpxxx.net", + "dun.ac.uk", + "dund.ac.uk", + "dundee-tech.ac.uk", + "dundee.ac.uk", + "dundeeandangus.ac.uk", + "dundeeandanguscollege.ac.uk", + "dundeecoll.ac.uk", + "dundeecollege.ac.uk", + "dune.ac.uk", + "dungeonkeeper.cn", + "dungeonkeeper.com", + "dungeonkeeper.com.cn", + "dunstable.ac.uk", + "dunstaffnage-marine-lab.ac.uk", + "dunyabulteni.net", + "duolaapian126.xyz", + "duolaapian127.xyz", + "duolingo.com", + "duoweitimes.com", + "duoweiweek.com", + "duping.net", + "duplicati.com", + "dupola.com", + "dupola.net", + "dur.ac.uk", + "durex-shop.ch", + "durex-shopline.com", + "durex-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.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.com", + "durexcanada.com", + "durexchina.com", + "durexindia.com", + "durexloveclub.com", + "durexukraine.com", + "durexusa.com", + "durham.ac.uk", + "durhampriory.ac.uk", + "dushi.ca", + "dutch.ac.uk", + "dutrai.com", + "duyaoss.com", + "duyaossr.com", + "dvdpac.com", + "dvdstudiopro.biz", + "dvdstudiopro.com", + "dvdstudiopro.info", + "dvdstudiopro.net", + "dvdstudiopro.org", + "dvdstudiopro.us", + "dvdtrailertube.com", + "dvorak.org", + "dw-world.com", + "dw-world.de", + "dw.com", + "dw.de", + "dweb.link", + "dwg.com", + "dwgtrueconvert.com", + "dwgtrueview.com", + "dwheeler.com", + "dwl.ac.uk", + "dwnews.com", + "dwnews.net", + "dx9527.cc", + "dxiong.com", + "dxyav.co", + "dydx.exchange", + "dyfl1.pw", + "dykkng5hnh52u.cloudfront.net", + "dykycl.com", + "dynacw.co.jp", + "dynacw.com", + "dynacw.com.cn", + "dynacw.com.hk", + "dynacw.com.tw", + "dynafleetonline.com", + "dynamic-dns.net", + "dynamicdialects.ac.uk", + "dynamicdns.biz", + "dynamicdns.co.uk", + "dynamicdns.me.uk", + "dynamicdns.org.uk", + "dynamics.com", + "dynamobuilds.com", + "dynamopackages.com", + "dynamoreach.com", + "dynawebinc.com", + "dyncdn.me", + "dyndns-ip.com", + "dyndns-pics.com", + "dyndns.org", + "dyndns.pro", + "dynssl.com", + "dynu.com", + "dynu.net", + "dysfz.cc", + "dzen.ru", + "dzze.com", + "e-bay.com", + "e-bay.it", + "e-bay.net", + "e-c-a.ac.uk", + "e-cba.org", + "e-classical.com.tw", + "e-gold.com", + "e-goods.ru", + "e-hentai.org", + "e-hentaidb.com", + "e-htpx.ac.uk", + "e-info.org.tw", + "e-learningnorthwest.ac.uk", + "e-learningresearch.ac.uk", + "e-liv.ac.uk", + "e-merlin.ac.uk", + "e-rihs.ac.uk", + "e-science.ac.uk", + "e-scrf.ac.uk", + "e-studio.ac.uk", + "e-szigno.hu", + "e-timing.ne.jp", + "e-traderland.net", + "e-tugra.com", + "e-zone.com.hk", + "e123.hk", + "e3an.ac.uk", + "e53w.com", + "e621.net", + "ea-anz-press.com", + "ea.com", + "eaaccess.com", + "eablackbox.com", + "eac-cdn.com", + "eacashcard.com", + "eachpay.com", + "eachpay.net", + "eacodigos.com", + "eadultgames.com", + "eafootballworld.com", + "eaifhe.ac.uk", + "eakorea.co.kr", + "ealingcoll.ac.uk", + "eamirrorsedge.com", + "eamobile.com", + "eamythic.com", + "eamythic.net", + "eandc-sirgar.ac.uk", + "eanordic.com", + "eaplay.com", + "earlham.ac.uk", + "earlhaminstitute.ac.uk", + "earlyenglishlaws.ac.uk", + "earlymoderndressandtextiles.ac.uk", + "earlyphonography.ac.uk", + "earlytibet.com", + "earngeek.com", + "earphonescheapest.com", + "earpod.net", + "earthcam.com", + "earthsciencescotland.ac.uk", + "earthvpn.com", + "ease.ac.uk", + "easeit-eng.ac.uk", + "easic.com", + "easports.com", + "easports.jp", + "easportsactive.com", + "easportsactiveonline.com", + "easportsfootball.com", + "easportsfootballclub.com", + "easportsmma.com", + "easportsworld.com", + "east-anglia.ac.uk", + "east-london.ac.uk", + "east-yorks-coll.ac.uk", + "east15.ac.uk", + "eastantrim-institute.ac.uk", + "eastbabes.com", + "eastberks.ac.uk", + "eastchem.ac.uk", + "eastcoast.ac.uk", + "eastdevon.ac.uk", + "eastdurham.ac.uk", + "eastendcbc.ac.uk", + "eastern-ark.com", + "easternarc.ac.uk", + "easternlightning.org", + "eastkent.ac.uk", + "eastkentcollege.ac.uk", + "eastleigh.ac.uk", + "eastmallingresearch.ac.uk", + "eastmidlandscetls.ac.uk", + "eastnorfolk.ac.uk", + "easton-college.ac.uk", + "easton.ac.uk", + "eastonotley.ac.uk", + "eastore.com", + "eastridingadultlearn.ac.uk", + "eastridingcollege.ac.uk", + "eastscotbiodtp.ac.uk", + "eastsurrey.ac.uk", + "eastsurreycollege.ac.uk", + "easttouch.com.hk", + "eastturkestan.com", + "eastturkistan-gov.org", + "eastturkistan.net", + "eastturkistancc.org", + "eastturkistangovernmentinexile.us", + "eastview.com", + "eastweek.com.hk", + "easy-jtag.com", + "easy.ac", + "easyanticheat.net", + "easyca.ca", + "easylist.to", + "easynike.com", + "easypic.com", + "easysexporn.com", + "eater.com", + "eatthatfrog.ac.uk", + "eb.com", + "ebahy.com", + "ebalovo.com", + "ebam.ac.uk", + "ebay-25-assets.s3-us-west-1.amazonaws.com", + "ebay-authenticate.net", + "ebay-confirm.com", + "ebay-course.com", + "ebay-cz.com", + "ebay-delivery.com", + "ebay-discoveries.com", + "ebay-fashion.com", + "ebay-inc.com", + "ebay-inc.net", + "ebay-inc.org", + "ebay-online.com", + "ebay-sales.com", + "ebay-stories.com", + "ebay-us.com", + "ebay-vacation.com", + "ebay.at", + "ebay.be", + "ebay.ca", + "ebay.ch", + "ebay.co.nz", + "ebay.co.uk", + "ebay.co.ve", + "ebay.co.za", + "ebay.com", + "ebay.com.ar", + "ebay.com.au", + "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.nl", + "ebay.org", + "ebay.ph", + "ebay.pk", + "ebay.pl", + "ebay.sg", + "ebay.us", + "ebay.vn", + "ebay25.com", + "ebay68.com", + "ebaya.com", + "ebayads.com", + "ebayads.net", + "ebayadvertising.com", + "ebayanunsios.net", + "ebayauction.com", + "ebayaustralia.com", + "ebayauthenticate.com.cn", + "ebaybags.com", + "ebaybank.com", + "ebaybenefits.com", + "ebayboutique.com", + "ebayca.com", + "ebayca.org", + "ebaycafe.com", + "ebaycar.com", + "ebaycareers.com", + "ebaycbt.co.kr", + "ebaycdn.net", + "ebaychina.net", + "ebayclassifieds.com", + "ebayclassifieds.info", + "ebayclassifieds.org", + "ebayclassifieds.tv", + "ebayclassifiedsgroup.com", + "ebayclassifiedsgroup.info", + "ebayclassifiedsgroup.org", + "ebayclassifies.com", + "ebayclub.com", + "ebaycoins.com", + "ebaycom.com", + "ebaycommercenetwork.com", + "ebaycourse.com", + "ebayd.com", + "ebayde.com", + "ebaydlassifieds.com", + "ebaydts.com", + "ebayedu.com", + "ebayeletro.com", + "ebayenterprise.com", + "ebayenterprise.info", + "ebayenterprise.net", + "ebayenterprise.tv", + "ebayetc.com", + "ebayexpress.sg", + "ebayfashion.com", + "ebayfashion.net", + "ebayforcharity.org", + "ebayforeclosure.org", + "ebayfrance.com", + "ebayglobalshipping.com", + "ebaygroup.com", + "ebayhabit.com", + "ebayheels.com", + "ebayhots.com", + "ebayimg.com", + "ebayinc.com", + "ebayinc.net", + "ebayinc.org", + "ebayincconnectedcommerce.net", + "ebayinkblog.com", + "ebayinternetsalestax.com", + "ebayit.com", + "ebayjewelry.com", + "ebayjob.com", + "ebayla.org", + "ebaylisting.com", + "ebaylocal.net", + "ebaylocationsdevacances.com", + "ebaymag.com", + "ebaymainstreet.com", + "ebaymall.com", + "ebaymarketplace.net", + "ebaymotors.ca", + "ebaymotors.com", + "ebaymotors.org", + "ebaymotorsblog.com", + "ebaynow.com", + "ebaynyc.com", + "ebayon.com", + "ebayon.net", + "ebayoncampus.com", + "ebayopen.com", + "ebayopensource.com", + "ebayopensource.net", + "ebaypakistan.net", + "ebaypark.com", + "ebayparts.com", + "ebayprivacycenter.com", + "ebayqq.com", + "ebayradio.com", + "ebayrtm.com", + "ebayseller.com", + "ebayshoesstore.com", + "ebayshop.com", + "ebayshop111.com", + "ebayshopping.org", + "ebaysocial.com", + "ebaysocial.ru", + "ebaysoho.com", + "ebaysohos.com", + "ebaystatic.com", + "ebaystore.com", + "ebaystore77.com", + "ebaystyle.com", + "ebaysweden.com", + "ebayt.com", + "ebaytechblog.com", + "ebaytopratedseller.net", + "ebaytrading.com", + "ebaytradingassistant.com", + "ebaytv.org", + "ebayuae.net", + "ebayvakantiehuizen.com", + "ebayvalet.com", + "ebayvietnam.net", + "ebayworlds.com", + "ebayy.com", + "ebc.net.tw", + "ebenporno.com", + "ebi.ac.uk", + "ebnet.ac.uk", + "ebony-beauty.com", + "ebonyinlove.com", + "ebonywebcamhub.com", + "eboobstore.com", + "ebookbrowse.com", + "ebookee.com", + "ebookforipad.com", + "ebrahimcollege.ac.uk", + "ebrc.ac.uk", + "ebs.ac.uk", + "ebsco.com", + "ebscohost.com", + "ebsl.ac.uk", + "ebslondon.ac.uk", + "ebtcbank.com", + "ebuyheadphones.com", + "eca.ac.uk", + "ecampus-leeds.ac.uk", + "ecc.ac.uk", + "ecchinohentai.ru", + "ecci.ac.uk", + "ecclescollege.ac.uk", + "ecdc.ac.uk", + "ecert.gov.hk", + "eceta.ac.uk", + "ecfa.org.tw", + "ecgapp.net", + "echainhost.com", + "echichimato.com", + "echocdn.com", + "echofon.com", + "echosign.com", + "ecimg.tw", + "eckosia.org", + "eclipse.ac.uk", + "eclw.ac.uk", + "ecministry.net", + "ecn.ac.uk", + "ecoforme.jp", + "economicfutures.ac.uk", + "economics.ac.uk", + "economicsnetwork.ac.uk", + "economist.com", + "economistgroup.com", + "economistgroupcareers.com", + "ecos.ac.uk", + "ecosystemservices.ac.uk", + "ecotect.com", + "ecotect.net", + "ecpa.fr", + "ecr.aws", + "ecsa.ac.uk", + "ecscad.com", + "ecspublisher.com", + "ecstart.com", + "ecu.ac.uk", + "ecuatorianas.best", + "ecw.ac.uk", + "ed-coll.ac.uk", + "ed.ac.uk", + "ed6.ac.uk", + "edam.ac.uk", + "edc.ac.uk", + "edcity.hk", + "edcoll.ac.uk", + "edengay.net", + "edge-hill-college.ac.uk", + "edgecastcdn.net", + "edgedatg.com", + "edgefonts.net", + "edgehill.ac.uk", + "edgehilluniversity.ac.uk", + "edgehotelschool.ac.uk", + "edgekey.net", + "edgemeplease.com", + "edgesuite.net", + "edhcc.ac.uk", + "edicypages.com", + "edifhe.ac.uk", + "edina.ac.uk", + "edinburgh.ac.uk", + "edinburghcollege.ac.uk", + "edinburghstelford.ac.uk", + "edinburghstelfordcollege.ac.uk", + "edinburghtc.ac.uk", + "edisebay.com", + "editorx.com", + "edlab.ac.uk", + "edmontonchina.cn", + "edmontonservice.com", + "edninfo.com", + "edns.biz", + "edoors.com", + "edshare.ac.uk", + "edtech.ac.uk", + "edu-research.org", + "edu.ir", + "edubridge.com", + "education-cadcam.com", + "educationlondonconnect.ac.uk", + "educationpartnershipne.ac.uk", + "educationpartnershipnortheast.ac.uk", + "eduplus.hk", + "edupro.org", + "eduroam.ac.uk", + "eduserv.ac.uk", + "edward-greene.ac.uk", + "edwardllwyd.ac.uk", + "edx-cdn.org", + "edx.org", + "eebay.com", + "eecm.ac.uk", + "eenike.com", + "eep.ac.uk", + "eera.ac.uk", + "ees.ac.uk", + "eesti.ee", + "eevl.ac.uk", + "eevlextra.ac.uk", + "eevlxtra.ac.uk", + "eevpn.com", + "efc.ac.uk", + "efcc.org.hk", + "efetedc.ac.uk", + "eff.org", + "effers.com", + "efficiencyexchange.ac.uk", + "efksoft.com", + "efproject.net", + "efreenews.com", + "efs.ac.uk", + "efukt.com", + "efutures.ac.uk", + "egghead.io", + "egmontbooks.co.uk", + "egotastic.com", + "egta.com", + "egyptrevolution2011.ac.uk", + "ehche.ac.uk", + "ehgt.org", + "ehtracker.org", + "ehu.ac.uk", + "ehv.cc", + "ehwiki.org", + "eic-av.com", + "eicdt.ac.uk", + "eidc.ac.uk", + "eighteen-store18x.jp", + "eilieili.cc", + "einfrastructureforum.ac.uk", + "einfrastructuresouth.ac.uk", + "einstein.com", + "eira.ac.uk", + "eireinikotaerukai.com", + "eisbb.com", + "eiu.com", + "eius.ac.uk", + "ekcgroup.ac.uk", + "ekhindi.com", + "ekhokavkaza.com", + "eklearning.ac.uk", + "ekolojik.org", + "eksisozluk.com", + "el-ladies.com", + "elanguages.ac.uk", + "elasticbeanstalk.com", + "elatt.ac.uk", + "elc.ac.uk", + "elconfidencial.com", + "elder-cove.ac.uk", + "elderscrolls.com", + "elearning.ac.uk", + "elearningnortheast.ac.uk", + "elearningresearch.ac.uk", + "electbabe.com", + "electionsmeter.com", + "electrek.co", + "electricalmachineshub.ac.uk", + "electricluxury.com", + "electrochem.org", + "electronicarts.com", + "electronicarts.fr", + "electronjs.org", + "element.io", + "elephantlist.com", + "elephantsdream.org", + "elephanttube.com", + "elephanttubenew.com", + "elgaronline.com", + "elgoog.im", + "elib.ac.uk", + "elifesciences.org", + "elihe.ac.uk", + "elite.ac.uk", + "elite.com", + "elitebabes.com", + "eliteindianporn.com", + "elitvip.ru", + "elixir-lang.org", + "elixir.ac.uk", + "elizabethmontagunetwork.ac.uk", + "ellawine.org", + "elliotthudsoncollege.ac.uk", + "elmwood.ac.uk", + "elne.ac.uk", + "elog-ch.com", + "elog-ch.net", + "elp.ac.uk", + "elpais.com", + "elpornoamateur.com", + "elpube-scat-movies.blogspot.com", + "elrah.ac.uk", + "elrc.ac.uk", + "elrepo.org", + "els-cdn.com", + "elsa-project.ac.uk", + "elsa.ac.uk", + "elsevier-ae.com", + "elsevier.com", + "elsevier.io", + "elt.ac.uk", + "eltondisney.com", + "elum.ac.uk", + "em-toolkit.ac.uk", + "emac.co.in", + "emac.in", + "emaga.com", + "emagic.de", + "emahsn.ac.uk", + "email-bimm.ac.uk", + "emanna.com", + "emas.ac.uk", + "embase.com", + "embed-cdn.com", + "embed.ly", + "embedly.com", + "ember3dp.com", + "emberprinter.com", + "embl-ebi.ac.uk", + "embl-hamburg.de", + "embl.de", + "embl.fr", + "embl.it", + "embl.org", + "emblstatic.net", + "embr.in", + "embs.ac.uk", + "embs.org", + "emc.ac.uk", + "emc.com", + "emcs.org", + "eme.ac.uk", + "emec.ac.uk", + "emedlab.ac.uk", + "emerald.com", + "emergingsolutions.com", + "emgrad.ac.uk", + "emidsvikings.ac.uk", + "emilylau.org.hk", + "emo-pain.ac.uk", + "emojipedia.org", + "emol.ac.uk", + "emome.net", + "emory.edu", + "empero-right.mom", + "empfil.com", + "empflix.com", + "emphasis.ac.uk", + "empornium.site", + "emr.ac.uk", + "ems-ph.org", + "ems.ac.uk", + "emttp.ac.uk", + "emua.ac.uk", + "emule-ed2k.com", + "emulefans.com", + "emuparadise.me", + "emwprep.ac.uk", + "en-compass.ac.uk", + "enablementadobe.com", + "enanyang.my", + "enbit.ac.uk", + "enca.com", + "encoretvb.com", + "encrypt.me", + "encuentroscasualesoecuador.com", + "encyclopedia.com", + "enema-porn.com", + "enema-videos.com", + "enemabasics.com", + "enemaexperiences.com", + "enemahistory.com", + "enemainformation.com", + "enemaporn.blogspot.com", + "enemarotica.com", + "enemas4fun.com", + "enemasexfetish.com", + "enematube.com", + "energy2050.ac.uk", + "energybiographies.ac.uk", + "energyforchange.ac.uk", + "energystarbuildings.com", + "energystorage-cdt.ac.uk", + "enewstree.com", + "enf-cmnf.com", + "enfa.co.id", + "enfa.com.vn", + "enfaaplus.com", + "enfababy.com", + "enfabebe.com", + "enfabebe.com.br", + "enfabebe.com.co", + "enfabebe.com.do", + "enfabebe.com.ec", + "enfabebe.com.mx", + "enfabebe.com.pe", + "enfabebe.com.ve", + "enfabebe3.com.ar", + "enfagrow.co.in", + "enfagrow.com.bn", + "enfagrow.com.my", + "enfagrow.com.ph", + "enfagrow.com.sg", + "enfagrow4.com", + "enfal.de", + "enfamama.com.ar", + "enfamama.com.ph", + "enfamil.ca", + "enfamil.com", + "enfamil.es", + "enfamil.pl", + "enfamil.pt", + "enfasmart.com", + "engadget.com", + "engagedaily.org", + "engageinresearch.ac.uk", + "engageni.ac.uk", + "engcetl.ac.uk", + "engineering.ac.uk", + "engineeringnonlinearity.ac.uk", + "engineeringsigns.ac.uk", + "engineeringvillage.com", + "englishassociation.ac.uk", + "englishforeveryone.org", + "englishfromengland.co.uk", + "englishpen.org", + "engsc.ac.uk", + "enhancementthemes.ac.uk", + "enjoyasianporn.com", + "enjoyfuck.com", + "enlighten.org.tw", + "enmat.ac.uk", + "enorf.ac.uk", + "enos.ac.uk", + "enpirion.com", + "ensa.ac.uk", + "ensemble.ac.uk", + "ensemblepurchasing.ac.uk", + "ensfc.ac.uk", + "enspireformula.com", + "enteentegeh.de", + "entensity.net", + "entermap.com", + "entermediadb.net", + "entermediadb.org", + "enterprise.ac.uk", + "enterprisebydesign.ac.uk", + "enterprisepaging.com", + "enterpriseresearch.ac.uk", + "enterprisessl.com", + "entnt.com", + "entrust.net", + "entrustdatacard.com", + "enveast.ac.uk", + "environment-health.ac.uk", + "environment.google", + "epa.gov.tw", + "epac.to", + "epc.ac.uk", + "epic.ac.uk", + "epic.network", + "epicbrowser.com", + "epicgames.com", + "epicgames.dev", + "epicgamescdn.com", + "epicreads.com", + "epics.ac.uk", + "epicure.ac.uk", + "epigeum.com", + "epikporn.com", + "epinions.com", + "episcopalchurch.org", + "episodic.com", + "epizy.com", + "epne.ac.uk", + "epoch.cloud", + "epoch.org.il", + "epochbase.com", + "epochbuy.com", + "epochcar.com", + "epochhk.com", + "epochmall.com", + "epochmediagroup.com", + "epochshop.com", + "epochstories.com", + "epochtime.com", + "epochtimes-bg.com", + "epochtimes-romania.com", + "epochtimes.bg", + "epochtimes.co.il", + "epochtimes.co.kr", + "epochtimes.co.uk", + "epochtimes.com", + "epochtimes.com.au", + "epochtimes.com.br", + "epochtimes.com.sg", + "epochtimes.com.tw", + "epochtimes.com.ua", + "epochtimes.cz", + "epochtimes.de", + "epochtimes.eu", + "epochtimes.fr", + "epochtimes.ie", + "epochtimes.it", + "epochtimes.jp", + "epochtimes.nl", + "epochtimes.pl", + "epochtimes.ru", + "epochtimes.se", + "epochtimeshk.org", + "epochtimestr.com", + "epochweek.com", + "epochweekly.com", + "eporner.com", + "eportfolios.ac.uk", + "eppi.ac.uk", + "epping-forest.ac.uk", + "eprc.com.hk", + "epress.ac.uk", + "eprice.com.hk", + "eprintsw.com", + "eps.ac.uk", + "epsilon.ac.uk", + "epsrc-centre-lime.ac.uk", + "epsrc-cim-macromoleculartherapies.ac.uk", + "epsrc.ac.uk", + "equal.ac.uk", + "equalityhigher.ac.uk", + "equator.ac.uk", + "equinenow.com", + "equistudy.ac.uk", + "era.ac.uk", + "erabaru.net", + "eracom.com.tw", + "eraofconnection.com", + "erasmus.ac.uk", + "eraysoft.com.tr", + "erbecdt.ac.uk", + "erc.ac.uk", + "erepublik.com", + "eres.ac.uk", + "eresearchsouth.ac.uk", + "eri.ac.uk", + "erights.net", + "erini.ac.uk", + "erito.com", + "eriversoft.com", + "erktv.com", + "erlang.org", + "ernestmandel.org", + "ernw.ac.uk", + "ero-anime.net", + "ero-comic-hunter.net", + "ero-kawa.com", + "ero-labs.cloud", + "ero-labs.com", + "ero-labs.fun", + "ero-labs.net", + "ero-labs.online", + "ero-labs.site", + "ero-ma-nia.com", + "ero-manga-platinum.net", + "ero-mangalife.com", + "eroan.xyz", + "erocurves.com", + "erodaizensyu.com", + "erodayo.com", + "erodougazo.com", + "erodoujinlog.com", + "erodoujinshi-world.com", + "erodoujinworld.com", + "eroelog.com", + "eroero69.work", + "erofights.com", + "erofullsets.net", + "erofus.com", + "erogames.com", + "erogazo-jp.net", + "erogazo-ngo.com", + "erogazopple.com", + "erogazou-pinkline.com", + "erogazoufactory.com", + "erohentai.net", + "erolabs.cloud", + "erolabs.com", + "erolabs.fun", + "erolabs.game", + "erolabs.net", + "erolabs.online", + "erolabsshare.xyz", + "eromanga-ace.com", + "eromanga-cafe.com", + "eromanga-kingdom.com", + "eromanga-kong.com", + "eromanga-mainichi.com", + "eromanga-school.com", + "eromangadouzin.com", + "eromangajukujo.com", + "eromazofu.com", + "erome.com", + "erome.it", + "eromon.net", + "eropasture.com", + "eropics.org", + "eropics.to", + "eroprofile.com", + "erosberry.com", + "eroshiko.net", + "erotelki.org", + "eroterest.net", + "erothots.co", + "erotic-artsites.com", + "erotic-hentai.com", + "erotic-photos.net", + "eroticart-top100.com", + "eroticbeauties.net", + "eroticbeautyhub.com", + "erotichdworld.com", + "eroticsaloon.net", + "erotictube.me", + "erotikaweb.hu", + "erovizor.ru", + "eroxia.com", + "erp.ac.uk", + "erpe.ac.uk", + "err.sh", + "ertk.net", + "es-visiontimes.com", + "esala.ac.uk", + "esbeatsbydrebuy.com", + "esc.ac.uk", + "escalate.ac.uk", + "escandinavia-arg.com", + "escape.com.au", + "escapestudios.ac.uk", + "escapestudios.co.uk", + "escg.ac.uk", + "escience-etf.ac.uk", + "escience.ac.uk", + "escobarvip.it", + "escoe.ac.uk", + "escort.guide", + "escortamsterdam1.com", + "escortdude.com", + "escortgirls.be", + "escortrankings.uk", + "escp-eap.ac.uk", + "esdi.ac.uk", + "esds.ac.uk", + "ese.ac.uk", + "eselondon.ac.uk", + "esg.ac.uk", + "eshcru.ac.uk", + "esher.ac.uk", + "esi.ac.uk", + "esim.ac.uk", + "esiss.ac.uk", + "eskimotube.com", + "eslite.com", + "esm.run", + "esmarthealth.com", + "esmatube.com", + "esmtp.biz", + "esnw.ac.uk", + "eso.ac.uk", + "esopworld.com", + "esp-scotland.ac.uk", + "esp32.com", + "esp8266.com", + "espa-headlines.ac.uk", + "espa.ac.uk", + "espadoldettol.com.ar", + "esperanzagomez.org", + "espn.co.uk", + "espn.com", + "espn.net", + "espncdn.com", + "espnqa.com", + "esposasymaridos.com", + "espressif.com", + "esrc.ac.uk", + "esrcfestival.ac.uk", + "esrcmanchesterfest.ac.uk", + "esrcsocietytoday.ac.uk", + "esri.com", + "essex.ac.uk", + "essexacl.ac.uk", + "estudio360.com.co", + "estudiopenthouse.com", + "esu.dog", + "esu.im", + "esurance.com", + "etaa.org.au", + "etadult.com", + "etaiwannews.com", + "etbc.com.hk", + "etc.ac.uk", + "etcfhe.ac.uk", + "eternum.io", + "etextbooks.ac.uk", + "etheadphones.com", + "etherdelta.com", + "ethereum.foundation", + "ethereum.org", + "ethermine.org", + "etherscan.io", + "ethicsguidebook.ac.uk", + "ethnicity.ac.uk", + "ethos.ac.uk", + "etizer.org", + "etnet.com.hk", + "etokki.com", + "etowns.net", + "etowns.org", + "etp-scotland.ac.uk", + "etpress.com.hk", + "ets.ac.uk", + "etsy.com", + "ettoday.net", + "ettrade.com.hk", + "etviet.com", + "etvonline.hk", + "etwealth.com", + "eu-consumer-empowerment.com", + "eu.org", + "eubluecardvisa.com", + "eucasino.com", + "eued.ac.uk", + "eueuropeansustainabledesign.net", + "eulam.com", + "eurekaselect.com", + "eurekavpt.com", + "eurobabeindex.com", + "eurobrox.ac.uk", + "eurocodesoftware.com", + "eurodasp.com", + "eurogirlsescort.com", + "euroipad.com", + "euromod.ac.uk", + "euronews.com", + "europa.eu", + "europalibera.org", + "europeansustainabledesign.com", + "europeansustainabledesign.net", + "europeansustainabledesigncouncil.com", + "europeansustainabledesigncouncil.net", + "europepmc.org", + "europeunit.ac.uk", + "europornstar.com", + "eurosexscene.com", + "eva.ac.uk", + "evaelfie.com", + "evalviewer.com", + "evanottyvideos.com", + "evemodels.com", + "eventsinfocus.org", + "evergage.com", + "everia.club", + "everipedia.org", + "evernote.com", + "every1dns.net", + "everydayporn.co", + "everymantheatrearchive.ac.uk", + "evesham.ac.uk", + "evilangel.com", + "evilx.su", + "evise.com", + "evolve.ac.uk", + "evolver.com", + "evolver3d.com", + "evolverpro.com", + "evozi.com", + "evropaelire.org", + "evschool.net", + "ewlc.ac.uk", + "eworld.com", + "ewrs.ac.uk", + "ewva.ac.uk", + "ex.ac.uk", + "exacttarget.com", + "exam-ta.ac.uk", + "exascale-tech.com", + "exblog.co.jp", + "exblog.jp", + "excedo.com", + "excellence.ac.uk", + "excellencelondon.ac.uk", + "exchange.ac.uk", + "exchristian.hk", + "excite.co.jp", + "excitebots.com", + "exe-coll.ac.uk", + "exec-appointments.com", + "exemplashe.ac.uk", + "exeter.ac.uk", + "exetercollege.ac.uk", + "exeterdeafacademy.ac.uk", + "exetermathematicsschool.ac.uk", + "exetermrcsdf.ac.uk", + "exeterms.ac.uk", + "exgfvideos.xxx", + "exgirlfriendmarket.com", + "exhentai.org", + "exiporn.com", + "exmo.com", + "exmormon.org", + "exoav.com", + "exondomesday.ac.uk", + "exotic-ghana.com", + "exoticuganda.com", + "exp-tas.com", + "expatshield.com", + "expecthim.com", + "expekt.com", + "experience-vmware.com", + "experiencebillmelater.com", + "experienceworks.ac.uk", + "expertmaker.com", + "experts-univers.com", + "experts.ac.uk", + "explicittube.com", + "exploader.net", + "exploitedcollegegirls.com", + "exploitedteensasia.com", + "exploreintel.com", + "explorespanking.com", + "expofutures.com", + "exporntoons.net", + "exposedlatinas.com", + "expressvpn.com", + "expresswifi.com", + "exrates.me", + "ext-twitch.tv", + "extensions4revit.com", + "extensionworkshop.com", + "extmatrix.com", + "extraasian.com", + "extrabux.com", + "extraindiansex.com", + "extrajapaneseporn.com", + "extreme-board.com", + "extremepornfilms.com", + "extremetube.com", + "exx.com", + "exxxtra.net", + "exxxtrasmall.com", + "exxxtrasmall1.com", + "eyevio.jp", + "eyny.com", + "ezpc.tk", + "ezpeer.com", + "ezua.com", + "f-boro-sfc.ac.uk", + "f-dro1d.org", + "f-droid.com", + "f-droid.org", + "f2pool.com", + "f5pf.com", + "f6988.com", + "f8.com", + "f95zone.to", + "fa.gov.tw", + "faacebok.com", + "faacebook.com", + "faam.ac.uk", + "faapy.com", + "faasbook.com", + "fabhairypussy.com", + "fablabplymouth.ac.uk", + "fabricmc.net", + "fabuye.top", + "fabuyemian.com", + "facbebook.com", + "facbeok.com", + "facboo.com", + "facbook.com", + "facbool.com", + "facboox.com", + "faccebook.com", + "faccebookk.com", + "facdbook.com", + "facdebook.com", + "face-book.com", + "face.ac.uk", + "face3d.ac.uk", + "faceabook.com", + "facebboc.com", + "facebbook.com", + "facebboook.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.com", + "facebokbook.com", + "facebokc.com", + "facebokk.com", + "facebokok.com", + "faceboks.com", + "facebol.com", + "facebolk.com", + "facebomok.com", + "faceboo.com", + "facebooa.com", + "faceboob.com", + "faceboobok.com", + "facebooc.com", + "faceboock.com", + "facebood.com", + "facebooe.com", + "faceboof.com", + "facebooi.com", + "facebooik.com", + "facebooik.org", + "facebooj.com", + "facebook-corp.com", + "facebook-covid-19.com", + "facebook-ebook.com", + "facebook-forum.com", + "facebook-hardware.com", + "facebook-inc.com", + "facebook-login.com", + "facebook-newsroom.com", + "facebook-newsroom.org", + "facebook-pmdcenter.com", + "facebook-pmdcenter.net", + "facebook-pmdcenter.org", + "facebook-privacy.com", + "facebook-program.com", + "facebook-studio.com", + "facebook-support.org", + "facebook-texas-holdem.com", + "facebook-texas-holdem.net", + "facebook.br", + "facebook.ca", + "facebook.cc", + "facebook.com", + "facebook.de", + "facebook.design", + "facebook.hu", + "facebook.in", + "facebook.net", + "facebook.nl", + "facebook.org", + "facebook.se", + "facebook.shop", + "facebook.tv", + "facebook.us", + "facebook.wang", + "facebook123.org", + "facebook30.com", + "facebook30.net", + "facebook30.org", + "facebook4business.com", + "facebookads.com", + "facebookadvertisingsecrets.com", + "facebookappcenter.info", + "facebookappcenter.net", + "facebookappcenter.org", + "facebookatschool.com", + "facebookawards.com", + "facebookblueprint.net", + "facebookbrand.com", + "facebookbrand.net", + "facebookcanadianelectionintegrityinitiative.com", + "facebookcareer.com", + "facebookcheats.com", + "facebookck.com", + "facebookclub.com", + "facebookcom.com", + "facebookconnect.com", + "facebookconsultant.org", + "facebookcoronavirus.com", + "facebookcovers.org", + "facebookcredits.info", + "facebookdating.net", + "facebookdevelopergarage.com", + "facebookdusexe.org", + "facebookemail.com", + "facebookenespanol.com", + "facebookexchange.com", + "facebookexchange.net", + "facebookfacebook.com", + "facebookflow.com", + "facebookgames.com", + "facebookgraphsearch.com", + "facebookgraphsearch.info", + "facebookgroups.com", + "facebookhome.cc", + "facebookhome.com", + "facebookhome.info", + "facebookhub.com", + "facebooki.com", + "facebookinc.com", + "facebookland.com", + "facebooklikeexchange.com", + "facebooklive.com", + "facebooklivestaging.net", + "facebooklivestaging.org", + "facebooklogin.com", + "facebooklogin.info", + "facebookloginhelp.net", + "facebooklogs.com", + "facebookmail.com", + "facebookmail.tv", + "facebookmanager.info", + "facebookmarketing.info", + "facebookmarketingpartner.com", + "facebookmarketingpartners.com", + "facebookmobile.com", + "facebookmsn.com", + "facebooknews.com", + "facebooknfl.com", + "facebooknude.com", + "facebookofsex.com", + "facebookook.com", + "facebookpaper.com", + "facebookpay.com", + "facebookphonenumber.net", + "facebookphoto.com", + "facebookphotos.com", + "facebookpmdcenter.com", + "facebookpoke.net", + "facebookpoke.org", + "facebookpoker.info", + "facebookpokerchips.info", + "facebookporn.net", + "facebookporn.org", + "facebookporno.net", + "facebookportal.com", + "facebookquotes4u.com", + "facebooks.com", + "facebooksafety.com", + "facebooksecurity.net", + "facebookshop.com", + "facebooksignup.net", + "facebooksite.net", + "facebookstories.com", + "facebookstudios.net", + "facebookstudios.org", + "facebooksupplier.com", + "facebooksuppliers.com", + "facebookswagemea.com", + "facebookswagstore.com", + "facebooksz.com", + "facebookthreads.net", + "facebooktv.net", + "facebooktv.org", + "facebookvacation.com", + "facebookw.com", + "facebookwork.com", + "facebookworld.com", + "facebool.com", + "facebool.info", + "facebooll.com", + "faceboom.com", + "faceboon.com", + "faceboonk.com", + "faceboooik.com", + "faceboook.com", + "faceboop.com", + "faceboot.com", + "faceboox.com", + "facebopk.com", + "facebpook.com", + "facebuk.com", + "facebuok.com", + "facebvook.com", + "facebyook.com", + "facebzook.com", + "facecbgook.com", + "facecbook.com", + "facecbook.org", + "facecook.com", + "facecook.org", + "facedbook.com", + "faceebok.com", + "faceebook.com", + "faceebot.com", + "facegbok.com", + "facegbook.com", + "faceid99.com", + "faceid99.net", + "faceidglobal.com", + "faceless.me", + "faceobk.com", + "faceobok.com", + "faceobook.com", + "faceook.com", + "facerbooik.com", + "facerbook.com", + "facesbooc.com", + "facesofnyfw.com", + "facesoftibetanselfimmolators.info", + "facesounds.com", + "facetime.net", + "facetook.com", + "facevbook.com", + "facewbook.co", + "facewook.com", + "facfacebook.com", + "facfebook.com", + "facilities.ac.uk", + "faciometrics.com", + "fackebook.com", + "faclair.ac.uk", + "facnbook.com", + "facoccmed.ac.uk", + "facrbook.com", + "factograph.info", + "factpedia.org", + "factwire.org", + "facultyopinions.com", + "facvebook.com", + "facwebook.com", + "facxebook.com", + "fadebook.com", + "faebok.com", + "faebook.com", + "faebookc.com", + "faeboook.com", + "faecebok.com", + "faesebook.com", + "fafacebook.com", + "faicbooc.com", + "fail.hk", + "failte.ac.uk", + "fairbairn.ac.uk", + "fairfieldfarmcollege.ac.uk", + "fairfieldopportunityfarm.ac.uk", + "fairmarket.com", + "faith100.org", + "faithfuleye.com", + "faiththedog.info", + "fakehub.com", + "fakeorfoto.com", + "fakeorphoto.com", + "faketaxi.com", + "fakings.com", + "fakku.net", + "faldgjalg.xyz", + "falkirkcollege.ac.uk", + "fallenark.com", + "falmouth.ac.uk", + "falmouthexeterplus.ac.uk", + "falmouthmarineschool.ac.uk", + "falsefire.com", + "falun-co.org", + "falun-ny.net", + "falunart.org", + "falunasia.info", + "falunau.org", + "falunaz.net", + "falundafa-dc.org", + "falundafa-florida.org", + "falundafa-nc.org", + "falundafa-pa.net", + "falundafa-sacramento.org", + "falundafa.org", + "falundafa.org.tw", + "falundafaindia.org", + "falundafamuseum.org", + "falungong.club", + "falungong.de", + "falungong.org.uk", + "falunhr.org", + "faluninfo.de", + "faluninfo.net", + "falunpilipinas.net", + "falunworld.net", + "fameregistry.com", + "famifun.com.tw", + "family-sex.me", + "family-simulator.io", + "family.co.jp", + "family.com.tw", + "familyfed.org", + "familylifestudy.ac.uk", + "familymart.com.my", + "familymart.com.ph", + "familypies.net", + "familyporn.tv", + "familypornhd.com", + "familysexsimulator.com", + "familysimulator.com", + "familysimulator.io", + "familystrokes.com", + "familyswap.xxx", + "famima.vn", + "famosascalvas.com", + "famous-nudes.com", + "famous.ac.uk", + "famousinternetgirls.com", + "famousinternetgirlsgalleries.com", + "famousnudes.com", + "famouspornstars.com", + "famunion.com", + "fan-qiang.com", + "fanaken.com", + "fanatical.com", + "fanbox.cc", + "fandango.com", + "fandom.com", + "fanfox.net", + "fangbinxing.com", + "fangeming.com", + "fangeqiang.com", + "fanglizhi.info", + "fangmincn.org", + "fangong.org", + "fangongheike.com", + "fangsung.com", + "fanhaodang.com", + "fanhaodian.com", + "fanhaolou.com", + "fanhowab.buzz", + "fank.ru", + "fanleakstoday.com", + "fanqiang.network", + "fanqiang.tk", + "fanqiangdang.com", + "fanqiangdang.org", + "fanqianghou.com", + "fanqianglu.com", + "fanqiangyakexi.net", + "fanqiangzhe.com", + "fans-here.com", + "fans17.com", + "fans66.tw", + "fansking.tw", + "fansnudes.com", + "fansone.co", + "fansta.me", + "fansteek.com", + "fanswong.com", + "fantasiasguatemala.com", + "fantasti.cc", + "fantv.hk", + "fanyue.info", + "fap-xxx.com", + "fap18.net", + "fap666.com", + "fapality.com", + "fapcat.com", + "fapdu.com", + "fapdude.com", + "fapello.com", + "faperoni.com", + "fapforfun.net", + "faphdporn.com", + "faphouse.com", + "fapmovz.com", + "fapnado.com", + "fapomania.com", + "fapopedia.net", + "fappcelebs.com", + "fappeningbook.com", + "fappeningthots.com", + "fappenist.com", + "fapphub.com", + "fapporn.me", + "faproulette.co", + "faproulette.online", + "faproxy.com", + "fapsafari.com", + "fapster.xxx", + "fapteencam.com", + "faptitans.com", + "fapvid.com", + "faqserv.com", + "faraday.ac.uk", + "fareastpornhub.com", + "fareham.ac.uk", + "farfetch-apps.com", + "farfetch-contents.com", + "farfetch.com", + "farfetch.net", + "farmington.ac.uk", + "farmplus.ac.uk", + "farn-ct.ac.uk", + "farnborough.ac.uk", + "farnboroughcollege.ac.uk", + "farnboroughsfc.ac.uk", + "farnboroughsfc2.ac.uk", + "farnham.ac.uk", + "faronics.ca", + "faronics.co.uk", + "faronics.com", + "faronics.com.au", + "faronics.com.sg", + "faronics.eu", + "faronics.tech", + "faronicslabs.com", + "faronicswise.co.uk", + "faronicswise.com", + "fartit.com", + "farwestchina.com", + "fasebokk.com", + "fasebook.com", + "faseboox.com", + "fashionbykakao.com", + "fashioningtheearlymodern.ac.uk", + "fashionnike.com", + "fashionretail.ac.uk", + "fashionretailacademy.ac.uk", + "fashiontechnologyacademy.ac.uk", + "fast.com", + "fastech.ac.uk", + "fastestvpn.com", + "fastindianporn.com", + "fastlane.ci", + "fastlane.tools", + "fastly-edge.com", + "fastly-terrarium.com", + "fastly.com", + "fastly.io", + "fastly.net", + "fastlylabs.com", + "fastlylb.net", + "fastpic.ru", + "fastssh.com", + "faststone.org", + "fasttext.cc", + "fasttrackreadysupport.com", + "fatakat-n.club", + "fatbtc.com", + "fatstube.com", + "fault-analysis-group.ac.uk", + "favebook.com", + "favelaporno.com", + "favepornmovs.com", + "favepornvids.com", + "favjapaneseporn.com", + "favotter.net", + "favstar.fm", + "fawanghuihui.org", + "faycbok.com", + "faydao.com", + "fayuanbooks.com", + "faz.net", + "fb.careers", + "fb.com", + "fb.gg", + "fb.me", + "fb.watch", + "fba.ac.uk", + "fbacebook.com", + "fbaddins.com", + "fbbmarket.com", + "fbboostyourbusiness.com", + "fbcdn.com", + "fbcdn.net", + "fbf8.com", + "fbfeedback.com", + "fbhome.com", + "fbidb.io", + "fbinc.com", + "fbinfer.com", + "fbinnovation.com", + "fbiqiyiav.buzz", + "fbjav.com", + "fblitho.com", + "fbmarketing.com", + "fbmessenger.com", + "fbooktaiwan.com", + "fbredex.com", + "fbreg.com", + "fbrell.com", + "fbrpms.com", + "fbsbx.com", + "fbsbx.net", + "fbsupport-covid.net", + "fbthirdpartypixel.com", + "fbthirdpartypixel.net", + "fbthirdpartypixel.org", + "fburl.com", + "fbwat.ch", + "fbworkmail.com", + "fc2.com", + "fc2blog.net", + "fc2china.com", + "fc2cn.com", + "fc2ppv.tv", + "fc2web.com", + "fca.ac.uk", + "fcacebook.com", + "fcaebook.com", + "fcebook.com", + "fcebookk.com", + "fcfacebook.com", + "fcot.ac.uk", + "fcrt.ac.uk", + "fcw.xxx", + "fcww0.com", + "fda.gov.tw", + "fdacebook.info", + "fdbox.com", + "fdc64.de", + "fdc64.jp", + "fdc64.org", + "fdc89.jp", + "fdf.ac.uk", + "fdiintelligence.com", + "fdroid.org", + "fdtl.ac.uk", + "feacboo.com", + "feacbook.com", + "feacbooke.com", + "feacebook.com", + "feanonlinear.com", + "featurecam.com", + "fecbbok.com", + "fecbooc.com", + "fecbook.com", + "feceboock.com", + "fecebook.net", + "feceboox.com", + "fececbook.com", + "federalschool.ac.uk", + "federalsurrey.ac.uk", + "fedoraforum.org", + "fedoramagazine.org", + "fedorapeople.org", + "fedoraproject.org", + "feedburner.com", + "feeder.co", + "feedherfuckher.com", + "feedly.com", + "feedx.net", + "feelssh.com", + "feer.com", + "feet9.com", + "fefc.ac.uk", + "fehesorp.ac.uk", + "fei.ru", + "feifeiss.com", + "feipang.link", + "feitian-california.org", + "feitianacademy.org", + "feixiaohao.com", + "felp.ac.uk", + "femalefounderscomp.com", + "femalestars.com", + "femdomcc.net", + "feministteacher.com", + "feminizingpolitics.ac.uk", + "femjoy.com", + "femscat.com", + "fengzhenghu.com", + "fengzhenghu.net", + "feook.com", + "ferabook.com", + "fermanaghcoll.ac.uk", + "ferronetwork.com", + "ferryclean.com", + "fescebook.com", + "fesebook.com", + "fesery-com.sbs", + "festinhasbrasil.com", + "fetalmedicine.ac.uk", + "fetish-bb.com", + "fetishbank.net", + "fetishdreamz.com", + "fetishes.cam", + "fetishfishcams.com", + "fetishpapa.com", + "fetishpornonly.com", + "fetishshrine.com", + "fetlife.com", + "fevernet.com", + "ff.im", + "ffacebook.com", + "ffc.ac.uk", + "fffdm.com", + "fffff.at", + "fffucked.com", + "fflick.com", + "fflm.ac.uk", + "fflnk.net", + "fflogs.com", + "ffmpeg.org", + "ffotolia.com", + "ffprofile.com", + "ffvpn.com", + "fgacebook.com", + "fgirl.ch", + "fgls.ac.uk", + "fgmtv.net", + "fgmtv.org", + "fhreports.net", + "fi11.com", + "fi11av1.com", + "fi11tv1.com", + "fibre-diffraction.ac.uk", + "ficeboock.com", + "ficm.ac.uk", + "fictionmania.tv", + "fifastreet.com", + "fifastreet3.com", + "fife.ac.uk", + "fifeglen.ac.uk", + "fightforux.com", + "figma.com", + "figprayer.com", + "fileflyer.com", + "fileforum.com", + "files2me.com", + "fileserve.com", + "filesmonster.vip", + "filesor.com", + "filipino-music.net", + "fillthesquare.org", + "filmandsound.ac.uk", + "filme2.xxx", + "filmeleporno.xxx", + "filmeporno.blog", + "filmeporno.xxx", + "filmesdesexo.blog", + "filmesporno.com.br", + "filmesporno.net.br", + "filmespornos.net", + "filmingfortibet.org", + "filmporno.it", + "filmsexeporno.com", + "filt-coll.ac.uk", + "filtercams.com", + "filthdump.com", + "filton-college.ac.uk", + "filton.ac.uk", + "fimfiction.net", + "finalcutpro.com", + "financeleadsonline.com", + "financetwitter.com", + "financialadvisoriq.com", + "financialsoccer.ca", + "finchvpn.com", + "find-apple.com", + "find-cdt.ac.uk", + "findacard.com", + "findasians.live", + "findbare.com", + "findbook.tw", + "findcams.live", + "finder.ac.uk", + "findhername.net", + "findmespot.com", + "findmybeats.com", + "findmyipad.com", + "findsav.com", + "findtubes.com", + "findvrporn.com", + "findyourlimits.com", + "findyoutube.com", + "findyoutube.net", + "fine-art-nude.org", + "fineart.ac.uk", + "fineartteens.com", + "finenike.com", + "finesse.ac.uk", + "finevids.xxx", + "fingerdaily.com", + "finish.at", + "finish.bg", + "finish.co.kr", + "finish.co.nz", + "finish.co.uk", + "finish.co.za", + "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.sk", + "finisharabia.com", + "finishbrasil.com.br", + "finishdishwashing.ca", + "finishdishwashing.com", + "finishinfo.be", + "finishinfo.cl", + "finishinfo.com", + "finishinfo.com.ar", + "finishinfo.com.au", + "finishinfo.cz", + "finishinfo.fi", + "finishinfo.it", + "finishinfo.jp", + "finishinfo.nl", + "finishinfo.no", + "finishinfo.ru", + "finishinfo.se", + "finishkilpailu.fi", + "finishwin.be", + "finler.net", + "finlitsummit.org", + "fiord.ru", + "fiotolia.com", + "fipc.ac.uk", + "fircroft.ac.uk", + "fire-emblem-heroes.com", + "firearmsworld.net", + "firebase.com", + "firebase.googleapis.com", + "firebase.io", + "firebaseapp.com", + "firebaseappcheck.googleapis.com", + "firebasedynamiclinks-ipv4.googleapis.com", + "firebasedynamiclinks-ipv6.googleapis.com", + "firebasedynamiclinks.googleapis.com", + "firebaseinappmessaging.googleapis.com", + "firebaseinstallations.googleapis.com", + "firebaseio.com", + "firebaselogging-pa.googleapis.com", + "firebaselogging.googleapis.com", + "firebaseperusertopics-pa.googleapis.com", + "firebaseremoteconfig.googleapis.com", + "fireemblemawakening.com", + "fireflyresearch.ac.uk", + "firefox.com", + "firefoxusercontent.com", + "fireofliberty.org", + "fireservicecollege.ac.uk", + "fireside.fm", + "firesidegatherings.com", + "firestone.cl", + "firestone.co.cr", + "firestone.com.ar", + "firestone.com.br", + "firestone.com.co", + "firestone.com.mx", + "firestonebpco.com", + "firestonecomercial.cl", + "firestonecomercial.co.cr", + "firestonecomercial.com.ar", + "firestonecomercial.com.br", + "firestonecomercial.com.co", + "firestonecomercial.com.mx", + "firestonecompleteautocare.com", + "firestonedrivestore.com", + "firestoneip.com", + "firestonerewards.com", + "firestonetire.ca", + "firestonetire.com", + "firetweet.io", + "firewire.cl", + "firewire.eu", + "firmaprofesional.com", + "first-ns.de", + "firstanalvideos.com", + "firstchancesfife.ac.uk", + "firstfivefollowers.com", + "firstgynexam.com", + "firstpelvicexam.com", + "firstpost.com", + "firstprivatebank.com.mm", + "firstrade.com", + "fiscalstudies.ac.uk", + "fishmpegs.com", + "fitbit.com", + "fitgirl-repacks.site", + "fitnakedgirls.com", + "five-d.com", + "fivestarpornsites.com", + "fixtracking.com", + "fiz-karlsruhe.de", + "fizzik.com", + "fjlkajhgfa.top", + "fkse.ac.uk", + "fl310.com", + "flagrasamadores.net", + "flagsonline.it", + "flame.ac.uk", + "flameunleashed.com", + "flaru.com", + "flashtranny.com", + "flatandfuckedmilfs.com", + "flathub.org", + "flatmates.com.au", + "flatpak.org", + "flavournetwork.ac.uk", + "fldz8.buzz", + "flecheinthepeche.fr", + "fleek.co", + "fleshbot.com", + "fleshlyx.com", + "fleursdeslettres.com", + "flexsig.com", + "flgg.us", + "flgjustice.org", + "fli8.xyz", + "flic.kr", + "flickr.com", + "flickr.net", + "flickrhivemind.net", + "flickriver.com", + "fling.com", + "flipboard.com", + "flipfap.com", + "flipkart.com", + "flipnotestudio.com", + "flipshare.com", + "flipwithsurface.com", + "flirt4free.com", + "flirtmoms.com", + "flirtyhoookup.com", + "flitto.com", + "fljmh.com", + "flnet.org", + "flog.tw", + "floorp.app", + "floppy-tits.com", + "flow.dev", + "flow.org", + "flowfront.com", + "flowfront.net", + "flowtype.org", + "fluidfxapp.com", + "fluidpreview.com", + "fluids.ac.uk", + "flurry.com", + "flutter.dev", + "flutterapp.com", + "flyflv.com", + "flyingjizz.com", + "flyvpn.com", + "flyyindh-cc.sbs", + "flyzy2005.com", + "fm4.jp", + "fmav.top", + "fmav51.icu", + "fmc.ac.uk", + "fmcebook.com", + "fmdesktop.com", + "fmdv.ac.uk", + "fmg.ac.uk", + "fmlm.ac.uk", + "fmnnow.com", + "fnac.be", + "fnac.com", + "fnacebook.com", + "fnlondon.com", + "fnmt.es", + "foampositeshoes.com", + "fochk.org", + "focus.ac.uk", + "focustaiwan.tw", + "focusvpn.com", + "fofg-europe.net", + "fofg.org", + "fofldfradio.org", + "foftolia.com", + "folkestonecollege.ac.uk", + "follasian.com", + "followpype.com", + "fom.ac.uk", + "fonolia.com", + "fontawesome.com", + "fontbook.com", + "fontexplorerx.com", + "fonts.com", + "fonts.net", + "fontshop-prod-responsive-images.s3.amazonaws.com", + "fontshop.com", + "fontsinuse.com", + "foodchain.ac.uk", + "foodsecurity.ac.uk", + "foofle.com", + "foolsmountain.com", + "fooooo.com", + "footprint.net", + "footprintdns.com", + "footseen.com", + "footstockings.com", + "footwear-cadcam.com", + "footwiball.com", + "forbes.com", + "forbesimg.com", + "forbiddenasian.com", + "forbiddenmomsarchive.com", + "force.com", + "forduck.cyou", + "foreignaffairs.com", + "foreignpolicy.com", + "forestsixth.ac.uk", + "forestyouth.ac.uk", + "forgecdn.net", + "forhertube.com", + "formission.ac.uk", + "formit360.com", + "formitfactory.com", + "forpojie.pics", + "forster.ac.uk", + "fortawesome.com", + "forte.ac.uk", + "forthebadge.com", + "forthethrone.com", + "forthvalley.ac.uk", + "fortitude-group.ac.uk", + "fortnite.com", + "fortune.ac.uk", + "fortunecentre.ac.uk", + "fortuneinsight.com", + "forum4hk.com", + "forums-free.com", + "forzamotorsport.net", + "forzaracingchampionship.com", + "forzarc.com", + "fosebook.com", + "fotile.me", + "fotiolia.com", + "fotoiia.com", + "fotolia-noticias.com", + "fotolia.cc", + "fotolia.com", + "fotolia.tv", + "fotolja.com", + "fotoscaserasx.com", + "foundationdb.org", + "foundationyear.ac.uk", + "fourthinternational.org", + "fout.jp", + "fox-corporation.com", + "fox-news.com", + "fox.com", + "fox.tv", + "fox10.tv", + "fox10news.com", + "fox10phoenix.com", + "fox11.com", + "fox13memphis.com", + "fox13news.com", + "fox23.com", + "fox23maine.com", + "fox247.com", + "fox247.tv", + "fox26.com", + "fox26houston.com", + "fox28media.com", + "fox29.com", + "fox2detroit.com", + "fox2news.com", + "fox32.com", + "fox32chicago.com", + "fox35orlando.com", + "fox38corpuschristi.com", + "fox42kptm.com", + "fox46.com", + "fox46charlotte.com", + "fox47.com", + "fox49.tv", + "fox4news.com", + "fox51tns.net", + "fox5atlanta.com", + "fox5dc.com", + "fox5ny.com", + "fox5storm.com", + "fox6now.com", + "fox7.com", + "fox7austin.com", + "fox9.com", + "foxacrossamerica.com", + "foxaffiliateportal.com", + "foxandfriends.com", + "foxbet.com", + "foxbusiness.com", + "foxbusiness.tv", + "foxbusinessgo.com", + "foxcanvasroom.com", + "foxcareers.com", + "foxcharlotte.com", + "foxcincy.com", + "foxcincy.jobs", + "foxcincy.net", + "foxcollegesports.com", + "foxcorporation.com", + "foxcreativeuniversity.com", + "foxcredit.com", + "foxcredit.org", + "foxd.tv", + "foxdcg.com", + "foxdeportes.com", + "foxdeportes.net", + "foxdeportes.tv", + "foxdie.us", + "foxdigitalmovies.com", + "foxdoua.com", + "foxentertainment.com", + "foxesacademy.ac.uk", + "foxest.com", + "foxfaq.com", + "foxfdm.com", + "foxfiles.com", + "foxgay.com", + "foxhq.com", + "foxinc.com", + "foxkansas.com", + "foxla.com", + "foxla.tv", + "foxlexington.com", + "foxmediacloud.com", + "foxnation.com", + "foxnebraska.com", + "foxneo.com", + "foxneodigital.com", + "foxnetworks.info", + "foxnetworksinfo.com", + "foxnews.cc", + "foxnews.com", + "foxnews.net", + "foxnews.org", + "foxnews.tv", + "foxnewsaffiliates.com", + "foxnewsaroundtheworld.com", + "foxnewsb2b.com", + "foxnewschannel.com", + "foxnewsgo.net", + "foxnewsgo.org", + "foxnewsgo.tv", + "foxnewshealth.com", + "foxnewslatino.com", + "foxnewsmagazine.com", + "foxnewsnetwork.com", + "foxnewsopinion.com", + "foxnewspodcasts.com", + "foxnewspolitics.com", + "foxnewsradio.com", + "foxnewsrundown.com", + "foxnewssunday.com", + "foxon.com", + "foxphiladelphia.com", + "foxplus.com", + "foxpoker.com", + "foxporns.com", + "foxrad.io", + "foxredeem.com", + "foxrelease.com", + "foxrichmond.com", + "foxrobots.com", + "foxsmallbusinesscenter.com", + "foxsmallbusinesscenter.net", + "foxsmallbusinesscenter.org", + "foxsoccer.net", + "foxsoccer.tv", + "foxsoccermatchpass.com", + "foxsoccerplus.com", + "foxsoccerplus.net", + "foxsoccerplus.tv", + "foxsoccershop.com", + "foxsports-chicago.com", + "foxsports-newyork.com", + "foxsports-world.com", + "foxsports.cl", + "foxsports.co", + "foxsports.co.ve", + "foxsports.com", + "foxsports.com.ar", + "foxsports.com.bo", + "foxsports.com.br", + "foxsports.com.co", + "foxsports.com.ec", + "foxsports.com.gt", + "foxsports.com.mx", + "foxsports.com.pe", + "foxsports.com.py", + "foxsports.com.uy", + "foxsports.com.ve", + "foxsports.gt", + "foxsports.info", + "foxsports.net", + "foxsports.net.br", + "foxsports.pe", + "foxsports.sv", + "foxsports.uy", + "foxsports2.com", + "foxsportsflorida.com", + "foxsportsgo.com", + "foxsportsla.com", + "foxsportsnetmilwaukee.com", + "foxsportsneworleans.com", + "foxsportsracing.com", + "foxsportssupports.com", + "foxsportsuniversity.com", + "foxsportsworld.com", + "foxstudiolot.com", + "foxsub.com", + "foxsuper6.com", + "foxtang.com", + "foxtel.com", + "foxtel.com.au", + "foxtelevisionstations.com", + "foxtube.com", + "foxtv.com", + "foxtvdvd.com", + "foxuv.com", + "foxweatherwatch.com", + "fpacebook.com", + "fpm.ac.uk", + "fpmt-osel.org", + "fpmt.org", + "fpmt.tw", + "fpmtmexico.org", + "fptolia.com", + "fqcebook.com", + "fqok.org", + "fqrouter.com", + "fr-beatsbydrestore.com", + "fra.ac.uk", + "fracebook.com", + "fragment.com", + "fragrancebay.com", + "francecasquebeatssolde.com", + "francemail.com", + "francistowne.ac.uk", + "franklc.com", + "franklin.ac.uk", + "fratec.net", + "frcasquesbeats.com", + "freakshare.com", + "free-3d-porn.com", + "free-aa.com", + "free-abbywinters.com", + "free-avx.jp", + "free-erobooks.com", + "free-gate.org", + "free-hada-now.org", + "free-proxy.cz", + "free-sns.com", + "free-ss.site", + "free-ssh.com", + "free-strip-games.com", + "free-wap-tube.com", + "free-xxx-porn.org", + "free.fr", + "free00.com", + "free18.net", + "free4u.com.ar", + "free64all.com", + "freeadultcomix.com", + "freeadultgames.tv", + "freealim.com", + "freeanimalporn.net", + "freearabsexx.com", + "freeav.tv", + "freeb.com", + "freebasics.com", + "freebasics.net", + "freebdsmxxx.org", + "freebeacon.com", + "freebearblog.org", + "freebigmovies.com", + "freebrowser.org", + "freebs.com", + "freebsd.org", + "freecamsfan.com", + "freecartoons.biz", + "freechal.com", + "freechatnow.com", + "freechina.net", + "freechina.news", + "freechinaforum.org", + "freechinaweibo.com", + "freecodecamp.org", + "freeddns.com", + "freeddns.org", + "freedirecttvspecial.com", + "freedl.org", + "freedomchina.info", + "freedomcollection.org", + "freedomhongkong.org", + "freedomhouse.org", + "freedomplatform.tv", + "freedomsherald.org", + "freefacebook.com", + "freefacebook.net", + "freefacebookads.net", + "freefblikes.com", + "freefbx.com", + "freeforums.org", + "freefq.com", + "freefuckvids.com", + "freegao.com", + "freegaypornhdtube.com", + "freegaysexgames.com", + "freehdinterracialporn.in", + "freehdvideos.xxx", + "freehentaipic.com", + "freehentaistream.com", + "freehongkong.org", + "freehqtube.com", + "freehulu.com", + "freeilhamtohti.org", + "freejavbt.com", + "freejavporn.mobi", + "freekazakhs.org", + "freekwonpyong.org", + "freelifetimefuckbook.com", + "freelotto.com", + "freeman-centre.ac.uk", + "freeman2.com", + "freematuresgallery.com", + "freemoren.com", + "freemorenews.com", + "freemuse.org", + "freenet-china.org", + "freenetproject.org", + "freenewscn.com", + "freenode.net", + "freeomovie.to", + "freeones.com", + "freeopenvpn.com", + "freeoz.org", + "freeporn.com", + "freepornhdonlinegay.com", + "freepornhentaigames.com", + "freeporno.asia", + "freepornpreview.net", + "freepornq.com", + "freepornvideos.life", + "freeproxylists.net", + "freerangecloud.com", + "freerk.com", + "freescotcoll.ac.uk", + "freesexalbum.com", + "freesexgames.games", + "freesexgames.ws", + "freesexvideos2k.com", + "freesexyindians.com", + "freesexyindians.org", + "freessh.us", + "freessl.com", + "freetcp.com", + "freetibet.net", + "freetibet.org", + "freetibetanheroes.org", + "freetribe.me", + "freeuseporn.com", + "freeviewmovies.com", + "freeviewplus.net.au", + "freevpn.me", + "freevpn.nl", + "freewallpaper4.me", + "freewebs.com", + "freewechat.com", + "freeweibo.com", + "freewww.biz", + "freewww.info", + "freexinwen.com", + "freexvideos.org", + "freexxx.best", + "freexxx.win", + "freexxxporn.org", + "freeyellow.com", + "freeyouporn.mobi", + "freeyoutubeproxy.net", + "freezeframe.ac.uk", + "freezhihu.org", + "freieporno.com", + "freindfeed.com", + "frenchhistorysociety.ac.uk", + "frescolib.org", + "freshporno.net", + "freshscat.com", + "freudbox.com", + "freyalist.com", + "friday.tw", + "friendbook.info", + "frienddy.com", + "friendfed.com", + "friendfeed-api.com", + "friendfeed-media.com", + "friendfeed.com", + "friendfeedmedia.com", + "friendfinder.com", + "friends-of-tibet.org", + "friendsoftibet.org", + "fring.com", + "fringenetwork.com", + "frishoes.com", + "fritchy.com", + "from-pr.com", + "from-sd.com", + "fromchinatousa.net", + "frommel.net", + "frontier.ac.uk", + "frontiersin.org", + "frontiersofoncology.ac.uk", + "frontlinedefenders.org", + "frontrow.com", + "froogle.com", + "frootvpn.com", + "frostbite.com", + "frprn.com", + "fruitycams.com", + "fsacebok.com", + "fsb.ac.uk", + "fscebook.com", + "fscked.org", + "fsdn.com", + "fse.tv", + "fsem.ac.uk", + "fslra.ac.uk", + "fsmone.com", + "fsmone.com.hk", + "fsmone.com.my", + "fssta.com", + "fst.ac.uk", + "fstopimages.com", + "fsurf.com", + "ft.com", + "ftadviser.com", + "ftcdn.net", + "ftchinese.com", + "fteproxy.org", + "ftiecla.com", + "ftop.ru", + "ftopx.com", + "ftp1.biz", + "ftpserver.biz", + "ftv.com.tw", + "ftvgirls.com", + "ftvmilfs.com", + "ftvnews.com.tw", + "ftx.com", + "fu62.vip", + "fucd.com", + "fuchsia.dev", + "fuck-xxx-movies.com", + "fuck.com", + "fuck.sc", + "fuck55.net", + "fuck6teen.com", + "fuckableteens.net", + "fuckbookecuador.com", + "fuckcnnic.net", + "fuckcuck.com", + "fuckgames.xxx", + "fuckgfw.org", + "fuckgfw233.org", + "fuckingawesome.com", + "fuckingfreemovies.com", + "fuckingmatures.com", + "fuckingthreesome.com", + "fuckmatureporn.com", + "fuckmaturepussy.com", + "fuckmeplease.net", + "fuckmoral.com", + "fuckmypakistanigf.com", + "fucksexhub.com", + "fuckteenvids.com", + "fuckthathussy.com", + "fucktube.com", + "fuckup.xxx", + "fuckvideos.biz", + "fuellearning.ac.uk", + "fuhouse.club", + "fujinkoron.jp", + "fujossy.jp", + "fukzr1.cc", + "fulanax.com", + "fulcrum.ac.uk", + "fuli-wangzhan.com", + "fuli3.net", + "fulib711.shop", + "fuliba2021.com", + "fuliba2023.net", + "fulione.com", + "fullbookmm.blogspot.com", + "fulldesisex.com", + "fullerconsideration.com", + "fullfuli.com", + "fullhdxxx.com", + "fullpornnetwork.com", + "fullsexmovs.com", + "fulltaboo.tv", + "fullxxxmovies.net", + "fulue.com", + "fundaiphone5s.com", + "fundfire.com", + "fundinginstitutional.com", + "fundingrates.xyz", + "fundpaypal.com", + "fundraisingwithfacebook.com", + "fundsupermart.com", + "funf.tw", + "funimation.com", + "funkyimg.com", + "funnyfacebook.org", + "funnyordie.com", + "funp.com", + "funshemale.com", + "fuq.com", + "fuqqt.com", + "furaffinity.net", + "furbo.org", + "furhhdl.org", + "furinkan.com", + "furl.net", + "furness.ac.uk", + "furrypornvideos.com", + "furuke.com", + "fury.blog", + "fury.co", + "fury.dev", + "fury.help", + "fury.io", + "fuse.ac.uk", + "fusion-cdt.ac.uk", + "fusion.ac.uk", + "fusionlifecycle.com", + "fusionproductionapps.com", + "fuskator.com", + "fusker.xxx", + "futanarihq.com", + "futhead.com", + "futoka.jp", + "futpromos.com", + "futunited.com", + "future-media.ac.uk", + "future-reserves-research.ac.uk", + "futurearmedforces.ac.uk", + "futurecat.ac.uk", + "futurechinaforum.org", + "futureme.ac.uk", + "futuremedia.ac.uk", + "futuremessage.org", + "futureofbritishmanufacturing.com", + "futureofbusinesssurvey.org", + "futureofmaktingthings.com", + "futureshop.ca", + "futuretrack.ac.uk", + "futurevehicles.ac.uk", + "futureworks.ac.uk", + "fux.com", + "fuxporn.com", + "fuyin.net", + "fuyindiantai.org", + "fuyu.org.tw", + "fuzokudx.com", + "fv-distribution-database.ac.uk", + "fw.cm", + "fxcm-chinese.com", + "fxcorporate.com", + "fxn.ws", + "fxnetwork.com", + "fxnetworks.com", + "fxplus.ac.uk", + "fxporn.net", + "fzdm.com", + "fzdshare.net", + "fzh999.com", + "fzh999.net", + "fzlm.com", + "g-area.org", + "g-desktop.ru", + "g-queen.com", + "g-technology.com", + "g-tun.com", + "g-tvapp.com", + "g-xxxhub.com", + "g.co", + "g.dev", + "g.page", + "g0v.social", + "g6hentai.com", + "gab.com", + "gabocorp.com", + "gacebook.com", + "gaelicstoryatgu.ac.uk", + "gaeproxy.com", + "gaforum.org", + "gagaoolala.com", + "gaia.ac.uk", + "gainsborough.ac.uk", + "gaito.xyz", + "galaxyappstore.com", + "galaxymacau.com", + "galaxymobile.jp", + "gale.com", + "galegroup.com", + "galenwu.com", + "gallery-dump.club", + "galleryarchives.com", + "gallup.com", + "galstars.net", + "galt.ac.uk", + "gamboporn.com", + "gamcore.com", + "game-platform.net", + "game-repack.site", + "game735.com", + "gamebase.com.tw", + "gamebeforethegame.com", + "gamejolt.com", + "gamelore.fun", + "gameon-masters.com", + "gamepass.com", + "gamepedia.com", + "gameplan.ac.uk", + "gamer.com.tw", + "gameroom.com", + "gamerotic.com", + "gamerp.jp", + "gamesathletes.com", + "gamesfuckgirls.com", + "gamesofdesire.com", + "gamesstack.com", + "gameuxmasterguide.com", + "gamez.com.tw", + "gaming-notebooks.com", + "gamousa.com", + "gandhara.ru", + "gandi.net", + "ganges.com", + "ganjing.com", + "ganjing.world", + "ganjingworld.com", + "gannett-cdn.com", + "gannett.com", + "gannettdigital.com", + "gao1.cc", + "gaofuwu.cc", + "gaoming.net", + "gaopi.net", + "gaozhisheng.net", + "gaozhisheng.org", + "gaozs18.buzz", + "gardennetworks.com", + "gardennetworks.org", + "garena.co.id", + "garena.co.th", + "garena.com", + "garena.live", + "garena.my", + "garena.ph", + "garena.sg", + "garena.tv", + "garena.tw", + "garena.vn", + "garenanow.com", + "garotaporno.com", + "gartlive.com", + "gashe.ac.uk", + "gastrointestinalexam.com", + "gate-project.com", + "gate.ac.uk", + "gate.cc", + "gate.io", + "gatecoin.com", + "gatedata.org", + "gateimg.com", + "gateio.live", + "gateio.services", + "gateshead.ac.uk", + "gatesheadcollege.ac.uk", + "gatesheadlearningskills.ac.uk", + "gateway.ac.uk", + "gateway.dev", + "gather.com", + "gatherproxy.com", + "gati.org.tw", + "gauleporno.xxx", + "gay.bingo", + "gay0day.com", + "gay1069sex.com", + "gay4tube.com", + "gayapatal.com", + "gayasianamateurs.com", + "gayasiantheater.com", + "gaybeeg.info", + "gaybf.com", + "gayboystube.com", + "gaybubble.com", + "gaycamvideos.net", + "gaycn.net", + "gaycock4u.com", + "gayforit.eu", + "gayfuckporn.com", + "gayfuror.com", + "gayharem.com", + "gayheaven.org", + "gayhub.com", + "gaymaletube.com", + "gaymap.cc", + "gaymenring.com", + "gayonthenet.net", + "gaypad.net", + "gaypinoyporn.com", + "gayporn.com", + "gayporn.pro", + "gaypornforyou.com", + "gaypornhdfree.com", + "gaypornlinks.com", + "gaypornlove.net", + "gaypornmenu.com", + "gayporno.fm", + "gaypornonly.com", + "gaypornsky.com", + "gayrawclub.com", + "gayroom.com", + "gaysheaven.blogspot.com", + "gaysonic.eu", + "gaystarnews.com", + "gaystream.pw", + "gaythebest.com", + "gaytopcams.com", + "gaytube.com", + "gayvl.net", + "gaywatch.com", + "gazotube.com", + "gazounabi.com", + "gbank.com.mm", + "gbluebooks.blogspot.com", + "gbmc.ac.uk", + "gbmolluscatypes.ac.uk", + "gbnews.uk", + "gbs3trial.ac.uk", + "gbxml.net", + "gca.ac.uk", + "gcadt.ac.uk", + "gcal.ac.uk", + "gcbp.ac.uk", + "gcc.ac.uk", + "gcc.org.hk", + "gceducationandskills.ac.uk", + "gcft-gla.ac.uk", + "gcft.ac.uk", + "gcg.ac.uk", + "gci.ac.uk", + "gcld-line.com", + "gclg.ac.uk", + "gclooney.com", + "gclubs.com", + "gcmasia.com", + "gcns.ac.uk", + "gcolle.net", + "gcpnews.com", + "gcr.io", + "gcrb.ac.uk", + "gcrtires.com", + "gcs.ac.uk", + "gcsp.ac.uk", + "gcu.ac.uk", + "gculondon.ac.uk", + "gda.ac.uk", + "gdaily.org", + "gdansk-amazon.com", + "gdbt.net", + "gdian-dh.mom", + "gdsrx888.com", + "gdzf.org", + "gears5.com", + "gearspop.com", + "gearstactics.com", + "geasontraining.ac.uk", + "geceguby.ru", + "gecko.ac.uk", + "geek-art.net", + "geek-squad-support.com", + "geek-squad.net", + "geek-squad.org", + "geek-squads.net", + "geekerhome.com", + "geekheart.info", + "geeksquad.ca", + "geeksquad.cc", + "geeksquad.com", + "geeksquad.net", + "geeksquad.tv", + "geeksquadcares.com", + "geeksquadcentral.com", + "geeksquadforums.com", + "geeksquadonline.com", + "geeksquadprotectionplan.org", + "geeksquadservices.org", + "geeksquadwebroot.org", + "geelongadvertiser.com.au", + "geforce.co.kr", + "geforce.co.uk", + "geforce.com", + "geforce.com.tw", + "geilegratisporno.com", + "geileomas.com", + "geinoueroch.com", + "geiriadur.ac.uk", + "gekikame.com", + "gelbooru.com", + "gelbooru.me", + "geller-pa.googleapis.com", + "gem.ac.uk", + "gemfire.net", + "gemfury.com", + "gemini.com", + "gen2.ac.uk", + "gendai.net", + "generated.photos", + "generationpup.ac.uk", + "generativeai.google", + "generativelanguage.googleapis.com", + "genesis.ac.uk", + "genesys.ac.uk", + "genet.ac.uk", + "geneticconstructor.com", + "geng8cn.xyz", + "gengba-av.mom", + "gengba.cc", + "genius.com", + "genkai-hounyo.com", + "genomeanalysiscentre.ac.uk", + "genomicsnetwork.ac.uk", + "genshin-porn.com", + "genshinh.com", + "genshinimpact.com", + "gentoo.org", + "geocities.co.jp", + "geocities.com", + "geocities.jp", + "geodesummit.com", + "geohazard.ac.uk", + "geolytics.com", + "geoport.com", + "george-monoux.ac.uk", + "geospatialimaging.com", + "geospatialinfo.com", + "geotrust.com", + "geoxwalk.ac.uk", + "geph.io", + "geraldoatlarge.com", + "gerc.ac.uk", + "gerefoundation.org", + "gerritcodereview.com", + "gesource.ac.uk", + "get.app", + "get.dev", + "get.how", + "get.new", + "get.page", + "get.rsvp", + "getadblock.com", + "getamoveon.ac.uk", + "getastrill.com", + "getbootstrap.com", + "getboxer.com", + "getbraintree.com", + "getbumptop.com", + "getbuzzsaw.com", + "getchu.com", + "getcloak.com", + "getcomposer.org", + "getdirect.tv", + "getdrebeatssale.com", + "getdropbox.com", + "getfappy.com", + "getfedora.org", + "getfoxyproxy.org", + "getfreedur.com", + "getgom.com", + "geti2p.net", + "getiton.com", + "getjetso.com", + "getlantern.org", + "getmalus.com", + "getmdl.io", + "getoutline.org", + "getpocket.com", + "getporn.tv", + "getprintersupports.com", + "getscorecash.com", + "getsexgames.com", + "getsocialscope.com", + "getsync.com", + "gettr.com", + "gettrials.com", + "gettyimages.ae", + "gettyimages.at", + "gettyimages.be", + "gettyimages.ca", + "gettyimages.ch", + "gettyimages.co.jp", + "gettyimages.co.nz", + "gettyimages.co.uk", + "gettyimages.com", + "gettyimages.com.au", + "gettyimages.com.br", + "gettyimages.com.mx", + "gettyimages.de", + "gettyimages.dk", + "gettyimages.es", + "gettyimages.fi", + "gettyimages.fr", + "gettyimages.hk", + "gettyimages.ie", + "gettyimages.in", + "gettyimages.it", + "gettyimages.nl", + "gettyimages.no", + "gettyimages.pt", + "gettyimages.se", + "getuploader.com", + "getws1.com", + "getwsone.com", + "getzola.org", + "gfacecbook.com", + "gfarchive.com", + "gfashion.com", + "gfbv.de", + "gfgold.com.hk", + "gfleaks.com", + "gfnormal05at.com", + "gfotolia.com", + "gfpics.com", + "gfpornbox.com", + "gfpornmovies.com", + "gfpornvideos.com", + "gfrevenge.com", + "gfsale.com", + "gfw.org.ua", + "gfw.press", + "gfw.report", + "gfx.ms", + "gfycat.com", + "gfysex.com", + "ggdiao.com", + "ggjav.com", + "ggoogle.com", + "ggpds.com", + "ggpht.com", + "ggsrv.com", + "ggssl.com", + "ghanely.me", + "ghcr.io", + "ghettotube.com", + "ghidra-sre.org", + "ghil.ac.uk", + "ghostgames.com", + "ghostpath.com", + "ghut.org", + "giantessbooru.com", + "giantessnight.com", + "giffgaff.com", + "giffgaff.design", + "gifnuki.com", + "gifree.com", + "gift-surg.ac.uk", + "giga-web.jp", + "gigabyte.com", + "gigacircle.com", + "giganews.com", + "gigantits.com", + "gigaporn.org", + "gigaxvideos.com", + "gigjam.com", + "gigporno.ru", + "gimsig.ac.uk", + "gimy.cc", + "gimy.co", + "gimy.to", + "gimy.tv", + "ginmoe.com", + "ginzasonypark.jp", + "gipscorp.com", + "giratina.com", + "girl-secret.com", + "girl7942.com", + "girlbanker.com", + "girlfriendgalleries.net", + "girlfriendhomeporn.com", + "girlfriendvideos.com", + "girlfriendvids.net", + "girlfuckshorse.net", + "girlfur.com", + "girls.xyz", + "girls2see.ch", + "girlscanner.cc", + "girlscv.com", + "girlsdelta.com", + "girlsfuck-tube.com", + "girlsheaven-job.net", + "girlsnudepic.com", + "girlsofdesire.org", + "girlsongirlstube.com", + "girlspoopingtube.com", + "girlssexxxx.com", + "girlstryanal.com", + "girlsway.com", + "girlswelustfor.com", + "girlsxxx.net", + "gisplanning.com", + "git-scm.com", + "git.io", + "gitbook.com", + "gitbook.io", + "gitbooks.io", + "githack.com", + "github-cloud.s3.amazonaws.com", + "github.blog", + "github.com", + "github.community", + "github.dev", + "github.io", + "githubapp.com", + "githubassets.com", + "githubcopilot.com", + "githubhackathon.com", + "githubnext.com", + "githubpreview.dev", + "githubstatus.com", + "githubuniverse.com", + "githubusercontent.com", + "gitlab-static.net", + "gitlab.com", + "gitlab.io", + "gitlab.net", + "gitstar.com", + "gitstar.net", + "gittigidiyor.net", + "gittigidiyorsikayet.com", + "givemebuzzsaw.com", + "gizlen.net", + "gizmoxxx.com", + "gjczz.com", + "gla.ac.uk", + "glaadh.ac.uk", + "gladporn.com", + "gladstudy.ac.uk", + "glam.ac.uk", + "glam0ur.com", + "glammies.ac.uk", + "glamorgan.ac.uk", + "glamourtits.com", + "glan-hafren.ac.uk", + "glasamerike.net", + "glasgow-caledonian.ac.uk", + "glasgow-nautical.ac.uk", + "glasgow.ac.uk", + "glasgowclyde.ac.uk", + "glasgowcolleges.ac.uk", + "glasgowkelvin.ac.uk", + "glasgowmedhums.ac.uk", + "glasgowmet.ac.uk", + "glasgowschoolofart.ac.uk", + "glasgowsciencecentre.ac.uk", + "glasgowsequencingsolutions.ac.uk", + "glass8.eu", + "gleline.com", + "glen-coll.ac.uk", + "glenfife.ac.uk", + "glenrothes-college.ac.uk", + "glhl.ac.uk", + "gllm.ac.uk", + "global-sci.org", + "globalbanking.ac.uk", + "globalbusinessofforcedlabour.ac.uk", + "globaledu.org", + "globaljihad.net", + "globalmediaoutreach.com", + "globalmuseumoncommunism.org", + "globalrescue.net", + "globalriskregulator.com", + "globalsecurity.org", + "globalshakespeare.ac.uk", + "globalsign-media.com", + "globalsign.be", + "globalsign.ch", + "globalsign.cloud", + "globalsign.co.uk", + "globalsign.com.au", + "globalsign.com.br", + "globalsign.com.hk", + "globalsign.com.sg", + "globalsign.es", + "globalsign.eu", + "globalsign.fr", + "globalsign.net", + "globalsign.nl", + "globalspec.com", + "globaltm.org", + "globalvoices.org", + "globalvoicesonline.org", + "globalvpn.net", + "globolakes.ac.uk", + "glock.com", + "gloknos.ac.uk", + "gloporn.com", + "gloryhole.com", + "gloryholeswallow.com", + "gloryofheracles.com", + "glorystar.me", + "glos.ac.uk", + "gloscat.ac.uk", + "gloscol.ac.uk", + "gloscolgov.ac.uk", + "gloscollege.ac.uk", + "glosnexus.ac.uk", + "gloucestershire.ac.uk", + "gloucestershirecollege.ac.uk", + "gloucestershirecolleges.ac.uk", + "gloucestershirelaunchpad.ac.uk", + "gloucs.ac.uk", + "glovitas.ac.uk", + "glow.ac.uk", + "glsms.ac.uk", + "gltc.ac.uk", + "gluckman.com", + "glyndwr.ac.uk", + "glyndwrlondonholdingslimited.ac.uk", + "glyndwrlondonschoolofmanagementandscience.ac.uk", + "glype.com", + "glyphsapp.com", + "gmail.com", + "gmc.ac.uk", + "gmcg.ac.uk", + "gmcyberfoundry.ac.uk", + "gmgard.com", + "gmhigher.ac.uk", + "gmhz.org", + "gmiddle.com", + "gmiddle.net", + "gmims.ac.uk", + "gmll.org", + "gmms.ac.uk", + "gmnetworks.net", + "gmodules.com", + "gmoney.org", + "gmossp-sp.jp", + "gmsa.ac.uk", + "gmx.net", + "gnai-dh.sbs", + "gnailapp.sbs", + "gnatwork.ac.uk", + "gnci.org.hk", + "gnews.org", + "gnom-cham.com", + "gnu.org", + "gnzi.xyz", + "gnzi1.top", + "go-disneyworldgo.com", + "go-gaytube.com", + "go-lang.com", + "go-lang.net", + "go-lang.org", + "go-pki.com", + "go.com", + "go.dev", + "go141.com", + "go2av.com", + "go4uni.ac.uk", + "go5.dev", + "go6.si", + "goagent.biz", + "goagentplus.com", + "goagle.de", + "goals.ac.uk", + "gobeatsye.com", + "gobet.cc", + "gobianywhere.com", + "gobuildx.net", + "gobuyonlinestore.net", + "gockhuatviet.com", + "godaddy.com", + "godalming.ac.uk", + "godfootsteps.org", + "godns.work", + "godoc.org", + "godsdirectcontact.co.uk", + "godsdirectcontact.org", + "godsdirectcontact.org.tw", + "godsimmediatecontact.com", + "goduckgo.com", + "goetec.ac.uk", + "gofile.me", + "gofit.ac.uk", + "gofucker.com", + "gofuckmenow.com", + "gofundme.com", + "gog-statics.com", + "gog.com", + "gogeo.ac.uk", + "gogle.com", + "gogle.de", + "gogo-load.com", + "gogoanime.vc", + "gogoanime.wiki", + "gogoanime3.co", + "gogocdn.net", + "gogole.com", + "gogotaku.info", + "gogotunnel.com", + "gohappy.com.tw", + "gohentai.net", + "gohigherwestyorks.ac.uk", + "gokbayrak.com", + "golang.com", + "golang.net", + "golang.org", + "gold-gay.com", + "gold.ac.uk", + "goldbet.com", + "goldbetsports.com", + "goldcoastbulletin.com.au", + "golden-ages.org", + "goldeneyevault.com", + "goldenfrog.com", + "goldengate.hu", + "goldgay.tv", + "goldjizz.com", + "goldnikeclub.com", + "goldproject.ac.uk", + "goldsexvideos.com", + "goldsmiths.ac.uk", + "goldstep.net", + "goldteenporn.com", + "goldvip.cyou", + "goldwave.com", + "golos-ameriki.ru", + "golosameriki.com", + "gongkou-cc.sbs", + "gonglchuangl.net", + "gongm.in", + "gongmeng.info", + "gongminliliang.com", + "gongwt.com", + "gonike.com", + "gonzo-movies.com", + "gonzo.com", + "goo.gl", + "goo.gle", + "goo.ne.jp", + "good-gay.com", + "gooday.xyz", + "gooddaychicago.com", + "gooddns.info", + "goodenough.ac.uk", + "goodhope.school", + "goodporn.to", + "goodporno.cc", + "goodreaders.com", + "goodreads.com", + "goodsdunk.net", + "goodsexporn.org", + "goodtv.com.tw", + "goodtv.tv", + "goofind.com", + "googel.com", + "googel.de", + "googil.com", + "googl.com", + "google-access.net", + "google-analytics-cn.com", + "google-analytics.com", + "google-base.de", + "google-syndication.com", + "google.ad", + "google.ae", + "google.al", + "google.am", + "google.as", + "google.at", + "google.az", + "google.ba", + "google.be", + "google.berlin", + "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", + "google.co", + "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.nf", + "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.dev", + "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.gp", + "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.net", + "google.nl", + "google.no", + "google.nr", + "google.nu", + "google.org", + "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.tk", + "google.tl", + "google.tm", + "google.tn", + "google.to", + "google.tt", + "google.ventures", + "google.vg", + "google.vu", + "google.ws", + "googleacquisitionmigration.com", + "googleadapis.com", + "googleads-cn.com", + "googleads.com", + "googleadservices-cn.com", + "googleadservices.com", + "googleadsserving.cn", + "googleanalytics.com", + "googleapis.cn", + "googleapis.com", + "googleapps.com", + "googlearth.com", + "googleartproject.com", + "googleblog.com", + "googlebot.com", + "googlecapital.com", + "googlecert.net", + "googlechinawebmaster.com", + "googlecode.com", + "googlecommerce.com", + "googlecompare.co.uk", + "googledanmark.com", + "googledomains.com", + "googledrive.com", + "googlee.com", + "googleearth.com", + "googlefiber.com", + "googlefiber.net", + "googlefinland.com", + "googlegroups.com", + "googlehosted.com", + "googleideas.com", + "googleinsidesearch.com", + "googlelabs.com", + "googlelocal.nl", + "googlemail.com", + "googlemaps.com", + "googlemaps.sv", + "googlemashups.com", + "googleoptimize-cn.com", + "googleoptimize.com", + "googlepagecreator.com", + "googlephotos.com", + "googleplay.com", + "googleplus.com", + "googlescholar.com", + "googlesile.com", + "googlesource.com", + "googlestore.com", + "googlesverige.com", + "googlesyndication-cn.com", + "googlesyndication.com", + "googletagmanager-cn.com", + "googletagmanager.com", + "googletagservices-cn.com", + "googletagservices.com", + "googletraveladservices-cn.com", + "googletraveladservices.com", + "googleusercontent.com", + "googlevads-cn.com", + "googleventures.com", + "googlevideo.com", + "googleweblight.com", + "googlezip.net", + "googlr.com", + "goole-college.ac.uk", + "goolge.com", + "gooogle.com", + "gopetition.com", + "gopivotal.com", + "gopivotal.net", + "goporngate.com", + "goproxing.net", + "goragay.com", + "gordonmoore.com", + "goreforum.com", + "goregrish.com", + "gorin.jp", + "gorseinon-bizcentre.ac.uk", + "gorseinon.ac.uk", + "gosc.ac.uk", + "gosexpod.com", + "goshemalecams.com", + "gospelherald.com", + "gosport.ac.uk", + "gosportmarineskillscentre.ac.uk", + "gosq.co", + "gosq.com", + "gossipfuli4511.xyz", + "gossipfuli5522.xyz", + "gossipfuli6883.xyz", + "gostorego.com", + "gostosanovinha.com", + "got-game.org", + "gotblop.com", + "gotcosmos.com", + "gotdns.ch", + "gotgayporn.com", + "gotgeeks.com", + "gothdporn.com", + "gotporn.com", + "gotraffic.net", + "gotrusted.com", + "gotw.ca", + "gouri.xyz", + "gov.taipei", + "gov.tw", + "governmentengineer.com", + "govforce.com", + "gowales.ac.uk", + "gower.ac.uk", + "gowercollege.ac.uk", + "gowercollegeswansea.ac.uk", + "gpkss.ac.uk", + "gpstheseries.com", + "gpucomputing.ac.uk", + "gputechconf.co.kr", + "gputechconf.com", + "gputechconf.com.au", + "gputechconf.com.tw", + "gputechconf.eu", + "gputechconf.in", + "gputechconf.jp", + "gqzmnav.cc", + "gr-assets.com", + "gr8domain.biz", + "gr8name.biz", + "grabhentai.com", + "grabpussy.com", + "grace.ac.uk", + "grad2teach.ac.uk", + "gradcareers-scotland.ac.uk", + "gradconnection.com", + "gradeuptube.com", + "gradschools.ac.uk", + "graduate-careers-wales.ac.uk", + "graduate-jobs-in-wales.ac.uk", + "graduate-jobs.ac.uk", + "graduatecareers-wales.ac.uk", + "graduateconnection.ac.uk", + "graduateoutcomes.ac.uk", + "graduateswales.ac.uk", + "graduatewales.ac.uk", + "grafolio.com", + "graias.com", + "graiasmovies.com", + "grammaly.com", + "grandepornogratis.com", + "grandfuckauto.xxx", + "grandtrial.org", + "granduniondtp.ac.uk", + "graneodin.com.mx", + "grangorz.org", + "grannygetsafacial.com", + "grannylister.com", + "grannylovesbbc.com", + "grannylovesyoungcock.com", + "grannytube.net", + "grantham.ac.uk", + "grantleyhall.ac.uk", + "graph.org", + "graphenecentre.ac.uk", + "graphengine.io", + "graphis.ne.jp", + "graphql.org", + "gravatar.com", + "gravitytank.com", + "gray.ac.uk", + "graylab.ac.uk", + "grazie.ai", + "grcb.ac.uk", + "gre.ac.uk", + "greasespot.net", + "great-firewall.com", + "great-roc.org", + "greatapedictionary.ac.uk", + "greatergothammini.com", + "greatermanchesterbiobankingnetwork.ac.uk", + "greatermanchestercolleges.ac.uk", + "greatermanchesterinternationalmedicalschool.ac.uk", + "greatermanchestermedicalschool.ac.uk", + "greatfire.org", + "greatfirewall.biz", + "greatfirewallofchina.net", + "greatfirewallofchina.org", + "greatretroporn.com", + "greatroc.org", + "greatroc.tw", + "greatwesternresearch.ac.uk", + "greatzhonghua.org", + "greenbankcollege.ac.uk", + "greenbuildingstudio.com", + "greenend.org.uk", + "greenfieldbookstore.com.hk", + "greenhead.ac.uk", + "greenhill.ac.uk", + "greenlakeaas.com", + "greenlakehybridcloud.com", + "greenparty.org.tw", + "greenpeace.com.tw", + "greenpeace.org", + "greenplum.net", + "greenreadings.com", + "greenvpn.net", + "greenvpn.org", + "greenwich-college.ac.uk", + "greenwich.ac.uk", + "greenwichdev.ac.uk", + "greginhollywood.com", + "gregynog.ac.uk", + "gresham-college.ac.uk", + "gresham.ac.uk", + "greshamcollege.ac.uk", + "grid-support.ac.uk", + "grid.ac.uk", + "gridaware.app", + "gridpp.ac.uk", + "grids.ac.uk", + "grimsby.ac.uk", + "grimsbytec.ac.uk", + "grindr.com", + "grooby.com", + "grotty-monday.com", + "groupfun.com", + "groups.com", + "grow.google", + "grows.ac.uk", + "grpeng.ac.uk", + "grss-ieee.org", + "grupobmw.com", + "gs-discuss.com", + "gsa.ac.uk", + "gscanada.info", + "gsccdn.com", + "gsearch.media", + "gslink.us", + "gsmd.ac.uk", + "gsmlondon.ac.uk", + "gsrc.io", + "gssw.ac.uk", + "gstatic.com", + "gstf.org", + "gsuite.com", + "gt536.top", + "gtc.ac.uk", + "gtricks.com", + "gts-vpn.com", + "gttr.ac.uk", + "gtv.org", + "gtv1.org", + "gtvmediagroupfairfund.com", + "gtyarmouthcoll.ac.uk", + "gu-chu-sum.org", + "gu-web.net", + "guaguass.com", + "guaguass.org", + "guambmw.com", + "guancha.org", + "guaneryu.com", + "guangming.com.my", + "guangming.org", + "guangnianvpn.com", + "guaranitermal.com", + "guardianapis.com", + "guardianapps.co.uk", + "guardianproject.info", + "guardster.com", + "gucci.com", + "guccimuseo.com", + "guccitimeless.com", + "guifw.xyz", + "guildford.ac.uk", + "guildhallschool.ac.uk", + "guildhe.ac.uk", + "guim.co.uk", + "guimcode.co.uk", + "guishan.org", + "gumroad.com", + "gumtree.sg", + "gun-world.net", + "gunsamerica.com", + "gunsandammo.com", + "guo.media", + "guochantube.com", + "guochanw.life", + "guruofporn.com", + "guruonline.hk", + "gutteruncensored.com", + "guysnightlife.com", + "gv.com", + "gvideo.de", + "gvlib.com", + "gvm.com.tw", + "gvt0.com", + "gvt1.com", + "gvt2.com", + "gvt3.com", + "gvt5.com", + "gvt6.com", + "gvt7.com", + "gvt9.com", + "gw-partnership.ac.uk", + "gw4-cat.ac.uk", + "gw4.ac.uk", + "gw4biomed.ac.uk", + "gwave.com", + "gwent.ac.uk", + "gwiki.net", + "gwins.org", + "gwktravelex.nl", + "gwr.ac.uk", + "gwtproject.org", + "gyakusimei.com", + "gyalwarinpoche.com", + "gyatsostudio.com", + "gyc.ac.uk", + "gynoexam.info", + "gyutte.site", + "gyutto.com", + "gzm.tv", + "gzone-anime.info", + "h-cdn.com", + "h-china.org", + "h-comic.com", + "h-doujinshi.xyz", + "h-flash.com", + "h-moe.com", + "h-webtoon.com", + "h0930.com", + "h18ani1.vip", + "h1n1china.org", + "h2porn.com", + "h528.com", + "h5dm.com", + "h5galgame.me", + "hace.ac.uk", + "hacg.club", + "hacg.in", + "hacg.li", + "hacg.me", + "hacg.red", + "hackday.com.au", + "hacken.cc", + "hacker.org", + "hackerfacebook.com", + "hackerguardian.com", + "hackfacebook.com", + "hackfacebookid.com", + "hacklang.org", + "hackmd.io", + "hackney.ac.uk", + "hacksear.ch", + "hackthatphone.net", + "hackthedrive.com", + "hackyourconsole.com", + "hadesex.com", + "hadlow.ac.uk", + "hadlowgroup.ac.uk", + "hae-acl.ac.uk", + "haha888.xyz", + "hahlo.com", + "haho.moe", + "haijiao.com", + "hairdressing.ac.uk", + "hairy-amateurs.com", + "hairy-beauty.com", + "hairy-women-pussy.net", + "hairyclassic.com", + "hairydivas.com", + "hairynature.com", + "hairyolder.com", + "hairypornsite.com", + "haisetu.net", + "haitenjp.com", + "haiwaikan.com", + "hakkatv.org.tw", + "halcyon.ac.uk", + "halesowen.ac.uk", + "half.com", + "half.tv", + "halfcanada.com", + "halfjapan.com", + "halktv.com.tr", + "halton-acl.ac.uk", + "haltoncollege.ac.uk", + "hamec.ac.uk", + "hami-mod.buzz", + "hampsteadscience.ac.uk", + "hamsterfucktube.com", + "hamsterporn.tv", + "hanbao-tv.lol", + "handbags-nike.com", + "handbagsoutletebay.com", + "handcraftedsoftware.org", + "handjobhub.com", + "handjobtube4free.com", + "handsworth.ac.uk", + "hanime.me", + "hanime.tv", + "hanime.xxx", + "hanime1.me", + "hanminzu.org", + "hannah.ac.uk", + "hanr-bao.mom", + "hanunyi.com", + "hao.news", + "hao123.com", + "hao123img.com", + "hao21.xyz", + "hao62.xyz", + "haori888.com", + "haplorrhini.com", + "happy-vpn.com", + "happymeal.co.nz", + "happymeal.com", + "happymeal.com.au", + "happymealdigital.com", + "haproxy.org", + "hardcore-sex-filme.com", + "hardcoregayblog.com", + "hardsex8.com", + "hardsextube.com", + "hardx.com", + "harica.gr", + "haringey6.ac.uk", + "harlaxton.ac.uk", + "harlech.ac.uk", + "harlow-college.ac.uk", + "harper-adams.ac.uk", + "harper.ac.uk", + "harperacademic.com", + "harperadams.ac.uk", + "harperapps.com", + "harpercollins.ca", + "harpercollins.co.in", + "harpercollins.co.uk", + "harpercollins.com", + "harpercollins.com.au", + "harpercollinsadvantage.com", + "harpercollinschildrensbooks.co.uk", + "harpercollinschristian.com", + "harpercollinsspeakersbureau.com", + "harperkeelevets.ac.uk", + "harperkeelevetschool.ac.uk", + "harrogate-college.ac.uk", + "harrogate.ac.uk", + "harrow.ac.uk", + "hartlepoolacademy.ac.uk", + "hartlepoolacl.ac.uk", + "hartlepoolfe.ac.uk", + "hartlepoolsixth.ac.uk", + "hartpury.ac.uk", + "hartpurycollege.ac.uk", + "hartpuryuni.ac.uk", + "hartpuryuniversity.ac.uk", + "hartpuryuniversitycentre.ac.uk", + "hartree.ac.uk", + "harunyahya.com", + "hashflow.com", + "hashicorp.com", + "hasi.wang", + "haskell.org", + "haskellstack.org", + "hastings.ac.uk", + "hastingsonline.ac.uk", + "hath.network", + "hau.ac.uk", + "hautelook.com", + "hautelookcdn.com", + "havant.ac.uk", + "havantandsouthdowns.ac.uk", + "havantsouthdowns.ac.uk", + "have8.com", + "haveibeenpwned.com", + "havering-college.ac.uk", + "havering-sfc.ac.uk", + "havering.ac.uk", + "hawaiibmw.com", + "hayabusa.dev", + "hayabusa.io", + "hayabusa.media", + "hayle.ac.uk", + "haywardsheath.ac.uk", + "hbabit.com", + "hbfile.net", + "hbg.com", + "hbo.com", + "hbo.map.fastly.net", + "hboasia.com", + "hbogo.co.th", + "hbogo.com", + "hbogo.eu", + "hbogoasia.com", + "hbogoasia.hk", + "hbogoasia.id", + "hbogoasia.ph", + "hbogoasia.sg", + "hbogoasia.tw", + "hbomax.com", + "hbomaxcdn.com", + "hbonow.com", + "hbox.jp", + "hbrowse.com", + "hbs.ac.uk", + "hbvc.ac.uk", + "hca.ac.uk", + "hcaptcha.com", + "hcaptchastatus.com", + "hcbdsm.com", + "hcctraining.ac.uk", + "hcebusiness.ac.uk", + "hcfe.ac.uk", + "hclips.com", + "hclrg.ac.uk", + "hcomic.net", + "hcomicbook.com", + "hcpdts.com", + "hcri.ac.uk", + "hct.ac.uk", + "hcuc.ac.uk", + "hd-tubes.com", + "hdabla.net", + "hdb1.app", + "hdbigass.com", + "hddgames.cc", + "hddirectv.com", + "hdfreeporn.net", + "hdgaytube.xxx", + "hdhole.com", + "hdjavonline.com", + "hdlt.me", + "hdouban.com", + "hdouban2.com", + "hdouga.com", + "hdporn1080.net", + "hdporn92.com", + "hdporncomics.com", + "hdpornfree.xxx", + "hdpornmax.net", + "hdpornt.com", + "hdpornvideo.xxx", + "hdready.xxx", + "hdreporn.com", + "hdrplusdata.org", + "hdruk.ac.uk", + "hdsex.pro", + "hdsexxx.net", + "hdsky.me", + "hdtube.co", + "hdtube1.com", + "hdtvb.net", + "hdvideosporn.net", + "hdxnxx.xxx", + "hdxx.tv", + "hdzog.com", + "he-purchasing.ac.uk", + "he.net", + "heacademy.ac.uk", + "headline.ac.uk", + "headlinejobs.hk", + "headphonepubs.com", + "headphones-cool.com", + "headphones-dre.com", + "headphones-outlet-online.com", + "headphonesbeatsaudio.com", + "headphonesbeatsbydre.com", + "headphoneses.com", + "headphoneshome.com", + "headphoneshotsales.com", + "headphonesol.com", + "headphonesretailer.com", + "headphonessupply.com", + "headphonezip.com", + "headset987.com", + "headteachers.ac.uk", + "health.ac.uk", + "health026.click", + "healthcare.ac.uk", + "healthcarecareeronline.com", + "healthcarescience.ac.uk", + "healthcaretechnologies.ac.uk", + "healthdataresearchuk.ac.uk", + "healtheducation.ac.uk", + "healthreach.hk", + "healthsciencescotland.ac.uk", + "healthyuniversities.ac.uk", + "hear.ac.uk", + "heart.ac.uk", + "heartbreakers.gallery", + "heartbreakers.info", + "heartofworcestershirecollege.ac.uk", + "heartofworcestershirelawschool.ac.uk", + "heartyit.com", + "heat.ac.uk", + "heated.ac.uk", + "heaven-burns-red.com", + "heavenlyhentai.com", + "heavy-r.com", + "heavyfetish.com", + "hebcon.ac.uk", + "hebetterregulation.ac.uk", + "hebiphone.com", + "hec.su", + "hecail.ac.uk", + "hecaitou.net", + "hecbiosim.ac.uk", + "hechaji.com", + "hecollegeadvisersinlondon.ac.uk", + "hecsu.ac.uk", + "hector.ac.uk", + "hedata.ac.uk", + "hedd.ac.uk", + "hedg.ac.uk", + "hediip.ac.uk", + "hedip.ac.uk", + "heeact.edu.tw", + "heefs.ac.uk", + "heeg.ac.uk", + "heep.ac.uk", + "heesf.ac.uk", + "heestates.ac.uk", + "hefce.ac.uk", + "hefcw.ac.uk", + "hefestis.ac.uk", + "hegovernance.ac.uk", + "hegre-art.com", + "hegre.com", + "hei-worcester.ac.uk", + "heia.ac.uk", + "heidi.ac.uk", + "heids.ac.uk", + "heiguab.top", + "heijidi.life", + "heilbronn.ac.uk", + "heinlondon.ac.uk", + "heinonline.org", + "heise360181.buzz", + "heise360182.buzz", + "helf.ac.uk", + "helixstudios.net", + "helloandroid.com", + "helloavgirls.com", + "hellofuture.ac.uk", + "hellokittybeats.com", + "helloqueer.com", + "hellosmartbook.com", + "helloss.pw", + "hellotxt.com", + "hellouk.org", + "hellporno.com", + "hellven.net", + "heloa.ac.uk", + "helpeachpeople.com", + "helplinfen.com", + "helpshift.com", + "helpster.de", + "helpuyghursnow.org", + "helpzhuling.org", + "hendon.ac.uk", + "henduohao.com", + "henley-cov.ac.uk", + "henley.ac.uk", + "henleycol.ac.uk", + "henleycollege.ac.uk", + "henleymc.ac.uk", + "henry-moore.ac.uk", + "henryfordcollege.ac.uk", + "hensa.ac.uk", + "henshaws.ac.uk", + "hentai-ani.me", + "hentai-archive.com", + "hentai-books.com", + "hentai-cosplays.com", + "hentai-covers.site", + "hentai-eroanime.net", + "hentai-for.net", + "hentai-fun.com", + "hentai-gamer.com", + "hentai-gif-anime.com", + "hentai-img.com", + "hentai-moon.com", + "hentai-vostfr.net", + "hentai.desi", + "hentai.game", + "hentai.io", + "hentai.name", + "hentai.pink", + "hentai.pro", + "hentai.to", + "hentai.toys", + "hentai.tv", + "hentai0.com", + "hentai01.com", + "hentai2.net", + "hentai2012.com", + "hentai247.net", + "hentai24h.org", + "hentai24h.tv", + "hentai2games.com", + "hentai2read.com", + "hentai2w.com", + "hentai3dvideo.biz", + "hentai44.com", + "hentai4free.net", + "hentai4manga.com", + "hentai69.life", + "hentai69.online", + "hentaia.net", + "hentaiaction.net", + "hentaiasmr.moe", + "hentaiathome.net", + "hentaibaka.one", + "hentaibar.com", + "hentaiblue.com", + "hentaibros.com", + "hentaicity.com", + "hentaicloud.com", + "hentaiclub.net", + "hentaicomic.ru", + "hentaicomics.asia", + "hentaicomics.life", + "hentaicore.net", + "hentaicore.org", + "hentaicovid.com", + "hentaidirectory.org", + "hentaidude.com", + "hentaidude.xxx", + "hentaienvy.com", + "hentaiera.com", + "hentaiero.net", + "hentaifc.com", + "hentaifox.com", + "hentaifox.tv", + "hentaifreak.org", + "hentaifromhell.org", + "hentaigamer.org", + "hentaigamesplanet.com", + "hentaigasm.com", + "hentaihand.com", + "hentaihaven.com", + "hentaihaven.io", + "hentaihaven.me", + "hentaihaven.red", + "hentaihaven.xxx", + "hentaiheadlines.com", + "hentaihere.com", + "hentaiheroes.com", + "hentaihub.xxx", + "hentaikey.com", + "hentaiknight.com", + "hentailabs.com", + "hentailegendado.com", + "hentaimama.io", + "hentaimangaporn.com", + "hentaimovieplanet.com", + "hentainanime.com", + "hentainhaven.com", + "hentainstream.com", + "hentaipapa.com", + "hentaipaw.com", + "hentaiplay.net", + "hentaiporn.com", + "hentaipornonly.com", + "hentaiprn.com", + "hentaiprno.com", + "hentaipros.com", + "hentairead.com", + "hentairead.info", + "hentairead.vip", + "hentairox.com", + "hentairules.net", + "hentais.tube", + "hentaisea.com", + "hentaiseason.com", + "hentaispark.com", + "hentaistream.com", + "hentaistream.tv", + "hentaistube.com", + "hentaisub.info", + "hentaitalk.com", + "hentaitk.com", + "hentaitokyo.com", + "hentaitube.online", + "hentaitube.tv", + "hentaiverse.org", + "hentaivideos.net", + "hentaivideoworld.com", + "hentaivn.de", + "hentaivn.la", + "hentaivn.net", + "hentaivvz.com", + "hentaiworld.eu", + "hentaiworld.tv", + "hentaiworldporn.com", + "hentaix.me", + "hentaixxx.vip", + "hentaixxxvids.com", + "hentaiyes.com", + "hentaiz.co", + "hentaiz.mobi", + "hentaiz.vip", + "hentaizap.com", + "hentaizilla.com", + "hentaizz.net", + "henti-night.com", + "hep.ac.uk", + "hepa.ac.uk", + "hepcw.ac.uk", + "hepi.ac.uk", + "hepp.ac.uk", + "heptio.com", + "heqinglian.net", + "hera.ac.uk", + "heraldsun.com.au", + "herbi.ac.uk", + "herc.ac.uk", + "here.com", + "hereford-art-col.ac.uk", + "hereford-tech.ac.uk", + "hereford.ac.uk", + "hereistheporn.com", + "hereward.ac.uk", + "herexxx.com", + "heriot-watt.ac.uk", + "heritage.org", + "heritageconsortium.ac.uk", + "heritagequay.ac.uk", + "heritagescience.ac.uk", + "hernudepics.com", + "heroero.com", + "heroesofdragonage.com", + "heroesofthestorm.com", + "heroku-app.com", + "heroku-charge.com", + "heroku.co", + "heroku.com", + "heroku.me", + "herokuapp.com", + "herokucdn.com", + "herokucharge.com", + "herokussl.com", + "heron.ac.uk", + "herringnetwork.com", + "hertfordshire.ac.uk", + "hertfordshirebusinessschool.ac.uk", + "hertreg.ac.uk", + "herts-e-learn.ac.uk", + "herts-he.ac.uk", + "herts-regional.ac.uk", + "herts.ac.uk", + "hesa.ac.uk", + "hesharedlegal.ac.uk", + "hesin.ac.uk", + "hespa.ac.uk", + "hestem.ac.uk", + "heswbusnet.ac.uk", + "hetzner.cloud", + "hetzner.com", + "hetzner.company", + "hetzner.de", + "heungkongdiscuss.com", + "hew.ac.uk", + "hewit.ac.uk", + "hewlett-packard.asia", + "hewlett-packard.ch", + "hewlett-packard.co", + "hewlett-packard.co.il", + "hewlett-packard.co.uk", + "hewlett-packard.com.cn", + "hewlett-packard.com.mx", + "hewlett-packard.com.sg", + "hewlett-packard.jp", + "hewlett-packard.mobi", + "hewlettpackard.enterprises", + "hex.pm", + "hexatronik.com", + "hexdocs.pm", + "hexieshe.com", + "hexieshe.xyz", + "hexxeh.net", + "hey.boo", + "heydoga.com", + "heydouga.com", + "heythrop.ac.uk", + "heythropcollege.ac.uk", + "heyuedi.com", + "heywire.com", + "heyzo.com", + "hf-iphone.com", + "hfaes.ac.uk", + "hfals.ac.uk", + "hfma.ac.uk", + "hg.cool", + "hgamefree.info", + "hgamer.pro", + "hgseav.com", + "hh-content.com", + "hhc.ac.uk", + "hhdcb3office.org", + "hhthesakyatrizin.org", + "hhvm.com", + "hi-on.org.tw", + "hibdontire.com", + "hiccears.com", + "hidden-advent.org", + "hiddenhistorieswwi.ac.uk", + "hiddenvoyeurspy.com", + "hiddify.com", + "hide.me", + "hidecloud.com", + "hidefporn.ws", + "hidein.net", + "hideipvpn.com", + "hideman.net", + "hideme.nl", + "hidemy.name", + "hidemyass.com", + "hidemycomp.com", + "hidive.com", + "hifacebook.info", + "hifiporn.fun", + "hifixxx.fun", + "hifuli.com", + "higfw.com", + "highbolt.net", + "highbury.ac.uk", + "highburygroup.ac.uk", + "highdefinitionbeatsbydre.com", + "higher-education.ac.uk", + "highfieldscentre.ac.uk", + "highlands-jersey.ac.uk", + "highlands.ac.uk", + "highpeak.ac.uk", + "highpeakspureearth.com", + "highporn.net", + "highrockmedia.com", + "hightail.com", + "hightopnikes.com", + "highwirepress.com", + "hihiforum.com", + "hihigv.com", + "hihistory.net", + "hiitch.com", + "hikinggfw.org", + "hilderstone.ac.uk", + "hilive.tv", + "hillcroft.ac.uk", + "hillsroad.ac.uk", + "hilostripper.com", + "himalaya.exchange", + "himalayan-foundation.org", + "himalayanglacier.com", + "himemix.com", + "himemix.net", + "hindawi.com", + "hindiweb.com", + "hindustantimes.com", + "hinet.net", + "hipaa6020.com", + "hiperduct.ac.uk", + "hiporn.net", + "hippyhillscomix.com", + "hipzoom.net", + "hison.ac.uk", + "historicalmusicpedagogy.ac.uk", + "historicalpageants.ac.uk", + "historicbooks.ac.uk", + "history-uk.ac.uk", + "history.ac.uk", + "historyofdota.com", + "historyofdota.net", + "historyofdota.org", + "historysubjectcentre.ac.uk", + "histparl.ac.uk", + "hiswifepussy.com", + "hitbdsm.com", + "hitbtc.com", + "hitomi.la", + "hitun.io", + "hitxhot.com", + "hiwifi.com", + "hizb-ut-tahrir.info", + "hizb-ut-tahrir.org", + "hizbuttahrir.org", + "hjb246.top", + "hjb7e9.top", + "hjclub.info", + "hjd.tw", + "hjd2048.com", + "hk-pub.com", + "hk01.com", + "hk1lib.org", + "hk32168.com", + "hkacg.com", + "hkacg.net", + "hkatvnews.com", + "hkbc.net", + "hkbf.org", + "hkbigman.net", + "hkbn.com.hk", + "hkbn.net", + "hkbnes.net", + "hkbookcity.com", + "hkchronicles.com", + "hkchurch.org", + "hkci.org.hk", + "hkcircleapp.com", + "hkcitizenmedia.com", + "hkcmi.edu", + "hkcnews.com", + "hkcoc.com", + "hkcsl.com", + "hkctu.org.hk", + "hkdailynews.com.hk", + "hkday.net", + "hkdc.us", + "hkdf.org", + "hkedcity.net", + "hkej.com", + "hkepc.com", + "hket.com", + "hketgroup.com", + "hkf2023.lat", + "hkf202311.site", + "hkf202312.shop", + "hkfaa.com", + "hkfreezone.com", + "hkfront.org", + "hkgalden.com", + "hkgolden.com", + "hkgolden.media", + "hkgpao.com", + "hkgreenradio.org", + "hkheadline.com", + "hkhkhk.com", + "hkhrc.org.hk", + "hkhrm.org.hk", + "hkip.org.uk", + "hkja.org.hk", + "hkjc.com", + "hkjp.org", + "hklft.com", + "hklts.org.hk", + "hkmap.live", + "hkopentv.com", + "hkpeanut.com", + "hkporn.net", + "hkptu.org", + "hkreadingcity.net", + "hkreporter.com", + "hkt-enterprise.com", + "hkt-eye.com", + "hkt.com", + "hkteducation.com", + "hktpremier.com", + "hktshop.com", + "hku.hk", + "hkusu.net", + "hkvets.ac.uk", + "hkvwet.com", + "hkwcc.org.hk", + "hkzone.org", + "hlbelygl.com", + "hlcollege.ac.uk", + "hlg.ac.uk", + "hlnsc.ac.uk", + "hlsp1.pw", + "hm.com", + "hmd.site", + "hmfby.com", + "hmfun.top", + "hmoegirl.com", + "hmonghot.com", + "hmovie-moe.us", + "hmsxpress.com", + "hmv.co.jp", + "hmvdigital.ca", + "hmvdigital.com", + "hnalady.com", + "hnext.jp", + "hnjhj.com", + "hnntube.com", + "ho5ho.com", + "hobonichielog.com", + "hochi.news", + "hockeyapp.net", + "hoes.com", + "hogarth.ac.uk", + "hojemacau.com.mo", + "hola.com", + "hola.org", + "holaporno.xxx", + "holdemstripem.com", + "holloporn.com", + "hollyrandall.com", + "holmelacy.ac.uk", + "hololens.com", + "holts.ac.uk", + "holycross.ac.uk", + "holymountaincn.com", + "holyspiritspeaks.org", + "home-made-porn-movies.com", + "home-made-videos.com", + "home-sex-tapes.com", + "home-song.com", + "homealonemilfs.com", + "homedepot-static.com", + "homedepot.com", + "homefieldcollege.ac.uk", + "homefuckingmovies.com", + "homegrownfreaks.net", + "homemade-porn-video.com", + "homemadeamateur.com", + "homemadeanalporn.com", + "homemadefucktube.com", + "homemadepornclip.com", + "homemadeporntubes.com", + "homemadevids.net", + "homemoviestube.com", + "homenetworks.ac.uk", + "homeperversion.com", + "homephoneplus.com", + "homepornbay.com", + "homepornking.com", + "homepornvideo.net", + "homeservershow.com", + "homesexmade.com", + "homestylerapp.com", + "homestylernews.com", + "hometrack.com.au", + "hominis.media", + "homo.xxx", + "homofans.blogspot.com", + "honawalaan.com", + "honestpornreviews.com", + "honey-monitoring.ac.uk", + "honeynet.org", + "hongjie10.xyz", + "hongjie11.xyz", + "hongkongdoll.tv", + "hongkongdollvideo.org", + "hongkongfp.com", + "hongkongpost.gov.hk", + "hongmeimei.com", + "hongzhi.li", + "honkaiimpact3.com", + "honkaistarrail.com", + "honnaka.jp", + "honven.xyz", + "hoodamateurs.com", + "hooligapps.com", + "hooloo.tv", + "hoolu.com", + "hoolu.tv", + "hootsuite.com", + "hoover.org", + "hoovers.com", + "hope.ac.uk", + "hopedialogue.org", + "hopstop.tv", + "hopto.org", + "hopwood.ac.uk", + "horizon.ac.uk", + "horizonscollege.ac.uk", + "horizontal-llc.com", + "horizontal-systems.com", + "horizontalglue.com", + "horizontalsystems.com", + "horniman.ac.uk", + "hornybitches.org", + "hornybutt.com", + "hornychat.net", + "hornyelephant.com", + "hornygamer.com", + "hornygfporn.com", + "hornygirlsonline.org", + "hornyjav.com", + "hornytrip.com", + "hornywhores.net", + "horrorporn.com", + "horse-cum.net", + "horse4sex.com", + "horsecock.guru", + "horsecumshot.net", + "horsedick.net", + "horsedicks.net", + "horsemecum.com", + "horseporn.tv", + "hostborneo.org", + "hostloc.com", + "hot-arab-films.com", + "hot-cartoon.com", + "hot-gayporn.com", + "hot-sex-photos.com", + "hot-sex-tube.com", + "hot-teens.com", + "hot2048.com", + "hotair.com", + "hotamateurblowjobs.com", + "hotasianbabes.com", + "hotav.tv", + "hotbeatsonsale.com", + "hotbed.ac.uk", + "hotcandyland.com", + "hotcoin.com", + "hotcuckoldwife.com", + "hotcumporn.com", + "hotels.cn", + "hotescortdusseldorf.com", + "hotfiesta.com", + "hotfrog.com.tw", + "hotfucktube.com", + "hotgaylist.com", + "hotgirl.asia", + "hotgirlsclips.com", + "hotgoo.com", + "hothdsex.xxx", + "hothomemade.com", + "hotindianbabe.com", + "hotindianxxxsex.com", + "hotjav.tv", + "hotladsworld.com", + "hotladyhere.com", + "hotmail.co", + "hotmail.com", + "hotmail.eu", + "hotmail.net", + "hotmail.org", + "hotmonsterbeats.com", + "hotmovies.com", + "hotmovs.com", + "hotntubes.com", + "hotnudegirls.net", + "hotporn.today", + "hotpornbible.com", + "hotpornfile.org", + "hotpornshow.com", + "hotporntubes.com", + "hotpot.hk", + "hotscope.tv", + "hotsexvideo.mobi", + "hotsexydolls.com", + "hotshame.com", + "hotspotshield.com", + "hotstar-cdn.net", + "hotstar-labs.com", + "hotstar.com", + "hotstarext.com", + "hotstunners.com", + "hotteenfreecam.com", + "hottestfilms.com", + "hottestheadphonesonline.com", + "hottg.com", + "hottystop.com", + "hotvpn.com", + "hotwifemovies.com", + "hotzxgirl.com", + "hougaige.com", + "houghall.ac.uk", + "house.gov", + "housefraserarchive.ac.uk", + "housing.com", + "housingcdn.com", + "housingevidence.ac.uk", + "howcollege.ac.uk", + "howfuck.me", + "howtoforge.com", + "howtogetmo.co.uk", + "howtohackfacebook-account.com", + "hoxx.com", + "hoyo.link", + "hoyolab.com", + "hoyoverse.com", + "hp-imagine.com", + "hp-infolab.com", + "hp-invent.com", + "hp-invent.info", + "hp-mns.com", + "hp-printing.com", + "hp-webplatform.com", + "hp-ww.com", + "hp.com", + "hp.company", + "hp.io", + "hp3d.com", + "hp3dmetals.com", + "hp3dprinter.com", + "hp3dsamplepromo.com", + "hpa.gov.tw", + "hpallinoneprinter.com", + "hpapplicationscenter.com", + "hpayshop.com", + "hpbestbuy.com", + "hpbluecarpet.com", + "hpbluecarpet.net", + "hpbuiltforlearning.com", + "hpbundle.com", + "hpc-diversity.ac.uk", + "hpc-midlands-plus.ac.uk", + "hpc-midlands.ac.uk", + "hpc-sc.ac.uk", + "hpc-uk.ac.uk", + "hpcampus.com", + "hpcatridge.com", + "hpccp.com", + "hpceo.com", + "hpci.ac.uk", + "hpcmw.net", + "hpcodewarsbcn.com", + "hpcomputers.com", + "hpcomputerservices.com", + "hpconnected.com", + "hpconnected.net", + "hpconnected.org", + "hpconnected.us", + "hpconnectedstage.com", + "hpcontinuum.com", + "hpcpi.com", + "hpcu.org", + "hpcustomersupport.com", + "hpcustomersupport.net", + "hpcx.ac.uk", + "hpdaas.com", + "hpdesignjetl25500.com", + "hpdesktopcomputer.com", + "hpdownloadstore.com", + "hpdreamcolor.com", + "hpdriver.com", + "hpdrivers.com", + "hpdrivers.org", + "hpe.com", + "hpeclipse.com", + "hpecyber.com", + "hpefonts.s3.amazonaws.com", + "hpengage.com", + "hpeprint.com", + "hpeprintcenter.com", + "hpeurope.com", + "hpeventcenter.com", + "hpfaqs.com", + "hpfeedback.com", + "hpgift.com", + "hpgpas.com", + "hpgraphicspartners.com", + "hpiie.org", + "hpinc.info", + "hpinc.net", + "hpindigopress.com", + "hpinkjet.com", + "hpinstantink.ca", + "hpinstantink.com", + "hpjav.tv", + "hpkeyboard.com", + "hplaptop.com", + "hplaptopbattery.com", + "hplargeformatremote.com", + "hplatexknowledgecenter.com", + "hplfmedia.com", + "hplip.net", + "hplipopensource.com", + "hpmarketplace.com", + "hpmemorychips.com", + "hpmicrcartridge.com", + "hpmini.com", + "hpmobile.com", + "hpofficejetprinter.com", + "hponlinehelp.com", + "hponlineprinting.com", + "hpoolsfc.ac.uk", + "hppage5000.com", + "hppavillionlaptop.com", + "hpphotoscanners.com", + "hpprinterdrivers.com", + "hpprinterinstalls.com", + "hpprintersupplies.com", + "hpsalescentral.com", + "hpserver.com", + "hpservices.com", + "hpshooping.com", + "hpshop.com", + "hpshoping.com", + "hpshopping.hk", + "hpsignage.com", + "hpsmart.com", + "hpsmarts.com", + "hpsmartstage.com", + "hpsmartupdate.com", + "hpsoftware.com", + "hpspeaker.com", + "hpsprocket.com", + "hpsso.com", + "hpstore-china.com", + "hpstore-emea.com", + "hpstore.com", + "hpstorethailand.com", + "hpsupport.com", + "hpsuresupply.com", + "hptechventures.com", + "hpto.net", + "hptouch.com", + "hptouchpointmanager.com", + "hptrainingcenter.com", + "hptv.fun", + "hpuae.com", + "hpuniversity.info", + "hpusertraining.com", + "hpveer.com", + "hpvirtualthin.com", + "hpwallart.com", + "hpwellnesscentral.com", + "hpwsn.com", + "hq69.com", + "hqbabes.com", + "hqbutt.com", + "hqcdp.org", + "hqdesexo.com", + "hqjapanesesex.com", + "hqmovies.com", + "hqporner.com", + "hqseek.com", + "hqtrannytube.com", + "hqtube.xxx", + "hqxxxmovies.com", + "hrbdt.ac.uk", + "hrc.ac.uk", + "hrcchina.org", + "hrcir.com", + "hrea.org", + "hrecords.jp", + "hri.ac.uk", + "hrichina.org", + "hrionline.ac.uk", + "hrntt.org", + "hrsaz.com", + "hrsfc.ac.uk", + "hrtsea.com", + "hrw.org", + "hrweb.org", + "hsad.ac.uk", + "hsbc-alternatives.de", + "hsbc-transactionservices.de", + "hsbc-zertifikate.de", + "hsbc.ae", + "hsbc.am", + "hsbc.bm", + "hsbc.ca", + "hsbc.co.id", + "hsbc.co.in", + "hsbc.co.jp", + "hsbc.co.kr", + "hsbc.co.mu", + "hsbc.co.nz", + "hsbc.co.th", + "hsbc.co.uk", + "hsbc.com", + "hsbc.com.ar", + "hsbc.com.au", + "hsbc.com.bd", + "hsbc.com.bh", + "hsbc.com.br", + "hsbc.com.cn", + "hsbc.com.eg", + "hsbc.com.hk", + "hsbc.com.mo", + "hsbc.com.mt", + "hsbc.com.mx", + "hsbc.com.my", + "hsbc.com.ph", + "hsbc.com.sg", + "hsbc.com.tr", + "hsbc.com.tw", + "hsbc.com.uy", + "hsbc.com.vn", + "hsbc.de", + "hsbc.fr", + "hsbc.lk", + "hsbc.net", + "hsbc.uk", + "hsbcamanah.com.my", + "hsbcinnovationbanking.com", + "hsbcinsurance.com.cn", + "hsbcnet.com", + "hsbcprivatebank.com", + "hsbcqh.com.cn", + "hsbctrinkaus.de", + "hsdc.ac.uk", + "hsdp.ac.uk", + "hsex.icu", + "hsex.men", + "hsex.tv", + "hsfacebook.com", + "hshsxkj.com", + "hsjp.net", + "hsm-works.com", + "hsm-xpress.com", + "hsmexpress.com", + "hsmworks.com", + "hsmxpress.com", + "hss.ac.uk", + "hsselite.com", + "hst.net.tw", + "hstern.net", + "hstt.net", + "hsxsp1.buzz", + "hsyy.vip", + "ht.ac.uk", + "ht.ly", + "hta.ac.uk", + "htkou.net", + "htl.li", + "html5rocks.com", + "htp.ac.uk", + "hts.ac.uk", + "httpfacebook.com", + "https443.net", + "https443.org", + "httpsfacebook.com", + "httpwwwfacebook.com", + "htvncdn.net", + "htx.com", + "htyj-bj.com", + "htznr.li", + "hu1u.com", + "hua-yue.net", + "huabansp.com", + "huabansp7.club", + "huaglad.com", + "huaibinmall.com", + "huanghuagang.org", + "huangse.love", + "huangyiyu.com", + "huanyuju.com", + "huaren.us", + "huaren4us.com", + "huarenav.com", + "huarenporn.com", + "huashangnews.com", + "huashundg.com", + "huasing.org", + "huati.cc", + "huawen.ac.uk", + "huaxia-news.com", + "huaxiabao.org", + "huaxin-lls.xyz", + "huaxin.ph", + "huaxin80.com", + "huaxinvip.top", + "huayuworld.org", + "hubbard-theory-consortium.ac.uk", + "hubblephone.com", + "hubg.org", + "hud.ac.uk", + "hudatoriq.web.id", + "huddcoll.ac.uk", + "huddersfield.ac.uk", + "huddnewcoll.ac.uk", + "hudson.org", + "huffingtonpost.ca", + "huffingtonpost.co.uk", + "huffingtonpost.co.za", + "huffingtonpost.com", + "huffingtonpost.com.au", + "huffingtonpost.com.mx", + "huffingtonpost.de", + "huffingtonpost.es", + "huffingtonpost.fr", + "huffingtonpost.gr", + "huffingtonpost.in", + "huffingtonpost.it", + "huffingtonpost.jp", + "huffingtonpost.kr", + "huffpost.com", + "huffpostarabi.com", + "huffpostbrasil.com", + "huffpostmaghreb.com", + "hugedildo.com", + "hugesex.tv", + "huggingface.co", + "hughbaird.ac.uk", + "hugoroy.eu", + "huhaitai.com", + "huhamhire.com", + "huhangfei.com", + "huiav.com", + "huigui.tw", + "huish.ac.uk", + "huiyi.in", + "huj-pizda.com", + "hulkshare.com", + "hull-college.ac.uk", + "hull.ac.uk", + "hullacl.ac.uk", + "hullschoolartdesign.ac.uk", + "hulltraining.ac.uk", + "huloo.cc", + "huloo.tv", + "hulu.com", + "hulu.jp", + "hulu.tv", + "hulu.us", + "huluaction.com", + "huluad.com", + "huluapp.com", + "huluasks.com", + "hulucall.com", + "hulufree.com", + "hulugans.com", + "hulugermany.com", + "hulugo.com", + "huluhuluhuluhulu10.work", + "huluim.com", + "huluinstantmessenger.com", + "huluitaly.com", + "hulunet.com", + "hulunetwork.com", + "huluplus.com", + "hulupremium.com", + "hulupurchase.com", + "huluqa.com", + "hulurussia.com", + "huluspain.com", + "hulusports.com", + "hulustream.com", + "huluteam.com", + "hulutv.com", + "huluusa.com", + "humanities-human-rights.ac.uk", + "humanities.ac.uk", + "humanmind.ac.uk", + "humanparty.me", + "humanrights-lse.ac.uk", + "humanrightsbriefing.org", + "humanrightspressawards.org", + "humber.ac.uk", + "humbermaritimecollege.ac.uk", + "humblebundle.com", + "humbox.ac.uk", + "humbug.ac.uk", + "humbul.ac.uk", + "hummingbird.ms", + "humoron.com", + "hung-ya.com", + "hungerford.ac.uk", + "hungerstrikeforaids.org", + "hungryclit.com", + "hunk.ws", + "huntingdon.ac.uk", + "huobi.co", + "huobi.com", + "huobi.me", + "huobi.pro", + "huobi.sc", + "huobi.vc", + "huobiasia.vip", + "huobigroup.com", + "huobipro.com", + "huobitoken.com", + "huohaore.net", + "huping.net", + "hurgokbayrak.com", + "hurriyet.com.tr", + "hussiepass.com", + "hustler.com", + "hustlercash.com", + "hut2.ru", + "hutao.cloud", + "hutianyi.net", + "hutong9.net", + "hutpromos.com", + "hutton.ac.uk", + "huyandex.com", + "hw.ac.uk", + "hwadzan.tw", + "hwayue.org.tw", + "hwcdn.net", + "hwgo.com", + "hwinfo.com", + "hwlc.ac.uk", + "hwlln.ac.uk", + "hwslabs.com", + "hxcsxs.pro", + "hxdoll.com", + "hxwk.org", + "hxwq.org", + "hxxn12.top", + "hybrid-analysis.com", + "hybrid-group.ac.uk", + "hyde.ac.uk", + "hydeclarendon.ac.uk", + "hydrogenaud.io", + "hydronationscholars.ac.uk", + "hyms.ac.uk", + "hyp.ac.uk", + "hyper.is", + "hyperdreams.com", + "hyperrate.com", + "hyperscan.io", + "hypnohub.net", + "hypnoporn.net", + "hypnotube.com", + "hyread.com.tw", + "hysbys.ac.uk", + "hysteria.network", + "hzmn.net", + "i-123-hp.com", + "i-book.com", + "i-book.net", + "i-cable.com", + "i-centralwm.ac.uk", + "i-lab.ac.uk", + "i-mobile.co.jp", + "i-o-u.info", + "i-part.com.tw", + "i-scmp.com", + "i.org", + "i1.hk", + "i2p2.de", + "i2runner.com", + "i69.com.tw", + "i818hk.com", + "i91dz.com", + "iaablog.com", + "iaac.ac.uk", + "iafd.com", + "iagp.ac.uk", + "iah.ac.uk", + "ial-wrecsam.ac.uk", + "ials.ac.uk", + "iam.soy", + "iamakamai.com", + "iamakamai.net", + "iamremarkable.org", + "iamtopone.com", + "iana.org", + "iapetus.ac.uk", + "iapetus2.ac.uk", + "iask.bz", + "iask.ca", + "iat.ac.uk", + "iau.ac.ir", + "iav19.com", + "iavnight.com", + "ibb.co", + "ibd-boost.ac.uk", + "ibeats-uk.com", + "ibeatsbydre.cc", + "ibeatsbydre.com", + "ibiblio.org", + "ibis.ac.uk", + "ibit.am", + "iblist.com", + "iblogserv-f.net", + "ibm.com", + "ibm.eu", + "ibm.net", + "ibm.us", + "ibonedyourmom.com", + "ibook.co.nz", + "ibook.com", + "ibook.eu", + "ibook.net", + "ibookpartner.com", + "ibooksauthor.com", + "ibradome.com", + "ibros.org", + "ibss.ac.uk", + "ibtimes.com", + "ibuild.ac.uk", + "ibvpn.com", + "ibytedtos.com", + "ic.ac.uk", + "icac.ac.uk", + "icair.ac.uk", + "icams.com", + "icashpassport.com.mx", + "icca.ac.uk", + "iccliverpool.ac.uk", + "ice-cse.ac.uk", + "iced.ac.uk", + "icedrive.net", + "icegay.tv", + "icegaytube.tv", + "iceporn.com", + "iceporncasting.com", + "icerocket.com", + "icevirtuallibrary.com", + "ichat.co.in", + "ichigocandy.com", + "ichineseporn.com", + "icif.ac.uk", + "icij.org", + "icit.ac.uk", + "icl-fi.org", + "icloud-content.com", + "icloud-isupport.com", + "icloud-sandbox.com", + "icloud.ch", + "icloud.com", + "icloud.de", + "icloud.ee", + "icloud.fi", + "icloud.fr", + "icloud.hu", + "icloud.ie", + "icloud.is", + "icloud.jp", + "icloud.lv", + "icloud.om", + "icloud.org", + "icloud.pt", + "icloud.ro", + "icloud.se", + "icloud.si", + "icloud.sk", + "icloud.vn", + "icloudads.net", + "icloudbox.net", + "icloudbrowser.net", + "icloude.com", + "icloudhome.com", + "icloudmail.net", + "icloudmusic.net", + "icloudnet.net", + "icloudo.com", + "icloudo.de", + "icloudo.net", + "icloudos.de", + "icloudos.net", + "icloudpay.net", + "icloudsecure.net", + "icloudsetup.com", + "icls.ac.uk", + "icma.ac.uk", + "icmacentre.ac.uk", + "icmp.ac.uk", + "icoco.com", + "iconcollege.ac.uk", + "iconfactory.net", + "iconnect.ac.uk", + "iconpaper.org", + "icr.ac.uk", + "ics.ac.uk", + "icsa.ac.uk", + "icsl.ac.uk", + "ictheatre.ac.uk", + "icu-project.org", + "icuminside.com", + "idaiwan.com", + "idarkdoll.com", + "idcore.ac.uk", + "idea-server.com", + "ideal-teens.com", + "idealse.ac.uk", + "ideapocket.com", + "idelreal.org", + "idemocracy.asia", + "identi.ca", + "identrust.co.uk", + "identrust.com", + "identrust.net", + "idgo.ac.uk", + "idiomconnection.com", + "idlcoyote.com", + "idnike.com", + "idol-sagasukun.com", + "idouga.com", + "idras.ac.uk", + "idreamx.com", + "ids-apple.com", + "ids.ac.uk", + "idsam.com", + "idv.tw", + "idvd.eu", + "idx.dev", + "ie10.com", + "ie11.com", + "ie8.co", + "ie9.com", + "ieasy5.com", + "iebay.com", + "ied2k.net", + "ieee-aess.org", + "ieee-cas.org", + "ieee-ccnc.org", + "ieee-ceda.org", + "ieee-ecce.org", + "ieee-edusociety.org", + "ieee-ies.org", + "ieee-ims.org", + "ieee-into-focus.org", + "ieee-isto.org", + "ieee-npss.org", + "ieee-pels.org", + "ieee-pes.org", + "ieee-ras.org", + "ieee-region6.org", + "ieee-sensors.org", + "ieee-tems.org", + "ieee-uffc.org", + "ieee-vics.org", + "ieee.ca", + "ieee.org", + "ieee.tv", + "ieeeaps.org", + "ieeecsc.org", + "ieeecss.org", + "ieeeday.org", + "ieeedeis.org", + "ieeefoundation.org", + "ieeemagnetics.org", + "ieeemce.org", + "ieeenano.org", + "ieeeoes.org", + "ieeer10.org", + "ieeer5.org", + "ieeer8.org", + "ieeesmc.org", + "ieeesystemscouncil.org", + "ieeeusa.org", + "ienergy1.com", + "iepl.us", + "ies.ac.uk", + "iesr.ac.uk", + "ietf.org", + "iexchange.ac.uk", + "ifanqiang.com", + "ifastcapital.com.my", + "ifastcorp.com", + "ifastfinancial.co.in", + "ifastfinancial.com.hk", + "ifastgb.com", + "ifastgp.com", + "ifastgp.com.hk", + "ifastnetwork.com", + "ifasttv.com", + "ifcss.org", + "ife.ac.uk", + "ifjc.org", + "ifl.ac.uk", + "ifm.ac.uk", + "ifontcloud.com", + "ifr.ac.uk", + "iframejav.com", + "ifreewares.com", + "ifs.ac.uk", + "ifslearning.ac.uk", + "ifstal.ac.uk", + "ift.tt", + "ifuckedmy.mom", + "ifuckedtheboss.com", + "ig.com", + "ig.me", + "igaychat.com", + "igayporn.tv", + "igcd.net", + "igcdn.com", + "iger.ac.uk", + "igetnaughty.com", + "igfw.net", + "igfw.tech", + "igi-global.com", + "igkbroker.com", + "igmg.de", + "igmm.ac.uk", + "ign.jp", + "ignite.ac.uk", + "ignitedetroit.net", + "ignites.com", + "ignitesasia.com", + "igniteseurope.com", + "igoogle.ae", + "igoogle.am", + "igoogle.as", + "igoogle.at", + "igoogle.az", + "igoogle.ba", + "igoogle.be", + "igoogle.bg", + "igoogle.ca", + "igoogle.cd", + "igoogle.ci", + "igoogle.co.id", + "igoogle.co.jp", + "igoogle.co.kr", + "igoogle.co.ma", + "igoogle.co.uk", + "igoogle.com", + "igoogle.de", + "igoogle.dj", + "igoogle.dk", + "igoogle.es", + "igoogle.fi", + "igoogle.fm", + "igoogle.fr", + "igoogle.gg", + "igoogle.gl", + "igoogle.gr", + "igoogle.ie", + "igoogle.is", + "igoogle.it", + "igoogle.jo", + "igoogle.kz", + "igoogle.mn", + "igoogle.ms", + "igoogle.nl", + "igoogle.no", + "igoogle.nu", + "igoogle.ro", + "igoogle.ru", + "igoogle.rw", + "igoogle.sc", + "igoogle.sh", + "igoogle.sm", + "igoogle.sn", + "igoogle.tk", + "igoogle.tm", + "igoogle.to", + "igoogle.tt", + "igoogle.vu", + "igoogle.ws", + "igoshopping.net", + "igotmail.com.tw", + "igotpornpics.com", + "igpublish.com", + "igsonar.com", + "igsqt.ac.uk", + "igtv.com", + "igvita.com", + "ihakka.net", + "ihao.org", + "ihgs.ac.uk", + "ihighbury.ac.uk", + "ihrinfo.ac.uk", + "ihsd-mp4.pics", + "ihsdav.cc", + "iicns.com", + "iijav.com", + "iillii.net", + "iina.io", + "iirmll.com", + "iis.ac.uk", + "ijavhd.com", + "ijavtorrent.com", + "ikanhm.xyz", + "ikanmh.xyz", + "ikea.ae", + "ikea.at", + "ikea.au", + "ikea.be", + "ikea.bg", + "ikea.bh", + "ikea.ca", + "ikea.ch", + "ikea.cl", + "ikea.co.at", + "ikea.co.ca", + "ikea.co.id", + "ikea.co.il", + "ikea.co.jp", + "ikea.co.kr", + "ikea.co.om", + "ikea.co.pl", + "ikea.co.th", + "ikea.co.uk", + "ikea.com", + "ikea.com.au", + "ikea.com.cy", + "ikea.com.de", + "ikea.com.do", + "ikea.com.eg", + "ikea.com.gr", + "ikea.com.hk", + "ikea.com.kw", + "ikea.com.lv", + "ikea.com.mx", + "ikea.com.my", + "ikea.com.om", + "ikea.com.pl", + "ikea.com.pr", + "ikea.com.pt", + "ikea.com.ro", + "ikea.com.ru", + "ikea.com.sa", + "ikea.com.sg", + "ikea.com.tr", + "ikea.com.tw", + "ikea.com.ua", + "ikea.cz", + "ikea.de", + "ikea.dk", + "ikea.do", + "ikea.ee", + "ikea.eg", + "ikea.es", + "ikea.fi", + "ikea.fr", + "ikea.gr", + "ikea.hk", + "ikea.hr", + "ikea.hu", + "ikea.ie", + "ikea.in", + "ikea.is", + "ikea.it", + "ikea.jo", + "ikea.jp", + "ikea.kr", + "ikea.lt", + "ikea.lv", + "ikea.ma", + "ikea.mx", + "ikea.my", + "ikea.net", + "ikea.nl", + "ikea.no", + "ikea.om", + "ikea.ph", + "ikea.pl", + "ikea.pr", + "ikea.pt", + "ikea.qa", + "ikea.ro", + "ikea.rs", + "ikea.ru", + "ikea.sa", + "ikea.sg", + "ikea.si", + "ikea.sk", + "ikea.ua", + "ikea.us", + "ikids.com", + "iknowthatgirl.com", + "ikstar.com", + "ikwb.com", + "ilab.ac.uk", + "ilbe.com", + "ilecture.co.nz", + "ilex-tutorial.ac.uk", + "ilhamtohtiinstitute.org", + "ilife.eu", + "ilife.gr", + "ilife.wang", + "illawarramercury.com.au", + "illianacomputerrecycling.com", + "illusion.co.jp", + "illusion.jp", + "illusion111.com", + "illusionas.com", + "illusionchn.com", + "illusionfactory.com", + "illusiongw.com", + "illusionh.com", + "illusionl.com", + "illusionn2.com", + "illusionn3.com", + "illusionn4.com", + "illusionn5.com", + "illusionxz.com", + "illusiony.com", + "illusionze.com", + "illusnoi.com", + "ilnk.info", + "ilongman.com", + "ilove-movies.com", + "ilove80.be", + "iloveinterracial.com", + "ilovelongtoes.com", + "ilovexs.com", + "ilt.ac.uk", + "ilthe.ac.uk", + "im-apps.net", + "im.tv", + "im88.tw", + "imac-apple.com", + "imac-applecomputer.com", + "imac.co", + "imac.co.nz", + "imac.com", + "imac.eu", + "imac.gr", + "imac.one", + "imac.rs", + "imacapple.com", + "imacapplecomputer.com", + "imacsources.com", + "image-guided-therapies.ac.uk", + "imageab.com", + "imagebam.com", + "imagecurl.com", + "imagecurl.org", + "imagefap.com", + "imageflea.com", + "imageglass.org", + "imagemodeler.com", + "imagepost.com", + "images-amazon.com", + "images-gaytube.com", + "imageshack.com", + "imageshack.us", + "imagetwist.com", + "imagevenue.com", + "imageworks.com", + "imageworkshop.ac.uk", + "imagezilla.net", + "imaginationsengine.com", + "imaginecup.pl", + "imagineecommerce.com", + "imago-images.com", + "imaypb.com", + "imb.org", + "imdb.com", + "imdb.to", + "imems.ac.uk", + "imessage.tv", + "imet.ac.uk", + "img.ly", + "imgasd.com", + "imgbb.com", + "imgchili.net", + "imgcrl.org", + "imgix.com", + "imgix.net", + "imgmega.com", + "imgsmail.ru", + "imgur.com", + "imgur.io", + "imgurinc.com", + "imhentai.xxx", + "imilfs.com", + "imkev.com", + "imlab.ac.uk", + "imlive.com", + "immidio.com", + "immigration.gov.tw", + "immoral.jp", + "immxd.com", + "imod.com", + "imonsterbeats.com", + "imovie.eu", + "imoviegallery.com", + "imoviestage.com", + "impact-ad.jp", + "impact-hei.ac.uk", + "impact.ac.uk", + "impact.org.au", + "impactdesignhub.com", + "impala-media-production.s3.amazonaws.com", + "impala.ac.uk", + "imperial.ac.uk", + "imperialbusiness.school", + "imperiodefamosas.com", + "impermium.com", + "impp.mn", + "imr-cdt.ac.uk", + "imrci.ac.uk", + "imstagram.com", + "imt.ac.uk", + "imtagram.com", + "imzog.com", + "in-disguise.com", + "in.com", + "in99.org", + "inaporn.com", + "inasian.club", + "incapdns.net", + "incentivetravelgifts.com", + "incestflix.com", + "incesto.blog.br", + "incestporn.xxx", + "incestvidz.com", + "incezt.net", + "incloak.com", + "inclusion.ac.uk", + "inclusivegrowthscore.com", + "incommon-rsa.org", + "incredibox.fr", + "ind.sh", + "indazn.com", + "indaznlab.com", + "indeedproject.ac.uk", + "independent.co.uk", + "independentoperatorcn.com", + "indexxx.com", + "india.com", + "indiablooms.com", + "indiaipad.com", + "indian-free-xnxx.com", + "indianarrative.com", + "indiancolleges.com", + "indiandefensenews.in", + "indianexpress.com", + "indianfuck2.com", + "indiangfvideos.com", + "indiangirlsclub.com", + "indianhiddencams.com", + "indianpornfast.com", + "indianporngirls.com", + "indianpornvideo.org", + "indianpornvideos2.com", + "indiansexmms2.com", + "indiansexpussy.com", + "indiansexstories.net", + "indiansexstories2.net", + "indiatimes.com", + "indiatoday.in", + "indiemerch.com", + "indienudes.com", + "indies-av.co.jp", + "indonesiaporn.name", + "indsr.org.tw", + "industrialtoys.com", + "infinitetoons.com", + "infinitetube.com", + "influencersgonewild.com", + "info-graf.fr", + "infocert.digital", + "infocert.it", + "infogov.ac.uk", + "infolinker.com.tw", + "inform25.ac.uk", + "information-systems.ac.uk", + "informedchoices.ac.uk", + "informer.com", + "informs.org", + "infosciscotland.ac.uk", + "infotimes.com.tw", + "infowars.com", + "infowarsmedia.com", + "infrapedia.com", + "infraworks.com", + "infura.io", + "ingads.com", + "ingka.com", + "ingka.dev", + "ingkacentres.com", + "ingress.com", + "inherd.mom", + "inhumanity.com", + "inikesneakers.com", + "init.shop", + "initiate.ac.uk", + "initiativesforchina.org", + "initproducts.com", + "inkbunny.net", + "inkchoice.com", + "inkedravens.com", + "inkui.com", + "inlang.com", + "inlethd.com", + "inmediahk.net", + "innermongolia.org", + "innogen.ac.uk", + "innovation-exchange.ac.uk", + "innovation.ac.uk", + "innovations-i.com", + "innovations.ac.uk", + "inoreader.com", + "inote.tw", + "inporn.com", + "inquisitionspostmortem.ac.uk", + "insecam.org", + "insendi.com", + "inshot.cc", + "inshot.com", + "inshotapp.com", + "inside.com.tw", + "insidefilms.com", + "insidemacintosh.com", + "insider-intelligence.com", + "insider.com", + "insiderdevtour.com", + "insiderintelligence.com", + "insidevoa.com", + "inspire-dtp.ac.uk", + "inspiretrust.ac.uk", + "inst-of-oceanographic-sci.ac.uk", + "instaadder.com", + "instabang.com", + "instachecker.com", + "instafallow.com", + "instafollower.com", + "instagainer.com", + "instagda.com", + "instagify.com", + "instagmania.com", + "instagor.com", + "instagram-brand.com", + "instagram-engineering.com", + "instagram-help.com", + "instagram-press.com", + "instagram-press.net", + "instagram.com", + "instagramci.com", + "instagramcn.com", + "instagramdi.com", + "instagramhashtags.net", + "instagramhilecim.com", + "instagramhilesi.org", + "instagramium.com", + "instagramizlenme.com", + "instagramkusu.com", + "instagramlogin.com", + "instagramm.com", + "instagramn.com", + "instagrampartners.com", + "instagramphoto.com", + "instagramq.com", + "instagramsepeti.com", + "instagramtakipcisatinal.net", + "instagramtakiphilesi.com", + "instagramtips.com", + "instagramtr.com", + "instagran.com", + "instagranm.com", + "instagrem.com", + "instagrm.com", + "instagtram.com", + "instagy.com", + "installbuzzsaw.com", + "instamgram.com", + "instangram.com", + "instantfap.com", + "instantfapgay.com", + "instanthq.com", + "instantink.com", + "instantssl.com", + "instanttelegram.com", + "instaplayer.net", + "instastyle.tv", + "instawank.com", + "instgram.com", + "institut-tibetain.org", + "institute-of-cancer-research.ac.uk", + "instituteofcoding.ac.uk", + "instituteofcounselling.ac.uk", + "instituteofwar.org", + "institutionofelectronics.ac.uk", + "insuyo.xyz", + "intagram.com", + "intagrm.com", + "intarch.ac.uk", + "intc.com", + "integral7.com", + "integrativebiology.ac.uk", + "intel-research.net", + "intel-university-collaboration.net", + "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.cm", + "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.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", + "intelamericasstore.com", + "intelapacstore.com", + "intelatom.net", + "intelcapital.com", + "intelcapital.net", + "intelcloudbuilders.com", + "intelcloudfinder.com", + "intelemeastore.com", + "inteleventexpress.com", + "intelforchange.com", + "intelfreepress.com", + "intelgo.net", + "intelinsight.com", + "inteliotmarketplace.com", + "intelisolve.com", + "intell.com", + "intellearningseries.com", + "intellij.com", + "intellij.net", + "intellij.org", + "intellinuxgraphics.com", + "intellinuxgraphics.net", + "intellinuxwireless.net", + "intelnervana.com", + "intelplay.com", + "intelquark.com", + "intelrealsense.com", + "intelrxt.com", + "intelsalestraining.com", + "intelsecurity.com", + "intelserveredge.com", + "intelsoftwarenetwork.com", + "intelstore.com", + "inteltechnologyprovider.com", + "intelvmwarecybersecurity.com", + "interactcbt.ac.uk", + "interactive-e.ac.uk", + "interactivebrokers.com", + "interactiveeducation.ac.uk", + "interactivesex.xxx", + "intercamcashpassport.com.mx", + "intercom.com", + "intercom.io", + "intercomassets.com", + "intercomcdn.com", + "international-house-london.ac.uk", + "international-union-crystallography.ac.uk", + "international.ac.uk", + "internationalcollegedundee.ac.uk", + "internationalconnectionsacademy.com", + "internationalsaimoe.com", + "internationalstaff.ac.uk", + "internationalstudies.ac.uk", + "internet.org", + "internetdefenseleague.org", + "internetdownloadmanager.com", + "internetexplorer.co", + "internetexplorer.com", + "internetfreedom.org", + "internetofeverything.com", + "internetpopculture.com", + "interracial-sites.com", + "intescort.com", + "intgram.com", + "intheknow.com.au", + "inthenameofconfuciusmovie.com", + "intimateinvasions.com", + "into-newcastle.ac.uk", + "intporn.com", + "intramuscularinjection.info", + "intunewiki.com", + "intute.ac.uk", + "inventor-certified.com", + "inventorfusion.com", + "inventorseries.com", + "inventorship.com.au", + "investorschronicle.co.uk", + "invity.io", + "inxian.com", + "inxporn.com", + "ioe.ac.uk", + "ioe.com", + "ioffergift.com", + "ioinformatics.org", + "iole.tv", + "ion.ac.uk", + "iooog.sbs", + "iop.org", + "ios-icloud.com", + "ios.ac.uk", + "iosinthecar.com", + "iotinactionevents.com", + "iownyour.biz", + "iownyour.org", + "ioz.ac.uk", + "ip.gs", + "ip.sb", + "ip73.com", + "ipa-iphone.net", + "ipad.co.kr", + "ipad.de", + "ipad.host", + "ipad.wang", + "ipad3.com", + "ipadair.cl", + "ipadair.cm", + "ipadair.com.br", + "ipadair.com.es", + "ipadair.fr", + "ipadair.hk", + "ipadair.ie", + "ipadair.jp", + "ipadair.tw", + "ipadaustralia.com", + "ipadmini.cm", + "ipadmini.com.lk", + "ipadmini.lk", + "ipadpro.buzz", + "ipalter.com", + "ipcc-wg3.ac.uk", + "ipdefenseforum.com", + "ipem.ac.uk", + "ipfire.org", + "ipforesightforum.ac.uk", + "ipfs-gateway.cloud", + "ipfs.io", + "ipfs.tech", + "ipgc.ac.uk", + "iphine.com", + "iphone-cd.com", + "iphone-cn.com", + "iphone-sh.com", + "iphone-vip1.com", + "iphone-vip2.com", + "iphone-vip3.com", + "iphone-vip4.com", + "iphone-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.com", + "iphone4.com.br", + "iphone4hongkong.com", + "iphone4s.com", + "iphone5.com", + "iphone5casescovers.com", + "iphone5s5case.com", + "iphoneacessorios.com.br", + "iphonecase2013.com", + "iphonecase5.com", + "iphonecases100.com", + "iphonecases5.com", + "iphoneclaro.com.br", + "iphonecollcase.com", + "iphonefc.com", + "iphonegermany.com", + "iphonehacks.com", + "iphonehangzhou.com", + "iphoneimessage.com", + "iphoneplus.wang", + "iphonerip.net", + "iphonese.tv", + "iphonetaiwan.org", + "iphoneunlockimei.com", + "iphonexs.tv", + "iphonix.fr", + "iphoto.eu", + "iphoto.no", + "iphoto.se", + "iphoto.wang", + "ipi.ac.uk", + "ipicture.ru", + "ipjetable.net", + "ipleadership.org", + "ipns.co", + "ipobar.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.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.nl", + "ipodcleaner.com", + "ipoditouch.com", + "ipodnano.com", + "ipodnano.net", + "ipodprices.com", + "ipodrip.ca", + "ipodrocks.com.au", + "ipods.com", + "ipodshop.com.au", + "ipodtouch.co", + "ipodtouch.com", + "ipoock.com", + "iporntoo.com", + "iporntv.net", + "iportal.me", + "ipostnaked.com", + "ipple.com", + "ippog.org", + "ippotv.com", + "ippstatic.com", + "ipredator.se", + "iproperty.com", + "iproperty.com.my", + "iproperty.com.sg", + "iptv.com.tw", + "iptvbin.com", + "ipv6.ac.uk", + "ipvanish.com", + "iqiyi.com", + "iqiyiavlive.buzz", + "iqq2.cc", + "iqq3.cc", + "iqqtv.net", + "iranianboobs.com", + "iranlms.ir", + "iransextv.com", + "iranx.net", + "irc-sphere.ac.uk", + "irdeto.com", + "ired.ac.uk", + "iredmail.org", + "irese.ac.uk", + "iri-scotland.ac.uk", + "irib.ir", + "iridiumbrowser.de", + "iris.ac.uk", + "iriss.ac.uk", + "ironna.jp", + "ironpython.net", + "ironsocket.com", + "irotv301.top", + "irribay.com", + "irscl.ac.uk", + "is-a-hunter.com", + "is.gd", + "isaacmao.com", + "isasecret.com", + "isbgpsafeyet.com", + "isc.ac.uk", + "isc.org", + "isca-speech.org", + "ischool.com", + "iscp.ac.uk", + "isexlove.tw", + "isfocus.net", + "isgame365.cc", + "isgreat.org", + "isheppc.com", + "isic.ac.uk", + "isiknowledge.com", + "isis.ac.uk", + "iskoot.com", + "islahhaber.net", + "islam-anatolia.ac.uk", + "islam.org.hk", + "islamawareness.net", + "islamhouse.com", + "islamic-college.ac.uk", + "islamicacademy.ac.uk", + "islamiccenterofnewlondon.com", + "islamicity.com", + "islamicpluralism.org", + "islamicstudiesnetwork.ac.uk", + "islamtoday.net", + "isle.ac.uk", + "isli.ac.uk", + "islington-acl.ac.uk", + "ism.ac.uk", + "ismaelan.com", + "ismalltits.com", + "ismg.ac.uk", + "ismprofessional.net", + "isohunt.com", + "ispan.ac.uk", + "israbox.com", + "iss138.com", + "issitedownrightnow.com", + "issquaredown.com", + "issquareup.com", + "issuu.com", + "istar.ac.uk", + "istars.co.nz", + "istarshine.com", + "istef.info", + "istent.co.kr", + "istiqlalhewer.com", + "istockphoto.com", + "istorytell.com", + "istripper.com", + "isunaffairs.com", + "isuntv.com", + "isupportuyghurs.org", + "isvc.ac.uk", + "it.nf", + "ita-do.com", + "itaboo.info", + "itaeromanga.com", + "itaiwan.gov.tw", + "italiabeatsbydrdre.com", + "italiatibet.org", + "itasoftware.com", + "itcanwait.com", + "itcfonts.com", + "itch.io", + "itchen.ac.uk", + "iteach.ac.uk", + "itec.ac.uk", + "itemdb.com", + "itemfix.com", + "itfromtheinside.com", + "ithome.com.tw", + "itlearningspace-scot.ac.uk", + "itnel.com", + "itnow.ac.uk", + "itol.ac.uk", + "itools.info", + "itrace.ac.uk", + "itripto.com", + "itsaol.com", + "itsbetterwhenyouwinit.com", + "itsfuck.com", + "itshidden.com", + "itsky.it", + "itsoc.org", + "itu.int", + "itun.es", + "itunbes.com", + "ituneas.com", + "itunes-radio.net", + "itunes.ca", + "itunes.co", + "itunes.co.th", + "itunes.com", + "itunes.hk", + "itunes.mx", + "itunes.org", + "itunes.rio", + "itunes.us", + "itunes12days.com", + "itunesessentials.com", + "itunesfestivals.com", + "itunesiradio.com", + "ituneslatino.com", + "ituneslogin.net", + "itunesmatch.com", + "itunesparty.com", + "itunesradio.com", + "itunesradio.rio", + "itunesradio.tv", + "itunesradio.tw", + "itunesstore.co", + "itunesu.com", + "itunesu.net", + "itutility.ac.uk", + "itweet.net", + "iu13.net", + "iu45.com", + "iucr.ac.uk", + "iuhrdf.org", + "iuksky.com", + "ius.io", + "iutunes.com", + "ivacy.com", + "iverycd.com", + "ivintageporn.com", + "ivonblog.com", + "ivpn.net", + "iwank.tv", + "iwantavnow.com", + "iwantgalleries.com", + "iwantmature.com", + "iwantporn.net", + "iwaponline.com", + "iwara.tv", + "iwcollege.ac.uk", + "iwcommunitylearning.ac.uk", + "iwightc.ac.uk", + "iwm.ac.uk", + "iwork.com", + "iwork.se", + "iwork.wang", + "iwyn138.com", + "ixnxx.tv", + "ixquick.com", + "ixxx.com", + "iyalc.com", + "iyf.tv", + "iyouport.com", + "iyouport.org", + "iza.ne.jp", + "izaobao.us", + "izihost.org", + "izles.net", + "izlesem.org", + "izmirautodeskegitimleri.com", + "j.mp", + "j2objc.org", + "jabcomix.com", + "jable.one", + "jable.org", + "jable.tv", + "jackjia.com", + "jade-net-home.com", + "jade.ac.uk", + "jadult.net", + "jamaat.org", + "jamanetwork.com", + "jambotube.com", + "jamesbondstudies.ac.uk", + "jamestown.org", + "jamyangnorbu.com", + "jan.ai", + "jandyx.com", + "janeausten.ac.uk", + "janet-brokerage.ac.uk", + "janet.ac.uk", + "janetbrokerage.ac.uk", + "janetcollaborate.ac.uk", + "janor6.net", + "janwongphoto.com", + "japan-forward.com", + "japan-whores.com", + "japan18tube.com", + "japanbeast.com", + "japanese-scat.net", + "japaneseasmr.com", + "japanesebeauties.net", + "japanesebeauties.one", + "japanesegirlspictures.com", + "japaneselovelygirl.com", + "japanfist.org", + "japanknowledge.com", + "japanporn.tv", + "japantimes.co.jp", + "japanxxxfilms.com", + "japon-girls.com", + "japteenx.com", + "japxtube.com", + "jas-mine.ac.uk", + "jasa3dmax.com", + "jasaautocad.com", + "jasmin.ac.uk", + "jasmin.com", + "jasper.ai", + "jav-angel.net", + "jav-subtitles.com", + "jav-vr.net", + "jav.com", + "jav.dog", + "jav.gallery", + "jav.guru", + "jav.la", + "jav.land", + "jav.place", + "jav.si", + "jav.wine", + "jav01.cc", + "jav101.com", + "jav168.cc", + "jav19.com", + "jav223.com", + "jav24.com", + "jav2be.com", + "jav321.com", + "jav4you.org", + "jav68.tv", + "jav777.cc", + "jav789.com", + "jav889.xyz", + "jav9999.com", + "java.com", + "java.net", + "javakiba.org", + "javbabe.net", + "javbangers.com", + "javbest.tv", + "javbobo.com", + "javbooks.com", + "javbraze.com", + "javbus.co", + "javbus.com", + "javbus22.com", + "javbuz.com", + "javcc.cc", + "javcc.com", + "javcdn.cc", + "javcl.com", + "javct.net", + "javcup.com", + "javdatabase.com", + "javday.tv", + "javdb.com", + "javdisk.com", + "javdock.com", + "javdoe.to", + "javdove.com", + "javdove8.xyz", + "javextreme.net", + "javfilms.com", + "javfor.me", + "javforme.ninja", + "javfree.la", + "javfree.me", + "javfree.sh", + "javfuck.net", + "javfull.net", + "javfun.me", + "javfv.com", + "javgg.net", + "javgrown.com", + "javhard.net", + "javhard.org", + "javhaven.com", + "javhay.net", + "javhd.com", + "javhd.icu", + "javhd.pro", + "javhd.today", + "javhd3x.com", + "javhdfree.net", + "javhdhello.com", + "javhdonline.com", + "javhdporn.com", + "javhdporn.net", + "javher.com", + "javheroine.com", + "javhihi.com", + "javhip.com", + "javhub.me", + "javhub.net", + "javhuge.com", + "javidol.org", + "javjack.com", + "javjunkies.com", + "javlands.net", + "javleak.com", + "javlibrary.com", + "javlibrary.tv", + "javmenu.com", + "javmix.me", + "javmix.tv", + "javmobile.mobi", + "javmobile.net", + "javmodel.com", + "javmoo.com", + "javmoo.xyz", + "javmost.com", + "javmost.cx", + "javmost.xyz", + "javmuch.com", + "javmulu.net", + "javnew.net", + "javopen.co", + "javout.co", + "javplatform.com", + "javpop.com", + "javpop.link", + "javporn.tech", + "javporn.ws", + "javpost.net", + "javprice.com", + "javprime.net", + "javpub.me", + "javpush.com", + "javqd.com", + "javrank.com", + "javrave.club", + "javroot.com", + "javscat.net", + "javscatsex.com", + "javscatting.com", + "javscreens.com", + "javseen.com", + "javseen.tv", + "javsex.asia", + "javsin.tv", + "javsky.tv", + "javspanking.com", + "javstar.club", + "javstore.net", + "javsx.com", + "javtag.com", + "javtag.net", + "javtasty.com", + "javteg.net", + "javtiful.com", + "javtorrent.me", + "javtrailers.com", + "javtrust.com", + "javtube.cc", + "javtube.com", + "javtube.net", + "javvids.com", + "javwide.com", + "javwide.tv", + "javxspot.com", + "javxxx.me", + "javynow.com", + "javzoo.com", + "javzz.com", + "jayspov.net", + "jb.gg", + "jb22.lol", + "jbe-platform.com", + "jbtalks.cc", + "jbtalks.com", + "jbtalks.my", + "jburl.top", + "jc11.tw", + "jca.ac.uk", + "jcc.ac.uk", + "jcmaxwell.ac.uk", + "jcpenney.com", + "jcpsg.ac.uk", + "jdav-css.shop", + "jdavsp.asia", + "jdavsp.com", + "jdavsp.info", + "jdavsp.pw", + "jdavsp.top", + "jdavsp.xyz", + "jdbimgs.com", + "jdbstatic.com", + "jdforum.net", + "jdwsy.com", + "jeanyim.com", + "jec.ac.uk", + "jeded.com", + "jenkins.io", + "jenner.ac.uk", + "jennylist.xyz", + "jenporno.cz", + "jerk-porn.com", + "jerk24.com", + "jerkdolls.com", + "jerkdude.com", + "jerkmate.com", + "jerkmate.tv", + "jerkmatelive.org", + "jerkofftocelebs.com", + "jessicaturner.com", + "jetbrains.ai", + "jetbrains.com", + "jetbrains.net", + "jetbrains.space", + "jetbrains.team", + "jetfuelapp.com", + "jetfuelapps.com", + "jetos.com", + "jevc.ac.uk", + "jewel-esk.ac.uk", + "jex.com", + "jfengtime.com", + "jfqu36.club", + "jfqu37.xyz", + "jfrog.com", + "jfrog.org", + "jga-group.ac.uk", + "jgg18.xyz", + "jgoodies.com", + "jhu.edu", + "jhxl.org", + "jhzyw.xyz", + "jiangweiping.com", + "jiaochuanba25.buzz", + "jiaochuanba26.buzz", + "jiaoyou8.com", + "jiayoulu.com", + "jibemobile.com", + "jic.ac.uk", + "jichangtj.com", + "jieav.com", + "jiehua.cz", + "jiepang.com", + "jieshibaobao.com", + "jigglegifs.com", + "jigong1024.com", + "jigsy.com", + "jihadology.net", + "jiji.com", + "jijiji.ca", + "jilhub.com", + "jimeng22.com", + "jims.net", + "jinbushe.org", + "jingpin.org", + "jingsim.org", + "jinhai.de", + "jinpianwang.com", + "jinroukong.com", + "jintian.net", + "jinx.com", + "jiruan.net", + "jisc-collections.ac.uk", + "jisc-content.ac.uk", + "jisc-liberate-migrate1.ac.uk", + "jisc-liberate-migrate2.ac.uk", + "jisc-liberate-migrate3.ac.uk", + "jisc-liberate.ac.uk", + "jisc-mau.ac.uk", + "jisc-services.ac.uk", + "jisc-tau.ac.uk", + "jisc.ac.uk", + "jiscadvance.ac.uk", + "jisccollections.ac.uk", + "jisccontent.ac.uk", + "jiscdigitalmedia.ac.uk", + "jiscecollections.ac.uk", + "jischistoricbooks.ac.uk", + "jischistories.ac.uk", + "jiscinfonet.ac.uk", + "jiscjournalarchives.ac.uk", + "jiscmail.ac.uk", + "jiscmediahub.ac.uk", + "jiscmu.ac.uk", + "jiscpas.ac.uk", + "jiscwell.ac.uk", + "jitouch.com", + "jitsi.org", + "jiuse.ai", + "jiuse.com.co", + "jiuse.icu", + "jiuse.io", + "jiuse6666.com", + "jiuse821.com", + "jiuse822.com", + "jiuse823.com", + "jiyou520.com", + "jiyu-kobo.co.jp", + "jizzboom.com", + "jizzbunker.com", + "jizzhut.com", + "jizzle.com", + "jizzonline.com", + "jizzthis.com", + "jjgirls.com", + "jjsuo.sbs", + "jkb.cc", + "jkbeats.com", + "jkf.net", + "jkface.net", + "jkforum.net", + "jkub.com", + "jkycjk.mom", + "jkzvz.shop", + "jkzw.shop", + "jlb0011.site", + "jm98.cc", + "jma.go.jp", + "jmc.ac.uk", + "jmcomic.ltd", + "jmcomic.me", + "jmcomic.mobi", + "jmcomic.moe", + "jmcomic1.city", + "jmcomic1.me", + "jmcomic1.mobi", + "jmcomic2.moe", + "jmlr.org", + "jmscult.com", + "jmu.ac.uk", + "jmvbt.com", + "jneurosci.org", + "jnt.ac.uk", + "joachims.org", + "joanabliss.com", + "jobmarket.com.hk", + "jobs.ac.uk", + "jobso.tv", + "jodic-forum.org", + "joeswall.com", + "johnpersons.com", + "johnruskin.ac.uk", + "johren.games", + "johren.net", + "joiasmr.com", + "joinbbs.net", + "joinclubhouse.com", + "joinmaidez.com", + "joinmastodon.org", + "joinpeertube.org", + "joins.com", + "joinside.org", + "joinup.ac.uk", + "jokerlu-go.buzz", + "jokerlu.asia", + "jokerlu.world", + "jokerlu1.cc", + "jokerlu1.info", + "jolt.ac.uk", + "joox.com", + "jornaldacidadeonline.com.br", + "jorropo.net", + "jorum.ac.uk", + "jos.com", + "joseph-chamberlain.ac.uk", + "joseph-priestley.ac.uk", + "joseph-priestly.ac.uk", + "josephwright6form.ac.uk", + "jotform.com", + "journalarchives.ac.uk", + "journalchretien.net", + "journalofdemocracy.org", + "journaltocs.ac.uk", + "jove.com", + "joyclub.de", + "joyjoy.net", + "joylovedolls.com", + "joymiihub.com", + "joyourself.com", + "joysporn.com", + "jp1lib.org", + "jpav.us", + "jpavcom.com", + "jpbabe.com", + "jpboy1069.net", + "jpg4.biz", + "jpg4.pw", + "jpg4us.net", + "jpopforum.net", + "jpvhub.com", + "jquery.com", + "jquerymobile.com", + "jqueryui.com", + "jr24h.com", + "jrf.org.tw", + "jrs.ac.uk", + "js.org", + "js7k.com", + "jsati.com", + "jsatmobile.com", + "jsbridgestone.com", + "jsdelivr.com", + "jsdelivr.net", + "jsfiddle.net", + "jshell.net", + "jsmc.ac.uk", + "jst.go.jp", + "jstor.ac.uk", + "jstor.org", + "jstv51.com", + "jstv52.com", + "jstv53.com", + "jsz91.com", + "jtap.ac.uk", + "jtltraining.ac.uk", + "jtt.ir", + "jtube.space", + "jtvnw.net", + "jubileecentre.ac.uk", + "jubushoushen.com", + "juc.ac.uk", + "judeporn.com", + "juggsjoy.com", + "juhuaren.com", + "juiceced.xyz", + "juicytwink.com", + "jukujo-club.com", + "julesjordan.com", + "juliamiles.com", + "juliamovies.com", + "juliepost.com", + "juliereyc.com", + "junauza.com", + "june4commemoration.org", + "junefourth-20.net", + "jungleheart.com", + "junglobal.net", + "juno.ac.uk", + "juoaa.com", + "jupyter.org", + "just.xxx", + "justav.net", + "justdied.com", + "justdoit.us", + "justduckit.com", + "justfamilyporn.com", + "justfreevpn.com", + "justfullporn.org", + "justhd.xyz", + "justhost.ru", + "justicefortenzin.org", + "justincraig.ac.uk", + "justindianporn.me", + "justlesbianpussy.com", + "justmysocks.net", + "justmysocks1.net", + "justmysocks2.net", + "justmysocks4.net", + "justnudepic.com", + "justpaste.it", + "justpicsplease.com", + "justporn.com", + "justporn.link", + "justporno.es", + "justporno.sex", + "justporno.tv", + "justswallows.com", + "justtristan.com", + "justusboys.com", + "juyangbee.xyz", + "juyangto.info", + "juyuange.org", + "juzi-js.shop", + "juzige.xyz", + "juziyue.com", + "jvid.com", + "jw.org", + "jwfl.ac.uk", + "jwheatley.ac.uk", + "jwide.co.kr", + "jwmusic.org", + "jwpcdn.com", + "jwplatform.com", + "jwplayer.com", + "jwpltx.com", + "jwpsrv.com", + "jwt.ms", + "jyxf.net", + "jzydh.com", + "k-doujin.net", + "k8s.io", + "k9vidz.com", + "ka-wai.com", + "kaamuu.com", + "kadokawa.co.jp", + "kaes.ac.uk", + "kaggle.com", + "kaggle.io", + "kaggle.net", + "kaggleusercontent.com", + "kagi.com", + "kagyu.org", + "kagyu.org.za", + "kagyumonlam.org", + "kagyunews.com.hk", + "kagyuoffice.org", + "kagyuoffice.org.tw", + "kairakudoujin.net", + "kaiyuan.de", + "kakao.co.kr", + "kakao.com", + "kakao.vc", + "kakaobank.com", + "kakaobank.io", + "kakaobankcontent.com", + "kakaobrain.com", + "kakaocdn.net", + "kakaocloud.com", + "kakaocorp.com", + "kakaoent.com", + "kakaoenterprise.com", + "kakaogamescorp.com", + "kakaohealthcare.com", + "kakaoilaas.com", + "kakaoinvestment.com", + "kakaomobility.com", + "kakaopay.com", + "kakaopaysec.com", + "kakaopiccoma.com", + "kakaostyle.com", + "kakaotalk.jp", + "kakaovx.com", + "kaktuz.com", + "kalachakralugano.org", + "kali.org", + "kama-nk.ru", + "kamababa.com", + "kamisama-day.jp", + "kamisama-maeda-lab.com", + "kampalaexclusiveescorts.com", + "kanav.info", + "kangye.org", + "kankan.today", + "kannewyork.com", + "kanporno.com", + "kanshifang.com", + "kantie.org", + "kanzhongguo.com", + "kanzhongguo.eu", + "kaob3.xyz", + "kaotic.com", + "karayou.com", + "karechat.ai", + "karger.com", + "karinahart.com", + "karkhung.com", + "karlajames.com", + "karmapa-teachings.org", + "karmapa.org", + "karupsha.com", + "karupspc.com", + "kastatic.org", + "katestube.com", + "kavkazr.com", + "kawaiikawaii.jp", + "kawase.com", + "kayako.com", + "kaydara.com", + "kba-tx.org", + "kbplus.ac.uk", + "kbzbank.com", + "kbzpay.com", + "kc3000.shop", + "kcb.ac.uk", + "kcc.ac.uk", + "kcl.ac.uk", + "kclwave.ac.uk", + "kcollege.ac.uk", + "kcoolonline.com", + "kcqsw-na.sbs", + "kdfuli.com", + "kdy202312.shop", + "ke-westyorkshire.ac.uk", + "keaiav.com", + "kebrum.com", + "kec-stourbridge.ac.uk", + "kechara.com", + "kechtube.com", + "kecnuneaton.ac.uk", + "kedst.ac.uk", + "keele.ac.uk", + "keepandshare.com", + "keepmovingwithmovefree.com", + "keepyourcad.com", + "keezmovies.com", + "keiba.net", + "keighleycollege.ac.uk", + "kemomi.me", + "kemono.party", + "kemono.su", + "kendal.ac.uk", + "kendalcollege.ac.uk", + "kendatire.com", + "kendincos.net", + "kendralist.com", + "kenengba.com", + "kennedy.ac.uk", + "kensingtoncoll.ac.uk", + "kent.ac.uk", + "kentadulteducation.ac.uk", + "kentcls.ac.uk", + "kentman.ac.uk", + "kenxxx.com", + "kenya4.com", + "kenyanporn.blogspot.com", + "kenyaraha.net", + "keontech.net", + "kepard.com", + "kernel.org", + "keso.cn", + "kess2.ac.uk", + "kew.ac.uk", + "kex.com", + "keybase.io", + "keybaseapi.com", + "keycdn.com", + "keyhole.com", + "keyporntube.com", + "keyseducation.ac.uk", + "keyskillbuilder.ac.uk", + "keytransparency.com", + "keytransparency.foo", + "keytransparency.org", + "kfd.me", + "kfs.io", + "kgslb.com", + "kgv.ac.uk", + "khabdha.org", + "khanacademy.org", + "khatrimaza.org", + "khayannpyar.blogspot.com", + "khmusic.com.tw", + "khotruyentranhx.com", + "kiad.ac.uk", + "kichiku-doujinko.com", + "kichikuou.com", + "kickporn.com", + "kickshatchannel.com", + "kicksnike1.com", + "kicu.tv", + "kiddercoll.ac.uk", + "kidderminster.ac.uk", + "kidgrid.tv", + "kidsfirst.ac.uk", + "kidsnikeshoes.com", + "kidspot.com.au", + "kiji.ca", + "kijii.ca", + "kijij.ca", + "kijiji.ca", + "kijijiauto.ca", + "kijijiautos.ca", + "kijijiforbusiness.ca", + "kijijii.ca", + "kijijiraps.ca", + "kijji.ca", + "kijjiji.ca", + "kik.com", + "kikdirty.com", + "killwall.com", + "kilmarnock.ac.uk", + "kilmeadeandfriends.com", + "kimchi.tv", + "kimogirl.cc", + "kimosex.com", + "kimy.com.tw", + "kindgirls.com", + "kindindianporn.com", + "kindle.co.jp", + "kindle.co.uk", + "kindle.com", + "kindle.de", + "kindle.es", + "kindle.fr", + "kindle.in", + "kindle.it", + "kindle.jp", + "kindle4rss.com", + "kindleoasis.com", + "kindleoasis.info", + "kindleoasis.jp", + "kindleoasis.org", + "kindleoasis.us", + "kindleoasisnews.com", + "kindleproject.com", + "kindleren.com", + "kindnudist.com", + "kinds.ac.uk", + "kindteenporn.com", + "king.ac.uk", + "kingalfreds.ac.uk", + "kingalfredsbasingstoke.ac.uk", + "kingcomix.com", + "kingdomsalvation.org", + "kinged6nun.ac.uk", + "kingextre.me", + "kingf-av.buzz", + "kingf-av.lol", + "kingf-av.mom", + "kingf-av.sbs", + "kingf-tv.buzz", + "kingfav.sbs", + "kinghost.com", + "kingkong.com.tw", + "kingkongapp.com", + "kingofpics.com", + "kings.ac.uk", + "kingshillinstitute.ac.uk", + "kingshurst.ac.uk", + "kingslondon.ac.uk", + "kingstagram.com", + "kingston-college.ac.uk", + "kingston.ac.uk", + "kingstonalumni.ac.uk", + "kingstone.com.tw", + "kingsway.ac.uk", + "kinguno.xyz", + "kink.com", + "kinkbook.com", + "kinklive.com", + "kinkoid.com", + "kinkyfamily.com", + "kinkypeepz.com", + "kinmen.org.tw", + "kinmen.travel", + "kinokuniya.com", + "kir.jp", + "kir2kos.net", + "kirbysepicyarn.com", + "kirbysuperstarultra.com", + "kirkleescollege.ac.uk", + "kirkley.ac.uk", + "kisharon.ac.uk", + "kismia.com", + "kissbbao.cn", + "kisscos.net", + "kissjav.com", + "kissjav.li", + "kitazawa.me", + "kitts.ac.uk", + "kiwi.kz", + "kiwibrowser.com", + "kk-whys.co.jp", + "kk.stream", + "kkbox.com", + "kkbox.com.tw", + "kkddsex7.com", + "kkfcc03.com", + "kkiah.com", + "kknews.cc", + "kktix.com", + "kktv.com.tw", + "kktv.me", + "kl.ac.uk", + "klik.me", + "klip.me", + "kmc.ac.uk", + "kmdhyy.com", + "kmeleonbrowser.org", + "kmff17.com", + "kmms.ac.uk", + "kmuh.org.tw", + "knightlearning.ac.uk", + "knovel.com", + "knowledge-house.ac.uk", + "knowledgehouse.ac.uk", + "knowledgerush.com", + "knowsleycc.ac.uk", + "knowsleycollege.ac.uk", + "knowswho.co.jp", + "knowyourmeme.com", + "knoxemm.com", + "knti.ac.uk", + "ko-fi.com", + "koalaporn.com", + "kobbeatssbydredk.com", + "kobe-pastel.com", + "kobo.com", + "kobobooks.com", + "kochudaho.me", + "kodi.tv", + "kodi.wiki", + "kodingen.com", + "kompoz.com", + "kompoz2.com", + "kompozer.net", + "konachan.com", + "konachan.net", + "kone.com", + "koolsolutions.com", + "koornk.com", + "kopfhorergunstigshop.com", + "koranmandarin.com", + "korea.net", + "koreanpornmovie.com", + "korenan2.com", + "korewaeroi.com", + "kostenlosepornoclips.com", + "kotlinlang.org", + "koubaibu.jp", + "kouwobb.com", + "kphimsex.net", + "kpht85.com", + "kpinsurances.com", + "kpptoto.info", + "kqes.net", + "kraken.com", + "krakenjs.com", + "krhentai.com", + "kristenbjorn.com", + "krosspictures.com", + "krtco.com.tw", + "krux.com", + "krymr.com", + "ksc.ac.uk", + "kscisco.com", + "ksd235qw.com", + "ksdl.org", + "ksep.ac.uk", + "ksescortclub.com", + "ksnews.com.tw", + "kspcoin.com", + "kssacademy.ac.uk", + "kssdeanery.ac.uk", + "ksyp10.com", + "ktvu.com", + "ktzhk.com", + "ku77.xyz", + "kuaimao-app.com", + "kuaipa.net", + "kuanrenxs.com", + "kubakuba.global", + "kubakuba1996.com", + "kubeacademy.com", + "kubeapps.com", + "kubernetes.io", + "kucoin.com", + "kucoin.plus", + "kui.name", + "kuke.com", + "kukuku.uk", + "kum.com", + "kumo.com", + "kun.im", + "kun66.xyz", + "kundun1069.com", + "kurashsultan.com", + "kurtmunger.com", + "kusocity.com", + "kusugurizanmai.com", + "kutjeporno.com", + "kwcg.ca", + "kwok7.com", + "kwongwah.com.my", + "kxsw.life", + "kynogon.com", + "kyodo-d.info", + "kyodo-d.jp", + "kyodoimages.jp", + "kyodonews.jp", + "kyodonews.net", + "kyofun.com", + "kyohk.net", + "kyoyue.com", + "kyurem.com", + "kyzyhello.com", + "kzeng.info", + "l-msedge.net", + "la-forum.org", + "la-mama.ru", + "laban.ac.uk", + "labiennale.org", + "labinacell.ac.uk", + "lackcoll.ac.uk", + "lackham.ac.uk", + "lacomics.org", + "ladbrokes.com", + "ladies.com", + "ladsp.com", + "ladybaba.net", + "ladyboygold.com", + "ladyboygold.eu", + "ladyboypornonly.com", + "lae.ac.uk", + "laetottenham.ac.uk", + "lagranepoca.com", + "lahp.ac.uk", + "laia.ac.uk", + "lain.la", + "lakescollege.ac.uk", + "lakescollegewestcumbria.ac.uk", + "lal.ac.uk", + "lala.im", + "lalulalu.com", + "lama.com.tw", + "lamayeshe.com", + "lambeth.ac.uk", + "lambethacl.ac.uk", + "lambethcollege.ac.uk", + "lamda.ac.uk", + "lamenhu.com", + "lamnia.co.uk", + "lamp.ac.uk", + "lampeter.ac.uk", + "lamrim.com", + "lanarkshirefederation.ac.uk", + "lanasbigboobs.com", + "lancashire.ac.uk", + "lancashirecompact.ac.uk", + "lancashireinstituteoftechnology.ac.uk", + "lancashirelawacademy.ac.uk", + "lancashirelawschool.ac.uk", + "lancaster.ac.uk", + "lancasterbeijingjiaotong.ac.uk", + "lancs-cumbrianti.ac.uk", + "lancs-initiative.ac.uk", + "lancs.ac.uk", + "lancsngfl.ac.uk", + "landmap.ac.uk", + "landmarks.ac.uk", + "landofhope.tv", + "landscape.ac.uk", + "langdoncollege.ac.uk", + "langpol.ac.uk", + "langside.ac.uk", + "langsuirs.com", + "languagebox.ac.uk", + "languagesmythsfinds.ac.uk", + "languagesresearch.ac.uk", + "languagessoutheast.ac.uk", + "lanik.us", + "lanmdh.net", + "lanniser-ylo.shop", + "lantern.io", + "lanternal.com", + "lanterncn.cn", + "lantosfoundation.org", + "laod.cn", + "laogai.org", + "laogairesearch.org", + "laomiu.com", + "laosijifuli9009.top", + "laowang.vip", + "laoyang.info", + "lapriere.jp", + "laps.ac.uk", + "laptoplockdown.com", + "laqingdan.net", + "laracasts.com", + "largecamtube.com", + "largeporntube.com", + "larsgeorge.com", + "lasersawapp.com", + "last.fm", + "lastcombat.com", + "lastfm.es", + "lastfm.freetls.fastly.net", + "lasvegasbmw.com", + "latampartneruniversity.com", + "latamvmwareforum.com", + "latelinenews.com", + "latencytop.com", + "latex-project.org", + "latibet.org", + "latinaabuse.com", + "latintubeporn.com", + "latticedata.com", + "launchpad.net", + "launchpad.wang", + "launchpadcontent.net", + "launchpadlibrarian.com", + "launchpadlibrarian.net", + "launchpadlibrarian.org", + "lausan.hk", + "lavteam.org", + "law.ac.uk", + "law.com", + "lawcabs.ac.uk", + "lawdata.com.tw", + "lawteacher.ac.uk", + "laxd.com", + "lazymike.com", + "lbank.info", + "lbc-northwood.ac.uk", + "lbc.ac.uk", + "lbfmaddiction.com", + "lbkrs.com", + "lboro.ac.uk", + "lborolondon.ac.uk", + "lbpresearch.ac.uk", + "lbs.ac.uk", + "lbtube.com", + "lbu.ac.uk", + "lcad.ac.uk", + "lcb.ac.uk", + "lcbs.ac.uk", + "lcbt.ac.uk", + "lcds.ac.uk", + "lcf.ac.uk", + "lcfi.ac.uk", + "lcgirls.com", + "lcgroup.ac.uk", + "lciot.ac.uk", + "lcirah.ac.uk", + "lcit.ac.uk", + "lcm.ac.uk", + "lcriconvergence.ac.uk", + "lcsmerch.com", + "lcssp.ac.uk", + "lct.ac.uk", + "lcuck.ac.uk", + "lcwc.ac.uk", + "ldoc-cdt.ac.uk", + "le-direct.tv", + "le-vpn.com", + "le.ac.uk", + "leadershipfoundation.ac.uk", + "leadershiphe.ac.uk", + "leafyvpn.net", + "leaguehighschool.com", + "leagueoflegends.ca", + "leagueoflegends.co.kr", + "leagueoflegends.com", + "leagueoflegends.info", + "leagueoflegends.kr", + "leagueoflegends.net", + "leagueoflegends.org", + "leagueoflegendsscripts.com", + "leaguesharp.info", + "leaguoflegends.com", + "leakedmeat.com", + "leakedzone.com", + "leaksmodels.com", + "leakxxx.com", + "leanhe.ac.uk", + "leanhehub.ac.uk", + "leannecrowvideos.com", + "leap.ac.uk", + "leapahead.ac.uk", + "learna.ac.uk", + "learnbaes.ac.uk", + "learndirect.ac.uk", + "learnedsocietywales.ac.uk", + "learnharrow.ac.uk", + "learnhigher.ac.uk", + "learningbites.ac.uk", + "learninglink.ac.uk", + "learningmathsonline.ac.uk", + "learningonscreen.ac.uk", + "learningstaffordshire.ac.uk", + "learningtogether.ac.uk", + "learningzone.ac.uk", + "learninscotland.ac.uk", + "learninworcestershire.ac.uk", + "learnit-northampton.ac.uk", + "learnnorthants.ac.uk", + "learnportsmouth.ac.uk", + "learnsafl.ac.uk", + "learntelford.ac.uk", + "learntogive.ac.uk", + "learnwithleague.com", + "leavinghpinc.com", + "lec.ac.uk", + "lecb.ac.uk", + "lecloud.net", + "lecoin.cc", + "ledas.ac.uk", + "lede-project.org", + "leder.ac.uk", + "ledger.com", + "leeao.com.cn", + "leecountytimes.com", + "leeds-art.ac.uk", + "leeds-ecampus.ac.uk", + "leeds-lcot.ac.uk", + "leeds-met.ac.uk", + "leeds-metropolitan.ac.uk", + "leeds.ac.uk", + "leedsadultlearning.ac.uk", + "leedsbeckett.ac.uk", + "leedsbeckettuniversity.ac.uk", + "leedscitycollege.ac.uk", + "leedscollege.ac.uk", + "leedsd.ac.uk", + "leedsmet.ac.uk", + "leedsmetcarnegie.ac.uk", + "leedsmetropolitan.ac.uk", + "leedssixthform.ac.uk", + "leedsthomasdanby.ac.uk", + "leedstrinity.ac.uk", + "leek.ac.uk", + "lefora.com", + "left21.hk", + "legacy.ac.uk", + "legalporno.com", + "legalscholars.ac.uk", + "legaltracker.com", + "leggott.ac.uk", + "legsex.com", + "legsjapan.com", + "leicester-poly.ac.uk", + "leicester.ac.uk", + "leicestercollege.ac.uk", + "leicesterlearns.ac.uk", + "leicestermuseums.ac.uk", + "leicp.ac.uk", + "leics-als.ac.uk", + "leighcollege.ac.uk", + "leirentv.ca", + "leis.ac.uk", + "leisurecafe.ca", + "leisurepro.com", + "leliao1.com", + "lematin.ch", + "lemoncams.com", + "lemonde.fr", + "lencr.org", + "lenkino.xxx", + "lenporno.red", + "lenwhite.com", + "leorockwell.com", + "leos-scot.ac.uk", + "leporno.org", + "lepornochaud.com", + "lepornofrais.com", + "lerosua.org", + "lers.google", + "lersnet.ac.uk", + "lesbian8.com", + "lesbianpics.org", + "lesbianpornvideos.com", + "lesbiansubmission.com", + "lesboerotica.net", + "lesoco.ac.uk", + "lesoir.be", + "lester850.info", + "letbsharedservice.ac.uk", + "letfap.com", + "lethalhardcore.com", + "lethalhardcorevr.com", + "letmejerk.com", + "letmejerk.fun", + "letou.com", + "letscorp.net", + "letsdoeit.com", + "letsencrypt.com", + "letsencrypt.org", + "letsfuckme.net", + "letsjerk.cc", + "lettherebeporn.com", + "lettol.ac.uk", + "levelsex.com", + "leverhulme.ac.uk", + "levyhsu.com", + "lewcol.ac.uk", + "lewdthots.com", + "lewdvrgames.com", + "lewdweb.net", + "lewestraining.ac.uk", + "lewisham.ac.uk", + "lewishamsouthwarkcollege.ac.uk", + "lexisnexis.com", + "lexuemei.com", + "leyton.ac.uk", + "lezpoo.com", + "lfa.ac.uk", + "lfai.foundation", + "lfhe.ac.uk", + "lflink.com", + "lflinkup.com", + "lflinkup.net", + "lflinkup.org", + "lfpcontent.com", + "lg.com", + "lgappstv.com", + "lgbtnonhe.ac.uk", + "lgbtq.games", + "lge.co.kr", + "lge.com", + "lgecareers.com", + "lghvac.com", + "lghvacstory.com", + "lgrecyclingprogram.com", + "lgsalesportal.com", + "lgu.ac.uk", + "lhakar.org", + "lhasocialwork.org", + "lhc.ac.uk", + "lhcb.ac.uk", + "lhec.ac.uk", + "li.taipei", + "liangyou.net", + "liangzhichuanmei.com", + "lianhonghong.com", + "lianjiajr.net", + "lianyue.net", + "liaowangxizang.net", + "liberal.org.hk", + "liberapay.com", + "liberapay.org", + "libertysculpturepark.com", + "libertytimes.com.tw", + "libf.ac.uk", + "libgen.fun", + "libgen.is", + "libgen.life", + "libgen.me", + "libgen.rs", + "libgen.st", + "liboggirls.net", + "library.lol", + "libraryinformationtechnology.com", + "librarylovefest.com", + "libraryofthumbs.com", + "libredd.it", + "librewolf.net", + "libsolutions.app", + "libsolutions.domains", + "libsolutions.net", + "licdn.com", + "licensebuttons.net", + "licenseparser.com", + "lichfield.ac.uk", + "lidc.ac.uk", + "lidecheng.com", + "lido-dtp.ac.uk", + "life-global.org", + "life.ac.uk", + "lifearc.ac.uk", + "lifeatkings.ac.uk", + "lifelab.ac.uk", + "lifelonglearning.ac.uk", + "lifemiles.com", + "lifeselector.com", + "lifesign.ac.uk", + "lifestudy.ac.uk", + "lifewire.com", + "liftapp.ac.uk", + "lightbridge.com", + "lighten.org.tw", + "lighthouselearningtrust.ac.uk", + "lighti.me", + "lightnovel.cn", + "lightxxxtube.com", + "lightyearvpn.com", + "lih.kg", + "lihe.ac.uk", + "lihkg.com", + "lihksnap.com", + "like.com", + "likeseiyu.com", + "liketruyen.net", + "liketwice.com", + "likuoo.video", + "lilaoshibushinilaoshi.com", + "lilhumpers.com", + "liliav.com", + "lilith-soft.com", + "limavady.ac.uk", + "lime.ac.uk", + "limedia.tw", + "limelight.com", + "limer.tw", + "limertw.cc", + "limeteensex.com", + "limiao.net", + "lims.ac.uk", + "lin.ee", + "lincoln.ac.uk", + "lincolncollege.ac.uk", + "lincolninstitute.ac.uk", + "lincolninstituteoftechnology.ac.uk", + "lincolnmedicalschool.ac.uk", + "lincolnshireinstituteoftechnology.ac.uk", + "lincsiot.ac.uk", + "lincsit.ac.uk", + "lindylist.org", + "line-apps-beta.com", + "line-apps-rc.com", + "line-apps.com", + "line-beta.me", + "line-cdn.net", + "line-scdn.net", + "line.biz", + "line.me", + "linearcollider.org", + "linecorp.com", + "linefriends.com", + "linefriends.com.tw", + "linegame.jp", + "linemobile.com", + "linemyshop.com", + "lineshoppingseller.com", + "linetv.tw", + "lingeriepornonly.com", + "linglingfa.com", + "lingualeo.com", + "linguee.com", + "linguistics.ac.uk", + "lingvodics.com", + "link-o-rama.com", + "link.com", + "link19college.ac.uk", + "link2galleries.com", + "link2learn-ni.ac.uk", + "link69.com", + "linkage.ac.uk", + "linkagecollege.ac.uk", + "linkedin.at", + "linkedin.com", + "linkideo.com", + "linkinglondon.ac.uk", + "linkjunkies.com", + "linksalpha.com", + "linkshit.com", + "linksintolanguages.ac.uk", + "linktr.ee", + "linkuswell.com", + "linotype.com", + "linpie.com", + "linseysworld.com", + "linst.ac.uk", + "linux.org", + "linux.org.hk", + "linuxfoundation.org", + "linuxfromscratch.org", + "linuxmint.com", + "linuxtoy.org", + "lionhearts.co.kr", + "lionsroar.com", + "lipa.ac.uk", + "liparm.ac.uk", + "lipidomics.ac.uk", + "lipsit.ac.uk", + "lipuman.com", + "liquiditytp.com", + "liquidtelecom.net", + "liquidvpn.com", + "liscol.ac.uk", + "lisiku.com", + "lisiku1.com", + "liss-dtp.ac.uk", + "list-manage.com", + "listar.ac.uk", + "listen-up.ac.uk", + "listennotes.com", + "listentoyoutube.com", + "listerpostgraduate.ac.uk", + "listinganalytics.net", + "listorious.com", + "litbus-anime.com", + "literatumonline.com", + "literotica.com", + "lithium.com", + "litt.ac.uk", + "littleasians.com", + "littlehampton.ac.uk", + "littlesexdolls.com", + "litv.tv", + "liu-xiaobo.org", + "liudejun.com", + "liuhanyu.com", + "liuhefabu.club", + "liujianshu.com", + "liuxiaobo.net", + "liuxiaotong.com", + "liv-coll.ac.uk", + "liv-e.ac.uk", + "liv.ac.uk", + "live-patreon-marketing.pantheonsite.io", + "live-video.net", + "live.ac.uk", + "live.com", + "live.com.au", + "live.eu", + "live.net", + "liveauction.com", + "livecamclips.com", + "livecoin.net", + "livedoor.biz", + "livedoor.blog", + "livedoor.jp", + "livefilestore.com", + "livehdcams.com", + "livejasmin.com", + "livejasminbabes.net", + "livekit.cloud", + "liveleak.com", + "livemint.com", + "livemodels.co", + "livenet.ac.uk", + "livephotos.tv", + "liveporngirls.com", + "liveprivates.com", + "liverail.com", + "liverail.tv", + "liverpool.ac.uk", + "liverpoolsas.ac.uk", + "livesandletters.ac.uk", + "livesex.com", + "livesexasian.com", + "livesketchshare.com", + "livestation.com", + "livestream.com", + "livevideo.com", + "livewell.ac.uk", + "livexxx.me", + "livhope.ac.uk", + "livingdigital.ac.uk", + "livinglab.ac.uk", + "livinglaboratory.ac.uk", + "livinglegacies1914-18.ac.uk", + "livingonline.us", + "livingstream.com", + "livingwithmachines.ac.uk", + "livingyourambition.com", + "livjm.ac.uk", + "livrariart.com.br", + "liwangyang.com", + "lizardporn.com", + "lizhizhuangbi.com", + "lizol.co.in", + "ljmu.ac.uk", + "lkcn.net", + "lkl.ac.uk", + "ll82y2ifdd.top", + "llakes.ac.uk", + "llambed.ac.uk", + "llandrillo.ac.uk", + "llas.ac.uk", + "llbd10.shop", + "llcaoxm-avi.sbs", + "lldns.net", + "lliusno.com", + "llnw-trials.com", + "llnw.com", + "llnw.net", + "llnwd.net", + "llnwi.net", + "llss.me", + "llwht88.xyz", + "llysfasi.ac.uk", + "lma.ac.uk", + "lmbru.ac.uk", + "lmc.ac.uk", + "lmd.ac.uk", + "lmi4he.ac.uk", + "lmm167.shop", + "lmmbtc.com", + "lms.ac.uk", + "lmsys.org", + "lmu.ac.uk", + "lnat.ac.uk", + "lncn.org", + "lnkd.in", + "lnstagram-help.com", + "load.to", + "loanbuilder.com", + "lobsangwangyal.com", + "lobstertube.com", + "localbitcoins.com", + "localbitcoinschain.com", + "localdomain.ws", + "localizecdn.com", + "localizejs.com", + "localizestatus.com", + "localpresshk.com", + "localxlist.org", + "locate.ac.uk", + "lockestek.com", + "lockssalliance.ac.uk", + "logbot.net", + "logi.com", + "logic.ac.uk", + "logicool.co.jp", + "logicoolg.com", + "login-account.net", + "login-paypal.com", + "login-paypal.info", + "logiqx.com", + "logitech.biz", + "logitech.com", + "logitech.com.cn", + "logitech.fr", + "logitech.io", + "logitechg.com", + "logitechg.com.cn", + "logitechg.fr", + "logitechio.com.cn", + "logmein.com", + "logos.com.hk", + "logosfilm.co.kr", + "loholidayhk.com", + "lojaiphone.com.br", + "lokinet.org", + "lol-europe.com", + "lolclub.org", + "lolespor.com", + "lolesports.com", + "lolfanart.net", + "lolhentai.net", + "loli.net", + "lolibus.cc", + "lolibus.top", + "lolislove.info", + "lolita.bet", + "lollipopescorts.com", + "lolo.ac.uk", + "lolpcs.com", + "lolshop.co.kr", + "lolstatic.com", + "lolusercontent.com", + "lon.ac.uk", + "london-college.ac.uk", + "london-fashion.ac.uk", + "london-guildhall.ac.uk", + "london-pgmde.ac.uk", + "london.ac.uk", + "londonbiblecollege.ac.uk", + "londonbusinessschool.ac.uk", + "londoncbs.ac.uk", + "londoncentre-hstm.ac.uk", + "londonchinese.ca", + "londonchurchillcollege.ac.uk", + "londondeanery.ac.uk", + "londoneastcove.ac.uk", + "londonexternal.ac.uk", + "londonfilmacademy.ac.uk", + "londonhigher.ac.uk", + "londonhotescort.com", + "londoninternational.ac.uk", + "londonknowledgelab.ac.uk", + "londonlinks.ac.uk", + "londonmedicine.ac.uk", + "londonmet.ac.uk", + "londonmetro.ac.uk", + "londonmetropolitan.ac.uk", + "londonmetropolitanuniversity.ac.uk", + "londonmetuniversity.ac.uk", + "londonmithraeum.com", + "londonp4p.ac.uk", + "londonreach.ac.uk", + "londonreal.tv", + "londonschooloftheology.ac.uk", + "londonscreenacademy.ac.uk", + "londonstudiocenter.ac.uk", + "londonstudiocentre.ac.uk", + "lonestarnaughtygirls.com", + "longbridge.cloud", + "longbridge.global", + "longbridge.hk", + "longbridge.sg", + "longbridgeapp.com", + "longeaton.ac.uk", + "longhair.hk", + "longley-park.ac.uk", + "longley-parksfc.ac.uk", + "longleypark.ac.uk", + "longleyparkcollege.ac.uk", + "longleyparksfc.ac.uk", + "longleyparksixthformcollege.ac.uk", + "longman.ch", + "longmusic.com", + "longportapp.com", + "longroad.ac.uk", + "longtailvideo.com", + "longtermly.net", + "longtoes.com", + "lonklab.ac.uk", + "lonmet.ac.uk", + "lonmetro.ac.uk", + "lonmt.ac.uk", + "lookinside.com", + "lookpic.com", + "looktoronto.com", + "loongese.com", + "looporn.com", + "looti.net", + "lordofultima.com", + "loreto.ac.uk", + "lostbetsgames.com", + "lotcrap.com", + "lothiancolleges.ac.uk", + "lotsawahouse.org", + "lotuslight.org.hk", + "lotuslight.org.tw", + "lou.ac.uk", + "loucoll.ac.uk", + "loughborough.ac.uk", + "loukky.com", + "love-sextoys.co.uk", + "love4porn.com", + "love6.tv", + "love7.xyz", + "loveamateurfacials.com", + "loveavdh15.cc", + "loveavdh21.cc", + "loveavvip.com", + "lovebeatsdr.com", + "loved.hk", + "lovedolltorso.com", + "lovegirls.cam", + "lovehomeporn.com", + "lovejav.net", + "loveloveskill.com", + "lovemarca.com", + "loveminiso.com.br", + "loveparents.org", + "lovepartners.life", + "loverslab.com", + "lovesexbody.com", + "lovesexdurex.com", + "lovethiscity.com", + "lovetvshow.com", + "lovex.life", + "lowergiseries.com", + "lowestoft.ac.uk", + "lowestoftsfc.ac.uk", + "lowestoftsixthformcollege.ac.uk", + "lowiro.com", + "lp99.pw", + "lpc.ac.uk", + "lpmde.ac.uk", + "lpsg.com", + "lqpjw.cyou", + "lrfdsoftware.com", + "lrfz.com", + "lrip.org", + "lrysgee.xyz", + "ls-uc.ac.uk", + "lsa.ac.uk", + "lsawards.com", + "lsbm.ac.uk", + "lsbu.ac.uk", + "lscollege.ac.uk", + "lscs.ac.uk", + "lsd.org.hk", + "lse-departments.ac.uk", + "lse-events.ac.uk", + "lse-global.ac.uk", + "lse-marketing.ac.uk", + "lse-nursery.ac.uk", + "lse-research.ac.uk", + "lse-residences.ac.uk", + "lse-sport.ac.uk", + "lse-students.ac.uk", + "lse.ac.uk", + "lseapplicants.ac.uk", + "lsec.ac.uk", + "lsecollaborators.ac.uk", + "lsejournals.ac.uk", + "lsestaff.ac.uk", + "lsfc.ac.uk", + "lsforum.net", + "lsgnt-cdt.ac.uk", + "lshtm.ac.uk", + "lsj2.shop", + "lsj40.xyz", + "lsjfuli308.xyz", + "lsjs.ac.uk", + "lsm.org", + "lsmchinese.org", + "lsme.ac.uk", + "lsmkorean.org", + "lsmradio.com", + "lsmwebcast.com", + "lso.ac.uk", + "lspimg.com", + "lsrc.ac.uk", + "lsrnw.ac.uk", + "lss55.com", + "lsst.ac.uk", + "lst.ac.uk", + "lstmed.ac.uk", + "lstmliverpool.ac.uk", + "lstonline.ac.uk", + "lsxszzg.com", + "ltcc.ac.uk", + "ltea.ac.uk", + "ltegroup.ac.uk", + "lthgav.buzz", + "ltn.com.tw", + "ltscotland.ac.uk", + "ltsn-01.ac.uk", + "ltsn.ac.uk", + "ltsneng.ac.uk", + "ltsports.com.tw", + "ltube.life", + "lu2100.com", + "lu2200.com", + "lu23.com", + "lu2300.cc", + "lua.org", + "luanlunmv.cc", + "lubetube.com", + "lucahmelayu.club", + "lucasentertainment.com", + "lucbjtu.ac.uk", + "lucid.ac.uk", + "luckydesigner.space", + "luckyissue.com", + "ludlow-college.ac.uk", + "lufton-college-fe.ac.uk", + "luftoncollege.ac.uk", + "luil.ac.uk", + "luke54.com", + "luke54.org", + "lululu.one", + "luminate.ac.uk", + "luminateeducation.ac.uk", + "luminateeducationgroup.ac.uk", + "luminategroup.ac.uk", + "lunchwithpype.com", + "luoli.info", + "luotihg-tv.buzz", + "luotihg.cc", + "lupc.ac.uk", + "lupm.org", + "lupoporno.com", + "luscious.net", + "lushstories.com", + "lustery.com", + "lusthero.com", + "lustylist.com", + "lut.ac.uk", + "luticlip.com", + "luton-acl.ac.uk", + "luton.ac.uk", + "lutonacl.ac.uk", + "lutonsfc.ac.uk", + "lutube2310.com", + "luvmov.com", + "luw666.xyz", + "luw666cm.cc", + "luxebc.com", + "luxuretv.com", + "luxuretv.fun", + "lvhai.org", + "lvv.ac.uk", + "lvv2.com", + "lwms.ac.uk", + "lww-cetl.ac.uk", + "lwwcn.buzz", + "lwwcn.xyz", + "lxxlxx.com", + "lyellcentre.ac.uk", + "lyfhk.net", + "lysol.ca", + "lysol.cl", + "lysol.co.cr", + "lysol.com", + "lysol.com.mx", + "lysol.net", + "lythamsixth.ac.uk", + "lyzsxx.com", + "lz.ac.uk", + "lzjscript.com", + "lzmtnews.org", + "m-power.com", + "m-rhex.ac.uk", + "m-sport.co.uk", + "m-team.cc", + "m.me", + "m12.vc", + "m25lib.ac.uk", + "m2m.com", + "m5servicedesk.ac.uk", + "m5universities.ac.uk", + "m8008.com", + "ma1lib.org", + "maa.plus", + "mabbank.com", + "mablethorpe.ac.uk", + "mac-migs.ac.uk", + "mac-mini.com", + "mac.com", + "mac.com.au", + "mac.eu", + "mac.rs", + "mac.wang", + "macappsto.re", + "macaulay.ac.uk", + "macbook.co", + "macbook.hk", + "macbook.tw", + "macbook.wang", + "macbookair.co.kr", + "macbookair.co.uk", + "macbookair.com", + "macbookair.com.au", + "macbookair.com.es", + "macbookair.es", + "macbookair.hk", + "macbookair.jp", + "macbookair.kr", + "macbookair.net", + "macbookpro.co", + "macbookpro.com", + "macbookpro.com.au", + "macbookpro.net", + "macbookpro.us", + "macbookpros.com", + "macbooksale.com", + "macboxset.com", + "macclesfield-college.ac.uk", + "macclesfield.ac.uk", + "macgamestore.com", + "mach-os.com", + "mach-os.net", + "machbbs.com", + "machigle-sp.com", + "machigoto.jp", + "machine-dna.com", + "machogaytube.com", + "machos.net", + "machosaonatural.com.br", + "machotube.tv", + "macintosh.eu", + "macintoshsoftware.com", + "mackworth-college.ac.uk", + "mackworth.ac.uk", + "macmini.com", + "macos.com.au", + "macosforge.org", + "macossierra.com", + "macosx.info", + "macosxlion.com", + "macpazar.com", + "macports.org", + "macreach.com", + "macreach.net", + "macromedia.com", + "macrovpn.com", + "macruby.com", + "macruby.net", + "macruby.org", + "macrumors.com", + "macts.com.tw", + "mad-ar.ch", + "madamlive.tv", + "madchensex.com", + "maddawgjav.net", + "maddenchampionship.com", + "maddenrewards.com", + "maddenseason.info", + "maddenseason.net", + "maddenseason.org", + "madewithcode.com", + "madewithmaya.com", + "madewithstudiotools.com", + "madhomemadeporn.com", + "madonna-av.com", + "madou.club", + "madou.la", + "madou.tv", + "madouav.one", + "madouqu.com", + "madrau.com", + "madshi.net", + "madthumbs.com", + "madvagina.com", + "madvr.com", + "madvr.net", + "maes.ac.uk", + "mafia-linkz.to", + "mageconf.com", + "mageconf.com.ua", + "magento.com", + "magento.net", + "magentocommerce.com", + "magentoliveconference.com", + "magentomobile.com", + "magestic.com", + "magic-net.info", + "magic.ac.uk", + "magicalmirai.com", + "magicmovies.com", + "maglue.ac.uk", + "magnacartacollege.ac.uk", + "mahabodhi.org", + "mahajantech.com", + "mahsc.ac.uk", + "maiio.net", + "mail-archive.com", + "mail.ru", + "mailchimp.com", + "maildns.xyz", + "maileoch.com", + "mailhealth.com", + "mailonline.co.uk", + "mailonline.com", + "mailonsunday.co.uk", + "mailonsunday.ie", + "mailtalk.ac.uk", + "main.jp", + "mainichi-athletepartners.jp", + "mainichi.jp", + "mainichibooks.com", + "maiplus.com", + "mairbeats.com", + "maizhong.org", + "makaan.com", + "makeanything.com", + "makebettercode.com", + "makecode.org", + "makeeu.com", + "makeitopen.com", + "makeitrealcontest.com", + "makemymood.com", + "makesenseofdata.com", + "makingassessmentcount.ac.uk", + "makingstartshere.com", + "makingthemostofmasters.ac.uk", + "makkahnewspaper.com", + "maktoob.com", + "malayalamanorama.com", + "malayporn.site", + "malayporn.space", + "malaypornhub.com", + "malaysiakini.com", + "mallandrinhas.net", + "mallheadphone.com", + "malvastudios.com", + "malvern.ac.uk", + "mamacitaz.com", + "mamingzhe.com", + "man.ac.uk", + "managed-pki.ch", + "managed-pki.de", + "managedmeetingrooms.com", + "managedpki.com", + "managedpki.ne.jp", + "management-azure-devices-int.net", + "management-azure-devices.net", + "managementcontrolassociation.ac.uk", + "mancat.ac.uk", + "manchester-business-school.ac.uk", + "manchester-city-coll.ac.uk", + "manchester-computing-centre.ac.uk", + "manchester-metropolitan-university.ac.uk", + "manchester-worldwide.ac.uk", + "manchester.ac.uk", + "manchesterbusinessschool.ac.uk", + "manchesterdentalschool.ac.uk", + "manchesterjmce.ac.uk", + "manchestermedicalschool.ac.uk", + "manchestermethod.ac.uk", + "manchesternti.ac.uk", + "manchesternursingmidwiferyandsocialworkschool.ac.uk", + "manchesternursingschool.ac.uk", + "manchesterpharmacyschool.ac.uk", + "manchesterpsychologyschool.ac.uk", + "manchesterschoolofdentistry.ac.uk", + "manchesterschoolofmedicine.ac.uk", + "manchesterschoolofnursing.ac.uk", + "manchesterschoolofnursingmidwiferyandsocialwork.ac.uk", + "manchesterschoolofpharmacy.ac.uk", + "manchesterschoolofpsychology.ac.uk", + "manchukuo.net", + "manchustate.org", + "mandatewire.com", + "mandiant.com", + "manga-mill.com", + "manga18.art", + "mangafox.com", + "mangafox.me", + "mangahasu.se", + "mangahentai.me", + "mangahome.com", + "mangoporn.net", + "mangotporn.com", + "manhuabika.com", + "manhuache.com", + "manhuagui.com", + "manhub.com", + "manhunt.net", + "manhuntdaily.com", + "manhwa24h.com", + "manhwahentai.me", + "maniakey.homes", + "maniash.com", + "manicur4ik.ru", + "manlitphil.ac.uk", + "manorama.com", + "manoramanews.com", + "manoramaonline.com", + "manoramayearbook.in", + "manoto1.tv", + "manototv.com", + "manporn.xxx", + "mansion.com", + "mansionglobal.com", + "mansionpoker.com", + "mansurfer.com", + "manta.com", + "mantais.ac.uk", + "mantochichi.com", + "manufacturingedc.ac.uk", + "manurefetish.com", + "manytoon.com", + "manyvids.com", + "manyvoices.news", + "maoeraobjects.ac.uk", + "maomi-shipin.com", + "maomiav.one", + "map-software.com", + "mapbox.com", + "mapguide.com", + "maple.finance", + "maplew.com", + "mapp.ac.uk", + "mappingonline.com", + "mappingthemedievalmargins.ac.uk", + "mappingtheunderworld.ac.uk", + "mappingwales.ac.uk", + "mappingwelshmarches.ac.uk", + "marble.ac.uk", + "marc.info", + "marchmont.ac.uk", + "maremap.ac.uk", + "marguerite.su", + "mariadb.org", + "marianstudies.ac.uk", + "marinecadcam.com", + "marinecentrewales.ac.uk", + "marioandluigidreamteam.com", + "mariobroswii.com", + "mariokart7.com", + "mariokart8.com", + "mariosupersluggers.com", + "marjon.ac.uk", + "marketexecutive.net", + "marketing-cloud.com", + "marketing-nirvana.com", + "marketingcloud.com", + "marketo.co.uk", + "marketo.com", + "marketo.net", + "marketo.tv", + "marketodesigner.com", + "marketolive.com", + "marketwatch.com", + "markingmenus.com", + "markzuckerberg.com", + "marlab.ac.uk", + "marlin.ac.uk", + "marplecollege.ac.uk", + "marranazas.com", + "martau.com", + "martincartoons.com", + "martinoei.com", + "martsangkagyuofficial.org", + "maruta.be", + "maruzen.co.jp", + "marvel.com", + "marvel10thanniversary.com", + "marveldimensionofheroes.com", + "marvelparty.net", + "marvelpinball.com", + "marvelsdoubleagent.com", + "marvelspotlightplays.com", + "marvelsuperheroseptember.com", + "marvelsuperwar.com", + "marxist.com", + "marxist.net", + "marxists.org", + "maryvale.ac.uk", + "maryward.ac.uk", + "marywardcentre.ac.uk", + "masalabin.com", + "masaladesi.com", + "masalaseen.net", + "masalladeloslimites.com", + "masc25.ac.uk", + "mash.to", + "mashaalradio.com", + "mashash.com", + "mashiro.site", + "maskedip.com", + "maskedsingerfox.com", + "massage-in-taipei.com", + "massagerepublic.com", + "masseffect.com", + "masseffectarchives.com", + "mastercad.com", + "mastercard-email.com", + "mastercard.ae", + "mastercard.at", + "mastercard.az", + "mastercard.ba", + "mastercard.be", + "mastercard.bg", + "mastercard.by", + "mastercard.ca", + "mastercard.ch", + "mastercard.cl", + "mastercard.co.id", + "mastercard.co.il", + "mastercard.co.in", + "mastercard.co.jp", + "mastercard.co.ke", + "mastercard.co.kr", + "mastercard.co.nz", + "mastercard.co.th", + "mastercard.co.uk", + "mastercard.co.ve", + "mastercard.co.za", + "mastercard.com", + "mastercard.com.ar", + "mastercard.com.au", + "mastercard.com.bh", + "mastercard.com.br", + "mastercard.com.bz", + "mastercard.com.co", + "mastercard.com.cy", + "mastercard.com.eg", + "mastercard.com.ge", + "mastercard.com.gt", + "mastercard.com.hk", + "mastercard.com.kw", + "mastercard.com.lb", + "mastercard.com.mx", + "mastercard.com.my", + "mastercard.com.ng", + "mastercard.com.pe", + "mastercard.com.ph", + "mastercard.com.sa", + "mastercard.com.sg", + "mastercard.com.tr", + "mastercard.com.tw", + "mastercard.com.ve", + "mastercard.com.vn", + "mastercard.cz", + "mastercard.de", + "mastercard.dk", + "mastercard.es", + "mastercard.eu", + "mastercard.fi", + "mastercard.fr", + "mastercard.gr", + "mastercard.hr", + "mastercard.hu", + "mastercard.ie", + "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.us", + "mastercardacademy.com", + "mastercardadvisors.com", + "mastercardbiz.ca", + "mastercardbiz.com", + "mastercardbusinessnetwork.com", + "mastercardcenter.com", + "mastercardcenter.org", + "mastercardcenterforinclusivegrowth.org", + "mastercardconnect.com", + "mastercardezsavings.com", + "mastercardidtheftalerts.com", + "mastercardmoments.com", + "mastercardrestaurant.com", + "mastercardservices.com", + "mastercardworldwide.com", + "masterclass.com", + "masterintelligence.com", + "masterpassteststore.com", + "mastersprojects.ac.uk", + "masterwanker.com", + "mastodon.cloud", + "mastodon.host", + "mastodon.online", + "mastodon.social", + "mastodon.xyz", + "masts.ac.uk", + "masturbate2gether.com", + "mat6tube.com", + "matainja.com", + "match.ac.uk", + "matchmover.com", + "material.io", + "materials.ac.uk", + "materialsnexus.ac.uk", + "mathable.io", + "mathcentre.ac.uk", + "mathematics.ac.uk", + "mathfit.ac.uk", + "mathgate.ac.uk", + "mathiew-badimon.com", + "mathoverflow.net", + "maths-magic.ac.uk", + "mathscentre.ac.uk", + "mathstore.ac.uk", + "mathsvideoclubs.ac.uk", + "mathtutor.ac.uk", + "matome-plus.com", + "matome-plus.net", + "matrix.ac.uk", + "matrix.org", + "matrix.to", + "matsushimakaede.com", + "matters.news", + "matters.one", + "matters.town", + "mattersprotocol.io", + "matthew-boulton.ac.uk", + "mattu.ac.uk", + "mattwilcox.net", + "matu.ac.uk", + "mature-amateur-sex.com", + "mature-nl.eu", + "mature-porn-flix.com", + "mature-tube.sexy", + "mature.nl", + "matureclub.com", + "maturefuck.cc", + "maturejp.com", + "matureladiesxxx.com", + "matureporner.com", + "maturepornonly.com", + "matures-loving-sex.com", + "maturescam.com", + "maturesexual.com", + "maturesinhd.com", + "maturetube.com", + "maturewifeporn.cc", + "maturewomenanal.com", + "maturexxxvideos.cc", + "mau.ac.uk", + "max.com", + "maxgo.com", + "maxillofacial-cadcam.com", + "maximize.ac.uk", + "maximumerotica.com", + "maxing.jp", + "maxis.com", + "maxwell.ac.uk", + "maya5.net", + "mayacomplete.com", + "mayaconductors.com", + "mayafluideffects.com", + "mayaformotiongraphics.com", + "mayagames.com", + "mayamasters.com", + "mayamentor.net", + "mayamentors.com", + "mayamentors.net", + "mayaonlinux.com", + "mayaonmac.com", + "mayaonosx.com", + "mayapressbooks.com", + "mayasucks.com", + "mayaunlimited.com", + "mayauser.com", + "mayauser.net", + "mayavisualization.com", + "mayijiejie.com", + "mayimayi.com", + "maying.co", + "mba.ac.uk", + "mbc.ac.uk", + "mbeats-tech.com", + "mbheadphone.com", + "mbn.ac.uk", + "mbro.ac.uk", + "mbs-worldwide.ac.uk", + "mbs.ac.uk", + "mc6.ac.uk", + "mca.ac.uk", + "mcadforums.com", + "mcaf.ee", + "mcb.com.mm", + "mcc.ac.uk", + "mcd-holdings.co.jp", + "mcd.com", + "mcdelivery.co.id", + "mcdelivery.co.in", + "mcdelivery.co.kr", + "mcdelivery.com.au", + "mcdelivery.com.my", + "mcdelivery.com.ph", + "mcdelivery.com.sg", + "mcdelivery.com.tw", + "mcdindia.com", + "mcdindonesia.com", + "mcdonalds-online.com", + "mcdonalds.be", + "mcdonalds.ca", + "mcdonalds.co.id", + "mcdonalds.co.jp", + "mcdonalds.co.kr", + "mcdonalds.co.nz", + "mcdonalds.co.uk", + "mcdonalds.com", + "mcdonalds.com.au", + "mcdonalds.com.hk", + "mcdonalds.com.lb", + "mcdonalds.com.my", + "mcdonalds.com.ph", + "mcdonalds.com.tw", + "mcdonalds.hk", + "mcdonalds.it", + "mcdonalds.no", + "mcdonalds.se", + "mcdonaldsapps.com", + "mcdonaldsarabia.com", + "mcdonaldsparties.co.nz", + "mcfog.com", + "mcisco.com", + "mcls.ac.uk", + "mcpeaceofmind.com", + "mcreasite.com", + "mcrouter.net", + "mcrouter.org", + "mcstories.com", + "mcsw.ac.uk", + "mctimoney-college.ac.uk", + "md-t.org", + "mdbankpublic.com", + "mdhcdn.com", + "mdialog.com", + "mdn.dev", + "mdnkids.com", + "mdnplay.dev", + "mdnyalp.dev", + "mdpi.com", + "mdpj-mov.shop", + "mdpjoin.buzz", + "mdr-good.sbs", + "mdr100ya.lat", + "mdtt-tv.sbs", + "mdx.ac.uk", + "mdyy.de", + "me-gay.com", + "me.com", + "me.me", + "meadjohnson.com", + "meadjohnson.com.hk", + "meadjohnson.com.tw", + "meadjohnson.net", + "meansys.com", + "mearki.com", + "meb.gov.mm", + "meddyliwchamgymru.ac.uk", + "mede-innovation.ac.uk", + "medev.ac.uk", + "medhist.ac.uk", + "media-amazon.com", + "media-imdb.com", + "media.org.hk", + "mediachinese.com", + "mediafiles-cisco.com", + "mediafire.com", + "mediafreakcity.com", + "mediahub.ac.uk", + "median.ac.uk", + "mediasama.com", + "mediawiki.org", + "medicalimplants-cadcam.com", + "medicalnewstoday.com", + "medicine.ac.uk", + "medievalchester.ac.uk", + "medievalfrancophone.ac.uk", + "medievalswansea.ac.uk", + "medipathways.ac.uk", + "medium.com", + "medium.systems", + "medow.ru", + "medrxiv.org", + "medschools.ac.uk", + "medway.ac.uk", + "medwayacl.ac.uk", + "mee6.xyz", + "meendo.com", + "meet.new", + "meetandfuck.games", + "meetandfuckgames.com", + "meetav.com", + "meetfasttrack.com", + "meetsmartbook.com", + "meetup.com", + "meetyourdevices.com", + "mefeedia.com", + "meforum.org", + "mefound.com", + "mega.co.nz", + "mega.io", + "mega.nz", + "megacamz.com", + "megafilmporno.com", + "megalodon.jp", + "megamon.co.kr", + "megaphone.fm", + "megapornfreehd.com", + "megaporno.com.br", + "megapornpics.com", + "megaproxy.com", + "megarotic.com", + "megatitsminka.com", + "megavideo.com", + "meguk.ac.uk", + "megurineluka.com", + "meguso.com", + "meijinsen.jp", + "meilleurpornos.com", + "meirion-dwyfor.ac.uk", + "meirixiaochao.com", + "meitula.net", + "meizhong.blog", + "meizhong.report", + "melon.com", + "melon365.com", + "melonbooks.co.jp", + "melonstube.com", + "meltoday.com", + "meme111.com", + "memehk.com", + "memes.tw", + "memorybbs.com", + "memri.org", + "memrijttm.org", + "men.com", + "men18.net", + "menai.ac.uk", + "menatplay.com", + "mendel.ac.uk", + "mendeley.com", + "mengnan.shop", + "menhdv.com", + "mensheaven.jp", + "menshin-channel.com", + "meoriental.com", + "meplg.ac.uk", + "mepn.com", + "meraki-go.com", + "meraki.hk", + "merakigo.com", + "merc.ac.uk", + "mercari.com", + "mercari.jp", + "mercatox.com", + "mercdn.net", + "mercyprophet.org", + "mergersandinquisitions.org", + "meridian-trust.org", + "meridian.net", + "meripet.biz", + "meripet.com", + "merit-times.com.tw", + "merlin.ac.uk", + "merlinblog.xyz", + "merops.ac.uk", + "merristwood.ac.uk", + "merseyandwestlancslln.ac.uk", + "merthyr.ac.uk", + "merton-acl.ac.uk", + "merton-adult-education.ac.uk", + "merton.ac.uk", + "mertonadulteducation.ac.uk", + "meshmixer.com", + "meshmixerforum.com", + "meshrep.com", + "mesotw.com", + "messenger.com", + "messengerdevelopers.com", + "messytube.com", + "met-nude.com", + "meta.ai", + "meta.com", + "metabolomics.ac.uk", + "metabora.io", + "metacafe.com", + "metacloud.com", + "metacpan.org", + "metacubex.one", + "metadac.ac.uk", + "metafilter.com", + "metalpha.finance", + "metamind.io", + "metanoia.ac.uk", + "metaporn.com", + "metart.com", + "metarthunter.com", + "metartnetwork.com", + "metcaerdydd.ac.uk", + "metcams.com", + "meteorr.ac.uk", + "meteorshowersonline.com", + "metfilm.ac.uk", + "metfilmschool.ac.uk", + "methnet.ac.uk", + "methodsnetwork.ac.uk", + "methodsnorthwest.ac.uk", + "metro.co.uk", + "metro.taipei", + "metrohk.com.hk", + "metrolife.ca", + "metropolitana.tokyo", + "metroradio.com.hk", + "metrotoons.com", + "meu.ac.uk", + "meuhentai.com", + "mewe.com", + "mexc.com", + "mexcsensors.com", + "meyou.jp", + "meyul.com", + "mfeed.ad.jp", + "mfg-inspector.com", + "mfmf.club", + "mfo.ac.uk", + "mfxmedia.com", + "mgo-images.com", + "mgo.com", + "mgoon.com", + "mgsdtp.ac.uk", + "mgstage.com", + "mh4u.org", + "mhdss.ac.uk", + "mhhanman.xyz", + "mhie.ac.uk", + "mhqwe.xyz", + "mhradio.org", + "mhrn.ac.uk", + "mhs-relay.ac.uk", + "mhs.ac.uk", + "mhshosting.com", + "mi.com", + "mi9.com.au", + "mi9cdn.com", + "miamifintechfestival.com", + "miaomwu.com", + "miaopa.net", + "mib.ac.uk", + "mic.ac.uk", + "micb.gov.mm", + "michaelanti.com", + "michaelmarketl.com", + "mickey.tv", + "mickybells.com", + "microad.co.jp", + "microad.jp", + "microbit.org", + "microbusiness.ac.uk", + "microgravity.ac.uk", + "micron.ac.uk", + "micronanoflows.ac.uk", + "microsimulation.ac.uk", + "microsoft-falcon.io", + "microsoft-give.com", + "microsoft-int.com", + "microsoft-ppe.com", + "microsoft-sap-events.com", + "microsoft-sbs-domains.com", + "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.net", + "microsoft.pl", + "microsoft.pt", + "microsoft.red", + "microsoft.ro", + "microsoft.rs", + "microsoft.ru", + "microsoft.se", + "microsoft.si", + "microsoft.tv", + "microsoft.ua", + "microsoft.uz", + "microsoft.vn", + "microsoft365.com", + "microsoftaccountguard.com", + "microsoftadc.com", + "microsoftads.com", + "microsoftadvertising.com", + "microsoftadvertisingregionalawards.com", + "microsoftaffiliates.com", + "microsoftapp.net", + "microsoftazuresponsorships.com", + "microsoftcloud.com", + "microsoftcloudsummit.com", + "microsoftcloudworkshop.com", + "microsoftcommunitytraining.com", + "microsoftdiplomados.com", + "microsofteca.com", + "microsoftedge.com", + "microsoftgamestack.com", + "microsofthouse.com", + "microsofthouse.net", + "microsoftinternetsafety.net", + "microsoftiotcentral.com", + "microsoftiotinsiderlabs.com", + "microsoftlatamaitour.com", + "microsoftlatamholiday.com", + "microsoftlinc.com", + "microsoftmxfilantropia.com", + "microsoftnews.cc", + "microsoftnews.com", + "microsoftnews.net", + "microsoftnews.org", + "microsoftnewsforkids.com", + "microsoftnewsforkids.net", + "microsoftnewsforkids.org", + "microsoftnewskids.com", + "microsoftnewskids.net", + "microsoftnewskids.org", + "microsoftonline-p.com", + "microsoftonline.com", + "microsoftpartnercommunity.com", + "microsoftpartnersolutions.com", + "microsoftreactor.info", + "microsoftreactor.net", + "microsoftreactor.org", + "microsoftready.com", + "microsoftsilverlight.com", + "microsoftsilverlight.net", + "microsoftsilverlight.org", + "microsoftsiteselection.com", + "microsoftsqlserver.com", + "microsoftstart.com", + "microsoftstore.com", + "microsoftstore.com.hk", + "microsoftstream.com", + "microsoftteams.com", + "microsofttradein.com", + "microsofttranslator.com", + "microsoftuwp.com", + "microvpn.com", + "micstl.com", + "midatlanticbmwmotorcycles.com", + "midchesh.ac.uk", + "middle-way.net", + "middlesbro.ac.uk", + "middlesex.ac.uk", + "midentsolutions.com", + "midfife.ac.uk", + "midhurst.ac.uk", + "midkent.ac.uk", + "midlands3cities.ac.uk", + "midlands4cities.ac.uk", + "midlandsenergyconsortium.ac.uk", + "midlandsphysicsalliance.ac.uk", + "midoushe.com", + "midplus.ac.uk", + "midrib.ac.uk", + "miexnoviadesnuda.com", + "mihe.ac.uk", + "mihk.hk", + "mihomeone.info", + "mihr.com", + "mihua.org", + "miitomo.com", + "miiverse.com", + "mikanani.me", + "mikesoltys.com", + "mikocon.com", + "mikrotik.com", + "miktex.org", + "mikuexpo.com", + "milehighmedia.com", + "milfav.icu", + "milfbundle.com", + "milfed.com", + "milffox.com", + "milfhunter.com", + "milflove.live", + "milfmaturesex.net", + "milfmovs.com", + "milfnut.com", + "milfporn.pro", + "milfpornonly.com", + "milfpornpics.xxx", + "milfprime.com", + "milfs-gone-wild.com", + "milfs-now.com", + "milfsexstart.nl", + "milfslesbian.com", + "milfsover30.com", + "milfthreesomes.com", + "milftube.pro", + "milftugs.com", + "milfvr.com", + "milfzr.com", + "miliav.com", + "milkmanbook.com", + "millionplus.ac.uk", + "millymarks.com", + "milofetch.com", + "milph.net", + "milsurps.com", + "mimas.ac.uk", + "mimei.store", + "mimi-zhibo.com", + "mimi2022.link", + "mimi22.top", + "mimi222.top", + "mimiai.net", + "mimistudio.com", + "mimistyler.com", + "mimivip.com", + "mimivv.com", + "mimizy-go.buzz", + "minbrowser.org", + "mindgeek.com", + "mindmeld.com", + "mindrolling.org", + "minecraft.net", + "minecraft.wiki", + "minecraftservices.com", + "minecraftshop.com", + "mineofinfo.ac.uk", + "minerva.ac.uk", + "mingdemedia.org", + "minghui-a.org", + "minghui-b.org", + "minghui-school.org", + "minghui.or.kr", + "minghui.org", + "mingjinglishi.com", + "mingjingnews.com", + "mingjingtimes.com", + "mingky.org", + "mingkyaa.com", + "mingpao.com", + "mingpaocanada.com", + "mingpaomonthly.com", + "mingpaonews.com", + "mingpaony.com", + "mingpaosf.com", + "mingpaotor.com", + "mingpaovan.com", + "mings-fashion.com", + "mings.hk", + "mingshengbao.com", + "mingw.org", + "mingwatch.com", + "minhajcollege.ac.uk", + "minhhue.net", + "mini-abudhabi.com", + "mini-antilles.fr", + "mini-bahrain.com", + "mini-bosnia.com", + "mini-clubs-international.com", + "mini-connected.at", + "mini-connected.be", + "mini-connected.ch", + "mini-connected.co.uk", + "mini-connected.com", + "mini-connected.cz", + "mini-connected.de", + "mini-connected.dk", + "mini-connected.ee", + "mini-connected.es", + "mini-connected.fi", + "mini-connected.fr", + "mini-connected.ie", + "mini-connected.it", + "mini-connected.lt", + "mini-connected.lu", + "mini-connected.lv", + "mini-connected.nl", + "mini-connected.no", + "mini-connected.pl", + "mini-connected.pt", + "mini-connected.se", + "mini-corporate-sales.com", + "mini-coupe.ca", + "mini-dubai.com", + "mini-e.com", + "mini-egypt.com", + "mini-georgia.com", + "mini-grouparchiv.de", + "mini-grouparchive.com", + "mini-jordan.com", + "mini-ksa.com", + "mini-kuwait.com", + "mini-lebanon.com", + "mini-me.com", + "mini-oman.com", + "mini-qatar.com", + "mini-srilanka.com", + "mini-stjohns.ca", + "mini-stjohns.com", + "mini-tahiti.com", + "mini-vietnam.com", + "mini-windsor.ca", + "mini-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.ca", + "miniargentina.com", + "minibrossard.ca", + "minibrossard.com", + "minicanada.ca", + "minicaribbean.com", + "miniccrc.ca", + "minicooper.ca", + "minid.no", + "minidealer.com", + "minidealernet.com", + "minidowntown.ca", + "minidowntown.com", + "minidrivingexperienceusa.com", + "minidurham.ca", + "minidurham.com", + "minie.com", + "miniforum.org", + "minifs.com", + "minigeorgian.ca", + "minigrandriver.com", + "minihalifax.ca", + "minihalifax.com", + "minihk.com", + "miniinvasion.ca", + "miniitalianjob.com", + "minikelowna.ca", + "minikelowna.com", + "minilangley.ca", + "minilangley.com", + "minilat.com", + "minilaval.ca", + "minilaval.com", + "minilondon.ca", + "minilondon.co", + "minim.ac.uk", + "minimarkham.ca", + "minimarkham.com", + "minimoncton.ca", + "minimoncton.com", + "minimontrealcentre.ca", + "minimontroyal.ca", + "minimontroyal.com", + "minimotoringrewards.com", + "minimotoringschool.com", + "minimotorsport.com", + "mininanaimo.ca", + "mininanaimo.com", + "minioakville.com", + "miniofmonrovia.com", + "minipetfriendly.com", + "minirichmond.ca", + "minirichmond.com", + "minisaskatoon.ca", + "minisaskatoon.com", + "minisexdoll.com", + "minishop.ca", + "miniso-au.com", + "miniso-bh.com", + "miniso-np.com", + "miniso-nz.com", + "miniso.by", + "miniso.ca", + "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", + "minisoindia.com", + "minisojordan.com", + "minisokorea.com", + "minisolife.co.za", + "minisothailand.com", + "minisovietam.vn", + "minispace.com", + "minispecialoffers.ca", + "minispygear.com", + "ministcatharines.ca", + "ministeagathe.com", + "ministjohns.ca", + "ministrybooks.org", + "minitakesthestates.com", + "minitoronto.ca", + "minitroisrivieres.ca", + "miniusa.com", + "miniusaservice.com", + "miniusatires.com", + "minivalueservice.com", + "minivancouver.ca", + "minivaughanwest.ca", + "minivaughanwest.com", + "minivictoria.ca", + "minivictoria.com", + "minivilledequebec.ca", + "minivilledequebec.com", + "miniwholesaleconnect.com", + "miniwidget.ca", + "miniwindsor.com", + "miniworkshop.com", + "miniyaletown.ca", + "minnano-av.com", + "minneapolisbmw.com", + "minneapolisbmw.net", + "minstercentre.ac.uk", + "minuporno.com", + "minzhuhua.net", + "minzhuzhanxian.com", + "minzhuzhongguo.org", + "miohentai.com", + "miraheze.org", + "mirailab.tech", + "mirandanet.ac.uk", + "miroguide.com", + "mirror.ac.uk", + "mirror.xyz", + "mirrorbooks.com", + "mirrormedia.com.tw", + "mirrormedia.mg", + "mirrorsedge.com", + "mirrorsedge.jp", + "mirrorsedge.net", + "mirrorsedge2.com", + "mirrorsedge2d.com", + "misoc.ac.uk", + "missav.com", + "missav.uno", + "missendenabbey.ac.uk", + "misshotgirls.com", + "misskey-square.net", + "misskey.art", + "misskey.cloud", + "misskey.design", + "misskey.flowers", + "misskey.gg", + "misskey.io", + "misskey.stream", + "misskeyusercontent.jp", + "mist.ac.uk", + "mist.vip", + "mistresskym.com", + "mit.edu", + "mit.net", + "mitao.bar", + "mitao.com.tw", + "mitbbs.com", + "mitbbsau.com", + "mitnaka.com", + "mitpressjournals.org", + "mixasiansex.com", + "mixero.com", + "mixi.jp", + "mixmaturesex.com", + "mixpod.com", + "mixvintagesex.com", + "mixx.com", + "mizzmona.com", + "mjib.gov.tw", + "mjv-art.org", + "mk5000.com", + "mkcollege.ac.uk", + "mkncc.ac.uk", + "mksa.top", + "mkt.com", + "mktdns.com", + "mkto-c0100.com", + "mktorest.com", + "mktroute.com", + "mlab.ac.uk", + "mlcool.com", + "mluri.ac.uk", + "mlzs.work", + "mm-cg.com", + "mm9841.cc", + "mmaaxx.com", + "mmbbank.com.mm", + "mmdnn.com", + "mmf.ac.uk", + "mmftb.gov.mm", + "mmgy.cc", + "mminsurance.gov.mm", + "mmmanual.com", + "mmmca.com", + "mmmhub.ac.uk", + "mmonsterheadphones.net", + "mmscdh.one", + "mmtongdao.xyz", + "mmtourismbank.com", + "mmtv.life", + "mmu.ac.uk", + "mmubs.ac.uk", + "mmwxl27.top", + "mnc.ac.uk", + "mndregister.ac.uk", + "mnewstv.com", + "mobatek.net", + "mobile.de", + "mobile01.com", + "mobilecumbria.ac.uk", + "mobilefacebook.com", + "mobileinternational.com", + "mobilemarketo.com", + "mobileme.dk", + "mobileporngames.com", + "mobilepornmovies.com", + "mobileview.page", + "mobilevrxxx.com", + "mobileways.de", + "mobilitymoodplace.ac.uk", + "mobmyanmar.com", + "moby.to", + "mobypicture.com", + "mochajs.org", + "mocloudplus.com", + "mod.io", + "modelmediaus.com", + "modeloswebcambogota.com", + "modelsfreecams.com", + "modelsofauthority.ac.uk", + "modeltv.com", + "modernchinastudies.org", + "modip.ac.uk", + "modmedmicro.ac.uk", + "modoo.at", + "modperl.pl", + "modrinth.com", + "modular.im", + "moeaic.gov.tw", + "moeero-library.com", + "moeerolibrary.com", + "moefuns.co", + "moegirl.org", + "moeimg.net", + "moez-m.com", + "mofa.gov.tw", + "mofaxiehui.com", + "mofos.com", + "mofosex.com", + "mofosnetwork.com", + "mog.com", + "mohu.club", + "mohu.ml", + "mohu.rocks", + "moidigital.ac.uk", + "mojang.com", + "mojim.com", + "mol.ac.uk", + "mol.gov.tw", + "mol.im", + "moldflow.com", + "moldflowexpress.com", + "mole.ac.uk", + "moleculardesigntoolkit.com", + "molecularsimulationtools.com", + "molecularviewer.com", + "molesports.com", + "molihua.org", + "mollnet.ac.uk", + "molviewer.com", + "mom-gfs.com", + "mom-sex-videos.com", + "mom50.com", + "momentumms.com", + "momesear-chs.buzz", + "momfucktube.com", + "momhomeporn.com", + "mommystoytime.com", + "momo.dm", + "momo5188.com", + "momomall.com.tw", + "momon-ga.com", + "momoniji.com", + "momoshop.com.tw", + "momotk.com", + "moms-sex-videos.com", + "momsbangteens.com", + "momsboysmovies.net", + "momsexypics.com", + "momsfuckingboys.net", + "momsgiveass.com", + "momshardcoreporn.com", + "momsneversayno.com", + "momsporn.su", + "momspornvideos.com", + "momsteachsex.com", + "momsteachsex.info", + "momsyoungboys.net", + "momtarts3d.com", + "momtube.club", + "monaitv.me", + "monar.ch", + "monash.ac.uk", + "monbeats2013.com", + "mondex.org", + "money-link.com.tw", + "moneyhome.biz", + "moneywithfacebook.com", + "mongodb.com", + "mongodb.org", + "monica.im", + "monitorchina.org", + "monitorware.com", + "monitrix.net", + "monkwear.ac.uk", + "monlamit.org", + "mono-project.com", + "monocloud.me", + "monogram.ac.uk", + "monotype.com", + "monotypeimaging.com", + "monster-beats-by-dr-dre.com", + "monster-beats-headphones.com", + "monster.com", + "monsterbeats-cheap.com", + "monsterbeats-headphone.com", + "monsterbeats-onsale.com", + "monsterbeats-solo.com", + "monsterbeats-solo.net", + "monsterbeats365buy.com", + "monsterbeats8beatsbydre.com", + "monsterbeatsale.com", + "monsterbeatsalestore.com", + "monsterbeatsau.com", + "monsterbeatsbydrdre-nz.com", + "monsterbeatsbydrdre-usa.com", + "monsterbeatsbydrdrecanada.com", + "monsterbeatsbydrdrestudio.com", + "monsterbeatsbydre-nz.com", + "monsterbeatsbydre-usa.com", + "monsterbeatsbydre2015.com", + "monsterbeatsbydreaustraliacheap.com", + "monsterbeatsbydrebilligde.com", + "monsterbeatsbydrefactory.com", + "monsterbeatsbydrenew.com", + "monsterbeatsbydres.com", + "monsterbeatsbydreshop.com", + "monsterbeatscasques.com", + "monsterbeatscommunity.com", + "monsterbeatsdrdrecheap.com", + "monsterbeatsfactory.net", + "monsterbeatsfinland.com", + "monsterbeatsforsale.com", + "monsterbeatsheadphone.com", + "monsterbeatsheadphones.net", + "monsterbeatshere.com", + "monsterbeatsitaly.com", + "monsterbeatsmall.com", + "monsterbeatsnegozi.net", + "monsterbeatsok.com", + "monsterbeatsonlinestoreuk.com", + "monsterbeatsoutlet.us", + "monsterbeatspascher.net", + "monsterbeatsru.com", + "monsterbeatssales.com", + "monsterbeatssalg.com", + "monsterbeatsshops.net", + "monsterbeatsstore.com", + "monsterbeatssydneyaustralia.com", + "monsterbeatstang.com", + "monsterbeatstienda.com", + "monsterbeatstudio.com", + "monsterbydrebeat.com", + "monstercasquebeatspascher.net", + "monstercheapbeatss.com", + "monstercockland.com", + "monsterdrebeats-canada.net", + "monsterdrebeats-usa.com", + "monsterdrebeats-usa.net", + "monsterheadphone.net", + "monsterproduct.net", + "monstersbeatbydres.com", + "monstersdebea.com", + "monstersexporn.net", + "monstershopcheapbeats.net", + "monthlyav.com", + "moodleshare-hw.ac.uk", + "moodstocks.com", + "moodyz.com", + "moomoo.com", + "moon.fm", + "moonbbs.com", + "moonbbs.info", + "moonbingo.com", + "mooo.com", + "moorlands.ac.uk", + "moov.hk", + "moozporn.com", + "moptt.tw", + "moray.ac.uk", + "morazzia.com", + "morbell.com", + "moredun.ac.uk", + "moreheadphones.com", + "moresci.sale", + "morewithautodesk.com", + "morganclaypool.com", + "morgannwg.ac.uk", + "morisawa.co.jp", + "morley.ac.uk", + "morleycollege.ac.uk", + "morleycollegelondon.ac.uk", + "morningsun.org", + "mornporn.com", + "moroneta.com", + "morphcharts.com", + "mortein.co.in", + "mortein.co.nz", + "mortein.co.za", + "mortein.com", + "mortein.com.au", + "mortein.com.br", + "mortein.com.ng", + "mortein.com.pk", + "morteincam.com", + "mos.ru", + "mostly.jp", + "mostpopularpornsites.com", + "mosucloud.site", + "motherless.com", + "motherwell.ac.uk", + "motiongraphicsandmore.com", + "motionpictureser.com", + "motiyun.com", + "motolia.com", + "motor4ik.ru", + "motorshowblog.com", + "mottainai.info", + "moulton.ac.uk", + "mountcollyer.ac.uk", + "mousebreaker.com", + "move-free.net", + "move.ac.uk", + "move.com", + "moveaws.com", + "movefreeoffers.com", + "movefreerewards.com", + "movefrees.com", + "movements.org", + "movenetworks.com", + "moveonmoveup.ac.uk", + "movetv.com", + "movidius.com", + "movidius.net", + "movie-erog.com", + "movie1000.xyz", + "moviefap.com", + "moviepost.com", + "moviesanywhere.com", + "moviesarena.com", + "moviesfree4u.xyz", + "moviesneek.com", + "movinghistory.ac.uk", + "movingmedicine.ac.uk", + "mox.moe", + "moxing.mobi", + "moxing.news", + "moystoys.com", + "mozgcp.net", + "mozilla.com", + "mozilla.community", + "mozilla.net", + "mozilla.org", + "mozillademos.org", + "mozit.cloud", + "moztw.org", + "mp-pxcdn.com", + "mp3buscador.com", + "mp3ye.eu", + "mpa-mpp.ac.uk", + "mpa-uk.ac.uk", + "mpags.ac.uk", + "mpese.ac.uk", + "mpettis.com", + "mpfinance.com", + "mpinews.com", + "mplstudios.com", + "mpnevolution.com", + "mponline.hk", + "mpsi.ac.uk", + "mpv.io", + "mpw.ac.uk", + "mpweekly.com", + "mql5.com", + "mqxd.org", + "mr-apple.com.tw", + "mr-tireman.jp", + "mray.club", + "mrbasic.com", + "mrbdsm.com", + "mrbonus.com", + "mrc.ac.uk", + "mrchewsasianbeaver.com", + "mrcieu.ac.uk", + "mrcollege.ac.uk", + "mrcong.com", + "mrcp.ac.uk", + "mrdeepfakes.com", + "mrface.com", + "mri.ac.uk", + "mrlivecam.com", + "mrloli.com", + "mrpinks.com", + "mrporngeek.com", + "mrpornlive.com", + "mrskin.com", + "mrslove.com", + "mrssiren.com", + "mrtweet.com", + "mrvideosdesexo.xxx", + "ms-studiosmedia.com", + "ms365surfaceoffer.com", + "ms4dre.com", + "msa-it.org", + "msa.ac.uk", + "msads.net", + "msauth.net", + "mscassessment.ac.uk", + "mschallenge2018.com", + "mscos.ac.uk", + "msdn.com", + "msec.ac.uk", + "msecnd.net", + "msedge.net", + "msft.info", + "msft.net", + "msftauth.net", + "msfteducation.ca", + "msftnet.org", + "msgamesresearch.com", + "msguancha.com", + "msha.gov", + "msinnovationchallenge.com", + "msn.com", + "msn.com.tw", + "msn.net", + "msnbc.com", + "msnewskids.com", + "msnewskids.net", + "msnewskids.org", + "msnkids.com", + "msocdn.com", + "msocsp.com", + "msoopent.com", + "msp.ac.uk", + "mspairlift.com", + "msportknowledge.ac.uk", + "msropendata.com", + "mssn.ac.uk", + "mstdn.social", + "msturing.org", + "msudalosti.com", + "msunlimitedcloudsummit.com", + "mswe1.org", + "mt.lv", + "mt0011.site", + "mtao.fun", + "mtec.ac.uk", + "mthruf.com", + "mti.ac.uk", + "mtt.org", + "mtvnservices.com", + "mtw.tl", + "mtzfile.pw", + "muarc.ac.uk", + "mubi.com", + "muchohentai.com", + "muchomasporno.com", + "muchosucko.com", + "mucinex.ca", + "mucinex.cn", + "mucinex.co.nz", + "mucinex.com", + "mucinex.com.cn", + "mucinex.net", + "mucinex.tv", + "mucinexprofessional.com", + "mucm.ac.uk", + "mudbox3d.com", + "mudfish.net", + "mudvod.tv", + "muji.com", + "muji.com.hk", + "muji.eu", + "muji.net", + "muji.tw", + "muji.us", + "mujikorea.net", + "mulheresafoder.com", + "mullvad.net", + "mult34.com", + "multicurrencycashpassport.com", + "multiply.com", + "multiplydiversity.com", + "multiproxy.org", + "multiupload.com", + "multporn.net", + "mummysgold.com", + "muncloud.dog", + "mundomais.com.br", + "mundus.ac.uk", + "muramura.tv", + "murg.ac.uk", + "murmur.tw", + "muryouav.net", + "muscdn.com", + "musclegirlflix.com", + "museumofwriting.ac.uk", + "museumwales.ac.uk", + "mushroomtrack.com", + "mushymush.tv", + "music-research.ac.uk", + "musicade.net", + "musical.ly", + "musicandphilosophy.ac.uk", + "musicbay.net", + "musiche.ac.uk", + "musickit.net", + "musiconline.ac.uk", + "musixmatch.com", + "muslimcollege.ac.uk", + "muslimvideo.com", + "mut.ch", + "muthead.com", + "muther.ac.uk", + "muycerdas.xxx", + "muyzorras.com", + "muzi.com", + "muzi.net", + "muzu.tv", + "mvdis.gov.tw", + "mvg.jp", + "mvideoporno.xxx", + "mvk.com", + "mwcu00.com", + "mwdbank.com", + "mwell.ac.uk", + "mwhentai.net", + "mwrc.ac.uk", + "mx981.com", + "mxmcdn.net", + "mxshm.site", + "my-enema.com", + "my-formosa.com", + "my-magazine.me", + "my-private-network.co.uk", + "my-proxy.com", + "my03.com", + "my13la.com", + "my1stflame.com", + "my20dc.com", + "my20houston.com", + "my29tv.com", + "my3dhentai.com", + "my45.com", + "my903.com", + "my9nj.com", + "myaccountglobalcash.com", + "myactimes.com", + "myamateurgirls.net", + "myamateurtv.com", + "myanniu.com", + "myappleid.com", + "myatos.net", + "myaudiocast.com", + "myautocad.com", + "myautodeskbenefits.com", + "myav.com.tw", + "myav886.buzz", + "myavfun.com", + "myavok.com", + "myavsuper.com", + "myavxx.xyz", + "mybabehotz.com", + "mybbs.us", + "mybeatsbydrestudio.com", + "mybeatsbydreuk.com", + "mybeatscheapbydre.com", + "mybestbuy.com", + "mybestbuyclaims.com", + "mybet.com", + "mybmw.ca", + "mybmw.com", + "myboylove.com", + "mybridgestoneeducation.com", + "mybukkakeporn.com", + "myca168.com", + "mycalderdale.ac.uk", + "mycams.com", + "mycanadanow.com", + "mycandi.ac.uk", + "mycardbenefits.com", + "mycartoonsexgames.com", + "mycdn.me", + "mychat.to", + "mychinamyhome.com", + "mychinanet.com", + "mychinanews.com", + "mychinese.news", + "mycib.ac.uk", + "myciscobenefits.com", + "myclitgames.com", + "myclyde.ac.uk", + "mycnnews.com", + "mycomicsxxx.com", + "myconstructionworld.net", + "mycould.com", + "mydad.info", + "mydati.com", + "myddns.com", + "mydirectgroove.com", + "mydirectvchannels.com", + "mydirtyhobby.com", + "myeasytv.com", + "myebay.com", + "myeclipseide.com", + "myeplg.ac.uk", + "myerscough.ac.uk", + "myfappening.org", + "myfavoritearcade.com", + "myfbfans.com", + "myferrariheadphones.com", + "myfirstflame.com", + "myfistingporn.com", + "myfonts.com", + "myfonts.net", + "myforum.com.hk", + "myfoxatlanta.com", + "myfoxaustin.com", + "myfoxboston.com", + "myfoxcharlotte.com", + "myfoxchicago.com", + "myfoxdc.com", + "myfoxdetroit.com", + "myfoxdfw.com", + "myfoxhouston.com", + "myfoxhurricane.com", + "myfoxla.com", + "myfoxlosangeles.com", + "myfoxlubbock.com", + "myfoxmaine.com", + "myfoxny.com", + "myfoxorlando.com", + "myfoxphilly.com", + "myfoxphoenix.com", + "myfoxsanfran.com", + "myfoxtampa.com", + "myfoxtampabay.com", + "myfoxtwincities.com", + "myfoxzone.com", + "myfreeblack.com", + "myfreecams.com", + "myfreepaysite.com", + "myfreeporngames.com", + "myfreshnet.com", + "myftp.info", + "myftp.name", + "myfun.com", + "mygaysites.com", + "myguide.hk", + "myhelpinglab.com", + "myhentaicomics.com", + "myhentaigallery.com", + "myhomemadesex.com", + "myhpsupport.com", + "myhulu.com", + "myicloud.net", + "myip.com", + "myiphide.com", + "myiphider.com", + "myipod.net", + "myjkwd.com", + "mykomica.org", + "mylabnotebook.ac.uk", + "mylcb.ac.uk", + "mylcloud.net", + "mylf.com", + "mylftv.com", + "mylittlenieces.com", + "mylogiclab.com", + "mylust.com", + "mymaji.com", + "mymapportal.com", + "mymasturbators.com", + "mymediarom.com", + "mymicrosoft.com", + "myminisexdoll.com", + "myminiso.com", + "mymmode.com", + "mymoe.moe", + "mymom.info", + "mymusclevideo.com", + "mymusic.net.tw", + "mynescol.ac.uk", + "mynetav.net", + "mynetav.org", + "mynetname.net", + "mynike.com", + "mynumber.org", + "myoctocat.com", + "myparagliding.com", + "mypearson.com", + "mypearsonenglish.ch", + "mypearsonshop.com.mx", + "mypearsonshop.mx", + "mypicasa.com", + "mypicture.info", + "mypikpak.com", + "mypikpak.net", + "myplace.ac.uk", + "mypop3.net", + "mypop3.org", + "mypopescu.com", + "mypornads.com", + "mypornadviser.com", + "mypornbookmarks.com", + "mypornfox.com", + "myporngay.com", + "mypornhere.com", + "myporno.cz", + "myporno.photos", + "mypornolab.click", + "mypornstarbook.net", + "mypornvid.fun", + "mypornwap.fun", + "myport.ac.uk", + "myq2.com", + "myqnapcloud.com", + "myradio.com.hk", + "myradio.hk", + "myreadingmanga.info", + "myrewardzone.com", + "myrimmingporn.com", + "myrz.com", + "myscience.ac.uk", + "mysdn.com", + "mysdn.info", + "mysdn.net", + "mysecondarydns.com", + "mysexgames.com", + "mysexygfs.com", + "myshopify.com", + "mysims.com", + "mysimsracing.com", + "mysinablog.com", + "mysinchew.com", + "mysocialworklab.com", + "myspace.com", + "myspacecdn.com", + "mysql.com", + "mystrikingly.com", + "mytalkbox.com", + "myteenwebcam.com", + "mythicentertainment.com", + "mythicentertainment.net", + "mythicgames.com", + "mytimesplus.co.uk", + "mytizi.com", + "mytokenapi.com", + "mytrannycams.com", + "mytvsuper.com", + "myvisaluxuryhotels.com", + "myvodafone.com.au", + "myvodafone.com.ws", + "mywaytopay.info", + "mywaytopay.net", + "mywife.cc", + "mywifecuckold.com", + "mywnsc.ac.uk", + "mywww.biz", + "myxvids.com", + "myxxgirl.com", + "myyoungmomisnude.com", + "myyoungwifeisnude.com", + "myz.info", + "mzed.com", + "mzstatic.com", + "n0vadesktop.com", + "n3ro.lol", + "n3ro.net", + "n3ro.wtf", + "n8agrifood.ac.uk", + "na-att-idns.net", + "na-me.ac.uk", + "naacoalition.org", + "naaktevrouwenporno.com", + "nab.com.au", + "nabble.com", + "nabtravellercard.com.au", + "nacro.ac.uk", + "nacstock.ac.uk", + "nactem.ac.uk", + "nado.ac.uk", + "naea.ac.uk", + "nafc.ac.uk", + "nagty.ac.uk", + "nahste.ac.uk", + "naiadsystems.com", + "naihenda.shop", + "naihendauou.lol", + "naijauncut.com", + "nailedhard.com", + "naitik.net", + "naizitv.top", + "nakadashi.to", + "naked-asian-porn.com", + "naked-girls.me", + "naked.com", + "nakedamateurmilf.com", + "nakedasiansex.com", + "nakedgirlpic.com", + "nakedgirls.biz", + "nakedmodelsxxx.com", + "nakednews.com", + "nakido.com", + "nakn.jp", + "nakuz.com", + "nalandabodhi.org", + "nalandawest.org", + "naln.ac.uk", + "nam.ac.uk", + "namemybeats.com", + "namethatporn.com", + "namethatpornad.com", + "namgyal.org", + "namgyalmonastery.org", + "namsisi.com", + "namss.ac.uk", + "nan-net.com", + "nanhuyt.com", + "nanocmos.ac.uk", + "nanyang.com", + "nanyangpost.com", + "nanzao.com", + "nao.ac.jp", + "naoconto.com", + "naol.ca", + "naol.cc", + "napier-cloud.ac.uk", + "napier.ac.uk", + "napiszex.com", + "narf.ac.uk", + "narod.ru", + "narti.ac.uk", + "nasa.gov", + "nash.ac.uk", + "nastranincad.com", + "nastrannx.com", + "nastrantraining.com", + "nastranworldwide.com", + "nasty.singles", + "nastyvids.com", + "nat.gov.tw", + "nat.moe", + "nat.ms", + "natado.com", + "nataliefiore.com", + "natcen.ac.uk", + "natcor.ac.uk", + "natdisteam.ac.uk", + "natgeokidsbooks.co.uk", + "natgeomaps.com", + "national-army-museum.ac.uk", + "national-confidential-inquiry.ac.uk", + "national-learning-network.ac.uk", + "national-lottery.co.uk", + "nationalacademiclibraries.ac.uk", + "nationalandacademiclibraries.ac.uk", + "nationalawakening.org", + "nationalcollegeforadvancedtransportinfrastructure.ac.uk", + "nationalcollegeforhighspeedrail.ac.uk", + "nationalcollegefornuclear.ac.uk", + "nationalgeographic.com", + "nationalgeographicpartners.com", + "nationalinterest.org", + "nationalnetworkforinterpreting.ac.uk", + "nationalnetworkfortranslation.ac.uk", + "nationalreview.com", + "nationalskillsacademy.ac.uk", + "nationaltechnicianscentre.ac.uk", + "nationsonline.org", + "nationwide.com", + "nativeincolour.com.au", + "natmatsci.ac.uk", + "natsal.ac.uk", + "natstar.ac.uk", + "naturalhistorymuseum.ac.uk", + "naturalvoices.com", + "nature.ac.uk", + "nature.com", + "naturemag.org", + "naughty.com", + "naughtyamerica.com", + "naughtyblog.org", + "naughtyfootjobs.com", + "naughtygamesource.com", + "naughtyhentai.biz", + "naughtymachinima.com", + "naughtymag.com", + "naughtysophie.com", + "naughtytugs.com", + "naughtywomenpics.com", + "naver.com", + "naver.jp", + "naver.me", + "naver.net", + "naverads.com", + "navercloudcorp.com", + "navercorp.com", + "naverfincorp.com", + "naverlabs.com", + "naverncp.com", + "navisworks.com", + "navisworks.net", + "navy.mil", + "naweeklytimes.com", + "nazarene.ac.uk", + "nbabot.net", + "nbc.co", + "nbc.com", + "nbcnews.com", + "nbcol.ac.uk", + "nbcolympics.com", + "nbcsports.com", + "nbcudigitaladops.com", + "nbcuni.com", + "nbcuniversal.com", + "nbdh15.buzz", + "nbe.ac.uk", + "nbi.ac.uk", + "nbolton-sfc.ac.uk", + "nbpa.ac.uk", + "nbria.ac.uk", + "nbs.ac.uk", + "nbtvpn.com", + "nbu.ac.uk", + "nbys.tv", + "nbys1.tv", + "nbyy.tv", + "nc3rs.ac.uk", + "nc4m.ac.uk", + "nca.ac.uk", + "ncas.ac.uk", + "ncati.ac.uk", + "ncaveo.ac.uk", + "ncb.ac.uk", + "ncbradford.ac.uk", + "ncc.ac.uk", + "nccadultlearning.ac.uk", + "nccc.ac.uk", + "ncccs.ac.uk", + "ncclondon.ac.uk", + "nccwatch.org.tw", + "ncdoncaster.ac.uk", + "nceo.ac.uk", + "ncess.ac.uk", + "ncfn.ac.uk", + "ncg.ac.uk", + "ncgc.ac.uk", + "ncgrp.ac.uk", + "nch.com.tw", + "nchlondon.ac.uk", + "nchp.ac.uk", + "nchrd.org", + "nchsr.ac.uk", + "nciul.ac.uk", + "ncl-coll.ac.uk", + "ncl-lyme.ac.uk", + "ncl-u-lyme.ac.uk", + "ncl.ac.uk", + "ncl.edu.tw", + "nclan.ac.uk", + "nclanarkshire.ac.uk", + "ncloud.com", + "ncls.ac.uk", + "nclt.ac.uk", + "ncn.ac.uk", + "ncn.org", + "ncol.com", + "ncpontefract.ac.uk", + "ncrcl.ac.uk", + "ncrm.ac.uk", + "ncs.ac.uk", + "ncse.ac.uk", + "nct.ac.uk", + "ncti.ac.uk", + "ncuk.ac.uk", + "nda.ac.uk", + "ndai.ac.uk", + "nde.de", + "ndff.ac.uk", + "ndi.org", + "ndonline.ac.uk", + "ndr.de", + "ndtc.ac.uk", + "ndtv.com", + "ne-worcs.ac.uk", + "ne-worcscol.ac.uk", + "neab.ac.uk", + "neaco.ac.uk", + "near.by", + "neath.ac.uk", + "nebay.net", + "neborder.com", + "nebula-emby.com", + "nec-arundel.ac.uk", + "nec.ac.uk", + "necah.ac.uk", + "nectar.ac.uk", + "ned.org", + "nedial.ac.uk", + "nedtc.ac.uk", + "nee4you.com", + "needforspeed.com", + "needforspeedboost.com", + "needforspeeddriftkings.com", + "needforspeedeliminator.com", + "needforspeedlightning.com", + "needforspeedoverdrive.com", + "needforspeedproven.com", + "needforspeedredline.com", + "needforspeedshowdown.com", + "needforspeedstreetkings.com", + "needforspeedtakedown.com", + "needforspeedtherun.com", + "needforspeedtimeattack.com", + "needforspeedundergroundeast.com", + "needgayporn.com", + "nefficient.co.kr", + "negozimonsterbeats.com", + "negoziomonsterbeats.com", + "nei.ac.uk", + "neicad.com", + "neiexplicit.com", + "neifea.com", + "neimotion.com", + "neinastranincad.com", + "neipdg.ac.uk", + "neisoftware.com", + "neisolutions.com", + "neiworks.com", + "nejm.org", + "nek.ac.uk", + "nekoslovakia.net", + "nekoxxx.com", + "nelcls.ac.uk", + "nelson.ac.uk", + "nelsoncollege.ac.uk", + "nelsongroup.ac.uk", + "nemcon.ac.uk", + "nemode.ac.uk", + "nenastran.com", + "nene.ac.uk", + "nengcard.com", + "nenitas.club", + "nentindo.net", + "neo-miracle.com", + "neodaas.ac.uk", + "neonatalsociety.ac.uk", + "neow.in", + "neowin.net", + "nepusoku.com", + "nerap.ac.uk", + "nerc-arsf.ac.uk", + "nerc-bangor.ac.uk", + "nerc-bas.ac.uk", + "nerc-belfast.ac.uk", + "nerc-bush.ac.uk", + "nerc-cardiff.ac.uk", + "nerc-cdt-oil-and-gas.ac.uk", + "nerc-dorset.ac.uk", + "nerc-east-kilbride.ac.uk", + "nerc-eskdalemuir.ac.uk", + "nerc-essc.ac.uk", + "nerc-gilmerton.ac.uk", + "nerc-hartland.ac.uk", + "nerc-keyworth.ac.uk", + "nerc-lancaster.ac.uk", + "nerc-lerwick.ac.uk", + "nerc-liv.ac.uk", + "nerc-loanhead.ac.uk", + "nerc-mst-radar.ac.uk", + "nerc-murchison.ac.uk", + "nerc-oban.ac.uk", + "nerc-oxford.ac.uk", + "nerc-pml.ac.uk", + "nerc-smru.ac.uk", + "nerc-solardome.ac.uk", + "nerc-southampton.ac.uk", + "nerc-swindon.ac.uk", + "nerc-wallingford.ac.uk", + "nerc-wytham.ac.uk", + "nerc.ac.uk", + "nercgw4plus.ac.uk", + "nerdnudes.com", + "neresc.ac.uk", + "nervanasys.com", + "nesaporn.com", + "nesaporn.mobi", + "nesc.ac.uk", + "nesci.ac.uk", + "nescol.ac.uk", + "nescot.ac.uk", + "nesi.ac.uk", + "nesli.ac.uk", + "nesli2.ac.uk", + "nesnode.com", + "nest.ac.uk", + "nest.com", + "net-fits.pro", + "netacad.com", + "netacad.net", + "netalert.me", + "netarabic.com", + "netbig.com", + "netbirds.com", + "netcolony.com", + "netcup-news.de", + "netcup-sonderangebote.de", + "netcup.com", + "netcup.de", + "netcup.eu", + "netcup.net", + "netfapx.com", + "netfirms.com", + "netflav.com", + "netflav1.com", + "netflav5.com", + "netflix.ca", + "netflix.com", + "netflix.net", + "netflixdnstest0.com", + "netflixdnstest1.com", + "netflixdnstest10.com", + "netflixdnstest2.com", + "netflixdnstest3.com", + "netflixdnstest4.com", + "netflixdnstest5.com", + "netflixdnstest6.com", + "netflixdnstest7.com", + "netflixdnstest8.com", + "netflixdnstest9.com", + "netflixinvestor.com", + "netflixtechblog.com", + "netlab.ac.uk", + "netlify.app", + "netlify.com", + "netlifystatus.com", + "netlock.hu", + "netme.cc", + "netname.com.br", + "netpornsex.com", + "netpornsex.net", + "netsarang.com", + "netscc.ac.uk", + "netskills.ac.uk", + "netsneak.com", + "netsolssl.com", + "netsurf-browser.org", + "nettyinternet.com", + "netvideogirls.com", + "netvigator.com", + "netwise.ac.uk", + "network54.com", + "networkedblogs.com", + "networktunnel.net", + "netzerobuildings.com", + "netzerobuildingstudio.com", + "netzwerkdeutsch.ac.uk", + "neuerporno.com", + "neupc.ac.uk", + "neuralink.com", + "neurogrid.ac.uk", + "neurohub.ac.uk", + "neurology.org", + "neverforget8964.org", + "nevex.com", + "new-3lunch.net", + "new-akiba.com", + "new-campus-basildon.ac.uk", + "new-coll-cf.ac.uk", + "new-jero.net", + "new-redtube.com", + "new.day", + "new2fea.com", + "new3dcomics.com", + "new96.ca", + "newark.ac.uk", + "newbasildon.ac.uk", + "newbattleabbeycollege.ac.uk", + "newbeatsblackfriday.com", + "newbemany.com", + "newbienudes.com", + "newbold.ac.uk", + "newbrazz.com", + "newbury-college.ac.uk", + "newcampusbasildon.ac.uk", + "newcampusglasgow.ac.uk", + "newcastle-college.ac.uk", + "newcastle.ac.uk", + "newcastlecitylearning.ac.uk", + "newcastlecollege.ac.uk", + "newcastlenewslocal.com.au", + "newcastlesfc.ac.uk", + "newcastlesixthformcollege.ac.uk", + "newcenturymc.com", + "newcenturynews.com", + "newceys.ac.uk", + "newchen.com", + "newcollege.ac.uk", + "newcollegedurham.ac.uk", + "newcollegeglasgow.ac.uk", + "newcollegetelford.ac.uk", + "newcollpont.ac.uk", + "newdirectionsreading.ac.uk", + "newdrediscount.com", + "newdur.ac.uk", + "neweconomyforum.com", + "newenergyfinance.com", + "newestbeatsbydre.com", + "newgrounds.com", + "newham-vic.ac.uk", + "newham.ac.uk", + "newhamcfe.ac.uk", + "newhampshirebmw.com", + "newhentai.org", + "newhighlandvision.com", + "newi.ac.uk", + "newipnow.com", + "newisiknowledge.com", + "newlandmagazine.com.au", + "newlineporn.com", + "newlysprung.net", + "newman.ac.uk", + "newmitbbs.com", + "newmonst1erbeatsto1re.com", + "newmonsterbeatsheadphones.com", + "newnews.ca", + "newphd.ac.uk", + "newport.ac.uk", + "newpppp.com", + "newroutephd.ac.uk", + "news.co.uk", + "news.com.au", + "news.net.au", + "news100.com.tw", + "news18.com", + "newsadds.com.au", + "newsamerica.com", + "newsancai.com", + "newsapi.com.au", + "newscareers.co.uk", + "newscdn.com.au", + "newschinacomment.org", + "newschristmasshopping.com", + "newscn.org", + "newscommercial.co.uk", + "newsconcierge.com.au", + "newscorp.com", + "newscorpaustralia.com", + "newsdetox.ca", + "newsdh.com", + "newsensations.com", + "newsextv.com", + "newsexwap.com", + "newsexxxx.com", + "newsfeed.com", + "newsfilm.ac.uk", + "newsgawakaru.com", + "newslicensing.co.uk", + "newsmagazine.asia", + "newsmart.jp", + "newsmax.com", + "newsmax.in", + "newsmaxtv.com", + "newsnowfox.com", + "newspeak.cc", + "newsprestigenetwork.com.au", + "newsprinters.co.uk", + "newssyndication.com", + "newstamago.com", + "newstapa.org", + "newstarnet.com", + "newstatesman.com", + "newsukadops.com", + "newsupermariobrosu.com", + "newsweek.com", + "newsxtend.com.au", + "newtaiwan.com.tw", + "newtalk.tw", + "newtec.ac.uk", + "newtofea.com", + "newton.ac.uk", + "newton.com", + "newtonfund.ac.uk", + "newtonrigg.ac.uk", + "newvic.ac.uk", + "newxxx24.cc", + "newyorker.com", + "newyorktimes.com", + "nexcat.com", + "nexitally.com", + "nexitallysafe.com", + "nexitcore.com", + "nexon.co.jp", + "nexon.com", + "nexon.io", + "nexoncdn.co.kr", + "nexpart.com", + "nexpart.tv", + "next-institute.ac.uk", + "next.com", + "next.hk", + "next11.co.jp", + "nextapple.com", + "nextapple.tw", + "nextdigital.com.hk", + "nextdigital.com.tw", + "nextechafrica.net", + "nextfilm.com.hk", + "nextgenerationcam.com", + "nextgenerationcenter.com", + "nextjs.org", + "nextmag.com.tw", + "nextmedia.com", + "nextmedia.com.tw", + "nextmgz.com", + "nexton-net.jp", + "nextplus.com.hk", + "nextstepssw.ac.uk", + "nextstop.com", + "nexttv.com.tw", + "nextwork.com.hk", + "nextwork.com.tw", + "nextwork.hk", + "nextwork.tw", + "nexusmods.com", + "nf.id.au", + "nfacstem.ac.uk", + "nfer.ac.uk", + "nfjtyd.com", + "nflhotsalejerseys.com", + "nflxext.com", + "nflximg.com", + "nflximg.net", + "nflxsearch.net", + "nflxso.net", + "nflxvideo.net", + "nfo.ac.uk", + "nfsc.global", + "nfscdict.com", + "nfscofficial.com", + "nfsworld.com", + "nftstorage.link", + "ng.mil", + "nga.mil", + "ngc.ac.uk", + "ngensis.com", + "ngeo.com", + "ngfl.ac.uk", + "ngflscotland.ac.uk", + "nginx.com", + "nginx.org", + "nginxconfig.io", + "ngodupdongchung.com", + "ngs.ac.uk", + "ngwnet.ac.uk", + "nhc.ac.uk", + "nhcscotland.ac.uk", + "nhentai.com", + "nhentai.io", + "nhentai.net", + "nhentai.to", + "nhentai.xxx", + "nhentaihaven.com", + "nhentaihaven.org", + "nheos.com", + "nhi.gov.tw", + "nhk-ondemand.jp", + "nhm.ac.uk", + "nhncorp.jp", + "niab.ac.uk", + "niace.ac.uk", + "nib.ac.uk", + "nibs.ac.uk", + "nibsc.ac.uk", + "nic.cz", + "nic.google", + "nic.gov", + "nicats.ac.uk", + "nicd.ac.uk", + "niceanimegames.com", + "niceporn.tv", + "nicer.ac.uk", + "nicesshop.net", + "nichepornsite.com", + "nichepornsites.com", + "nicis.ac.uk", + "nickscipio.com", + "nicky.xxx", + "nicodic.jp", + "nicolepeters.com", + "nicomanga.jp", + "niconico.com", + "nicoseiga.jp", + "nicovideo.jp", + "nict.jp", + "niees.ac.uk", + "niesr.ac.uk", + "nighost.org", + "nightclub.eu", + "nightlife141.com", + "nightline.ac.uk", + "nights.fun", + "nihcc.ac.uk", + "nihr.ac.uk", + "nii.ac.jp", + "niimle.ac.uk", + "nijiclamp.com", + "nijidoujin.com", + "nijie.info", + "nijifeti.com", + "nijigen-daiaru.com", + "nijimiss.moe", + "nijinchu.com", + "nijioma.blog", + "nijiyome.jp", + "nike-air-max.com", + "nike-dunksb.com", + "nike-fr.com", + "nike-org.com", + "nike-uk.com", + "nike-us.com", + "nike-usa.com", + "nike.ci", + "nike.com", + "nike.com.br", + "nike.com.hk", + "nike.gy", + "nike.hk", + "nike.host", + "nike.shop", + "nike.us", + "nike0594.com", + "nike23.com", + "nikeadidas.com", + "nikeairhuarache.com", + "nikeairmax.com", + "nikeairmaxs.com", + "nikeairmaxshoes.com", + "nikeairrift.com", + "nikeasia.com", + "nikeaustralia.com", + "nikeaw77.com", + "nikeb.com", + "nikebbn.com", + "nikebetrue.com", + "nikebetterworld.com", + "nikebetterworld.info", + "nikebetterworld.net", + "nikebetterworld.org", + "nikebiz.info", + "nikebuy.com", + "nikeby.com", + "nikecdn.com", + "nikechosen.com", + "nikecloud.com", + "nikeclub.com", + "nikecompany.com", + "nikeconfluence.com", + "nikecraft.com", + "nikedawn.com", + "nikedunks.net", + "nikedunksshoes.com", + "nikeelite.com", + "nikefactorystore.com", + "nikefind.com", + "nikefirm.com", + "nikefoamposites.com", + "nikefoampositeshoes.com", + "nikefootballcleats.com", + "nikefootballgloves.com", + "nikefootballjersey.com", + "nikefoundation.org", + "nikefr.com", + "nikefrance.com", + "nikefree.com", + "nikefreeshoes.com", + "nikefuelband.com", + "nikegadgets.com", + "nikegenealogy.com", + "nikegolf.ca", + "nikegrid.com", + "nikehelp.com", + "nikehightops.com", + "nikehyperdunk.com", + "nikeidshoes.com", + "nikeinc.com", + "nikeincchemistry.com", + "nikeinstock.com", + "nikeit.com", + "nikeitalia.com", + "nikeitaly.com", + "nikekd.com", + "nikekid.com", + "nikelink.com", + "nikeliuxiang.com", + "nikelives.com", + "nikelunarglide.com", + "nikemarketing.com", + "niken7.com", + "nikenews.com", + "nikeonlinestore.com", + "nikeoutletstore.com", + "nikeoutletstores.com", + "nikepioneer.com", + "nikeplus.com", + "nikeplus.org", + "nikepress.com", + "nikeprice.com", + "nikeproduct.com", + "nikepromax.com", + "nikeresponsibility.com", + "nikereuseashoe.com", + "nikerunner.com", + "nikerunningshoes.com", + "nikesb.com", + "nikesbdunks.net", + "nikeseason.com", + "nikeselling.com", + "nikesellorder.com", + "nikeshoemarket.com", + "nikeshoes-store.com", + "nikeshoes21.com", + "nikeshoes4u.com", + "nikeshoescity.com", + "nikeshoesgroup.com", + "nikeshoesinc.com", + "nikeshoesmarket.com", + "nikeshoesretro.com", + "nikeshoeswon.com", + "nikeshoponline.com", + "nikeshoxsale.com", + "nikesku.com", + "nikesnowboarding.com", + "nikesoccercleats.com", + "nikesportswear.com", + "nikestares.com", + "nikestore.com", + "nikestore.com.au", + "nikestyles.com", + "nikeswim.com", + "niketaiwan.net", + "niketracking.com", + "niketradeweb.com", + "niketrainer.com", + "niketrainers.com", + "niketraining.com", + "nikeusa.com", + "nikewear.com", + "nikey.com", + "nikezoom.com", + "nikkan-gendai.com", + "nikkansports.com", + "nikke-de.com", + "nikke-en.com", + "nikke-fr.com", + "nikke-jp.com", + "nikke-kr.com", + "nikke-sea.com", + "nikkei-cnbc.co.jp", + "nikkei.co.jp", + "nikkei.com", + "nikkei.jp", + "nikkei4946.com", + "nikkeibp.co.jp", + "nimg.jp", + "nine.com.au", + "ninecommentaries.com", + "ninedtp.ac.uk", + "nineentertainment.com.au", + "nineentertainmentco.com.au", + "ninemediaroom.com.au", + "ninemsn.com.au", + "nineteentube.com", + "ning.com", + "ninjacloak.com", + "ninjaproxy.ninja", + "ninpu.cyou", + "nintendium.com", + "nintendo-europe-sales.com", + "nintendo-europe.com", + "nintendo.at", + "nintendo.be", + "nintendo.ch", + "nintendo.co.jp", + "nintendo.co.kr", + "nintendo.co.uk", + "nintendo.co.za", + "nintendo.com", + "nintendo.com.hk", + "nintendo.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.tw", + "nintendo3ds.com", + "nintendodsi.com", + "nintendoeurope.com", + "nintendonetwork.net", + "nintendonyc.com", + "nintendostore.com", + "nintendoswitch.com", + "nintendoswitch.net", + "nintendoswitchtogether.com", + "nintendowii.com", + "ninth.biz", + "niosii.com", + "niosii.net", + "niran.ac.uk", + "nismod.ac.uk", + "nist.gov", + "nitter.cc", + "nitter.net", + "niu.moe", + "niuc2.com", + "niusnews.com", + "nivod.tv", + "nivodi.tv", + "nivodz.com", + "nixos.org", + "niziero.info", + "njactb.org", + "njav.tv", + "njncscotlandscolleges.ac.uk", + "njuice.com", + "nkc.ac.uk", + "nke6.com", + "nkw.ac.uk", + "nlc.ac.uk", + "nlfreevpn.com", + "nlgs.ac.uk", + "nlincs-coll.ac.uk", + "nlm.io", + "nln.ac.uk", + "nlow.ac.uk", + "nls.ac.uk", + "nlsexfilmpjes.com", + "nlt-media.com", + "nmahp-ru.ac.uk", + "nmahp.ac.uk", + "nmap.ac.uk", + "nmbmw.com", + "nmgm.ac.uk", + "nmgw.ac.uk", + "nmh.ac.uk", + "nmite.ac.uk", + "nmm.ac.uk", + "nms.ac.uk", + "nmsi.ac.uk", + "nmsl.website", + "nmssc.ac.uk", + "nmwcte.ac.uk", + "nna.jp", + "nnc.ac.uk", + "nnews.eu", + "nnotts-col.ac.uk", + "nnuf.ac.uk", + "no-ip.com", + "no-ip.org", + "noa.ac.uk", + "nobel.se", + "nobelprize.org", + "nobodycanstop.us", + "noc.ac.uk", + "nocn.ac.uk", + "nocookie.net", + "nocs.ac.uk", + "nodejs.org", + "nodes.ac.uk", + "nodesnoop.com", + "nodesource.com", + "noellabo.jp", + "nofile.io", + "noisullifb.com", + "nokiantyres.com", + "nokogiri.org", + "nokola.com", + "nomachine.com", + "nomadlandmovie.ch", + "nomadproject.io", + "nomulus.foo", + "nondh-room.mom", + "nonktube.com", + "nonlinearnastran.com", + "nonstopfap.com", + "noodlemagazine.com", + "noodlevpn.com", + "noonvob.com", + "norbulingka.org", + "nordcdn.com", + "nordstrom.com", + "nordstromimage.com", + "nordstrommedia.com", + "nordstromrack.com", + "nordvpn.com", + "norfolkcove.ac.uk", + "norland.ac.uk", + "normanmanagedservices.ac.uk", + "noroutetohost.net", + "norsk.mobi", + "nortcoll.ac.uk", + "north-gla.ac.uk", + "north-london.ac.uk", + "north-trafford-college.ac.uk", + "northampton.ac.uk", + "northamptonapps.ac.uk", + "northamptoncoll.ac.uk", + "northamptoncollege.ac.uk", + "northbham.ac.uk", + "northbrook-online.ac.uk", + "northbrook.ac.uk", + "northbrookcollege.ac.uk", + "northderbycollege.ac.uk", + "northeast.ac.uk", + "northeastoutreachhub.ac.uk", + "northern-consortium.ac.uk", + "northern.ac.uk", + "northernart.ac.uk", + "northernbridge.ac.uk", + "northernenterpriseschools.ac.uk", + "northerngrid.ac.uk", + "northernlogisticsacademy.ac.uk", + "northglasgowcollege.ac.uk", + "northgrid.ac.uk", + "northhighland.ac.uk", + "northkent.ac.uk", + "northland.ac.uk", + "northlindsey.ac.uk", + "northscotland-research.ac.uk", + "northtrafford.ac.uk", + "northumberland-acl.ac.uk", + "northumberland.ac.uk", + "northumbria.ac.uk", + "norwichresearchpark.ac.uk", + "notebooklm.google", + "notepad-plus-plus.org", + "notion-static.com", + "notion.com", + "notion.new", + "notion.site", + "notion.so", + "notionusercontent.com", + "notredamecoll.ac.uk", + "nott.ac.uk", + "nottingham-trent.ac.uk", + "nottingham.ac.uk", + "nottinghamartsandhumanitiesresearchinstitute.ac.uk", + "nottinghamcollege.ac.uk", + "nottinghamcourses.ac.uk", + "nottinghameuniversity.ac.uk", + "nottinghamgraduateschoolofbusiness.ac.uk", + "nottinghaminnovation.ac.uk", + "nottinghaminternationalbusinessschool.ac.uk", + "nottinghamknowledge.ac.uk", + "nottinghampost.com", + "nottinghamtrentadfs.ac.uk", + "nottm-coll.ac.uk", + "nottsmaternity.ac.uk", + "novelasia.com", + "novella.ac.uk", + "noveltrove.com", + "novids.com", + "novinhabucetuda.com", + "novinhagostosa10.com", + "novinhasdozapzap.com", + "novojoy.com", + "novostrong.com", + "novus.ac.uk", + "novuscambria.ac.uk", + "now-ashare.com", + "now-tv.com", + "now.com", + "now.com.hk", + "now.im", + "now.sh", + "nowal.ac.uk", + "nowe.com", + "nowe.hk", + "nowjav.com", + "nownews.com", + "nowtorrents.com", + "nox.ac.uk", + "noxinfluencer.com", + "noypf.com", + "nozomi.la", + "npa.go.jp", + "npa.gov.tw", + "npcrdc.ac.uk", + "nphcardiac-research.ac.uk", + "npm.ac.uk", + "npm.community", + "npm.edu.tw", + "npm.gov.tw", + "npmjs.com", + "npmjs.org", + "npnt.me", + "npr.org", + "nps.gov", + "npsboost.com", + "npsc.ac.uk", + "nptc.ac.uk", + "nptcgroup.ac.uk", + "nptsibinbank.com", + "nradio.me", + "nrc.ac.uk", + "nrc.ca", + "nrdh99.buzz", + "nrk.no", + "nrn-lcee.ac.uk", + "nrooms-dh.sbs", + "nrp.ac.uk", + "nrs.ac.uk", + "ns.ci", + "ns01.biz", + "ns01.info", + "ns01.us", + "ns02.biz", + "ns02.info", + "ns02.us", + "ns1.name", + "ns2.name", + "ns3.name", + "nsad.ac.uk", + "nsals.ac.uk", + "nsamr.ac.uk", + "nsc.ac.uk", + "nsc.gov.tw", + "nsccs.ac.uk", + "nscd.ac.uk", + "nscg.ac.uk", + "nsea.ac.uk", + "nsf.ac.uk", + "nsfnet-relay.ac.uk", + "nsfw.xxx", + "nsfw247.to", + "nsfwmemes.com", + "nsimg.net", + "nsirc.ac.uk", + "nso.ac.uk", + "nspcr.ac.uk", + "nss.ac.uk", + "nsu.ac.uk", + "nsw.ac.uk", + "ntb.ac.uk", + "ntbk.gov.tw", + "ntbna.gov.tw", + "ntbt.gov.tw", + "ntc.ac.uk", + "ntc.party", + "ntd.com", + "ntd.tv", + "ntdc.ac.uk", + "ntdca.com", + "ntdimg.com", + "ntdsf.tv", + "ntdtv-dc.com", + "ntdtv.ca", + "ntdtv.co.kr", + "ntdtv.com", + "ntdtv.com.tw", + "ntdtv.cz", + "ntdtv.jp", + "ntdtv.kr", + "ntdtv.org", + "ntdtv.ru", + "ntdtvla.com", + "ntdvn.com", + "ntec.ac.uk", + "ntfs.ac.uk", + "ntidagenham.ac.uk", + "ntnews.com.au", + "ntp.org", + "ntp.se", + "ntrfun.com", + "ntsna.gov.tw", + "ntten-mg.buzz", + "ntu.ac.uk", + "ntu.edu.tw", + "ntyneside.ac.uk", + "nu-bay.com", + "nu-sense.ac.uk", + "nu.nl", + "nu36.vip", + "nua.ac.uk", + "nubilefilms.com", + "nubiles-casting.com", + "nubiles-porn.com", + "nubiles.net", + "nubileset.com", + "nubilesunscripted.com", + "nuc.ac.uk", + "nuca.ac.uk", + "nucarts.ac.uk", + "nuccam.ac.uk", + "nuccat.ac.uk", + "nucfs.ac.uk", + "nuclear.ac.uk", + "nuclear2050.ac.uk", + "nuclearcollege.ac.uk", + "nucleartheory.ac.uk", + "nuclearuniversities.ac.uk", + "nuddess.com", + "nude-pics.org", + "nude-share.com", + "nude.hu", + "nudeandhairy.com", + "nudebeachpussy.com", + "nudecams.cam", + "nudecelebforum.com", + "nudedrawer.com", + "nudedxxx.com", + "nudeeroticteens.com", + "nudefiles.net", + "nudegfporn.com", + "nudekenya.com", + "nudelive.com", + "nudematurewomenpics.com", + "nudemilfporn.com", + "nudes7.com", + "nudespree.com", + "nudeteen.org", + "nudeteenboys.net", + "nudeteenladies.com", + "nudevietnam.com", + "nudevista.best", + "nudevista.club", + "nudevista.com", + "nudevista.es", + "nudevista.fun", + "nudevista.link", + "nudevista.net", + "nudevista.vip", + "nudewifeporn.com", + "nudewomenpics.net", + "nudezz.com", + "nudify.online", + "nudistbeachporn.com", + "nudistic.com", + "nudistlog.com", + "nudistsexvideos.com", + "nudistvoyeurbeach.com", + "nudity911.com", + "nudogram.com", + "nudography.com", + "nudostar.tv", + "nuespournous.com", + "nuexpo.com", + "nuget.org", + "nugettest.org", + "nuita.net", + "nukemanga.com", + "nuki-dokoro.com", + "nukistream.com", + "nulc.ac.uk", + "nulcollege.ac.uk", + "nunuyy.cc", + "nupha.ac.uk", + "nuqmu-2kt.ac.uk", + "nurgay.to", + "nurgo-software.com", + "nuro.jp", + "nurofen.at", + "nurofen.bg", + "nurofen.co.il", + "nurofen.co.nz", + "nurofen.co.uk", + "nurofen.co.za", + "nurofen.com", + "nurofen.com.au", + "nurofen.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.ru", + "nurofen.sk", + "nurofengel.com", + "nurofensk-prod-env.eu-west-1.elasticbeanstalk.com", + "nurse.ac.uk", + "nurture.ac.uk", + "nurumassage.net", + "nurxxx.mobi", + "nusatrip.com", + "nushemale.com", + "nutaku.com", + "nutaku.net", + "nutramigen.net", + "nutramigen.pl", + "nutsvpn.work", + "nuuporn.com", + "nuuvem.com", + "nuvid.com", + "nuzcom.com", + "nvdst.com", + "nvidia.asia", + "nvidia.at", + "nvidia.be", + "nvidia.ch", + "nvidia.co.at", + "nvidia.co.in", + "nvidia.co.jp", + "nvidia.co.kr", + "nvidia.co.uk", + "nvidia.com", + "nvidia.com.au", + "nvidia.com.br", + "nvidia.com.mx", + "nvidia.com.pe", + "nvidia.com.pl", + "nvidia.com.tr", + "nvidia.com.tw", + "nvidia.com.ua", + "nvidia.com.ve", + "nvidia.cz", + "nvidia.de", + "nvidia.dk", + "nvidia.es", + "nvidia.eu", + "nvidia.fi", + "nvidia.fr", + "nvidia.in", + "nvidia.it", + "nvidia.jp", + "nvidia.lu", + "nvidia.mx", + "nvidia.nl", + "nvidia.no", + "nvidia.pl", + "nvidia.ro", + "nvidia.ru", + "nvidia.se", + "nvidia.tw", + "nvidiaforhp.com", + "nvidiagrid.net", + "nvquan.org", + "nvtongzhisheng.org", + "nw-grid.ac.uk", + "nwba.ac.uk", + "nwcdtp.ac.uk", + "nwcs.ac.uk", + "nwdtc.ac.uk", + "nwhc.ac.uk", + "nwi.ac.uk", + "nwifhe.ac.uk", + "nwkc.ac.uk", + "nwkcollege.ac.uk", + "nwkent.ac.uk", + "nwl.ac.uk", + "nwlcc.ac.uk", + "nwman.ac.uk", + "nwmentoring.ac.uk", + "nwrc.ac.uk", + "nwsgc.ac.uk", + "nwslc.ac.uk", + "nwspm.ac.uk", + "nwssdtp.ac.uk", + "nwstudentandgraduate.ac.uk", + "nwtca.org", + "nwtf.ac.uk", + "nwua.ac.uk", + "nwueu.ac.uk", + "nwupc.ac.uk", + "nwworkbank.ac.uk", + "nwxs8.com", + "nwy.ac.uk", + "nxta.org", + "nxtdig.com.hk", + "nxtdig.com.tw", + "nyaa.eu", + "nyaa.net", + "nyaa.si", + "nyahentai.re", + "nyansa.com", + "nybooks.com", + "nydailynews.com", + "nydus.ca", + "nylon-angel.com", + "nylonstockingsonline.com", + "nym97.net", + "nypost.com", + "nypost.help", + "nypostreprints.com", + "nyt.com", + "nyt.net", + "nytchina.com", + "nytcn.me", + "nytco.com", + "nyti.ms", + "nytimes.com", + "nytimes.map.fastly.net", + "nytimg.com", + "nytlog.com", + "nytstyle.com", + "nyu.ac.uk", + "nzchinese.com", + "nzchinese.net.nz", + "o2action.co.kr", + "o365weve-dev.com", + "o365weve-ppe.com", + "o365weve.com", + "o3o.ca", + "oaa-anaes.ac.uk", + "oaistatic.com", + "oaiusercontent.com", + "oakhill.ac.uk", + "oaklands.ac.uk", + "oakley.ac.uk", + "oakwoodcourt.ac.uk", + "oanda.com", + "oanencore.com", + "oann.com", + "oas.ac.uk", + "oasis.ac.uk", + "oasiscollege.ac.uk", + "oasp.ac.uk", + "oath.cloud", + "oath.com", + "oatridge.ac.uk", + "oauth.net", + "oauthz.com", + "obc.ac.uk", + "obhe.ac.uk", + "objectarx.com", + "obs.ac.uk", + "observable.net", + "observechina.net", + "obsrvbl.com", + "obutsumania.com", + "obutu.com", + "obyte.org", + "oca.ac.uk", + "ocaspro.com", + "ocbmwdealers.com", + "occ.ac.uk", + "occupytiananmen.com", + "oceanography.ac.uk", + "ocfe.ac.uk", + "ochjs.ac.uk", + "oclc.org", + "oclp.hk", + "ocms.ac.uk", + "ocn.ad.jp", + "ocnkm.ac.uk", + "ocreampies.com", + "ocry.com", + "ocsp-certum.com", + "ocsp-responder.com", + "october-review.org", + "ocul.us", + "oculus-china.com", + "oculus.com", + "oculus2014.com", + "oculus3d.com", + "oculusblog.com", + "oculusbrand.com", + "oculuscasino.net", + "oculuscdn.com", + "oculusconnect.com", + "oculusdiving.com", + "oculusforbusiness.com", + "oculusrift.com", + "oculusvr.com", + "ocvc.ac.uk", + "odysee.com", + "oecd-ilibrary.org", + "oed.com", + "oekakiskey.com", + "oen.tw", + "oeps.ac.uk", + "oercymru.ac.uk", + "oerwales.ac.uk", + "oex.com", + "offbeatchina.com", + "offerairjordanlebron.com", + "office.com", + "office.net", + "office365.com", + "office365love.com", + "office365tw.com", + "officeforstudents.ac.uk", + "officeoftibet.com", + "officialbeatsbydreshop.com", + "officialbeatsbydrestore.com", + "officialblog.jp", + "officialdrdre.com", + "officialheadphone.com", + "offresspecialesbmw.ca", + "offrezdesipods.com", + "offshorerenewables.ac.uk", + "ofile.org", + "ofs.ac.uk", + "ogameblog.com", + "ogaoga.org", + "ogate.org", + "oge.ac.uk", + "ogp.me", + "ogsa-dai.ac.uk", + "ohchr.org", + "ohentai.org", + "ohgratisporrfilm.com", + "ohmyrss.com", + "ohpornocasero.com", + "ohpornovideo.com", + "ohsesso.com", + "ohsexfilm.com", + "ohsexotube.com", + "ohu.ac.uk", + "ohyeah1080.com", + "oibc.ac.uk", + "oikos.com.tw", + "oiktv.com", + "oiobbs.com", + "oizoblog.com", + "ok.ru", + "ok.xxx", + "okaapps.com", + "okayfreedom.com", + "okazudouga.tokyo", + "okcoin.com", + "okex.com", + "okk.tw", + "okkisokuho.com", + "okx-dns.com", + "okx-dns1.com", + "okx-dns2.com", + "okx.com", + "olabloga.pl", + "old-cat.net", + "oldbury.ac.uk", + "older-women-movies.com", + "older-women-porn.com", + "older.tube", + "oldham-sfc.ac.uk", + "oldham.ac.uk", + "oldhornymilfs.com", + "oldje.com", + "oldroyd.ac.uk", + "olds.ac.uk", + "oldvic.ac.uk", + "olehd.com", + "olehdtv.com", + "olelive.com", + "olemovienews.com", + "olevod.com", + "olevod.io", + "olevod.tv", + "olevodtv.com", + "olf.ac.uk", + "oli-school.com", + "oli.ac.uk", + "olumpo.com", + "olympicwatch.org", + "omafotze.com", + "omagh.ac.uk", + "omaghcollege.ac.uk", + "omandrilling.ac.uk", + "omaps.app", + "omcrg.ac.uk", + "omct.org", + "omekinteractive.com", + "omg.adult", + "omg.blog", + "omghk.com", + "omgili.com", + "omgteens.com", + "omii.ac.uk", + "omni.ac.uk", + "omni7.jp", + "omniroot.com", + "omnitalk.com", + "omnitalk.org", + "omnitek.tv", + "omniture.com", + "omny.fm", + "omobi.cc", + "omoplanet.com", + "omorashi.jp", + "omorashi.org", + "omscr.com", + "omsiirc.ac.uk", + "omtrdc.net", + "omy.sg", + "on.cc", + "on.here", + "on.net", + "on2.com", + "onahodouga.com", + "onani-daisuki.com", + "onapp.com", + "onbeatsbydresale.com", + "oncars.in", + "one.one", + "one889.app", + "oneapi.com", + "onedinesfree.com", + "onedrive.co", + "onedrive.co.uk", + "onedrive.com", + "onedrive.eu", + "onedrive.net", + "onedrive.org", + "onedumb.com", + "onefifteen.net", + "onefifteen.org", + "onejapanese.com", + "onejav.com", + "onekey-asset.com", + "onekey.so", + "onekeycn.com", + "onenote.com", + "onenote.net", + "onepornlist.com", + "onesiterip.com", + "onesto.re", + "onestore.co.kr", + "onestore.ms", + "oneteamconference.com", + "onetrust.com", + "oneworldmanystories.com", + "onindiansex.com", + "oninstagram.com", + "onion.city", + "onion.ly", + "onion666.com", + "onionshare.org", + "onkakao.net", + "online-deals.net", + "online-instagram.com", + "onlineapplestore.com", + "onlinecha.com", + "onlinefucktube.com", + "onlinegeeksquad.com", + "onlineinstagram.com", + "onlinemonsterbeatsonsale.com", + "onlineporn-vids.com", + "onlinesurveys.ac.uk", + "onlineteenhub.com", + "onlinexxxgames.com", + "onlineyoutube.com", + "onlinm.ac.uk", + "only-xxx-porn.com", + "only-xxx.com", + "only3x.com", + "onlyams.com", + "onlycartoonsex.com", + "onlydudes.com", + "onlyfanspw.com", + "onlyfreelatinaporn.com", + "onlygayvideo.com", + "onlyhdporn.com", + "onlyhentaistuff.com", + "onlyhomemadeanal.com", + "onlyincestporn.com", + "onlyindianporn.tv", + "onlyindianporn2.com", + "onlyiphone5case.com", + "onlyleaks.me", + "onlynudes.org", + "onlyprime.ru", + "onlysiterip.com", + "onlytweets.com", + "onmanorama.com", + "onmoon.com", + "onmoon.net", + "onmypc.biz", + "onmypc.info", + "onmypc.net", + "onmypc.org", + "onmypc.us", + "onsalekey.com", + "onsaletrend.com", + "onstream.cc", + "onthehunt.com", + "ontrac.com", + "ontrack.ac.uk", + "onxxxtube.com", + "onxxxvideo.com", + "oocdtp.ac.uk", + "ooni.org", + "oopsforum.com", + "ootbstudio.co.kr", + "op.gg", + "op7979.com", + "opdems.ac.uk", + "open-assistant.io", + "open.ac.uk", + "open.com.hk", + "openai.com", + "openallweb.com", + "openamt.com", + "openapiplatform.com", + "openapiservice.com", + "openart.ai", + "opencollective.com", + "opencreate.org", + "opendemocracy.net", + "opendn.xyz", + "opendroneid.org", + "opened.ac.uk", + "openengineeringlaboratory.ac.uk", + "openervpn.in", + "openfields.ac.uk", + "opengraphprotocol.com", + "opengraphprotocol.org", + "opengw.net", + "openid.net", + "openjsf.org", + "openleaks.org", + "openlibrary.org", + "openmaps.org", + "openreality.com", + "openresty.org", + "opensciencelab.ac.uk", + "opensciencelaboratory.ac.uk", + "opensea.io", + "opensource.ac.uk", + "opensource.google", + "opensource.guide", + "opensourceinsight.dev", + "opensourceinsights.dev", + "openssl.org", + "openstemlab.ac.uk", + "openstemlabs.ac.uk", + "openstreetmap.com", + "openstreetmap.net", + "openstreetmap.org", + "openstreetmaps.org", + "opensuse.org", + "opentech.fund", + "opentgc.com", + "openthread.io", + "opentranslatorstothings.org", + "openuniversity.ac.uk", + "openurl.ac.uk", + "openvinotoolkit.org", + "openvpn.net", + "openvpn.org", + "openweather.co.uk", + "openweathermap.org", + "openweave.io", + "openwebster.com", + "openwrt.org", + "openwrt.org.cn", + "opera-archive.ac.uk", + "opera-mini.net", + "opera.com", + "opinionjournal.com", + "oppai-doga.info", + "oppainorakuen.com", + "opsource.net", + "optanedifference.com", + "opte.org", + "optica.org", + "opticore.com", + "opticsforthecloud.net", + "optima-cdt.ac.uk", + "optimumssl.com", + "opus-gaming.com", + "opwall.ac.uk", + "oracle.com", + "oraclecloud.com", + "oraclefoundation.org", + "oracleimg.com", + "oracleinfinity.io", + "oranum.com", + "orbitalsouthcolleges.ac.uk", + "orbitera.com", + "orchardhill.ac.uk", + "orchestra.ac.uk", + "orchid.ac.uk", + "orchidbbs.com", + "orcon.net.nz", + "oreil.ly", + "oreilly.com", + "oreilly.review", + "oreillystatic.com", + "oreno3d.com", + "organcare.org.tw", + "organharvestinvestigation.net", + "organiccrap.com", + "organicmaps.app", + "orgasm.com", + "orgasmlist.com", + "orgfree.com", + "orgypornonly.com", + "orgyxxxhub.com", + "oricon.co.jp", + "orient-doll.com", + "orientalasianporn.com", + "orientaldaily.com.my", + "orientalmed.ac.uk", + "origin.com", + "origin.tv", + "originalhulu.com", + "originalindianporn.com", + "orithegame.com", + "orl.ly", + "orlandohurricane.com", + "ormskirk.ac.uk", + "orn.jp", + "orpington.ac.uk", + "orsas.ac.uk", + "orsm.net", + "orthopaedic-cadcam.com", + "orthotics-cadcam.com", + "orzdream.com", + "orzistic.org", + "osakamotion.net", + "osapublishing.org", + "osc.ac.uk", + "oscar.ac.uk", + "oscg.ac.uk", + "osdn.net", + "osfc.ac.uk", + "osfoora.com", + "osianxiety.ac.uk", + "osier.ac.uk", + "osiri-suki-club.com", + "osl.com", + "osm.org", + "osmfoundation.org", + "osmosis.ac.uk", + "ospray.net", + "ospray.org", + "oss-watch.ac.uk", + "otaku-168.com", + "otaku18a.info", + "otaku55.xyz", + "otbm.com", + "otcbtc.com", + "otleycollege.ac.uk", + "otleyeaston.ac.uk", + "otleyonline.ac.uk", + "otnd.org", + "otokonokoland.com", + "otto.de", + "otzo.com", + "ou.ac.uk", + "oubs.ac.uk", + "oudoll.com", + "oup.com", + "ouplaw.com", + "ourdearamy.com", + "ourhobby.com", + "ourjourney.ac.uk", + "ouroath.com", + "oursexgames.com", + "ourshdtv.com", + "ourshemales.com", + "oursogo.com", + "oursteps.com.au", + "oursweb.net", + "ourtv.hk", + "oustudios.ac.uk", + "outbound.io", + "outdoorpublicsex.com", + "outduction.ac.uk", + "outingsapp.com", + "outletbeatsshop.com", + "outletnike.com", + "outlook.com", + "outofhourshelp.ac.uk", + "ovc.ac.uk", + "over-blog.com", + "over18arcade.com", + "overapple.com", + "overcast.fm", + "overdaily.org", + "overleaf.com", + "overplay.net", + "overthumbs.com", + "ovi.com", + "ovid.com", + "ovpn.com", + "ow.ly", + "owind.com", + "owl-elearning.ac.uk", + "owl.li", + "owltail.com", + "owsc.ac.uk", + "ox.ac.uk", + "oxademy.ac.uk", + "oxahsc.ac.uk", + "oxcis.ac.uk", + "oxdent.ac.uk", + "oxford-brookes.ac.uk", + "oxford-cherwell.ac.uk", + "oxford.ac.uk", + "oxfordaasc.com", + "oxfordadvancedstudies.ac.uk", + "oxfordartonline.com", + "oxfordbibliographies.com", + "oxfordbrookes.ac.uk", + "oxfordbusinesscollege.ac.uk", + "oxfordclinicalpsych.com", + "oxfordcollege.ac.uk", + "oxforddnb.com", + "oxforddrama.ac.uk", + "oxfordfirstsource.com", + "oxfordgsb.ac.uk", + "oxfordhandbooks.com", + "oxfordlawtrove.com", + "oxfordmedicine.com", + "oxfordmusiconline.com", + "oxfordpoliticstrove.com", + "oxfordre.com", + "oxfordreference.com", + "oxfordscholarlyeditions.com", + "oxfordscholarship.com", + "oxfordtutorialcollege.ac.uk", + "oxfordwesternmusic.com", + "oxid.it", + "oxilp.ac.uk", + "oxlife.co", + "oxwasp-cdt.ac.uk", + "oyax.com", + "oyeloca.com", + "oyghan.com", + "ozchinese.com", + "ozeex.com", + "ozodi.org", + "ozodlik.org", + "ozvoice.org", + "ozxw.com", + "ozyoyo.com", + "pa9pal.com", + "paaypal.com", + "pachosting.com", + "pacifickitchenandhome.com", + "pacificpoker.com", + "packaging-cadcam.com", + "packagingcadcam.com", + "packagist.org", + "packer.io", + "packetix.net", + "pacloudflare.com", + "pacopacomama.com", + "pact.ac.uk", + "padmanet.com", + "pads.ac.uk", + "paerosnen.club", + "page.link", + "page.tl", + "page2rss.com", + "page3.com", + "pagecdn.com", + "pagecdn.io", + "pages.dev", + "pagespeedmobilizer.com", + "pageview.mobi", + "pagodabox.com", + "pahabicilemezsurprizler.com", + "pahc.ac.uk", + "paheal.net", + "paidpornguide.com", + "paidpornsites.com", + "paily.net", + "paily.org", + "paimon.moe", + "painfulpussytortures.com", + "painnovel.com", + "paipal.com", + "paipancon.com", + "paisapay.cc", + "paisapay.info", + "paisapay.tv", + "paisley.ac.uk", + "pakistanporntube.net", + "pala.ac.uk", + "palacemoon.com", + "palaeography.ac.uk", + "palatine.ac.uk", + "palcomix.com", + "paldengyal.com", + "palemoon.org", + "palestineremix.com", + "pali.ltd", + "paljorpublications.com", + "palmers.ac.uk", + "palmislife.com", + "pals.ac.uk", + "paltalk.com", + "panasonic.com", + "panasonic.jp", + "pancolle-movie.jp", + "panda.ac.uk", + "panda30.shop", + "pandamovies.pw", + "pandanet-igs.com", + "pandapow.co", + "pandapow.net", + "pandavpn-jp.com", + "pandavpnpro.com", + "pandora.com", + "pandora.tv", + "pankwire.com", + "panluan.net", + "panorama-dtp.ac.uk", + "panoramio.com", + "pantswalker.net", + "pao-pao.net", + "paofu.cloud", + "paofuyun.me", + "paon.site", + "papalah.com", + "paper-attachments.s3.amazonaws.com", + "paper.li", + "paperb.us", + "paperclip.tk", + "papermc.io", + "paradigm.ac.uk", + "paradisehill.cc", + "paradisehotelquizfox.com", + "paradisepoker.com", + "paragon.com", + "paramount.com", + "paramountplus.com", + "parastorage.com", + "pardot.com", + "park-college.ac.uk", + "park-now.com", + "parkansky.com", + "parkcol.ac.uk", + "parkinfo.com", + "parklane.ac.uk", + "parklanecoll.ac.uk", + "parksandgardens.ac.uk", + "parkvv.com", + "parler.com", + "parse.com", + "parsevideo.com", + "parstream.com", + "parstream.net", + "parstream.org", + "particlephysics.ac.uk", + "partmaker.com", + "partneriaethaberbangor.ac.uk", + "partycasino.com", + "partylikeits1986.org", + "partypoker.com", + "pascherbeatsmonster.com", + "pase.ac.uk", + "pashtovoa.com", + "pasionmujeres.com", + "paskoocheh.com", + "passion-hd.com", + "passion.com", + "passiontimes.hk", + "passport.net", + "passwords.google", + "pastahealth.com", + "paste.ee", + "pastebin.com", + "pastie.org", + "paston.ac.uk", + "patentgold.net", + "patenttruth.org", + "path.ac.uk", + "pathcal.ac.uk", + "pathtosharepoint.com", + "pathways.ac.uk", + "pathwaystohe.ac.uk", + "patreon.com", + "patreoncommunity.com", + "patreonusercontent.com", + "patsy.ac.uk", + "paul-mellon-centre.ac.uk", + "paulmelloncentre.ac.uk", + "paulsimon-music.com", + "pavpal.com", + "pawoo.net", + "paxful.com", + "paxlicense.org", + "paydiant.com", + "paygonline.com", + "payhulu.com", + "paylike.com", + "paypa1.com", + "paypa1.org", + "paypaal.com", + "paypal-activate.com", + "paypal-activate.info", + "paypal-activate.org", + "paypal-apac.com", + "paypal-apps.com", + "paypal-biz.com", + "paypal-brandcentral.com", + "paypal-business.com", + "paypal-business.net", + "paypal-business.org", + "paypal-cardcash.com", + "paypal-cash.com", + "paypal-center.com", + "paypal-center.info", + "paypal-center.net", + "paypal-center.org", + "paypal-communication.com", + "paypal-communications.com", + "paypal-communications.net", + "paypal-community.com", + "paypal-community.net", + "paypal-comunidad.com", + "paypal-corp.com", + "paypal-database.com", + "paypal-database.us", + "paypal-donations.com", + "paypal-dynamic.com", + "paypal-engineering.com", + "paypal-europe.com", + "paypal-excelinvoicing.com", + "paypal-exchanges.com", + "paypal-forward.com", + "paypal-galactic.com", + "paypal-gift.com", + "paypal-gifts.com", + "paypal-gpplus.com", + "paypal-here.com", + "paypal-hrsystem.com", + "paypal-innovationlab.com", + "paypal-integration.com", + "paypal-japan.com", + "paypal-knowledge.com", + "paypal-labs.com", + "paypal-latam.com", + "paypal-learning.com", + "paypal-login.com", + "paypal-login.info", + "paypal-login.org", + "paypal-login.us", + "paypal-luxury.com", + "paypal-mainstreet.net", + "paypal-marketing.com", + "paypal-media.com", + "paypal-merchantloyalty.com", + "paypal-mobilemoney.com", + "paypal-network.org", + "paypal-notice.com", + "paypal-notify.com", + "paypal-online.info", + "paypal-online.net", + "paypal-online.org", + "paypal-optimizer.com", + "paypal-pages.com", + "paypal-photocard.com", + "paypal-plaza.com", + "paypal-portal.com", + "paypal-prepagata.com", + "paypal-prepagata.net", + "paypal-prepaid.com", + "paypal-profile.com", + "paypal-proserv.com", + "paypal-qrshopping.org", + "paypal-recargacelular.com", + "paypal-redeem.com", + "paypal-referral.com", + "paypal-retail.com", + "paypal-scoop.com", + "paypal-search.com", + "paypal-secure.net", + "paypal-secure.org", + "paypal-security.net", + "paypal-security.org", + "paypal-service.org", + "paypal-signin.com", + "paypal-signin.us", + "paypal-special.com", + "paypal-specialoffers.com", + "paypal-sptam.com", + "paypal-status.com", + "paypal-support.com", + "paypal-survey.com", + "paypal-survey.org", + "paypal-team.com", + "paypal-viewpoints.net", + "paypal.ca", + "paypal.com", + "paypal.com.hk", + "paypal.com.sg", + "paypal.hk", + "paypal.info", + "paypal.jp", + "paypal.me", + "paypal.so", + "paypal.us", + "paypalbeacon.com", + "paypalbenefits.com", + "paypalbrasil.com", + "paypalcommunity.com", + "paypalcommunity.net", + "paypalcommunity.org", + "paypalcorp.com", + "paypalcredit.com", + "paypalcreditcard.com", + "paypalgivingfund.org", + "paypalhere.com", + "paypalhere.info", + "paypalhere.net", + "paypalhere.org", + "paypalhere.tv", + "paypali.net", + "paypalinc.com", + "paypalindia.com", + "paypalinsuranceservices.org", + "paypall.com", + "paypallabs.com", + "paypalme.com", + "paypalnet.net", + "paypalnet.org", + "paypalnetwork.info", + "paypalnetwork.net", + "paypalnetwork.org", + "paypalobjects.com", + "paypalonline.net", + "paypalonline.org", + "paypalprepagata.com", + "paypalprepagata.net", + "paypalservice.com", + "paypalshopping.com", + "paypalshopping.net", + "paypalsurvey.com", + "paypalx.com", + "paypaly.com", + "paypass.net", + "payppal.com", + "payserve.com", + "paysitesreviews.net", + "payypal.com", + "pbabes.com", + "pbjar1205.pro", + "pble.ac.uk", + "pbs.org", + "pbwiki.com", + "pbworks.com", + "pbxes.com", + "pbxes.org", + "pc.com", + "pca.ac.uk", + "pca.st", + "pcad.ac.uk", + "pcae.ac.uk", + "pcanywhere.net", + "pcc.gov.tw", + "pccw.com", + "pccwglobal.com", + "pccwsolutions.com", + "pcdvd.com.tw", + "pcfe.ac.uk", + "pcfeonline.ac.uk", + "pcgamestorrents.com", + "pchome.com.tw", + "pchomeec.tw", + "pchomeonline.com.tw", + "pchomepay.com.tw", + "pcij.org", + "pcl.ac.uk", + "pcloud.com", + "pcloud.tw", + "pcmarket.com.hk", + "pcmd.ac.uk", + "pcre.org", + "pcstore.com.tw", + "pct.org.tw", + "pctlwm.com", + "pcydds.ac.uk", + "pdetails.com", + "pdf.new", + "pdi.ac.uk", + "pdncommunity.com", + "pdproxy.com", + "pds.ac.uk", + "pdxbmw.com", + "peace.ca", + "peacefire.org", + "peacehall.com", + "peach-cherry.com", + "peachy18.com", + "peachyforum.com", + "peacocktv.com", + "pearl.ac.uk", + "pearlher.org", + "pearson-anaya.com", + "pearson-intl.com", + "pearson-schule.ch", + "pearson-studium.ch", + "pearson.ch", + "pearson.cl", + "pearson.co.in", + "pearson.co.jp", + "pearson.com", + "pearson.com.ar", + "pearson.com.au", + "pearson.com.hk", + "pearson.com.uy", + "pearson.es", + "pearson.fr", + "pearson.pl", + "pearsonactivelearn.com", + "pearsonassessment.be", + "pearsonassessment.de", + "pearsonassessment.dk", + "pearsonassessment.fr", + "pearsonassessment.nl", + "pearsonassessment.no", + "pearsonassessment.se", + "pearsonassessments.com", + "pearsonbusinessschool.ac.uk", + "pearsoncanada.ca", + "pearsonclinical.be", + "pearsonclinical.ca", + "pearsonclinical.co.uk", + "pearsonclinical.com.au", + "pearsonclinical.com.br", + "pearsonclinical.de", + "pearsonclinical.dk", + "pearsonclinical.es", + "pearsonclinical.eu", + "pearsonclinical.fr", + "pearsonclinical.in", + "pearsonclinical.nl", + "pearsonclinical.no", + "pearsonclinical.se", + "pearsoncmg.com", + "pearsoncollege.ac.uk", + "pearsoncollegelondon.ac.uk", + "pearsoncred.com", + "pearsoned.co.nz", + "pearsoned.com", + "pearsoneducacion.net", + "pearsoneducationbooks.com", + "pearsonelt.ch", + "pearsonelt.com", + "pearsonenespanol.com", + "pearsonhighered.com", + "pearsoninstitute.ac.za", + "pearsonlongman.ch", + "pearsononlineacademy.com", + "pearsonperu.pe", + "pearsonplaces.com.au", + "pearsonschoolsandfecolleges.co.uk", + "pearsonvue.com", + "pearsonvue.net", + "peas.ac.uk", + "pec.ac.uk", + "pedagogicequality.ac.uk", + "peeasian.com", + "peekvids.com", + "peep.ac.uk", + "peepholecam.com", + "peerj.com", + "peerlearning.ac.uk", + "peing.net", + "pekingduck.org", + "pelvicexam.info", + "pembrokeshire.ac.uk", + "pembs.ac.uk", + "pemulihan.or.id", + "pen.io", + "penchinese.com", + "penchinese.net", + "pencoed.ac.uk", + "pendcoll.ac.uk", + "pengwerncollege.ac.uk", + "peninsula.ac.uk", + "peninsular.ac.uk", + "penisbot.com", + "pennine.ac.uk", + "pensions-expert.com", + "pentalogic.net", + "penthouse.com", + "pentium.com", + "pentium.net", + "pentoy.hk", + "penwith.ac.uk", + "penwithcollege.ac.uk", + "penybont.ac.uk", + "penzance.ac.uk", + "peoplebookcafe.com", + "peopledreamfunding.com", + "peoplelikeyou.ac.uk", + "peoplenews.tw", + "peoples.ac.uk", + "peopo.org", + "pepa.ac.uk", + "percy.in", + "perfect-privacy.com", + "perfected.ac.uk", + "perfectgirls.net", + "perfectgonzo.com", + "perfectkickz.net", + "perfectnaked.com", + "perfectsexnow.com", + "perfectshemales.com", + "perfecttitspics.com", + "perfectvpn.net", + "performancescience.ac.uk", + "periscope.tv", + "perl.org", + "perplexity.ai", + "persagg.com", + "persecutionblog.com", + "pershore.ac.uk", + "persianepochtimes.com", + "persiankitty.com", + "person.com", + "personaltrainermath.com", + "personeelsland.com", + "perth.ac.uk", + "perthcoll.ac.uk", + "pervclips.com", + "perverse.sex", + "perverttube.com", + "petardas.com", + "petardas.xxx", + "petardashd.com.ve", + "peterborough.ac.uk", + "petite.one", + "petiteamateurteen.com", + "petiteballerinasfucked.com", + "petitehdporn.com", + "petroc.ac.uk", + "pfd.org.hk", + "pggc.ac.uk", + "pgreen.ac.uk", + "pgyy67.top", + "phantomjs.org", + "phapluan.org", + "pharmacy.ac.uk", + "pharmacyschools.ac.uk", + "pharmacyschoolscouncil.ac.uk", + "phayul.com", + "phc.ac.uk", + "phdcymru.ac.uk", + "pheds-dtc.ac.uk", + "pheonix.money", + "phes.ac.uk", + "philborges.com", + "philtar.ac.uk", + "phimsex47.club", + "phimsexhentai.me", + "phimsexkhongche.cyou", + "phimsexnhanh.club", + "phmsociety.org", + "phncdn.com", + "phoenix.ac.uk", + "phonegap.com", + "photo-image.monster", + "photodharma.net", + "photofocus.com", + "photolia.net", + "photonics.ac.uk", + "photonicssociety.org", + "photos18.com", + "photoshop.com", + "php.net", + "phprcdn.com", + "phptutorial.net", + "phr.ac.uk", + "phun.org", + "phuquocservices.com", + "phxbmw.com", + "physicalexam.info", + "physiology.org", + "pi-project.ac.uk", + "pi-vr.com", + "piapp.com.tw", + "piapro.net", + "picacg2022.com", + "picacgp.com", + "picacgy.com", + "picacn.xyz", + "picacomic.com", + "picacomic.xyz", + "picacomiccn.com", + "picasa.com", + "picasaweb.com", + "picasaweb.net", + "picasaweb.org", + "pichunter.com", + "picidae.net", + "picker.ac.uk", + "pickereurope.ac.uk", + "pickering.ac.uk", + "pickinguppussy.com", + "picknicekicks.net", + "pickshoesclothes.com", + "picnik.com", + "picpost.com", + "pics.ee", + "pics.vc", + "picsee.co", + "picsee.pro", + "pictoa.com", + "pictocum.com", + "picturedip.com", + "picturesocial.com", + "pieceofplastic.com", + "pier18.ac.uk", + "pifpafarabia.com", + "pigav.com", + "piirus.ac.uk", + "pikabu.monster", + "pikpak.me", + "pikpakdrive.com", + "pilgrimageandcathedrals.ac.uk", + "pilgrimagestudies.ac.uk", + "pillbeatsblackfridaysale.com", + "pimg.tw", + "pin-cong.com", + "pin.it", + "pin6.com", + "pinata.cloud", + "pincong.rocks", + "pinduck.com", + "pinflix.com", + "ping.fm", + "ping.pe", + "ping.sx", + "pingguotv.xyz", + "pingxiangpuer.com", + "pinimg.com", + "pinkcore.com", + "pinkcore.net", + "pinkdh-bb.sbs", + "pinkdino.com", + "pinkporno.com", + "pinkpussy.tv", + "pinkrod.com", + "pinksporn.com", + "pinkvelvetvault.com", + "pinkworld.com", + "pinoy-n.com", + "pinterest.at", + "pinterest.be", + "pinterest.ca", + "pinterest.ch", + "pinterest.cl", + "pinterest.co", + "pinterest.co.at", + "pinterest.co.in", + "pinterest.co.kr", + "pinterest.co.nz", + "pinterest.co.uk", + "pinterest.com", + "pinterest.com.au", + "pinterest.com.bo", + "pinterest.com.ec", + "pinterest.com.mx", + "pinterest.com.pe", + "pinterest.com.py", + "pinterest.com.uy", + "pinterest.com.vn", + "pinterest.de", + "pinterest.dk", + "pinterest.ec", + "pinterest.engineering", + "pinterest.es", + "pinterest.fr", + "pinterest.hu", + "pinterest.id", + "pinterest.ie", + "pinterest.in", + "pinterest.info", + "pinterest.it", + "pinterest.jp", + "pinterest.kr", + "pinterest.map.fastly.net", + "pinterest.mx", + "pinterest.net", + "pinterest.nl", + "pinterest.nz", + "pinterest.pe", + "pinterest.ph", + "pinterest.pt", + "pinterest.ru", + "pinterest.se", + "pinterest.th", + "pinterest.tw", + "pinterest.uk", + "pinterest.vn", + "pinterestmail.com", + "pintool.com", + "pion.ac.uk", + "pionex.com", + "pipebots.ac.uk", + "pipii.tv", + "piposay.com", + "piraattilahti.org", + "piratecams.com", + "pirates-forum.org", + "pirbright.ac.uk", + "piring.com", + "pirouvr.com", + "piru.ac.uk", + "pise.pw", + "pitch-in.ac.uk", + "pittpatt.com", + "pivotalinitiative.com", + "piwheels.org", + "pixanalytics.com", + "pixapp.net", + "pixate.com", + "pixeldrain.com", + "pixelqi.com", + "pixfs.net", + "pixhost.to", + "pixinsight.com.tw", + "pixiv.co.jp", + "pixiv.me", + "pixiv.net", + "pixiv.org", + "pixlr-o-matic.com", + "pixlromatic.com", + "pixnet.cc", + "pixnet.in", + "pixnet.net", + "pixnet.pro", + "pixnet.tw", + "pixplug.in", + "pixtronix.com", + "pjbyj.top", + "pjful-app.lol", + "pjgirls.com", + "pk.com", + "pki-post.ch", + "pki-posta.ch", + "pki-poste.ch", + "pki.goog", + "placemix.com", + "placemyad.com.au", + "placesdocs.com", + "plala.or.jp", + "planetminecraft.com", + "planetsuzy.org", + "plansondemand.com", + "plant-phenomics.ac.uk", + "plantsvszombies2.com", + "plasticlabs.com", + "plastics-cadcam.com", + "platinumlinks.org", + "play-asia.com", + "play-bmm.shop", + "play-bmmer.buzz", + "play-fe.googleapis.com", + "play.googleapis.com", + "play4free.com", + "playapex.com", + "playartifact.com", + "playbar.biz", + "playbeasts.com", + "playboy.com", + "playboyplus.com", + "playbydurex.com", + "playcover.io", + "player.fm", + "playerjs.io", + "playforceone.com", + "playhearthstone.com", + "playmation.com", + "playmeow.com", + "playnintendo.com", + "playno1.com", + "playoverwatch.com", + "playparagon.com", + "playpcesor.com", + "playporngame.com", + "playporngames.com", + "playpornogames.com", + "plays.com.tw", + "playsexgames.xxx", + "playsexygame.com", + "playshow.io", + "playshowtv.com", + "playstation.com", + "playstation.net", + "playvalorant.com", + "playvids.com", + "playwarcraft3.com", + "playyoungtube.com", + "playz.jp", + "pldfscotland.ac.uk", + "pleasefuck.org", + "pleasurebabe.com", + "pleasuregirl.net", + "pleasuremore.com", + "plexvpn.pro", + "plixi.com", + "plm.org.hk", + "plos.org", + "plug-into.com", + "plug.game", + "plumperpass.com", + "plumpton.ac.uk", + "plumptononline.ac.uk", + "plunder.com", + "plurk.com", + "plus.ac.uk", + "plus.codes", + "plus28.com", + "plusbb.com", + "plusone8.com", + "plusporn.net", + "pluto.tv", + "plutotv.net", + "plym.ac.uk", + "plymouth-marine-laboratory.ac.uk", + "plymouth.ac.uk", + "plymouthart.ac.uk", + "plymouthcfe.ac.uk", + "plymsea.ac.uk", + "plzpf.com", + "pm.me", + "pmatehunter.com", + "pmates.com", + "pml.ac.uk", + "pms.ac.uk", + "pnas.org", + "po2b.com", + "pobieramy.top", + "pobl-content.com", + "pocketbiketrader.com", + "pocketcasts.com", + "podbean.com", + "podcast.app", + "podcast.co", + "podictionary.com", + "podium.ac.uk", + "poe.com", + "poecdn.net", + "pogo.com", + "pogobeta.com", + "poi.moe", + "point.ac.uk", + "pointblank.ac.uk", + "pointblankmusicschool.ac.uk", + "poisontube.com", + "pojapp.cfd", + "pojbayj1030.top", + "pojie7.com", + "pojiefuli20033.xyz", + "pojiefuli9113.xyz", + "pokedex3d.com", + "pokemon-moon.com", + "pokemon-sun.com", + "pokemon-sunmoon.com", + "pokemon-unitepgame.com", + "pokemon.com", + "pokemonbank.com", + "pokemonblackwhite.com", + "pokemonbw.com", + "pokemonchampionships.com", + "pokemongoldsilver.com", + "pokemonhome.com", + "pokemonletsgoeevee.com", + "pokemonletsgopikachu.com", + "pokemonmysterydungeon.com", + "pokemonpicross.com", + "pokemonplatinum.com", + "pokemonrubysapphire.com", + "pokemonsunmoon.com", + "pokemonswordshield.com", + "pokemonultrasunmoon.com", + "pokemonvgc.com", + "pokemonwifi.net", + "pokerstars.com", + "pokerstars.net", + "pokerstrategy.com", + "pol.ac.uk", + "political-science.ac.uk", + "politicalchina.org", + "politicalconsultation.org", + "politico.eu", + "politicsblog.ac.uk", + "politicsinaction.ac.uk", + "politiscales.net", + "poloniex.com", + "poly-of-wales.ac.uk", + "polygon.com", + "polymer-project.org", + "polymerhk.com", + "polymerproject.org", + "poms.ac.uk", + "pone.ac.uk", + "pontypridd.ac.uk", + "ponyanimalsex.com", + "poofetish.com", + "pooleacl.ac.uk", + "poolin.com", + "poop-pee.online", + "poopee-puke.com", + "poopeegirls.com", + "popcap.com", + "popjav.tv", + "popo.tw", + "popo8.com", + "popporn-world.com", + "popvote.hk", + "popxi.click", + "popyard.com", + "popyard.org", + "porcore.com", + "poringa.net", + "porkahd.co", + "porkbun.com", + "porm.club", + "porn-bokep.com", + "porn-comic.com", + "porn-discounts.com", + "porn-discounts.xxx", + "porn-gratis.info", + "porn-images-xxx.com", + "porn-list.site", + "porn-portal.com", + "porn-sex-video.me", + "porn-star.com", + "porn.biz", + "porn.com", + "porn.to", + "porn.xxx", + "porn2.com", + "porn2012.com", + "porn300.com", + "porn300.online", + "porn34.me", + "porn3dgalleries.com", + "porn4days.cc", + "porn4fap.com", + "porn5.com", + "porn555.com", + "porn5f.com", + "porn62.com", + "porn7.net", + "porn7.xxx", + "porn87.com", + "porn91.org", + "porn93.cc", + "pornachi.com", + "pornacho.com", + "pornadoo.com", + "pornaf.com", + "pornaffected.com", + "pornandxxxvideos.com", + "pornaroma.com", + "pornav.co", + "pornaxo.com", + "pornbase.org", + "pornbest.org", + "pornbit.cc", + "pornbl.com", + "pornbozz.com", + "pornbraze.com", + "pornburger.com", + "pornburst.xxx", + "porncana.com", + "porncoil.com", + "porncomics.com", + "porncomics.me", + "porncomixonline.net", + "porncore.net", + "porncoven.com", + "porncrash.com", + "porndabster.com", + "porndeals.com", + "porndeepfake.net", + "porndex.com", + "porndiamond.com", + "porndig.com", + "porndigger.me", + "porndiscount.org", + "porndiscounts.com", + "porndish.com", + "porndisk.com", + "pornditos.com", + "porndoe.com", + "porndoepremium.com", + "porndork.com", + "porndr.com", + "porndroids.com", + "porndude2.com", + "porndudecasting.com", + "pornelephant.com", + "pornenix.com", + "porner.tv", + "pornerbros.com", + "pornexpress.net", + "pornfactory.info", + "pornfhd.com", + "pornfidelity.com", + "pornfind.org", + "pornfinder.biz", + "pornflip.com", + "pornfoolery.com", + "pornfu.tv", + "pornfuck.net", + "pornfuror.com", + "porngames.club", + "porngames.com", + "porngames.games", + "porngames.tv", + "porngameshub.com", + "porngamesverse.com", + "porngeek.com", + "porngem.com", + "porngifs.xxx", + "porngladiator.com", + "porngo.com", + "porngo.tube", + "porngrabbz.com", + "porngub.com", + "pornguide.blog", + "pornguz.com", + "pornhail.com", + "pornhat.com", + "pornhat.one", + "pornhat.tv", + "pornhd.com", + "pornhd3x.tv", + "pornhd8k.net", + "pornhdfuck.com", + "pornhdtube.tv", + "pornhdvideos.tv", + "pornheed.com", + "pornheli.com", + "pornhits.com", + "pornhoho.com", + "pornhost.com", + "pornhub-deutsch.info", + "pornhub-deutsch.net", + "pornhub-german.com", + "pornhub-sexfilme.net", + "pornhub.com", + "pornhub.org", + "pornhub00.com", + "pornhubapparel.com", + "pornhubdeutsch.net", + "pornhubpremium.com", + "pornhubs.video", + "pornhubselect.com", + "pornhun.xyz", + "pornhutdeutsch.com", + "pornicom.com", + "pornid.xxx", + "pornimg.xyz", + "porniq.com", + "pornirani.com", + "pornjam.com", + "pornjav.org", + "pornjk.com", + "pornkai.com", + "pornkind.net", + "pornking.fun", + "pornkino.cc", + "pornkro.com", + "pornktube.com", + "pornky.com", + "pornlaundry.com", + "pornlegendsclub.com", + "pornlist18.com", + "pornlistdude.com", + "pornloser.com", + "pornlulu.com", + "pornluxme.com", + "pornma.com", + "pornmadeathome.com", + "pornmagnet.org", + "pornmaki.com", + "pornmaster.fun", + "pornmate.com", + "pornmaturetube.com", + "pornmd.com", + "pornmegaload.com", + "pornmemo.com", + "pornmm.net", + "pornmonde.com", + "pornmovies2.me", + "pornmoviescave.com", + "pornmz.com", + "pornmz.net", + "pornnetworkdeals.com", + "pornnut.com", + "porno-erotica.com", + "porno.org.in", + "porno365.net", + "porno365.website", + "porno49.com", + "pornoaid.com", + "pornoamateurlatino.net", + "pornobae.com", + "pornobengala.com", + "pornoboard.net", + "pornoboliviaxxx.com", + "pornobom.com.br", + "pornobox.net", + "pornobrasil.blog.br", + "pornobrasil.com", + "pornobrasil.org", + "pornobrasileiro.tv", + "pornobrasileiro.xyz", + "pornobuzz.net", + "pornocarioca.com", + "pornocaserotube.com", + "pornocd.ru", + "pornocomic.net", + "pornodanke.com", + "pornodoido.com", + "pornodrome.tv", + "pornoecuadorxxx.com", + "pornoelena.net", + "pornofiles.ru", + "pornofilmlist.com", + "pornofint.com", + "pornofrog.com", + "pornogayphy.com", + "pornogids.net", + "pornogram.xxx", + "pornogramxxx.com", + "pornogratis.vlog.br", + "pornogrund.com", + "pornohd.blue", + "pornohd.plus", + "pornohd.porn", + "pornohoo.com.mx", + "pornohut.info", + "pornohutdeutsch.net", + "pornoid.com", + "pornoincreible.com", + "pornoingyen.hu", + "pornoirado.com", + "pornoitaliano.com", + "pornojefe.com", + "pornojux.com", + "pornoko.net", + "pornokrol.com", + "pornolab.net", + "pornolaba.mobi", + "pornolandia.xxx", + "pornomasse.com", + "pornomineiro.com", + "pornomovies.mobi", + "pornone.com", + "pornoorzel.com", + "pornoprive.xxx", + "pornoreino.com", + "pornorips.com", + "pornos.live", + "pornoscanner.com", + "pornosex.cam", + "pornosfilmes.com", + "pornoslon.me", + "pornosphere.com", + "pornotime.net", + "pornotree.com", + "pornotron.net", + "pornotube.blog.br", + "pornotube69.nl", + "pornov1080.name", + "pornovenezolano.com.ve", + "pornovenezolanox.com", + "pornovideosfree.net", + "pornovideoshub.com", + "pornovideow.com", + "pornoweb.hu", + "pornoweb.win", + "pornoxo.com", + "pornozona.tv", + "pornpair.com", + "pornpander.com", + "pornpaw.com", + "pornpen.ai", + "pornper.com", + "pornpics.com", + "pornpost.net", + "pornpros.com", + "pornprosnetwork.com", + "pornproxy.app", + "pornqd.com", + "pornrabbit.com", + "pornrapidshare.com", + "pornreactor.cc", + "pornrips.cc", + "pornrox.com", + "pornscat.org", + "pornscum.com", + "pornsexer.com", + "pornshare.biz", + "pornsharing.com", + "pornsites.com", + "pornsites.xxx", + "pornsitesnow.com", + "pornsocket.com", + "pornsoldiers.com", + "pornsos.com", + "pornspark.com", + "pornstarbyface.com", + "pornstarclub.com", + "pornstreams.tv", + "pornstripgames.com", + "porntea.com", + "pornteen123.com", + "porntn.com", + "porntop.com", + "porntoplinks.com", + "porntrex.com", + "porntry.com", + "porntsunami.com", + "porntube.com", + "porntubenews.com", + "porntubent.com", + "porntv.com", + "porntvblog.com", + "pornuj.cz", + "pornultras.com", + "pornv.org", + "pornve.com", + "pornvibe.org", + "pornvideobb.com", + "pornvideos.casa", + "pornvideotop.com", + "pornvideotube.online", + "pornvidhd.club", + "pornvisit.com", + "pornwatchers.com", + "pornwebmasters.com", + "pornwhite.com", + "pornwhitelist.com", + "pornwild.to", + "pornworld.to", + "pornxnxxmovies.com", + "pornxp.com", + "pornxp.net", + "pornxp.org", + "pornxs.com", + "pornxvideos.tv", + "pornxvideos.win", + "pornxxxmovies.cc", + "pornxxxplace.com", + "pornxxxweb.com", + "pornyeah.com", + "pornyteen.com", + "pornzog.com", + "pornzone.com", + "porstoporno.site", + "port.ac.uk", + "port25.biz", + "portablevpn.nl", + "portfolio.ac.uk", + "portfoliowall.com", + "porth.ac.uk", + "portland.ac.uk", + "portsmouth-college.ac.uk", + "portsmouth.ac.uk", + "portsmouthuni.ac.uk", + "porzo.com", + "porzo.tv", + "poshtestgallery.cloudapp.net", + "poshtestgallery.com", + "positivessl.com", + "poskotanews.com", + "post01.com", + "post76.com", + "post852.com", + "postadult.com", + "postegro.it", + "postgrad.ac.uk", + "postgraducas.ac.uk", + "postgresql.org", + "postimages.org", + "postimg.cc", + "postimg.org", + "postini.com", + "posty.kr", + "postyourgirls.ws", + "potato.im", + "potenza.jp", + "potteries.ac.uk", + "potterieseducationaltrust.ac.uk", + "potvpn.com", + "pourquoi.tw", + "poverty.ac.uk", + "povpornonly.com", + "povr.com", + "pow.ac.uk", + "power.com", + "poweranimator.com", + "powerapple.com", + "powerappscdn.net", + "powerautomate.com", + "powerbeats2wireless.com", + "powerbeatsbydrdre.com", + "powerbeatsbydre.com", + "powerbi.com", + "powerbook.eu", + "powercx.com", + "poweredbyintel.com", + "powerelectronics.ac.uk", + "powerinspect.com", + "powermill.com", + "powermillna.com", + "powerofresolve.ca", + "powerofresolve.com", + "powerphoto.org", + "powerpointninja.com", + "powershape-e.com", + "powershape.com", + "powershellgallery.com", + "powersunitedvr.com", + "powia.ac.uk", + "pp-soc.com", + "pp.ru", + "pp6.info", + "pparc.ac.uk", + "ppaypal.com", + "ppb-mod.buzz", + "ppe.lawyer", + "pplah.com", + "pplusstatic.com", + "ppp91.cc", + "pppds.com", + "ppre.ac.uk", + "ppy.sh", + "practicalbusinessskills.com", + "practicalmoneyskills.ca", + "practicalmoneyskills.jp", + "practicum.ac.uk", + "pramu.ac.uk", + "prastitutki.ru", + "prayforchina.net", + "pre-bmwgroup.jobs", + "predictivetechnologies.com", + "premeforwindows7.com", + "premia.ac.uk", + "premium-beauty.com", + "premiumfs.de", + "premiumhd.net", + "premiumpornlist.com", + "premobay.com", + "premproxy.com", + "preprod-publicca.googleapis.com", + "prepsure.com", + "prescribe.ac.uk", + "prescribingsafetyassessment.ac.uk", + "presentationzen.com", + "presidencylondoncollege.ac.uk", + "presidentlee.tw", + "press.vin", + "pressreader.com", + "prestige-av.com", + "preston.ac.uk", + "prestoncoll.ac.uk", + "pretty-ass.xyz", + "prettynubiles.com", + "prettyvirgin.com", + "priceless.com", + "priceless.org", + "pricelessafrica.com", + "pricelessarabia.com", + "pricelessaruba.com", + "pricelessbeijing.com", + "pricelesshongkong.com", + "pricelesshonolulu.com", + "pricelessmarketingengine.com", + "pricelesspick.com", + "pricelesssantiago.com", + "pricelesssurprises.com", + "pricelesssydney.com", + "pricelesstoronto.ca", + "pricelesstv.com", + "priconne-redive.jp", + "pride.google", + "pridetube.com", + "priestley.ac.uk", + "priestleycollege.ac.uk", + "prifysgolioncymru.ac.uk", + "primarygoal.ac.uk", + "prime-video.com", + "primecurves.com", + "primeday.info", + "primeindianporn.com", + "primematures.com", + "primepornlist.com", + "primevideo.cc", + "primevideo.com", + "primevideo.info", + "primevideo.org", + "primevideo.tv", + "princesscum.com", + "princeton.edu", + "principlesinpatterns.ac.uk", + "printeron.com", + "printersetupsupport.com", + "printfriendly.com", + "printspots.com", + "printspots.net", + "prioned.ac.uk", + "prism-break.org", + "prism.ac.uk", + "prismic.io", + "prismlauncher.org", + "prismlive.com", + "prisoneralert.com", + "pritunl.com", + "privacybox.de", + "privacysandbox.com", + "privacysimplified.com", + "privacytools.io", + "private.com", + "privatebrowsingmyths.com", + "privatecasting-x.com", + "privateclassics.com", + "privateinternetaccess.com", + "privatemarketplaces.net", + "privatemarketplaces.us", + "privatepaste.com", + "privatetunnel.com", + "privatevoyeurvideos.com", + "privatevpn.com", + "privelt.ac.uk", + "privilege.hk", + "privilege.tw", + "privoxy.org", + "proactivebackend-pa.googleapis.com", + "procat.ac.uk", + "procatdigital.ac.uk", + "procatstudent.ac.uk", + "procopytips.com", + "proctoscopeexam.com", + "prodrive-japan.com", + "product.co.jp", + "productivemargins.ac.uk", + "profile.ac.uk", + "profilemaster.com", + "profreeporno.com", + "programme3.ac.uk", + "prohashing.com", + "project-syndicate.org", + "projectapex.com", + "projectara.com", + "projectbaseline.com", + "projecteuclid.org", + "projectjav.com", + "projectmurphy.net", + "projectpoint.com", + "projectpoint.net", + "projectsangam.com", + "projectshoreline.com", + "projectvasari.com", + "projectvoyeur.com", + "promonsterbeatsbydre.com", + "promotingpartnership.ac.uk", + "proms.ac.uk", + "pron.guru", + "propagandastudies.ac.uk", + "property.com.au", + "propertysex.com", + "proporn.com", + "proptiger.com", + "proquest.com", + "pros.ee", + "prosiben.de", + "prospects.ac.uk", + "prostoporno.net", + "prostores.com", + "prostudiobeatscybersale.com", + "proteus.ac.uk", + "prothots.com", + "proton.me", + "protondb.com", + "protonmail.ch", + "protonmail.com", + "protonstatus.com", + "protonvpn.com", + "proudman-oceanographic-lab.ac.uk", + "provide.ac.uk", + "provideocoalition.com", + "provpnaccounts.com", + "prowe.ac.uk", + "proxfree.com", + "proxifier.com", + "proxlet.com", + "proxomics.ac.uk", + "proxomitron.info", + "proxpn.com", + "proxy.org", + "proxy1.xyz", + "proxyadult.org", + "proxyanonimo.es", + "proxydns.com", + "proxylist.org.uk", + "proxynetwork.org.uk", + "proxypy.net", + "proxyrarbg.org", + "proxyroad.com", + "proxytunnel.net", + "proyectoclubes.com", + "prozz.net", + "prpops.com", + "prs-ltsn.ac.uk", + "prts.plus", + "prucomm.ac.uk", + "ps-exchange.com", + "psa.ac.uk", + "psblog.name", + "psc.ac.uk", + "pscdn.co", + "psci-com.ac.uk", + "pscp.tv", + "psds.ac.uk", + "pse.is", + "psg-int-centralus.cloudapp.net", + "psg-int-eastus.cloudapp.net", + "pshvpn.com", + "psigate.ac.uk", + "psiphon.ca", + "psiphon3.com", + "psiphontoday.com", + "pssru.ac.uk", + "pstatic.net", + "pstorage.space", + "psyccareers.com", + "pt.im", + "ptapjmp.com", + "pts.org.tw", + "ptt.cc", + "ptt.sex", + "ptt2.cc", + "ptt3.cc", + "pttgame.com", + "ptthito.com", + "pttvan.org", + "pttweb.cc", + "pttyes.com", + "ptzwx.com", + "pu82.vip", + "pub.dev", + "public-sex-porn.com", + "public-trust.com", + "publicagentxxx.com", + "publicca.googleapis.com", + "publicengagement.ac.uk", + "publicinterest.ac.uk", + "publicpornvideo.com", + "publicservices.ac.uk", + "publicsexhub.com", + "publicspace.ac.uk", + "publishproxy.com", + "pubmatic.co.jp", + "pubmatic.com", + "pubu.com.tw", + "puffin.com", + "puffinbrowser.com", + "puffstore.com", + "pugetsoundbmw.com", + "pugetsoundmini.com", + "pugpig-dev.com", + "pugpig-stage.com", + "pugpig.com", + "pullfolio.com", + "pullstring.net", + "pulsebrowser.app", + "punishbang.com", + "punishworld.com", + "punjab.gov.in", + "punjab.gov.pk", + "punyu.com", + "puppiesofourtime.ac.uk", + "pure18.com", + "pureapk.com", + "pureconcepts.net", + "pureinsight.org", + "purelov5.com", + "purelyceleb.com", + "purenudism.com", + "purepdf.com", + "puretaboo.com", + "purevpn.com", + "purextc.com", + "puripuriunkomura.com", + "purplelotus.org", + "pursglove.ac.uk", + "pursuestar.com", + "pururin.to", + "pushchinawall.com", + "pussthecat.org", + "pussy-pics.net", + "pussy3dporn.com", + "pussyboy.net", + "pussymomsex.com", + "pussyporntubes.com", + "pussysexgames.com", + "pussyshine.info", + "pussyspace.com", + "pussyspace.net", + "putihome.org", + "putinho.net", + "putlocker.com", + "putty.org", + "puuko.com", + "pvp.net", + "pvp.tv", + "pvt.sexy", + "pvue1.com", + "pvue2.com", + "pvzgw2.com", + "pvzheroes.com", + "pwabuilder.com", + "pwmnet.com", + "pwned.com", + "pwnedpasswords.com", + "pximg.net", + "pxt.io", + "pycon.org", + "pypa.io", + "pypi.io", + "pypi.org", + "pypl.com", + "pypl.info", + "pypl.net", + "pypl.tv", + "pyrobot.org", + "python.com", + "python.com.tw", + "python.org", + "pythonhackers.com", + "pythonhosted.org", + "pythonic.life", + "pytorch.org", + "pzforever.skin", + "pzforever01.homes", + "pzhanfor.today", + "q10.jp", + "q13.com", + "q13fox.com", + "qaa.ac.uk", + "qac.ac.uk", + "qacollege.ac.uk", + "qanote.com", + "qatarescortsvip.com", + "qattdh.cc", + "qattdh.top", + "qattdh1.cc", + "qattdh2.cc", + "qattdh6.top", + "qbittorrent.org", + "qbmengmei6.mom", + "qbsc.ac.uk", + "qcmod.xyz", + "qctconnect.com", + "qdiehzz7.me", + "qeliz.ac.uk", + "qgirl.com.tw", + "qhigh.com", + "qi-gong.me", + "qianbai.tw", + "qiandao.today", + "qiangwaikan.com", + "qiangyou.org", + "qidian.ca", + "qienkuen.org", + "qinav.com", + "qingse.one", + "qise100.com", + "qiwen.lu", + "qixianglu.cn", + "qkshare.com", + "qlink.to", + "qmap.pub", + "qmbsc.ac.uk", + "qmc.ac.uk", + "qmced.ac.uk", + "qml.ac.uk", + "qmov.com", + "qmov.net", + "qmpgmc.ac.uk", + "qmttqg3k.me", + "qmu.ac.uk", + "qmuc.ac.uk", + "qmul.ac.uk", + "qmw.ac.uk", + "qmzdd.com", + "qnap.com", + "qombol.com", + "qoo10.jp", + "qooqlevideo.com", + "qoos.com", + "qorno.com", + "qoru.ac.uk", + "qpoe.com", + "qporno.xxx", + "qprize.com", + "qq.co.za", + "qqbs.asia", + "qqbs.work", + "qr.ae", + "qsi.ac.uk", + "qso.ac.uk", + "qstatus.com", + "qt-project.org", + "qt.io", + "qtlglb.com", + "qtrac.eu", + "qtweeter.com", + "quadram.ac.uk", + "quadraminstitute.ac.uk", + "quadrat.ac.uk", + "qualcomm-email.com", + "qualcomm.co.id", + "qualcomm.co.in", + "qualcomm.co.jp", + "qualcomm.co.kr", + "qualcomm.co.uk", + "qualcomm.com", + "qualcomm.com.br", + "qualcomm.com.tw", + "qualcomm.de", + "qualcomm.fr", + "qualcommhalo.com", + "qualcommlabs.com", + "qualcommmea.com", + "qualcommretail.com", + "qualcommventures.cn", + "qualcommventures.com", + "qualidata.ac.uk", + "qualphone.com", + "quanben-xiaoshuo.com", + "quanben.io", + "quannengshen.org", + "quantic.ac.uk", + "quantil.com", + "quantitativemethods.ac.uk", + "quantumbooter.net", + "quatrowireless.com", + "quatrum.com.br", + "quay.io", + "quayside.ac.uk", + "qub.ac.uk", + "queens-belfast.ac.uk", + "queens.ac.uk", + "queensu.ac.uk", + "quercus.ac.uk", + "questvisual.com", + "quicinc.com", + "quickconnect.to", + "quickiepage.com", + "quickoffice.com", + "quicktake.video", + "quicktime.cc", + "quicktime.com", + "quicktime.com.au", + "quicktime.eu", + "quicktime.net", + "quicktime.tv", + "quiksee.com", + "quiltmc.org", + "quip-cdn.com", + "quip.com", + "quipelements.com", + "quitccp.net", + "quitccp.org", + "quiz.directory", + "qumingwz.com", + "qumrancavesdispersed.ac.uk", + "quora.com", + "quoracdn.net", + "quotable.com", + "quovadisglobal.com", + "quran.com", + "quranexplorer.com", + "qusi8.net", + "qutebrowser.org", + "qvodzy.org", + "qwant.com", + "qwant.de", + "qwant.fr", + "qwant.it", + "qwapi.com", + "qx.net", + "qxbbs.org", + "qysg.cc", + "qysg7.buzz", + "qysg8.buzz", + "qz.com", + "qzav.tv", + "r-project.org", + "r0.ru", + "r10s.com", + "r10s.jp", + "r18.com", + "r18av.com", + "r18lu-avi.shop", + "r18lu.com", + "r34porn.net", + "ra-review.ac.uk", + "ra.gg", + "raa.ac.uk", + "rabbitscams.com", + "rabbitscams.sex", + "rabbitsreviews.com", + "rac.ac.uk", + "racals.ac.uk", + "racc.ac.uk", + "racked.com", + "rad-sat.ac.uk", + "rada.ac.uk", + "radeon.com", + "radian6.com", + "radicalparty.org", + "radiko.jp", + "radio-canada.ca", + "radio.garden", + "radioaustralia.net.au", + "radiofarda.com", + "radiohilight.net", + "radioline.co", + "radiomango.fm", + "radiomarsho.com", + "radioresearch.ac.uk", + "radiosvoboda.org", + "radiotavisupleba.ge", + "radiotime.com", + "radiovaticana.org", + "radiovncr.com", + "radiyoyacuvoa.com", + "rae.ac.uk", + "rael.org", + "raft.ac.uk", + "raggedbanner.com", + "raidcall.com.tw", + "raidtalk.com.tw", + "rainbowplan.org", + "raindrop.io", + "raizoji.or.jp", + "rajwaphq.com", + "rakuten-static.com", + "rakuten.ca", + "rakuten.co.jp", + "rakuten.com", + "rakuten.com.tw", + "rakuten.ne.jp", + "rakuten.tw", + "rakuya.com.tw", + "ram.ac.uk", + "ramcity.com.au", + "randd.ac.uk", + "randomsystems-cdt.ac.uk", + "randyblue.com", + "rangwang.biz", + "rangzen.com", + "rangzen.net", + "rangzen.org", + "ranranhome.info", + "ranxiang.com", + "ranyunfei.com", + "rapbull.net", + "rapefilms.net", + "rapetube.me", + "rapid.ac.uk", + "rapidmoviez.com", + "rapidprototyping-cadcam.com", + "rapidssl.com", + "rapidvpn.com", + "raponlinereview.com", + "raratutor.ac.uk", + "rarbg.is", + "rarbg.me", + "rarbg.to", + "rarbgaccess.org", + "rarbgaccessed.org", + "rarbgget.org", + "rarbggo.org", + "rarbgmirror.com", + "rarbgmirror.org", + "rarbgproxy.org", + "rarbgprx.org", + "rarbgto.org", + "rarbgunblock.com", + "rarbgunblock.org", + "rarbgunblocked.org", + "rarbgway.org", + "raremovie.cc", + "raremovie.net", + "rareview.ac.uk", + "ras.ac.uk", + "rascal.ac.uk", + "rascommunity.ac.uk", + "raspberrypi.org", + "raspbian.org", + "rat.xxx", + "ratedgross.com", + "rateyourmusic.com", + "rationalwiki.org", + "ratx.com", + "rau.ac.uk", + "rave.ac.uk", + "ravemedia.ac.uk", + "ravensbourne.ac.uk", + "ravensbourneuniversitylondon.ac.uk", + "ravm.tv", + "rawgit.com", + "rawgithub.com", + "raxcdn.com", + "razer.com", + "razerofficial.com", + "razersupport.com", + "razerzone.jp", + "razyboard.com", + "rb-crisis.com", + "rb.com", + "rb.gy", + "rb.net", + "rbbusinessshop.com", + "rbc007.com", + "rbdigitalab.com", + "rbdigitallab.com", + "rbe996.com", + "rbeopp.com", + "rbeuroinfo.com", + "rbge.ac.uk", + "rbgkew.ac.uk", + "rbgrads.com", + "rbgraduates.com", + "rbmavericks.com", + "rbnainternational.com", + "rbplc.com", + "rbrandlibrary.com", + "rbsgr.com", + "rbsl.ac.uk", + "rbslondon.ac.uk", + "rbspeakup.com", + "rc-harwell.ac.uk", + "rca.ac.uk", + "rcahmw.ac.uk", + "rcc.ac.uk", + "rcds.ac.uk", + "rcem.ac.uk", + "rcinet.ca", + "rcl.ac.uk", + "rcl07.xyz", + "rclon.com", + "rcm.ac.uk", + "rcnde.ac.uk", + "rcni.ac.uk", + "rcoa.ac.uk", + "rcog.ac.uk", + "rcophth.ac.uk", + "rcp.ac.uk", + "rcpch.ac.uk", + "rcpe.ac.uk", + "rcplondon.ac.uk", + "rcpnorth.ac.uk", + "rcpsg.ac.uk", + "rcpsglasg.ac.uk", + "rcpsych.ac.uk", + "rcr.ac.uk", + "rcs.ac.uk", + "rcsed.ac.uk", + "rcseng.ac.uk", + "rcuk.ac.uk", + "rcukssc.ac.uk", + "rcvs.ac.uk", + "rd.com", + "rdf.ac.uk", + "rdg.ac.uk", + "rdi.ac.uk", + "rdio.com", + "rdmrsc.ac.uk", + "rdnet.ac.uk", + "rds-yes.buzz", + "rdtcdn.com", + "re-net.ac.uk", + "re25.vip", + "rea-asia.com", + "rea-group.com", + "rea.design", + "rea.global", + "rea.io", + "rea.tech", + "reabble.com", + "reach.ac.uk", + "reachingwider.ac.uk", + "reachporn.com", + "reachtheworldonfacebook.com", + "react.com", + "reactjs.com", + "reactjs.org", + "read01.com", + "read100.com", + "readerswivesonline.com", + "reading-college.ac.uk", + "reading.ac.uk", + "readingosi.ac.uk", + "readingtimes.com.tw", + "readmoo.com", + "readthedocs-hosted.com", + "readthedocs.com", + "readthedocs.io", + "readthedocs.org", + "readydown.com", + "readytoresearch.ac.uk", + "real-homemade-movies.com", + "real-mature-porn.com", + "real-thaipussy.com", + "realamericanstories.com", + "realamericanstories.info", + "realamericanstories.net", + "realamericanstories.org", + "realamericanstories.tv", + "realcaledonian.ac.uk", + "realclear.com", + "realclearbooks.com", + "realcleardefense.com", + "realcleareducation.com", + "realclearenergy.org", + "realclearfoundation.org", + "realclearhealth.com", + "realclearhistory.com", + "realclearinvestigations.com", + "realclearlife.com", + "realclearmarkets.com", + "realclearpolicy.com", + "realclearpolitics.com", + "realclearpublicaffairs.com", + "realclearreligion.org", + "realclearscience.com", + "realclearworld.com", + "realcommercial.com.au", + "realcourage.org", + "realcuckoldsex.com", + "realdoll.com", + "realestate.com.au", + "realestatejournal.com", + "realgfporn.com", + "realisingopportunities.ac.uk", + "reality-computing.com", + "realitykings.com", + "reallesbianexposed.com", + "reallifemethods.ac.uk", + "realmaturesfuck.com", + "realmilwaukeenow.com", + "realpeople-realprojects.com", + "realpeoplerealprojects.com", + "realpornclip.com", + "realraptalk.com", + "realsexdoll.com", + "realsexpass.com", + "realteengirls.com", + "realtor.com", + "realtype.co.jp", + "realtype.jp", + "realvision.com", + "realviz.com", + "realzoomovies.com", + "reap.ac.uk", + "reaseheath.ac.uk", + "reason.com", + "reastatic.net", + "reaxys.com", + "rebates.jp", + "rebatesrule.net", + "rebrandly.com", + "rebuildingmacroeconomics.ac.uk", + "recaptcha.net", + "recelebrity.com", + "reckitt.net", + "reckittbenckiser.com", + "reckittbenckiser.net", + "reckittbenckiser.tv", + "reckittprofessional.com", + "recode.net", + "recoiljs.org", + "reconinstruments.com", + "reconjet.com", + "recordhistory.org", + "recordingachievement.ac.uk", + "recovery.org.tw", + "recoveryversion.com.tw", + "recoveryversion.org", + "red-lang.org", + "redamateurtube.com", + "redballoonsolidarity.org", + "redbridge-college.ac.uk", + "redbridge-iae.ac.uk", + "redbridge.ac.uk", + "redbridgeinstitute.ac.uk", + "redbubble.com", + "redcar.ac.uk", + "redchinacn.net", + "redchinacn.org", + "redcliffe.ac.uk", + "redd.it", + "reddit.com", + "reddit.map.fastly.net", + "redditblog.com", + "reddithelp.com", + "redditinc.com", + "redditlist.com", + "redditmail.com", + "redditmedia.com", + "redditspace.com", + "redditstatic.com", + "redditstatus.com", + "redfaptube.com", + "redgifs.com", + "redhat.com", + "redhat.org", + "redhdtube.xxx", + "redhotlabs.com", + "redino.tw", + "redis.io", + "redislabs.com", + "redkix.com", + "redlightcenter.com", + "redmatureporn.com", + "redporn.xxx", + "redporno.cz", + "redpornpictures.com", + "redsexhub.com", + "redteenporn.com", + "redtub3xxx.com", + "redtube.blog", + "redtube.com", + "redtube.com.br", + "redtube9.com", + "redtubepremium.com", + "redvideo.io", + "redwap-xxx.com", + "redwap.me", + "redwap.pro", + "redxxx.cc", + "redxxxvideo.tv", + "redzonechannel.com", + "ree007.xyz", + "reednet.ac.uk", + "ref.ac.uk", + "referer.us", + "reflectivecode.com", + "reform-apple.com", + "refrain.ac.uk", + "regard.ac.uk", + "regener8.ac.uk", + "regent-academy.ac.uk", + "regent-college.ac.uk", + "regentcollegelondon.ac.uk", + "regents-tc.ac.uk", + "regents.ac.uk", + "regentscollege.ac.uk", + "regex101.com", + "regional-studies-assoc.ac.uk", + "regionalhpc.ac.uk", + "regionalsciencecentreoldham.ac.uk", + "regionalvisions.ac.uk", + "regiongold.com", + "registerhulu.com", + "registeridm.com", + "registry.google", + "reid-kerr.ac.uk", + "reidkerr.ac.uk", + "reigate.ac.uk", + "reiporno.com", + "relateinstitute.ac.uk", + "relateiq.com", + "relaxbbs.com", + "relay.com.tw", + "releaseinternational.org", + "religionnews.com", + "religioustolerance.org", + "reload.ac.uk", + "relu.ac.uk", + "rememberingslavery.ac.uk", + "remirepo.net", + "rems-cdt.ac.uk", + "renaissanceskin.ac.uk", + "renchead.com", + "renderos.com", + "reneerossvideos.com", + "renminbao.com", + "renovacionoffice.com", + "renovacionxboxlive.com", + "rentaride.com", + "rentaride.de", + "renu.ac.uk", + "renyurenquan.org", + "renzhe.cloud", + "repe21.com", + "repo.new", + "repositorynet.ac.uk", + "repsils.no", + "repsneakermall.com", + "repswing.com", + "rerc.ac.uk", + "rerouted.org", + "resao.com", + "research-clinician.ac.uk", + "research-councils.ac.uk", + "research-scotland.ac.uk", + "research-socialsciences.ac.uk", + "research.google", + "research4justice.ac.uk", + "researchandcare.org", + "researchconcordat.ac.uk", + "researchers14.ac.uk", + "researchgate.net", + "researchintel.com", + "researchkit.hk", + "researchkit.net", + "researchkit.org", + "researchkit.tv", + "researchscotland.ac.uk", + "researchwales.ac.uk", + "resilient-decarbonised-energy-cdt.ac.uk", + "resilient-decarbonised-energy-dtc.ac.uk", + "resilio.com", + "resistchina.org", + "resl.ac.uk", + "resoubanana.buzz", + "resoubang.buzz", + "resourceshare.ac.uk", + "respawnbyrazer.com", + "restore.ac.uk", + "results.ac.uk", + "rethink.net", + "retimer.com", + "retroclassicporn.com", + "retrohomevideos.com", + "retroxxxmovs.com", + "retweeteffect.com", + "retweetist.com", + "retweetrank.com", + "reurl.cc", + "reut.rs", + "reuters.com", + "reuters.tv", + "reutersagency.cn", + "reutersmedia.net", + "revenue-performance-management.com", + "revit.com", + "revitcc.com", + "revitsucks.net", + "revleft.com", + "revocationcheck.com", + "revolv.com", + "revver.com", + "rewind.ac.uk", + "rewrite-anime.tv", + "rexcha.com", + "rexxx.org", + "rfa.org", + "rfachina.com", + "rfamobile.org", + "rfaweb.org", + "rfdc.ac.uk", + "rferl.org", + "rfhsm.ac.uk", + "rfi.ac.uk", + "rfi.fr", + "rfi.my", + "rgo.ac.uk", + "rgpub.io", + "rgu.ac.uk", + "rh.ac.uk", + "rhacc.ac.uk", + "rhbnc.ac.uk", + "rhcda-aac.ac.uk", + "rhees.ac.uk", + "rhfc.ac.uk", + "rhodeislandbmw.com", + "rhs.ac.uk", + "rhul.ac.uk", + "rhyac.ac.uk", + "rhyw.me", + "rhyw31.life", + "ri.ac.uk", + "ricefever.com", + "richardtaunton.ac.uk", + "richardtaunton6thformcollege.ac.uk", + "richardtauntons.ac.uk", + "richardwilsononline.ac.uk", + "richmond-utcoll.ac.uk", + "richmond.ac.uk", + "richmondbusinessschool.ac.uk", + "richuish.ac.uk", + "ridepenguin.com", + "riding.ac.uk", + "right-2.ac.uk", + "rightbtc.com", + "rightster.com", + "rigpa.org", + "rigums.xyz", + "riku.me", + "rileyguide.com", + "rimg.com.tw", + "rin.ac.uk", + "ring.gr.jp", + "rinvdh7.xyz", + "riot-games.com", + "riot.com", + "riot.im", + "riot.net", + "riotcdn.net", + "riotforgegames.com", + "riotgames.co.kr", + "riotgames.com", + "riotgames.info", + "riotgames.jp", + "riotgames.net", + "riotgames.tv", + "riotpin.com", + "riotpoints.com", + "ripe.net", + "ripon-cuddesdon.ac.uk", + "ripple.com", + "riscl.ac.uk", + "riseholme.ac.uk", + "riseup.net", + "risextube.com", + "ritouki.jp", + "ritter.vg", + "riverside.ac.uk", + "riversidecollege.ac.uk", + "riversidecollegehalton.ac.uk", + "riversidemusiccollege.ac.uk", + "rivic.ac.uk", + "rixcloud.com", + "rixcloud.us", + "rjgsp.buzz", + "rjgsp1.buzz", + "rk.com", + "rl.ac.uk", + "rlcdn.com", + "rlczdo.xyz", + "rlg.ac.uk", + "rln.ac.uk", + "rlo-cetl.ac.uk", + "rluk.ac.uk", + "rlwlw.com", + "rm2029.com", + "rma.ac.uk", + "rmas.ac.uk", + "rmbl.ws", + "rmjdw.com", + "rmjdw132.info", + "rnc.ac.uk", + "rncb.ac.uk", + "rncm.ac.uk", + "rnib-redhill.ac.uk", + "rnibcollege.ac.uk", + "rnibncw.ac.uk", + "rnibvocoll.ac.uk", + "rnn.ac.uk", + "rnngroup.ac.uk", + "ro89.com", + "road-crew.com", + "roadshow.hk", + "robobat.com", + "roboforex.com", + "roborecall.com", + "robotoffice.com", + "robustnessiskey.com", + "rochdalesfc.ac.uk", + "rocket-inc.net", + "rocketbbs.com", + "rocketfishproducts.com", + "rockettube.com", + "rocksdb.com", + "rocksdb.net", + "rocksdb.org", + "rocksextube.com", + "rockstargames.com", + "rodbaston.ac.uk", + "roe.ac.uk", + "roedu.net", + "roehampton-online.ac.uk", + "roehampton.ac.uk", + "roffeypark.ac.uk", + "roisolutions.ac.uk", + "rojo.com", + "roku.com", + "rokutime.com", + "rolfoundation.org", + "rolia.net", + "rolls-roycecullinan.com", + "rolls-roycemotorcars.com", + "rolls-roycemotorcarsna.com", + "roloflix.com", + "roloxxx.com", + "rolsociety.org", + "romanrepublic.ac.uk", + "romansocietyrac.ac.uk", + "romantic-sex-video.com", + "romeo.ac.uk", + "ronjoneswriter.com", + "roodo.com", + "root-signing.ch", + "rootsigning.com", + "rosechina.net", + "rosemarydoll.com", + "rosemount.ac.uk", + "roses.ac.uk", + "rosetta.ac.uk", + "roshy.tv", + "roslin.ac.uk", + "rothamsted.ac.uk", + "rotherham-coll.ac.uk", + "rotherham.ac.uk", + "rothervalley.ac.uk", + "rotten.com", + "rou.video", + "roucdn.link", + "roudao6.buzz", + "roudaosp.cc", + "roughebonysex.com", + "roughman.net", + "roundtable.ac.uk", + "routerboard.com", + "routesintolanguages.ac.uk", + "routledgehandbooks.com", + "rowett.ac.uk", + "rowleycollege.ac.uk", + "royagcol.ac.uk", + "royal-institution.ac.uk", + "royalacademyofmusic.ac.uk", + "royalarmouries.ac.uk", + "royalcams.com", + "royalholloway.ac.uk", + "royalhollowaycommunication.ac.uk", + "royalhollowaycommunications.ac.uk", + "royalhollowayinternational.ac.uk", + "royalhollowayuniforum.ac.uk", + "royalmarsdenschool.ac.uk", + "royalsoc.ac.uk", + "royalsociety.ac.uk", + "royalsocietypublishing.org", + "royce-institute.ac.uk", + "royce.ac.uk", + "roysocmed.ac.uk", + "rpglogs.com", + "rplay.live", + "rpmfusion.org", + "rprimelab.com", + "rps.ac.uk", + "rrl28.buzz", + "rrs1.xyz", + "rrtis.com", + "rs1024.com", + "rs2022.com", + "rsa-ls.ac.uk", + "rsamd.ac.uk", + "rsc-cymru.ac.uk", + "rsc-east-midlands.ac.uk", + "rsc-east.ac.uk", + "rsc-eastern.ac.uk", + "rsc-em.ac.uk", + "rsc-london.ac.uk", + "rsc-ne-scotland.ac.uk", + "rsc-ni.ac.uk", + "rsc-north.ac.uk", + "rsc-northern.ac.uk", + "rsc-northwest.ac.uk", + "rsc-scotland.ac.uk", + "rsc-south-east.ac.uk", + "rsc-southeast.ac.uk", + "rsc-sw-scotland.ac.uk", + "rsc-wales.ac.uk", + "rsc-westmidlands.ac.uk", + "rsc-wm.ac.uk", + "rsc-yh.ac.uk", + "rsc-yorkshire-humber.ac.uk", + "rsc-yorkshire-humberside.ac.uk", + "rsc.org", + "rscem.ac.uk", + "rsd-exeter.ac.uk", + "rsdlmonitor.com", + "rse.ac.uk", + "rsf-chinese.org", + "rsf.org", + "rsg.sc", + "rsgamen.org", + "rslg.ac.uk", + "rslondon.ac.uk", + "rslp.ac.uk", + "rsm.ac.uk", + "rsms.ac.uk", + "rsp.ac.uk", + "rspao.com", + "rsshub.app", + "rssing.com", + "rssmeme.com", + "rstatic.net", + "rt.com", + "rtalabel.org", + "rthk.hk", + "rthk.org.hk", + "rti.org.tw", + "rti.tw", + "rtings.com", + "rtycminnesota.org", + "rua-project.ac.uk", + "ruanyifeng.com", + "ruby-lang.org", + "rubygems.org", + "rude.com", + "rugby-coll.ac.uk", + "rugby-college.ac.uk", + "rugby.ac.uk", + "rugbycoll.ac.uk", + "rugit.ac.uk", + "ruinedking.com", + "rukoebxx.com", + "rukor.org", + "rul.ac.uk", + "rulaisc-tv.buzz", + "rule34.xxx", + "rule34h.com", + "rule34pornvids.com", + "rule34video.com", + "ruleporn.com", + "rumah123.com", + "rumble.com", + "run.app", + "runbtx.com", + "runfission.com", + "runnike.com", + "runningnike.com", + "runporn.com", + "runshaw.ac.uk", + "runshawcollege.ac.uk", + "runwayescorts.com", + "rupress.org", + "ruru.ac.uk", + "rus.ec", + "rushbee.com", + "rushporn.online", + "rushporn.xxx", + "ruskin.ac.uk", + "russell-group.ac.uk", + "russellgroup.ac.uk", + "russianrape.org", + "rust-lang.org", + "rustdesk.com", + "rustup.rs", + "rusvpn.com", + "rutc.ac.uk", + "ruten.com.tw", + "rutherford.ac.uk", + "rutlandcollege.ac.uk", + "rutracker.net", + "rutracker.org", + "rutube.ru", + "ruvideos.net", + "ruyiseek.com", + "rvc.ac.uk", + "rwcmd.ac.uk", + "rxhj.net", + "ryokoyomiuri.co.jp", + "s-bluemix.net", + "s-books.com", + "s-cashonmobile.com", + "s-cat.ac.uk", + "s-cheshire.ac.uk", + "s-cute.com", + "s-dc-msedge.net", + "s-devon.ac.uk", + "s-dragon.org", + "s-microsoft.com", + "s-msedge.net", + "s-msft.com", + "s-msn.com", + "s-nbcnews.com", + "s-rewards.hk", + "s-xoom.com", + "s.team", + "s1heng.com", + "s1s1s1.com", + "s2stagehance.com", + "s3-accelerate.amazonaws.com", + "s3-ap-northeast-1.amazonaws.com", + "s3-ap-southeast-2.amazonaws.com", + "s3.amazonaws.com", + "s3.ap-northeast-1.amazonaws.com", + "s4miniarchive.com", + "s81c.com", + "s8ds5gfm.xyz", + "s8forum.com", + "saasexch.com", + "saasexch.io", + "saboom.com", + "sabuibo.net", + "sac.ac.uk", + "sacduc.com", + "sacks.com", + "saclnet.ac.uk", + "sacom.hk", + "sacredhentai.com", + "sacwg.ac.uk", + "sadistic-v.com", + "sadpanda.us", + "sae.org", + "saeima.lv", + "saerock.com", + "saes.ac.uk", + "saet.ac.uk", + "safa.ac.uk", + "safebooru.org", + "safecampuscommunities.ac.uk", + "safechat.com", + "safeguarddefenders.com", + "safepodnetwork.ac.uk", + "safervpn.com", + "safety.google", + "saffrontech.com", + "sagepub.com", + "sagernet.org", + "sages.ac.uk", + "sahabatsetiasmartone.com", + "sahfos.ac.uk", + "sainsbury-laboratory.ac.uk", + "sainsburycentre.ac.uk", + "sainsburyinstituteforart.ac.uk", + "saintyculture.com", + "saiq.me", + "sakura-paris.org", + "sakuralive.com", + "sakya.org", + "sale-nikeshoes.com", + "salebeatslasteststyle4you.com", + "saleblackfridaydrebeats.com", + "salecheaphandbags.com", + "salesforce.com", + "salesforce.org", + "salesforceiq.com", + "salesforceliveagent.com", + "salesforcemarketingcloud.com", + "salford-col.ac.uk", + "salford.ac.uk", + "salfordcc.ac.uk", + "salfordcitycollege-trinity.ac.uk", + "salfordcitycollege.ac.uk", + "salg.ac.uk", + "salisbury-college.ac.uk", + "salisbury.ac.uk", + "salisbury6c.ac.uk", + "salisburycollege.ac.uk", + "saltash.ac.uk", + "salts.ac.uk", + "salvation.org.hk", + "salvationarmy.ac.uk", + "samair.ru", + "sambaporno.com", + "sambhota.org", + "samc.ac.uk", + "samebags.com", + "sams.ac.uk", + "samsung.com", + "samsungapps.com", + "samsungcloud.com", + "samsungdm.com", + "samsunggalaxyfriends.com", + "samsungknox.com", + "samsungqbe.com", + "sandisk.ae", + "sandisk.co.jp", + "sandisk.co.kr", + "sandisk.co.uk", + "sandisk.com", + "sandisk.com.au", + "sandisk.com.br", + "sandisk.com.tr", + "sandisk.com.tw", + "sandisk.de", + "sandisk.es", + "sandisk.fr", + "sandisk.hk", + "sandisk.id", + "sandisk.in", + "sandisk.it", + "sandisk.nl", + "sandisk.sg", + "sandscotaicentral.com", + "sandwell.ac.uk", + "sandwellcollege.ac.uk", + "sanger.ac.uk", + "sanjesh.org", + "sankakucomplex.com", + "sankei-ad-info.com", + "sankei-ad.net", + "sankei-books.co.jp", + "sankei-call.jp", + "sankei-digital.co.jp", + "sankei-eiga.co.jp", + "sankei-kaihatsu.co.jp", + "sankei-kurashi.com", + "sankei-shougakukai.jp", + "sankei-tours.com", + "sankei.co.jp", + "sankei.com", + "sankei.jp", + "sankeibiz.jp", + "sankeishop.jp", + "sankie.net", + "sanmin.com.tw", + "sans.edu", + "sanspo.com", + "sanvaras.com", + "saobjpg.com", + "saoni91.xyz", + "saonia.xyz", + "saonidh-one.sbs", + "saonidh.world", + "saonidh01.cc", + "sapc.ac.uk", + "sapikachu.net", + "sapphicerotica.com", + "sapphicpornonly.com", + "sapphire.ac.uk", + "sarajevopodopsadom.com", + "sarapbabe.com", + "sarennasworld.com", + "sari.ac.uk", + "sartre.ac.uk", + "sarum.ac.uk", + "sas.ac.uk", + "satan18av.com", + "satnym.com", + "satoshilabs.com", + "satsixthformacademiestrust.ac.uk", + "satv01.me", + "saveliuxiaobo.com", + "savemedia.com", + "savethedate.foo", + "savethesounds.info", + "savetibet.de", + "savetibet.fr", + "savetibet.nl", + "savetibet.org", + "savetibet.ru", + "savetibetstore.org", + "saveuighur.org", + "savevid.com", + "savitabhabhi.com", + "savitabhabhi.vip", + "savitahd.net", + "savoycomputing.com", + "savvyshopper.net.au", + "say2.info", + "saynow.com", + "sb-cd.com", + "sb-mobile.jp", + "sb-telecom.net", + "sb.sb", + "sbc.ac.uk", + "sbgkstv.shop", + "sbirmc.ac.uk", + "sbitravelcard.com", + "sbme.me", + "sbnation.com", + "sbrc-nottingham.ac.uk", + "sbrn.ac.uk", + "sbs.ac.uk", + "sbs.com.au", + "sbu.ac.uk", + "sbusinesslondon.ac.uk", + "sbux.com.my", + "sbuxcard.com", + "sc-cdn.net", + "sc-toolkit.ac.uk", + "sc1.ac.uk", + "sca-tolo.info", + "scaan.ac.uk", + "scadr.ac.uk", + "scae.ac.uk", + "scala-lang.org", + "scala-sbt.org", + "scaleflex.com", + "scaleform.com", + "scandalplanet.com", + "scanlover.com", + "scapa.ac.uk", + "scarb-6-form.ac.uk", + "scarboroughtec.ac.uk", + "scarboroughuniversity.ac.uk", + "scarboroughuniversitycampus.ac.uk", + "scarboroughuniversitycentre.ac.uk", + "scarboroughuniversitycollege.ac.uk", + "scasino.com", + "scat-enema.com", + "scat-japan.com", + "scat-shop.net", + "scat.gold", + "scatfap.com", + "scatfinder.com", + "scathd.com", + "scatkings.com", + "scatnetwork.com", + "scatshop.com", + "scatsite.com", + "scatvids.club", + "scatville.com", + "scc.ac.uk", + "sccb.ac.uk", + "sccc.ac.uk", + "sccjr.ac.uk", + "scct.ac.uk", + "scde.ac.uk", + "scdn.co", + "scene7.com", + "scenesource.me", + "scentro.ac.uk", + "scep.ac.uk", + "scg.ac.uk", + "scharferporno.com", + "schema.org", + "schemer.com", + "schiffvitamins.com", + "schml.ac.uk", + "scholarpedia.org", + "scholarsschool.ac.uk", + "schome.ac.uk", + "schoms.ac.uk", + "school-economic-science.ac.uk", + "sci-hub.ee", + "sci-hub.se", + "sci-hub.st", + "sci.ac.uk", + "sciculture.ac.uk", + "science-museum-group.ac.uk", + "science.com", + "science.org", + "sciencedirect.com", + "sciencedirectassets.com", + "sciencemag.org", + "sciencemuseum.ac.uk", + "sciencemuseumgroup.ac.uk", + "sciencenets.com", + "scienceonline.org", + "sciencesigns.ac.uk", + "scientificamerican.com", + "scientificlinux.org", + "scieron.com", + "scifisex.net", + "scills.ac.uk", + "scilly-acl.ac.uk", + "scinet.ac.uk", + "scip.ac.uk", + "scir.ac.uk", + "scisci.ac.uk", + "scitation.org", + "scitech.ac.uk", + "scival.com", + "sclondon.ac.uk", + "scmp.com", + "scmpchinese.com", + "scnshop.cc", + "scnsrc.me", + "scoc.ac.uk", + "scola.ac.uk", + "scolle.net", + "sconul.ac.uk", + "scoop.sh", + "scoopstudy.ac.uk", + "scop.ac.uk", + "scope-uk.ac.uk", + "scopic.ac.uk", + "scopus.com", + "score.ac.uk", + "scoreclassics.com", + "scorediscounts.club", + "scoregroup.com", + "scoreland.com", + "scoreland2.com", + "scorepass.com", + "scoretv.tv", + "scoreuniverse.com", + "scorevideos.com", + "scot-hip.ac.uk", + "scot-reman.ac.uk", + "scot-ship.ac.uk", + "scot.ac.uk", + "scotcatproject.ac.uk", + "scotchem.ac.uk", + "scotcit.ac.uk", + "scotcol.ac.uk", + "scotdist.ac.uk", + "scotgem.ac.uk", + "scotgrid.ac.uk", + "scotland-aspirenorth.ac.uk", + "scotland-northforum.ac.uk", + "scotlandscolleges.ac.uk", + "scotssyntaxatlas.ac.uk", + "scottishborderscampus.ac.uk", + "scottishciviljustice.ac.uk", + "scottishcollegegovernance.ac.uk", + "scottishcorpus.ac.uk", + "scottishdisabilityteam.ac.uk", + "scottisheconomics.ac.uk", + "scottishelections.ac.uk", + "scottishinsight.ac.uk", + "scottishmarineinstitute.ac.uk", + "scottishresearch.ac.uk", + "scottishresearchpools.ac.uk", + "scottishuniversitygovernance.ac.uk", + "scp-wiki.net", + "scpdb.org", + "scphrp.ac.uk", + "scpic.net", + "scpr.ac.uk", + "scpwiki.com", + "scramble.io", + "scrambledmessages.ac.uk", + "scran.ac.uk", + "scre.ac.uk", + "screenacademyscotland.ac.uk", + "screenfilmschool.ac.uk", + "screens-lab.jp", + "screenspace.ac.uk", + "screenwisetrends.com", + "screenwisetrendspanel.com", + "screw-my-wife.com", + "scri.ac.uk", + "scribd.com", + "scriptspot.com", + "scrolla.ac.uk", + "scrolller.com", + "scrr.ac.uk", + "scrsj.ac.uk", + "sculpoly.com", + "scunthorpeinstituteoftechnology.ac.uk", + "scurl.ac.uk", + "scutrea.ac.uk", + "scva.ac.uk", + "scvs.ac.uk", + "scweims.ac.uk", + "sda.ac.uk", + "sdc.ac.uk", + "sdcountybmw.com", + "sdeo.ac.uk", + "sdf.ac.uk", + "sdhi.ac.uk", + "sdn.ac.uk", + "sdnice.one", + "sdnitube.buzz", + "sdos.ac.uk", + "sdss.ac.uk", + "sdt.ac.uk", + "se-derbys.ac.uk", + "se-essex-college.ac.uk", + "sea-mammal-research-unit.ac.uk", + "seacams.ac.uk", + "seagroup.com", + "seaha-cdt.ac.uk", + "seamonkey-project.org", + "seancody.com", + "seaofsolitude.com", + "seaporn.org", + "seapuff.com", + "search.ac.uk", + "search.com", + "search.xxx", + "search25.ac.uk", + "searchtruth.com", + "searx.me", + "seas.ac.uk", + "seasidestory.tokyo", + "seatguru.com", + "seattlefdc.com", + "secom.co.jp", + "secomtrust.net", + "second-ns.com", + "second-ns.de", + "secret-flirt-hub.com", + "secretbabes.co.uk", + "secretchina.com", + "secretgarden.no", + "secretsline.biz", + "secretubes.com", + "sectigo.com", + "secure-paypal.info", + "secureharvests.ac.uk", + "securepaypal.info", + "secureservercdn.net", + "securetunnel.com", + "securityinabox.org", + "securitykiss.com", + "seda.ac.uk", + "sedc.ac.uk", + "sedg.ac.uk", + "see.xxx", + "seecoll.ac.uk", + "seed4.me", + "seedmov18.com", + "seedstor.ac.uk", + "seehorsepenis.com", + "seehua.com", + "seeingspeech.ac.uk", + "seematureporn.com", + "seemilfporn.com", + "seemygf.com", + "seemyporn.com", + "seesmic.com", + "seevic-college.ac.uk", + "seevic.ac.uk", + "seevpn.com", + "seezone.net", + "sefton-acl.ac.uk", + "sefton.ac.uk", + "sego8.cc", + "sego8.co", + "sego8.xyz", + "sehuatang.net", + "sehuatang.org", + "seintiaucymru.ac.uk", + "seiroganmania.com", + "seiron-sankei.com", + "sejie.com", + "sejie80.com", + "seju.life", + "seksmet.nl", + "sekswebsite.nl", + "sekur1213.guru", + "selby.ac.uk", + "selcog.ac.uk", + "seldensociety.ac.uk", + "selectanescort.com", + "selectyourgame.com", + "selfloversworld.com", + "sellclassics.com", + "sellercommunity.com", + "sellyoak.ac.uk", + "selsey.ac.uk", + "semanticaudio.ac.uk", + "semanticscholar.org", + "sena.co.kr", + "senatehouselibrary.ac.uk", + "sendsmtp.com", + "sendspace.com", + "seneporno.com", + "seniortgp.com", + "senpaiheat.com", + "sense-east.ac.uk", + "sensorcity.ac.uk", + "sensortower.com", + "sensorynetworks.com", + "senss-dtp.ac.uk", + "sensualgirls.org", + "sensualmothers.com", + "sensueel.net", + "sentry.io", + "senzuritv.net", + "sepnet.ac.uk", + "seqing.one", + "seqingwangzhan.pro", + "seqingx.com", + "sequence.com", + "ser7.cc", + "sera.ac.uk", + "seraph.me", + "serbiporno.net", + "serc.ac.uk", + "serena.ac.uk", + "serialssolutions.com", + "serio.ac.uk", + "serl.ac.uk", + "serlucap.lol", + "serlutv258.xyz", + "servehttp.com", + "serverfault.com", + "serverlesslibrary.net", + "serveuser.com", + "serveusers.com", + "services-apple.net", + "services-exchange.com", + "serviceshp.com", + "servicetalk.io", + "serving-sys.com", + "serviporno.com", + "ses.ac.uk", + "sesawe.net", + "sesawe.org", + "seselah.com", + "sesenovel.com", + "sesez.com", + "sessoamatorialeitaliano.com", + "setapp.com", + "sethwklein.net", + "seti.ac.uk", + "setn.com", + "setsquared.ac.uk", + "settv.com.tw", + "setty.com.tw", + "sevenload.com", + "severeporn.com", + "severreal.org", + "sevgikurtulmaz.com", + "sex-11.com", + "sex-amateur-clips.com", + "sex-av.com", + "sex-douga.jp", + "sex-for-work.com", + "sex-gif.org", + "sex-hay.pro", + "sex-hot-sites.com", + "sex-ly.com", + "sex-teen.net", + "sex-young.com", + "sex.cam", + "sex.com", + "sex.sex", + "sex.xxx", + "sex0098.com", + "sex021.net", + "sex3.com", + "sex3.mobi", + "sex4arabxxx.com", + "sex588.net", + "sex8.cc", + "sexaidh.com", + "sexalarab.com", + "sexandsplash.com", + "sexandsubmission.com", + "sexanimalvideos.com", + "sexanime.net", + "sexarea.org", + "sexasia.net", + "sexavidols.com", + "sexbebin.com", + "sexbomba.ru", + "sexbombo.com", + "sexbookecuador.com", + "sexbot.com", + "sexbq.com", + "sexcartoon.biz", + "sexcelebrity.net", + "sexcord.com", + "sexdollpornhd.com", + "sexdolls.com", + "sexdollsshow.com", + "sexdug.com", + "sexecherche.com", + "sexedanslepre.net", + "sexei.net", + "sexemulator.com", + "sexfilm4free.com", + "sexfilmeporno.com", + "sexfilmstube.com", + "sexfl.xyz", + "sexflashgame.org", + "sexflexible.com", + "sexgalaxy.net", + "sexgame.com", + "sexgamefun.com", + "sexgames.cc", + "sexgames.xxx", + "sexgamesbox.com", + "sexgamesclub.com", + "sexguide.ro", + "sexhd.fun", + "sexhd.pics", + "sexhdmovs.com", + "sexhotgames.com", + "sexhu.com", + "sexhuang.com", + "sexhub.red", + "sexhubhd.com", + "sexidude.com", + "sexifilm.top", + "sexiframe.com", + "sexindians.cc", + "sexinsex.net", + "sexiranian.party", + "sexjk.com", + "sexjobs.it", + "sexkomix2.com", + "sexkorea.net", + "sexlikereal.com", + "sexmadeathome.com", + "sexmature.club", + "sexmerci.com", + "sexmex.xxx", + "sexmix.net", + "sexmomsex.com", + "sexmovies24.com", + "sexmummy.com", + "sexmutant.com", + "sexnaweb.net", + "sexnudo.com", + "sexo123.net", + "sexodama.com", + "sexodeamor.com", + "sexopornolive.com", + "sexoquente.blog", + "sexpornimg.com", + "sexpornpictures.com", + "sexpornvideoasian.com", + "sexsaoy.com", + "sexsex1.com", + "sexsiam.com", + "sexsim.com", + "sexsimulator.com", + "sexsiteinc.com", + "sexstoriespost.com", + "sextb.net", + "sextime.tv", + "sextop.net", + "sextop1.net", + "sextorso.com", + "sextoystop.com", + "sextreffen-portale.com", + "sextreffensite.com", + "sextube.desi", + "sextube.fm", + "sextube69free.net", + "sextubebox.com", + "sextubedot.com", + "sextubehub.com", + "sextubeset.com", + "sextubespot.com", + "sextubexxl.com", + "sextubish.com", + "sextvx.com", + "sextw.net", + "sexu.com", + "sexualhentai.net", + "sexuria.com", + "sexvid.xxx", + "sexvideo10.com", + "sexvideo12com.pro", + "sexvideos.host", + "sexvideos.tel", + "sexvideosxxx.mobi", + "sexvids.cc", + "sexvr.com", + "sexwebvideo.com", + "sexwenheav.shop", + "sexwithhorse.net", + "sexxhd.de", + "sexxx8.xyz", + "sexxxdoll.com", + "sexxxtape.net", + "sexxxx.rodeo", + "sexxxxfilms.com", + "sexxxy.biz", + "sexy-babe-pics.com", + "sexy-beauties.com", + "sexy-models.net", + "sexy-more.com", + "sexy-older-women.com", + "sexy-photos.net", + "sexy-torrents.com", + "sexy3dtoon.com", + "sexyandfunny.com", + "sexyasiangirls.cc", + "sexyavenue.com", + "sexybabesz.com", + "sexycandidgirls.com", + "sexyculo.com", + "sexyfeet.tv", + "sexyfuckgames.com", + "sexyfucking.ru", + "sexygirlfriendtube.com", + "sexygirlspics.com", + "sexyhomewives.com", + "sexyhub.com", + "sexyhumorgames.com", + "sexykittenporn.com", + "sexyoung.me", + "sexypornpictures.org", + "sexyseeker.com", + "sexysexdoll.com", + "sexysites.com.ph", + "sexyteenssite.com", + "sexytuber.com", + "sexywetpussy.com", + "sexzy4.com", + "sf.net", + "sfbassets.com", + "sfbassets.net", + "sfc.ac.uk", + "sfdcstatic.com", + "sfefc.ac.uk", + "sfeu.ac.uk", + "sfhub.ac.uk", + "sfileydy.com", + "sfmcompile.club", + "sforce.com", + "sfps.ac.uk", + "sfra.ac.uk", + "sfs.ac.uk", + "sfshibao.com", + "sfsstudents.ac.uk", + "sftindia.org", + "sftuk.org", + "sfx.ac.uk", + "sfx.ms", + "sfxc.ac.uk", + "sg120.me", + "sg1lib.org", + "sgeulnagaidhlig.ac.uk", + "sghms.ac.uk", + "sgiliaith.ac.uk", + "sgm.ac.uk", + "sgmc.ac.uk", + "sgp1.fun", + "sgpe.ac.uk", + "sgsah.ac.uk", + "sgscol.ac.uk", + "sgspe.de", + "sgspt.buzz", + "sgsss.ac.uk", + "sgul.ac.uk", + "sgwritings.com", + "sgzhan.com", + "sh-xuxingda.com", + "sh83.xyz", + "shadbase.com", + "shadeyouvpn.com", + "shadow.ma", + "shadowcomplex.com", + "shadowsky.xyz", + "shadowslaves.com", + "shadowsocks-r.com", + "shadowsocks.asia", + "shadowsocks.be", + "shadowsocks.com", + "shadowsocks.com.hk", + "shadowsocks.nl", + "shadowsocks.org", + "shadowsocks9.com", + "shafaqna.com", + "shahit.biz", + "shahvani.com", + "shahvani.site", + "shakethesnake.com", + "shambalapost.com", + "shambhalasun.com", + "shameless.com", + "shangfang.org", + "shanxivideo.com", + "shapelcounset.xyz", + "shapeservices.com", + "sharebee.com", + "sharecool.org", + "shared-ed.ac.uk", + "shared-es.ac.uk", + "sharedsolutions.ac.uk", + "sharegeo.ac.uk", + "sharepoint.com", + "sharepointonline.com", + "sharethis.com", + "sharif.edu", + "sharif.ir", + "sharingpractice.ac.uk", + "sharizelvideos.com", + "sharks-lagoon.fr", + "sharkyporn.com", + "sharmota.com", + "sharpdaily.com.hk", + "sharpdaily.hk", + "sharpdaily.tw", + "shat-tibet.com", + "shattered.io", + "shazam.com", + "shc.ac.uk", + "shdd.ink", + "shdf.ac.uk", + "sheef.ac.uk", + "sheets.new", + "shef.ac.uk", + "shefc.ac.uk", + "sheffcol.ac.uk", + "sheffield-hallam.ac.uk", + "sheffield-lls.ac.uk", + "sheffield.ac.uk", + "sheffield2.ac.uk", + "sheffieldcareersfairs.ac.uk", + "sheffieldcetle.ac.uk", + "sheffieldlegalfair.ac.uk", + "sheffieldrobotics.ac.uk", + "sheflix.com", + "shegg.com", + "shegods.com", + "sheikyermami.com", + "sheilingcollege.ac.uk", + "shelfstuff.com", + "shellcheck.net", + "shellfire.de", + "shemale-porn-galls.com", + "shemalebestlabel.com", + "shemalehd.sex", + "shemaleleaks.com", + "shemalemodelstube.com", + "shemaleporn.fun", + "shemaleporn.xxx", + "shemalepornonly.com", + "shemaleporntube.tv", + "shemalespoiledwhore.com", + "shemalestardb.com", + "shemalestube.com", + "shemaletrannypics.com", + "shemaletube.pro", + "shemaletubevideos.com", + "shemalez.com", + "shenasimon.ac.uk", + "shenshi-cha.com", + "shenshou.org", + "shenyun.com", + "shenyun.org", + "shenyuncreations.com", + "shenyunperformingarts.org", + "shenyunshop.com", + "shenzhoufilm.com", + "shenzhouzhengdao.org", + "sheppeycollege.ac.uk", + "shequ8.cam", + "shequdaohang.com", + "sherabgyaltsen.com", + "sherif.ac.uk", + "sherpa-leap.ac.uk", + "sherpa.ac.uk", + "shesfreaky.com", + "sheshaft.com", + "shiatv.net", + "shibashuwu.net", + "shicheng.org", + "shields.io", + "shikorina.net", + "shiksha.com", + "shiksha.ws", + "shinhangmc.com", + "shinychan.com", + "shipcamouflage.com", + "shiplay.ac.uk", + "shipley.ac.uk", + "shireyishunjian.com", + "shiroutoav.net", + "shishijump001.com", + "shit-porn.net", + "shitaotv.org", + "shithd.com", + "shitjav.com", + "shittytube.com", + "shixiao.org", + "shizhao.org", + "shkspr.mobi", + "shockingmovies.com", + "shodanhq.com", + "shoers.com", + "shoestop2.com", + "shooshtime.com", + "shootershill.ac.uk", + "shop-headphones.net", + "shop.app", + "shop2000.com.tw", + "shopbeatsdre.com", + "shopbmwmotorcycles.com", + "shopbmwusa.com", + "shopbydre.com", + "shopcustomizedbeats.com", + "shopdisney.com", + "shopdrebeats.com", + "shopdurex.com", + "shopee.cl", + "shopee.co.id", + "shopee.co.th", + "shopee.com", + "shopee.com.br", + "shopee.com.co", + "shopee.com.mx", + "shopee.com.my", + "shopee.es", + "shopee.fr", + "shopee.id", + "shopee.in", + "shopee.io", + "shopee.ph", + "shopee.sg", + "shopee.tw", + "shopee.vn", + "shopeemobile.com", + "shopfacebook.com", + "shopibay.net", + "shopify.com", + "shopify.dev", + "shopifycdn.com", + "shopifycloud.com", + "shopifystatus.com", + "shopifysvc.com", + "shoping.com", + "shopminiusa.com", + "shopmonsterbeats.com", + "shoppercentre.com", + "shopping-days.net", + "shopping.com", + "shoppinguheadphones.com", + "shops-disney.com", + "shopspeedtv.com", + "shoptraivip.com", + "shorturl.at", + "shotgridsoftware.com", + "shotgridstudio.com", + "shotguncloud.com", + "shotgunfx.com", + "shotgunlocalhost.com", + "shotgunsoftware.com", + "shotgunsoftware.net", + "shotgunstudio-test.com", + "shotgunstudio.com", + "shotgunvfx.com", + "shotwithgeforce.com", + "showhaotu.com", + "shownote.com", + "showtime.com", + "showtime.jp", + "showtimeanytime.com", + "showup.tv", + "showwe.tw", + "showybeauty.com", + "shp.ee", + "shrewsbury.ac.uk", + "shrimpia.network", + "shrkurl.com", + "shsh201.com", + "shu.ac.uk", + "shuangmawei.xyz", + "shufflesex.com", + "shutterstock.com", + "shuttleworth.ac.uk", + "shuttleworthcollege.ac.uk", + "shuziyimin.org", + "shvoong.com", + "shwchurch.org", + "shwchurch3.com", + "shwebank.com", + "shymysex.com", + "shywifeswap.com", + "siam.org", + "sibreal.org", + "sicsa.ac.uk", + "siddharthasintent.org", + "side.ac.uk", + "sidelinesnews.com", + "sidelinessportseatery.com", + "sie.ac.uk", + "siege-amazon.com", + "sierrafriendsoftibet.org", + "sifa.ac.uk", + "sifangclub.com", + "sigma-cetl.ac.uk", + "sigma-network.ac.uk", + "sigmoidoscopeexam.com", + "sign.ac.uk", + "sign.new", + "signal.art", + "signal.org", + "signalbar.com", + "signalprocessingsociety.org", + "signalr.net", + "signalusers.org", + "sihe.ac.uk", + "sijihuisuo.club", + "sijihuisuo.com", + "sikh-uni.ac.uk", + "sikiswap.com", + "silkbook.com", + "silkengirl.com", + "silverchair-cdn.com", + "silversluts.com", + "simbios.ac.uk", + "simbolostwitter.com", + "simcity-buildit.com", + "simcity.com", + "simg.jp", + "simgbb.com", + "simian.ac.uk", + "similar-porn.fun", + "simility.com", + "simonsgirls.com", + "simpcity.su", + "simplecd.org", + "simpleproductivityblog.com", + "simplify.com", + "simplifycommerce.com", + "simply-hentai.com", + "simplyipod.com", + "simsquad.com", + "simulationsquad.com", + "sina.com", + "sina.com.hk", + "sina.com.tw", + "sinapse.ac.uk", + "sinchew.com.my", + "sinchew.my", + "sinet.ac.uk", + "sing4.lat", + "sing68.com", + "singaporepools.com.sg", + "singfortibet.com", + "singlelogin.app", + "singlelogin.me", + "singlelogin.re", + "singlelogin.site", + "singpao.com.hk", + "singtao.ca", + "singtao.com", + "singtaobooks.com", + "singtaola.com", + "singtaonewscorp.com", + "singtaoopo.com", + "singtaousa.com", + "sinica.ac.uk", + "sino-cs.ac.uk", + "sino-monthly.com", + "sinoants.com", + "sinoca.com", + "sinocast.com", + "sinocism.com", + "sinoinsider.com", + "sinomontreal.ca", + "sinonet.ca", + "sinopitt.info", + "sinoquebec.com", + "sinto.ac.uk", + "sip.ac.uk", + "sipher.ac.uk", + "sipml5.org", + "siport.com", + "sipr.ac.uk", + "sipriyearbook.org", + "sircharleslyellcentre.ac.uk", + "sire.ac.uk", + "sirenxxxstudios.com", + "siri.com", + "sirius.ac.uk", + "sirm.ac.uk", + "sis.la", + "sis.xxx", + "sis001.com", + "sis001.us", + "siscache.com", + "siser.ac.uk", + "sisisl.com", + "siska.video", + "sislovesme.com", + "sissc.ac.uk", + "sissy-university.com", + "sissy.eu.org", + "sissy.game", + "sissyporncrossdresser.com", + "site.com", + "site2unblock.com", + "site90.net", + "sitebro.tw", + "sitekreator.com", + "sitemaps.org", + "sitepoint.com", + "siterips.org", + "siteripz.com", + "siteripz.net", + "siti.ac.uk", + "situero.com", + "siva.ac.uk", + "six-degrees.io", + "six9dy.pw", + "sixte.st", + "sixth.biz", + "sjcollect.com", + "sjd.ac.uk", + "sjhsp1.buzz", + "sjr.ac.uk", + "sjrt.org", + "sjum.cn", + "skate2.com", + "skebetter.com", + "skegnesstec.ac.uk", + "skelmersdale.ac.uk", + "sketchappsources.com", + "sketchbookdesigner.com", + "sketchbookmobile.com", + "sketchbooknews.com", + "sketchbookpro.com", + "skillsbridge.ac.uk", + "skillscompetitionwales.ac.uk", + "skillsgroupuk.ac.uk", + "skillshare.com", + "skillswestyorks.ac.uk", + "skimtube.com", + "skinstrip.net", + "skk.moe", + "skokka.com", + "sksarab.top", + "skunkgirl.cc", + "sky.com", + "skyassets.com", + "skybet.com", + "skyking.com.tw", + "skykiwi.com", + "skymansion.net", + "skymatter.com", + "skynet.be", + "skyoceanrescue.com", + "skyoceanrescue.de", + "skyoceanrescue.it", + "skype.com", + "skype.net", + "skypeassets.com", + "skypeassets.net", + "skyperfectjsat.space", + "skyperfectv.co.jp", + "skyporn.online", + "skyrmions.ac.uk", + "skysports.com", + "skysports.fr", + "skysports.ie", + "skysportsonline.com", + "skysportsracing.com", + "skyvegas.com", + "skyxvpn.com", + "sl-reverse.com", + "sl99mod.buzz", + "slack-core.com", + "slack-edge.com", + "slack-files.com", + "slack-imgs.com", + "slack-msgs.com", + "slack-redir.net", + "slack.com", + "slackb.com", + "slackcertified.com", + "slackdemo.com", + "slacker.com", + "slackhq.com", + "slandr.net", + "slashdot.org", + "slashine.onl", + "slaytizle.com", + "slc.ac.uk", + "slcollege.ac.uk", + "slcs.ac.uk", + "sldo.ac.uk", + "sldolls.com", + "sleaford.ac.uk", + "sleazydream.com", + "sleazyneasy.com", + "sleepandwakefulnessresearch.ac.uk", + "slg.ac.uk", + "slheng.com", + "sli-institute.ac.uk", + "slickvpn.com", + "slides.new", + "slideshare.com", + "slideshare.net", + "slidesharecdn.com", + "slime.com.tw", + "sling.com", + "slinginternational.com", + "slingshot.co.nz", + "slinkset.com", + "sloan.ac.uk", + "slobodnaevropa.mk", + "slotbitches.com", + "slsa.ac.uk", + "slss.ac.uk", + "slt-cdt.ac.uk", + "slutload.com", + "slutmoonbeam.com", + "sluts.xyz", + "sluttyrat.com", + "slyip.com", + "slyip.net", + "sm-miracle.com", + "sm.ms", + "sm3ha.ru", + "sma.ac.uk", + "small-angle.ac.uk", + "smallteenpussy.com", + "smart-edge.com", + "smart.ac.uk", + "smartcommunitiescoalition.com", + "smartcommunitiescoalition.org", + "smartdnsproxy.com", + "smartexpos.com", + "smartfea.com", + "smarthide.com", + "smartline.com.au", + "smartmailcloud.com", + "smartnastran.com", + "smartone.com", + "smartoneholdings.com", + "smartonerobotics.com", + "smartonesolutions.com.hk", + "smartonesolutions.hk", + "smashed.xxx", + "smashwords.com", + "smbgroup.ac.uk", + "smc.ac.uk", + "smca.ac.uk", + "smcblackburn.ac.uk", + "smchbooks.com", + "smcl.ac.uk", + "smedevelopmentbank.com.mm", + "smg.ac.uk", + "smh.com.au", + "smhric.org", + "smi.ac.uk", + "smith.edu", + "smithinst.ac.uk", + "sml.ac.uk", + "smmsp.xyz", + "smokinmovies.com", + "smplace.com", + "smpte.org", + "smru.ac.uk", + "smsj.ac.uk", + "smstc.ac.uk", + "smu.ac.uk", + "smuc.ac.uk", + "smucb.ac.uk", + "smul.ac.uk", + "smutcam.com", + "smutcams.com", + "smutindia.com", + "smutstone.com", + "smutty.com", + "smuttymoms.com", + "smyw.org", + "smyxy.org", + "snap-dev.net", + "snap-telemetry.io", + "snap.com", + "snapads.com", + "snapchat.com", + "snapcraft.io", + "snapdragon.cn", + "snapdragonbooth.com", + "snapkit.co", + "snapseed.com", + "snapstore.io", + "snaptu.com", + "snapvolumes.com", + "snapwebcams.com", + "snc.ac.uk", + "sndcdn.com", + "sneaker666.com", + "sneakerpage.net", + "sneakerskick.com", + "sneakme.net", + "snjulebu.com", + "snk-corp.co.jp", + "snkplaymore.info", + "snow.me", + "snowcorp.com", + "snowlionpub.com", + "snowmiku.com", + "snug.ac.uk", + "so-net.ne.jp", + "so-net.net.tw", + "soas.ac.uk", + "soasta-dswb.com", + "soav.com", + "sobees.com", + "soc.ac.uk", + "soc.mil", + "socailcam.com", + "socalbmw.com", + "socbcdt.ac.uk", + "soccerfanz.com.my", + "soccerfinancier.ca", + "soccermatchpass.com", + "socdm.com", + "social.com", + "social.edu.ci", + "socialblade.com", + "socialcam.com", + "socialcammail.com", + "socialkam.com", + "socialmediagirls.com", + "socialpolicy.ac.uk", + "socialsciences.ac.uk", + "socialwhale.com", + "societycentral.ac.uk", + "societyofjewelleryhistorians.ac.uk", + "societyoflegalscholars.ac.uk", + "sociolotron.com", + "socks-proxy.net", + "sockscap64.com", + "sockslist.net", + "socrec.org", + "socres.ac.uk", + "socsciscotland.ac.uk", + "sod.co.jp", + "soficdt.ac.uk", + "softbank-ipo.com", + "softbank-jp.com", + "softbank-robotics.com", + "softbank-telecom.com", + "softbank-telecom.net", + "softbank.jp", + "softbank.tv", + "softbankbb.com", + "softbankbb.net", + "softbankci.com", + "softbankhawksstore.jp", + "softbankmobile.net", + "softbankrobotics.com", + "softbanktelecom.com", + "softbankusa.net", + "softbankventuresasia.com", + "softbankworld.com", + "softeng-support.ac.uk", + "softether-download.com", + "softether.co.jp", + "softether.org", + "softfamous.com", + "softlayer.net", + "softmattercdt.ac.uk", + "softmodels.net", + "softnology.biz", + "softonic.cn", + "softsmirror.cf", + "software.ac.uk", + "softwarebychuck.com", + "softwareoutlook.ac.uk", + "sogclub.com", + "sogoo.org", + "sogrady.me", + "soh.tw", + "sohcradio.com", + "sohfrance.org", + "soifind.com", + "soillse.ac.uk", + "sojiy1124.top", + "sokamonline.com", + "sokmil.com", + "solana.com", + "solarcity.com", + "solent-university.ac.uk", + "solent.ac.uk", + "solentmarineacademy.ac.uk", + "solentuniversity.ac.uk", + "solidaritetibet.org", + "solidfiles.com", + "solihull.ac.uk", + "solihullsfc.ac.uk", + "solostudioksale.com", + "solsfc.ac.uk", + "solutions-worcestershire.ac.uk", + "solv.finance", + "solveforx.com", + "somee.com", + "somerset.ac.uk", + "somersetcolleges.ac.uk", + "songjianjun.com", + "sonicbbs.cc", + "sonidodelaesperanza.org", + "sonorousporn.com", + "sony-africa.com", + "sony-asia.com", + "sony-europe.com", + "sony-hes.co.jp", + "sony-latin.com", + "sony-mea.com", + "sony-olympus-medical.com", + "sony-promotion.eu", + "sony-semicon.co.jp", + "sony-semicon.com", + "sony.at", + "sony.ba", + "sony.be", + "sony.bg", + "sony.biz", + "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.com", + "sonybuilding.jp", + "sonyclassics.com", + "sonydesign.com", + "sonydna.com", + "sonyentertainmentnetwork.com", + "sonyglobalsolutions.jp", + "sonykigyo.jp", + "sonylatvija.com", + "sonynetwork.co.jp", + "sonypcl.jp", + "sonypictures.com", + "sonypicturesanimation.com", + "sonypicturesmuseum.com", + "sonypicturesstudios.com", + "sonypicturestelevision.com", + "sonypicturestelevisiongames.com", + "sonyprotechnosupport.co.jp", + "sonystoragemedia.co.jp", + "sonytc.co.jp", + "soolakhi.com", + "soooyinfor.lol", + "sopcast.com", + "sopcast.org", + "sophos.com", + "soporn.com", + "sora.com", + "sora6.com", + "sorazone.net", + "sorcerersarena.com", + "sorting-algorithms.com", + "sos.org", + "sos44.com", + "soso7778.com", + "sosreader.com", + "sostibet.org", + "sothebys-institute.ac.uk", + "soton.ac.uk", + "sots.ac.uk", + "sotwe.com", + "sou-tong.org", + "soubory.com", + "souka.xyz", + "soul-plus.net", + "soulcaliburhentai.net", + "soumo.info", + "sound-heritage.ac.uk", + "soundcloud.com", + "soundofhope.eu", + "soundofhope.kr", + "soundofhope.org", + "soundon.fm", + "soundsoftware.ac.uk", + "soundwell.ac.uk", + "soup.io", + "soupofmedia.com", + "source.ac.uk", + "sourceforge.com", + "sourceforge.net", + "sourcehut.org", + "sourcewadio.com", + "sourcingforebay.com.cn", + "sourcingforebay.net", + "sourcingforebay.tv", + "south-lanarkshire-college.ac.uk", + "south-plus.net", + "south-plus.org", + "south-thames.ac.uk", + "southampton-city.ac.uk", + "southampton-institute.ac.uk", + "southampton-solent-university.ac.uk", + "southampton.ac.uk", + "southamptonalumni.ac.uk", + "southamptonbusiness.ac.uk", + "southamptonsolentuniversity.ac.uk", + "southbank-university.ac.uk", + "southcheshirecollege.ac.uk", + "southcoastdtp.ac.uk", + "southcoll-bolton.ac.uk", + "southdevon.ac.uk", + "southdowns.ac.uk", + "southeastdtc.ac.uk", + "southeastessex.ac.uk", + "southend-acl-college.ac.uk", + "southend-adult.ac.uk", + "southend.ac.uk", + "southendcollege.ac.uk", + "southessex.ac.uk", + "southessexcollege.ac.uk", + "southfloridamini.com", + "southgate.ac.uk", + "southgrid.ac.uk", + "southkent.ac.uk", + "southnews.com.tw", + "southport-college.ac.uk", + "southport.ac.uk", + "southsefton6thform.ac.uk", + "southsefton6thformcollege.ac.uk", + "southseftoncollege.ac.uk", + "southstaffs.ac.uk", + "southwales.ac.uk", + "southwark.ac.uk", + "southwestcollege.ac.uk", + "southwestiot.ac.uk", + "southwestnuclearhub.ac.uk", + "sovec.net", + "sowers.org.hk", + "sowiki.net", + "soyinyj.top", + "soylent.com", + "soylentnews.org", + "sp.cool", + "spa.ac.uk", + "spaceexplored.com", + "spacely.com.au", + "spacemail.com", + "spaceship.com", + "spaceuniversitiesnetwork.ac.uk", + "spaceweather.ac.uk", + "spacex.com", + "spaindisney.com", + "spalding.ac.uk", + "span.ac.uk", + "spankandbang.com", + "spankbang.com", + "spankbang.party", + "spankbang1.com", + "spanking.wiki", + "spankingstudio.com", + "spankingtube.com", + "spankmonster.com", + "spankred3d.com", + "spankwire.com", + "sparc.ac.uk", + "sparqs.ac.uk", + "sparsholt.ac.uk", + "sparsholtcollegegroup.ac.uk", + "sparsholtcollegeservices.ac.uk", + "sparsholtservices.ac.uk", + "spatial.io", + "spatialeconomics.ac.uk", + "spb.com", + "spc.ac.uk", + "spcc-sp.com", + "spcollege.ac.uk", + "speakerdeck.com", + "spearhead.kr", + "specialtyheadphones.com", + "spectraltube.com", + "spectrum.ac.uk", + "speeddreamride.com", + "speedfantasybid.com", + "speedhunters.com", + "speedify.com", + "speedproject.ac.uk", + "speedracegear.com", + "speedrun.com", + "speedtest.com.hk", + "speedxtra.com", + "spektral.cc", + "spelthorne.ac.uk", + "spem.at", + "spencertipping.com", + "spendee.com", + "spermyporn.com", + "spero.ac.uk", + "speybay.com", + "spice.ac.uk", + "spicebar.de", + "spicevpn.com", + "spiceworks.com", + "spiceworksstatic.com", + "spicybigtits.com", + "spider.ac.uk", + "spideroak.com", + "spiedigitallibrary.org", + "spiegel.de", + "spike.com", + "spinesurgeons.ac.uk", + "spiritclubs.com", + "spiritofecstasy.com", + "spiritstudios.ac.uk", + "spitfire.ac.uk", + "spizoo.com", + "splatoon2tournament.com", + "splint-cetl.ac.uk", + "spokenword.ac.uk", + "sponichi.co.jp", + "spore.com", + "sportsfacebook.com", + "sportstream.com", + "sportswomanoftheyear.co.uk", + "sportswomenoftheyear.co.uk", + "spotflux.com", + "spoti.fi", + "spotify-everywhere.com", + "spotify.com", + "spotify.design", + "spotify.map.fastly.net", + "spotify.map.fastlylb.net", + "spotifycdn.com", + "spotifycdn.net", + "spotifycharts.com", + "spotifycodes.com", + "spotifyforbrands.com", + "spotifyjobs.com", + "spr.ac.uk", + "spraynwash.com", + "spreadprivacy.com", + "spreadshirt.es", + "sprg.ac.uk", + "spring-plus.net", + "spring4u.info", + "springboardplatform.com", + "springer.com", + "springerlink.com", + "springernature.com", + "springwood.me", + "sprinklesapp.com", + "sprint.ac.uk", + "sprite.org", + "sproutcore.com", + "sproxy.info", + "spsrn.ac.uk", + "sptvbroadcast.com", + "spurgeons.ac.uk", + "spyjinx.com", + "sqhwesternconsortium.ac.uk", + "sqlite.org", + "sqlserveronlinux.com", + "squ1.com", + "squarecapital.com", + "squarecdn.com", + "squarecloudservices.com", + "squarefoot.com.hk", + "squareup.com", + "squidplatform.com", + "squirly.info", + "squirrelgroup.net", + "squirrelvpn.com", + "sqyzh-dh.sbs", + "sr.ht", + "src.ac.uk", + "srebrenica360.com", + "srf.ac.uk", + "srhe.ac.uk", + "srip.ac.uk", + "sroc.ac.uk", + "srocket.us", + "srpe.ac.uk", + "srs.ac.uk", + "srtcdn.net", + "srttu.edu", + "sruc.ac.uk", + "ss-link.com", + "ss2.us", + "ss7.app", + "ssdevrd.com", + "ssees.ac.uk", + "ssfc.ac.uk", + "ssglobal.co", + "ssglobal.me", + "ssh91.com", + "sshm.ac.uk", + "sshs.club", + "sshs.pw", + "sshs.xyz", + "ssl-certificate.ch", + "ssl-images-amazon.com", + "ssl.com", + "ssl443.org", + "sslpaypal.org", + "ssmh.ac.uk", + "sspanel.net", + "sspanel.org", + "sspc.ac.uk", + "sspf.ac.uk", + "ssphr.ac.uk", + "ssplive.pw", + "sspro.ml", + "ssr.tools", + "ssrpass.pw", + "ssrshare.com", + "sss.camp", + "sss.xxx", + "sssfc.ac.uk", + "ssshuqian.xyz", + "sssins.com", + "sssjav.com", + "sssuo1.xyz", + "sstatic.net", + "sstm.moe", + "sstmlt.moe", + "sstmlt.net", + "ssttest.net", + "ssu.ac.uk", + "ssx3.com", + "st-and.ac.uk", + "st-andrews.ac.uk", + "st-austell.ac.uk", + "st-davids-coll.ac.uk", + "st-ives.ac.uk", + "st-patricks.ac.uk", + "st.com", + "stac.ac.uk", + "stackage.org", + "stackapps.com", + "stackauth.com", + "stackcommerce.net", + "stackexchange.com", + "stackmod.blog", + "stackoverflow.blog", + "stackoverflow.co", + "stackoverflow.com", + "stackoverflow.email", + "stackoverflowbusiness.com", + "stackoverflowcareers.com", + "stackpath.com", + "stackpath.dev", + "stacksnippets.net", + "stacksocial.com", + "stacyvandenbergboobs.com", + "stadia.dev", + "staffhub.ms", + "stafford.ac.uk", + "staffordcoll.ac.uk", + "staffordshire.ac.uk", + "staffs.ac.uk", + "stage64.hk", + "stak.ac.uk", + "stamford.ac.uk", + "stamfordparktrust.ac.uk", + "standardsuniversity.org", + "standupfortibet.org", + "standwithhk.org", + "stanford.edu", + "stanmore.ac.uk", + "stanstedairportcollege.ac.uk", + "star-brasil.com", + "star-latam.com", + "star.ac.uk", + "starbucks-stars.com", + "starbucks.ad", + "starbucks.at", + "starbucks.be", + "starbucks.bg", + "starbucks.ca", + "starbucks.ch", + "starbucks.co.id", + "starbucks.co.jp", + "starbucks.co.nz", + "starbucks.co.th", + "starbucks.co.uk", + "starbucks.co.za", + "starbucks.com", + "starbucks.com.ar", + "starbucks.com.bn", + "starbucks.com.co", + "starbucks.com.cy", + "starbucks.com.gr", + "starbucks.com.hk", + "starbucks.com.kh", + "starbucks.com.kz", + "starbucks.com.mx", + "starbucks.com.my", + "starbucks.com.pe", + "starbucks.com.sg", + "starbucks.com.tr", + "starbucks.com.uy", + "starbucks.de", + "starbucks.dk", + "starbucks.es", + "starbucks.fr", + "starbucks.hu", + "starbucks.ie", + "starbucks.in", + "starbucks.it", + "starbucks.nl", + "starbucks.no", + "starbucks.ph", + "starbucks.pl", + "starbucks.pt", + "starbucks.rs", + "starbucks.ru", + "starbucks.se", + "starbucks.tt", + "starbucks.vn", + "starbucksathome.com", + "starbucksavie.ca", + "starbuckscard.ph", + "starbuckscardb2b.com", + "starbuckscoffee.cz", + "starbuckscoffeegear.com", + "starbuckscoffeegearstore.com", + "starbucksforlife.ca", + "starbucksforlife.com", + "starbuckspoq.com", + "starbucksreserve.com", + "starbucksrewardsstarland.ca", + "starbucksrewardsstarland.com", + "starbucksromania.ro", + "starbucksrtd.com", + "starbucksslovakia.sk", + "starbuckssummergame.ca", + "starbuckssummergame.com", + "starcraft.com", + "starcraft2.com", + "starfieldtech.com", + "starfishfx.com", + "starfox.com", + "stark-verlag.ch", + "starlink.ac.uk", + "starott.com", + "starp2p.com", + "starplus.com", + "stars.ac.uk", + "starship-ent.com", + "starsze.icu", + "start.com", + "startpage.com", + "startpath.com", + "startupjournal.com", + "startuplivingchina.com", + "startupschool.org", + "starwars.com", + "starwarsbattlefront.com", + "starwarsbattlefront2.com", + "starwarsfallenorder.com", + "starwarsgalacticstarcruiser.com", + "starwarsjedifallenorder.com", + "starwarskids.com", + "starwarstheoldrepublic.com", + "stat.gov.tw", + "state.gov", + "stateofthemap.com", + "stateofthemap.org", + "static-cisco.com", + "static-economist.com", + "static-nike.com", + "static-verizon.com", + "static.fun", + "static9.net.au", + "staticflickr.com", + "statistics.ac.uk", + "statsig.com", + "statsmakemecry.com", + "statstutor.ac.uk", + "statueofdemocracy.org", + "statuspage.io", + "staugustinescollege.ac.uk", + "staxus.com", + "stboy.net", + "stbr.ac.uk", + "stbrendans.ac.uk", + "stbrn.ac.uk", + "stc-server.com", + "stc.ac.uk", + "stc.com.sa", + "stcg.ac.uk", + "stchads.ac.uk", + "stcharles-mail.ac.uk", + "stcharles.ac.uk", + "stclares.ac.uk", + "stcoll.ac.uk", + "stcroixmosquito.com", + "stcroixmosquitoproject.com", + "stdavidscollege.ac.uk", + "stdavidsdaygroup.ac.uk", + "stdoms.ac.uk", + "steam-api.com", + "steam-chat.com", + "steam.tv", + "steamcommunity.com", + "steamcontent.com", + "steamdb.info", + "steamdeck.com", + "steamgames.com", + "steamhouse.ac.uk", + "steamofporn.com", + "steampowered.com", + "steamserver.net", + "steamstatic.com", + "steamunlocked.net", + "steamusercontent.com", + "steamygamer.com", + "stec.ac.uk", + "steel-storm.com", + "steelbrick.com", + "steemit.com", + "steezylist.com", + "steganos.com", + "steganos.net", + "stem.ac.uk", + "stemacademy.ac.uk", + "stemequals.ac.uk", + "stepchina.com", + "stepdaughter.love", + "stepfamilyporn.com", + "stephaniered.com", + "stephenson.ac.uk", + "stephensoncoll.ac.uk", + "stepmaturesex.com", + "stepmom.one", + "stepsiblingscaught.com", + "sterling.ac.uk", + "stets.ac.uk", + "stfc.ac.uk", + "stgeorges.ac.uk", + "stgloballink.com", + "sth-leic-coll.ac.uk", + "stheadline.com", + "sthelens.ac.uk", + "sthelensacl.ac.uk", + "sthoo.com", + "stickam.com", + "stickeraction.com", + "stickofjoy.com", + "stileproject.com", + "stimorolsex.com", + "stin31.ru", + "stingrayengine.com", + "stir.ac.uk", + "stirling.ac.uk", + "stjohns-nottm.ac.uk", + "stlouisbmw.net", + "stloyes.ac.uk", + "stlukes.ac.uk", + "stmartins.ac.uk", + "stmarys-belfast.ac.uk", + "stmarys-blackburn.ac.uk", + "stmarys-sfc.ac.uk", + "stmarys.ac.uk", + "stmarysblackburn.ac.uk", + "stmaryslondon.ac.uk", + "stmellitus.ac.uk", + "stmellituscollege.ac.uk", + "stmichaels.ac.uk", + "sto.cc", + "stockagainstphotography.com", + "stockbill.ac.uk", + "stocking-tease.com", + "stockingfetishvideo.com", + "stockport.ac.uk", + "stockton.ac.uk", + "stocktonlearningandskillsservice.ac.uk", + "stocktonsfc.ac.uk", + "stocsf.ac.uk", + "stokecoll.ac.uk", + "stokecollege.ac.uk", + "stokesfc.ac.uk", + "stomp.ac.uk", + "stonefoxlingerie.com", + "stonefoxproductions.com", + "stonyhurst.ac.uk", + "stoporganharvesting.org", + "stoptibetcrisis.net", + "storage.googleapis.com", + "storagenewsletter.com", + "storcuram.ac.uk", + "store-bridgestonesports.com", + "storesense.com", + "stories.google", + "storiesofchange.ac.uk", + "storiesonline.net", + "storify.com", + "storj.io", + "storm.mg", + "stormmediagroup.com", + "storyful.com", + "stourbridge.ac.uk", + "stow.ac.uk", + "stoweboyd.com", + "stpadarns.ac.uk", + "straightouttasomewhere.com", + "straightpornstuds.com", + "straitstimes.com", + "stran.ac.uk", + "stranabg.com", + "straplessdildo.com", + "strat-avon.ac.uk", + "stratavoncol.ac.uk", + "stratford.ac.uk", + "stratfordislanduniversitycentre.ac.uk", + "stratforduniversitycentre.ac.uk", + "stratgroup.ac.uk", + "strath.ac.uk", + "strathclyde.ac.uk", + "strathmore.ac.uk", + "stream-mydirtyhobby.biz", + "streamable.com", + "streamate.com", + "streamingdisney.net", + "streamingporn.xyz", + "streamingthe.net", + "streamlatina.com", + "streamporn.cc", + "streamporn.pw", + "streamsex.com", + "streema.com", + "streetmeatasia.com", + "streetvoice.com", + "strepsils.at", + "strepsils.ch", + "strepsils.co.kr", + "strepsils.co.nz", + "strepsils.co.za", + "strepsils.com.ar", + "strepsils.com.au", + "strepsils.com.br", + "strepsils.com.co", + "strepsils.com.hk", + "strepsils.com.ph", + "strepsils.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.us", + "strepsilsarabia.com", + "streva.ac.uk", + "striek.com", + "strikingly.com", + "strikinglycdn.com", + "strip-poker.xxx", + "stripcamfun.com", + "stripchat.com", + "stripe-terminal-local-reader.net", + "stripe.ac.uk", + "stripe.com", + "stripe.network", + "stripecdn.com", + "stripparadise.com", + "stripselector.com", + "stripskunk.com", + "stripst.com", + "strode-coll.ac.uk", + "strode-college.ac.uk", + "strodes.ac.uk", + "strodeslanguages.ac.uk", + "strongvpn.com", + "strongwindpress.com", + "stroud.ac.uk", + "stroudcol.ac.uk", + "stroudcollege.ac.uk", + "sttc.ac.uk", + "student.tw", + "studentengagement.ac.uk", + "studentsforafreetibet.org", + "studentshows.ac.uk", + "studentvoteregistration.ac.uk", + "studentvoterregistration.ac.uk", + "studiobeatsbydrdre.com", + "studiofow.com", + "studiolico.com", + "studioluxus.com", + "studioncorp.com", + "studiopaint.com", + "studiosucks.com", + "studygroup.ac.uk", + "studyhigher.ac.uk", + "studyinengland.ac.uk", + "studyingeconomics.ac.uk", + "studyinglanguages.ac.uk", + "studyinwales.ac.uk", + "studylondon.ac.uk", + "studywatchbyverily.com", + "studywatchbyverily.org", + "studywithplymouth.ac.uk", + "stufferdb.com", + "stuidok110.com", + "stuk.ac.uk", + "stumbleupon.com", + "stunnel.org", + "stupidcams.com", + "stupidvideos.com", + "stvincent.ac.uk", + "stweetly.com", + "stxmosquito.com", + "stxmosquitoproject.com", + "stxmosquitoproject.net", + "stxmosquitoproject.org", + "sub147.com", + "sublimedirectory.com", + "sublimetext.com", + "submarin.online", + "submittal-log.com", + "submityourflicks.com", + "subscene.com", + "substack.com", + "suburbansolutions.ac.uk", + "succeeds.ac.uk", + "successfn.com", + "successwithteams.com", + "sucksex.com", + "sueddeutsche.de", + "suffolk-maag.ac.uk", + "suffolk.ac.uk", + "suffolkacademiestrust.ac.uk", + "suffolkbusinessschool.ac.uk", + "suffolkone.ac.uk", + "sugarsync.com", + "sugobbs.com", + "sugumiru18.com", + "suissl.com", + "sukafeti.jp", + "sukebelinks.com", + "sulc.ac.uk", + "sulian.me", + "sulne.ac.uk", + "sulsa.ac.uk", + "sulwerphoto.com", + "sumac.ac.uk", + "summify.com", + "sumomo-ch.com", + "sumrando.com", + "sums.ac.uk", + "sumsconsulting.ac.uk", + "sun.com", + "sun1911.com", + "sunbingo.co.uk", + "suncat.ac.uk", + "suncol.ac.uk", + "sund.ac.uk", + "sundanceignite2016.com", + "sundayguardianlive.com", + "sundayready.com", + "sunderland.ac.uk", + "sunderlandcollege.ac.uk", + "sunderlandsixthform.ac.uk", + "sunglassessale2014.com", + "sunitec.ac.uk", + "sunmedia.ca", + "suno.ai", + "sunporno.com", + "sunskyforum.com", + "sunta.com.tw", + "sunvpn.net", + "suoluo.org", + "supa.ac.uk", + "supanimegames.com", + "supc.ac.uk", + "supchina.com", + "superadultgames.com", + "supercell.com", + "supercell.net", + "supercoach.com.au", + "supercomputingwales.ac.uk", + "superdarn.ac.uk", + "superearsenjoy.com", + "superfreevpn.com", + "supergratisporno.com", + "superhqporn.com", + "superjanet.ac.uk", + "superjapanesesex.com", + "superjournal.ac.uk", + "supermario.com", + "supermario3dworld.com", + "supermariogalaxy.com", + "supermariorun.com", + "superokayama.com", + "superpages.com", + "superpapermario.com", + "supersexeamateur.com", + "superstation.com.tw", + "superstem.ac.uk", + "supertop-100.com", + "superuser.com", + "supervpn.net", + "superzooi.com", + "supjav.com", + "suppig.net", + "supply-chain.ac.uk", + "supplybestjerseys.com", + "supportfacebook.com", + "supremacy.com", + "supremacy.net", + "suprememastertv.com", + "sureporn.com", + "surf.ac.uk", + "surface.com", + "surfeasy.com", + "surfeasy.com.au", + "surflite.co", + "surflite.net", + "surfshark.com", + "suroot.com", + "surrart.ac.uk", + "surrealismcentre.ac.uk", + "surrenderat20.net", + "surrey.ac.uk", + "surreyadultlearning.ac.uk", + "surreyibc.ac.uk", + "surreyspace.ac.uk", + "suruga-ya.com", + "suruga-ya.jp", + "surveynet.ac.uk", + "suschem-nottingham-cdt.ac.uk", + "sushi.ski", + "susiewildin.com", + "sussex.ac.uk", + "sussexbusinessschool.ac.uk", + "sussexcoast.ac.uk", + "sussexdowns.ac.uk", + "sussexmedicalschool.ac.uk", + "sussexvirtualcollege.ac.uk", + "sussp.ac.uk", + "sustain.ac.uk", + "sustainability.google", + "sustainabilityexchange.ac.uk", + "sustainablebuildingstudio.com", + "sustainabledesigncouncil.com", + "sustainabledesigncouncil.net", + "sustainablehydrogen-cdt.ac.uk", + "sustainablelifestyles.ac.uk", + "sustainablepractices.ac.uk", + "sustainableproperty.ac.uk", + "sustainableprosperity.ac.uk", + "sustainabletechnologies.ac.uk", + "sustainsteel.ac.uk", + "sustainthesound.com", + "susx.ac.uk", + "sutcol.ac.uk", + "sutcoll.ac.uk", + "suttoncollege.ac.uk", + "suxib.com", + "suxiebu.com", + "suyangg.com", + "svaboda.org", + "svc.ms", + "svensksexfilm.com", + "sverigebeatsbydrdre.com", + "svipshipin.store", + "svoboda.org", + "svobodnaevropa.bg", + "svp-team.com", + "svpply.com", + "svscomics.asia", + "svscomics.com", + "svsfx.com", + "svsgames.org", + "sw-iot.ac.uk", + "swag-live.co", + "swag.live", + "swagbucks.com", + "swan.ac.uk", + "swancoll.ac.uk", + "swanmet.ac.uk", + "swansea-institute.ac.uk", + "swansea.ac.uk", + "swanseamet.ac.uk", + "swap.ac.uk", + "swapbox.ac.uk", + "swapsmut.com", + "swapspace.co", + "swarf.ac.uk", + "sway-cdn.com", + "sway.com", + "swbio.ac.uk", + "swbusdev.com", + "swc.ac.uk", + "swdtc.ac.uk", + "swdtp.ac.uk", + "sweep.ac.uk", + "sweetadult-tube.com", + "sweetandmaxwell.co.uk", + "sweetsext.com", + "sweetsinner.com", + "swegold.com", + "sweltec.ac.uk", + "swift.ac.uk", + "swift.org", + "swiftbank.info", + "swiftbank.us", + "swiftcapital.com", + "swiftfinancial.com", + "swiftfinancial.info", + "swiftfinancial.net", + "swincoll.ac.uk", + "swindon-college.ac.uk", + "swindon.ac.uk", + "swindonart.ac.uk", + "swingercuckoldporn.com", + "swingerpornfun.com", + "swingerporntube.com", + "swingers-homemade-videos.com", + "swingersexorgy.com", + "swingexpert.nl", + "swiot.ac.uk", + "swiss-machining.com", + "swiss-turn.com", + "swissid.ch", + "swissign.com", + "swissign.li", + "swissinfo.ch", + "swisssign-group.ch", + "swisssign-group.com", + "swisssign-group.li", + "swisssign.ch", + "swisssign.com", + "swisssign.li", + "swisssign.net", + "swisssign.org", + "swisssigner.ch", + "swisssigner.com", + "swisssigngroup.ch", + "swisssigngroup.com", + "swissstick.com", + "swisstsa.ch", + "swisstsa.li", + "swissvpn.net", + "switch1.jp", + "switchvpn.net", + "swjedifallenorder.com", + "swjfo.com", + "swlacademicnetwork.ac.uk", + "swlc.ac.uk", + "swoo.sh", + "swoosh.com", + "swoosh.tv", + "sworcs.ac.uk", + "swrac.ac.uk", + "swtor.com", + "swtor.net", + "swurcc.ac.uk", + "sww-ahdtp.ac.uk", + "swwcte.ac.uk", + "swwhep.ac.uk", + "sx.ac.uk", + "sxarab.top", + "sxshentai.com", + "sxyprn.com", + "sybj91.one", + "sybjav.online", + "sycolleges.ac.uk", + "sydneytoday.com", + "syfec.ac.uk", + "syfor.click", + "syhacked.com", + "sylfoundation.org", + "symantec.com", + "symcb.com", + "symcd.com", + "symonds.ac.uk", + "synaptic.net", + "synbio-cdt.ac.uk", + "syncback.com", + "syncbak.com", + "synergyse.com", + "synology.com", + "synologydownload.com", + "synologyupdate.com", + "synsym.ac.uk", + "syntheticbiology.ac.uk", + "syosetu.com", + "sysinternals.com", + "sysmic.ac.uk", + "sysresccd.org", + "systemicrisk.ac.uk", + "sytes.net", + "syx86.cn", + "syx86.com", + "syzbj36.xyz", + "szabadeuropa.hu", + "szbbs.net", + "szcheapmonsterheadphones.com", + "szetowah.org.hk", + "szexvideo.top", + "szwinnertechnology.com", + "t-g.com", + "t-mus.ac.uk", + "t-splines.com", + "t.co", + "t.me", + "t35.com", + "t35hosting.com", + "t66y.com", + "t91y.com", + "taa-usa.org", + "taaze.tw", + "tablesgenerator.com", + "tablet-academy.ac.uk", + "taboola.com", + "tabooporn.tv", + "tabooporns.com", + "tabootube.xxx", + "tabtter.jp", + "tabustudios.co", + "tacamateurs.com", + "tacc.ac.uk", + "tacem.org", + "tachusz.xyz", + "taconet.com.tw", + "taedp.org.tw", + "tafm.org", + "tagapie.com.tw", + "tagesschau.de", + "tags.ac.uk", + "tagwa.org.au", + "tagwalk.com", + "tahr.org.tw", + "taiav.com", + "tail-f.com", + "tailf.com", + "tailscale.com", + "tailscale.io", + "tailwindtraders.com", + "taiolongdh.sbs", + "taipei.gov.tw", + "taipeisociety.org", + "taipeitimes.com", + "taisounds.com", + "tait.ac.uk", + "taiwan-sex.com", + "taiwanadultexpo.com", + "taiwanbible.com", + "taiwancon.com", + "taiwandaily.net", + "taiwandc.org", + "taiwanhot.net", + "taiwanjobs.gov.tw", + "taiwanjustice.com", + "taiwanjustice.net", + "taiwankiss.com", + "taiwannation.com", + "taiwannation.com.tw", + "taiwanncf.org.tw", + "taiwannews.com.tw", + "taiwanonline.cc", + "taiwansex.tw", + "taiwantp.net", + "taiwantt.org.tw", + "taiwanus.net", + "taiwanyes.com", + "take2games.com", + "takegoto.com", + "takens.tw", + "takeyourplace.ac.uk", + "taknai.com", + "takporn.com", + "talentlens.com", + "taleofthenight.com", + "talk853.com", + "talkboxapp.com", + "talkcc.com", + "talkinghealthmatters.ac.uk", + "talkonly.net", + "talksport.com", + "tamescol.ac.uk", + "tameside-acl.ac.uk", + "tameside.ac.uk", + "tamesidecollege.ac.uk", + "tamiaode.tk", + "tamilsexvideos.cc", + "tampabay.com", + "tamworth.ac.uk", + "tamworthandlichfield.ac.uk", + "tanc.org", + "tandberg-china.com", + "tandberg.com", + "tandf.co.uk", + "tandfonline.com", + "tanflix.com", + "tangben.com", + "tangbr.net", + "tangren.us", + "tantaly.com", + "taoil-cn.sbs", + "taoism.net", + "taolun.info", + "taose.in", + "tapanwap.com", + "tapatalk.com", + "tapb.ac.uk", + "tapestry.ac.uk", + "taptotokyo.com", + "taqunuhai.vip", + "taradinhos.com", + "taragana.com", + "tarf-lcv.ac.uk", + "target.com", + "targetedgrad.ac.uk", + "targetimg1.com", + "tarn.ac.uk", + "tasc.ac.uk", + "tascn.com.au", + "tasexy.com", + "tasexy.top", + "taste.com.au", + "tasteofpremium.jp", + "tastyblacks.com", + "tati-log.com", + "tau.ac.uk", + "tauntons.ac.uk", + "taup.net", + "taup.org.tw", + "tavi-port.ac.uk", + "tavistockandportman.ac.uk", + "tavistockrelationships.ac.uk", + "taweet.com", + "tawny-peaks.com", + "taxi69.com", + "taxidrivermovie.com", + "tay.ac.uk", + "taylorandfrancis.com", + "taylorfrancis.com", + "tbcollege.org", + "tbi.org.hk", + "tbib.org", + "tbicn.org", + "tbjyt.org", + "tbm.ac.uk", + "tbpic.info", + "tbrc.org", + "tbs-rainbow.org", + "tbsec.org", + "tbsmalaysia.org", + "tbsn.org", + "tbsseattle.org", + "tbssqh.org", + "tbswd.org", + "tbtemple.org.uk", + "tbthouston.org", + "tcat.ac.uk", + "tcch.ac.uk", + "tccr.ac.uk", + "tccwonline.org", + "tcewf.org", + "tcg.ac.uk", + "tchrd.org", + "tcm.ac.uk", + "tcnynj.org", + "tcpartnership.ac.uk", + "tcpspeed.co", + "tcpspeed.com", + "tcsofbc.org", + "tcsovi.org", + "tdesktop.com", + "tdm.com.mo", + "tdotp.ac.uk", + "teachenergy.ac.uk", + "teacherfucksteens.com", + "teachingaccessibility.ac.uk", + "teachingshakespeare.ac.uk", + "teachmyass.com", + "teachparentstech.org", + "teamamericany.com", + "teamneedforspeed.com", + "teamskeet.com", + "teamviewer.com", + "teamviewer.us", + "teamwork.ac.uk", + "tean.ac.uk", + "tearapeak.com", + "teatroporno.com", + "tec.ac.uk", + "techatbloomberg.com", + "techcrunch.com", + "techextra.ac.uk", + "techhub.ms", + "techliquidators.com", + "techne.ac.uk", + "technews.tw", + "technics.com", + "technologyandsociety.org", + "techradar.com", + "techspot.com", + "techstreet.com", + "techtimes.com", + "techviz.net", + "techxtra.ac.uk", + "teck.in", + "teco-hk.org", + "teco-mo.org", + "ted.com", + "tedcdn.com", + "teddysun.com", + "tedi-london.ac.uk", + "tedi.ac.uk", + "teds.ac.uk", + "teen-girl.net", + "teen-lover.net", + "teen-sexy.com", + "teen3x.mobi", + "teenagefucking.com", + "teenchoice.com", + "teendreams.com", + "teenfucks.org", + "teengirlfriendtube.com", + "teeniefuck.net", + "teenporngallery.net", + "teenporntube.xxx", + "teenpornvideo.xxx", + "teenport.com", + "teenpussypicture.com", + "teenqueens.net", + "teenrave.org", + "teensex.me", + "teensinasia.com", + "teensloveanal.com", + "teensloveporn.net", + "teensnow.com", + "teensnow.link", + "teentube.pro", + "teenwebcamtube.com", + "teepr.com", + "tees.ac.uk", + "teeslearn.ac.uk", + "teesside.ac.uk", + "teesvalley-acl.ac.uk", + "teeztube.com", + "tegrazone.co", + "tegrazone.co.kr", + "tegrazone.com", + "tegrazone.jp", + "tegrazone.kr", + "tehrantimes.com", + "tel.ac.uk", + "telebay.com", + "telecomspace.com", + "telega.one", + "telegra.ph", + "telegram-cdn.org", + "telegram-porn.com", + "telegram.dog", + "telegram.me", + "telegram.org", + "telegram.space", + "telegramdownload.com", + "telegraph.co.uk", + "telekom.com", + "telekom.de", + "telesco.pe", + "telesec.de", + "telesell.com", + "telex.cc", + "telfordcollege.ac.uk", + "tellapart.com", + "tellme.pw", + "tellmewhygame.com", + "tellusgb.ac.uk", + "telri.ac.uk", + "temenos.ac.uk", + "temetube.xyz", + "tempusuk.ac.uk", + "tenacy.com", + "tenbyfotolia.com", + "tenor.com", + "tensorflow.org", + "tentowns.ac.uk", + "tenzinpalmo.com", + "terabox.com", + "terapeack.com", + "terapeak.ca", + "terapeak.com", + "terapeak.com.hk", + "terapeak.hk", + "terapeak.info", + "teraperk.com", + "terc.ac.uk", + "terk.nl", + "termius.com", + "termux.com", + "termux.dev", + "termux.org", + "terraform.io", + "terragraph.com", + "terrapeak.com", + "tesla.com", + "tesla.services", + "teslaenergy.services", + "teslamotors.com", + "teslazta.net", + "test-ipv6.cl", + "test-ipv6.com", + "test-ipv6.cz", + "test-ipv6.hu", + "test-ipv6.is", + "test-ipv6.se", + "testa.ac.uk", + "testipv6.de", + "testonfox.com", + "tettediferro.it", + "tew.org", + "tex-talk.net", + "tex.ac.uk", + "textminingcentre.ac.uk", + "textnow.me", + "texttobuy.org", + "texture.com", + "tferwq.com", + "tfhub.dev", + "tfiflve.com", + "tfsallin.net", + "tg.dev", + "tgac.ac.uk", + "tgirlcentral.com", + "tgirlpostop.com", + "tgp6.com", + "tgstat.com", + "tgtube.com", + "tgutube.com", + "thai-xxx.com", + "thai69.com", + "thaichix.com", + "thaicn.com", + "thaicuties.com", + "thaigirls.net", + "thaigirls100.net", + "thamesgatewaycollege.ac.uk", + "thamesvalleytraining.ac.uk", + "thanet.ac.uk", + "thanetcollege.ac.uk", + "thanksloyalty.com", + "thatcham.ac.uk", + "thawte.com", + "thawte.de", + "thawte.fr", + "thb.gov.tw", + "thdh.cc", + "the-area.com", + "the-british-museum.ac.uk", + "the-britishmuseum.ac.uk", + "the-etc.ac.uk", + "the-japan-news.com", + "the-m-festival.com", + "the-monster-beats.com", + "the-tls.co.uk", + "the123d.com", + "theadulthub.com", + "theaffairs.com", + "theage.com.au", + "thealanturinginstitute.ac.uk", + "thearden.ac.uk", + "theatlantic.com", + "theatrum-belli.com", + "theaustralian.com.au", + "theav.cc", + "theav.xyz", + "theb.ai", + "thebanker.com", + "thebankerdatabase.com", + "thebayuk.com", + "thebcc.ac.uk", + "thebcomplex.com", + "thebeatsbydre.com", + "thebeatsbydre.net", + "thebeatsheadphonesale.com", + "thebestfetishsites.com", + "theblaze.com", + "theblemish.com", + "theblock.co", + "thebobs.com", + "thebodyshop-usa.com", + "thebondagefiles.com", + "thebritishacademy.ac.uk", + "thebritishmuseum.ac.uk", + "thecamdude.com", + "thecandidbay.com", + "thecandidforum-voyeur.ru", + "thechesterfieldcollegegroup.ac.uk", + "thechinabeat.org", + "thechinacollection.org", + "thechinaproject.com", + "thechinastory.org", + "thechronicle.com.au", + "theclasshroom.com", + "thecleversense.com", + "theclub.com.hk", + "theclubprive.com", + "thecobaltstudy.ac.uk", + "thecompaqstore.com", + "thecontactpartnership.ac.uk", + "theconversation.com", + "thecpc.ac.uk", + "thecuckold.com", + "thecuckoldporn.com", + "thedailysnkr.com", + "thedalailamamovie.com", + "thedesignworkshop.com", + "thedesk.com", + "thedigitalpicture.ac.uk", + "thediplomat.com", + "thedreadwolfrises.com", + "thedw.us", + "theebayshop.com", + "theepochtimes.com", + "theepochtimessubscribe.com", + "theetc.ac.uk", + "thefacebook.com", + "thefacebook.net", + "thefappening.pro", + "thefappening.wiki", + "thefappeningblog.com", + "thefind.com", + "thefoxnation.com", + "thefrontier.hk", + "thegatewaypundit.com", + "thegay.com", + "thegayoffice.com", + "thegeorgiascene.com", + "thegioitinhoc.vn", + "thegithubshop.com", + "theglobalsite.ac.uk", + "thegly.com", + "thegooglestore.com", + "thegraduationproject.ac.uk", + "theguardian.com", + "theguardiandns.com", + "thehabibshow.com", + "thehealthsite.com", + "thehenleycollege.ac.uk", + "thehentaiworld.com", + "thehindu.com", + "thehots.info", + "thehousenews.com", + "thehulubraintrust.com", + "thehun.net", + "theindianleaks.com", + "theinitium.com", + "theinstagramhack.com", + "theintelstore.com", + "theinternetlawschool.ac.uk", + "theinventionworks.com", + "theinventionworks.net", + "thekarups.com", + "theknowledgeacademy.ac.uk", + "thelancet.com", + "theleakbay.com", + "thelearningcentrebexley.ac.uk", + "thelearningconsortium.ac.uk", + "thelearningmatrix.ac.uk", + "thelegendarystarfy.com", + "theletterspage.ac.uk", + "thelittleslush.com", + "thelondonknowledgelab.ac.uk", + "theman.in", + "themanchestercollege.ac.uk", + "themarvelexperiencetour.com", + "themathsfactor.com", + "themercury.com.au", + "themessengeradelaide.com.au", + "themilfmovies.com", + "themis.ac.uk", + "themoviedb.org", + "thenationalpulse.com", + "thenewgirlspooping.com", + "thenewporn.com", + "thenewslens.com", + "thenextweb.com", + "thenipslip.com", + "theoca.ac.uk", + "theopportunityproject.org", + "thepaypalshop.com", + "thepervs.com", + "thepiratebay.ee", + "thepiratebay.org", + "theplatform.com", + "theporn.cc", + "thepornarea.com", + "thepornbest.com", + "thepornbet.com", + "thepornbin.com", + "thepornblender.com", + "theporndude.cc", + "theporndude.com", + "theporndude.vip", + "thepornguy.org", + "thepornlinks.com", + "thepornlist.com", + "thepornlist.net", + "thepornlistdude.com", + "thepornmap.com", + "thepornscat.com", + "theporntoplist.com", + "theporny.com", + "theportalwiki.com", + "theprint.in", + "thereallove.kr", + "therock.net.nz", + "theroslininstitute.ac.uk", + "thesafeporn.com", + "thesaturdaypaper.com.au", + "thesaurus.ac.uk", + "thescottishsun.co.uk", + "thesenses.ac.uk", + "thesesalive.ac.uk", + "thesffblog.com", + "theshoppingexpresslane.net", + "thesims.com", + "thesims3.com", + "thesims4.com", + "thesimssocial.com", + "theskillsco.ac.uk", + "thespeeder.com", + "thestandard.com.hk", + "thestandnews.com", + "thestar.com", + "thestationbymaker.com", + "thesun.co.uk", + "thesun.ie", + "thesundaytimes.co.uk", + "thethothub.com", + "thetibetcenter.org", + "thetibetconnection.org", + "thetibetmuseum.org", + "thetibetpost.com", + "thetimes.co.uk", + "thetimes.ie", + "thetinhat.com", + "thetranny.com", + "thetread.com", + "thetrotskymovie.com", + "thetvdb.com", + "thetype.com", + "theuab.net", + "theverge.com", + "thevirtualsexreview.com", + "thevivekspot.com", + "theweek.in", + "thewgo.org", + "thewomenslibrary.ac.uk", + "thewonderful101.com", + "theync.com", + "theyxxx.com", + "thieme-connect.com", + "thieme-connect.de", + "thieme.com", + "thieme.de", + "thinkboxsoftware.com", + "thinkdifferent.us", + "thinkgeek.com", + "thinkhigher.ac.uk", + "thinkhk.com", + "thinking3d.ac.uk", + "thinkingtaiwan.com", + "thinkofliving.com", + "thinkquarterly.co.uk", + "thinkquarterly.com", + "thinkwales.ac.uk", + "thinkwithgoogle.com", + "thisav.com", + "thisismoney.co.uk", + "thisispolaris.com", + "thismon.ee", + "thisvid.com", + "thisvidscat.net", + "thlib.org", + "thomasbernhard.org", + "thomasdanby.ac.uk", + "thomashpc.ac.uk", + "thomasway.ac.uk", + "thomroth.ac.uk", + "thomsonreuters.ca", + "thomsonreuters.cn", + "thomsonreuters.co.jp", + "thomsonreuters.co.kr", + "thomsonreuters.co.nz", + "thomsonreuters.co.uk", + "thomsonreuters.com", + "thomsonreuters.com.ar", + "thomsonreuters.com.au", + "thomsonreuters.com.br", + "thomsonreuters.com.hk", + "thomsonreuters.com.my", + "thomsonreuters.com.pe", + "thomsonreuters.com.sg", + "thomsonreuters.com.tr", + "thomsonreuters.es", + "thomsonreuters.in", + "thomsonreuters.ru", + "thomsonreutersmexico.com", + "thongdreams.com", + "thornbeck.ac.uk", + "thotbook.tv", + "thothub.ru", + "thothub.to", + "thottok.com", + "thotvids.com", + "threadreaderapp.com", + "threads.net", + "threatchaos.com", + "thri.xxx", + "thrixxx.com", + "thron.com", + "throughnightsfire.com", + "thtmod1.com", + "thumbnailseries.com", + "thumbzilla.com", + "thunderbird.net", + "thunderbolttechnology.net", + "thurrock.ac.uk", + "thurrockcampus.ac.uk", + "thywords.com", + "thywords.com.tw", + "thz7.net", + "thzu.cc", + "tiananmenduizhi.com", + "tiananmenmother.org", + "tiananmenuniv.com", + "tiananmenuniv.net", + "tiandixing.org", + "tianhuayuan.com", + "tianlawoffice.com", + "tiantang.today", + "tianti.io", + "tiantibooks.org", + "tianyantong.org.cn", + "tianzhu.org", + "tiava.com", + "tiava1.com", + "tiaz.site", + "tiberiumalliances.com", + "tibet-envoy.eu", + "tibet-foundation.org", + "tibet-house-trust.co.uk", + "tibet-info.net", + "tibet-initiative.de", + "tibet-munich.de", + "tibet.a.se", + "tibet.at", + "tibet.ca", + "tibet.com", + "tibet.fr", + "tibet.net", + "tibet.nu", + "tibet.org", + "tibet.org.tw", + "tibet.sk", + "tibet.to", + "tibet3rdpole.org", + "tibetaction.net", + "tibetaid.org", + "tibetalk.com", + "tibetan-alliance.org", + "tibetan.fr", + "tibetanaidproject.org", + "tibetanarts.org", + "tibetanbuddhistinstitute.org", + "tibetancommunity.org", + "tibetancommunityuk.net", + "tibetanculture.org", + "tibetanentrepreneurs.org", + "tibetanfeministcollective.org", + "tibetanhealth.org", + "tibetanjournal.com", + "tibetanlanguage.org", + "tibetanliberation.org", + "tibetanpaintings.com", + "tibetanphotoproject.com", + "tibetanpoliticalreview.org", + "tibetanreview.net", + "tibetansports.org", + "tibetanwomen.org", + "tibetanyouth.org", + "tibetanyouthcongress.org", + "tibetcharity.dk", + "tibetcharity.in", + "tibetchild.org", + "tibetcity.com", + "tibetcollection.com", + "tibetcorps.org", + "tibetexpress.net", + "tibetfocus.com", + "tibetfund.org", + "tibetgermany.com", + "tibetgermany.de", + "tibethaus.com", + "tibetheritagefund.org", + "tibethouse.jp", + "tibethouse.org", + "tibethouse.us", + "tibetinfonet.net", + "tibetjustice.org", + "tibetkomite.dk", + "tibetmuseum.org", + "tibetnetwork.org", + "tibetoffice.ch", + "tibetoffice.com.au", + "tibetoffice.eu", + "tibetoffice.org", + "tibetonline.com", + "tibetonline.tv", + "tibetoralhistory.org", + "tibetpolicy.eu", + "tibetrelieffund.co.uk", + "tibetsites.com", + "tibetsociety.com", + "tibetsun.com", + "tibetsupportgroup.org", + "tibetswiss.ch", + "tibettelegraph.com", + "tibettimes.net", + "tibettruth.com", + "tibetwrites.org", + "tiburon.com", + "tic.ac.uk", + "tickdata.com", + "ticket.com.tw", + "tictoc.video", + "tictocs.ac.uk", + "tidal.com", + "tidalhifi.com", + "tidelift.com", + "tiendabestbuy.com", + "tiffany-towers.com", + "tig-ol-bitties.live", + "tigervpn.com", + "tiipple.ac.uk", + "tik-tokapi.com", + "tiktok.com", + "tiktokcdn-eu.com", + "tiktokcdn-us.com", + "tiktokcdn.com", + "tiktokd.net", + "tiktokd.org", + "tiktokv.com", + "tiktokv.eu", + "tiktokv.us", + "tiktokw.eu", + "tiktokw.us", + "tilehill.ac.uk", + "tiltbrush.com", + "timdir.com", + "time.com", + "time.gov", + "timefxapp.com", + "timelinestoryteller.com", + "timesmembership.com", + "timesnownews.com", + "timestalks.com", + "timi1.me", + "timo0.com", + "timsah.com", + "timtales.com", + "tinc-vpn.org", + "tiney.com", + "tineye.com", + "ting53.xyz", + "tinhduc.org", + "tinkerboxapp.com", + "tinkercad.com", + "tinkerentertainment.com", + "tinkerplay.net", + "tintuc101.com", + "tiny.cc", + "tiny4k.com", + "tinychat.com", + "tinypaste.com", + "tinyurl.com", + "tiohentai.com", + "tipas.net", + "tipo.gov.tw", + "tipple.ac.uk", + "tire-cadcam.com", + "tiresplus.com", + "tistory.com", + "titanfall.com", + "title.sh", + "titsandtugs.com", + "titsbox.com", + "titsintops.com", + "tittykings.com", + "tkb008.xyz", + "tkb2233.life", + "tkbqf2.life", + "tkcs-collins.com", + "tktube.com", + "tl.ac.uk", + "tl.gd", + "tla.ac.uk", + "tlc.ac.uk", + "tlcbexley.ac.uk", + "tlccollege.ac.uk", + "tlcmd.ac.uk", + "tlcmoodle.ac.uk", + "tltp.ac.uk", + "tma.co.jp", + "tmagazine.com", + "tmc.ac.uk", + "tmcs.ac.uk", + "tmdb.org", + "tmdfish.com", + "tmei-taoyuan.com", + "tmi.me", + "tmn.ac.uk", + "tmpp.org", + "tmsnrt.rs", + "tnaflix.com", + "tnatryouts.com", + "tngrnow.com", + "tngrnow.net", + "tnntoday.com", + "tnp.org", + "tnt-ea.com", + "to-porno.com", + "toget.com.tw", + "togetter.com", + "toh.info", + "tohoku.ac.jp", + "tokyo-247.com", + "tokyo-hot.com", + "tokyo-porn-tube.com", + "tokyo-sports.co.jp", + "tokyo-tosho.net", + "tokyocn.com", + "tokyomotion.com", + "tokyomotion.net", + "tokyonightstyle.com", + "tokyoporns.com", + "tokyotosho.info", + "tokyotosho.se", + "tomatespodres.com", + "tombola.ac.uk", + "tomonews.net", + "tomsguide.com", + "tonec.com", + "tongil.or.kr", + "tonicmovies.com", + "tono-oka.jp", + "tonyyan.net", + "toodoc.com", + "toolforge.org", + "toolmaking-cadcam.com", + "toomadporn.pro", + "toon-3d.com", + "toonel.net", + "toonsearch.net", + "toonsexblog.com", + "top.tv", + "top100nl.net", + "top100sexgames.com", + "top10vpn.com", + "top81.ws", + "topadultgames.biz", + "topanime.biz", + "topartporn.com", + "topaz.ne.jp", + "topbabesblog.org", + "topbeatsbydrdreoutlet.com", + "topbeatsdealer.com", + "topbeatsforsale.com", + "topbtc.com", + "topcartoonsites.com", + "topcelebnudes.com", + "topchats.com", + "topchineseporn.com", + "topcoder.com", + "topcuckolds.com", + "toperoticartsites.com", + "topescort.nl", + "topescortbabes.com", + "topexhib.net", + "topface.com", + "topfantasyart.com", + "topfreepornvideos.com", + "tophd.xxx", + "tophdsex.com", + "tophentai.biz", + "tophentaicomics.com", + "toplayerserver.com", + "topmanga.biz", + "topnews.in", + "topnudemalecelebs.com", + "topobase.com", + "topporn.me", + "toppornguide.com", + "toppornoduro.com", + "toppornsites.com", + "toppornsites.net", + "toprealvideos.com", + "topsexart.com", + "topsexhdvideos.com", + "topsexygames.com", + "topshareware.com", + "topsy.com", + "toptip.ca", + "toptoonsites.com", + "topvids.net", + "topxxxpornvids.com", + "topyoungporn.com", + "tora.to", + "torcidadeouro.com", + "torcn.com", + "torguard.net", + "torlock.com", + "toroporno.com", + "torproject.org", + "torrentgalaxy.to", + "torrentkitty.tv", + "torrentprivacy.com", + "torrentproject.se", + "torrenty.org", + "torrentz.eu", + "torrindex.net", + "tortoisesvn.net", + "torvpn.com", + "tospo-keiba.jp", + "totalmateria.com", + "totalvpn.com", + "totoleak.com", + "totton.ac.uk", + "toucan-network.ac.uk", + "touchid.tv", + "touchid.wang", + "touchsmartpc.com", + "touchsmartpc.net", + "touchsmartpc.org", + "touhouwiki.net", + "tourporno.com", + "tousatu.fun", + "toutapp.com", + "toutiaoabc.com", + "tower.ac.uk", + "towerauction.com", + "towerhamletscollege.ac.uk", + "towerhamletsllls.ac.uk", + "towerhamletslls.ac.uk", + "towngain.com", + "townofsins.com", + "townsvillebulletin.com.au", + "toxin-up.sbs", + "toxinzoo.sbs", + "toy-cadcam.com", + "toycadcam.com", + "toypark.in", + "toythieves.com", + "toytractorshow.com", + "tparents.org", + "tpc.ac.uk", + "tpea.ac.uk", + "tpi.org.tw", + "tpmde.ac.uk", + "tpornstars.com", + "tr.com", + "trac.ac.uk", + "tracfone.com", + "tracingnetworks.ac.uk", + "tracking-location.com", + "tradevip1.com", + "tradingview.com", + "traffcoll.ac.uk", + "traffichaus.com", + "trafficmanager.net", + "trafford.ac.uk", + "traffordcollege.ac.uk", + "traindelayprediction.ac.uk", + "traintogainstoke.ac.uk", + "tranny.one", + "trannygem.com", + "trannytube.tv", + "trannyvideosxxx.com", + "trans.ac.uk", + "trans500.com", + "transangels.com", + "transarmuito.com", + "transcamslive.com", + "transcocon.ac.uk", + "transferwise.com", + "transforming-musicology.ac.uk", + "transformingmusicology.ac.uk", + "transit.ac.uk", + "transitwestyorkshire.ac.uk", + "translate-medtech.ac.uk", + "translate.goog", + "translatetheweb.com", + "translatewiki.net", + "translatewiki.org", + "transnationalmodernlanguages.ac.uk", + "transparency.org", + "transpharmtech-cdt.ac.uk", + "transpharmtech-dtc.ac.uk", + "transpornsites.com", + "travelcontroller.com", + "travelex.be", + "travelex.bh", + "travelex.ca", + "travelex.co.in", + "travelex.co.jp", + "travelex.co.nz", + "travelex.co.uk", + "travelex.com", + "travelex.com.au", + "travelex.com.hk", + "travelex.com.my", + "travelex.com.om", + "travelex.com.tr", + "travelex.de", + "travelex.fr", + "travelex.it", + "travelex.qa", + "travelexae.com", + "travelexch.com", + "travelexmoneycard.com", + "travelgirls.com", + "travelinkcard.com", + "trc.ac.uk", + "treemall.com.tw", + "trello.com", + "trellocdn.com", + "trendmicro.com", + "trendsmap.com", + "trendyporn.com", + "tresham.ac.uk", + "trezor.io", + "tri-london.ac.uk", + "trialofccp.org", + "triballo.net", + "tribler.org", + "trickip.net", + "trickip.org", + "tricky-topics-guide.ac.uk", + "trident.ac.uk", + "trikepatrol.com", + "trilt.ac.uk", + "trimondi.de", + "trinity-bris.ac.uk", + "trinity-cm.ac.uk", + "trinitycollegebristol.ac.uk", + "trinitylaban.ac.uk", + "trinitysaintdavid.ac.uk", + "triokini.com", + "tristatebmw.com", + "trithucvn.net", + "trithucvn.org", + "trixhentai.com", + "trmini.com", + "trocoll.ac.uk", + "troisrivieresmini.com", + "tron.network", + "tronscan.org", + "tropictube.com", + "tropmed.ac.uk", + "trouw.nl", + "trpger.us", + "trs.ac.uk", + "trt.net.tr", + "trtc.com.tw", + "trueamateurmodels.com", + "trueamateurs.com", + "trueanal.com", + "truebeachporn.com", + "truebim.com", + "truebuddha-md.org", + "truedepth3d.com", + "truedwg.com", + "truefi.io", + "trulyergonomic.com", + "trunest.com", + "truro-penwith.ac.uk", + "truro.ac.uk", + "trurocollege.ac.uk", + "truropenwith.ac.uk", + "trust-provider.com", + "trustcor.ca", + "trustcor.com", + "trustdoc.ch", + "trusted-dwg.com", + "trustedanalytics.com", + "trustedanalytics.net", + "trusteddwg.com", + "trustedpeach.com", + "trustisfps.com", + "trustsign.ch", + "trustwave.com", + "truthontour.org", + "truthordarepics.com", + "truthsocial.com", + "truveo.com", + "truyen-hentai.com", + "truyen-hentai.fr", + "truyen-hentai.ru", + "truyen18.xyz", + "truyengihay.net", + "truyenhentai.xyz", + "truyenkk1.com", + "truyentranh86.com", + "truyenwk.com", + "tryalias.com", + "tryboobs.com", + "trycloudflare.com", + "trycuckold.com", + "trydesign.com", + "trydurex.net", + "trydurex.tv", + "tryengineering.org", + "tryfuckmenow.com", + "tryfunctions.com", + "tryheart.jp", + "tryquinn.com", + "tryrating.com", + "tryst.link", + "ts.la", + "ts.net", + "tsctv.net", + "tsd.ac.uk", + "tsdlondon.ac.uk", + "tse.ac.uk", + "tsec-biosys.ac.uk", + "tsemtulku.com", + "tsescortsdirectory.com", + "tsi.ai", + "tsl.ac.uk", + "tsmodelstube.com", + "tspline.com", + "tsplines.com", + "tsquare.tv", + "tsrc.ac.uk", + "tssp.best", + "tsthai.com", + "tsu.org.tw", + "tsumino.com", + "tsunagarumon.com", + "tsundora.com", + "tsyum.com", + "tt1069.com", + "ttc.ac.uk", + "tte-lisa.ac.uk", + "tteshop.com", + "ttetraining.ac.uk", + "ttk.ru", + "ttlivecdn.com", + "ttrb.ac.uk", + "tttan.com", + "ttv.com.tw", + "ttvnw.net", + "ttwstatic.com", + "tu8964.com", + "tubaholic.com", + "tube-pornomovs.com", + "tube-sex-videos.com", + "tube.bz", + "tube.com", + "tube18.sex", + "tube188.com", + "tube2011.com", + "tube2012.com", + "tube2017.com", + "tube4sex.com", + "tube4world.com", + "tube8.com", + "tube8.fr", + "tube8zoo.com", + "tube911.com", + "tubebdsm.com", + "tubecaptain.com", + "tubecop.com", + "tubecup.com", + "tubedna.com", + "tubedupe.com", + "tubeenema.com", + "tubefuckme.net", + "tubegalore.com", + "tubegals.com", + "tubegold.xxx", + "tubeislam.com", + "tubelombia.net", + "tubemature.tv", + "tubemogul.com", + "tubemovies4k.com", + "tubeorigin.com", + "tubepatrol.org", + "tubepornclassic.com", + "tubepornlist.com", + "tubepornstars.com", + "tubepornup.com", + "tubesafari.com", + "tubesex.me", + "tubeshemales.com", + "tubestack.com", + "tubetop69.com", + "tubetria.mobi", + "tubetubetube.com", + "tubev.pro", + "tubev.sex", + "tubevintageporn.com", + "tubewolf.com", + "tubexclips.com", + "tubinge.com", + "tubsexer.com", + "tubxporn.com", + "tubxporn.xxx", + "tuca.ac.uk", + "tuco.ac.uk", + "tudorpartbooks.ac.uk", + "tufos.com.br", + "tug.org", + "tuibeitu.net", + "tuidang.net", + "tuidang.org", + "tuidang.se", + "tuitui.info", + "tuitwit.com", + "tukaani.org", + "tukif.com", + "tumblr.com", + "tumutanzi.com", + "tumview.com", + "tuncommercialbank.com", + "tunein.com", + "tunnelbear.com", + "tunnelblick.net", + "tunnelr.com", + "tunsafe.com", + "tuo8.blue", + "tuo8.cc", + "tuo8.club", + "tuo8.fit", + "tuo8.hk", + "tuo8.in", + "tuo8.ninja", + "tuo8.org", + "tuo8.pw", + "tuo8.red", + "tuo8.space", + "turansam.org", + "turbobit.net", + "turbogvideos.com", + "turbohide.com", + "turborepo.org", + "turbotwitter.com", + "turbulence.ac.uk", + "turing.ac.uk", + "turingsafehaven.ac.uk", + "turkeyblocks.org", + "turkistantimes.com", + "turntable.fm", + "tushy.com", + "tushycash.com", + "tut.ac.jp", + "tuta.io", + "tutanota.com", + "tuvpn.com", + "tuzaijidi.com", + "tv.com", + "tv.google", + "tvants.com", + "tvappstore.net", + "tvb.com", + "tvb.com.au", + "tvbanywhere.com", + "tvbanywhere.com.sg", + "tvbeventpower.com.hk", + "tvboxnow.com", + "tvbs.com.tw", + "tvbusa.com", + "tvbweekly.com", + "tvc.ac.uk", + "tver.co.jp", + "tver.jp", + "tvider.com", + "tvmedia.net.au", + "tvmost.com.hk", + "tvnaviweb.jp", + "tvof.ac.uk", + "tvplayvideos.com", + "tvpromise.com", + "tvu.ac.uk", + "tvunetworks.com", + "tw-blog.com", + "tw-npo.org", + "tw01.org", + "tw985.com", + "twaitter.com", + "twapperkeeper.com", + "twaud.io", + "twavi.com", + "twavking.com", + "twbbs.net.tw", + "twbbs.org", + "twbbs.tw", + "twblogger.com", + "twca.com.tw", + "twcomix.com", + "tweakadmin.com", + "tweakfilms.com", + "tweaksoftware.com", + "tweepguide.com", + "tweeplike.me", + "tweepmag.com", + "tweepml.org", + "tweetbackup.com", + "tweetboard.com", + "tweetboner.biz", + "tweetcs.com", + "tweetdeck.com", + "tweetedtimes.com", + "tweetmylast.fm", + "tweetphoto.com", + "tweetrans.com", + "tweetree.com", + "tweettunnel.com", + "tweetwally.com", + "tweetymail.com", + "tweez.net", + "twelve.today", + "twenty65.ac.uk", + "twerkingbutt.com", + "twftp.org", + "twgreatdaily.com", + "twgreatnews.com", + "twhentai.com", + "twi-videos.net", + "twibase.com", + "twibble.de", + "twibbon.com", + "twibs.com", + "twicountry.org", + "twicsy.com", + "twidouga.net", + "twidouga.tv", + "twiends.com", + "twifan.com", + "twiffo.com", + "twifuli.com", + "twiggit.org", + "twilightsex.com", + "twilio.com", + "twilog.org", + "twimbow.com", + "twimg.com", + "twin-research.ac.uk", + "twindexx.com", + "twinkboyfriends.tv", + "twinkspornos.com", + "twinkybf.com", + "twinprime.com", + "twinsuk.ac.uk", + "twip.me", + "twipple.jp", + "twirl.ac.uk", + "twishort.com", + "twistar.cc", + "twistedlinks.net", + "twister.net.co", + "twisterio.com", + "twisternow.com", + "twistory.net", + "twistys.com", + "twit2d.com", + "twitbrowser.net", + "twitcause.com", + "twitch.tv", + "twitchcdn.net", + "twitchsvc.net", + "twitcomike.jp", + "twitgether.com", + "twitgoo.com", + "twitiq.com", + "twitlonger.com", + "twitmania.com", + "twitoaster.com", + "twitonmsn.com", + "twitpic.com", + "twitstat.com", + "twittbot.net", + "twitter.biz", + "twitter.com", + "twitter.jp", + "twitter4j.org", + "twittercommunity.com", + "twittercounter.com", + "twitterfeed.com", + "twitterflightschool.com", + "twittergadget.com", + "twitterinc.com", + "twitterkr.com", + "twittermail.com", + "twitteroauth.com", + "twitterrific.com", + "twitterstat.us", + "twittertim.es", + "twitthat.com", + "twitturk.com", + "twitturly.com", + "twitvid.com", + "twitzap.com", + "twiyia.com", + "twlegs.com", + "twline5.com", + "twnextdigital.com", + "twnorth.org.tw", + "twoo.com", + "twporn.net", + "twreporter.org", + "twskype.com", + "twstar.net", + "twt.tl", + "twtkr.com", + "twtrdns.net", + "twtrland.com", + "twttr.com", + "twttr.net", + "twurl.nl", + "twvid.com", + "twyac.org", + "tx.me", + "tx5254.com", + "txcloud.net", + "txdirectv.com", + "txqzz34r.com", + "txvia.com", + "txvlog.com", + "txxx.com", + "txxx1.com", + "tycool.com", + "tyler-brown.com", + "tyms2022.com", + "tyndall.ac.uk", + "tynecoast.ac.uk", + "tynecoll.ac.uk", + "tynemet.ac.uk", + "typeisbeautiful.com", + "typekit.com", + "typekit.net", + "typenetwork.com", + "typepad.com", + "typesquare.com", + "typography.com", + "typora.io", + "tyre-cadcam.com", + "tyrecadcam.com", + "tytng189.com", + "tytporno.online", + "u-tokyo.ac.jp", + "u.nu", + "u15.info", + "u3c3.com", + "u4heusergroup.ac.uk", + "u9a9.cc", + "u9a9.com", + "u9un.com", + "ua92.ac.uk", + "uaa.com", + "uab.com.mm", + "uad.ac.uk", + "uag.ac.uk", + "ual.ac.uk", + "uall.ac.uk", + "uas.ac.uk", + "ub0.cc", + "ubdc.ac.uk", + "ubddns.org", + "ubel-dtp.ac.uk", + "uber-assets.com", + "uber.com", + "ubereats.com", + "uberproxy.net", + "ubi.com", + "ubisoft-orbit-savegames.s3.amazonaws.com", + "ubisoft-uplay-savegames.s3.amazonaws.com", + "ubisoft.com", + "ubisoftconnect.com", + "ubn.ac.uk", + "ubncloud.com", + "ubnw.net", + "ubuntu-touch.io", + "ubuntu.com", + "ubuntu.net", + "ubuntuforums.org", + "uc-japan.org", + "uc-scarborough.ac.uk", + "uca.ac.uk", + "ucam.ac.uk", + "ucam.org", + "ucanews.com", + "ucas.ac.uk", + "ucas01.ac.uk", + "ucasgraduate.ac.uk", + "ucaspg.ac.uk", + "ucaspostgrad.ac.uk", + "ucaspostgraduate.ac.uk", + "ucat.ac.uk", + "ucav.ac.uk", + "ucb.ac.uk", + "ucc.ac.uk", + "ucdc1998.org", + "uce.ac.uk", + "ucea.ac.uk", + "ucem.ac.uk", + "ucenmanchester.ac.uk", + "ucet.ac.uk", + "ucf.ac.uk", + "ucfb.ac.uk", + "ucg.ac.uk", + "uchicago.edu", + "ucisa.ac.uk", + "ucl-status.ac.uk", + "ucl.ac.uk", + "ucla.edu", + "uclan.ac.uk", + "uclanresearch.ac.uk", + "ucleeds.ac.uk", + "uclglobal.ac.uk", + "ucmk.ac.uk", + "ucml.ac.uk", + "ucn.ac.uk", + "ucnl.ac.uk", + "uco.ac.uk", + "ucp.ac.uk", + "ucpmarjon.ac.uk", + "ucq.ac.uk", + "ucreaseheath.ac.uk", + "ucreative.ac.uk", + "ucs.ac.uk", + "ucsalf.ac.uk", + "ucsalford.ac.uk", + "ucsd.ac.uk", + "ucshrewsbury.ac.uk", + "ucsm.ac.uk", + "ucsp.ac.uk", + "ucss.ac.uk", + "ucw.ac.uk", + "ucwa.ac.uk", + "ucy.ac.uk", + "udacity.com", + "udel.ac.uk", + "udemy.com", + "udemycdn.com", + "uderzo.it", + "udfs.com", + "udn.com", + "udn.com.tw", + "udnbkk.com", + "udndata.com", + "udnfunlife.com", + "udtrucksmeena.com", + "uea.ac.uk", + "ueberamazon.de", + "uec.ac.uk", + "uedu.ac.uk", + "uee.ac.uk", + "ueharlax.ac.uk", + "uel.ac.uk", + "uetcollege.ac.uk", + "ufe.cz", + "uflash.tv", + "ufm.ac.uk", + "uforadio.com.tw", + "ufreevpn.com", + "ugo.com", + "uguisupapa.net", + "uhairy.com", + "uhdwallpapers.org", + "uhi.ac.uk", + "uhicloud.ac.uk", + "uhmlg.ac.uk", + "uhovi.ac.uk", + "uhr.ac.uk", + "uhrp.org", + "uhsl.ac.uk", + "uhub.com", + "ui.com", + "uighur.nl", + "uighurbiz.net", + "uiporn.com", + "uisp.com", + "ujapanesesex.com", + "ujizzcn.com", + "uk-cdi.ac.uk", + "uk-data-service.ac.uk", + "uk-exhibitionist.com", + "uk-imr.ac.uk", + "uk-india-energynetwork.ac.uk", + "uk.to", + "ukadia.ac.uk", + "ukaea.ac.uk", + "ukaff.ac.uk", + "ukandeu.ac.uk", + "ukarc.ac.uk", + "ukbiobank.ac.uk", + "ukc.ac.uk", + "ukca.ac.uk", + "ukcasa.ac.uk", + "ukcat.ac.uk", + "ukcbc.ac.uk", + "ukccsrc.ac.uk", + "ukcdp.co.uk", + "ukceh.ac.uk", + "ukcge.ac.uk", + "ukchinab4g.ac.uk", + "ukcle.ac.uk", + "ukclt.ac.uk", + "ukcmri.ac.uk", + "ukcp.ac.uk", + "ukcpmn.ac.uk", + "ukctas.ac.uk", + "ukda.ac.uk", + "ukdataservice.ac.uk", + "ukdementiaresearchinstitute.ac.uk", + "ukdri.ac.uk", + "ukds.ac.uk", + "ukerc.ac.uk", + "ukerna.ac.uk", + "ukesm.ac.uk", + "ukfast.ac.uk", + "ukgeos.ac.uk", + "ukgrad.ac.uk", + "ukhec.ac.uk", + "ukhls.ac.uk", + "ukimr.ac.uk", + "ukipad.com", + "ukirc.ac.uk", + "uklibrariesplus.ac.uk", + "ukliferadio.co.uk", + "uklight.ac.uk", + "ukm.ac.uk", + "ukmed.ac.uk", + "ukmhd.ac.uk", + "ukmhr.ac.uk", + "ukmsn.ac.uk", + "ukndn.ac.uk", + "uknet.ac.uk", + "ukngi.ac.uk", + "uknibc.ac.uk", + "ukoln.ac.uk", + "ukorea.ac.uk", + "ukpass.ac.uk", + "ukpmc.ac.uk", + "ukpmcplus.ac.uk", + "ukpubmedcentral.ac.uk", + "ukqcd.ac.uk", + "ukresearchandinnovation.ac.uk", + "ukrheeo.ac.uk", + "ukri.ac.uk", + "ukro.ac.uk", + "ukrr.ac.uk", + "ukscl.ac.uk", + "ukserp.ac.uk", + "uksrn.ac.uk", + "ukssdc.ac.uk", + "ukt0.ac.uk", + "uktrc.ac.uk", + "uku.im", + "ukupc.ac.uk", + "ukwhoswho.com", + "ukzikaresponse.ac.uk", + "ulcc.ac.uk", + "ulh.ac.uk", + "ulifestyle.com.hk", + "ulike.net", + "ull.ac.uk", + "ulol.com", + "ulop.net", + "ulsop.ac.uk", + "ulst.ac.uk", + "ulster.ac.uk", + "ulth.ac.uk", + "ultimaforever.com", + "ultimaonline.com", + "ultradonkey.com", + "ultralab.ac.uk", + "ultravpn.fr", + "ultraxs.com", + "umagazine.com.hk", + "umass.edu", + "umd.edu", + "umds.ac.uk", + "umich.edu", + "umis.ac.uk", + "umist.ac.uk", + "ums.ac.uk", + "umslg.ac.uk", + "umtc.ac.uk", + "un.org", + "unblock-us.com", + "unblock.cn.com", + "unblockdmm.com", + "unblocker.yt", + "unblocksit.es", + "unbrandedproducts.com", + "uncams.com", + "uncensoredhentai.xxx", + "uncensoredsexparties.com", + "uncyclomedia.org", + "uncyclopedia.hk", + "uncyclopedia.tw", + "underhentai.net", + "underlords.com", + "underpinningexcellenceinhe.ac.uk", + "understanding-inequalities.ac.uk", + "understandingsociety.ac.uk", + "underwoodammo.com", + "unfiltered.news", + "unholyknight.com", + "uni-east.ac.uk", + "uni.cc", + "unialliance.ac.uk", + "unicode.org", + "unidesk.ac.uk", + "unification.net", + "unification.org.tw", + "unilang.ac.uk", + "uninhibitedcomix.com", + "union.ac.uk", + "unirule.cloud", + "unis4ne.ac.uk", + "unisat.io", + "unistats.ac.uk", + "unisurreydirect.ac.uk", + "uniswales.ac.uk", + "uniswap.org", + "unitedcollegegroup.ac.uk", + "unitedcollegesgroup.ac.uk", + "unitedsocialpress.com", + "unity.ac.uk", + "unity.cn", + "unity.com", + "unity3d.com", + "unitychina.cn", + "univault.ac.uk", + "universalorlando.com", + "universalpictures.com", + "universalpicturesinternational.com", + "universalstudioshollywood.com", + "universities-scotland.ac.uk", + "universitiesengland.ac.uk", + "universitiesfornottingham.ac.uk", + "universitieshr.ac.uk", + "universitiesinlondon.ac.uk", + "universitiesireland.ac.uk", + "universitiesnorthernireland.ac.uk", + "universitiesscotland.ac.uk", + "universitiesuk.ac.uk", + "universitieswales.ac.uk", + "universitiesweek.ac.uk", + "universitieswm.ac.uk", + "university-alliance.ac.uk", + "university-central-england.ac.uk", + "university-of-cambridge.ac.uk", + "universityacademy92.ac.uk", + "universitycampusscarborough.ac.uk", + "universitycentreharlow.ac.uk", + "universitycentrehastings.ac.uk", + "universitycentresouthend.ac.uk", + "universitycentrestratford.ac.uk", + "universitycentrethurrock.ac.uk", + "universitychairs.ac.uk", + "universitycollegefalmouth.ac.uk", + "universitycollegescarborough.ac.uk", + "universityenglish.ac.uk", + "universityofcambridge.ac.uk", + "universityofchichester.ac.uk", + "universityoflondon.ac.uk", + "universityofscarborough.ac.uk", + "universityofscarboroughcollege.ac.uk", + "universityofsuffolk.ac.uk", + "universityofwestlondon.ac.uk", + "universitypressscholarship.com", + "universityquarter-stoke.ac.uk", + "universitysquarestratford.ac.uk", + "unix100.com", + "unknownspace.org", + "unkoscene.com", + "unl.ac.uk", + "unlocklimitlesslearning.com", + "unlocktool.net", + "unn.ac.uk", + "unodedos.com", + "unpkg.com", + "unpo.org", + "unravel2.com", + "unraveltwo.com", + "unrealengine.com", + "unrealtournament.com", + "unseen.is", + "unstable.icu", + "unstyle.us", + "untraceable.us", + "unusualporn.net", + "unwire.hk", + "uo.com", + "uocn.org", + "uod.ac.uk", + "uoherald.com", + "uol.ac.uk", + "uos.ac.uk", + "up01.cc", + "upa.ac.uk", + "updates.ac.uk", + "updatestar.com", + "updatetube.com", + "upen.ac.uk", + "upenn.edu", + "upfrontcfd.com", + "upfrontfea.com", + "upghsbc.com", + "upholdjustice.org", + "upjav.cc", + "uplay-istrip.com", + "uplay.com", + "uplinq.com", + "upload4u.info", + "uploaded.net", + "uploaded.to", + "uploadstation.com", + "uplust.com", + "uplynk.com", + "upmedia.mg", + "upmg.ac.uk", + "upornia.com", + "uporno.xxx", + "uproxy.org", + "uptodown.com", + "upwill.org", + "ur7s.com", + "ura-akiba.jp", + "uraban.me", + "urasma.com", + "urbanbigdatacentre.ac.uk", + "urbandictionary.com", + "urbanfloodresilience.ac.uk", + "urbanflows.ac.uk", + "urbanlivinglab.ac.uk", + "urbanobservatory.ac.uk", + "urbansurvival.com", + "urchin.com", + "urduvoa.com", + "url.com.tw", + "urlborg.com", + "urlgalleries.net", + "urlparser.com", + "urukawa.com", + "us-west-2.amazonaws.com", + "us.to", + "usa-beatsbydreheadphonesonsale.net", + "usablepast.ac.uk", + "usacn.com", + "usaco.org", + "usaip.eu", + "usatoday.com", + "usatodaynetworkservice.com", + "usc.edu", + "uscardforum.com", + "uscnpm.org", + "use-of-mans.ac.uk", + "usefreevpn.com", + "uselessjunk.com", + "usembassy.gov", + "useplannr.com", + "userapi.com", + "usercontent.dev", + "userpxt.io", + "usertrust.com", + "usfk.mil", + "ushare.ac.uk", + "ushaw.ac.uk", + "usma.edu", + "usmc.mil", + "usocctn.com", + "uspcollege.ac.uk", + "uspto.gov", + "usstratford.ac.uk", + "ust.ac.uk", + "ustc.ac.uk", + "ustibetcommittee.org", + "ustream.tv", + "usunitednews.com", + "usus.cc", + "usvimosquito.com", + "usvimosquitoproject.com", + "usw.ac.uk", + "utcreading.ac.uk", + "utopianpal.com", + "uu-gg.com", + "uug22.com", + "uug23.com", + "uug25.com", + "uug26.com", + "uug27.com", + "uuk.ac.uk", + "uuk28.com", + "uukanshu.com", + "uun78.com", + "uun79.com", + "uun82.com", + "uun83.com", + "uun85.com", + "uun86.com", + "uun87.com", + "uun89.com", + "uun92.com", + "uun93.com", + "uun95.com", + "uun96.com", + "uun97.com", + "uun98.com", + "uun99.com", + "uup76.com", + "uusexdoll.com", + "uusextoy.com", + "uux68.com", + "uvac.ac.uk", + "uverse.com", + "uvwxyz.xyz", + "uwants.com", + "uwants.net", + "uwaterloo.ca", + "uwb-global.ac.uk", + "uwcatlantic.ac.uk", + "uwchgyfrifiaduracymru.ac.uk", + "uwe-bristol.ac.uk", + "uwe.ac.uk", + "uwern.ac.uk", + "uwic.ac.uk", + "uwinat.ac.uk", + "uwl.ac.uk", + "uwpcommunitytoolkit.com", + "uws.ac.uk", + "uwtsd.ac.uk", + "uwtsdlondon.ac.uk", + "uxbridge.ac.uk", + "uxbridgecollege.ac.uk", + "uyghur-archive.com", + "uyghur-j.org", + "uyghur.co.uk", + "uyghuraa.org", + "uyghuramerican.org", + "uyghurbiz.org", + "uyghurcanadian.ca", + "uyghurcanadiansociety.org", + "uyghurcongress.org", + "uyghurensemble.co.uk", + "uyghurpen.org", + "uyghurpress.com", + "uyghurstudies.org", + "uyghurtribunal.com", + "uygur.org", + "uymaarip.com", + "v-av.com", + "v-has.com", + "v-resort.ac.uk", + "v.gd", + "v2board.com", + "v2ex.com", + "v2fly.org", + "v2mm.tech", + "v2ph.com", + "v2ray.com", + "v2ray.cool", + "v2raya.org", + "v2raycn.com", + "v2raytech.com", + "v7hds.com", + "v8.dev", + "v8project.org", + "vaccine.ac.uk", + "vads.ac.uk", + "vagabundasdoorkut.net", + "vagina.nl", + "vaginacontest.com", + "vaginal-ultrasound.com", + "vaginalultrasound.info", + "vaginapics.pro", + "vagrantcloud.com", + "vagrantup.com", + "valeursactuelles.com", + "valoryirene.com", + "valuegb.com", + "valvesoftware.com", + "vam.ac.uk", + "vamsas.ac.uk", + "van001.com", + "van698.com", + "vancouverbmwretailers.ca", + "vanemu.cn", + "vanilla-jp.com", + "vanish.at", + "vanish.be", + "vanish.ch", + "vanish.cl", + "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.sk", + "vanisharabia.com", + "vanishbancaseulook.com.br", + "vanishcentroamerica.com", + "vanishinfo.cz", + "vanishstains.com", + "vanishstains.com.au", + "vanitaonline.com", + "vanitha.in", + "vanithaveedu.com", + "vanpeople.com", + "vansky.com", + "varndean.ac.uk", + "vast.ac.uk", + "vastenm.com", + "vaticannews.va", + "vatn.org", + "vaughan.ac.uk", + "vaultify.com", + "vaultify.info", + "vaultify.net", + "vaultproject.io", + "vbejeyv.shop", + "vcanedge.com", + "vcf-online.org", + "vcfbuilder.org", + "vcloudair.net", + "vcol.ac.uk", + "vcoll.ac.uk", + "vct.news", + "vday.io", + "vdoav.com", + "vecchiescopate.casa", + "vector.im", + "veet.at", + "veet.be", + "veet.ca", + "veet.ch", + "veet.cl", + "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.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.us", + "veetarabia.com", + "veetbangladesh.com", + "veetcentroamerica.com", + "veetclub.it", + "vegasred.com", + "velaserver.com", + "velastaging.com", + "velasync.com", + "velasystems.com", + "velatest.com", + "velkaepocha.cz", + "velkaepocha.sk", + "velocloud.com", + "velostrata.com", + "venbbs.com", + "venchina.com", + "vendu.com", + "venetianmacao.com", + "venezporn.com", + "venmo-touch.com", + "venmo.com", + "venmo.info", + "venmo.net", + "venmo.org", + "venmo.s3.amazonaws.com", + "ventureswell.com", + "veoh.com", + "veporn.com", + "vepornhd.club", + "veporno.net", + "vercel-dns.com", + "vercel-status.com", + "vercel.app", + "vercel.blog", + "vercel.com", + "vercel.events", + "vercel.live", + "vercel.pub", + "vercel.sh", + "vercel.store", + "vercomicsporno.xxx", + "verhentai.tv", + "verifid.ac.uk", + "verily.com", + "verilylifesciences.com", + "verilystudyhub.com", + "verilystudywatch.com", + "verilystudywatch.org", + "verisign.asia", + "verisign.biz", + "verisign.ch", + "verisign.co.in", + "verisign.co.uk", + "verisign.com", + "verisign.com.au", + "verisign.com.br", + "verisign.com.cn", + "verisign.com.es", + "verisign.com.hk", + "verisign.com.sg", + "verisign.com.tw", + "verisign.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.vn", + "verisigninc.com", + "verizon.com", + "verizon.net", + "verizonbusinessfios.com", + "verizondigitalmedia.com", + "verizonenterprise.com", + "verizonfios.com", + "verizonmedia.com", + "verizonwireless.com", + "vermonttibet.org", + "verpeliculasporno.gratis", + "versavpn.com", + "versign.net", + "versly.com", + "vervesex.com", + "verybs.com", + "verygoodnike.com", + "veryladyboy.com", + "veryshortintroductions.com", + "vetgate.ac.uk", + "vetnetlln.ac.uk", + "vetschools.ac.uk", + "vetschoolscouncil.ac.uk", + "vetset2go.ac.uk", + "vetvaccnet.ac.uk", + "vevo.com", + "vfabric.net", + "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.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", + "vfsforgit.com", + "vfsforgit.org", + "vft.com.tw", + "vgcareers.net", + "vge.ac.uk", + "vgg8.com", + "vgta.ac.uk", + "vhx.tv", + "vhxqa1.com", + "vhxqa2.com", + "vhxqa3.com", + "vhxqa4.com", + "vhxqa6.com", + "via0.com", + "viacbs.com", + "viacom.com", + "viacomcbs.com", + "viacomcbspressexpress.com", + "viber.com", + "vica.info", + "vicarious.ac.uk", + "victimsofcommunism.org", + "victoriacountyhistory.ac.uk", + "vid.me", + "vidble.com", + "video-jav.net", + "video-one.com", + "video01.org", + "videoactive.ac.uk", + "videobam.com", + "videobreakdown.com", + "videochampion.com", + "videodelivery.net", + "videodesexo.blog", + "videodetective.com", + "videoindexer.ai", + "videojs.com", + "videolan.org", + "videoleak.me", + "videomarket.jp", + "videomega.tv", + "videomo.com", + "videopediaworld.com", + "videopress.com", + "videos4sale.com", + "videosamadoresreais.com", + "videosdemadurasx.com", + "videosdepornografia.blog.br", + "videosdesexo.br.com", + "videosdesexo.com.br", + "videosection.com", + "videoshorny.com", + "videoskaseros.com", + "videosmadeathome.com", + "videosporno.com.br", + "videosporno.life", + "videostravestis.xxx", + "videoxxxporn.biz", + "videozzz.com", + "vidinfo.org", + "vidlearn.ac.uk", + "vidmpreview.com", + "vidown.com", + "vidspornoduro.com", + "viet.sex", + "viet69.dev", + "viet69.link", + "viet69.news", + "vietdaikynguyen.com", + "viewerswives.net", + "viewgals.com", + "viewpointsfromfacebook.com", + "vijayatemple.org", + "vikiporn.com", + "vilavpn.com", + "vilavpn.xyz", + "vilavpn1.xyz", + "vilavpn2.xyz", + "vilavpn3.xyz", + "vilavpn4.xyz", + "vilavpn5.xyz", + "vilavpn6.xyz", + "vilavpn7.xyz", + "vim.org", + "vimeo-staging.com", + "vimeo-staging2.com", + "vimeo.com", + "vimeo.fr", + "vimeobusiness.com", + "vimeocdn.com", + "vimeogoods.com", + "vimeoondemand.com", + "vimeostatus.com", + "vimperator.org", + "vincnd.com", + "vine.co", + "vinniev.com", + "vintage-erotica-forum.com", + "vintageamateurporn.com", + "vintagehomemadesex.com", + "vintagemedicalpictures.com", + "vintagexxxfilms.com", + "vip-beats.com", + "vip-enterprise.com", + "vipbeatsbydre.com", + "vipergirls.to", + "vipheadphones.com", + "vipissy.com", + "vipmatureporn.com", + "vipoo.es", + "vipshoes2.com", + "vipstudiocali.com", + "viralcum.com", + "viralporn.com", + "virginia.edu", + "virginpornlinks.com", + "viriondb.com", + "virsto.com", + "virsto.net", + "virtualbox.org", + "virtualcollege.ac.uk", + "virtualearth.net", + "virtualpartyworld.com", + "virtualporn.com", + "virtualrealgay.com", + "virtualrealporn.com", + "virtualrealtrans.com", + "virtualtaboo.com", + "virtuata.com", + "virulogenome.ac.uk", + "visa-atm.com", + "visa-news.jp", + "visa.be", + "visa.ca", + "visa.cl", + "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.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.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", + "visabank.org", + "visabg.com", + "visabusinessinsights.com", + "visacarddesignlab.com", + "visacards.com", + "visacheckout.net", + "visacheckout.org", + "visaconciergelac.com", + "visadigital.com", + "visadigitalconcierge.com", + "visadns.com", + "visadpsonline.us", + "visaeurope.at", + "visaeurope.ch", + "visaeurope.lu", + "visaeurope.si", + "visaeverywhereshop.com", + "visafintechfasttrack.com", + "visafulfillment.com", + "visagiftcard.us", + "visaglobalfinance.com", + "visaicsdirect.com", + "visainfinite.ca", + "visainfiniteluxuryhotels.ca", + "visaitalia.com", + "visakorea.com", + "visaluxuryhotelcollection.com", + "visaluxuryhotelcollection.com.br", + "visaluxuryhotelcollection.com.mx", + "visaluxuryhotels.com", + "visaluxuryhotels.com.ar", + "visamiddleeast.com", + "visanet.net", + "visapcsdirect.com", + "visaplus.com", + "visasavingsedge.ca", + "visasignature.co.kr", + "visasignaturehotels.com", + "visasoutheasteurope.com", + "visb.org", + "visceralgames.com", + "visibletweets.com", + "visionnaires.ac.uk", + "visiontimes.com", + "visiontimes.de", + "visiontimes.fr", + "visiontimes.it", + "visiontimes.net", + "visiontimesjp.com", + "visnet.ac.uk", + "vista.ac.uk", + "visual-arts.jp", + "visual-evidence.ac.uk", + "visualarts.gr.jp", + "visuallearninglab.ac.uk", + "visualrhetoric.ac.uk", + "visualstudio-staging.com", + "visualstudio.co", + "visualstudio.co.uk", + "visualstudio.com", + "visualstudio.eu", + "visualstudio.net", + "vitae.ac.uk", + "vital.ac.uk", + "vital247.org", + "vitukali.com", + "viu.com", + "viu.tv", + "vivahentai4u.net", + "vivaldi.com", + "vivatube.com", + "vivaxnxx.com", + "vivthomas.com", + "vixen.com", + "vixvids.to", + "viznet.ac.uk", + "vizvaz.com", + "vjav.com", + "vjmedia.com.hk", + "vk-cdn.me", + "vk-cdn.net", + "vk-portal.net", + "vk.cc", + "vk.com", + "vk.design", + "vk.link", + "vk.me", + "vk.ru", + "vkcache.com", + "vkgo.app", + "vklive.app", + "vkmessenger.app", + "vkmessenger.com", + "vkontakte.ru", + "vkuseraudio.com", + "vkuserlive.net", + "vkuservideo.com", + "vkuservideo.net", + "vl4x.net", + "vllcs.org", + "vmglobal.net", + "vmixcore.com", + "vmmark.com", + "vmpsoft.com", + "vmtestdrive.com", + "vmw.com", + "vmware-cloudmanagement.com", + "vmware-techcenter.com", + "vmware.com", + "vmware20mosaic.com", + "vmwareausnews.com", + "vmwarecertificationvideos.com", + "vmwarecloud.com", + "vmwaredemandcenter.com", + "vmwareemeablog.com", + "vmwaregrid.com", + "vmwarehorizon.com", + "vmwareidentity.com", + "vmwarelearning.com", + "vmwarelearningplatform.com", + "vmwarestuff.com", + "vmwareusergroupstore.com", + "vmwareviewpoint.com", + "vmwarevmc.com", + "vmwdemo.com", + "vmwgcomms.com", + "vmwhorizonair.com", + "vmwidm-ads.com", + "vmwidm.com", + "vmwlabconnect.com", + "vmwlearningplatform.com", + "vmworld.com", + "vmworld2010.com", + "vmworld2013.com", + "vmwsalesrewards.com", + "vmwservices.com", + "vmwxw.com", + "vnanchoi.ca", + "vnet.link", + "vnware.net", + "voa.gov", + "voa.mobi", + "voaafaanoromoo.com", + "voaafrique.com", + "voabambara.com", + "voabangla.com", + "voacambodia.com", + "voacantonese.com", + "voachinese.com", + "voachineseblog.com", + "voadeewanews.com", + "voadeewaradio.com", + "voagd.com", + "voahausa.com", + "voaindonesia.com", + "voakorea.com", + "voalingala.com", + "voandebele.com", + "voanews.com", + "voanews.eu", + "voanoticias.com", + "voanouvel.com", + "voaportugues.com", + "voashona.com", + "voasomali.com", + "voaswahili.com", + "voathai.com", + "voatibetan.com", + "voatibetanenglish.com", + "voatiengviet.com", + "voatour.com", + "voazimbabwe.com", + "vocativ.com", + "vocn.tv", + "vocus.cc", + "vod360.net", + "vodafone.co.uk", + "vodafone.com", + "vodafone.com.au", + "vodafone.com.tr", + "vodafone.de", + "vodafone.it", + "voi.id", + "voicettank.org", + "voila.ac.uk", + "vokevr.com", + "vol.moe", + "volstudy.ac.uk", + "volvo-truck.nl", + "volvo.ca", + "volvo.com", + "volvo.se", + "volvobrandshop.com", + "volvobuses.at", + "volvobuses.be", + "volvobuses.ca", + "volvobuses.ch", + "volvobuses.co", + "volvobuses.co.nz", + "volvobuses.co.uk", + "volvobuses.co.za", + "volvobuses.com", + "volvobuses.com.ar", + "volvobuses.com.au", + "volvobuses.com.br", + "volvobuses.com.kw", + "volvobuses.com.pt", + "volvobuses.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.com", + "volvodefense.com", + "volvogroup.be", + "volvogroup.com", + "volvogroup.com.br", + "volvogroup.de", + "volvogroup.fr", + "volvogroup.jp", + "volvogroup.kr", + "volvogroup.mx", + "volvogroup.nl", + "volvogroup.pe", + "volvogroup.pl", + "volvogroup.ru", + "volvogroup.se", + "volvogrouptruckcenter.nl", + "volvomerchandise.com", + "volvopenta.com", + "volvopenta.com.br", + "volvopenta.de", + "volvopenta.es", + "volvopenta.fr", + "volvopenta.it", + "volvopenta.nl", + "volvopenta.se", + "volvopenta.us", + "volvosaatio.fi", + "volvospares.com", + "volvotruckcenter.be", + "volvotruckcenter.dk", + "volvotruckcenter.es", + "volvotruckcenter.fi", + "volvotruckcenter.it", + "volvotruckcenter.kr", + "volvotruckcenter.kz", + "volvotruckcenter.nl", + "volvotruckcenter.no", + "volvotruckcenter.se", + "volvotruckrental.be", + "volvotrucks.ae", + "volvotrucks.al", + "volvotrucks.am", + "volvotrucks.at", + "volvotrucks.az", + "volvotrucks.ba", + "volvotrucks.be", + "volvotrucks.bg", + "volvotrucks.by", + "volvotrucks.ch", + "volvotrucks.cl", + "volvotrucks.co.ao", + "volvotrucks.co.bw", + "volvotrucks.co.il", + "volvotrucks.co.mz", + "volvotrucks.co.na", + "volvotrucks.co.nz", + "volvotrucks.co.uk", + "volvotrucks.co.za", + "volvotrucks.co.zm", + "volvotrucks.co.zw", + "volvotrucks.com", + "volvotrucks.com.ar", + "volvotrucks.com.au", + "volvotrucks.com.bn", + "volvotrucks.com.br", + "volvotrucks.com.co", + "volvotrucks.com.kw", + "volvotrucks.com.pt", + "volvotrucks.com.tr", + "volvotrucks.com.tw", + "volvotrucks.com.ua", + "volvotrucks.cz", + "volvotrucks.de", + "volvotrucks.dk", + "volvotrucks.ee", + "volvotrucks.es", + "volvotrucks.fi", + "volvotrucks.fr", + "volvotrucks.ge", + "volvotrucks.gr", + "volvotrucks.hk", + "volvotrucks.hr", + "volvotrucks.hu", + "volvotrucks.id", + "volvotrucks.in", + "volvotrucks.it", + "volvotrucks.jp", + "volvotrucks.kg", + "volvotrucks.kr", + "volvotrucks.kz", + "volvotrucks.lt", + "volvotrucks.lv", + "volvotrucks.ma", + "volvotrucks.md", + "volvotrucks.mk", + "volvotrucks.mn", + "volvotrucks.my", + "volvotrucks.net", + "volvotrucks.nl", + "volvotrucks.no", + "volvotrucks.pe", + "volvotrucks.ph", + "volvotrucks.pk", + "volvotrucks.pl", + "volvotrucks.ps", + "volvotrucks.qa", + "volvotrucks.ro", + "volvotrucks.rs", + "volvotrucks.ru", + "volvotrucks.se", + "volvotrucks.sg", + "volvotrucks.si", + "volvotrucks.sk", + "volvotrucks.tm", + "volvotrucks.tn", + "volvotrucks.uy", + "vomitkings.com", + "vortexmachining.com", + "vot.org", + "votolia.com", + "vovo2000.com", + "vows.ac.uk", + "vox-cdn.com", + "vox.com", + "voxcreative.com", + "voxer.com", + "voxfieldguide.com", + "voxmedia.com", + "voxops.net", + "voy.com", + "voyeureye.com", + "voyeurhit.com", + "voyeurhouse.com", + "voyeurmonkey.com", + "voyeurpapa.com", + "voyeurporntapes.com", + "voyeurstyle.com", + "voyeurweb.com", + "vpn.ac", + "vpn4all.com", + "vpnaccount.org", + "vpnaccounts.com", + "vpnbook.com", + "vpncomparison.org", + "vpncoupons.com", + "vpncup.com", + "vpndada.com", + "vpnfan.com", + "vpnfire.com", + "vpnfires.biz", + "vpnforgame.net", + "vpngate.jp", + "vpngate.net", + "vpngratis.net", + "vpnhq.com", + "vpnhub.com", + "vpninja.net", + "vpnintouch.com", + "vpnintouch.net", + "vpnjack.com", + "vpnmaster.com", + "vpnmentor.com", + "vpnpick.com", + "vpnpop.com", + "vpnpronet.com", + "vpnreactor.com", + "vpnreviewz.com", + "vpnsecure.me", + "vpnshazam.com", + "vpnshieldapp.com", + "vpnsp.com", + "vpntraffic.com", + "vpntunnel.com", + "vpnuk.info", + "vpnunlimitedapp.com", + "vpnvip.com", + "vpnworldwide.com", + "vporn.com", + "vpornvideos.com", + "vpro.com", + "vpro.net", + "vpser.net", + "vr.org", + "vraiesagesse.net", + "vrbgay.com", + "vrcams.io", + "vred-essentials.com", + "vredessentials.com", + "vredprofessional.com", + "vrfun18.com", + "vrmtr.com", + "vrnastran.com", + "vrporn.com", + "vrporncat.com", + "vrpornjack.com", + "vrpornmania.com", + "vrpornranked.com", + "vrsexgames.biz", + "vrsmash.com", + "vrsumo.com", + "vrv.co", + "vs.com", + "vsallin.net", + "vsassets.io", + "vscode-cdn.net", + "vscode-unpkg.net", + "vscode.dev", + "vsezoo.com", + "vsphere.com", + "vsphere.net", + "vssn.ac.uk", + "vtri.ac.uk", + "vts.ac.uk", + "vtsociety.org", + "vtstutorials.ac.uk", + "vtunnel.com", + "vtvan.com", + "vuku.cc", + "vulgarx.com", + "vultr.com", + "vultryhw.com", + "vuvuzela.io", + "vyprvpn.com", + "vzw.com", + "w-mt.co", + "w.org", + "w.wiki", + "w0512.com", + "w3.org", + "w3schools.com", + "w6un.com", + "wa.me", + "waa.tw", + "wac.ac.uk", + "wacc.ac.uk", + "waes.ac.uk", + "waf.ac.uk", + "waffle1999.com", + "wahas.com", + "waigaobu.com", + "waikeung.org", + "wailaike.net", + "wainao.me", + "waisongcha.com", + "waiwaier.com", + "wakcoll.ac.uk", + "wakefield.ac.uk", + "wakwak.com", + "wal-mart.com", + "wal.co", + "walc.ac.uk", + "walcat.ac.uk", + "wales.ac.uk", + "wales1801-1919.ac.uk", + "walesdtc.ac.uk", + "walesdtp.ac.uk", + "walesglobalcampus.ac.uk", + "walesmep.ac.uk", + "walker-institute.ac.uk", + "walker.ac.uk", + "wallet.com", + "walletconnect.com", + "wallhaven.cc", + "wallmama.com", + "wallornot.org", + "wallpapercasa.com", + "wallproxy.com", + "wallsttv.com", + "walmart-content.com", + "walmart.com", + "walmart.pharmacy", + "walmartimages.com", + "walsall-coce.ac.uk", + "walsallcollege.ac.uk", + "waltermartin.com", + "waltermartin.org", + "waltham.ac.uk", + "walthamintcollege.ac.uk", + "wan-press.org", + "wana-tv.sbs", + "wancctv.asia", + "wandan-dh.buzz", + "wanderinghorse.net", + "wanduww.buzz", + "wangafu.net", + "wangjinbo.org", + "wanglixiong.com", + "wango.org", + "wangruoshui.net", + "wangruowang.org", + "wankgames.com", + "wankizer.com", + "wankoz.com", + "wankz.com", + "wankzvr.com", + "wanokokorosoh.com", + "want-daily.com", + "want-media.com", + "want520.com", + "wantblogger.com", + "wantmywife.com", + "wanz-factory.com", + "wapedia.mobi", + "waplog.com", + "wapm.io", + "waranlov.com", + "warddogs.com", + "warehouse333.com", + "wariolandshakeit.com", + "wariowarediy.com", + "warkscol.ac.uk", + "warnermediacdn.com", + "warp.plus", + "warr.ac.uk", + "warrington.ac.uk", + "warroom.org", + "warwick.ac.uk", + "warwickequine.ac.uk", + "warwickhri.ac.uk", + "warwickshire.ac.uk", + "wasdj.com", + "waselpro.com", + "washa.tv", + "washeng.net", + "washingtondcbmw.com", + "washingtonpost.com", + "waskucity.com", + "wasmer.io", + "watch-ebay.org", + "watch-my-gf.com", + "watch-porn.net", + "watch8x.com", + "watchanimeattheoffice.com", + "watchdisneyfe.com", + "watchersweb.com", + "watchespn.com", + "watchindianporn.net", + "watchinese.com", + "watchjavonline.com", + "watchmyexgf.net", + "watchmygf.me", + "watchmygf.net", + "watchmygf.to", + "watchmygirlfriend.tv", + "watchout.tw", + "watchteencam.com", + "water-and-power.com", + "waterdamagesandiego.org", + "waterfox.net", + "watersex.com", + "waterwisercdt.ac.uk", + "wattpad.com", + "wav.tv", + "waveomoney.com.mm", + "waveprotocol.org", + "waverleyabbeycollege.ac.uk", + "waymo.com", + "waze.com", + "wballiance.com", + "wbd.ms", + "wbdnbo.net", + "wbrks.com", + "wbs.ac.uk", + "wbvm4s.com", + "wcc.ac.uk", + "wccsj.ac.uk", + "wcg.ac.uk", + "wcmd.ac.uk", + "wcoh.ac.uk", + "wcs.ac.uk", + "wct.ac.uk", + "wd.bible", + "wd.com", + "wda.gov.tw", + "wdc.com", + "wddcp.ac.uk", + "wdf5.com", + "wdfiles.com", + "wea.ac.uk", + "weald.ac.uk", + "wealth.com.tw", + "weareebay.com", + "wearehairy.com", + "wearn.com", + "wearside.ac.uk", + "weather.com.hk", + "weav.xyz", + "web-instagram.net", + "web.app", + "web.dev", + "web2project.net", + "webappfieldguide.com", + "webbang.net", + "webcam-teen.net", + "webcamgirls.chat", + "webcamjackers.com", + "webcammedellin.co", + "webcams.tv", + "webcamtubexxx.com", + "webevader.org", + "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.hk", + "webex.com.mx", + "webex.de", + "webex.es", + "webex.fr", + "webflow.com", + "webfreer.com", + "webgata.net", + "webgirlsonline.net", + "webhosting.com", + "webjb.org", + "webkit.org", + "webkitgtk.org", + "weblagu.com", + "webmoneyinfo.com", + "webmproject.org", + "webnovel.com", + "webobjects.co.uk", + "webobjects.com", + "webobjects.de", + "webobjects.eu", + "webobjects.net", + "webofknowledge.com", + "webofscience.com", + "webpa.ac.uk", + "webpack.de", + "webpkgcache.com", + "webra.ru", + "webrtc.org", + "webrush.net", + "webs-tv.net", + "websitepulse.com", + "websnapr.com", + "webster.ac.uk", + "webtoons.com", + "webtoonscorp.com", + "webtype.com", + "webwarper.net", + "webworkerdaily.com", + "wechatlawsuit.com", + "weebly.com", + "weekly-economist.com", + "weeklytimesnow.com.au", + "weekmag.info", + "wefightcensorship.org", + "wefong.com", + "weiboleak.com", + "weihuo.org", + "weijingsheng.org", + "weimi180.com", + "weiming.info", + "weinvoiceit.com", + "weiquanwang.org", + "weisuo.ws", + "weitt.us", + "weiyuksj.com", + "weknowporn.com", + "welbeck.ac.uk", + "welcometobestbuy.ca", + "welcomix.com", + "welfareconditionality.ac.uk", + "well.ac.uk", + "wellbeing.ac.uk", + "wellcome.ac.uk", + "wellfuckedwife.com", + "wellmaturetube.com", + "welovecock.com", + "welsh-dictionary.ac.uk", + "welshmediumhe.ac.uk", + "welshsaints.ac.uk", + "welt.de", + "weltweitwachsen.de", + "wemigrate.org", + "wen21.xyz", + "wengewang.com", + "wengewang.org", + "wenhui.ch", + "wenweipo.com", + "wenxuecity.com", + "wenyunchao.com", + "wenzhao.ca", + "wern.ac.uk", + "wesc.ac.uk", + "wescfoundation.ac.uk", + "wess.ac.uk", + "wessex.ac.uk", + "wessexsfc.ac.uk", + "west-cheshire.ac.uk", + "west-lothian.ac.uk", + "west-thames.ac.uk", + "westca.com", + "westchem.ac.uk", + "westcollegescotland.ac.uk", + "westcumbcoll.ac.uk", + "westdean.ac.uk", + "westengland.ac.uk", + "westerndigital.com", + "westernshugdensociety.org", + "westernwolves.com", + "westherts.ac.uk", + "westhill.ac.uk", + "westkent.ac.uk", + "westkentandashford.ac.uk", + "westking.ac.uk", + "westkit.net", + "westlancs.ac.uk", + "westlaw.com", + "westlondon.ac.uk", + "westlondoncollege.ac.uk", + "westlondoniot.ac.uk", + "westlondonuniversity.ac.uk", + "westminster-cfe.ac.uk", + "westminster.ac.uk", + "westminsterutc.ac.uk", + "westnotts.ac.uk", + "westofscotland.ac.uk", + "weston.ac.uk", + "westonstudents.ac.uk", + "westpoint.edu", + "westsuffolk.ac.uk", + "westsuffolkcollege.ac.uk", + "westyorkshirecolleges.ac.uk", + "wet-ass-pussy.com", + "wetandpuffy.com", + "wetchicks.org", + "wetnhorny.com", + "wetplace.com", + "wetpussygames.com", + "wetsextube.com", + "weverse.io", + "wexiaobo.org", + "weymouth.ac.uk", + "weymouthcollege.ac.uk", + "wezhiyong.org", + "wezone.net", + "wfdc.ac.uk", + "wfm.com", + "wforum.com", + "wgu.ac.uk", + "wha.la", + "whasil.xyz", + "what-fan.net", + "whatblocked.com", + "whatboyswant.com", + "whatbrowser.org", + "whatisairwatch.com", + "whatisworkspaceone.com", + "whats.new", + "whatsapp-plus.info", + "whatsapp-plus.me", + "whatsapp-plus.net", + "whatsapp.cc", + "whatsapp.com", + "whatsapp.info", + "whatsapp.net", + "whatsapp.org", + "whatsapp.tv", + "whatsappbrand.com", + "whatscotlandthinks.ac.uk", + "whatsonweibo.com", + "whatthefox.com", + "whatworksscotland.ac.uk", + "whcgroup.ac.uk", + "wheatseeds.org", + "wheb.ac.uk", + "wheelockslatin.com", + "wheelpop.com", + "wheelworks.net", + "whelf.ac.uk", + "whengirlsplay.com", + "whentai.com", + "whereilive.com.au", + "whereiskpkuang.com", + "whereiswerner.com", + "wheretowatch.com", + "wherl.ac.uk", + "whichav.com", + "whichav.video", + "whimn.com.au", + "whippedass.com", + "whisolutions.com", + "whispersystems.org", + "whitegates-feu.ac.uk", + "whiterose-mechanisticbiology-dtp.ac.uk", + "whiterose-social-science-doctoral-training-centre.ac.uk", + "whiterose.ac.uk", + "whitexxxtube.com", + "who.int", + "who.is", + "whodns.xyz", + "whoer.net", + "wholecitiesfoundation.org", + "wholefoods.com", + "wholefoodsmarket.co.uk", + "wholefoodsmarket.com", + "wholekidsfoundation.org", + "wholeplanetfoundation.org", + "wholesale-exporter1.com", + "wholesalediscountpurses.com", + "wholesalefine.com", + "wholesaleonlinemart.com", + "wholesem.ac.uk", + "wholevideos.com", + "whonix.org", + "whoreasianporn.com", + "whoreshub.com", + "whoreslag.com", + "whoreteensex.com", + "whorevintagesex.com", + "whosthehost.com", + "whotalking.com", + "whvuxtub.com", + "whychoosehorizon.com", + "whychooseview.com", + "whychoosevmwareeuc.com", + "whyfacebook.com", + "whyiwantciscotelepresence.com", + "whylover.com", + "whynotbi.com", + "whystudyamerica.ac.uk", + "whystudyeconomics.ac.uk", + "whystudyenglish.ac.uk", + "whystudylanguages.ac.uk", + "whystudymaterials.ac.uk", + "whyx.org", + "wias.ac.uk", + "wicn.ac.uk", + "widevine.com", + "widnesandruncornsixthformcollege.ac.uk", + "widnesruncorn.ac.uk", + "widnessixthformcollege.ac.uk", + "wife-home-videos.com", + "wifehomeporn.com", + "wifeinlove.com", + "wifeinterracialfuck.com", + "wifeloversporn.com", + "wifemovies.net", + "wifesexorgy.com", + "wifesharingpics.com", + "wifevideos.net", + "wifewantstoplay.com", + "wifi-mx.com", + "wifiman.com", + "wigan-leigh.ac.uk", + "wigs.ac.uk", + "wigstoncollege.ac.uk", + "wii-u.com", + "wiifit.com", + "wiifitu.com", + "wiipartyu.com", + "wiisports.com", + "wiisportsresort.com", + "wiiugamepad.com", + "wiivc.net", + "wikaba.com", + "wikawika.xyz", + "wikia.com", + "wikia.org", + "wikibooks.org", + "wikidata.org", + "wikidot.com", + "wikifeet.com", + "wikihow.com", + "wikileaks-forum.com", + "wikileaks.ch", + "wikileaks.com", + "wikileaks.de", + "wikileaks.eu", + "wikileaks.lu", + "wikileaks.org", + "wikileaks.pl", + "wikilivres.info", + "wikimapia.org", + "wikimedia.org", + "wikimediacloud.org", + "wikimediafoundation.org", + "wikinews.org", + "wikipedia-on-ipfs.org", + "wikipedia.org", + "wikiporn.tv", + "wikiquote.org", + "wikisexguide.com", + "wikisource.org", + "wikiunblocked.org", + "wikiversity.org", + "wikivoyage.org", + "wikiwand.com", + "wikiwiki.jp", + "wiktionary.org", + "wilberforce.ac.uk", + "wildammo.com", + "wildcamporn.com", + "wildfanny.com", + "wildfreevideos.com", + "wildxxxhardcore.com", + "wiley.com", + "williamhill.com", + "willw.net", + "willyporn.com", + "wiltscoll.ac.uk", + "wiltshire.ac.uk", + "wiltshirecollege.ac.uk", + "wimbledon-school.ac.uk", + "wimbledon.ac.uk", + "wimcs.ac.uk", + "wimpmusic.com", + "winchester.ac.uk", + "wincoll.ac.uk", + "windows-int.net", + "windows.com", + "windows.net", + "windows.nl", + "windows8.hk", + "windowsazure.com", + "windowscommunity.net", + "windowsmarketplace.com", + "windowsphone-int.com", + "windowsphone.com", + "windowsphoneme.com", + "windowssearch.com", + "windowsuem.com", + "windowsupdate.com", + "windscribe.com", + "windsor-forest.ac.uk", + "windy.com", + "wingamestore.com", + "wingy.site", + "winhec.com", + "winhec.net", + "winncop.ac.uk", + "winning11.com", + "winningstudents-scotland.ac.uk", + "winstanley.ac.uk", + "wintermute.com", + "winticket.jp", + "winudf.com", + "winwhispers.info", + "wionews.com", + "wipower.com", + "wire.com", + "wired.com", + "wiredbytes.com", + "wiredpen.com", + "wireguard.com", + "wireless.radio", + "wirelessgroup.co.uk", + "wirelessreach.com", + "wiremoneytoirelandwithxoomeasierandcheaper.com", + "wireshark.org", + "wirralmet.ac.uk", + "wisdompubs.org", + "wise-research.com", + "wise.com", + "wisecoin.com", + "wiseid.com", + "wisekey.com", + "wisekey.com.hk", + "wiserd.ac.uk", + "wisevid.com", + "wish.com", + "wistia.com", + "wistia.net", + "witcmi.ac.uk", + "withgoogle.com", + "withyoutube.com", + "witnessleeteaching.com", + "witopia.net", + "wittgen-cam.ac.uk", + "wivc.ac.uk", + "wix-code.com", + "wix.com", + "wixanswers.com", + "wixapps.net", + "wixipedia.net", + "wixmp.com", + "wixsite.com", + "wixstatic.com", + "wiz-s.jp", + "wizcrafts.net", + "wjbk.org", + "wjcodes.com", + "wjny-one.sbs", + "wkac.ac.uk", + "wkap.nl", + "wkc.ac.uk", + "wkcic.ac.uk", + "wlc.ac.uk", + "wlcbms.ac.uk", + "wlcbs.ac.uk", + "wlpms.ac.uk", + "wlu.ac.uk", + "wlv.ac.uk", + "wm-air.ac.uk", + "wm18s.buzz", + "wma.ac.uk", + "wmc.ac.uk", + "wmcc.ac.uk", + "wmcloud.org", + "wmcollege.ac.uk", + "wmcu.ac.uk", + "wmflabs.org", + "wmfusercontent.org", + "wmhea.ac.uk", + "wmin.ac.uk", + "wmsf.ac.uk", + "wmt.co", + "wmucs.ac.uk", + "wn.com", + "wnacg.com", + "wnacg.link", + "wnacg.org", + "wnc.ac.uk", + "wnoaissulli1.com", + "wnsc.ac.uk", + "wo.tc", + "wocns.ac.uk", + "woeser.com", + "wofl.tv", + "woflthenewsstation.com", + "wogx.com", + "wokar.org", + "woking.ac.uk", + "wolcol.ac.uk", + "wolfatbestbuy.com", + "wolfatbestbuy.net", + "wolfax.com", + "wolfsex-me.sbs", + "wolseymanuscripts.ac.uk", + "wolterskluwer.com", + "wolvcoll.ac.uk", + "wolverhampton.ac.uk", + "wolverhamptonline.ac.uk", + "wombo.ai", + "womensnikeshox.com", + "womenwill.com", + "womenwill.com.br", + "womenwill.id", + "womenwill.in", + "womenwill.mx", + "won.ac.uk", + "wonporn.com", + "wonporn.net", + "woodhouse.ac.uk", + "woodmancastingx.com", + "woolite.ca", + "woolite.com", + "woolite.pl", + "woolite.us", + "woolitecarpet.com", + "woolyss.com", + "woopie.jp", + "woopie.tv", + "worc.ac.uk", + "worcester.ac.uk", + "wordpress.com", + "wordpress.org", + "wordpress.tv", + "workandhome.ac.uk", + "workatruna.com", + "workerdemo.org.hk", + "workerempowerment.org", + "workers.dev", + "workersthebig.net", + "workflow.is", + "workingclasswriting.ac.uk", + "workingtogethernorthwest.ac.uk", + "workplace.com", + "workplacementscotland.ac.uk", + "workplaceusecases.com", + "worksmobile.com", + "workspaceair.com", + "workspaceone.com", + "workstations.tv", + "world3d.biz", + "worldbank.org", + "worldcat.org", + "worldcoinpay.com", + "worldcurrencycard.co.za", + "worldemojiawards.com", + "worldemojiday.com", + "worldescortindex.com", + "worldflipper.jp", + "worldhack.com", + "worldjournal.com", + "worldofslaves.io", + "worldofwarcraft.com", + "worldpopulationreview.com", + "worldpornvideos.com", + "worldscientific.com", + "worldsecureemail.com", + "worldsecuresystems.com", + "worldsex.com", + "worldsfastestgamer.net", + "worldvpn.net", + "wortech.ac.uk", + "worthing.ac.uk", + "wovs.tk", + "wow-life.net", + "wow.com", + "wowgirls.com", + "wowhead.com", + "wowindianporn.com", + "wowlegacy.ml", + "wowporn.com", + "wowpornlist.xyz", + "wowrk.com", + "wowstars.com", + "wowyoungporn.com", + "woxinghuiguo.com", + "woyaolian.org", + "wozy.in", + "wp-themes.com", + "wp.com", + "wpewebkit.org", + "wpoforum.com", + "wpvip.com", + "wqe.ac.uk", + "wqeic.ac.uk", + "wqyd.org", + "wrapp.ac.uk", + "wrchina.org", + "wrdtc.ac.uk", + "wrdtp.ac.uk", + "wrekincollege.ac.uk", + "wren.ac.uk", + "wrenchead.com", + "wretch.cc", + "wrexham.ac.uk", + "wripa.ac.uk", + "writenow.ac.uk", + "writesonic.com", + "writing-pad.ac.uk", + "writtle.ac.uk", + "writtlecollege.ac.uk", + "writtleuniversitycollege.ac.uk", + "wrocah.ac.uk", + "wroxton-college.ac.uk", + "wrssdtp.ac.uk", + "wsc.ac.uk", + "wscinternational.ac.uk", + "wsfc.ac.uk", + "wsimg.com", + "wsj.com", + "wsj.jobs", + "wsj.net", + "wsjbarrons.com", + "wsjhk.com", + "wsjmediakit.com", + "wsjplus.com", + "wsjshop.com", + "wsjwine.com", + "wspcr.ac.uk", + "wtbn.org", + "wtc.ac.uk", + "wtfpeople.com", + "wto.org", + "wton-acl.ac.uk", + "wton-adulteducation.ac.uk", + "wttw.ac.uk", + "wuerkaixi.com", + "wufafangwen.com", + "wufi.org.tw", + "wuguoguang.com", + "wujie.net", + "wujieliulan.com", + "wukangrui.net", + "wulfrun.ac.uk", + "wun.ac.uk", + "wunvb.com", + "wuso.me", + "wuw.red", + "wuxiapple.com", + "wuyanblog.com", + "wuyefuli.org", + "wvlln.ac.uk", + "wvm0agb4.me", + "wvn.ac.uk", + "wvr.ac.uk", + "ww9094.com", + "wwapple.net", + "wwe.com", + "wwe9.com", + "wwitv.com", + "wwmpcrn.ac.uk", + "wwtbam.com", + "www-bestbuystores.com", + "www-facebook.com", + "www-paypal.info", + "www-paypal.us", + "www-sms-apple.com", + "www.sb", + "www1.biz", + "www8-hp.com", + "wwwapple.com", + "wwwapple.net", + "wwwapplemusic.com", + "wwwdecide.com", + "wwwebay.com", + "wwwebay.net", + "wwwfacebok.com", + "wwwfacebook.com", + "wwwhost.biz", + "wwwhuluplus.com", + "wwwicloud.com", + "wwwinstagram.com", + "wwwipodlounge.com", + "wwwitunes.com", + "wwwlapple.com", + "wwwmacbookair.com", + "wwwmfacebook.com", + "wwwpaypass.com", + "wwwpornhub.pro", + "wwwwebay.com", + "wwwxoom.com", + "wxoyt.com", + "wyams.ac.uk", + "wyke.ac.uk", + "wylln.ac.uk", + "wynd.network", + "wyndlabs.ai", + "wyqqdz.com", + "wzlthw.com", + "wzmyg.com", + "wztv8.com", + "wzyboy.im", + "wzzyw.buzz", + "x-art.com", + "x-artvideo.net", + "x-berry.com", + "x-caprice.com", + "x-fetish.org", + "x-wall.org", + "x.ai", + "x.co", + "x.com", + "x.company", + "x.org", + "x.team", + "x0rd38.xyz", + "x1337x.eu", + "x1337x.se", + "x1337x.ws", + "x18r.co", + "x18r.com", + "x1949x.com", + "x24hr.com", + "x365x.com", + "x3guide.com", + "x3vid.com", + "x6av.com", + "x99av.com", + "xamarin.com", + "xandr.com", + "xanga.com", + "xanimeporn.com", + "xanimeporn.tv", + "xapplist.com", + "xattractive.com", + "xaverian.ac.uk", + "xavs.ac.uk", + "xaxy.xyz", + "xb18.me", + "xbabe.com", + "xbabe.mobi", + "xbanny.com", + "xbase.ac.uk", + "xbeegtube.com", + "xbhuijiab.info", + "xbnat.com", + "xbookcn.com", + "xbookcn.net", + "xbooks.work", + "xbooru.com", + "xbox.co", + "xbox.com", + "xbox.eu", + "xbox.org", + "xbox360.co", + "xbox360.com", + "xbox360.eu", + "xbox360.org", + "xboxab.com", + "xboxgamepass.com", + "xboxgamestudios.com", + "xboxlive.com", + "xboxone.co", + "xboxone.com", + "xboxone.eu", + "xboxplayanywhere.com", + "xboxservices.com", + "xboxstudios.com", + "xboyvids.com", + "xbrasilporno.com", + "xbtce.com", + "xbx.lv", + "xcafe.com", + "xcafe.in", + "xcams.com", + "xcg123.com", + "xchina.co", + "xchina.fun", + "xcity.jp", + "xcritic.com", + "xcum.com", + "xda-cdn.com", + "xda-developers.com", + "xdaddy.in", + "xdaforums.com", + "xdh999.one", + "xdir.vip", + "xdporner.com", + "xdsummit.com", + "xdty.org", + "xecce.com", + "xemales.com", + "xenoblade.com", + "xeon.com", + "xerotica.com", + "xfantazy.com", + "xfemaledom.com", + "xfiles.to", + "xfinity.com", + "xfockers.com", + "xfreehd.com", + "xfuckonline.com", + "xgames.zone", + "xgaytube.com", + "xgaytube.tv", + "xgirls.webcam", + "xgmyd.com", + "xgroovy.com", + "xgsp.tv", + "xgtd3.com", + "xgtdr.buzz", + "xh-porn.com", + "xh.video", + "xhamster.com", + "xhamster.desi", + "xhamster.xxx", + "xhamster18.com", + "xhamster18.desi", + "xhamster2.com", + "xhamsterlive.com", + "xhcdn.com", + "xhot.pro", + "xhub.tv", + "xianba.net", + "xianchawang.net", + "xiangrikui-app.com", + "xianir.xyz", + "xianjian.tw", + "xianqiao.net", + "xiaobaiwu.com", + "xiaochuncnjp.com", + "xiaod.in", + "xiaofu.me", + "xiaogirls.com", + "xiaohexie.com", + "xiaolan.me", + "xiaoma.org", + "xiaomi.eu", + "xiaoou.io", + "xiaoou.tv", + "xiaoshuobb.life", + "xiaoyaoge.xyz", + "xiaxiaoqiang.net", + "xie56.xyz", + "xiezhua.com", + "xihua.es", + "xii.jp", + "xin21.xyz", + "xinaia-av.buzz", + "xinbao.de", + "xindelu.com", + "xinfhw.com", + "xing.com", + "xing66.life", + "xing840.info", + "xinggan77.vip", + "xingrz.me", + "xinhuanet.org", + "xinjiangpolicefiles.org", + "xinlan995.xyz", + "xinmeitulu.com", + "xinmiao.com.hk", + "xinsheng.net", + "xinshijue.com", + "xinyubbs.net", + "xiongpian.com", + "xiuren.org", + "xixicui.icu", + "xizang-zhiye.org", + "xjavporn.com", + "xjp.cc", + "xjtravelguide.com", + "xkeezmovies.com", + "xkiwi.tk", + "xknoop.com", + "xkontakt18.com", + "xkorean.cam", + "xl-gaytube.com", + "xlecx.org", + "xlfmtalk.com", + "xlfmwz.info", + "xlgirls.com", + "xlinkz.to", + "xlovecam.com", + "xlstudio.com", + "xlydh.cc", + "xm.com", + "xmalay.com", + "xmas.ac.uk", + "xmat.ac.uk", + "xmature.su", + "xmav99.com", + "xmbsyj.top", + "xmforever.rest", + "xmissy.nl", + "xml-training-guide.com", + "xmm.ac.uk", + "xmonk.net", + "xmovies.com", + "xmoviesforyou.com", + "xmulib.org", + "xn--096-4g6em5t.com", + "xn--201-4g6em5t.com", + "xn--202-4g6em5t.com", + "xn--203-4g6em5t.com", + "xn--204-4g6em5t.com", + "xn--205-4g6em5t.com", + "xn--2vxsp6vi4j.com", + "xn--3et96bj49ahpq.com", + "xn--4gq171p.com", + "xn--4vq475g.com", + "xn--4vq477m.com", + "xn--6eup7j.com", + "xn--6eup7j.net", + "xn--74q434dwff.com", + "xn--74q434dwff.net", + "xn--7hv594h.com", + "xn--8uq428d76d.tokyo", + "xn--90wwvt03e.com", + "xn--9kr7l.com", + "xn--9pr62r24a.com", + "xn--9trs65b.com", + "xn--av-o44ep1d.com", + "xn--cck4d8b3009a.com", + "xn--colegsirgr-c5a.ac.uk", + "xn--czq75pvv1aj5c.org", + "xn--d4ty0ojsqzfd.com", + "xn--flw351e.com", + "xn--ggle-55da.com", + "xn--gmq348bujlxrb.com", + "xn--gmq92kd2rm1kx34a.com", + "xn--gogl-0nd52e.com", + "xn--gogl-1nd42e.com", + "xn--gtvz22d.wang", + "xn--hb4aw0g.com", + "xn--hckl3e1e8a8ajin0czf.net", + "xn--hhr917d3fecva.xyz", + "xn--i2ru8q2qg.com", + "xn--mts47c3w9b1qr.net", + "xn--mtswd61ejxq.com", + "xn--ngstr-lra8j.com", + "xn--oiq.cc", + "xn--pearsonenespaol-brb.com", + "xn--q41am8x.com", + "xn--qoq462m.com", + "xn--r8jwklh769h2mc880dk1o431a.com", + "xn--r8jwklh769hk43amcfoyl3z3a.com", + "xn--sgt856gbjl.cc", + "xn--sjqr38j.com", + "xn--tkry91n.com", + "xn--ubt498knmf.com", + "xn--uis17aj9kmuf.com", + "xn--urs05q.jp", + "xn--x-qeu1ji09tzlg.biz", + "xn--x-qeu1ji09tzlg.net", + "xn--xsq421m.com", + "xn--xsq605n.com", + "xn--xsq959n.com", + "xn--yf1at58a.com", + "xn--yt8h.la", + "xn--ztsq84g.cn", + "xnalgas.com", + "xnertv.shop", + "xnostars.com", + "xnxvideos.org", + "xnxx-cdn.com", + "xnxx-sex-tube.com", + "xnxx-sex-videos.com", + "xnxx-teens.com", + "xnxx-tv.net", + "xnxx-xxx.win", + "xnxx.com", + "xnxx.health", + "xnxx.net", + "xnxx.tv", + "xnxx18.pro", + "xnxx2.info", + "xnxx2.it", + "xnxx2.org", + "xnxx2.pro", + "xnxx3.com", + "xnxx4porn.com", + "xnxxarab.cc", + "xnxxarabsex.com", + "xnxxcom.club", + "xnxxcom.xyz", + "xnxxcomvideos.com", + "xnxxfap.info", + "xnxxhamster.net", + "xnxxhd.biz", + "xnxxhd.tv", + "xnxxmovies.com", + "xnxxporn.de", + "xnxxporn.fun", + "xnxxpornvid.com", + "xnxxsexclips.com", + "xnxxsexmovies.com", + "xnxxtime.com", + "xnxxvideos.rest", + "xnxxx.cc", + "xo.com", + "xo104.com", + "xogogo.com", + "xomfsp.xyz", + "xoom-experience.com", + "xoom.com", + "xoom.io", + "xoom.us", + "xoomcom.com", + "xoteens.com", + "xoxoteiras.com", + "xozilla.com", + "xpaja.net", + "xpdo.net", + "xpee.com", + "xplr.co", + "xpoleuno.com", + "xpornblog.com", + "xpornplease.com", + "xposed.info", + "xpud.org", + "xqwherb.sbs", + "xrentdvd.com", + "xsava.xyz", + "xscale.com", + "xsden.info", + "xsden.org", + "xsela.cc", + "xshaker.net", + "xshr.online", + "xsijishe.com", + "xskywalker.com", + "xskywalker.net", + "xslist.org", + "xstas.biz", + "xsvod.xyz", + "xsz-av.com", + "xtapes.to", + "xtegvk.xyz", + "xtracloud.net", + "xtube.com", + "xtubebdsm.com", + "xtubezoo.com", + "xu97.vip", + "xuchao.net", + "xuchao.org", + "xuehua.us", + "xuite.net", + "xujan.com", + "xuzhiyong.net", + "xv1.monster", + "xvbelink.com", + "xvds.tv", + "xvedo.net", + "xvideo-jp.com", + "xvideo.cc", + "xvideo.com", + "xvideo.run", + "xvideo.vlog.br", + "xvideoporno.tv", + "xvideos-cdn.com", + "xvideos-dl.top", + "xvideos-porn-video.com", + "xvideos-xxxx.com", + "xvideos.blog", + "xvideos.co", + "xvideos.com", + "xvideos.es", + "xvideos.la", + "xvideos.red", + "xvideos.tv.br", + "xvideos2.com", + "xvideos3.com", + "xvideos5.com.br", + "xvideosamadoras.com", + "xvideosbrasil.com", + "xvideosbrasileiro.net", + "xvideoscom.me", + "xvideosincesto.com", + "xvideosjingxiang.com", + "xvideosnovinha.com", + "xvideosnovinha.com.br", + "xvideosnovinhas.com", + "xvideostravestis.xxx", + "xvideosup.com.br", + "xvideosx.com.br", + "xvideoz.win", + "xvidios.blog", + "xvidios.xxx", + "xvidzz.com", + "xvinlink.com", + "xvirtual.com", + "xvxx.stream", + "xvxxtube.com", + "xwbo.com", + "xx-map.com", + "xx9.app", + "xxbay.com", + "xxbbx.com", + "xxbook.cc", + "xxbrits.com", + "xxeronetxx.info", + "xxfbiaa.xyz", + "xxgasm.com", + "xxindianporn.com", + "xxiqiyiavxx.buzz", + "xxlmovies.com", + "xxmovz.com", + "xxnx.rest", + "xxnxx-porn.com", + "xxnxx-sex.com", + "xxu.mobi", + "xxuz.com", + "xxvideo.mobi", + "xxvideos.xxx", + "xxvideoss.org", + "xxvids.net", + "xxx-av.com", + "xxx-com.cfd", + "xxx-fap.com", + "xxx-files.org", + "xxx-hentai.blogspot.com", + "xxx-porn-fuck.com", + "xxx-porn-tube.com", + "xxx-porn.info", + "xxx-video.cfd", + "xxx-videos.tv", + "xxx-ways.com", + "xxx.com", + "xxx.xxx", + "xxx18.uno", + "xxx18teen.net", + "xxx2022.com", + "xxx2023.com", + "xxx4hindi.com", + "xxxaporn.com", + "xxxassfuck.com", + "xxxbit.com", + "xxxbolivianas.com", + "xxxbule.com", + "xxxbullet.com", + "xxxbunker.com", + "xxxclub.club", + "xxxcomics.org", + "xxxdan.com", + "xxxdesi.cc", + "xxxdinotube.com", + "xxxengine.net", + "xxxfile.org", + "xxxfiles.com", + "xxxflare.com", + "xxxforte.com", + "xxxfree.watch", + "xxxfuckmom.com", + "xxxgames.biz", + "xxxgames.games", + "xxxgirls88.com", + "xxxgratisfilms.com", + "xxxhd.pro", + "xxxhdporn.cc", + "xxxhentai.net", + "xxxhentaipics.com", + "xxxhentaipics.pro", + "xxxhomefuck.com", + "xxxhub123.com", + "xxxhubvideos.com", + "xxxifuck.com", + "xxxindianporn2.com", + "xxxindiantv.com", + "xxxjapanesemovies.com", + "xxxland.net", + "xxxlesbians.me", + "xxxlucah.com", + "xxxmaturepussypics.com", + "xxxmatures.net", + "xxxmofo.com", + "xxxmomporn.tube", + "xxxmovies.fun", + "xxxmovies.pro", + "xxxn.me", + "xxxn.tv", + "xxxner.com", + "xxxnewvideos.com", + "xxxnu.com", + "xxxnxx.me", + "xxxpenguin.com", + "xxxpicz.com", + "xxxporn.su", + "xxxporn123.com", + "xxxporndig.com", + "xxxpornhd.pro", + "xxxpornmovs.com", + "xxxpornotuber.com", + "xxxpornozinho.blog.br", + "xxxpornzeed.com", + "xxxreal.com", + "xxxscenes.net", + "xxxsexanal.com", + "xxxsexcinema.com", + "xxxsexocasero.com", + "xxxsextubes.com", + "xxxsexzoo.com", + "xxxshame.com", + "xxxstreams.eu", + "xxxstreams.org", + "xxxstreams.watch", + "xxxteenanal.net", + "xxxtube1.com", + "xxxtubeasian.net", + "xxxtubedot.com", + "xxxtubegf.com", + "xxxtubenote.com", + "xxxtubeset.com", + "xxxtubezoo.com", + "xxxv.mobi", + "xxxvideo.blog.br", + "xxxvideo.one", + "xxxvideo.vip", + "xxxvideo.world", + "xxxvideoamatoriali.com", + "xxxvideor.com", + "xxxvideos247.com", + "xxxvideoszoo.com", + "xxxvidos.vip", + "xxxvidso.com", + "xxxvirtualworld.com", + "xxxvogue.net", + "xxxwow.net", + "xxxx.com.au", + "xxxxvideo.uno", + "xxxy.biz", + "xxxy.info", + "xxxyaom.xyz", + "xxxymovies.com", + "xxxyoungxxx.com", + "xys.org", + "xysblogs.org", + "xyy69.com", + "xyy69.info", + "xzone.to", + "xzxxporn.com", + "xzxxtube.com", + "y2mate.com", + "ya.ru", + "yaddal.tv", + "yadi.sk", + "yadori.club", + "yaeby.info", + "yahoo-news.com.hk", + "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.cm", + "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.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", + "yahooapis.com", + "yahoodns.net", + "yahoofinance.com", + "yahoohealth.com", + "yahoomusic.com", + "yahoosandbox.com", + "yahoosportsbook.com", + "yakbutterblues.com", + "yale-wrexham.ac.uk", + "yale.ac.uk", + "yale.edu", + "yam.com", + "yam.org.tw", + "yamaxun.com", + "yamibo.com", + "yammer.com", + "yamoon.club", + "yande.re", + "yandex.aero", + "yandex.az", + "yandex.by", + "yandex.co.il", + "yandex.com", + "yandex.com.ge", + "yandex.com.ru", + "yandex.com.tr", + "yandex.com.ua", + "yandex.de", + "yandex.ee", + "yandex.eu", + "yandex.fi", + "yandex.fr", + "yandex.jobs", + "yandex.kg", + "yandex.kz", + "yandex.lt", + "yandex.lv", + "yandex.md", + "yandex.net", + "yandex.org", + "yandex.pl", + "yandex.ru", + "yandex.st", + "yandex.sx", + "yandex.tj", + "yandex.tm", + "yandex.ua", + "yandex.uz", + "yandexcloud.net", + "yanghengjun.com", + "yangjianli.com", + "yantaqu.com", + "yaohubaba.com", + "yaoimangaonline.com", + "yaoiotaku.com", + "yaole91.xyz", + "yaoliuno.fun", + "yaoyaomumu.com", + "yaptube.com", + "yarininsuyu.com", + "yarnpkg.com", + "yasarang.net", + "yasni.co.uk", + "yastatic.net", + "yavtube.com", + "yaya.cyou", + "yayabay.com", + "yayadizhi.xyz", + "yazhouse8.com", + "ycc.ac.uk", + "ycoastco.ac.uk", + "ycombinator.com", + "ycuc.ac.uk", + "ycw.ac.uk", + "ydds.ac.uk", + "ydn.com.tw", + "ydrindoddewisant.ac.uk", + "ydy.com", + "yeahteentube.com", + "yecl.net", + "yeelou.com", + "yeeyi.com", + "yegle.net", + "yeonda.com", + "yeovil-college.ac.uk", + "yeovil.ac.uk", + "yepporn.com", + "yes-news.com", + "yes.xxx", + "yes123.com.tw", + "yesasia.com", + "yesasia.com.hk", + "yespornfree.com", + "yespornplease.com", + "yespornpleasexxx.com", + "yeswegays.com", + "yeyeclub.com", + "yft-mv.sbs", + "ygto.com", + "ygugu4.com", + "yhcw.net", + "yhelln.ac.uk", + "yhgwgtv.xyz", + "yho.com", + "yhua.ac.uk", + "yhy.cool", + "yibada.com", + "yibaochina.com", + "yibei.org", + "yidio.com", + "yigeni.com", + "yilubbs.com", + "yimg.com", + "yimg.jp", + "yinac.xyz", + "yinac5.top", + "yingpianqu.com", + "yingsuoss.com", + "yinhdhan.sbs", + "yinhuafish.lat", + "yinlei.org", + "yinmh.com", + "yinshuiger.info", + "yinya.shop", + "yipub.com", + "yiqiedoushiganggangkaishi.org", + "yizhihongxing.com", + "yjcontentdelivery.com", + "ymail.com", + "ymca-wales.ac.uk", + "ymca.ac.uk", + "ymhsf.top", + "ymhsf1.top", + "ync.ne.jp", + "ynoproject.net", + "yo1health.com", + "yobit.net", + "yobt.com", + "yobt.tv", + "yogalayout.com", + "yogichen.org", + "yogify.com", + "yolasite.com", + "yomabank.com", + "yomikyo.or.jp", + "yomilogi.com", + "yomiuri-johkai.co.jp", + "yomiuri-ryokou.co.jp", + "yomiuri-systec.co.jp", + "yomiuri.co.jp", + "yong.hu", + "yopo.work", + "yopornshop.com", + "york-sfc.ac.uk", + "york.ac.uk", + "yorkbbs.ca", + "yorkcollege.ac.uk", + "yorkcollegeapps.ac.uk", + "yorkshireuniversities.ac.uk", + "yorksj.ac.uk", + "yorkstonemasonrycove.ac.uk", + "yoshisnewisland.com", + "you-get.org", + "you.com", + "youassporn.com", + "youav.com", + "youdontcare.com", + "youflix.is", + "youjism.com", + "youjizz.com", + "youjizz.sex", + "youlucky.com", + "youmaker.com", + "young-amateur-movies.com", + "young-webcam.net", + "young-xxx.net", + "youngamateursporn.com", + "younger19.com", + "youngerbabes.com", + "youngermommy.com", + "youngfoundation.ac.uk", + "youngheaven.com", + "younglibertines.com", + "youngmommyfucksme.com", + "youngpornhd.com", + "youngpornonly.com", + "youngpornvideos.com", + "youngsex.sexy", + "youngsex.video", + "youngspiration.hk", + "youngteenhomeporn.com", + "youngtube.me", + "youpai.org", + "youporn-germany.com", + "youporn.com", + "youporner.eu", + "youporngay.com", + "youpornlist.com", + "youpornpremium.com", + "youpornru.com", + "youpornxvideos.net", + "your-freedom.net", + "your-objectstorage.com", + "your-server.de", + "youramateurporn.com", + "yourassbig.com", + "yourbrain.com", + "yourdailypornvideos.ws", + "yourdirtymind.com", + "yourdoll.com", + "yourepeat.com", + "yourfantasybeginsnow.com", + "yourflashporn.com", + "yourfreeporn.tv", + "yourfuture-eastmidlands.ac.uk", + "yourgynexam.com", + "yourlisten.com", + "yourlust.com", + "yourmomlovesanal.com", + "yourmomsgotbigtits.com", + "yourmonsterbeats.com", + "yourpelvicexam.com", + "yourporn.sexy", + "yourporndump.com", + "yourporngod.com", + "yourprivatevpn.com", + "yourtrap.com", + "yourtv.com.au", + "yourupskirt.com", + "yourvoyeurvideos.com", + "yourwifemymeat.com", + "yourxxxvideos.pro", + "yousendit.com", + "youshare.ac.uk", + "youshun12.com", + "youskbe.com", + "youthforfreechina.org", + "youthnetradio.org", + "youthwant.com.tw", + "youtrannytube.com", + "youtu.be", + "youtube-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.com", + "youtube.com.ar", + "youtube.com.au", + "youtube.com.az", + "youtube.com.bd", + "youtube.com.bh", + "youtube.com.bo", + "youtube.com.br", + "youtube.com.by", + "youtube.com.co", + "youtube.com.do", + "youtube.com.ec", + "youtube.com.ee", + "youtube.com.eg", + "youtube.com.es", + "youtube.com.gh", + "youtube.com.gr", + "youtube.com.gt", + "youtube.com.hk", + "youtube.com.hn", + "youtube.com.hr", + "youtube.com.jm", + "youtube.com.jo", + "youtube.com.kw", + "youtube.com.lb", + "youtube.com.lv", + "youtube.com.ly", + "youtube.com.mk", + "youtube.com.mt", + "youtube.com.mx", + "youtube.com.my", + "youtube.com.ng", + "youtube.com.ni", + "youtube.com.om", + "youtube.com.pa", + "youtube.com.pe", + "youtube.com.ph", + "youtube.com.pk", + "youtube.com.pt", + "youtube.com.py", + "youtube.com.qa", + "youtube.com.ro", + "youtube.com.sa", + "youtube.com.sg", + "youtube.com.sv", + "youtube.com.tn", + "youtube.com.tr", + "youtube.com.tw", + "youtube.com.ua", + "youtube.com.uy", + "youtube.com.ve", + "youtube.cr", + "youtube.cz", + "youtube.de", + "youtube.dk", + "youtube.ee", + "youtube.es", + "youtube.fi", + "youtube.fr", + "youtube.ge", + "youtube.googleapis.com", + "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.vn", + "youtubecisco.com", + "youtubecn.com", + "youtubeeducation.com", + "youtubeembeddedplayer.googleapis.com", + "youtubefanfest.com", + "youtubegaming.com", + "youtubego.co.id", + "youtubego.co.in", + "youtubego.com", + "youtubego.com.br", + "youtubego.id", + "youtubego.in", + "youtubei.googleapis.com", + "youtubekids.com", + "youtubemobilesupport.com", + "youversion.com", + "youwin.com", + "youwuss.com", + "youx.xxx", + "youxu.info", + "youyu.services", + "yoyoav.net", + "ypmate.com", + "ypncdn.com", + "yporth.ac.uk", + "yra.ac.uk", + "ysav184.xyz", + "ysg-link.sbs", + "ysj.ac.uk", + "yskg-ber.buzz", + "ysporn.com", + "ystrad-mynach.ac.uk", + "ysulondon.ac.uk", + "ysx-mm.com", + "yt.be", + "ytht.net", + "ytimg.com", + "ytn.co.kr", + "yts.ag", + "yts.am", + "yts.lt", + "yts.mx", + "yuanming.net", + "yuanzhengtang.org", + "yuenuge113.xyz", + "yuenuge18.cc", + "yukineko.me", + "yulghun.com", + "yunchao.net", + "yunlaopo.cc", + "yunlaopo.com", + "yunlaopo.net", + "yuntipub.com", + "yusercontent.com", + "yusjb.com", + "yuvutu.com", + "yvesgeleyn.com", + "ywoos.com", + "ywpw.com", + "yx51.net", + "yy55.tv", + "yy7y.com", + "yy8y.com", + "yyfb.cyou", + "yyii.org", + "yyjlymb.xyz", + "yysub.net", + "yzld188.top", + "yzzk.com", + "z-lib.org", + "z-library.se", + "z00.world", + "z18r.co", + "z18r.com", + "z3x-team.com", + "z5.app", + "z5.com", + "z676869.com", + "za77.xyz", + "zacebook.com", + "zakzak.co.jp", + "zalmos.com", + "zamimg.com", + "zannel.com", + "zaobao.com", + "zaobao.com.sg", + "zaobao.sg", + "zaozon.com", + "zapper.fi", + "zapto.org", + "zatrahal.online", + "zattoo.com", + "zavat.pw", + "zazzybabes.com", + "zb.app", + "zb.com", + "zb.io", + "zb.live", + "zbporn.com", + "zctb.buzz", + "zdassets.com", + "zdnet.com", + "zdnet.com.tw", + "zdusercontent.com", + "zee.com", + "zee5.com", + "zee5.in", + "zee5.tv", + "zeebioskop.com", + "zeebiz.com", + "zeeentertainment.com", + "zeenews-fonts.s3.amazonaws.com", + "zeenews.com", + "zeenite.com", + "zeetv.co.uk", + "zeetv.com", + "zeeuk.com", + "zeit-world.co.uk", + "zeit-world.com", + "zeit-world.net", + "zeit-world.org", + "zeit.co", + "zeit.sh", + "zeitworld.com", + "zello.com", + "zen8ok.xyz", + "zencdn.net", + "zencoder.com", + "zendesk.com", + "zengjinyan.org", + "zenlesszonezero.com", + "zenmate.com", + "zenmate.com.ru", + "zenodo.org", + "zeplerinstitute.ac.uk", + "zeplin.dev", + "zeplin.io", + "zergpool.com", + "zeriamerikes.com", + "zerochan.net", + "zerohedge.com", + "zeronet.io", + "zert.ch", + "zettai-ero.com", + "zeutch.com", + "zfreet.com", + "zgsddh.com", + "zgzcjj.net", + "zh99.net", + "zhaimankan.com", + "zhainanjidi.xyz", + "zhainanjidid.top", + "zhanbin.net", + "zhangboli.net", + "zhangboz1.xyz", + "zhangtianliang.com", + "zhanlve.org", + "zhenghui.org", + "zhengjian.org", + "zhengwunet.org", + "zhenlibu.info", + "zhenlibu1984.com", + "zhenxiang.biz", + "zhimeishe888.com", + "zhinengluyou.com", + "zhongguo.ca", + "zhongguorenquan.org", + "zhongguotese.net", + "zhongmeng.org", + "zhoushuguang.com", + "zhreader.com", + "zhtv01.com", + "zhuangbi.me", + "zhuanxing.cn", + "zhuatieba.com", + "zhuichaguoji.org", + "zhujiget.com", + "zhuzhushipin-app.com", + "zi.media", + "zi5.me", + "zibacity.com", + "ziddu.com", + "zigzag.kr", + "zillionk.com", + "zim.vn", + "zind.cloud", + "zingtruyen.net", + "zinio.com", + "zipcine.com", + "ziporn.com", + "zippyshare.com", + "zishy.com", + "zkaip.com", + "zkiz.com", + "zlib.life", + "zlibcdn.com", + "zlibcdn2.com", + "zmw.cn", + "zndsk.com", + "zodgame.us", + "zoho.com", + "zoho.com.au", + "zoho.eu", + "zoho.in", + "zohocdn.com", + "zohomeetups.com", + "zohomerchandise.com", + "zohopublic.com", + "zohoschools.com", + "zohostatic.com", + "zohostatic.in", + "zohouniversity.com", + "zohowebstatic.com", + "zoig.com", + "zomobo.net", + "zonaeuropa.com", + "zonghexinwen.com", + "zonghexinwen.net", + "zoo-hardcore.com", + "zoo-porno.biz", + "zoo-tube8.com", + "zoo-xnxx.com", + "zoofiction.com", + "zoofilianet.com", + "zoogvpn.com", + "zoohun.com", + "zoom.com", + "zoom.com.cn", + "zoom.us", + "zoomingin.tv", + "zoomobileporn.com", + "zoonoses.ac.uk", + "zoonosis.ac.uk", + "zoophilist.net", + "zooporn.pro", + "zooporn.shiksha", + "zooporn.video", + "zoopornmd.com", + "zooporno.biz", + "zooredtube.com", + "zoosexfarm.com", + "zoosexnet.com", + "zooskoolvideos.com", + "zootool.com", + "zootube1.com", + "zooxxxsexporn.red", + "zooyouporn.com", + "zoozhamster.com", + "zoozle.net", + "zophar.net", + "zopim.com", + "zorglist.com", + "zorrovpn.com", + "zozotown.com", + "zpn.im", + "zqqpwz.com", + "zsdxzk.com", + "zsh.org", + "zspeeder.me", + "zsrhao.com", + "zsuxtx-ktv.shop", + "zteman.net", + "zuckerberg.com", + "zuckerberg.net", + "zukunftswerkstatt.de", + "zunked.com", + "zuo.la", + "zuobiao.me", + "zuola.com", + "zvereff.com", + "zweiporn.com", + "zwtvusa.com", + "zynaima.com", + "zynamics.com", + "zyns.com", + "zyxel.com", + "zyzc9.com", + "zzcartoon.com", + "zzcloud.me", + "zzdh.biz", + "zzdh.cc", + "zzdh.pw", + "zzdh.run", + "zzdh.ws", + "zzdh77.com", + "zzdh808.com", + "zzdh99.com", + "zzgays.com", + "zzux.com", + "zzycdz.com" + ] + ], + [ + [], + [] + ] ]; var lastRule = ''; function FindProxyForURL(url, host) { - for (var i = 0; i < rules.length; i++) { - ret = testHost(host, i); - if (ret != undefined) - return ret; - } - return 'DIRECT'; + for (var i = 0; i < rules.length; i++) { + ret = testHost(host, i); + if (ret != undefined) + return ret; + } + return 'DIRECT'; } function testHost(host, index) { - for (var i = 0; i < rules[index].length; i++) { - for (var j = 0; j < rules[index][i].length; j++) { - lastRule = rules[index][i][j] - if (host == lastRule || host.endsWith('.' + lastRule)) - return i % 2 == 0 ? 'DIRECT' : proxy; - } - } - lastRule = ''; + for (var i = 0; i < rules[index].length; i++) { + for (var j = 0; j < rules[index][i].length; j++) { + lastRule = rules[index][i][j] + if (host == lastRule || host.endsWith('.' + lastRule)) + return i % 2 == 0 ? 'DIRECT' : proxy; + } + } + lastRule = ''; } // REF: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith if (!String.prototype.endsWith) { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; + String.prototype.endsWith = function(searchString, position) { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; }; } diff --git a/v2rayN/ServiceLib/Sample/tun_singbox_dns b/v2rayN/ServiceLib/Sample/tun_singbox_dns index bc5b8c8e..617de58d 100644 --- a/v2rayN/ServiceLib/Sample/tun_singbox_dns +++ b/v2rayN/ServiceLib/Sample/tun_singbox_dns @@ -1,36 +1,40 @@ { - "servers": [ - { - "tag": "remote", - "address": "tcp://8.8.8.8", - "strategy": "prefer_ipv4", - "detour": "proxy" - }, - { - "tag": "local", - "address": "223.5.5.5", - "strategy": "prefer_ipv4", - "detour": "direct" - }, - { - "tag": "block", - "address": "rcode://success" - } - ], - "rules": [ - { - "rule_set": [ - "geosite-cn", - "geosite-geolocation-cn" - ], - "server": "local" - }, - { - "rule_set": [ - "geosite-category-ads-all" - ], - "server": "block" - } - ], - "final": "remote" + "servers": + [ + { + "tag": "remote", + "address": "tcp://8.8.8.8", + "strategy": "prefer_ipv4", + "detour": "proxy" + }, + { + "tag": "local", + "address": "223.5.5.5", + "strategy": "prefer_ipv4", + "detour": "direct" + }, + { + "tag": "block", + "address": "rcode://success" + } + ], + "rules": + [ + { + "rule_set": + [ + "geosite-cn", + "geosite-geolocation-cn" + ], + "server": "local" + }, + { + "rule_set": + [ + "geosite-category-ads-all" + ], + "server": "block" + } + ], + "final": "remote" } diff --git a/v2rayN/ServiceLib/Sample/tun_singbox_inbound b/v2rayN/ServiceLib/Sample/tun_singbox_inbound index db5b0b32..da0713df 100644 --- a/v2rayN/ServiceLib/Sample/tun_singbox_inbound +++ b/v2rayN/ServiceLib/Sample/tun_singbox_inbound @@ -1,14 +1,15 @@ { - "type": "tun", - "tag": "tun-in", - "interface_name": "singbox_tun", - "address": [ - "172.18.0.1/30", - "fdfe:dcba:9876::1/126" - ], - "mtu": 9000, - "auto_route": true, - "strict_route": false, - "stack": "system", - "sniff": true -} \ No newline at end of file + "type": "tun", + "tag": "tun-in", + "interface_name": "singbox_tun", + "address": + [ + "172.18.0.1/30", + "fdfe:dcba:9876::1/126" + ], + "mtu": 9000, + "auto_route": true, + "strict_route": false, + "stack": "system", + "sniff": true +} diff --git a/v2rayN/ServiceLib/Sample/tun_singbox_rules b/v2rayN/ServiceLib/Sample/tun_singbox_rules index df1dc4ec..b2088c99 100644 --- a/v2rayN/ServiceLib/Sample/tun_singbox_rules +++ b/v2rayN/ServiceLib/Sample/tun_singbox_rules @@ -1,20 +1,22 @@ [ - { - "network": "udp", - "port": [ - 135, - 137, - 138, - 139, - 5353 - ], - "outbound": "block" - }, - { - "ip_cidr": [ - "224.0.0.0/3", - "ff00::/8" - ], - "outbound": "block" - } -] \ No newline at end of file + { + "network": "udp", + "port": + [ + 135, + 137, + 138, + 139, + 5353 + ], + "outbound": "block" + }, + { + "ip_cidr": + [ + "224.0.0.0/3", + "ff00::/8" + ], + "outbound": "block" + } +] diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs index 2a732e2b..9d1ab8d9 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs @@ -1,272 +1,272 @@ namespace ServiceLib.Services.CoreConfig { - /// - /// Core configuration file processing class - /// - public class CoreConfigClashService - { - private Config _config; - private static readonly string _tag = "CoreConfigClashService"; + /// + /// Core configuration file processing class + /// + public class CoreConfigClashService + { + private Config _config; + private static readonly string _tag = "CoreConfigClashService"; - public CoreConfigClashService(Config config) - { - _config = config; - } + public CoreConfigClashService(Config config) + { + _config = config; + } - /// - /// 生成配置文件 - /// - /// - /// - /// - /// - public async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) - { - var ret = new RetResult(); - if (node == null || fileName is null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } + /// + /// 生成配置文件 + /// + /// + /// + /// + /// + public async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) + { + var ret = new RetResult(); + if (node == null || fileName is null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } - ret.Msg = ResUI.InitialConfiguration; + ret.Msg = ResUI.InitialConfiguration; - try - { - if (node == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } + try + { + if (node == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } - if (File.Exists(fileName)) - { - File.Delete(fileName); - } + if (File.Exists(fileName)) + { + File.Delete(fileName); + } - string addressFileName = node.Address; - if (Utils.IsNullOrEmpty(addressFileName)) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - if (!File.Exists(addressFileName)) - { - addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); - } - if (!File.Exists(addressFileName)) - { - ret.Msg = ResUI.FailedReadConfiguration + "1"; - return ret; - } + string addressFileName = node.Address; + if (Utils.IsNullOrEmpty(addressFileName)) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + if (!File.Exists(addressFileName)) + { + addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); + } + if (!File.Exists(addressFileName)) + { + ret.Msg = ResUI.FailedReadConfiguration + "1"; + return ret; + } - string tagYamlStr1 = "!"; - string tagYamlStr2 = "__strn__"; - string tagYamlStr3 = "!!str"; - var txtFile = File.ReadAllText(addressFileName); - txtFile = txtFile.Replace(tagYamlStr1, tagYamlStr2); + string tagYamlStr1 = "!"; + string tagYamlStr2 = "__strn__"; + string tagYamlStr3 = "!!str"; + var txtFile = File.ReadAllText(addressFileName); + txtFile = txtFile.Replace(tagYamlStr1, tagYamlStr2); - //YAML anchors - if (txtFile.Contains("<<:") && txtFile.Contains('*') && txtFile.Contains('&')) - { - txtFile = YamlUtils.PreprocessYaml(txtFile); - } + //YAML anchors + if (txtFile.Contains("<<:") && txtFile.Contains('*') && txtFile.Contains('&')) + { + txtFile = YamlUtils.PreprocessYaml(txtFile); + } - var fileContent = YamlUtils.FromYaml>(txtFile); - if (fileContent == null) - { - ret.Msg = ResUI.FailedConversionConfiguration; - return ret; - } + var fileContent = YamlUtils.FromYaml>(txtFile); + if (fileContent == null) + { + ret.Msg = ResUI.FailedConversionConfiguration; + return ret; + } - //mixed-port - fileContent["mixed-port"] = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); - //log-level - fileContent["log-level"] = GetLogLevel(_config.CoreBasicItem.Loglevel); + //mixed-port + fileContent["mixed-port"] = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); + //log-level + fileContent["log-level"] = GetLogLevel(_config.CoreBasicItem.Loglevel); - //external-controller - fileContent["external-controller"] = $"{Global.Loopback}:{AppHandler.Instance.StatePort2}"; - //allow-lan - if (_config.Inbound.First().AllowLANConn) - { - fileContent["allow-lan"] = "true"; - fileContent["bind-address"] = "*"; - } - else - { - fileContent["allow-lan"] = "false"; - } + //external-controller + fileContent["external-controller"] = $"{Global.Loopback}:{AppHandler.Instance.StatePort2}"; + //allow-lan + if (_config.Inbound.First().AllowLANConn) + { + fileContent["allow-lan"] = "true"; + fileContent["bind-address"] = "*"; + } + else + { + fileContent["allow-lan"] = "false"; + } - //ipv6 - fileContent["ipv6"] = _config.ClashUIItem.EnableIPv6; + //ipv6 + fileContent["ipv6"] = _config.ClashUIItem.EnableIPv6; - //mode - if (!fileContent.ContainsKey("mode")) - { - fileContent["mode"] = ERuleMode.Rule.ToString().ToLower(); - } - else - { - if (_config.ClashUIItem.RuleMode != ERuleMode.Unchanged) - { - fileContent["mode"] = _config.ClashUIItem.RuleMode.ToString().ToLower(); - } - } + //mode + if (!fileContent.ContainsKey("mode")) + { + fileContent["mode"] = ERuleMode.Rule.ToString().ToLower(); + } + else + { + if (_config.ClashUIItem.RuleMode != ERuleMode.Unchanged) + { + fileContent["mode"] = _config.ClashUIItem.RuleMode.ToString().ToLower(); + } + } - //enable tun mode - if (_config.TunModeItem.EnableTun) - { - string tun = Utils.GetEmbedText(Global.ClashTunYaml); - if (Utils.IsNotEmpty(tun)) - { - var tunContent = YamlUtils.FromYaml>(tun); - if (tunContent != null) - fileContent["tun"] = tunContent["tun"]; - } - } + //enable tun mode + if (_config.TunModeItem.EnableTun) + { + string tun = Utils.GetEmbedText(Global.ClashTunYaml); + if (Utils.IsNotEmpty(tun)) + { + var tunContent = YamlUtils.FromYaml>(tun); + if (tunContent != null) + fileContent["tun"] = tunContent["tun"]; + } + } - //Mixin - try - { - MixinContent(fileContent, node); - } - catch (Exception ex) - { - Logging.SaveLog($"{_tag}-Mixin", ex); - } + //Mixin + try + { + MixinContent(fileContent, node); + } + catch (Exception ex) + { + Logging.SaveLog($"{_tag}-Mixin", ex); + } - var txtFileNew = YamlUtils.ToYaml(fileContent).Replace(tagYamlStr2, tagYamlStr3); - await File.WriteAllTextAsync(fileName, txtFileNew); - //check again - if (!File.Exists(fileName)) - { - ret.Msg = ResUI.FailedReadConfiguration + "2"; - return ret; - } + var txtFileNew = YamlUtils.ToYaml(fileContent).Replace(tagYamlStr2, tagYamlStr3); + await File.WriteAllTextAsync(fileName, txtFileNew); + //check again + if (!File.Exists(fileName)) + { + ret.Msg = ResUI.FailedReadConfiguration + "2"; + return ret; + } - ClashApiHandler.Instance.ProfileContent = fileContent; + ClashApiHandler.Instance.ProfileContent = fileContent; - ret.Msg = string.Format(ResUI.SuccessfulConfiguration, $"{node.GetSummary()}"); - ret.Success = true; - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } + ret.Msg = string.Format(ResUI.SuccessfulConfiguration, $"{node.GetSummary()}"); + ret.Success = true; + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } - private void MixinContent(Dictionary fileContent, ProfileItem node) - { - //if (!_config.clashUIItem.enableMixinContent) - //{ - // return; - //} + private void MixinContent(Dictionary fileContent, ProfileItem node) + { + //if (!_config.clashUIItem.enableMixinContent) + //{ + // return; + //} - var path = Utils.GetConfigPath(Global.ClashMixinConfigFileName); - if (!File.Exists(path)) - { - return; - } + var path = Utils.GetConfigPath(Global.ClashMixinConfigFileName); + if (!File.Exists(path)) + { + return; + } - var txtFile = File.ReadAllText(Utils.GetConfigPath(Global.ClashMixinConfigFileName)); + var txtFile = File.ReadAllText(Utils.GetConfigPath(Global.ClashMixinConfigFileName)); - var mixinContent = YamlUtils.FromYaml>(txtFile); - if (mixinContent == null) - { - return; - } - foreach (var item in mixinContent) - { - if (!_config.TunModeItem.EnableTun && item.Key == "tun") - { - continue; - } + var mixinContent = YamlUtils.FromYaml>(txtFile); + if (mixinContent == null) + { + return; + } + foreach (var item in mixinContent) + { + if (!_config.TunModeItem.EnableTun && item.Key == "tun") + { + continue; + } - if (item.Key.StartsWith("prepend-") - || item.Key.StartsWith("append-") - || item.Key.StartsWith("removed-")) - { - ModifyContentMerge(fileContent, item.Key, item.Value); - } - else - { - fileContent[item.Key] = item.Value; - } - } - return; - } + if (item.Key.StartsWith("prepend-") + || item.Key.StartsWith("append-") + || item.Key.StartsWith("removed-")) + { + ModifyContentMerge(fileContent, item.Key, item.Value); + } + else + { + fileContent[item.Key] = item.Value; + } + } + return; + } - private void ModifyContentMerge(Dictionary fileContent, string key, object value) - { - bool blPrepend = false; - bool blRemoved = false; - if (key.StartsWith("prepend-")) - { - blPrepend = true; - key = key.Replace("prepend-", ""); - } - else if (key.StartsWith("append-")) - { - blPrepend = false; - key = key.Replace("append-", ""); - } - else if (key.StartsWith("removed-")) - { - blRemoved = true; - key = key.Replace("removed-", ""); - } - else - { - return; - } + private void ModifyContentMerge(Dictionary fileContent, string key, object value) + { + bool blPrepend = false; + bool blRemoved = false; + if (key.StartsWith("prepend-")) + { + blPrepend = true; + key = key.Replace("prepend-", ""); + } + else if (key.StartsWith("append-")) + { + blPrepend = false; + key = key.Replace("append-", ""); + } + else if (key.StartsWith("removed-")) + { + blRemoved = true; + key = key.Replace("removed-", ""); + } + else + { + return; + } - if (!blRemoved && !fileContent.ContainsKey(key)) - { - fileContent.Add(key, value); - return; - } - var lstOri = (List)fileContent[key]; - var lstValue = (List)value; + if (!blRemoved && !fileContent.ContainsKey(key)) + { + fileContent.Add(key, value); + return; + } + var lstOri = (List)fileContent[key]; + var lstValue = (List)value; - if (blRemoved) - { - foreach (var item in lstValue) - { - lstOri.RemoveAll(t => t.ToString().StartsWith(item.ToString())); - } - return; - } + if (blRemoved) + { + foreach (var item in lstValue) + { + lstOri.RemoveAll(t => t.ToString().StartsWith(item.ToString())); + } + return; + } - if (blPrepend) - { - lstValue.Reverse(); - foreach (var item in lstValue) - { - lstOri.Insert(0, item); - } - } - else - { - foreach (var item in lstValue) - { - lstOri.Add(item); - } - } - } + if (blPrepend) + { + lstValue.Reverse(); + foreach (var item in lstValue) + { + lstOri.Insert(0, item); + } + } + else + { + foreach (var item in lstValue) + { + lstOri.Add(item); + } + } + } - private string GetLogLevel(string level) - { - if (level == "none") - { - return "silent"; - } - else - { - return level; - } - } - } -} \ No newline at end of file + private string GetLogLevel(string level) + { + if (level == "none") + { + return "silent"; + } + else + { + return level; + } + } + } +} diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs index ec1ee789..50deaee3 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigSingboxService.cs @@ -4,1378 +4,1384 @@ using System.Net.NetworkInformation; namespace ServiceLib.Services.CoreConfig { - public class CoreConfigSingboxService - { - private Config _config; - private static readonly string _tag = "CoreConfigSingboxService"; - - public CoreConfigSingboxService(Config config) - { - _config = config; - } - - #region public gen function - - public async Task GenerateClientConfigContent(ProfileItem node) - { - var ret = new RetResult(); - try - { - if (node == null - || node.Port <= 0) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - if (node.GetNetwork() is nameof(ETransport.kcp) or nameof(ETransport.xhttp)) - { - ret.Msg = ResUI.Incorrectconfiguration + $" - {node.GetNetwork()}"; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - string result = Utils.GetEmbedText(Global.SingboxSampleClient); - if (Utils.IsNullOrEmpty(result)) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var singboxConfig = JsonUtils.Deserialize(result); - if (singboxConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - await GenLog(singboxConfig); - - await GenInbounds(singboxConfig); - - await GenOutbound(node, singboxConfig.outbounds.First()); - - await GenMoreOutbounds(node, singboxConfig); - - await GenRouting(singboxConfig); - - await GenDns(node, singboxConfig); - - await GenExperimental(singboxConfig); - - await ConvertGeo2Ruleset(singboxConfig); - - ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); - ret.Success = true; - ret.Data = JsonUtils.Serialize(singboxConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - public async Task GenerateClientSpeedtestConfig(List selecteds) - { - var ret = new RetResult(); - try - { - if (_config == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - var result = Utils.GetEmbedText(Global.SingboxSampleClient); - var txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); - if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var singboxConfig = JsonUtils.Deserialize(result); - if (singboxConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - List lstIpEndPoints = new(); - List lstTcpConns = new(); - try - { - lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); - lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()); - lstTcpConns.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - await GenLog(singboxConfig); - //GenDns(new(), singboxConfig); - singboxConfig.inbounds.Clear(); - singboxConfig.outbounds.RemoveAt(0); - - var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest); - - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item is null || Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - - //find unused port - var port = initPort; - for (int k = initPort; k < Global.MaxPort; k++) - { - if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0) - { - continue; - } - if (lstTcpConns?.FindIndex(_it => _it.LocalEndPoint.Port == k) >= 0) - { - continue; - } - //found - port = k; - initPort = port + 1; - break; - } - - //Port In Used - if (lstIpEndPoints?.FindIndex(_it => _it.Port == port) >= 0) - { - continue; - } - it.Port = port; - it.AllowTest = true; - - //inbound - Inbound4Sbox inbound = new() - { - listen = Global.Loopback, - listen_port = port, - type = EInboundProtocol.mixed.ToString(), - }; - inbound.tag = inbound.type + inbound.listen_port.ToString(); - singboxConfig.inbounds.Add(inbound); - - //outbound - if (item is null) - { - continue; - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS - && !Global.Flows.Contains(item.Flow)) - { - continue; - } - if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan - && item.StreamSecurity == Global.StreamSecurityReality - && item.PublicKey.IsNullOrEmpty()) - { - continue; - } - - var outbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(item, outbound); - outbound.tag = Global.ProxyTag + inbound.listen_port.ToString(); - singboxConfig.outbounds.Add(outbound); - - //rule - Rule4Sbox rule = new() - { - inbound = new List { inbound.tag }, - outbound = outbound.tag - }; - singboxConfig.route.rules.Add(rule); - } - - await GenDnsDomains(null, singboxConfig, null); - //var dnsServer = singboxConfig.dns?.servers.FirstOrDefault(); - //if (dnsServer != null) - //{ - // dnsServer.detour = singboxConfig.route.rules.LastOrDefault()?.outbound; - //} - //var dnsRule = singboxConfig.dns?.rules.Where(t => t.outbound != null).FirstOrDefault(); - //if (dnsRule != null) - //{ - // singboxConfig.dns.rules = []; - // singboxConfig.dns.rules.Add(dnsRule); - //} - - //ret.Msg =string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); - ret.Success = true; - ret.Data = JsonUtils.Serialize(singboxConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - public async Task GenerateClientMultipleLoadConfig(List selecteds) - { - var ret = new RetResult(); - try - { - if (_config == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - string result = Utils.GetEmbedText(Global.SingboxSampleClient); - string txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); - if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var singboxConfig = JsonUtils.Deserialize(result); - if (singboxConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - await GenLog(singboxConfig); - await GenInbounds(singboxConfig); - await GenRouting(singboxConfig); - await GenExperimental(singboxConfig); - singboxConfig.outbounds.RemoveAt(0); - - var tagProxy = new List(); - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - var outbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(item, outbound); - outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}"; - singboxConfig.outbounds.Insert(0, outbound); - tagProxy.Add(outbound.tag); - } - if (tagProxy.Count <= 0) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - await GenDns(null, singboxConfig); - await ConvertGeo2Ruleset(singboxConfig); - - //add urltest outbound - var outUrltest = new Outbound4Sbox - { - type = "urltest", - tag = $"{Global.ProxyTag}-auto", - outbounds = tagProxy, - interrupt_exist_connections = false, - }; - singboxConfig.outbounds.Insert(0, outUrltest); - - //add selector outbound - var outSelector = new Outbound4Sbox - { - type = "selector", - tag = Global.ProxyTag, - outbounds = JsonUtils.DeepCopy(tagProxy), - interrupt_exist_connections = false, - }; - outSelector.outbounds.Insert(0, outUrltest.tag); - singboxConfig.outbounds.Insert(0, outSelector); - - ret.Success = true; - ret.Data = JsonUtils.Serialize(singboxConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - public async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) - { - var ret = new RetResult(); - if (node == null || fileName is null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - try - { - if (node == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - if (File.Exists(fileName)) - { - File.Delete(fileName); - } - - string addressFileName = node.Address; - if (Utils.IsNullOrEmpty(addressFileName)) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - if (!File.Exists(addressFileName)) - { - addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); - } - if (!File.Exists(addressFileName)) - { - ret.Msg = ResUI.FailedReadConfiguration + "1"; - return ret; - } - - if (node.Address == Global.CoreMultipleLoadConfigFileName) - { - var txtFile = File.ReadAllText(addressFileName); - var singboxConfig = JsonUtils.Deserialize(txtFile); - if (singboxConfig == null) - { - File.Copy(addressFileName, fileName); - } - else - { - await GenInbounds(singboxConfig); - await GenExperimental(singboxConfig); - - var content = JsonUtils.Serialize(singboxConfig, true); - await File.WriteAllTextAsync(fileName, content); - } - } - else - { - File.Copy(addressFileName, fileName); - } - - //check again - if (!File.Exists(fileName)) - { - ret.Msg = ResUI.FailedReadConfiguration + "2"; - return ret; - } - - ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); - ret.Success = true; - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - #endregion public gen function - - #region private gen function - - private async Task GenLog(SingboxConfig singboxConfig) - { - try - { - switch (_config.CoreBasicItem.Loglevel) - { - case "debug": - case "info": - case "error": - singboxConfig.log.level = _config.CoreBasicItem.Loglevel; - break; - - case "warning": - singboxConfig.log.level = "warn"; - break; - - default: - break; - } - if (_config.CoreBasicItem.Loglevel == Global.None) - { - singboxConfig.log.disabled = true; - } - if (_config.CoreBasicItem.LogEnabled) - { - var dtNow = DateTime.Now; - singboxConfig.log.output = Utils.GetLogPath($"sbox_{dtNow:yyyy-MM-dd}.txt"); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenInbounds(SingboxConfig singboxConfig) - { - try - { - var listen = "::"; - singboxConfig.inbounds = []; - - if (!_config.TunModeItem.EnableTun - || (_config.TunModeItem.EnableTun && _config.TunModeItem.EnableExInbound && _config.RunningCoreType == ECoreType.sing_box)) - { - var inbound = new Inbound4Sbox() - { - type = EInboundProtocol.mixed.ToString(), - tag = EInboundProtocol.socks.ToString(), - listen = Global.Loopback, - }; - singboxConfig.inbounds.Add(inbound); - - inbound.listen_port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); - inbound.sniff = _config.Inbound.First().SniffingEnabled; - inbound.sniff_override_destination = _config.Inbound.First().RouteOnly ? false : _config.Inbound.First().SniffingEnabled; - inbound.domain_strategy = Utils.IsNullOrEmpty(_config.RoutingBasicItem.DomainStrategy4Singbox) ? null : _config.RoutingBasicItem.DomainStrategy4Singbox; - - var routing = await ConfigHandler.GetDefaultRouting(_config); - if (Utils.IsNotEmpty(routing.DomainStrategy4Singbox)) - { - inbound.domain_strategy = routing.DomainStrategy4Singbox; - } - - if (_config.Inbound.First().SecondLocalPortEnabled) - { - var inbound2 = GetInbound(inbound, EInboundProtocol.socks2, true); - singboxConfig.inbounds.Add(inbound2); - } - - if (_config.Inbound.First().AllowLANConn) - { - if (_config.Inbound.First().NewPort4LAN) - { - var inbound3 = GetInbound(inbound, EInboundProtocol.socks3, true); - inbound3.listen = listen; - singboxConfig.inbounds.Add(inbound3); - - //auth - if (Utils.IsNotEmpty(_config.Inbound.First().User) && Utils.IsNotEmpty(_config.Inbound.First().Pass)) - { - inbound3.users = new() { new() { username = _config.Inbound.First().User, password = _config.Inbound.First().Pass } }; - } - } - else - { - inbound.listen = listen; - } - } - } - - if (_config.TunModeItem.EnableTun) - { - if (_config.TunModeItem.Mtu <= 0) - { - _config.TunModeItem.Mtu = Utils.ToInt(Global.TunMtus.First()); - } - if (Utils.IsNullOrEmpty(_config.TunModeItem.Stack)) - { - _config.TunModeItem.Stack = Global.TunStacks.First(); - } - - var tunInbound = JsonUtils.Deserialize(Utils.GetEmbedText(Global.TunSingboxInboundFileName)) ?? new Inbound4Sbox { }; - tunInbound.interface_name = Utils.IsOSX() ? $"utun{new Random().Next(99)}" : "singbox_tun"; - tunInbound.mtu = _config.TunModeItem.Mtu; - tunInbound.strict_route = _config.TunModeItem.StrictRoute; - tunInbound.stack = _config.TunModeItem.Stack; - tunInbound.sniff = _config.Inbound.First().SniffingEnabled; - //tunInbound.sniff_override_destination = _config.inbound.First().routeOnly ? false : _config.inbound.First().sniffingEnabled; - if (_config.TunModeItem.EnableIPv6Address == false) - { - tunInbound.address = ["172.18.0.1/30"]; - } - - singboxConfig.inbounds.Add(tunInbound); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private Inbound4Sbox GetInbound(Inbound4Sbox inItem, EInboundProtocol protocol, bool bSocks) - { - var inbound = JsonUtils.DeepCopy(inItem); - inbound.tag = protocol.ToString(); - inbound.listen_port = inItem.listen_port + (int)protocol; - inbound.type = EInboundProtocol.mixed.ToString(); - return inbound; - } - - private async Task GenOutbound(ProfileItem node, Outbound4Sbox outbound) - { - try - { - outbound.server = node.Address; - outbound.server_port = node.Port; - outbound.type = Global.ProtocolTypes[node.ConfigType]; - - switch (node.ConfigType) - { - case EConfigType.VMess: - { - outbound.uuid = node.Id; - outbound.alter_id = node.AlterId; - if (Global.VmessSecurities.Contains(node.Security)) - { - outbound.security = node.Security; - } - else - { - outbound.security = Global.DefaultSecurity; - } - - await GenOutboundMux(node, outbound); - break; - } - case EConfigType.Shadowsocks: - { - outbound.method = AppHandler.Instance.GetShadowsocksSecurities(node).Contains(node.Security) ? node.Security : Global.None; - outbound.password = node.Id; - - await GenOutboundMux(node, outbound); - break; - } - case EConfigType.SOCKS: - { - outbound.version = "5"; - if (Utils.IsNotEmpty(node.Security) - && Utils.IsNotEmpty(node.Id)) - { - outbound.username = node.Security; - outbound.password = node.Id; - } - break; - } - case EConfigType.HTTP: - { - if (Utils.IsNotEmpty(node.Security) - && Utils.IsNotEmpty(node.Id)) - { - outbound.username = node.Security; - outbound.password = node.Id; - } - break; - } - case EConfigType.VLESS: - { - outbound.uuid = node.Id; - - outbound.packet_encoding = "xudp"; - - if (Utils.IsNullOrEmpty(node.Flow)) - { - await GenOutboundMux(node, outbound); - } - else - { - outbound.flow = node.Flow; - } - break; - } - case EConfigType.Trojan: - { - outbound.password = node.Id; - - await GenOutboundMux(node, outbound); - break; - } - case EConfigType.Hysteria2: - { - outbound.password = node.Id; - - if (Utils.IsNotEmpty(node.Path)) - { - outbound.obfs = new() - { - type = "salamander", - password = node.Path.TrimEx(), - }; - } - - outbound.up_mbps = _config.HysteriaItem.UpMbps > 0 ? _config.HysteriaItem.UpMbps : null; - outbound.down_mbps = _config.HysteriaItem.DownMbps > 0 ? _config.HysteriaItem.DownMbps : null; - break; - } - case EConfigType.TUIC: - { - outbound.uuid = node.Id; - outbound.password = node.Security; - outbound.congestion_control = node.HeaderType; - break; - } - case EConfigType.WireGuard: - { - outbound.private_key = node.Id; - outbound.peer_public_key = node.PublicKey; - outbound.reserved = Utils.String2List(node.Path)?.Select(int.Parse).ToList(); - outbound.local_address = Utils.String2List(node.RequestHost); - outbound.mtu = Utils.ToInt(node.ShortId.IsNullOrEmpty() ? Global.TunMtus.FirstOrDefault() : node.ShortId); - break; - } - } - - await GenOutboundTls(node, outbound); - - await GenOutboundTransport(node, outbound); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenOutboundMux(ProfileItem node, Outbound4Sbox outbound) - { - try - { - if (_config.CoreBasicItem.MuxEnabled && Utils.IsNotEmpty(_config.Mux4SboxItem.Protocol)) - { - var mux = new Multiplex4Sbox() - { - enabled = true, - protocol = _config.Mux4SboxItem.Protocol, - max_connections = _config.Mux4SboxItem.MaxConnections, - padding = _config.Mux4SboxItem.Padding, - }; - outbound.multiplex = mux; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenOutboundTls(ProfileItem node, Outbound4Sbox outbound) - { - try - { - if (node.StreamSecurity == Global.StreamSecurityReality || node.StreamSecurity == Global.StreamSecurity) - { - var server_name = string.Empty; - if (Utils.IsNotEmpty(node.Sni)) - { - server_name = node.Sni; - } - else if (Utils.IsNotEmpty(node.RequestHost)) - { - server_name = Utils.String2List(node.RequestHost)?.First(); - } - var tls = new Tls4Sbox() - { - enabled = true, - server_name = server_name, - insecure = Utils.ToBool(node.AllowInsecure.IsNullOrEmpty() ? _config.CoreBasicItem.DefAllowInsecure.ToString().ToLower() : node.AllowInsecure), - alpn = node.GetAlpn(), - }; - if (Utils.IsNotEmpty(node.Fingerprint)) - { - tls.utls = new Utls4Sbox() - { - enabled = true, - fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint - }; - } - if (node.StreamSecurity == Global.StreamSecurityReality) - { - tls.reality = new Reality4Sbox() - { - enabled = true, - public_key = node.PublicKey, - short_id = node.ShortId - }; - tls.insecure = false; - } - outbound.tls = tls; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenOutboundTransport(ProfileItem node, Outbound4Sbox outbound) - { - try - { - var transport = new Transport4Sbox(); - - switch (node.GetNetwork()) - { - case nameof(ETransport.h2): - transport.type = nameof(ETransport.http); - transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : Utils.String2List(node.RequestHost); - transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; - break; - - case nameof(ETransport.tcp): //http - if (node.HeaderType == Global.TcpHeaderHttp) - { - if (node.ConfigType == EConfigType.Shadowsocks) - { - outbound.plugin = "obfs-local"; - outbound.plugin_opts = $"obfs=http;obfs-host={node.RequestHost};"; - } - else - { - transport.type = nameof(ETransport.http); - transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : Utils.String2List(node.RequestHost); - transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; - } - } - break; - - case nameof(ETransport.ws): - transport.type = nameof(ETransport.ws); - transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; - if (Utils.IsNotEmpty(node.RequestHost)) - { - transport.headers = new() - { - Host = node.RequestHost - }; - } - break; - - case nameof(ETransport.httpupgrade): - transport.type = nameof(ETransport.httpupgrade); - transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; - transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : node.RequestHost; - - break; - - case nameof(ETransport.quic): - transport.type = nameof(ETransport.quic); - break; - - case nameof(ETransport.grpc): - transport.type = nameof(ETransport.grpc); - transport.service_name = node.Path; - transport.idle_timeout = _config.GrpcItem.IdleTimeout?.ToString("##s"); - transport.ping_timeout = _config.GrpcItem.HealthCheckTimeout?.ToString("##s"); - transport.permit_without_stream = _config.GrpcItem.PermitWithoutStream; - break; - - default: - break; - } - if (transport.type != null) - { - outbound.transport = transport; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenMoreOutbounds(ProfileItem node, SingboxConfig singboxConfig) - { - if (node.Subid.IsNullOrEmpty()) - { - return 0; - } - try - { - var subItem = await AppHandler.Instance.GetSubItem(node.Subid); - if (subItem is null) - { - return 0; - } - - //current proxy - var outbound = singboxConfig.outbounds.First(); - var txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); - - //Previous proxy - var prevNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.PrevProfile); - if (prevNode is not null - && prevNode.ConfigType != EConfigType.Custom) - { - var prevOutbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(prevNode, prevOutbound); - prevOutbound.tag = $"{Global.ProxyTag}2"; - singboxConfig.outbounds.Add(prevOutbound); - - outbound.detour = prevOutbound.tag; - } - - //Next proxy - var nextNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.NextProfile); - if (nextNode is not null - && nextNode.ConfigType != EConfigType.Custom) - { - var nextOutbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(nextNode, nextOutbound); - nextOutbound.tag = Global.ProxyTag; - singboxConfig.outbounds.Insert(0, nextOutbound); - - outbound.tag = $"{Global.ProxyTag}1"; - nextOutbound.detour = outbound.tag; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return 0; - } - - private async Task GenRouting(SingboxConfig singboxConfig) - { - try - { - var dnsOutbound = "dns_out"; - if (!_config.Inbound.First().SniffingEnabled) - { - singboxConfig.route.rules.Add(new() - { - port = [53], - network = ["udp"], - outbound = dnsOutbound - }); - } - - singboxConfig.route.rules.Insert(0, new() - { - outbound = Global.DirectTag, - clash_mode = ERuleMode.Direct.ToString() - }); - singboxConfig.route.rules.Insert(0, new() - { - outbound = Global.ProxyTag, - clash_mode = ERuleMode.Global.ToString() - }); - - if (_config.TunModeItem.EnableTun) - { - singboxConfig.route.auto_detect_interface = true; - - var tunRules = JsonUtils.Deserialize>(Utils.GetEmbedText(Global.TunSingboxRulesFileName)); - if (tunRules != null) - { - singboxConfig.route.rules.AddRange(tunRules); - } - - GenRoutingDirectExe(out List lstDnsExe, out List lstDirectExe); - singboxConfig.route.rules.Add(new() - { - port = new() { 53 }, - outbound = dnsOutbound, - process_name = lstDnsExe - }); - - singboxConfig.route.rules.Add(new() - { - outbound = Global.DirectTag, - process_name = lstDirectExe - }); - } - - var routing = await ConfigHandler.GetDefaultRouting(_config); - if (routing != null) - { - var rules = JsonUtils.Deserialize>(routing.RuleSet); - foreach (var item in rules ?? []) - { - if (item.Enabled) - { - await GenRoutingUserRule(item, singboxConfig.route.rules); - } - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private void GenRoutingDirectExe(out List lstDnsExe, out List lstDirectExe) - { - lstDnsExe = new(); - lstDirectExe = new(); - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(); - foreach (var it in coreInfo) - { - if (it.CoreType == ECoreType.v2rayN) - { - continue; - } - foreach (var it2 in it.CoreExes) - { - if (!lstDnsExe.Contains(it2) && it.CoreType != ECoreType.sing_box) - { - lstDnsExe.Add($"{it2}.exe"); - } - - if (!lstDirectExe.Contains(it2)) - { - lstDirectExe.Add($"{it2}.exe"); - } - } - } - } - - private async Task GenRoutingUserRule(RulesItem item, List rules) - { - try - { - if (item == null) - { - return 0; - } - - var rule = new Rule4Sbox() - { - outbound = item.OutboundTag, - }; - - if (Utils.IsNotEmpty(item.Port)) - { - if (item.Port.Contains("-")) - { - rule.port_range = new List { item.Port.Replace("-", ":") }; - } - else - { - rule.port = new List { Utils.ToInt(item.Port) }; - } - } - if (Utils.IsNotEmpty(item.Network)) - { - rule.network = Utils.String2List(item.Network); - } - if (item.Protocol?.Count > 0) - { - rule.protocol = item.Protocol; - } - if (item.InboundTag?.Count >= 0) - { - rule.inbound = item.InboundTag; - } - var rule1 = JsonUtils.DeepCopy(rule); - var rule2 = JsonUtils.DeepCopy(rule); - var rule3 = JsonUtils.DeepCopy(rule); - - var hasDomainIp = false; - if (item.Domain?.Count > 0) - { - var countDomain = 0; - foreach (var it in item.Domain) - { - if (ParseV2Domain(it, rule1)) countDomain++; - } - if (countDomain > 0) - { - rules.Add(rule1); - hasDomainIp = true; - } - } - - if (item.Ip?.Count > 0) - { - var countIp = 0; - foreach (var it in item.Ip) - { - if (ParseV2Address(it, rule2)) countIp++; - } - if (countIp > 0) - { - rules.Add(rule2); - hasDomainIp = true; - } - } - - if (_config.TunModeItem.EnableTun && item.Process?.Count > 0) - { - rule3.process_name = item.Process; - rules.Add(rule3); - hasDomainIp = true; - } - - if (!hasDomainIp - && (rule.port != null || rule.port_range != null || rule.protocol != null || rule.inbound != null)) - { - rules.Add(rule); - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private bool ParseV2Domain(string domain, Rule4Sbox rule) - { - if (domain.StartsWith("#") || domain.StartsWith("ext:") || domain.StartsWith("ext-domain:")) - { - return false; - } - else if (domain.StartsWith("geosite:")) - { - rule.geosite ??= []; - rule.geosite?.Add(domain.Substring(8)); - } - else if (domain.StartsWith("regexp:")) - { - rule.domain_regex ??= []; - rule.domain_regex?.Add(domain.Replace(Global.RoutingRuleComma, ",").Substring(7)); - } - else if (domain.StartsWith("domain:")) - { - rule.domain ??= []; - rule.domain_suffix ??= []; - rule.domain?.Add(domain.Substring(7)); - rule.domain_suffix?.Add("." + domain.Substring(7)); - } - else if (domain.StartsWith("full:")) - { - rule.domain ??= []; - rule.domain?.Add(domain.Substring(5)); - } - else if (domain.StartsWith("keyword:")) - { - rule.domain_keyword ??= []; - rule.domain_keyword?.Add(domain.Substring(8)); - } - else - { - rule.domain_keyword ??= []; - rule.domain_keyword?.Add(domain); - } - return true; - } - - private bool ParseV2Address(string address, Rule4Sbox rule) - { - if (address.StartsWith("ext:") || address.StartsWith("ext-ip:")) - { - return false; - } - else if (address.StartsWith("geoip:!")) - { - return false; - } - else if (address.Equals("geoip:private")) - { - rule.ip_is_private = true; - } - else if (address.StartsWith("geoip:")) - { - if (rule.geoip is null) { rule.geoip = new(); } - rule.geoip?.Add(address.Substring(6)); - } - else - { - if (rule.ip_cidr is null) { rule.ip_cidr = new(); } - rule.ip_cidr?.Add(address); - } - return true; - } - - private async Task GenDns(ProfileItem? node, SingboxConfig singboxConfig) - { - try - { - var item = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); - var strDNS = string.Empty; - if (_config.TunModeItem.EnableTun) - { - strDNS = Utils.IsNullOrEmpty(item?.TunDNS) ? Utils.GetEmbedText(Global.TunSingboxDNSFileName) : item?.TunDNS; - } - else - { - strDNS = Utils.IsNullOrEmpty(item?.NormalDNS) ? Utils.GetEmbedText(Global.DNSSingboxNormalFileName) : item?.NormalDNS; - } - - var dns4Sbox = JsonUtils.Deserialize(strDNS); - if (dns4Sbox is null) - { - return 0; - } - singboxConfig.dns = dns4Sbox; - - await GenDnsDomains(node, singboxConfig, item); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenDnsDomains(ProfileItem? node, SingboxConfig singboxConfig, DNSItem? dNSItem) - { - var dns4Sbox = singboxConfig.dns ?? new(); - dns4Sbox.servers ??= []; - dns4Sbox.rules ??= []; - - var tag = "local_local"; - dns4Sbox.servers.Add(new() - { - tag = tag, - address = Utils.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.SingboxDomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, - detour = Global.DirectTag, - strategy = Utils.IsNullOrEmpty(dNSItem?.DomainStrategy4Freedom) ? null : dNSItem?.DomainStrategy4Freedom, - }); - dns4Sbox.rules.Insert(0, new() - { - server = tag, - clash_mode = ERuleMode.Direct.ToString() - }); - dns4Sbox.rules.Insert(0, new() - { - server = dns4Sbox.servers.Where(t => t.detour == Global.ProxyTag).Select(t => t.tag).FirstOrDefault() ?? "remote", - clash_mode = ERuleMode.Global.ToString() - }); - - var lstDomain = singboxConfig.outbounds - .Where(t => Utils.IsNotEmpty(t.server) && Utils.IsDomain(t.server)) - .Select(t => t.server) - .Distinct() - .ToList(); - if (lstDomain != null && lstDomain.Count > 0) - { - dns4Sbox.rules.Insert(0, new() - { - server = tag, - domain = lstDomain - }); - } - - //Tun2SocksAddress - if (_config.TunModeItem.EnableTun && node?.ConfigType == EConfigType.SOCKS && Utils.IsDomain(node?.Sni)) - { - dns4Sbox.rules.Insert(0, new() - { - server = tag, - domain = [node?.Sni] - }); - } - - singboxConfig.dns = dns4Sbox; - return await Task.FromResult(0); - } - - private async Task GenExperimental(SingboxConfig singboxConfig) - { - //if (_config.guiItem.enableStatistics) - { - singboxConfig.experimental ??= new Experimental4Sbox(); - singboxConfig.experimental.clash_api = new Clash_Api4Sbox() - { - external_controller = $"{Global.Loopback}:{AppHandler.Instance.StatePort2}", - }; - } - - if (_config.CoreBasicItem.EnableCacheFile4Sbox) - { - singboxConfig.experimental ??= new Experimental4Sbox(); - singboxConfig.experimental.cache_file = new CacheFile4Sbox() - { - enabled = true, - path = Utils.GetConfigPath("cache.db") - }; - } - - return await Task.FromResult(0); - } - - private async Task ConvertGeo2Ruleset(SingboxConfig singboxConfig) - { - static void AddRuleSets(List ruleSets, List? rule_set) - { - if (rule_set != null) ruleSets.AddRange(rule_set); - } - var geosite = "geosite"; - var geoip = "geoip"; - var ruleSets = new List(); - - //convert route geosite & geoip to ruleset - foreach (var rule in singboxConfig.route.rules.Where(t => t.geosite?.Count > 0).ToList() ?? []) - { - rule.rule_set = rule?.geosite?.Select(t => $"{geosite}-{t}").ToList(); - rule.geosite = null; - AddRuleSets(ruleSets, rule.rule_set); - } - foreach (var rule in singboxConfig.route.rules.Where(t => t.geoip?.Count > 0).ToList() ?? []) - { - rule.rule_set = rule?.geoip?.Select(t => $"{geoip}-{t}").ToList(); - rule.geoip = null; - AddRuleSets(ruleSets, rule.rule_set); - } - - //convert dns geosite & geoip to ruleset - foreach (var rule in singboxConfig.dns?.rules.Where(t => t.geosite?.Count > 0).ToList() ?? []) - { - rule.rule_set = rule?.geosite?.Select(t => $"{geosite}-{t}").ToList(); - rule.geosite = null; - } - foreach (var rule in singboxConfig.dns?.rules.Where(t => t.geoip?.Count > 0).ToList() ?? []) - { - rule.rule_set = rule?.geoip?.Select(t => $"{geoip}-{t}").ToList(); - rule.geoip = null; - } - foreach (var dnsRule in singboxConfig.dns?.rules.Where(t => t.rule_set?.Count > 0).ToList() ?? []) - { - AddRuleSets(ruleSets, dnsRule.rule_set); - } - //rules in rules - foreach (var item in singboxConfig.dns?.rules.Where(t => t.rules?.Count > 0).Select(t => t.rules).ToList() ?? []) - { - foreach (var item2 in item ?? []) - { - AddRuleSets(ruleSets, item2.rule_set); - } - } - - //load custom ruleset file - List customRulesets = []; - - var routing = await ConfigHandler.GetDefaultRouting(_config); - if (Utils.IsNotEmpty(routing.CustomRulesetPath4Singbox)) - { - var result = Utils.LoadResource(routing.CustomRulesetPath4Singbox); - if (Utils.IsNotEmpty(result)) - { - customRulesets = (JsonUtils.Deserialize>(result) ?? []) - .Where(t => t.tag != null) - .Where(t => t.type != null) - .Where(t => t.format != null) - .ToList(); - } - } - - //Local srs files address - var localSrss = Utils.GetBinPath("srss"); - - //Add ruleset srs - singboxConfig.route.rule_set = []; - foreach (var item in new HashSet(ruleSets)) - { - if (Utils.IsNullOrEmpty(item)) { continue; } - var customRuleset = customRulesets.FirstOrDefault(t => t.tag != null && t.tag.Equals(item)); - if (customRuleset is null) - { - var pathSrs = Path.Combine(localSrss, $"{item}.srs"); - if (File.Exists(pathSrs)) - { - customRuleset = new() - { - type = "local", - format = "binary", - tag = item, - path = pathSrs - }; - } - else - { - var srsUrl = string.IsNullOrEmpty(_config.ConstItem.SrsSourceUrl) - ? Global.SingboxRulesetUrl - : _config.ConstItem.SrsSourceUrl; - - customRuleset = new() - { - type = "remote", - format = "binary", - tag = item, - url = string.Format(srsUrl, item.StartsWith(geosite) ? geosite : geoip, item), - download_detour = Global.ProxyTag - }; - } - } - singboxConfig.route.rule_set.Add(customRuleset); - } - - return 0; - } - - #endregion private gen function - } -} \ No newline at end of file + public class CoreConfigSingboxService + { + private Config _config; + private static readonly string _tag = "CoreConfigSingboxService"; + + public CoreConfigSingboxService(Config config) + { + _config = config; + } + + #region public gen function + + public async Task GenerateClientConfigContent(ProfileItem node) + { + var ret = new RetResult(); + try + { + if (node == null + || node.Port <= 0) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + if (node.GetNetwork() is nameof(ETransport.kcp) or nameof(ETransport.xhttp)) + { + ret.Msg = ResUI.Incorrectconfiguration + $" - {node.GetNetwork()}"; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + string result = Utils.GetEmbedText(Global.SingboxSampleClient); + if (Utils.IsNullOrEmpty(result)) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var singboxConfig = JsonUtils.Deserialize(result); + if (singboxConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + await GenLog(singboxConfig); + + await GenInbounds(singboxConfig); + + await GenOutbound(node, singboxConfig.outbounds.First()); + + await GenMoreOutbounds(node, singboxConfig); + + await GenRouting(singboxConfig); + + await GenDns(node, singboxConfig); + + await GenExperimental(singboxConfig); + + await ConvertGeo2Ruleset(singboxConfig); + + ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); + ret.Success = true; + ret.Data = JsonUtils.Serialize(singboxConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + public async Task GenerateClientSpeedtestConfig(List selecteds) + { + var ret = new RetResult(); + try + { + if (_config == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + var result = Utils.GetEmbedText(Global.SingboxSampleClient); + var txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); + if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var singboxConfig = JsonUtils.Deserialize(result); + if (singboxConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + List lstIpEndPoints = new(); + List lstTcpConns = new(); + try + { + lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()); + lstTcpConns.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + await GenLog(singboxConfig); + //GenDns(new(), singboxConfig); + singboxConfig.inbounds.Clear(); + singboxConfig.outbounds.RemoveAt(0); + + var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest); + + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.Port <= 0) + { + continue; + } + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + { + if (item is null || Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) + { + continue; + } + } + + //find unused port + var port = initPort; + for (int k = initPort; k < Global.MaxPort; k++) + { + if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0) + { + continue; + } + if (lstTcpConns?.FindIndex(_it => _it.LocalEndPoint.Port == k) >= 0) + { + continue; + } + //found + port = k; + initPort = port + 1; + break; + } + + //Port In Used + if (lstIpEndPoints?.FindIndex(_it => _it.Port == port) >= 0) + { + continue; + } + it.Port = port; + it.AllowTest = true; + + //inbound + Inbound4Sbox inbound = new() + { + listen = Global.Loopback, + listen_port = port, + type = EInboundProtocol.mixed.ToString(), + }; + inbound.tag = inbound.type + inbound.listen_port.ToString(); + singboxConfig.inbounds.Add(inbound); + + //outbound + if (item is null) + { + continue; + } + if (item.ConfigType == EConfigType.Shadowsocks + && !Global.SsSecuritiesInSingbox.Contains(item.Security)) + { + continue; + } + if (item.ConfigType == EConfigType.VLESS + && !Global.Flows.Contains(item.Flow)) + { + continue; + } + if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan + && item.StreamSecurity == Global.StreamSecurityReality + && item.PublicKey.IsNullOrEmpty()) + { + continue; + } + + var outbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(item, outbound); + outbound.tag = Global.ProxyTag + inbound.listen_port.ToString(); + singboxConfig.outbounds.Add(outbound); + + //rule + Rule4Sbox rule = new() + { + inbound = new List { inbound.tag }, + outbound = outbound.tag + }; + singboxConfig.route.rules.Add(rule); + } + + await GenDnsDomains(null, singboxConfig, null); + //var dnsServer = singboxConfig.dns?.servers.FirstOrDefault(); + //if (dnsServer != null) + //{ + // dnsServer.detour = singboxConfig.route.rules.LastOrDefault()?.outbound; + //} + //var dnsRule = singboxConfig.dns?.rules.Where(t => t.outbound != null).FirstOrDefault(); + //if (dnsRule != null) + //{ + // singboxConfig.dns.rules = []; + // singboxConfig.dns.rules.Add(dnsRule); + //} + + //ret.Msg =string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); + ret.Success = true; + ret.Data = JsonUtils.Serialize(singboxConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + public async Task GenerateClientMultipleLoadConfig(List selecteds) + { + var ret = new RetResult(); + try + { + if (_config == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + string result = Utils.GetEmbedText(Global.SingboxSampleClient); + string txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); + if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var singboxConfig = JsonUtils.Deserialize(result); + if (singboxConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + await GenLog(singboxConfig); + await GenInbounds(singboxConfig); + await GenRouting(singboxConfig); + await GenExperimental(singboxConfig); + singboxConfig.outbounds.RemoveAt(0); + + var tagProxy = new List(); + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.Port <= 0) + { + continue; + } + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (item is null) + { + continue; + } + if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + { + if (Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) + { + continue; + } + } + if (item.ConfigType == EConfigType.Shadowsocks + && !Global.SsSecuritiesInSingbox.Contains(item.Security)) + { + continue; + } + if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) + { + continue; + } + + //outbound + var outbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(item, outbound); + outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}"; + singboxConfig.outbounds.Insert(0, outbound); + tagProxy.Add(outbound.tag); + } + if (tagProxy.Count <= 0) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + await GenDns(null, singboxConfig); + await ConvertGeo2Ruleset(singboxConfig); + + //add urltest outbound + var outUrltest = new Outbound4Sbox + { + type = "urltest", + tag = $"{Global.ProxyTag}-auto", + outbounds = tagProxy, + interrupt_exist_connections = false, + }; + singboxConfig.outbounds.Insert(0, outUrltest); + + //add selector outbound + var outSelector = new Outbound4Sbox + { + type = "selector", + tag = Global.ProxyTag, + outbounds = JsonUtils.DeepCopy(tagProxy), + interrupt_exist_connections = false, + }; + outSelector.outbounds.Insert(0, outUrltest.tag); + singboxConfig.outbounds.Insert(0, outSelector); + + ret.Success = true; + ret.Data = JsonUtils.Serialize(singboxConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + public async Task GenerateClientCustomConfig(ProfileItem node, string? fileName) + { + var ret = new RetResult(); + if (node == null || fileName is null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + try + { + if (node == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + + string addressFileName = node.Address; + if (Utils.IsNullOrEmpty(addressFileName)) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + if (!File.Exists(addressFileName)) + { + addressFileName = Path.Combine(Utils.GetConfigPath(), addressFileName); + } + if (!File.Exists(addressFileName)) + { + ret.Msg = ResUI.FailedReadConfiguration + "1"; + return ret; + } + + if (node.Address == Global.CoreMultipleLoadConfigFileName) + { + var txtFile = File.ReadAllText(addressFileName); + var singboxConfig = JsonUtils.Deserialize(txtFile); + if (singboxConfig == null) + { + File.Copy(addressFileName, fileName); + } + else + { + await GenInbounds(singboxConfig); + await GenExperimental(singboxConfig); + + var content = JsonUtils.Serialize(singboxConfig, true); + await File.WriteAllTextAsync(fileName, content); + } + } + else + { + File.Copy(addressFileName, fileName); + } + + //check again + if (!File.Exists(fileName)) + { + ret.Msg = ResUI.FailedReadConfiguration + "2"; + return ret; + } + + ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); + ret.Success = true; + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + #endregion public gen function + + #region private gen function + + private async Task GenLog(SingboxConfig singboxConfig) + { + try + { + switch (_config.CoreBasicItem.Loglevel) + { + case "debug": + case "info": + case "error": + singboxConfig.log.level = _config.CoreBasicItem.Loglevel; + break; + + case "warning": + singboxConfig.log.level = "warn"; + break; + + default: + break; + } + if (_config.CoreBasicItem.Loglevel == Global.None) + { + singboxConfig.log.disabled = true; + } + if (_config.CoreBasicItem.LogEnabled) + { + var dtNow = DateTime.Now; + singboxConfig.log.output = Utils.GetLogPath($"sbox_{dtNow:yyyy-MM-dd}.txt"); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenInbounds(SingboxConfig singboxConfig) + { + try + { + var listen = "::"; + singboxConfig.inbounds = []; + + if (!_config.TunModeItem.EnableTun + || (_config.TunModeItem.EnableTun && _config.TunModeItem.EnableExInbound && _config.RunningCoreType == ECoreType.sing_box)) + { + var inbound = new Inbound4Sbox() + { + type = EInboundProtocol.mixed.ToString(), + tag = EInboundProtocol.socks.ToString(), + listen = Global.Loopback, + }; + singboxConfig.inbounds.Add(inbound); + + inbound.listen_port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); + inbound.sniff = _config.Inbound.First().SniffingEnabled; + inbound.sniff_override_destination = _config.Inbound.First().RouteOnly ? false : _config.Inbound.First().SniffingEnabled; + inbound.domain_strategy = Utils.IsNullOrEmpty(_config.RoutingBasicItem.DomainStrategy4Singbox) ? null : _config.RoutingBasicItem.DomainStrategy4Singbox; + + var routing = await ConfigHandler.GetDefaultRouting(_config); + if (Utils.IsNotEmpty(routing.DomainStrategy4Singbox)) + { + inbound.domain_strategy = routing.DomainStrategy4Singbox; + } + + if (_config.Inbound.First().SecondLocalPortEnabled) + { + var inbound2 = GetInbound(inbound, EInboundProtocol.socks2, true); + singboxConfig.inbounds.Add(inbound2); + } + + if (_config.Inbound.First().AllowLANConn) + { + if (_config.Inbound.First().NewPort4LAN) + { + var inbound3 = GetInbound(inbound, EInboundProtocol.socks3, true); + inbound3.listen = listen; + singboxConfig.inbounds.Add(inbound3); + + //auth + if (Utils.IsNotEmpty(_config.Inbound.First().User) && Utils.IsNotEmpty(_config.Inbound.First().Pass)) + { + inbound3.users = new() { new() { username = _config.Inbound.First().User, password = _config.Inbound.First().Pass } }; + } + } + else + { + inbound.listen = listen; + } + } + } + + if (_config.TunModeItem.EnableTun) + { + if (_config.TunModeItem.Mtu <= 0) + { + _config.TunModeItem.Mtu = Utils.ToInt(Global.TunMtus.First()); + } + if (Utils.IsNullOrEmpty(_config.TunModeItem.Stack)) + { + _config.TunModeItem.Stack = Global.TunStacks.First(); + } + + var tunInbound = JsonUtils.Deserialize(Utils.GetEmbedText(Global.TunSingboxInboundFileName)) ?? new Inbound4Sbox { }; + tunInbound.interface_name = Utils.IsOSX() ? $"utun{new Random().Next(99)}" : "singbox_tun"; + tunInbound.mtu = _config.TunModeItem.Mtu; + tunInbound.strict_route = _config.TunModeItem.StrictRoute; + tunInbound.stack = _config.TunModeItem.Stack; + tunInbound.sniff = _config.Inbound.First().SniffingEnabled; + //tunInbound.sniff_override_destination = _config.inbound.First().routeOnly ? false : _config.inbound.First().sniffingEnabled; + if (_config.TunModeItem.EnableIPv6Address == false) + { + tunInbound.address = ["172.18.0.1/30"]; + } + + singboxConfig.inbounds.Add(tunInbound); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private Inbound4Sbox GetInbound(Inbound4Sbox inItem, EInboundProtocol protocol, bool bSocks) + { + var inbound = JsonUtils.DeepCopy(inItem); + inbound.tag = protocol.ToString(); + inbound.listen_port = inItem.listen_port + (int)protocol; + inbound.type = EInboundProtocol.mixed.ToString(); + return inbound; + } + + private async Task GenOutbound(ProfileItem node, Outbound4Sbox outbound) + { + try + { + outbound.server = node.Address; + outbound.server_port = node.Port; + outbound.type = Global.ProtocolTypes[node.ConfigType]; + + switch (node.ConfigType) + { + case EConfigType.VMess: + { + outbound.uuid = node.Id; + outbound.alter_id = node.AlterId; + if (Global.VmessSecurities.Contains(node.Security)) + { + outbound.security = node.Security; + } + else + { + outbound.security = Global.DefaultSecurity; + } + + await GenOutboundMux(node, outbound); + break; + } + case EConfigType.Shadowsocks: + { + outbound.method = AppHandler.Instance.GetShadowsocksSecurities(node).Contains(node.Security) ? node.Security : Global.None; + outbound.password = node.Id; + + await GenOutboundMux(node, outbound); + break; + } + case EConfigType.SOCKS: + { + outbound.version = "5"; + if (Utils.IsNotEmpty(node.Security) + && Utils.IsNotEmpty(node.Id)) + { + outbound.username = node.Security; + outbound.password = node.Id; + } + break; + } + case EConfigType.HTTP: + { + if (Utils.IsNotEmpty(node.Security) + && Utils.IsNotEmpty(node.Id)) + { + outbound.username = node.Security; + outbound.password = node.Id; + } + break; + } + case EConfigType.VLESS: + { + outbound.uuid = node.Id; + + outbound.packet_encoding = "xudp"; + + if (Utils.IsNullOrEmpty(node.Flow)) + { + await GenOutboundMux(node, outbound); + } + else + { + outbound.flow = node.Flow; + } + break; + } + case EConfigType.Trojan: + { + outbound.password = node.Id; + + await GenOutboundMux(node, outbound); + break; + } + case EConfigType.Hysteria2: + { + outbound.password = node.Id; + + if (Utils.IsNotEmpty(node.Path)) + { + outbound.obfs = new() + { + type = "salamander", + password = node.Path.TrimEx(), + }; + } + + outbound.up_mbps = _config.HysteriaItem.UpMbps > 0 ? _config.HysteriaItem.UpMbps : null; + outbound.down_mbps = _config.HysteriaItem.DownMbps > 0 ? _config.HysteriaItem.DownMbps : null; + break; + } + case EConfigType.TUIC: + { + outbound.uuid = node.Id; + outbound.password = node.Security; + outbound.congestion_control = node.HeaderType; + break; + } + case EConfigType.WireGuard: + { + outbound.private_key = node.Id; + outbound.peer_public_key = node.PublicKey; + outbound.reserved = Utils.String2List(node.Path)?.Select(int.Parse).ToList(); + outbound.local_address = Utils.String2List(node.RequestHost); + outbound.mtu = Utils.ToInt(node.ShortId.IsNullOrEmpty() ? Global.TunMtus.FirstOrDefault() : node.ShortId); + break; + } + } + + await GenOutboundTls(node, outbound); + + await GenOutboundTransport(node, outbound); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenOutboundMux(ProfileItem node, Outbound4Sbox outbound) + { + try + { + if (_config.CoreBasicItem.MuxEnabled && Utils.IsNotEmpty(_config.Mux4SboxItem.Protocol)) + { + var mux = new Multiplex4Sbox() + { + enabled = true, + protocol = _config.Mux4SboxItem.Protocol, + max_connections = _config.Mux4SboxItem.MaxConnections, + padding = _config.Mux4SboxItem.Padding, + }; + outbound.multiplex = mux; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenOutboundTls(ProfileItem node, Outbound4Sbox outbound) + { + try + { + if (node.StreamSecurity == Global.StreamSecurityReality || node.StreamSecurity == Global.StreamSecurity) + { + var server_name = string.Empty; + if (Utils.IsNotEmpty(node.Sni)) + { + server_name = node.Sni; + } + else if (Utils.IsNotEmpty(node.RequestHost)) + { + server_name = Utils.String2List(node.RequestHost)?.First(); + } + var tls = new Tls4Sbox() + { + enabled = true, + server_name = server_name, + insecure = Utils.ToBool(node.AllowInsecure.IsNullOrEmpty() ? _config.CoreBasicItem.DefAllowInsecure.ToString().ToLower() : node.AllowInsecure), + alpn = node.GetAlpn(), + }; + if (Utils.IsNotEmpty(node.Fingerprint)) + { + tls.utls = new Utls4Sbox() + { + enabled = true, + fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint + }; + } + if (node.StreamSecurity == Global.StreamSecurityReality) + { + tls.reality = new Reality4Sbox() + { + enabled = true, + public_key = node.PublicKey, + short_id = node.ShortId + }; + tls.insecure = false; + } + outbound.tls = tls; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenOutboundTransport(ProfileItem node, Outbound4Sbox outbound) + { + try + { + var transport = new Transport4Sbox(); + + switch (node.GetNetwork()) + { + case nameof(ETransport.h2): + transport.type = nameof(ETransport.http); + transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : Utils.String2List(node.RequestHost); + transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; + break; + + case nameof(ETransport.tcp): //http + if (node.HeaderType == Global.TcpHeaderHttp) + { + if (node.ConfigType == EConfigType.Shadowsocks) + { + outbound.plugin = "obfs-local"; + outbound.plugin_opts = $"obfs=http;obfs-host={node.RequestHost};"; + } + else + { + transport.type = nameof(ETransport.http); + transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : Utils.String2List(node.RequestHost); + transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; + } + } + break; + + case nameof(ETransport.ws): + transport.type = nameof(ETransport.ws); + transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; + if (Utils.IsNotEmpty(node.RequestHost)) + { + transport.headers = new() + { + Host = node.RequestHost + }; + } + break; + + case nameof(ETransport.httpupgrade): + transport.type = nameof(ETransport.httpupgrade); + transport.path = Utils.IsNullOrEmpty(node.Path) ? null : node.Path; + transport.host = Utils.IsNullOrEmpty(node.RequestHost) ? null : node.RequestHost; + + break; + + case nameof(ETransport.quic): + transport.type = nameof(ETransport.quic); + break; + + case nameof(ETransport.grpc): + transport.type = nameof(ETransport.grpc); + transport.service_name = node.Path; + transport.idle_timeout = _config.GrpcItem.IdleTimeout?.ToString("##s"); + transport.ping_timeout = _config.GrpcItem.HealthCheckTimeout?.ToString("##s"); + transport.permit_without_stream = _config.GrpcItem.PermitWithoutStream; + break; + + default: + break; + } + if (transport.type != null) + { + outbound.transport = transport; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenMoreOutbounds(ProfileItem node, SingboxConfig singboxConfig) + { + if (node.Subid.IsNullOrEmpty()) + { + return 0; + } + try + { + var subItem = await AppHandler.Instance.GetSubItem(node.Subid); + if (subItem is null) + { + return 0; + } + + //current proxy + var outbound = singboxConfig.outbounds.First(); + var txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); + + //Previous proxy + var prevNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.PrevProfile); + if (prevNode is not null + && prevNode.ConfigType != EConfigType.Custom) + { + var prevOutbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(prevNode, prevOutbound); + prevOutbound.tag = $"{Global.ProxyTag}2"; + singboxConfig.outbounds.Add(prevOutbound); + + outbound.detour = prevOutbound.tag; + } + + //Next proxy + var nextNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.NextProfile); + if (nextNode is not null + && nextNode.ConfigType != EConfigType.Custom) + { + var nextOutbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(nextNode, nextOutbound); + nextOutbound.tag = Global.ProxyTag; + singboxConfig.outbounds.Insert(0, nextOutbound); + + outbound.tag = $"{Global.ProxyTag}1"; + nextOutbound.detour = outbound.tag; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return 0; + } + + private async Task GenRouting(SingboxConfig singboxConfig) + { + try + { + var dnsOutbound = "dns_out"; + if (!_config.Inbound.First().SniffingEnabled) + { + singboxConfig.route.rules.Add(new() + { + port = [53], + network = ["udp"], + outbound = dnsOutbound + }); + } + + singboxConfig.route.rules.Insert(0, new() + { + outbound = Global.DirectTag, + clash_mode = ERuleMode.Direct.ToString() + }); + singboxConfig.route.rules.Insert(0, new() + { + outbound = Global.ProxyTag, + clash_mode = ERuleMode.Global.ToString() + }); + + if (_config.TunModeItem.EnableTun) + { + singboxConfig.route.auto_detect_interface = true; + + var tunRules = JsonUtils.Deserialize>(Utils.GetEmbedText(Global.TunSingboxRulesFileName)); + if (tunRules != null) + { + singboxConfig.route.rules.AddRange(tunRules); + } + + GenRoutingDirectExe(out List lstDnsExe, out List lstDirectExe); + singboxConfig.route.rules.Add(new() + { + port = new() { 53 }, + outbound = dnsOutbound, + process_name = lstDnsExe + }); + + singboxConfig.route.rules.Add(new() + { + outbound = Global.DirectTag, + process_name = lstDirectExe + }); + } + + var routing = await ConfigHandler.GetDefaultRouting(_config); + if (routing != null) + { + var rules = JsonUtils.Deserialize>(routing.RuleSet); + foreach (var item in rules ?? []) + { + if (item.Enabled) + { + await GenRoutingUserRule(item, singboxConfig.route.rules); + } + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private void GenRoutingDirectExe(out List lstDnsExe, out List lstDirectExe) + { + lstDnsExe = new(); + lstDirectExe = new(); + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(); + foreach (var it in coreInfo) + { + if (it.CoreType == ECoreType.v2rayN) + { + continue; + } + foreach (var it2 in it.CoreExes) + { + if (!lstDnsExe.Contains(it2) && it.CoreType != ECoreType.sing_box) + { + lstDnsExe.Add($"{it2}.exe"); + } + + if (!lstDirectExe.Contains(it2)) + { + lstDirectExe.Add($"{it2}.exe"); + } + } + } + } + + private async Task GenRoutingUserRule(RulesItem item, List rules) + { + try + { + if (item == null) + { + return 0; + } + + var rule = new Rule4Sbox() + { + outbound = item.OutboundTag, + }; + + if (Utils.IsNotEmpty(item.Port)) + { + if (item.Port.Contains("-")) + { + rule.port_range = new List { item.Port.Replace("-", ":") }; + } + else + { + rule.port = new List { Utils.ToInt(item.Port) }; + } + } + if (Utils.IsNotEmpty(item.Network)) + { + rule.network = Utils.String2List(item.Network); + } + if (item.Protocol?.Count > 0) + { + rule.protocol = item.Protocol; + } + if (item.InboundTag?.Count >= 0) + { + rule.inbound = item.InboundTag; + } + var rule1 = JsonUtils.DeepCopy(rule); + var rule2 = JsonUtils.DeepCopy(rule); + var rule3 = JsonUtils.DeepCopy(rule); + + var hasDomainIp = false; + if (item.Domain?.Count > 0) + { + var countDomain = 0; + foreach (var it in item.Domain) + { + if (ParseV2Domain(it, rule1)) + countDomain++; + } + if (countDomain > 0) + { + rules.Add(rule1); + hasDomainIp = true; + } + } + + if (item.Ip?.Count > 0) + { + var countIp = 0; + foreach (var it in item.Ip) + { + if (ParseV2Address(it, rule2)) + countIp++; + } + if (countIp > 0) + { + rules.Add(rule2); + hasDomainIp = true; + } + } + + if (_config.TunModeItem.EnableTun && item.Process?.Count > 0) + { + rule3.process_name = item.Process; + rules.Add(rule3); + hasDomainIp = true; + } + + if (!hasDomainIp + && (rule.port != null || rule.port_range != null || rule.protocol != null || rule.inbound != null)) + { + rules.Add(rule); + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private bool ParseV2Domain(string domain, Rule4Sbox rule) + { + if (domain.StartsWith("#") || domain.StartsWith("ext:") || domain.StartsWith("ext-domain:")) + { + return false; + } + else if (domain.StartsWith("geosite:")) + { + rule.geosite ??= []; + rule.geosite?.Add(domain.Substring(8)); + } + else if (domain.StartsWith("regexp:")) + { + rule.domain_regex ??= []; + rule.domain_regex?.Add(domain.Replace(Global.RoutingRuleComma, ",").Substring(7)); + } + else if (domain.StartsWith("domain:")) + { + rule.domain ??= []; + rule.domain_suffix ??= []; + rule.domain?.Add(domain.Substring(7)); + rule.domain_suffix?.Add("." + domain.Substring(7)); + } + else if (domain.StartsWith("full:")) + { + rule.domain ??= []; + rule.domain?.Add(domain.Substring(5)); + } + else if (domain.StartsWith("keyword:")) + { + rule.domain_keyword ??= []; + rule.domain_keyword?.Add(domain.Substring(8)); + } + else + { + rule.domain_keyword ??= []; + rule.domain_keyword?.Add(domain); + } + return true; + } + + private bool ParseV2Address(string address, Rule4Sbox rule) + { + if (address.StartsWith("ext:") || address.StartsWith("ext-ip:")) + { + return false; + } + else if (address.StartsWith("geoip:!")) + { + return false; + } + else if (address.Equals("geoip:private")) + { + rule.ip_is_private = true; + } + else if (address.StartsWith("geoip:")) + { + if (rule.geoip is null) + { rule.geoip = new(); } + rule.geoip?.Add(address.Substring(6)); + } + else + { + if (rule.ip_cidr is null) + { rule.ip_cidr = new(); } + rule.ip_cidr?.Add(address); + } + return true; + } + + private async Task GenDns(ProfileItem? node, SingboxConfig singboxConfig) + { + try + { + var item = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); + var strDNS = string.Empty; + if (_config.TunModeItem.EnableTun) + { + strDNS = Utils.IsNullOrEmpty(item?.TunDNS) ? Utils.GetEmbedText(Global.TunSingboxDNSFileName) : item?.TunDNS; + } + else + { + strDNS = Utils.IsNullOrEmpty(item?.NormalDNS) ? Utils.GetEmbedText(Global.DNSSingboxNormalFileName) : item?.NormalDNS; + } + + var dns4Sbox = JsonUtils.Deserialize(strDNS); + if (dns4Sbox is null) + { + return 0; + } + singboxConfig.dns = dns4Sbox; + + await GenDnsDomains(node, singboxConfig, item); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenDnsDomains(ProfileItem? node, SingboxConfig singboxConfig, DNSItem? dNSItem) + { + var dns4Sbox = singboxConfig.dns ?? new(); + dns4Sbox.servers ??= []; + dns4Sbox.rules ??= []; + + var tag = "local_local"; + dns4Sbox.servers.Add(new() + { + tag = tag, + address = Utils.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.SingboxDomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, + detour = Global.DirectTag, + strategy = Utils.IsNullOrEmpty(dNSItem?.DomainStrategy4Freedom) ? null : dNSItem?.DomainStrategy4Freedom, + }); + dns4Sbox.rules.Insert(0, new() + { + server = tag, + clash_mode = ERuleMode.Direct.ToString() + }); + dns4Sbox.rules.Insert(0, new() + { + server = dns4Sbox.servers.Where(t => t.detour == Global.ProxyTag).Select(t => t.tag).FirstOrDefault() ?? "remote", + clash_mode = ERuleMode.Global.ToString() + }); + + var lstDomain = singboxConfig.outbounds + .Where(t => Utils.IsNotEmpty(t.server) && Utils.IsDomain(t.server)) + .Select(t => t.server) + .Distinct() + .ToList(); + if (lstDomain != null && lstDomain.Count > 0) + { + dns4Sbox.rules.Insert(0, new() + { + server = tag, + domain = lstDomain + }); + } + + //Tun2SocksAddress + if (_config.TunModeItem.EnableTun && node?.ConfigType == EConfigType.SOCKS && Utils.IsDomain(node?.Sni)) + { + dns4Sbox.rules.Insert(0, new() + { + server = tag, + domain = [node?.Sni] + }); + } + + singboxConfig.dns = dns4Sbox; + return await Task.FromResult(0); + } + + private async Task GenExperimental(SingboxConfig singboxConfig) + { + //if (_config.guiItem.enableStatistics) + { + singboxConfig.experimental ??= new Experimental4Sbox(); + singboxConfig.experimental.clash_api = new Clash_Api4Sbox() + { + external_controller = $"{Global.Loopback}:{AppHandler.Instance.StatePort2}", + }; + } + + if (_config.CoreBasicItem.EnableCacheFile4Sbox) + { + singboxConfig.experimental ??= new Experimental4Sbox(); + singboxConfig.experimental.cache_file = new CacheFile4Sbox() + { + enabled = true, + path = Utils.GetConfigPath("cache.db") + }; + } + + return await Task.FromResult(0); + } + + private async Task ConvertGeo2Ruleset(SingboxConfig singboxConfig) + { + static void AddRuleSets(List ruleSets, List? rule_set) + { + if (rule_set != null) + ruleSets.AddRange(rule_set); + } + var geosite = "geosite"; + var geoip = "geoip"; + var ruleSets = new List(); + + //convert route geosite & geoip to ruleset + foreach (var rule in singboxConfig.route.rules.Where(t => t.geosite?.Count > 0).ToList() ?? []) + { + rule.rule_set = rule?.geosite?.Select(t => $"{geosite}-{t}").ToList(); + rule.geosite = null; + AddRuleSets(ruleSets, rule.rule_set); + } + foreach (var rule in singboxConfig.route.rules.Where(t => t.geoip?.Count > 0).ToList() ?? []) + { + rule.rule_set = rule?.geoip?.Select(t => $"{geoip}-{t}").ToList(); + rule.geoip = null; + AddRuleSets(ruleSets, rule.rule_set); + } + + //convert dns geosite & geoip to ruleset + foreach (var rule in singboxConfig.dns?.rules.Where(t => t.geosite?.Count > 0).ToList() ?? []) + { + rule.rule_set = rule?.geosite?.Select(t => $"{geosite}-{t}").ToList(); + rule.geosite = null; + } + foreach (var rule in singboxConfig.dns?.rules.Where(t => t.geoip?.Count > 0).ToList() ?? []) + { + rule.rule_set = rule?.geoip?.Select(t => $"{geoip}-{t}").ToList(); + rule.geoip = null; + } + foreach (var dnsRule in singboxConfig.dns?.rules.Where(t => t.rule_set?.Count > 0).ToList() ?? []) + { + AddRuleSets(ruleSets, dnsRule.rule_set); + } + //rules in rules + foreach (var item in singboxConfig.dns?.rules.Where(t => t.rules?.Count > 0).Select(t => t.rules).ToList() ?? []) + { + foreach (var item2 in item ?? []) + { + AddRuleSets(ruleSets, item2.rule_set); + } + } + + //load custom ruleset file + List customRulesets = []; + + var routing = await ConfigHandler.GetDefaultRouting(_config); + if (Utils.IsNotEmpty(routing.CustomRulesetPath4Singbox)) + { + var result = Utils.LoadResource(routing.CustomRulesetPath4Singbox); + if (Utils.IsNotEmpty(result)) + { + customRulesets = (JsonUtils.Deserialize>(result) ?? []) + .Where(t => t.tag != null) + .Where(t => t.type != null) + .Where(t => t.format != null) + .ToList(); + } + } + + //Local srs files address + var localSrss = Utils.GetBinPath("srss"); + + //Add ruleset srs + singboxConfig.route.rule_set = []; + foreach (var item in new HashSet(ruleSets)) + { + if (Utils.IsNullOrEmpty(item)) + { continue; } + var customRuleset = customRulesets.FirstOrDefault(t => t.tag != null && t.tag.Equals(item)); + if (customRuleset is null) + { + var pathSrs = Path.Combine(localSrss, $"{item}.srs"); + if (File.Exists(pathSrs)) + { + customRuleset = new() + { + type = "local", + format = "binary", + tag = item, + path = pathSrs + }; + } + else + { + var srsUrl = string.IsNullOrEmpty(_config.ConstItem.SrsSourceUrl) + ? Global.SingboxRulesetUrl + : _config.ConstItem.SrsSourceUrl; + + customRuleset = new() + { + type = "remote", + format = "binary", + tag = item, + url = string.Format(srsUrl, item.StartsWith(geosite) ? geosite : geoip, item), + download_detour = Global.ProxyTag + }; + } + } + singboxConfig.route.rule_set.Add(customRuleset); + } + + return 0; + } + + #endregion private gen function + } +} diff --git a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs index 998002cf..1d7a57d6 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigV2rayService.cs @@ -1,1250 +1,1250 @@ -using System.Net; +using System.Net; using System.Net.NetworkInformation; using System.Text.Json.Nodes; namespace ServiceLib.Services.CoreConfig { - public class CoreConfigV2rayService - { - private Config _config; - private static readonly string _tag = "CoreConfigV2rayService"; - - public CoreConfigV2rayService(Config config) - { - _config = config; - } - - #region public gen function - - public async Task GenerateClientConfigContent(ProfileItem node) - { - var ret = new RetResult(); - try - { - if (node == null - || node.Port <= 0) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - if (node.GetNetwork() is nameof(ETransport.quic)) - { - ret.Msg = ResUI.Incorrectconfiguration + $" - {node.GetNetwork()}"; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - var result = Utils.GetEmbedText(Global.V2raySampleClient); - if (Utils.IsNullOrEmpty(result)) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var v2rayConfig = JsonUtils.Deserialize(result); - if (v2rayConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - await GenLog(v2rayConfig); - - await GenInbounds(v2rayConfig); - - await GenRouting(v2rayConfig); - - await GenOutbound(node, v2rayConfig.outbounds.First()); - - await GenMoreOutbounds(node, v2rayConfig); - - await GenDns(node, v2rayConfig); - - await GenStatistic(v2rayConfig); - - ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); - ret.Success = true; - ret.Data = JsonUtils.Serialize(v2rayConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - public async Task GenerateClientMultipleLoadConfig(List selecteds) - { - var ret = new RetResult(); - - try - { - if (_config == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - string result = Utils.GetEmbedText(Global.V2raySampleClient); - string txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); - if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var v2rayConfig = JsonUtils.Deserialize(result); - if (v2rayConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - await GenLog(v2rayConfig); - await GenInbounds(v2rayConfig); - await GenRouting(v2rayConfig); - await GenDns(null, v2rayConfig); - await GenStatistic(v2rayConfig); - v2rayConfig.outbounds.RemoveAt(0); - - var tagProxy = new List(); - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (item is null) - { - continue; - } - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInSingbox.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) - { - continue; - } - - //outbound - var outbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(item, outbound); - outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}"; - v2rayConfig.outbounds.Insert(0, outbound); - tagProxy.Add(outbound.tag); - } - if (tagProxy.Count <= 0) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - - //add balancers - var balancer = new BalancersItem4Ray - { - selector = [Global.ProxyTag], - strategy = new() { type = "roundRobin" }, - tag = $"{Global.ProxyTag}-round", - }; - v2rayConfig.routing.balancers = [balancer]; - - //add rule - var rules = v2rayConfig.routing.rules.Where(t => t.outboundTag == Global.ProxyTag).ToList(); - if (rules?.Count > 0) - { - foreach (var rule in rules) - { - rule.outboundTag = null; - rule.balancerTag = balancer.tag; - } - } - v2rayConfig.routing.rules.Add(new() - { - network = "tcp,udp", - balancerTag = balancer.tag, - type = "field" - }); - - ret.Success = true; - ret.Data = JsonUtils.Serialize(v2rayConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - public async Task GenerateClientSpeedtestConfig(List selecteds) - { - var ret = new RetResult(); - try - { - if (_config == null) - { - ret.Msg = ResUI.CheckServerSettings; - return ret; - } - - ret.Msg = ResUI.InitialConfiguration; - - var result = Utils.GetEmbedText(Global.V2raySampleClient); - var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); - if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) - { - ret.Msg = ResUI.FailedGetDefaultConfiguration; - return ret; - } - - var v2rayConfig = JsonUtils.Deserialize(result); - if (v2rayConfig == null) - { - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - List lstIpEndPoints = new(); - List lstTcpConns = new(); - try - { - lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); - lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()); - lstTcpConns.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - await GenLog(v2rayConfig); - v2rayConfig.inbounds.Clear(); - v2rayConfig.outbounds.Clear(); - v2rayConfig.routing.rules.Clear(); - - var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest); - - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) - { - if (item is null || Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) - { - continue; - } - } - - //find unused port - var port = initPort; - for (var k = initPort; k < Global.MaxPort; k++) - { - if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0) - { - continue; - } - if (lstTcpConns?.FindIndex(_it => _it.LocalEndPoint.Port == k) >= 0) - { - continue; - } - //found - port = k; - initPort = port + 1; - break; - } - - //Port In Used - if (lstIpEndPoints?.FindIndex(_it => _it.Port == port) >= 0) - { - continue; - } - it.Port = port; - it.AllowTest = true; - - //outbound - if (item is null) - { - continue; - } - if (item.ConfigType == EConfigType.Shadowsocks - && !Global.SsSecuritiesInXray.Contains(item.Security)) - { - continue; - } - if (item.ConfigType == EConfigType.VLESS - && !Global.Flows.Contains(item.Flow)) - { - continue; - } - if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan - && item.StreamSecurity == Global.StreamSecurityReality - && item.PublicKey.IsNullOrEmpty()) - { - continue; - } - - //inbound - Inbounds4Ray inbound = new() - { - listen = Global.Loopback, - port = port, - protocol = EInboundProtocol.socks.ToString(), - }; - inbound.tag = inbound.protocol + inbound.port.ToString(); - v2rayConfig.inbounds.Add(inbound); - - var outbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(item, outbound); - outbound.tag = Global.ProxyTag + inbound.port.ToString(); - v2rayConfig.outbounds.Add(outbound); - - //rule - RulesItem4Ray rule = new() - { - inboundTag = new List { inbound.tag }, - outboundTag = outbound.tag, - type = "field" - }; - v2rayConfig.routing.rules.Add(rule); - } - - //ret.Msg =string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); - ret.Success = true; - ret.Data = JsonUtils.Serialize(v2rayConfig); - return ret; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - ret.Msg = ResUI.FailedGenDefaultConfiguration; - return ret; - } - } - - #endregion public gen function - - #region private gen function - - private async Task GenLog(V2rayConfig v2rayConfig) - { - try - { - if (_config.CoreBasicItem.LogEnabled) - { - var dtNow = DateTime.Now; - v2rayConfig.log.loglevel = _config.CoreBasicItem.Loglevel; - v2rayConfig.log.access = Utils.GetLogPath($"Vaccess_{dtNow:yyyy-MM-dd}.txt"); - v2rayConfig.log.error = Utils.GetLogPath($"Verror_{dtNow:yyyy-MM-dd}.txt"); - } - else - { - v2rayConfig.log.loglevel = _config.CoreBasicItem.Loglevel; - v2rayConfig.log.access = null; - v2rayConfig.log.error = null; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenInbounds(V2rayConfig v2rayConfig) - { - try - { - var listen = "0.0.0.0"; - v2rayConfig.inbounds = []; - - var inbound = GetInbound(_config.Inbound.First(), EInboundProtocol.socks, true); - v2rayConfig.inbounds.Add(inbound); - - if (_config.Inbound.First().SecondLocalPortEnabled) - { - var inbound2 = GetInbound(_config.Inbound.First(), EInboundProtocol.socks2, true); - v2rayConfig.inbounds.Add(inbound2); - } - - if (_config.Inbound.First().AllowLANConn) - { - if (_config.Inbound.First().NewPort4LAN) - { - var inbound3 = GetInbound(_config.Inbound.First(), EInboundProtocol.socks3, true); - inbound3.listen = listen; - v2rayConfig.inbounds.Add(inbound3); - - //auth - if (Utils.IsNotEmpty(_config.Inbound.First().User) && Utils.IsNotEmpty(_config.Inbound.First().Pass)) - { - inbound3.settings.auth = "password"; - inbound3.settings.accounts = new List { new AccountsItem4Ray() { user = _config.Inbound.First().User, pass = _config.Inbound.First().Pass } }; - } - } - else - { - inbound.listen = listen; - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private Inbounds4Ray GetInbound(InItem inItem, EInboundProtocol protocol, bool bSocks) - { - string result = Utils.GetEmbedText(Global.V2raySampleInbound); - if (Utils.IsNullOrEmpty(result)) - { - return new(); - } - - var inbound = JsonUtils.Deserialize(result); - if (inbound == null) - { - return new(); - } - inbound.tag = protocol.ToString(); - inbound.port = inItem.LocalPort + (int)protocol; - inbound.protocol = EInboundProtocol.socks.ToString(); - inbound.settings.udp = inItem.UdpEnabled; - inbound.sniffing.enabled = inItem.SniffingEnabled; - inbound.sniffing.destOverride = inItem.DestOverride; - inbound.sniffing.routeOnly = inItem.RouteOnly; - - return inbound; - } - - private async Task GenRouting(V2rayConfig v2rayConfig) - { - try - { - if (v2rayConfig.routing?.rules != null) - { - v2rayConfig.routing.domainStrategy = _config.RoutingBasicItem.DomainStrategy; - v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(_config.RoutingBasicItem.DomainMatcher) ? null : _config.RoutingBasicItem.DomainMatcher; - - var routing = await ConfigHandler.GetDefaultRouting(_config); - if (routing != null) - { - if (Utils.IsNotEmpty(routing.DomainStrategy)) - { - v2rayConfig.routing.domainStrategy = routing.DomainStrategy; - } - var rules = JsonUtils.Deserialize>(routing.RuleSet); - foreach (var item in rules) - { - if (item.Enabled) - { - var item2 = JsonUtils.Deserialize(JsonUtils.Serialize(item)); - await GenRoutingUserRule(item2, v2rayConfig); - } - } - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenRoutingUserRule(RulesItem4Ray? rule, V2rayConfig v2rayConfig) - { - try - { - if (rule == null) - { - return 0; - } - if (Utils.IsNullOrEmpty(rule.port)) - { - rule.port = null; - } - if (Utils.IsNullOrEmpty(rule.network)) - { - rule.network = null; - } - if (rule.domain?.Count == 0) - { - rule.domain = null; - } - if (rule.ip?.Count == 0) - { - rule.ip = null; - } - if (rule.protocol?.Count == 0) - { - rule.protocol = null; - } - if (rule.inboundTag?.Count == 0) - { - rule.inboundTag = null; - } - - var hasDomainIp = false; - if (rule.domain?.Count > 0) - { - var it = JsonUtils.DeepCopy(rule); - it.ip = null; - it.type = "field"; - for (int k = it.domain.Count - 1; k >= 0; k--) - { - if (it.domain[k].StartsWith("#")) - { - it.domain.RemoveAt(k); - } - it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ","); - } - v2rayConfig.routing.rules.Add(it); - hasDomainIp = true; - } - if (rule.ip?.Count > 0) - { - var it = JsonUtils.DeepCopy(rule); - it.domain = null; - it.type = "field"; - v2rayConfig.routing.rules.Add(it); - hasDomainIp = true; - } - if (!hasDomainIp) - { - if (Utils.IsNotEmpty(rule.port) - || rule.protocol?.Count > 0 - || rule.inboundTag?.Count > 0 - ) - { - var it = JsonUtils.DeepCopy(rule); - it.type = "field"; - v2rayConfig.routing.rules.Add(it); - } - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenOutbound(ProfileItem node, Outbounds4Ray outbound) - { - try - { - var muxEnabled = _config.CoreBasicItem.MuxEnabled; - switch (node.ConfigType) - { - case EConfigType.VMess: - { - VnextItem4Ray vnextItem; - if (outbound.settings.vnext.Count <= 0) - { - vnextItem = new VnextItem4Ray(); - outbound.settings.vnext.Add(vnextItem); - } - else - { - vnextItem = outbound.settings.vnext.First(); - } - vnextItem.address = node.Address; - vnextItem.port = node.Port; - - UsersItem4Ray usersItem; - if (vnextItem.users.Count <= 0) - { - usersItem = new UsersItem4Ray(); - vnextItem.users.Add(usersItem); - } - else - { - usersItem = vnextItem.users.First(); - } - //远程服务器用户ID - usersItem.id = node.Id; - usersItem.alterId = node.AlterId; - usersItem.email = Global.UserEMail; - if (Global.VmessSecurities.Contains(node.Security)) - { - usersItem.security = node.Security; - } - else - { - usersItem.security = Global.DefaultSecurity; - } - - await GenOutboundMux(node, outbound, muxEnabled, muxEnabled); - - outbound.settings.servers = null; - break; - } - case EConfigType.Shadowsocks: - { - ServersItem4Ray serversItem; - if (outbound.settings.servers.Count <= 0) - { - serversItem = new ServersItem4Ray(); - outbound.settings.servers.Add(serversItem); - } - else - { - serversItem = outbound.settings.servers.First(); - } - serversItem.address = node.Address; - serversItem.port = node.Port; - serversItem.password = node.Id; - serversItem.method = AppHandler.Instance.GetShadowsocksSecurities(node).Contains(node.Security) ? node.Security : "none"; - - serversItem.ota = false; - serversItem.level = 1; - - await GenOutboundMux(node, outbound); - - outbound.settings.vnext = null; - break; - } - case EConfigType.SOCKS: - case EConfigType.HTTP: - { - ServersItem4Ray serversItem; - if (outbound.settings.servers.Count <= 0) - { - serversItem = new ServersItem4Ray(); - outbound.settings.servers.Add(serversItem); - } - else - { - serversItem = outbound.settings.servers.First(); - } - serversItem.address = node.Address; - serversItem.port = node.Port; - serversItem.method = null; - serversItem.password = null; - - if (Utils.IsNotEmpty(node.Security) - && Utils.IsNotEmpty(node.Id)) - { - SocksUsersItem4Ray socksUsersItem = new() - { - user = node.Security, - pass = node.Id, - level = 1 - }; - - serversItem.users = new List() { socksUsersItem }; - } - - await GenOutboundMux(node, outbound); - - outbound.settings.vnext = null; - break; - } - case EConfigType.VLESS: - { - VnextItem4Ray vnextItem; - if (outbound.settings.vnext?.Count <= 0) - { - vnextItem = new VnextItem4Ray(); - outbound.settings.vnext.Add(vnextItem); - } - else - { - vnextItem = outbound.settings.vnext.First(); - } - vnextItem.address = node.Address; - vnextItem.port = node.Port; - - UsersItem4Ray usersItem; - if (vnextItem.users.Count <= 0) - { - usersItem = new UsersItem4Ray(); - vnextItem.users.Add(usersItem); - } - else - { - usersItem = vnextItem.users.First(); - } - usersItem.id = node.Id; - usersItem.email = Global.UserEMail; - usersItem.encryption = node.Security; - - if (node.Flow.IsNullOrEmpty()) - { - await GenOutboundMux(node, outbound, muxEnabled, muxEnabled); - } - else - { - usersItem.flow = node.Flow; - await GenOutboundMux(node, outbound, false, muxEnabled); - } - outbound.settings.servers = null; - break; - } - case EConfigType.Trojan: - { - ServersItem4Ray serversItem; - if (outbound.settings.servers.Count <= 0) - { - serversItem = new ServersItem4Ray(); - outbound.settings.servers.Add(serversItem); - } - else - { - serversItem = outbound.settings.servers.First(); - } - serversItem.address = node.Address; - serversItem.port = node.Port; - serversItem.password = node.Id; - - serversItem.ota = false; - serversItem.level = 1; - - await GenOutboundMux(node, outbound); - - outbound.settings.vnext = null; - break; - } - } - - outbound.protocol = Global.ProtocolTypes[node.ConfigType]; - await GenBoundStreamSettings(node, outbound); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenOutboundMux(ProfileItem node, Outbounds4Ray outbound, bool enabledTCP = false, bool enabledUDP = false) - { - try - { - outbound.mux.enabled = false; - outbound.mux.concurrency = -1; - - if (enabledTCP) - { - outbound.mux.enabled = true; - outbound.mux.concurrency = _config.Mux4RayItem.Concurrency; - } - else if (enabledUDP) - { - outbound.mux.enabled = true; - outbound.mux.xudpConcurrency = _config.Mux4RayItem.XudpConcurrency; - outbound.mux.xudpProxyUDP443 = _config.Mux4RayItem.XudpProxyUDP443; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return await Task.FromResult(0); - } - - private async Task GenBoundStreamSettings(ProfileItem node, Outbounds4Ray outbound) - { - try - { - var streamSettings = outbound.streamSettings; - streamSettings.network = node.GetNetwork(); - var host = node.RequestHost.TrimEx(); - var path = node.Path.TrimEx(); - var sni = node.Sni.TrimEx(); - var useragent = ""; - if (!_config.CoreBasicItem.DefUserAgent.IsNullOrEmpty()) - { - try - { - useragent = Global.UserAgentTexts[_config.CoreBasicItem.DefUserAgent]; - } - catch (KeyNotFoundException) - { - useragent = _config.CoreBasicItem.DefUserAgent; - } - } - - //if tls - if (node.StreamSecurity == Global.StreamSecurity) - { - streamSettings.security = node.StreamSecurity; - - TlsSettings4Ray tlsSettings = new() - { - allowInsecure = Utils.ToBool(node.AllowInsecure.IsNullOrEmpty() ? _config.CoreBasicItem.DefAllowInsecure.ToString().ToLower() : node.AllowInsecure), - alpn = node.GetAlpn(), - fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint - }; - if (Utils.IsNotEmpty(sni)) - { - tlsSettings.serverName = sni; - } - else if (Utils.IsNotEmpty(host)) - { - tlsSettings.serverName = Utils.String2List(host)?.First(); - } - streamSettings.tlsSettings = tlsSettings; - } - - //if Reality - if (node.StreamSecurity == Global.StreamSecurityReality) - { - streamSettings.security = node.StreamSecurity; - - TlsSettings4Ray realitySettings = new() - { - fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint, - serverName = sni, - publicKey = node.PublicKey, - shortId = node.ShortId, - spiderX = node.SpiderX, - show = false, - }; - - streamSettings.realitySettings = realitySettings; - } - - //streamSettings - switch (node.GetNetwork()) - { - case nameof(ETransport.kcp): - KcpSettings4Ray kcpSettings = new() - { - mtu = _config.KcpItem.Mtu, - tti = _config.KcpItem.Tti - }; - - kcpSettings.uplinkCapacity = _config.KcpItem.UplinkCapacity; - kcpSettings.downlinkCapacity = _config.KcpItem.DownlinkCapacity; - - kcpSettings.congestion = _config.KcpItem.Congestion; - kcpSettings.readBufferSize = _config.KcpItem.ReadBufferSize; - kcpSettings.writeBufferSize = _config.KcpItem.WriteBufferSize; - kcpSettings.header = new Header4Ray - { - type = node.HeaderType - }; - if (Utils.IsNotEmpty(path)) - { - kcpSettings.seed = path; - } - streamSettings.kcpSettings = kcpSettings; - break; - //ws - case nameof(ETransport.ws): - WsSettings4Ray wsSettings = new(); - wsSettings.headers = new Headers4Ray(); - - if (Utils.IsNotEmpty(host)) - { - wsSettings.host = host; - wsSettings.headers.Host = host; - } - if (Utils.IsNotEmpty(path)) - { - wsSettings.path = path; - } - if (Utils.IsNotEmpty(useragent)) - { - wsSettings.headers.UserAgent = useragent; - } - streamSettings.wsSettings = wsSettings; - - break; - //httpupgrade - case nameof(ETransport.httpupgrade): - HttpupgradeSettings4Ray httpupgradeSettings = new(); - - if (Utils.IsNotEmpty(path)) - { - httpupgradeSettings.path = path; - } - if (Utils.IsNotEmpty(host)) - { - httpupgradeSettings.host = host; - } - streamSettings.httpupgradeSettings = httpupgradeSettings; - - break; - //xhttp - case nameof(ETransport.xhttp): - streamSettings.network = ETransport.xhttp.ToString(); - XhttpSettings4Ray xhttpSettings = new(); - - if (Utils.IsNotEmpty(path)) - { - xhttpSettings.path = path; - } - if (Utils.IsNotEmpty(host)) - { - xhttpSettings.host = host; - } - if (Utils.IsNotEmpty(node.HeaderType) && Global.XhttpMode.Contains(node.HeaderType)) - { - xhttpSettings.mode = node.HeaderType; - } - if (Utils.IsNotEmpty(node.Extra)) - { - xhttpSettings.extra = JsonUtils.ParseJson(node.Extra); - } - - streamSettings.xhttpSettings = xhttpSettings; - await GenOutboundMux(node, outbound); - - break; - //h2 - case nameof(ETransport.h2): - HttpSettings4Ray httpSettings = new(); - - if (Utils.IsNotEmpty(host)) - { - httpSettings.host = Utils.String2List(host); - } - httpSettings.path = path; - - streamSettings.httpSettings = httpSettings; - - break; - //quic - case nameof(ETransport.quic): - QuicSettings4Ray quicsettings = new() - { - security = host, - key = path, - header = new Header4Ray - { - type = node.HeaderType - } - }; - streamSettings.quicSettings = quicsettings; - if (node.StreamSecurity == Global.StreamSecurity) - { - if (Utils.IsNotEmpty(sni)) - { - streamSettings.tlsSettings.serverName = sni; - } - else - { - streamSettings.tlsSettings.serverName = node.Address; - } - } - break; - - case nameof(ETransport.grpc): - GrpcSettings4Ray grpcSettings = new() - { - authority = Utils.IsNullOrEmpty(host) ? null : host, - serviceName = path, - multiMode = node.HeaderType == Global.GrpcMultiMode, - idle_timeout = _config.GrpcItem.IdleTimeout, - health_check_timeout = _config.GrpcItem.HealthCheckTimeout, - permit_without_stream = _config.GrpcItem.PermitWithoutStream, - initial_windows_size = _config.GrpcItem.InitialWindowsSize, - }; - streamSettings.grpcSettings = grpcSettings; - break; - - default: - //tcp - if (node.HeaderType == Global.TcpHeaderHttp) - { - TcpSettings4Ray tcpSettings = new() - { - header = new Header4Ray - { - type = node.HeaderType - } - }; - - //request Host - string request = Utils.GetEmbedText(Global.V2raySampleHttpRequestFileName); - string[] arrHost = host.Split(','); - string host2 = string.Join(",".AppendQuotes(), arrHost); - request = request.Replace("$requestHost$", $"{host2.AppendQuotes()}"); - request = request.Replace("$requestUserAgent$", $"{useragent.AppendQuotes()}"); - //Path - string pathHttp = @"/"; - if (Utils.IsNotEmpty(path)) - { - string[] arrPath = path.Split(','); - pathHttp = string.Join(",".AppendQuotes(), arrPath); - } - request = request.Replace("$requestPath$", $"{pathHttp.AppendQuotes()}"); - tcpSettings.header.request = JsonUtils.Deserialize(request); - - streamSettings.tcpSettings = tcpSettings; - } - break; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenDns(ProfileItem? node, V2rayConfig v2rayConfig) - { - try - { - var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); - var normalDNS = item?.NormalDNS; - var domainStrategy4Freedom = item?.DomainStrategy4Freedom; - if (Utils.IsNullOrEmpty(normalDNS)) - { - normalDNS = Utils.GetEmbedText(Global.DNSV2rayNormalFileName); - } - - //Outbound Freedom domainStrategy - if (Utils.IsNotEmpty(domainStrategy4Freedom)) - { - var outbound = v2rayConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag }); - if (outbound != null) - { - outbound.settings = new(); - outbound.settings.domainStrategy = domainStrategy4Freedom; - outbound.settings.userLevel = 0; - } - } - - var obj = JsonUtils.ParseJson(normalDNS); - if (obj is null) - { - List servers = []; - string[] arrDNS = normalDNS.Split(','); - foreach (string str in arrDNS) - { - servers.Add(str); - } - obj = JsonUtils.ParseJson("{}"); - obj["servers"] = JsonUtils.SerializeToNode(servers); - } - - // 追加至 dns 设置 - if (item.UseSystemHosts) - { - var systemHosts = Utils.GetSystemHosts(); - if (systemHosts.Count > 0) - { - var normalHost = obj["hosts"]; - if (normalHost != null) - { - foreach (var host in systemHosts) - { - if (normalHost[host.Key] != null) - continue; - normalHost[host.Key] = host.Value; - } - } - } - } - - await GenDnsDomains(node, obj, item); - - v2rayConfig.dns = obj; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return 0; - } - - private async Task GenDnsDomains(ProfileItem? node, JsonNode dns, DNSItem? dNSItem) - { - if (node == null) - { return 0; } - var servers = dns["servers"]; - if (servers != null) - { - if (Utils.IsDomain(node.Address)) - { - var dnsServer = new DnsServer4Ray() - { - address = Utils.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.DomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, - domains = [node.Address] - }; - servers.AsArray().Add(JsonUtils.SerializeToNode(dnsServer)); - } - } - return await Task.FromResult(0); - } - - private async Task GenStatistic(V2rayConfig v2rayConfig) - { - if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) - { - string tag = EInboundProtocol.api.ToString(); - Metrics4Ray apiObj = new(); - Policy4Ray policyObj = new(); - SystemPolicy4Ray policySystemSetting = new(); - - v2rayConfig.stats = new Stats4Ray(); - - apiObj.tag = tag; - v2rayConfig.metrics = apiObj; - - policySystemSetting.statsOutboundDownlink = true; - policySystemSetting.statsOutboundUplink = true; - policyObj.system = policySystemSetting; - v2rayConfig.policy = policyObj; - - if (!v2rayConfig.inbounds.Exists(item => item.tag == tag)) - { - Inbounds4Ray apiInbound = new(); - Inboundsettings4Ray apiInboundSettings = new(); - apiInbound.tag = tag; - apiInbound.listen = Global.Loopback; - apiInbound.port = AppHandler.Instance.StatePort; - apiInbound.protocol = Global.InboundAPIProtocol; - apiInboundSettings.address = Global.Loopback; - apiInbound.settings = apiInboundSettings; - v2rayConfig.inbounds.Add(apiInbound); - } - - if (!v2rayConfig.routing.rules.Exists(item => item.outboundTag == tag)) - { - RulesItem4Ray apiRoutingRule = new() - { - inboundTag = new List { tag }, - outboundTag = tag, - type = "field" - }; - - v2rayConfig.routing.rules.Add(apiRoutingRule); - } - } - return await Task.FromResult(0); - } - - private async Task GenMoreOutbounds(ProfileItem node, V2rayConfig v2rayConfig) - { - //fragment proxy - if (_config.CoreBasicItem.EnableFragment - && Utils.IsNotEmpty(v2rayConfig.outbounds.First().streamSettings?.security)) - { - var fragmentOutbound = new Outbounds4Ray - { - protocol = "freedom", - tag = $"{Global.ProxyTag}3", - settings = new() - { - fragment = new() - { - packets = _config.Fragment4RayItem?.Packets, - length = _config.Fragment4RayItem?.Length, - interval = _config.Fragment4RayItem?.Interval - } - } - }; - - v2rayConfig.outbounds.Add(fragmentOutbound); - v2rayConfig.outbounds.First().streamSettings.sockopt = new() - { - dialerProxy = fragmentOutbound.tag - }; - return 0; - } - - if (node.Subid.IsNullOrEmpty()) - { - return 0; - } - try - { - var subItem = await AppHandler.Instance.GetSubItem(node.Subid); - if (subItem is null) - { - return 0; - } - - //current proxy - var outbound = v2rayConfig.outbounds.First(); - var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); - - //Previous proxy - var prevNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.PrevProfile); - if (prevNode is not null - && prevNode.ConfigType != EConfigType.Custom - && prevNode.ConfigType != EConfigType.Hysteria2 - && prevNode.ConfigType != EConfigType.TUIC - && prevNode.ConfigType != EConfigType.WireGuard) - { - var prevOutbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(prevNode, prevOutbound); - prevOutbound.tag = $"{Global.ProxyTag}2"; - v2rayConfig.outbounds.Add(prevOutbound); - - outbound.streamSettings.sockopt = new() - { - dialerProxy = prevOutbound.tag - }; - } - - //Next proxy - var nextNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.NextProfile); - if (nextNode is not null - && nextNode.ConfigType != EConfigType.Custom - && nextNode.ConfigType != EConfigType.Hysteria2 - && nextNode.ConfigType != EConfigType.TUIC - && nextNode.ConfigType != EConfigType.WireGuard) - { - var nextOutbound = JsonUtils.Deserialize(txtOutbound); - await GenOutbound(nextNode, nextOutbound); - nextOutbound.tag = Global.ProxyTag; - v2rayConfig.outbounds.Insert(0, nextOutbound); - - outbound.tag = $"{Global.ProxyTag}1"; - nextOutbound.streamSettings.sockopt = new() - { - dialerProxy = outbound.tag - }; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - - return 0; - } - - #endregion private gen function - } -} \ No newline at end of file + public class CoreConfigV2rayService + { + private Config _config; + private static readonly string _tag = "CoreConfigV2rayService"; + + public CoreConfigV2rayService(Config config) + { + _config = config; + } + + #region public gen function + + public async Task GenerateClientConfigContent(ProfileItem node) + { + var ret = new RetResult(); + try + { + if (node == null + || node.Port <= 0) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + if (node.GetNetwork() is nameof(ETransport.quic)) + { + ret.Msg = ResUI.Incorrectconfiguration + $" - {node.GetNetwork()}"; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + var result = Utils.GetEmbedText(Global.V2raySampleClient); + if (Utils.IsNullOrEmpty(result)) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var v2rayConfig = JsonUtils.Deserialize(result); + if (v2rayConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + await GenLog(v2rayConfig); + + await GenInbounds(v2rayConfig); + + await GenRouting(v2rayConfig); + + await GenOutbound(node, v2rayConfig.outbounds.First()); + + await GenMoreOutbounds(node, v2rayConfig); + + await GenDns(node, v2rayConfig); + + await GenStatistic(v2rayConfig); + + ret.Msg = string.Format(ResUI.SuccessfulConfiguration, ""); + ret.Success = true; + ret.Data = JsonUtils.Serialize(v2rayConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + public async Task GenerateClientMultipleLoadConfig(List selecteds) + { + var ret = new RetResult(); + + try + { + if (_config == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + string result = Utils.GetEmbedText(Global.V2raySampleClient); + string txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); + if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var v2rayConfig = JsonUtils.Deserialize(result); + if (v2rayConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + await GenLog(v2rayConfig); + await GenInbounds(v2rayConfig); + await GenRouting(v2rayConfig); + await GenDns(null, v2rayConfig); + await GenStatistic(v2rayConfig); + v2rayConfig.outbounds.RemoveAt(0); + + var tagProxy = new List(); + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard) + { + continue; + } + if (it.Port <= 0) + { + continue; + } + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (item is null) + { + continue; + } + if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + { + if (Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) + { + continue; + } + } + if (item.ConfigType == EConfigType.Shadowsocks + && !Global.SsSecuritiesInSingbox.Contains(item.Security)) + { + continue; + } + if (item.ConfigType == EConfigType.VLESS && !Global.Flows.Contains(item.Flow)) + { + continue; + } + + //outbound + var outbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(item, outbound); + outbound.tag = $"{Global.ProxyTag}-{tagProxy.Count + 1}"; + v2rayConfig.outbounds.Insert(0, outbound); + tagProxy.Add(outbound.tag); + } + if (tagProxy.Count <= 0) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + + //add balancers + var balancer = new BalancersItem4Ray + { + selector = [Global.ProxyTag], + strategy = new() { type = "roundRobin" }, + tag = $"{Global.ProxyTag}-round", + }; + v2rayConfig.routing.balancers = [balancer]; + + //add rule + var rules = v2rayConfig.routing.rules.Where(t => t.outboundTag == Global.ProxyTag).ToList(); + if (rules?.Count > 0) + { + foreach (var rule in rules) + { + rule.outboundTag = null; + rule.balancerTag = balancer.tag; + } + } + v2rayConfig.routing.rules.Add(new() + { + network = "tcp,udp", + balancerTag = balancer.tag, + type = "field" + }); + + ret.Success = true; + ret.Data = JsonUtils.Serialize(v2rayConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + public async Task GenerateClientSpeedtestConfig(List selecteds) + { + var ret = new RetResult(); + try + { + if (_config == null) + { + ret.Msg = ResUI.CheckServerSettings; + return ret; + } + + ret.Msg = ResUI.InitialConfiguration; + + var result = Utils.GetEmbedText(Global.V2raySampleClient); + var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); + if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) + { + ret.Msg = ResUI.FailedGetDefaultConfiguration; + return ret; + } + + var v2rayConfig = JsonUtils.Deserialize(result); + if (v2rayConfig == null) + { + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + List lstIpEndPoints = new(); + List lstTcpConns = new(); + try + { + lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners()); + lstIpEndPoints.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners()); + lstTcpConns.AddRange(IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + await GenLog(v2rayConfig); + v2rayConfig.inbounds.Clear(); + v2rayConfig.outbounds.Clear(); + v2rayConfig.routing.rules.Clear(); + + var initPort = AppHandler.Instance.GetLocalPort(EInboundProtocol.speedtest); + + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.Port <= 0) + { + continue; + } + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (it.ConfigType is EConfigType.VMess or EConfigType.VLESS) + { + if (item is null || Utils.IsNullOrEmpty(item.Id) || !Utils.IsGuidByParse(item.Id)) + { + continue; + } + } + + //find unused port + var port = initPort; + for (var k = initPort; k < Global.MaxPort; k++) + { + if (lstIpEndPoints?.FindIndex(_it => _it.Port == k) >= 0) + { + continue; + } + if (lstTcpConns?.FindIndex(_it => _it.LocalEndPoint.Port == k) >= 0) + { + continue; + } + //found + port = k; + initPort = port + 1; + break; + } + + //Port In Used + if (lstIpEndPoints?.FindIndex(_it => _it.Port == port) >= 0) + { + continue; + } + it.Port = port; + it.AllowTest = true; + + //outbound + if (item is null) + { + continue; + } + if (item.ConfigType == EConfigType.Shadowsocks + && !Global.SsSecuritiesInXray.Contains(item.Security)) + { + continue; + } + if (item.ConfigType == EConfigType.VLESS + && !Global.Flows.Contains(item.Flow)) + { + continue; + } + if (it.ConfigType is EConfigType.VLESS or EConfigType.Trojan + && item.StreamSecurity == Global.StreamSecurityReality + && item.PublicKey.IsNullOrEmpty()) + { + continue; + } + + //inbound + Inbounds4Ray inbound = new() + { + listen = Global.Loopback, + port = port, + protocol = EInboundProtocol.socks.ToString(), + }; + inbound.tag = inbound.protocol + inbound.port.ToString(); + v2rayConfig.inbounds.Add(inbound); + + var outbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(item, outbound); + outbound.tag = Global.ProxyTag + inbound.port.ToString(); + v2rayConfig.outbounds.Add(outbound); + + //rule + RulesItem4Ray rule = new() + { + inboundTag = new List { inbound.tag }, + outboundTag = outbound.tag, + type = "field" + }; + v2rayConfig.routing.rules.Add(rule); + } + + //ret.Msg =string.Format(ResUI.SuccessfulConfiguration"), node.getSummary()); + ret.Success = true; + ret.Data = JsonUtils.Serialize(v2rayConfig); + return ret; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + ret.Msg = ResUI.FailedGenDefaultConfiguration; + return ret; + } + } + + #endregion public gen function + + #region private gen function + + private async Task GenLog(V2rayConfig v2rayConfig) + { + try + { + if (_config.CoreBasicItem.LogEnabled) + { + var dtNow = DateTime.Now; + v2rayConfig.log.loglevel = _config.CoreBasicItem.Loglevel; + v2rayConfig.log.access = Utils.GetLogPath($"Vaccess_{dtNow:yyyy-MM-dd}.txt"); + v2rayConfig.log.error = Utils.GetLogPath($"Verror_{dtNow:yyyy-MM-dd}.txt"); + } + else + { + v2rayConfig.log.loglevel = _config.CoreBasicItem.Loglevel; + v2rayConfig.log.access = null; + v2rayConfig.log.error = null; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenInbounds(V2rayConfig v2rayConfig) + { + try + { + var listen = "0.0.0.0"; + v2rayConfig.inbounds = []; + + var inbound = GetInbound(_config.Inbound.First(), EInboundProtocol.socks, true); + v2rayConfig.inbounds.Add(inbound); + + if (_config.Inbound.First().SecondLocalPortEnabled) + { + var inbound2 = GetInbound(_config.Inbound.First(), EInboundProtocol.socks2, true); + v2rayConfig.inbounds.Add(inbound2); + } + + if (_config.Inbound.First().AllowLANConn) + { + if (_config.Inbound.First().NewPort4LAN) + { + var inbound3 = GetInbound(_config.Inbound.First(), EInboundProtocol.socks3, true); + inbound3.listen = listen; + v2rayConfig.inbounds.Add(inbound3); + + //auth + if (Utils.IsNotEmpty(_config.Inbound.First().User) && Utils.IsNotEmpty(_config.Inbound.First().Pass)) + { + inbound3.settings.auth = "password"; + inbound3.settings.accounts = new List { new AccountsItem4Ray() { user = _config.Inbound.First().User, pass = _config.Inbound.First().Pass } }; + } + } + else + { + inbound.listen = listen; + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private Inbounds4Ray GetInbound(InItem inItem, EInboundProtocol protocol, bool bSocks) + { + string result = Utils.GetEmbedText(Global.V2raySampleInbound); + if (Utils.IsNullOrEmpty(result)) + { + return new(); + } + + var inbound = JsonUtils.Deserialize(result); + if (inbound == null) + { + return new(); + } + inbound.tag = protocol.ToString(); + inbound.port = inItem.LocalPort + (int)protocol; + inbound.protocol = EInboundProtocol.socks.ToString(); + inbound.settings.udp = inItem.UdpEnabled; + inbound.sniffing.enabled = inItem.SniffingEnabled; + inbound.sniffing.destOverride = inItem.DestOverride; + inbound.sniffing.routeOnly = inItem.RouteOnly; + + return inbound; + } + + private async Task GenRouting(V2rayConfig v2rayConfig) + { + try + { + if (v2rayConfig.routing?.rules != null) + { + v2rayConfig.routing.domainStrategy = _config.RoutingBasicItem.DomainStrategy; + v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(_config.RoutingBasicItem.DomainMatcher) ? null : _config.RoutingBasicItem.DomainMatcher; + + var routing = await ConfigHandler.GetDefaultRouting(_config); + if (routing != null) + { + if (Utils.IsNotEmpty(routing.DomainStrategy)) + { + v2rayConfig.routing.domainStrategy = routing.DomainStrategy; + } + var rules = JsonUtils.Deserialize>(routing.RuleSet); + foreach (var item in rules) + { + if (item.Enabled) + { + var item2 = JsonUtils.Deserialize(JsonUtils.Serialize(item)); + await GenRoutingUserRule(item2, v2rayConfig); + } + } + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenRoutingUserRule(RulesItem4Ray? rule, V2rayConfig v2rayConfig) + { + try + { + if (rule == null) + { + return 0; + } + if (Utils.IsNullOrEmpty(rule.port)) + { + rule.port = null; + } + if (Utils.IsNullOrEmpty(rule.network)) + { + rule.network = null; + } + if (rule.domain?.Count == 0) + { + rule.domain = null; + } + if (rule.ip?.Count == 0) + { + rule.ip = null; + } + if (rule.protocol?.Count == 0) + { + rule.protocol = null; + } + if (rule.inboundTag?.Count == 0) + { + rule.inboundTag = null; + } + + var hasDomainIp = false; + if (rule.domain?.Count > 0) + { + var it = JsonUtils.DeepCopy(rule); + it.ip = null; + it.type = "field"; + for (int k = it.domain.Count - 1; k >= 0; k--) + { + if (it.domain[k].StartsWith("#")) + { + it.domain.RemoveAt(k); + } + it.domain[k] = it.domain[k].Replace(Global.RoutingRuleComma, ","); + } + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; + } + if (rule.ip?.Count > 0) + { + var it = JsonUtils.DeepCopy(rule); + it.domain = null; + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + hasDomainIp = true; + } + if (!hasDomainIp) + { + if (Utils.IsNotEmpty(rule.port) + || rule.protocol?.Count > 0 + || rule.inboundTag?.Count > 0 + ) + { + var it = JsonUtils.DeepCopy(rule); + it.type = "field"; + v2rayConfig.routing.rules.Add(it); + } + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenOutbound(ProfileItem node, Outbounds4Ray outbound) + { + try + { + var muxEnabled = _config.CoreBasicItem.MuxEnabled; + switch (node.ConfigType) + { + case EConfigType.VMess: + { + VnextItem4Ray vnextItem; + if (outbound.settings.vnext.Count <= 0) + { + vnextItem = new VnextItem4Ray(); + outbound.settings.vnext.Add(vnextItem); + } + else + { + vnextItem = outbound.settings.vnext.First(); + } + vnextItem.address = node.Address; + vnextItem.port = node.Port; + + UsersItem4Ray usersItem; + if (vnextItem.users.Count <= 0) + { + usersItem = new UsersItem4Ray(); + vnextItem.users.Add(usersItem); + } + else + { + usersItem = vnextItem.users.First(); + } + //远程服务器用户ID + usersItem.id = node.Id; + usersItem.alterId = node.AlterId; + usersItem.email = Global.UserEMail; + if (Global.VmessSecurities.Contains(node.Security)) + { + usersItem.security = node.Security; + } + else + { + usersItem.security = Global.DefaultSecurity; + } + + await GenOutboundMux(node, outbound, muxEnabled, muxEnabled); + + outbound.settings.servers = null; + break; + } + case EConfigType.Shadowsocks: + { + ServersItem4Ray serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem4Ray(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers.First(); + } + serversItem.address = node.Address; + serversItem.port = node.Port; + serversItem.password = node.Id; + serversItem.method = AppHandler.Instance.GetShadowsocksSecurities(node).Contains(node.Security) ? node.Security : "none"; + + serversItem.ota = false; + serversItem.level = 1; + + await GenOutboundMux(node, outbound); + + outbound.settings.vnext = null; + break; + } + case EConfigType.SOCKS: + case EConfigType.HTTP: + { + ServersItem4Ray serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem4Ray(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers.First(); + } + serversItem.address = node.Address; + serversItem.port = node.Port; + serversItem.method = null; + serversItem.password = null; + + if (Utils.IsNotEmpty(node.Security) + && Utils.IsNotEmpty(node.Id)) + { + SocksUsersItem4Ray socksUsersItem = new() + { + user = node.Security, + pass = node.Id, + level = 1 + }; + + serversItem.users = new List() { socksUsersItem }; + } + + await GenOutboundMux(node, outbound); + + outbound.settings.vnext = null; + break; + } + case EConfigType.VLESS: + { + VnextItem4Ray vnextItem; + if (outbound.settings.vnext?.Count <= 0) + { + vnextItem = new VnextItem4Ray(); + outbound.settings.vnext.Add(vnextItem); + } + else + { + vnextItem = outbound.settings.vnext.First(); + } + vnextItem.address = node.Address; + vnextItem.port = node.Port; + + UsersItem4Ray usersItem; + if (vnextItem.users.Count <= 0) + { + usersItem = new UsersItem4Ray(); + vnextItem.users.Add(usersItem); + } + else + { + usersItem = vnextItem.users.First(); + } + usersItem.id = node.Id; + usersItem.email = Global.UserEMail; + usersItem.encryption = node.Security; + + if (node.Flow.IsNullOrEmpty()) + { + await GenOutboundMux(node, outbound, muxEnabled, muxEnabled); + } + else + { + usersItem.flow = node.Flow; + await GenOutboundMux(node, outbound, false, muxEnabled); + } + outbound.settings.servers = null; + break; + } + case EConfigType.Trojan: + { + ServersItem4Ray serversItem; + if (outbound.settings.servers.Count <= 0) + { + serversItem = new ServersItem4Ray(); + outbound.settings.servers.Add(serversItem); + } + else + { + serversItem = outbound.settings.servers.First(); + } + serversItem.address = node.Address; + serversItem.port = node.Port; + serversItem.password = node.Id; + + serversItem.ota = false; + serversItem.level = 1; + + await GenOutboundMux(node, outbound); + + outbound.settings.vnext = null; + break; + } + } + + outbound.protocol = Global.ProtocolTypes[node.ConfigType]; + await GenBoundStreamSettings(node, outbound); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenOutboundMux(ProfileItem node, Outbounds4Ray outbound, bool enabledTCP = false, bool enabledUDP = false) + { + try + { + outbound.mux.enabled = false; + outbound.mux.concurrency = -1; + + if (enabledTCP) + { + outbound.mux.enabled = true; + outbound.mux.concurrency = _config.Mux4RayItem.Concurrency; + } + else if (enabledUDP) + { + outbound.mux.enabled = true; + outbound.mux.xudpConcurrency = _config.Mux4RayItem.XudpConcurrency; + outbound.mux.xudpProxyUDP443 = _config.Mux4RayItem.XudpProxyUDP443; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return await Task.FromResult(0); + } + + private async Task GenBoundStreamSettings(ProfileItem node, Outbounds4Ray outbound) + { + try + { + var streamSettings = outbound.streamSettings; + streamSettings.network = node.GetNetwork(); + var host = node.RequestHost.TrimEx(); + var path = node.Path.TrimEx(); + var sni = node.Sni.TrimEx(); + var useragent = ""; + if (!_config.CoreBasicItem.DefUserAgent.IsNullOrEmpty()) + { + try + { + useragent = Global.UserAgentTexts[_config.CoreBasicItem.DefUserAgent]; + } + catch (KeyNotFoundException) + { + useragent = _config.CoreBasicItem.DefUserAgent; + } + } + + //if tls + if (node.StreamSecurity == Global.StreamSecurity) + { + streamSettings.security = node.StreamSecurity; + + TlsSettings4Ray tlsSettings = new() + { + allowInsecure = Utils.ToBool(node.AllowInsecure.IsNullOrEmpty() ? _config.CoreBasicItem.DefAllowInsecure.ToString().ToLower() : node.AllowInsecure), + alpn = node.GetAlpn(), + fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint + }; + if (Utils.IsNotEmpty(sni)) + { + tlsSettings.serverName = sni; + } + else if (Utils.IsNotEmpty(host)) + { + tlsSettings.serverName = Utils.String2List(host)?.First(); + } + streamSettings.tlsSettings = tlsSettings; + } + + //if Reality + if (node.StreamSecurity == Global.StreamSecurityReality) + { + streamSettings.security = node.StreamSecurity; + + TlsSettings4Ray realitySettings = new() + { + fingerprint = node.Fingerprint.IsNullOrEmpty() ? _config.CoreBasicItem.DefFingerprint : node.Fingerprint, + serverName = sni, + publicKey = node.PublicKey, + shortId = node.ShortId, + spiderX = node.SpiderX, + show = false, + }; + + streamSettings.realitySettings = realitySettings; + } + + //streamSettings + switch (node.GetNetwork()) + { + case nameof(ETransport.kcp): + KcpSettings4Ray kcpSettings = new() + { + mtu = _config.KcpItem.Mtu, + tti = _config.KcpItem.Tti + }; + + kcpSettings.uplinkCapacity = _config.KcpItem.UplinkCapacity; + kcpSettings.downlinkCapacity = _config.KcpItem.DownlinkCapacity; + + kcpSettings.congestion = _config.KcpItem.Congestion; + kcpSettings.readBufferSize = _config.KcpItem.ReadBufferSize; + kcpSettings.writeBufferSize = _config.KcpItem.WriteBufferSize; + kcpSettings.header = new Header4Ray + { + type = node.HeaderType + }; + if (Utils.IsNotEmpty(path)) + { + kcpSettings.seed = path; + } + streamSettings.kcpSettings = kcpSettings; + break; + //ws + case nameof(ETransport.ws): + WsSettings4Ray wsSettings = new(); + wsSettings.headers = new Headers4Ray(); + + if (Utils.IsNotEmpty(host)) + { + wsSettings.host = host; + wsSettings.headers.Host = host; + } + if (Utils.IsNotEmpty(path)) + { + wsSettings.path = path; + } + if (Utils.IsNotEmpty(useragent)) + { + wsSettings.headers.UserAgent = useragent; + } + streamSettings.wsSettings = wsSettings; + + break; + //httpupgrade + case nameof(ETransport.httpupgrade): + HttpupgradeSettings4Ray httpupgradeSettings = new(); + + if (Utils.IsNotEmpty(path)) + { + httpupgradeSettings.path = path; + } + if (Utils.IsNotEmpty(host)) + { + httpupgradeSettings.host = host; + } + streamSettings.httpupgradeSettings = httpupgradeSettings; + + break; + //xhttp + case nameof(ETransport.xhttp): + streamSettings.network = ETransport.xhttp.ToString(); + XhttpSettings4Ray xhttpSettings = new(); + + if (Utils.IsNotEmpty(path)) + { + xhttpSettings.path = path; + } + if (Utils.IsNotEmpty(host)) + { + xhttpSettings.host = host; + } + if (Utils.IsNotEmpty(node.HeaderType) && Global.XhttpMode.Contains(node.HeaderType)) + { + xhttpSettings.mode = node.HeaderType; + } + if (Utils.IsNotEmpty(node.Extra)) + { + xhttpSettings.extra = JsonUtils.ParseJson(node.Extra); + } + + streamSettings.xhttpSettings = xhttpSettings; + await GenOutboundMux(node, outbound); + + break; + //h2 + case nameof(ETransport.h2): + HttpSettings4Ray httpSettings = new(); + + if (Utils.IsNotEmpty(host)) + { + httpSettings.host = Utils.String2List(host); + } + httpSettings.path = path; + + streamSettings.httpSettings = httpSettings; + + break; + //quic + case nameof(ETransport.quic): + QuicSettings4Ray quicsettings = new() + { + security = host, + key = path, + header = new Header4Ray + { + type = node.HeaderType + } + }; + streamSettings.quicSettings = quicsettings; + if (node.StreamSecurity == Global.StreamSecurity) + { + if (Utils.IsNotEmpty(sni)) + { + streamSettings.tlsSettings.serverName = sni; + } + else + { + streamSettings.tlsSettings.serverName = node.Address; + } + } + break; + + case nameof(ETransport.grpc): + GrpcSettings4Ray grpcSettings = new() + { + authority = Utils.IsNullOrEmpty(host) ? null : host, + serviceName = path, + multiMode = node.HeaderType == Global.GrpcMultiMode, + idle_timeout = _config.GrpcItem.IdleTimeout, + health_check_timeout = _config.GrpcItem.HealthCheckTimeout, + permit_without_stream = _config.GrpcItem.PermitWithoutStream, + initial_windows_size = _config.GrpcItem.InitialWindowsSize, + }; + streamSettings.grpcSettings = grpcSettings; + break; + + default: + //tcp + if (node.HeaderType == Global.TcpHeaderHttp) + { + TcpSettings4Ray tcpSettings = new() + { + header = new Header4Ray + { + type = node.HeaderType + } + }; + + //request Host + string request = Utils.GetEmbedText(Global.V2raySampleHttpRequestFileName); + string[] arrHost = host.Split(','); + string host2 = string.Join(",".AppendQuotes(), arrHost); + request = request.Replace("$requestHost$", $"{host2.AppendQuotes()}"); + request = request.Replace("$requestUserAgent$", $"{useragent.AppendQuotes()}"); + //Path + string pathHttp = @"/"; + if (Utils.IsNotEmpty(path)) + { + string[] arrPath = path.Split(','); + pathHttp = string.Join(",".AppendQuotes(), arrPath); + } + request = request.Replace("$requestPath$", $"{pathHttp.AppendQuotes()}"); + tcpSettings.header.request = JsonUtils.Deserialize(request); + + streamSettings.tcpSettings = tcpSettings; + } + break; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenDns(ProfileItem? node, V2rayConfig v2rayConfig) + { + try + { + var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); + var normalDNS = item?.NormalDNS; + var domainStrategy4Freedom = item?.DomainStrategy4Freedom; + if (Utils.IsNullOrEmpty(normalDNS)) + { + normalDNS = Utils.GetEmbedText(Global.DNSV2rayNormalFileName); + } + + //Outbound Freedom domainStrategy + if (Utils.IsNotEmpty(domainStrategy4Freedom)) + { + var outbound = v2rayConfig.outbounds.FirstOrDefault(t => t is { protocol: "freedom", tag: Global.DirectTag }); + if (outbound != null) + { + outbound.settings = new(); + outbound.settings.domainStrategy = domainStrategy4Freedom; + outbound.settings.userLevel = 0; + } + } + + var obj = JsonUtils.ParseJson(normalDNS); + if (obj is null) + { + List servers = []; + string[] arrDNS = normalDNS.Split(','); + foreach (string str in arrDNS) + { + servers.Add(str); + } + obj = JsonUtils.ParseJson("{}"); + obj["servers"] = JsonUtils.SerializeToNode(servers); + } + + // 追加至 dns 设置 + if (item.UseSystemHosts) + { + var systemHosts = Utils.GetSystemHosts(); + if (systemHosts.Count > 0) + { + var normalHost = obj["hosts"]; + if (normalHost != null) + { + foreach (var host in systemHosts) + { + if (normalHost[host.Key] != null) + continue; + normalHost[host.Key] = host.Value; + } + } + } + } + + await GenDnsDomains(node, obj, item); + + v2rayConfig.dns = obj; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return 0; + } + + private async Task GenDnsDomains(ProfileItem? node, JsonNode dns, DNSItem? dNSItem) + { + if (node == null) + { return 0; } + var servers = dns["servers"]; + if (servers != null) + { + if (Utils.IsDomain(node.Address)) + { + var dnsServer = new DnsServer4Ray() + { + address = Utils.IsNullOrEmpty(dNSItem?.DomainDNSAddress) ? Global.DomainDNSAddress.FirstOrDefault() : dNSItem?.DomainDNSAddress, + domains = [node.Address] + }; + servers.AsArray().Add(JsonUtils.SerializeToNode(dnsServer)); + } + } + return await Task.FromResult(0); + } + + private async Task GenStatistic(V2rayConfig v2rayConfig) + { + if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) + { + string tag = EInboundProtocol.api.ToString(); + Metrics4Ray apiObj = new(); + Policy4Ray policyObj = new(); + SystemPolicy4Ray policySystemSetting = new(); + + v2rayConfig.stats = new Stats4Ray(); + + apiObj.tag = tag; + v2rayConfig.metrics = apiObj; + + policySystemSetting.statsOutboundDownlink = true; + policySystemSetting.statsOutboundUplink = true; + policyObj.system = policySystemSetting; + v2rayConfig.policy = policyObj; + + if (!v2rayConfig.inbounds.Exists(item => item.tag == tag)) + { + Inbounds4Ray apiInbound = new(); + Inboundsettings4Ray apiInboundSettings = new(); + apiInbound.tag = tag; + apiInbound.listen = Global.Loopback; + apiInbound.port = AppHandler.Instance.StatePort; + apiInbound.protocol = Global.InboundAPIProtocol; + apiInboundSettings.address = Global.Loopback; + apiInbound.settings = apiInboundSettings; + v2rayConfig.inbounds.Add(apiInbound); + } + + if (!v2rayConfig.routing.rules.Exists(item => item.outboundTag == tag)) + { + RulesItem4Ray apiRoutingRule = new() + { + inboundTag = new List { tag }, + outboundTag = tag, + type = "field" + }; + + v2rayConfig.routing.rules.Add(apiRoutingRule); + } + } + return await Task.FromResult(0); + } + + private async Task GenMoreOutbounds(ProfileItem node, V2rayConfig v2rayConfig) + { + //fragment proxy + if (_config.CoreBasicItem.EnableFragment + && Utils.IsNotEmpty(v2rayConfig.outbounds.First().streamSettings?.security)) + { + var fragmentOutbound = new Outbounds4Ray + { + protocol = "freedom", + tag = $"{Global.ProxyTag}3", + settings = new() + { + fragment = new() + { + packets = _config.Fragment4RayItem?.Packets, + length = _config.Fragment4RayItem?.Length, + interval = _config.Fragment4RayItem?.Interval + } + } + }; + + v2rayConfig.outbounds.Add(fragmentOutbound); + v2rayConfig.outbounds.First().streamSettings.sockopt = new() + { + dialerProxy = fragmentOutbound.tag + }; + return 0; + } + + if (node.Subid.IsNullOrEmpty()) + { + return 0; + } + try + { + var subItem = await AppHandler.Instance.GetSubItem(node.Subid); + if (subItem is null) + { + return 0; + } + + //current proxy + var outbound = v2rayConfig.outbounds.First(); + var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); + + //Previous proxy + var prevNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.PrevProfile); + if (prevNode is not null + && prevNode.ConfigType != EConfigType.Custom + && prevNode.ConfigType != EConfigType.Hysteria2 + && prevNode.ConfigType != EConfigType.TUIC + && prevNode.ConfigType != EConfigType.WireGuard) + { + var prevOutbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(prevNode, prevOutbound); + prevOutbound.tag = $"{Global.ProxyTag}2"; + v2rayConfig.outbounds.Add(prevOutbound); + + outbound.streamSettings.sockopt = new() + { + dialerProxy = prevOutbound.tag + }; + } + + //Next proxy + var nextNode = await AppHandler.Instance.GetProfileItemViaRemarks(subItem.NextProfile); + if (nextNode is not null + && nextNode.ConfigType != EConfigType.Custom + && nextNode.ConfigType != EConfigType.Hysteria2 + && nextNode.ConfigType != EConfigType.TUIC + && nextNode.ConfigType != EConfigType.WireGuard) + { + var nextOutbound = JsonUtils.Deserialize(txtOutbound); + await GenOutbound(nextNode, nextOutbound); + nextOutbound.tag = Global.ProxyTag; + v2rayConfig.outbounds.Insert(0, nextOutbound); + + outbound.tag = $"{Global.ProxyTag}1"; + nextOutbound.streamSettings.sockopt = new() + { + dialerProxy = outbound.tag + }; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + + return 0; + } + + #endregion private gen function + } +} diff --git a/v2rayN/ServiceLib/Services/DownloadService.cs b/v2rayN/ServiceLib/Services/DownloadService.cs index c5de51be..4946ab4c 100644 --- a/v2rayN/ServiceLib/Services/DownloadService.cs +++ b/v2rayN/ServiceLib/Services/DownloadService.cs @@ -1,322 +1,322 @@ -using System.Diagnostics; +using System.Diagnostics; using System.Net; using System.Net.Http.Headers; using System.Net.Sockets; namespace ServiceLib.Services { - /// - ///Download - /// - public class DownloadService - { - public event EventHandler? UpdateCompleted; + /// + ///Download + /// + public class DownloadService + { + public event EventHandler? UpdateCompleted; - public event ErrorEventHandler? Error; + public event ErrorEventHandler? Error; - private static readonly string _tag = "DownloadService"; + private static readonly string _tag = "DownloadService"; - public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action updateFunc) - { - try - { - SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); + public async Task DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action updateFunc) + { + try + { + SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); - var progress = new Progress(); - progress.ProgressChanged += (sender, value) => - { - if (updateFunc != null) - { - string msg = $"{value}"; - updateFunc?.Invoke(false, msg); - } - }; + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + if (updateFunc != null) + { + string msg = $"{value}"; + updateFunc?.Invoke(false, msg); + } + }; - await DownloaderHelper.Instance.DownloadDataAsync4Speed(webProxy, - url, - progress, - downloadTimeout); - } - catch (Exception ex) - { - updateFunc?.Invoke(false, ex.Message); - if (ex.InnerException != null) - { - updateFunc?.Invoke(false, ex.InnerException.Message); - } - } - return 0; - } + await DownloaderHelper.Instance.DownloadDataAsync4Speed(webProxy, + url, + progress, + downloadTimeout); + } + catch (Exception ex) + { + updateFunc?.Invoke(false, ex.Message); + if (ex.InnerException != null) + { + updateFunc?.Invoke(false, ex.InnerException.Message); + } + } + return 0; + } - public async Task DownloadFileAsync(string url, string fileName, bool blProxy, int downloadTimeout) - { - try - { - SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); - UpdateCompleted?.Invoke(this, new RetResult(false, $"{ResUI.Downloading} {url}")); + public async Task DownloadFileAsync(string url, string fileName, bool blProxy, int downloadTimeout) + { + try + { + SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); + UpdateCompleted?.Invoke(this, new RetResult(false, $"{ResUI.Downloading} {url}")); - var progress = new Progress(); - progress.ProgressChanged += (sender, value) => - { - UpdateCompleted?.Invoke(this, new RetResult(value > 100, $"...{value}%")); - }; + var progress = new Progress(); + progress.ProgressChanged += (sender, value) => + { + UpdateCompleted?.Invoke(this, new RetResult(value > 100, $"...{value}%")); + }; - var webProxy = await GetWebProxy(blProxy); - await DownloaderHelper.Instance.DownloadFileAsync(webProxy, - url, - fileName, - progress, - downloadTimeout); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); + var webProxy = await GetWebProxy(blProxy); + await DownloaderHelper.Instance.DownloadFileAsync(webProxy, + url, + fileName, + progress, + downloadTimeout); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); - if (ex.InnerException != null) - { - Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); - } - } - } + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } + } - public async Task UrlRedirectAsync(string url, bool blProxy) - { - SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); - var webRequestHandler = new SocketsHttpHandler - { - AllowAutoRedirect = false, - Proxy = await GetWebProxy(blProxy) - }; - HttpClient client = new(webRequestHandler); + public async Task UrlRedirectAsync(string url, bool blProxy) + { + SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); + var webRequestHandler = new SocketsHttpHandler + { + AllowAutoRedirect = false, + Proxy = await GetWebProxy(blProxy) + }; + HttpClient client = new(webRequestHandler); - var response = await client.GetAsync(url); - if (response.StatusCode == HttpStatusCode.Redirect && response.Headers.Location is not null) - { - return response.Headers.Location.ToString(); - } - else - { - Error?.Invoke(this, new ErrorEventArgs(new Exception("StatusCode error: " + response.StatusCode))); - Logging.SaveLog("StatusCode error: " + url); - return null; - } - } + var response = await client.GetAsync(url); + if (response.StatusCode == HttpStatusCode.Redirect && response.Headers.Location is not null) + { + return response.Headers.Location.ToString(); + } + else + { + Error?.Invoke(this, new ErrorEventArgs(new Exception("StatusCode error: " + response.StatusCode))); + Logging.SaveLog("StatusCode error: " + url); + return null; + } + } - public async Task TryDownloadString(string url, bool blProxy, string userAgent) - { - try - { - var result1 = await DownloadStringAsync(url, blProxy, userAgent, 15); - if (Utils.IsNotEmpty(result1)) - { - return result1; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); - if (ex.InnerException != null) - { - Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); - } - } + public async Task TryDownloadString(string url, bool blProxy, string userAgent) + { + try + { + var result1 = await DownloadStringAsync(url, blProxy, userAgent, 15); + if (Utils.IsNotEmpty(result1)) + { + return result1; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } - try - { - var result2 = await DownloadStringViaDownloader(url, blProxy, userAgent, 15); - if (Utils.IsNotEmpty(result2)) - { - return result2; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); - if (ex.InnerException != null) - { - Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); - } - } + try + { + var result2 = await DownloadStringViaDownloader(url, blProxy, userAgent, 15); + if (Utils.IsNotEmpty(result2)) + { + return result2; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } - return null; - } + return null; + } - /// - /// DownloadString - /// - /// - private async Task DownloadStringAsync(string url, bool blProxy, string userAgent, int timeout) - { - try - { - SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); - var webProxy = await GetWebProxy(blProxy); - var client = new HttpClient(new SocketsHttpHandler() - { - Proxy = webProxy, - UseProxy = webProxy != null - }); + /// + /// DownloadString + /// + /// + private async Task DownloadStringAsync(string url, bool blProxy, string userAgent, int timeout) + { + try + { + SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); + var webProxy = await GetWebProxy(blProxy); + var client = new HttpClient(new SocketsHttpHandler() + { + Proxy = webProxy, + UseProxy = webProxy != null + }); - if (Utils.IsNullOrEmpty(userAgent)) - { - userAgent = Utils.GetVersion(false); - } - client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent); + if (Utils.IsNullOrEmpty(userAgent)) + { + userAgent = Utils.GetVersion(false); + } + client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent); - Uri uri = new(url); - //Authorization Header - if (Utils.IsNotEmpty(uri.UserInfo)) - { - client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); - } + Uri uri = new(url); + //Authorization Header + if (Utils.IsNotEmpty(uri.UserInfo)) + { + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); + } - using var cts = new CancellationTokenSource(); - var result = await HttpClientHelper.Instance.GetAsync(client, url, cts.Token).WaitAsync(TimeSpan.FromSeconds(timeout), cts.Token); - return result; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); - if (ex.InnerException != null) - { - Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); - } - } - return null; - } + using var cts = new CancellationTokenSource(); + var result = await HttpClientHelper.Instance.GetAsync(client, url, cts.Token).WaitAsync(TimeSpan.FromSeconds(timeout), cts.Token); + return result; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } + return null; + } - /// - /// DownloadString - /// - /// - private async Task DownloadStringViaDownloader(string url, bool blProxy, string userAgent, int timeout) - { - try - { - SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); + /// + /// DownloadString + /// + /// + private async Task DownloadStringViaDownloader(string url, bool blProxy, string userAgent, int timeout) + { + try + { + SetSecurityProtocol(AppHandler.Instance.Config.GuiItem.EnableSecurityProtocolTls13); - var webProxy = await GetWebProxy(blProxy); + var webProxy = await GetWebProxy(blProxy); - if (Utils.IsNullOrEmpty(userAgent)) - { - userAgent = Utils.GetVersion(false); - } - var result = await DownloaderHelper.Instance.DownloadStringAsync(webProxy, url, userAgent, timeout); - return result; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); - if (ex.InnerException != null) - { - Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); - } - } - return null; - } + if (Utils.IsNullOrEmpty(userAgent)) + { + userAgent = Utils.GetVersion(false); + } + var result = await DownloaderHelper.Instance.DownloadStringAsync(webProxy, url, userAgent, timeout); + return result; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } + } + return null; + } - public async Task RunAvailabilityCheck(IWebProxy? webProxy) - { - try - { - webProxy ??= await GetWebProxy(true); + public async Task RunAvailabilityCheck(IWebProxy? webProxy) + { + try + { + webProxy ??= await GetWebProxy(true); - try - { - var config = AppHandler.Instance.Config; - var responseTime = await GetRealPingTime(config.SpeedTestItem.SpeedPingTestUrl, webProxy, 10); - return responseTime; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return -1; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return -1; - } - } + try + { + var config = AppHandler.Instance.Config; + var responseTime = await GetRealPingTime(config.SpeedTestItem.SpeedPingTestUrl, webProxy, 10); + return responseTime; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return -1; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return -1; + } + } - public async Task GetRealPingTime(string url, IWebProxy? webProxy, int downloadTimeout) - { - var responseTime = -1; - try - { - using var cts = new CancellationTokenSource(); - cts.CancelAfter(TimeSpan.FromSeconds(downloadTimeout)); - using var client = new HttpClient(new SocketsHttpHandler() - { - Proxy = webProxy, - UseProxy = webProxy != null - }); + public async Task GetRealPingTime(string url, IWebProxy? webProxy, int downloadTimeout) + { + var responseTime = -1; + try + { + using var cts = new CancellationTokenSource(); + cts.CancelAfter(TimeSpan.FromSeconds(downloadTimeout)); + using var client = new HttpClient(new SocketsHttpHandler() + { + Proxy = webProxy, + UseProxy = webProxy != null + }); - List oneTime = new(); - for (var i = 0; i < 2; i++) - { - var timer = Stopwatch.StartNew(); - await client.GetAsync(url, cts.Token); - timer.Stop(); - oneTime.Add((int)timer.Elapsed.TotalMilliseconds); - await Task.Delay(100); - } - responseTime = oneTime.Where(x => x > 0).OrderBy(x => x).FirstOrDefault(); - } - catch //(Exception ex) - { - //Utile.SaveLog(ex.Message, ex); - } - return responseTime; - } + List oneTime = new(); + for (var i = 0; i < 2; i++) + { + var timer = Stopwatch.StartNew(); + await client.GetAsync(url, cts.Token); + timer.Stop(); + oneTime.Add((int)timer.Elapsed.TotalMilliseconds); + await Task.Delay(100); + } + responseTime = oneTime.Where(x => x > 0).OrderBy(x => x).FirstOrDefault(); + } + catch //(Exception ex) + { + //Utile.SaveLog(ex.Message, ex); + } + return responseTime; + } - private async Task GetWebProxy(bool blProxy) - { - if (!blProxy) - { - return null; - } - var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); - if (await SocketCheck(Global.Loopback, port) == false) - { - return null; - } + private async Task GetWebProxy(bool blProxy) + { + if (!blProxy) + { + return null; + } + var port = AppHandler.Instance.GetLocalPort(EInboundProtocol.socks); + if (await SocketCheck(Global.Loopback, port) == false) + { + return null; + } - return new WebProxy($"socks5://{Global.Loopback}:{port}"); - } + return new WebProxy($"socks5://{Global.Loopback}:{port}"); + } - private async Task SocketCheck(string ip, int port) - { - try - { - IPEndPoint point = new(IPAddress.Parse(ip), port); - using Socket? sock = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - await sock.ConnectAsync(point); - return true; - } - catch (Exception) - { - return false; - } - } + private async Task SocketCheck(string ip, int port) + { + try + { + IPEndPoint point = new(IPAddress.Parse(ip), port); + using Socket? sock = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + await sock.ConnectAsync(point); + return true; + } + catch (Exception) + { + return false; + } + } - private static void SetSecurityProtocol(bool enableSecurityProtocolTls13) - { - if (enableSecurityProtocolTls13) - { - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; - } - else - { - ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; - } - ServicePointManager.DefaultConnectionLimit = 256; - } - } -} \ No newline at end of file + private static void SetSecurityProtocol(bool enableSecurityProtocolTls13) + { + if (enableSecurityProtocolTls13) + { + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; + } + else + { + ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; + } + ServicePointManager.DefaultConnectionLimit = 256; + } + } +} diff --git a/v2rayN/ServiceLib/Services/SpeedtestService.cs b/v2rayN/ServiceLib/Services/SpeedtestService.cs index cf134e01..b1fe1311 100644 --- a/v2rayN/ServiceLib/Services/SpeedtestService.cs +++ b/v2rayN/ServiceLib/Services/SpeedtestService.cs @@ -1,408 +1,411 @@ -using ReactiveUI; using System.Diagnostics; using System.Net; using System.Net.Sockets; +using ReactiveUI; namespace ServiceLib.Services { - public class SpeedtestService - { - private Config? _config; - private Action? _updateFunc; + public class SpeedtestService + { + private Config? _config; + private Action? _updateFunc; - private bool _exitLoop = false; - private static readonly string _tag = "SpeedtestService"; + private bool _exitLoop = false; + private static readonly string _tag = "SpeedtestService"; - public SpeedtestService(Config config, List selecteds, ESpeedActionType actionType, Action updateFunc) - { - _config = config; - _updateFunc = updateFunc; + public SpeedtestService(Config config, List selecteds, ESpeedActionType actionType, Action updateFunc) + { + _config = config; + _updateFunc = updateFunc; - var lstSelected = new List(); - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.Port <= 0) - { - continue; - } - lstSelected.Add(new ServerTestItem() - { - IndexId = it.IndexId, - Address = it.Address, - Port = it.Port, - ConfigType = it.ConfigType - }); - } + var lstSelected = new List(); + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.Port <= 0) + { + continue; + } + lstSelected.Add(new ServerTestItem() + { + IndexId = it.IndexId, + Address = it.Address, + Port = it.Port, + ConfigType = it.ConfigType + }); + } - //clear test result - foreach (var it in lstSelected) - { - switch (actionType) - { - case ESpeedActionType.Tcping: - case ESpeedActionType.Realping: - UpdateFunc(it.IndexId, ResUI.Speedtesting, ""); - ProfileExHandler.Instance.SetTestDelay(it.IndexId, "0"); - break; + //clear test result + foreach (var it in lstSelected) + { + switch (actionType) + { + case ESpeedActionType.Tcping: + case ESpeedActionType.Realping: + UpdateFunc(it.IndexId, ResUI.Speedtesting, ""); + ProfileExHandler.Instance.SetTestDelay(it.IndexId, "0"); + break; - case ESpeedActionType.Speedtest: - UpdateFunc(it.IndexId, "", ResUI.SpeedtestingWait); - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "0"); - break; + case ESpeedActionType.Speedtest: + UpdateFunc(it.IndexId, "", ResUI.SpeedtestingWait); + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "0"); + break; - case ESpeedActionType.Mixedtest: - UpdateFunc(it.IndexId, ResUI.Speedtesting, ResUI.SpeedtestingWait); - ProfileExHandler.Instance.SetTestDelay(it.IndexId, "0"); - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "0"); - break; - } - } + case ESpeedActionType.Mixedtest: + UpdateFunc(it.IndexId, ResUI.Speedtesting, ResUI.SpeedtestingWait); + ProfileExHandler.Instance.SetTestDelay(it.IndexId, "0"); + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "0"); + break; + } + } - MessageBus.Current.Listen(EMsgCommand.StopSpeedtest.ToString()).Subscribe(ExitLoop); + MessageBus.Current.Listen(EMsgCommand.StopSpeedtest.ToString()).Subscribe(ExitLoop); - Task.Run(async () => { await RunAsync(actionType, lstSelected); }); - } + Task.Run(async () => { await RunAsync(actionType, lstSelected); }); + } - private async Task RunAsync(ESpeedActionType actionType, List lstSelected) - { - if (actionType == ESpeedActionType.Tcping) - { - await RunTcpingAsync(lstSelected); - return; - } + private async Task RunAsync(ESpeedActionType actionType, List lstSelected) + { + if (actionType == ESpeedActionType.Tcping) + { + await RunTcpingAsync(lstSelected); + return; + } - var pageSize = _config.SpeedTestItem.SpeedTestPageSize; - if (pageSize is <= 0 or > 1000) - { - pageSize = 1000; - } + var pageSize = _config.SpeedTestItem.SpeedTestPageSize; + if (pageSize is <= 0 or > 1000) + { + pageSize = 1000; + } - List> lstTest = new(); - var lst1 = lstSelected.Where(t => t.ConfigType is not (EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard)).ToList(); - var lst2 = lstSelected.Where(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard).ToList(); + List> lstTest = new(); + var lst1 = lstSelected.Where(t => t.ConfigType is not (EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard)).ToList(); + var lst2 = lstSelected.Where(t => t.ConfigType is EConfigType.Hysteria2 or EConfigType.TUIC or EConfigType.WireGuard).ToList(); - for (var num = 0; num < (int)Math.Ceiling(lst1.Count * 1.0 / pageSize); num++) - { - lstTest.Add(lst1.Skip(num * pageSize).Take(pageSize).ToList()); - } - for (var num = 0; num < (int)Math.Ceiling(lst2.Count * 1.0 / pageSize); num++) - { - lstTest.Add(lst2.Skip(num * pageSize).Take(pageSize).ToList()); - } + for (var num = 0; num < (int)Math.Ceiling(lst1.Count * 1.0 / pageSize); num++) + { + lstTest.Add(lst1.Skip(num * pageSize).Take(pageSize).ToList()); + } + for (var num = 0; num < (int)Math.Ceiling(lst2.Count * 1.0 / pageSize); num++) + { + lstTest.Add(lst2.Skip(num * pageSize).Take(pageSize).ToList()); + } - foreach (var lst in lstTest) - { - switch (actionType) - { - case ESpeedActionType.Realping: - await RunRealPingAsync(lst); - break; + foreach (var lst in lstTest) + { + switch (actionType) + { + case ESpeedActionType.Realping: + await RunRealPingAsync(lst); + break; - case ESpeedActionType.Speedtest: - await RunSpeedTestAsync(lst); - break; + case ESpeedActionType.Speedtest: + await RunSpeedTestAsync(lst); + break; - case ESpeedActionType.Mixedtest: - await RunMixedTestAsync(lst); - break; - } + case ESpeedActionType.Mixedtest: + await RunMixedTestAsync(lst); + break; + } - await Task.Delay(100); - } + await Task.Delay(100); + } - UpdateFunc("", ResUI.SpeedtestingCompleted); - } + UpdateFunc("", ResUI.SpeedtestingCompleted); + } - private void ExitLoop(string x) - { - if (_exitLoop) return; - _exitLoop = true; - UpdateFunc("", ResUI.SpeedtestingStop); - } + private void ExitLoop(string x) + { + if (_exitLoop) + return; + _exitLoop = true; + UpdateFunc("", ResUI.SpeedtestingStop); + } - private async Task RunTcpingAsync(List selecteds) - { - try - { - List tasks = []; - foreach (var it in selecteds) - { - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - tasks.Add(Task.Run(async () => - { - try - { - var time = await GetTcpingTime(it.Address, it.Port); - var output = FormatOut(time, Global.DelayUnit); + private async Task RunTcpingAsync(List selecteds) + { + try + { + List tasks = []; + foreach (var it in selecteds) + { + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + tasks.Add(Task.Run(async () => + { + try + { + var time = await GetTcpingTime(it.Address, it.Port); + var output = FormatOut(time, Global.DelayUnit); - ProfileExHandler.Instance.SetTestDelay(it.IndexId, output); - UpdateFunc(it.IndexId, output); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - })); - } - Task.WaitAll([.. tasks]); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - finally - { - await ProfileExHandler.Instance.SaveTo(); - } - } + ProfileExHandler.Instance.SetTestDelay(it.IndexId, output); + UpdateFunc(it.IndexId, output); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + })); + } + Task.WaitAll([.. tasks]); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + finally + { + await ProfileExHandler.Instance.SaveTo(); + } + } - private async Task RunRealPingAsync(List selecteds) - { - var pid = -1; - try - { - pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); - if (pid < 0) - { - UpdateFunc("", ResUI.FailedToRunCore); - return; - } + private async Task RunRealPingAsync(List selecteds) + { + var pid = -1; + try + { + pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); + if (pid < 0) + { + UpdateFunc("", ResUI.FailedToRunCore); + return; + } - var downloadHandle = new DownloadService(); + var downloadHandle = new DownloadService(); - List tasks = new(); - foreach (var it in selecteds) - { - if (!it.AllowTest) - { - continue; - } - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - tasks.Add(Task.Run(async () => - { - try - { - var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); - var output = await GetRealPingTime(downloadHandle, webProxy); + List tasks = new(); + foreach (var it in selecteds) + { + if (!it.AllowTest) + { + continue; + } + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + tasks.Add(Task.Run(async () => + { + try + { + var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); + var output = await GetRealPingTime(downloadHandle, webProxy); - ProfileExHandler.Instance.SetTestDelay(it.IndexId, output); - UpdateFunc(it.IndexId, output); - int.TryParse(output, out var delay); - it.Delay = delay; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - })); - } - Task.WaitAll(tasks.ToArray()); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - finally - { - if (pid > 0) - { - await ProcUtils.ProcessKill(pid); - } - await ProfileExHandler.Instance.SaveTo(); - } - } + ProfileExHandler.Instance.SetTestDelay(it.IndexId, output); + UpdateFunc(it.IndexId, output); + int.TryParse(output, out var delay); + it.Delay = delay; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + })); + } + Task.WaitAll(tasks.ToArray()); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + finally + { + if (pid > 0) + { + await ProcUtils.ProcessKill(pid); + } + await ProfileExHandler.Instance.SaveTo(); + } + } - private async Task RunSpeedTestAsync(List selecteds) - { - var pid = -1; - pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); - if (pid < 0) - { - UpdateFunc("", ResUI.FailedToRunCore); - return; - } + private async Task RunSpeedTestAsync(List selecteds) + { + var pid = -1; + pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); + if (pid < 0) + { + UpdateFunc("", ResUI.FailedToRunCore); + return; + } - var url = _config.SpeedTestItem.SpeedTestUrl; - var timeout = _config.SpeedTestItem.SpeedTestTimeout; + var url = _config.SpeedTestItem.SpeedTestUrl; + var timeout = _config.SpeedTestItem.SpeedTestTimeout; - DownloadService downloadHandle = new(); + DownloadService downloadHandle = new(); - foreach (var it in selecteds) - { - if (_exitLoop) - { - UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); - continue; - } - if (!it.AllowTest) - { - continue; - } - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - //if (it.delay < 0) - //{ - // UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip); - // continue; - //} - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "-1"); - UpdateFunc(it.IndexId, "", ResUI.Speedtesting); + foreach (var it in selecteds) + { + if (_exitLoop) + { + UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); + continue; + } + if (!it.AllowTest) + { + continue; + } + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + //if (it.delay < 0) + //{ + // UpdateFunc(it.indexId, "", ResUI.SpeedtestingSkip); + // continue; + //} + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "-1"); + UpdateFunc(it.IndexId, "", ResUI.Speedtesting); - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (item is null) continue; + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (item is null) + continue; - var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); + var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); - await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) => - { - decimal.TryParse(msg, out var dec); - if (dec > 0) - { - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, msg); - } - UpdateFunc(it.IndexId, "", msg); - }); - } + await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) => + { + decimal.TryParse(msg, out var dec); + if (dec > 0) + { + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, msg); + } + UpdateFunc(it.IndexId, "", msg); + }); + } - if (pid > 0) - { - await ProcUtils.ProcessKill(pid); - } - await ProfileExHandler.Instance.SaveTo(); - } + if (pid > 0) + { + await ProcUtils.ProcessKill(pid); + } + await ProfileExHandler.Instance.SaveTo(); + } - private async Task RunSpeedTestMulti(List selecteds) - { - var pid = -1; - pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); - if (pid < 0) - { - UpdateFunc("", ResUI.FailedToRunCore); - return; - } + private async Task RunSpeedTestMulti(List selecteds) + { + var pid = -1; + pid = await CoreHandler.Instance.LoadCoreConfigSpeedtest(selecteds); + if (pid < 0) + { + UpdateFunc("", ResUI.FailedToRunCore); + return; + } - var url = _config.SpeedTestItem.SpeedTestUrl; - var timeout = _config.SpeedTestItem.SpeedTestTimeout; + var url = _config.SpeedTestItem.SpeedTestUrl; + var timeout = _config.SpeedTestItem.SpeedTestTimeout; - DownloadService downloadHandle = new(); + DownloadService downloadHandle = new(); - foreach (var it in selecteds) - { - if (_exitLoop) - { - UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); - continue; - } + foreach (var it in selecteds) + { + if (_exitLoop) + { + UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); + continue; + } - if (!it.AllowTest) - { - continue; - } - if (it.ConfigType == EConfigType.Custom) - { - continue; - } - if (it.Delay < 0) - { - UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); - continue; - } - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "-1"); - UpdateFunc(it.IndexId, "", ResUI.Speedtesting); + if (!it.AllowTest) + { + continue; + } + if (it.ConfigType == EConfigType.Custom) + { + continue; + } + if (it.Delay < 0) + { + UpdateFunc(it.IndexId, "", ResUI.SpeedtestingSkip); + continue; + } + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, "-1"); + UpdateFunc(it.IndexId, "", ResUI.Speedtesting); - var item = await AppHandler.Instance.GetProfileItem(it.IndexId); - if (item is null) continue; + var item = await AppHandler.Instance.GetProfileItem(it.IndexId); + if (item is null) + continue; - var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); - _ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) => - { - decimal.TryParse(msg, out var dec); - if (dec > 0) - { - ProfileExHandler.Instance.SetTestSpeed(it.IndexId, msg); - } - UpdateFunc(it.IndexId, "", msg); - }); - await Task.Delay(2000); - } + var webProxy = new WebProxy($"socks5://{Global.Loopback}:{it.Port}"); + _ = downloadHandle.DownloadDataAsync(url, webProxy, timeout, (success, msg) => + { + decimal.TryParse(msg, out var dec); + if (dec > 0) + { + ProfileExHandler.Instance.SetTestSpeed(it.IndexId, msg); + } + UpdateFunc(it.IndexId, "", msg); + }); + await Task.Delay(2000); + } - await Task.Delay((timeout + 2) * 1000); + await Task.Delay((timeout + 2) * 1000); - if (pid > 0) - { - await ProcUtils.ProcessKill(pid); - } - await ProfileExHandler.Instance.SaveTo(); - } + if (pid > 0) + { + await ProcUtils.ProcessKill(pid); + } + await ProfileExHandler.Instance.SaveTo(); + } - private async Task RunMixedTestAsync(List selecteds) - { - await RunRealPingAsync(selecteds); + private async Task RunMixedTestAsync(List selecteds) + { + await RunRealPingAsync(selecteds); - await Task.Delay(1000); + await Task.Delay(1000); - await RunSpeedTestMulti(selecteds); - } + await RunSpeedTestMulti(selecteds); + } - private async Task GetRealPingTime(DownloadService downloadHandle, IWebProxy webProxy) - { - var responseTime = await downloadHandle.GetRealPingTime(_config.SpeedTestItem.SpeedPingTestUrl, webProxy, 10); - //string output = Utile.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; - return FormatOut(responseTime, Global.DelayUnit); - } + private async Task GetRealPingTime(DownloadService downloadHandle, IWebProxy webProxy) + { + var responseTime = await downloadHandle.GetRealPingTime(_config.SpeedTestItem.SpeedPingTestUrl, webProxy, 10); + //string output = Utile.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; + return FormatOut(responseTime, Global.DelayUnit); + } - private async Task GetTcpingTime(string url, int port) - { - var responseTime = -1; + private async Task GetTcpingTime(string url, int port) + { + var responseTime = -1; - try - { - if (!IPAddress.TryParse(url, out var ipAddress)) - { - var ipHostInfo = await Dns.GetHostEntryAsync(url); - ipAddress = ipHostInfo.AddressList.First(); - } + try + { + if (!IPAddress.TryParse(url, out var ipAddress)) + { + var ipHostInfo = await Dns.GetHostEntryAsync(url); + ipAddress = ipHostInfo.AddressList.First(); + } - var timer = Stopwatch.StartNew(); + var timer = Stopwatch.StartNew(); - IPEndPoint endPoint = new(ipAddress, port); - using Socket clientSocket = new(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + IPEndPoint endPoint = new(ipAddress, port); + using Socket clientSocket = new(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - var result = clientSocket.BeginConnect(endPoint, null, null); - if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5))) - throw new TimeoutException("connect timeout (5s): " + url); - clientSocket.EndConnect(result); + var result = clientSocket.BeginConnect(endPoint, null, null); + if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5))) + throw new TimeoutException("connect timeout (5s): " + url); + clientSocket.EndConnect(result); - timer.Stop(); - responseTime = (int)timer.Elapsed.TotalMilliseconds; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return responseTime; - } + timer.Stop(); + responseTime = (int)timer.Elapsed.TotalMilliseconds; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return responseTime; + } - private string FormatOut(object time, string unit) - { - return $"{time}"; - } + private string FormatOut(object time, string unit) + { + return $"{time}"; + } - private void UpdateFunc(string indexId, string delay, string speed = "") - { - _updateFunc?.Invoke(new() { IndexId = indexId, Delay = delay, Speed = speed }); - } - } -} \ No newline at end of file + private void UpdateFunc(string indexId, string delay, string speed = "") + { + _updateFunc?.Invoke(new() { IndexId = indexId, Delay = delay, Speed = speed }); + } + } +} diff --git a/v2rayN/ServiceLib/Services/Statistics/StatisticsSingboxService.cs b/v2rayN/ServiceLib/Services/Statistics/StatisticsSingboxService.cs index 2b5a737a..e7c0cba5 100644 --- a/v2rayN/ServiceLib/Services/Statistics/StatisticsSingboxService.cs +++ b/v2rayN/ServiceLib/Services/Statistics/StatisticsSingboxService.cs @@ -1,127 +1,128 @@ -using System.Net.WebSockets; +using System.Net.WebSockets; using System.Text; namespace ServiceLib.Services.Statistics { - public class StatisticsSingboxService - { - private Config _config; - private bool _exitFlag; - private ClientWebSocket? webSocket; - private Action? _updateFunc; - private string Url => $"ws://{Global.Loopback}:{AppHandler.Instance.StatePort2}/traffic"; - private static readonly string _tag = "StatisticsSingboxService"; + public class StatisticsSingboxService + { + private Config _config; + private bool _exitFlag; + private ClientWebSocket? webSocket; + private Action? _updateFunc; + private string Url => $"ws://{Global.Loopback}:{AppHandler.Instance.StatePort2}/traffic"; + private static readonly string _tag = "StatisticsSingboxService"; - public StatisticsSingboxService(Config config, Action updateFunc) - { - _config = config; - _updateFunc = updateFunc; - _exitFlag = false; + public StatisticsSingboxService(Config config, Action updateFunc) + { + _config = config; + _updateFunc = updateFunc; + _exitFlag = false; - Task.Run(Run); - } + Task.Run(Run); + } - private async void Init() - { - await Task.Delay(5000); + private async void Init() + { + await Task.Delay(5000); - try - { - if (webSocket == null) - { - webSocket = new ClientWebSocket(); - await webSocket.ConnectAsync(new Uri(Url), CancellationToken.None); - } - } - catch { } - } + try + { + if (webSocket == null) + { + webSocket = new ClientWebSocket(); + await webSocket.ConnectAsync(new Uri(Url), CancellationToken.None); + } + } + catch { } + } - public void Close() - { - try - { - _exitFlag = true; - if (webSocket != null) - { - webSocket.Abort(); - webSocket = null; - } - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - } + public void Close() + { + try + { + _exitFlag = true; + if (webSocket != null) + { + webSocket.Abort(); + webSocket = null; + } + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + } - private async void Run() - { - Init(); + private async void Run() + { + Init(); - while (!_exitFlag) - { - await Task.Delay(1000); - try - { - if (!_config.IsRunningCore(ECoreType.sing_box)) - { - continue; - } - if (webSocket != null) - { - if (webSocket.State == WebSocketState.Aborted - || webSocket.State == WebSocketState.Closed) - { - webSocket.Abort(); - webSocket = null; - Init(); - continue; - } + while (!_exitFlag) + { + await Task.Delay(1000); + try + { + if (!_config.IsRunningCore(ECoreType.sing_box)) + { + continue; + } + if (webSocket != null) + { + if (webSocket.State == WebSocketState.Aborted + || webSocket.State == WebSocketState.Closed) + { + webSocket.Abort(); + webSocket = null; + Init(); + continue; + } - if (webSocket.State != WebSocketState.Open) - { - continue; - } + if (webSocket.State != WebSocketState.Open) + { + continue; + } - var buffer = new byte[1024]; - var res = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); - while (!res.CloseStatus.HasValue) - { - var result = Encoding.UTF8.GetString(buffer, 0, res.Count); - if (Utils.IsNotEmpty(result)) - { - ParseOutput(result, out ulong up, out ulong down); + var buffer = new byte[1024]; + var res = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + while (!res.CloseStatus.HasValue) + { + var result = Encoding.UTF8.GetString(buffer, 0, res.Count); + if (Utils.IsNotEmpty(result)) + { + ParseOutput(result, out ulong up, out ulong down); - _updateFunc?.Invoke(new ServerSpeedItem() - { - ProxyUp = (long)(up / 1000), - ProxyDown = (long)(down / 1000) - }); - } - res = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); - } - } - } - catch - { - } - } - } + _updateFunc?.Invoke(new ServerSpeedItem() + { + ProxyUp = (long)(up / 1000), + ProxyDown = (long)(down / 1000) + }); + } + res = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + } + } + } + catch + { + } + } + } - private void ParseOutput(string source, out ulong up, out ulong down) - { - up = 0; down = 0; - try - { - var trafficItem = JsonUtils.Deserialize(source); - if (trafficItem != null) - { - up = trafficItem.Up; - down = trafficItem.Down; - } - } - catch - { - } - } - } -} \ No newline at end of file + private void ParseOutput(string source, out ulong up, out ulong down) + { + up = 0; + down = 0; + try + { + var trafficItem = JsonUtils.Deserialize(source); + if (trafficItem != null) + { + up = trafficItem.Up; + down = trafficItem.Down; + } + } + catch + { + } + } + } +} diff --git a/v2rayN/ServiceLib/Services/Statistics/StatisticsXrayService.cs b/v2rayN/ServiceLib/Services/Statistics/StatisticsXrayService.cs index fee5721f..bbe908b3 100644 --- a/v2rayN/ServiceLib/Services/Statistics/StatisticsXrayService.cs +++ b/v2rayN/ServiceLib/Services/Statistics/StatisticsXrayService.cs @@ -1,105 +1,106 @@ -namespace ServiceLib.Services.Statistics +namespace ServiceLib.Services.Statistics { - public class StatisticsXrayService - { - private const long linkBase = 1024; - private ServerSpeedItem _serverSpeedItem = new(); - private Config _config; - private bool _exitFlag; - private Action? _updateFunc; - private string Url => $"{Global.HttpProtocol}{Global.Loopback}:{AppHandler.Instance.StatePort}/debug/vars"; + public class StatisticsXrayService + { + private const long linkBase = 1024; + private ServerSpeedItem _serverSpeedItem = new(); + private Config _config; + private bool _exitFlag; + private Action? _updateFunc; + private string Url => $"{Global.HttpProtocol}{Global.Loopback}:{AppHandler.Instance.StatePort}/debug/vars"; - public StatisticsXrayService(Config config, Action updateFunc) - { - _config = config; - _updateFunc = updateFunc; - _exitFlag = false; + public StatisticsXrayService(Config config, Action updateFunc) + { + _config = config; + _updateFunc = updateFunc; + _exitFlag = false; - Task.Run(Run); - } + Task.Run(Run); + } - public void Close() - { - _exitFlag = true; - } + public void Close() + { + _exitFlag = true; + } - private async void Run() - { - while (!_exitFlag) - { - await Task.Delay(1000); - try - { - if (_config.RunningCoreType != ECoreType.Xray) - { - continue; - } + private async void Run() + { + while (!_exitFlag) + { + await Task.Delay(1000); + try + { + if (_config.RunningCoreType != ECoreType.Xray) + { + continue; + } - var result = await HttpClientHelper.Instance.TryGetAsync(Url); - if (result != null) - { - var server = ParseOutput(result) ?? new ServerSpeedItem(); - _updateFunc?.Invoke(server); - } - } - catch - { - // ignored - } - } - } + var result = await HttpClientHelper.Instance.TryGetAsync(Url); + if (result != null) + { + var server = ParseOutput(result) ?? new ServerSpeedItem(); + _updateFunc?.Invoke(server); + } + } + catch + { + // ignored + } + } + } - private ServerSpeedItem? ParseOutput(string result) - { - try - { - var source = JsonUtils.Deserialize(result); - if (source?.stats?.outbound == null) - { - return null; - } + private ServerSpeedItem? ParseOutput(string result) + { + try + { + var source = JsonUtils.Deserialize(result); + if (source?.stats?.outbound == null) + { + return null; + } - ServerSpeedItem server = new(); - foreach (string key in source.stats.outbound.Keys) - { - var value = source.stats.outbound[key]; - if (value == null) continue; - var state = JsonUtils.Deserialize(value.ToString()); + ServerSpeedItem server = new(); + foreach (string key in source.stats.outbound.Keys) + { + var value = source.stats.outbound[key]; + if (value == null) + continue; + var state = JsonUtils.Deserialize(value.ToString()); - if (key.StartsWith(Global.ProxyTag)) - { - server.ProxyUp += state.uplink / linkBase; - server.ProxyDown += state.downlink / linkBase; - } - else if (key == Global.DirectTag) - { - server.DirectUp = state.uplink / linkBase; - server.DirectDown = state.downlink / linkBase; - } - } + if (key.StartsWith(Global.ProxyTag)) + { + server.ProxyUp += state.uplink / linkBase; + server.ProxyDown += state.downlink / linkBase; + } + else if (key == Global.DirectTag) + { + server.DirectUp = state.uplink / linkBase; + server.DirectDown = state.downlink / linkBase; + } + } - if (server.DirectDown < _serverSpeedItem.DirectDown || server.ProxyDown < _serverSpeedItem.ProxyDown) - { - _serverSpeedItem = new(); - return null; - } + if (server.DirectDown < _serverSpeedItem.DirectDown || server.ProxyDown < _serverSpeedItem.ProxyDown) + { + _serverSpeedItem = new(); + return null; + } - ServerSpeedItem curItem = new() - { - ProxyUp = server.ProxyUp - _serverSpeedItem.ProxyUp, - ProxyDown = server.ProxyDown - _serverSpeedItem.ProxyDown, - DirectUp = server.DirectUp - _serverSpeedItem.DirectUp, - DirectDown = server.DirectDown - _serverSpeedItem.DirectDown, - }; - _serverSpeedItem = server; - return curItem; - } - catch - { - // ignored - } + ServerSpeedItem curItem = new() + { + ProxyUp = server.ProxyUp - _serverSpeedItem.ProxyUp, + ProxyDown = server.ProxyDown - _serverSpeedItem.ProxyDown, + DirectUp = server.DirectUp - _serverSpeedItem.DirectUp, + DirectDown = server.DirectDown - _serverSpeedItem.DirectDown, + }; + _serverSpeedItem = server; + return curItem; + } + catch + { + // ignored + } - return null; - } - } -} \ No newline at end of file + return null; + } + } +} diff --git a/v2rayN/ServiceLib/Services/UpdateService.cs b/v2rayN/ServiceLib/Services/UpdateService.cs index d737459c..0fe0a9bc 100644 --- a/v2rayN/ServiceLib/Services/UpdateService.cs +++ b/v2rayN/ServiceLib/Services/UpdateService.cs @@ -3,587 +3,587 @@ using System.Text.RegularExpressions; namespace ServiceLib.Services { - public class UpdateService - { - private Action? _updateFunc; - private int _timeout = 30; - private static readonly string _tag = "UpdateService"; + public class UpdateService + { + private Action? _updateFunc; + private int _timeout = 30; + private static readonly string _tag = "UpdateService"; - public async Task CheckUpdateGuiN(Config config, Action updateFunc, bool preRelease) - { - _updateFunc = updateFunc; - var url = string.Empty; - var fileName = string.Empty; + public async Task CheckUpdateGuiN(Config config, Action updateFunc, bool preRelease) + { + _updateFunc = updateFunc; + var url = string.Empty; + var fileName = string.Empty; - DownloadService downloadHandle = new(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - _updateFunc?.Invoke(false, ResUI.MsgDownloadV2rayCoreSuccessfully); - _updateFunc?.Invoke(true, Utils.UrlEncode(fileName)); - } - else - { - _updateFunc?.Invoke(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - _updateFunc?.Invoke(false, args.GetException().Message); - }; + DownloadService downloadHandle = new(); + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc?.Invoke(false, ResUI.MsgDownloadV2rayCoreSuccessfully); + _updateFunc?.Invoke(true, Utils.UrlEncode(fileName)); + } + else + { + _updateFunc?.Invoke(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc?.Invoke(false, args.GetException().Message); + }; - _updateFunc?.Invoke(false, string.Format(ResUI.MsgStartUpdating, ECoreType.v2rayN)); - var result = await CheckUpdateAsync(downloadHandle, ECoreType.v2rayN, preRelease); - if (result.Success) - { - _updateFunc?.Invoke(false, string.Format(ResUI.MsgParsingSuccessfully, ECoreType.v2rayN)); - _updateFunc?.Invoke(false, result.Msg); + _updateFunc?.Invoke(false, string.Format(ResUI.MsgStartUpdating, ECoreType.v2rayN)); + var result = await CheckUpdateAsync(downloadHandle, ECoreType.v2rayN, preRelease); + if (result.Success) + { + _updateFunc?.Invoke(false, string.Format(ResUI.MsgParsingSuccessfully, ECoreType.v2rayN)); + _updateFunc?.Invoke(false, result.Msg); - url = result.Data?.ToString(); - fileName = Utils.GetTempPath(Utils.GetGuid()); - await downloadHandle.DownloadFileAsync(url, fileName, true, _timeout); - } - else - { - _updateFunc?.Invoke(false, result.Msg); - } - } + url = result.Data?.ToString(); + fileName = Utils.GetTempPath(Utils.GetGuid()); + await downloadHandle.DownloadFileAsync(url, fileName, true, _timeout); + } + else + { + _updateFunc?.Invoke(false, result.Msg); + } + } - public async Task CheckUpdateCore(ECoreType type, Config config, Action updateFunc, bool preRelease) - { - _updateFunc = updateFunc; - var url = string.Empty; - var fileName = string.Empty; + public async Task CheckUpdateCore(ECoreType type, Config config, Action updateFunc, bool preRelease) + { + _updateFunc = updateFunc; + var url = string.Empty; + var fileName = string.Empty; - DownloadService downloadHandle = new(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - _updateFunc?.Invoke(false, ResUI.MsgDownloadV2rayCoreSuccessfully); - _updateFunc?.Invoke(false, ResUI.MsgUnpacking); + DownloadService downloadHandle = new(); + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc?.Invoke(false, ResUI.MsgDownloadV2rayCoreSuccessfully); + _updateFunc?.Invoke(false, ResUI.MsgUnpacking); - try - { - _updateFunc?.Invoke(true, fileName); - } - catch (Exception ex) - { - _updateFunc?.Invoke(false, ex.Message); - } - } - else - { - _updateFunc?.Invoke(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - _updateFunc?.Invoke(false, args.GetException().Message); - }; + try + { + _updateFunc?.Invoke(true, fileName); + } + catch (Exception ex) + { + _updateFunc?.Invoke(false, ex.Message); + } + } + else + { + _updateFunc?.Invoke(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc?.Invoke(false, args.GetException().Message); + }; - _updateFunc?.Invoke(false, string.Format(ResUI.MsgStartUpdating, type)); - var result = await CheckUpdateAsync(downloadHandle, type, preRelease); - if (result.Success) - { - _updateFunc?.Invoke(false, string.Format(ResUI.MsgParsingSuccessfully, type)); - _updateFunc?.Invoke(false, result.Msg); + _updateFunc?.Invoke(false, string.Format(ResUI.MsgStartUpdating, type)); + var result = await CheckUpdateAsync(downloadHandle, type, preRelease); + if (result.Success) + { + _updateFunc?.Invoke(false, string.Format(ResUI.MsgParsingSuccessfully, type)); + _updateFunc?.Invoke(false, result.Msg); - url = result.Data?.ToString(); - var ext = url.Contains(".tar.gz") ? ".tar.gz" : Path.GetExtension(url); - fileName = Utils.GetTempPath(Utils.GetGuid() + ext); - await downloadHandle.DownloadFileAsync(url, fileName, true, _timeout); - } - else - { - if (!result.Msg.IsNullOrEmpty()) - { - _updateFunc?.Invoke(false, result.Msg); - } - } - } + url = result.Data?.ToString(); + var ext = url.Contains(".tar.gz") ? ".tar.gz" : Path.GetExtension(url); + fileName = Utils.GetTempPath(Utils.GetGuid() + ext); + await downloadHandle.DownloadFileAsync(url, fileName, true, _timeout); + } + else + { + if (!result.Msg.IsNullOrEmpty()) + { + _updateFunc?.Invoke(false, result.Msg); + } + } + } - public async Task UpdateSubscriptionProcess(Config config, string subId, bool blProxy, Action updateFunc) - { - _updateFunc = updateFunc; + public async Task UpdateSubscriptionProcess(Config config, string subId, bool blProxy, Action updateFunc) + { + _updateFunc = updateFunc; - _updateFunc?.Invoke(false, ResUI.MsgUpdateSubscriptionStart); - var subItem = await AppHandler.Instance.SubItems(); + _updateFunc?.Invoke(false, ResUI.MsgUpdateSubscriptionStart); + var subItem = await AppHandler.Instance.SubItems(); - if (subItem is not { Count: > 0 }) - { - _updateFunc?.Invoke(false, ResUI.MsgNoValidSubscription); - return; - } + if (subItem is not { Count: > 0 }) + { + _updateFunc?.Invoke(false, ResUI.MsgNoValidSubscription); + return; + } - foreach (var item in subItem) - { - var id = item.Id.TrimEx(); - var url = item.Url.TrimEx(); - var userAgent = item.UserAgent.TrimEx(); - var hashCode = $"{item.Remarks}->"; - if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url) || (Utils.IsNotEmpty(subId) && item.Id != subId)) - { - //_updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); - continue; - } - if (!url.StartsWith(Global.HttpsProtocol) && !url.StartsWith(Global.HttpProtocol)) - { - continue; - } - if (item.Enabled == false) - { - _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}"); - continue; - } + foreach (var item in subItem) + { + var id = item.Id.TrimEx(); + var url = item.Url.TrimEx(); + var userAgent = item.UserAgent.TrimEx(); + var hashCode = $"{item.Remarks}->"; + if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url) || (Utils.IsNotEmpty(subId) && item.Id != subId)) + { + //_updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); + continue; + } + if (!url.StartsWith(Global.HttpsProtocol) && !url.StartsWith(Global.HttpProtocol)) + { + continue; + } + if (item.Enabled == false) + { + _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSkipSubscriptionUpdate}"); + continue; + } - var downloadHandle = new DownloadService(); - downloadHandle.Error += (sender2, args) => - { - _updateFunc?.Invoke(false, $"{hashCode}{args.GetException().Message}"); - }; + var downloadHandle = new DownloadService(); + downloadHandle.Error += (sender2, args) => + { + _updateFunc?.Invoke(false, $"{hashCode}{args.GetException().Message}"); + }; - _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); + _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); - //one url - url = Utils.GetPunycode(url); - //convert - if (Utils.IsNotEmpty(item.ConvertTarget)) - { - var subConvertUrl = Utils.IsNullOrEmpty(config.ConstItem.SubConvertUrl) ? Global.SubConvertUrls.FirstOrDefault() : config.ConstItem.SubConvertUrl; - url = string.Format(subConvertUrl!, Utils.UrlEncode(url)); - if (!url.Contains("target=")) - { - url += string.Format("&target={0}", item.ConvertTarget); - } - if (!url.Contains("config=")) - { - url += string.Format("&config={0}", Global.SubConvertConfig.FirstOrDefault()); - } - } - var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent); - if (blProxy && Utils.IsNullOrEmpty(result)) - { - result = await downloadHandle.TryDownloadString(url, false, userAgent); - } + //one url + url = Utils.GetPunycode(url); + //convert + if (Utils.IsNotEmpty(item.ConvertTarget)) + { + var subConvertUrl = Utils.IsNullOrEmpty(config.ConstItem.SubConvertUrl) ? Global.SubConvertUrls.FirstOrDefault() : config.ConstItem.SubConvertUrl; + url = string.Format(subConvertUrl!, Utils.UrlEncode(url)); + if (!url.Contains("target=")) + { + url += string.Format("&target={0}", item.ConvertTarget); + } + if (!url.Contains("config=")) + { + url += string.Format("&config={0}", Global.SubConvertConfig.FirstOrDefault()); + } + } + var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent); + if (blProxy && Utils.IsNullOrEmpty(result)) + { + result = await downloadHandle.TryDownloadString(url, false, userAgent); + } - //more url - if (Utils.IsNullOrEmpty(item.ConvertTarget) && Utils.IsNotEmpty(item.MoreUrl.TrimEx())) - { - if (Utils.IsNotEmpty(result) && Utils.IsBase64String(result)) - { - result = Utils.Base64Decode(result); - } + //more url + if (Utils.IsNullOrEmpty(item.ConvertTarget) && Utils.IsNotEmpty(item.MoreUrl.TrimEx())) + { + if (Utils.IsNotEmpty(result) && Utils.IsBase64String(result)) + { + result = Utils.Base64Decode(result); + } - var lstUrl = item.MoreUrl.TrimEx().Split(",") ?? []; - foreach (var it in lstUrl) - { - var url2 = Utils.GetPunycode(it); - if (Utils.IsNullOrEmpty(url2)) - { - continue; - } + var lstUrl = item.MoreUrl.TrimEx().Split(",") ?? []; + foreach (var it in lstUrl) + { + var url2 = Utils.GetPunycode(it); + if (Utils.IsNullOrEmpty(url2)) + { + continue; + } - var result2 = await downloadHandle.TryDownloadString(url2, blProxy, userAgent); - if (blProxy && Utils.IsNullOrEmpty(result2)) - { - result2 = await downloadHandle.TryDownloadString(url2, false, userAgent); - } - if (Utils.IsNotEmpty(result2)) - { - if (Utils.IsBase64String(result2)) - { - result += Utils.Base64Decode(result2); - } - else - { - result += result2; - } - } - } - } + var result2 = await downloadHandle.TryDownloadString(url2, blProxy, userAgent); + if (blProxy && Utils.IsNullOrEmpty(result2)) + { + result2 = await downloadHandle.TryDownloadString(url2, false, userAgent); + } + if (Utils.IsNotEmpty(result2)) + { + if (Utils.IsBase64String(result2)) + { + result += Utils.Base64Decode(result2); + } + else + { + result += result2; + } + } + } + } - if (Utils.IsNullOrEmpty(result)) - { - _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); - } - else - { - _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); - if (result?.Length < 99) - { - _updateFunc?.Invoke(false, $"{hashCode}{result}"); - } + if (Utils.IsNullOrEmpty(result)) + { + _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); + } + else + { + _updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}"); + if (result?.Length < 99) + { + _updateFunc?.Invoke(false, $"{hashCode}{result}"); + } - var ret = await ConfigHandler.AddBatchServers(config, result, id, true); - if (ret <= 0) - { - Logging.SaveLog("FailedImportSubscription"); - Logging.SaveLog(result); - } - _updateFunc?.Invoke(false, - ret > 0 - ? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}" - : $"{hashCode}{ResUI.MsgFailedImportSubscription}"); - } - _updateFunc?.Invoke(false, "-------------------------------------------------------"); + var ret = await ConfigHandler.AddBatchServers(config, result, id, true); + if (ret <= 0) + { + Logging.SaveLog("FailedImportSubscription"); + Logging.SaveLog(result); + } + _updateFunc?.Invoke(false, + ret > 0 + ? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}" + : $"{hashCode}{ResUI.MsgFailedImportSubscription}"); + } + _updateFunc?.Invoke(false, "-------------------------------------------------------"); - //await ConfigHandler.DedupServerList(config, id); - } + //await ConfigHandler.DedupServerList(config, id); + } - _updateFunc?.Invoke(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); - } + _updateFunc?.Invoke(true, $"{ResUI.MsgUpdateSubscriptionEnd}"); + } - public async Task UpdateGeoFileAll(Config config, Action updateFunc) - { - await UpdateGeoFile("geosite", config, updateFunc); - await UpdateGeoFile("geoip", config, updateFunc); - await UpdateSrsFileAll(config, updateFunc); - _updateFunc?.Invoke(true, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, "geo")); - } + public async Task UpdateGeoFileAll(Config config, Action updateFunc) + { + await UpdateGeoFile("geosite", config, updateFunc); + await UpdateGeoFile("geoip", config, updateFunc); + await UpdateSrsFileAll(config, updateFunc); + _updateFunc?.Invoke(true, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, "geo")); + } - public async Task RunAvailabilityCheck(Action updateFunc) - { - var downloadHandle = new DownloadService(); - var time = await downloadHandle.RunAvailabilityCheck(null); - var ip = Global.None; - if (time > 0) - { - var result = await downloadHandle.TryDownloadString(Global.IPAPIUrl, true, Global.IPAPIUrl); - var ipInfo = JsonUtils.Deserialize(result); - ip = $"({ipInfo?.country_code}) {ipInfo?.ip}"; - } + public async Task RunAvailabilityCheck(Action updateFunc) + { + var downloadHandle = new DownloadService(); + var time = await downloadHandle.RunAvailabilityCheck(null); + var ip = Global.None; + if (time > 0) + { + var result = await downloadHandle.TryDownloadString(Global.IPAPIUrl, true, Global.IPAPIUrl); + var ipInfo = JsonUtils.Deserialize(result); + ip = $"({ipInfo?.country_code}) {ipInfo?.ip}"; + } - updateFunc?.Invoke(false, string.Format(ResUI.TestMeOutput, time, ip)); - } + updateFunc?.Invoke(false, string.Format(ResUI.TestMeOutput, time, ip)); + } - #region CheckUpdate private + #region CheckUpdate private - private async Task CheckUpdateAsync(DownloadService downloadHandle, ECoreType type, bool preRelease) - { - try - { - var result = await GetRemoteVersion(downloadHandle, type, preRelease); - if (!result.Success || result.Data is null) - { - return result; - } - return await ParseDownloadUrl(type, (SemanticVersion)result.Data); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - _updateFunc?.Invoke(false, ex.Message); - return new RetResult(false, ex.Message); - } - } + private async Task CheckUpdateAsync(DownloadService downloadHandle, ECoreType type, bool preRelease) + { + try + { + var result = await GetRemoteVersion(downloadHandle, type, preRelease); + if (!result.Success || result.Data is null) + { + return result; + } + return await ParseDownloadUrl(type, (SemanticVersion)result.Data); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + _updateFunc?.Invoke(false, ex.Message); + return new RetResult(false, ex.Message); + } + } - private async Task GetRemoteVersion(DownloadService downloadHandle, ECoreType type, bool preRelease) - { - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); - var tagName = string.Empty; - if (preRelease) - { - var url = coreInfo?.ReleaseApiUrl; - var result = await downloadHandle.TryDownloadString(url, true, Global.AppName); - if (Utils.IsNullOrEmpty(result)) - { - return new RetResult(false, ""); - } + private async Task GetRemoteVersion(DownloadService downloadHandle, ECoreType type, bool preRelease) + { + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); + var tagName = string.Empty; + if (preRelease) + { + var url = coreInfo?.ReleaseApiUrl; + var result = await downloadHandle.TryDownloadString(url, true, Global.AppName); + if (Utils.IsNullOrEmpty(result)) + { + return new RetResult(false, ""); + } - var gitHubReleases = JsonUtils.Deserialize>(result); - var gitHubRelease = preRelease ? gitHubReleases?.First() : gitHubReleases?.First(r => r.Prerelease == false); - tagName = gitHubRelease?.TagName; - //var body = gitHubRelease?.Body; - } - else - { - var url = Path.Combine(coreInfo.Url, "latest"); - var lastUrl = await downloadHandle.UrlRedirectAsync(url, true); - if (lastUrl == null) - { - return new RetResult(false, ""); - } + var gitHubReleases = JsonUtils.Deserialize>(result); + var gitHubRelease = preRelease ? gitHubReleases?.First() : gitHubReleases?.First(r => r.Prerelease == false); + tagName = gitHubRelease?.TagName; + //var body = gitHubRelease?.Body; + } + else + { + var url = Path.Combine(coreInfo.Url, "latest"); + var lastUrl = await downloadHandle.UrlRedirectAsync(url, true); + if (lastUrl == null) + { + return new RetResult(false, ""); + } - tagName = lastUrl?.Split("/tag/").LastOrDefault(); - } - return new RetResult(true, "", new SemanticVersion(tagName)); - } + tagName = lastUrl?.Split("/tag/").LastOrDefault(); + } + return new RetResult(true, "", new SemanticVersion(tagName)); + } - private async Task GetCoreVersion(ECoreType type) - { - try - { - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); - string filePath = string.Empty; - foreach (var name in coreInfo.CoreExes) - { - var vName = Utils.GetBinPath(Utils.GetExeName(name), coreInfo.CoreType.ToString()); - if (File.Exists(vName)) - { - filePath = vName; - break; - } - } + private async Task GetCoreVersion(ECoreType type) + { + try + { + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); + string filePath = string.Empty; + foreach (var name in coreInfo.CoreExes) + { + var vName = Utils.GetBinPath(Utils.GetExeName(name), coreInfo.CoreType.ToString()); + if (File.Exists(vName)) + { + filePath = vName; + break; + } + } - if (!File.Exists(filePath)) - { - string msg = string.Format(ResUI.NotFoundCore, @"", "", ""); - //ShowMsg(true, msg); - return new SemanticVersion(""); - } + if (!File.Exists(filePath)) + { + string msg = string.Format(ResUI.NotFoundCore, @"", "", ""); + //ShowMsg(true, msg); + return new SemanticVersion(""); + } - var result = await Utils.GetCliWrapOutput(filePath, coreInfo.VersionArg); - var echo = result ?? ""; - string version = string.Empty; - switch (type) - { - case ECoreType.v2fly: - case ECoreType.Xray: - case ECoreType.v2fly_v5: - version = Regex.Match(echo, $"{coreInfo.Match} ([0-9.]+) \\(").Groups[1].Value; - break; + var result = await Utils.GetCliWrapOutput(filePath, coreInfo.VersionArg); + var echo = result ?? ""; + string version = string.Empty; + switch (type) + { + case ECoreType.v2fly: + case ECoreType.Xray: + case ECoreType.v2fly_v5: + version = Regex.Match(echo, $"{coreInfo.Match} ([0-9.]+) \\(").Groups[1].Value; + break; - case ECoreType.mihomo: - version = Regex.Match(echo, $"v[0-9.]+").Groups[0].Value; - break; + case ECoreType.mihomo: + version = Regex.Match(echo, $"v[0-9.]+").Groups[0].Value; + break; - case ECoreType.sing_box: - version = Regex.Match(echo, $"([0-9.]+)").Groups[1].Value; - break; - } - return new SemanticVersion(version); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - _updateFunc?.Invoke(false, ex.Message); - return new SemanticVersion(""); - } - } + case ECoreType.sing_box: + version = Regex.Match(echo, $"([0-9.]+)").Groups[1].Value; + break; + } + return new SemanticVersion(version); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + _updateFunc?.Invoke(false, ex.Message); + return new SemanticVersion(""); + } + } - private async Task ParseDownloadUrl(ECoreType type, SemanticVersion version) - { - try - { - var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); - SemanticVersion curVersion; - string message; - string? url; - switch (type) - { - case ECoreType.v2fly: - case ECoreType.Xray: - case ECoreType.v2fly_v5: - { - curVersion = await GetCoreVersion(type); - message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); - url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v")); - break; - } - case ECoreType.mihomo: - { - curVersion = await GetCoreVersion(type); - message = string.Format(ResUI.IsLatestCore, type, curVersion); - url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v")); - break; - } - case ECoreType.sing_box: - { - curVersion = await GetCoreVersion(type); - message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); - url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v"), version); - break; - } - case ECoreType.v2rayN: - { - curVersion = new SemanticVersion(Utils.GetVersionInfo()); - message = string.Format(ResUI.IsLatestN, type, curVersion); - url = string.Format(GetUrlFromCore(coreInfo), version); - break; - } - default: - throw new ArgumentException("Type"); - } + private async Task ParseDownloadUrl(ECoreType type, SemanticVersion version) + { + try + { + var coreInfo = CoreInfoHandler.Instance.GetCoreInfo(type); + SemanticVersion curVersion; + string message; + string? url; + switch (type) + { + case ECoreType.v2fly: + case ECoreType.Xray: + case ECoreType.v2fly_v5: + { + curVersion = await GetCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); + url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v")); + break; + } + case ECoreType.mihomo: + { + curVersion = await GetCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, type, curVersion); + url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v")); + break; + } + case ECoreType.sing_box: + { + curVersion = await GetCoreVersion(type); + message = string.Format(ResUI.IsLatestCore, type, curVersion.ToVersionString("v")); + url = string.Format(GetUrlFromCore(coreInfo), version.ToVersionString("v"), version); + break; + } + case ECoreType.v2rayN: + { + curVersion = new SemanticVersion(Utils.GetVersionInfo()); + message = string.Format(ResUI.IsLatestN, type, curVersion); + url = string.Format(GetUrlFromCore(coreInfo), version); + break; + } + default: + throw new ArgumentException("Type"); + } - if (curVersion >= version && version != new SemanticVersion(0, 0, 0)) - { - return new RetResult(false, message); - } + if (curVersion >= version && version != new SemanticVersion(0, 0, 0)) + { + return new RetResult(false, message); + } - return new RetResult(true, "", url); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - _updateFunc?.Invoke(false, ex.Message); - return new RetResult(false, ex.Message); - } - } + return new RetResult(true, "", url); + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + _updateFunc?.Invoke(false, ex.Message); + return new RetResult(false, ex.Message); + } + } - private string? GetUrlFromCore(CoreInfo? coreInfo) - { - if (Utils.IsWindows()) - { - //Check for standalone windows .Net version - if (coreInfo?.CoreType == ECoreType.v2rayN - && File.Exists(Path.Combine(Utils.StartupPath(), "wpfgfx_cor3.dll")) - && File.Exists(Path.Combine(Utils.StartupPath(), "D3DCompiler_47_cor3.dll")) - ) - { - return coreInfo?.DownloadUrlWin64?.Replace(".zip", "-SelfContained.zip"); - } + private string? GetUrlFromCore(CoreInfo? coreInfo) + { + if (Utils.IsWindows()) + { + //Check for standalone windows .Net version + if (coreInfo?.CoreType == ECoreType.v2rayN + && File.Exists(Path.Combine(Utils.StartupPath(), "wpfgfx_cor3.dll")) + && File.Exists(Path.Combine(Utils.StartupPath(), "D3DCompiler_47_cor3.dll")) + ) + { + return coreInfo?.DownloadUrlWin64?.Replace(".zip", "-SelfContained.zip"); + } - return RuntimeInformation.ProcessArchitecture switch - { - Architecture.Arm64 => coreInfo?.DownloadUrlWinArm64, - Architecture.X64 => coreInfo?.DownloadUrlWin64, - _ => null, - }; - } - else if (Utils.IsLinux()) - { - return RuntimeInformation.ProcessArchitecture switch - { - Architecture.Arm64 => coreInfo?.DownloadUrlLinuxArm64, - Architecture.X64 => coreInfo?.DownloadUrlLinux64, - _ => null, - }; - } - else if (Utils.IsOSX()) - { - return RuntimeInformation.ProcessArchitecture switch - { - Architecture.Arm64 => coreInfo?.DownloadUrlOSXArm64, - Architecture.X64 => coreInfo?.DownloadUrlOSX64, - _ => null, - }; - } - return null; - } + return RuntimeInformation.ProcessArchitecture switch + { + Architecture.Arm64 => coreInfo?.DownloadUrlWinArm64, + Architecture.X64 => coreInfo?.DownloadUrlWin64, + _ => null, + }; + } + else if (Utils.IsLinux()) + { + return RuntimeInformation.ProcessArchitecture switch + { + Architecture.Arm64 => coreInfo?.DownloadUrlLinuxArm64, + Architecture.X64 => coreInfo?.DownloadUrlLinux64, + _ => null, + }; + } + else if (Utils.IsOSX()) + { + return RuntimeInformation.ProcessArchitecture switch + { + Architecture.Arm64 => coreInfo?.DownloadUrlOSXArm64, + Architecture.X64 => coreInfo?.DownloadUrlOSX64, + _ => null, + }; + } + return null; + } - #endregion CheckUpdate private + #endregion CheckUpdate private - #region Geo private + #region Geo private - private async Task UpdateGeoFile(string geoName, Config config, Action updateFunc) - { - _updateFunc = updateFunc; + private async Task UpdateGeoFile(string geoName, Config config, Action updateFunc) + { + _updateFunc = updateFunc; - var geoUrl = string.IsNullOrEmpty(config?.ConstItem.GeoSourceUrl) - ? Global.GeoUrl - : config.ConstItem.GeoSourceUrl; + var geoUrl = string.IsNullOrEmpty(config?.ConstItem.GeoSourceUrl) + ? Global.GeoUrl + : config.ConstItem.GeoSourceUrl; - var fileName = $"{geoName}.dat"; - var targetPath = Utils.GetBinPath($"{fileName}"); - var url = string.Format(geoUrl, geoName); + var fileName = $"{geoName}.dat"; + var targetPath = Utils.GetBinPath($"{fileName}"); + var url = string.Format(geoUrl, geoName); - await DownloadGeoFile(url, fileName, targetPath, updateFunc); - } + await DownloadGeoFile(url, fileName, targetPath, updateFunc); + } - private async Task UpdateSrsFileAll(Config config, Action updateFunc) - { - _updateFunc = updateFunc; + private async Task UpdateSrsFileAll(Config config, Action updateFunc) + { + _updateFunc = updateFunc; - var geoipFiles = new List(); - var geoSiteFiles = new List(); + var geoipFiles = new List(); + var geoSiteFiles = new List(); - //Collect used files list - var routingItems = await AppHandler.Instance.RoutingItems(); - foreach (var routing in routingItems) - { - var rules = JsonUtils.Deserialize>(routing.RuleSet); - foreach (var item in rules ?? []) - { - foreach (var ip in item.Ip ?? []) - { - var prefix = "geoip:"; - if (ip.StartsWith(prefix)) - { - geoipFiles.Add(ip.Substring(prefix.Length)); - } - } + //Collect used files list + var routingItems = await AppHandler.Instance.RoutingItems(); + foreach (var routing in routingItems) + { + var rules = JsonUtils.Deserialize>(routing.RuleSet); + foreach (var item in rules ?? []) + { + foreach (var ip in item.Ip ?? []) + { + var prefix = "geoip:"; + if (ip.StartsWith(prefix)) + { + geoipFiles.Add(ip.Substring(prefix.Length)); + } + } - foreach (var domain in item.Domain ?? []) - { - var prefix = "geosite:"; - if (domain.StartsWith(prefix)) - { - geoSiteFiles.Add(domain.Substring(prefix.Length)); - } - } - } - } + foreach (var domain in item.Domain ?? []) + { + var prefix = "geosite:"; + if (domain.StartsWith(prefix)) + { + geoSiteFiles.Add(domain.Substring(prefix.Length)); + } + } + } + } - var path = Utils.GetBinPath("srss"); - if (!Directory.Exists(path)) - { - Directory.CreateDirectory(path); - } - foreach (var item in geoipFiles.Distinct()) - { - await UpdateSrsFile("geoip", item, config, updateFunc); - } + var path = Utils.GetBinPath("srss"); + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + foreach (var item in geoipFiles.Distinct()) + { + await UpdateSrsFile("geoip", item, config, updateFunc); + } - foreach (var item in geoSiteFiles.Distinct()) - { - await UpdateSrsFile("geosite", item, config, updateFunc); - } - } + foreach (var item in geoSiteFiles.Distinct()) + { + await UpdateSrsFile("geosite", item, config, updateFunc); + } + } - private async Task UpdateSrsFile(string type, string srsName, Config config, Action updateFunc) - { - var srsUrl = string.IsNullOrEmpty(config.ConstItem.SrsSourceUrl) - ? Global.SingboxRulesetUrl - : config.ConstItem.SrsSourceUrl; + private async Task UpdateSrsFile(string type, string srsName, Config config, Action updateFunc) + { + var srsUrl = string.IsNullOrEmpty(config.ConstItem.SrsSourceUrl) + ? Global.SingboxRulesetUrl + : config.ConstItem.SrsSourceUrl; - var fileName = $"{type}-{srsName}.srs"; - var targetPath = Path.Combine(Utils.GetBinPath("srss"), fileName); - var url = string.Format(srsUrl, type, $"{type}-{srsName}"); + var fileName = $"{type}-{srsName}.srs"; + var targetPath = Path.Combine(Utils.GetBinPath("srss"), fileName); + var url = string.Format(srsUrl, type, $"{type}-{srsName}"); - await DownloadGeoFile(url, fileName, targetPath, updateFunc); - } + await DownloadGeoFile(url, fileName, targetPath, updateFunc); + } - private async Task DownloadGeoFile(string url, string fileName, string targetPath, Action updateFunc) - { - var tmpFileName = Utils.GetTempPath(Utils.GetGuid()); + private async Task DownloadGeoFile(string url, string fileName, string targetPath, Action updateFunc) + { + var tmpFileName = Utils.GetTempPath(Utils.GetGuid()); - DownloadService downloadHandle = new(); - downloadHandle.UpdateCompleted += (sender2, args) => - { - if (args.Success) - { - _updateFunc?.Invoke(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, fileName)); + DownloadService downloadHandle = new(); + downloadHandle.UpdateCompleted += (sender2, args) => + { + if (args.Success) + { + _updateFunc?.Invoke(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, fileName)); - try - { - if (File.Exists(tmpFileName)) - { - File.Copy(tmpFileName, targetPath, true); + try + { + if (File.Exists(tmpFileName)) + { + File.Copy(tmpFileName, targetPath, true); - File.Delete(tmpFileName); - //_updateFunc?.Invoke(true, ""); - } - } - catch (Exception ex) - { - _updateFunc?.Invoke(false, ex.Message); - } - } - else - { - _updateFunc?.Invoke(false, args.Msg); - } - }; - downloadHandle.Error += (sender2, args) => - { - _updateFunc?.Invoke(false, args.GetException().Message); - }; + File.Delete(tmpFileName); + //_updateFunc?.Invoke(true, ""); + } + } + catch (Exception ex) + { + _updateFunc?.Invoke(false, ex.Message); + } + } + else + { + _updateFunc?.Invoke(false, args.Msg); + } + }; + downloadHandle.Error += (sender2, args) => + { + _updateFunc?.Invoke(false, args.GetException().Message); + }; - await downloadHandle.DownloadFileAsync(url, tmpFileName, true, _timeout); - } + await downloadHandle.DownloadFileAsync(url, tmpFileName, true, _timeout); + } - #endregion Geo private - } -} \ No newline at end of file + #endregion Geo private + } +} diff --git a/v2rayN/ServiceLib/ViewModels/AddServer2ViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddServer2ViewModel.cs index 50accd46..821a4a5b 100644 --- a/v2rayN/ServiceLib/ViewModels/AddServer2ViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/AddServer2ViewModel.cs @@ -1,116 +1,116 @@ +using System.Reactive; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; namespace ServiceLib.ViewModels { - public class AddServer2ViewModel : MyReactiveObject - { - [Reactive] - public ProfileItem SelectedSource { get; set; } + public class AddServer2ViewModel : MyReactiveObject + { + [Reactive] + public ProfileItem SelectedSource { get; set; } - [Reactive] - public string? CoreType { get; set; } + [Reactive] + public string? CoreType { get; set; } - public ReactiveCommand BrowseServerCmd { get; } - public ReactiveCommand EditServerCmd { get; } - public ReactiveCommand SaveServerCmd { get; } - public bool IsModified { get; set; } + public ReactiveCommand BrowseServerCmd { get; } + public ReactiveCommand EditServerCmd { get; } + public ReactiveCommand SaveServerCmd { get; } + public bool IsModified { get; set; } - public AddServer2ViewModel(ProfileItem profileItem, Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public AddServer2ViewModel(ProfileItem profileItem, Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - BrowseServerCmd = ReactiveCommand.CreateFromTask(async () => - { - _updateView?.Invoke(EViewAction.BrowseServer, null); - await Task.CompletedTask; - }); - EditServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditServer(); - }); - SaveServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveServerAsync(); - }); + BrowseServerCmd = ReactiveCommand.CreateFromTask(async () => + { + _updateView?.Invoke(EViewAction.BrowseServer, null); + await Task.CompletedTask; + }); + EditServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditServer(); + }); + SaveServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveServerAsync(); + }); - SelectedSource = profileItem.IndexId.IsNullOrEmpty() ? profileItem : JsonUtils.DeepCopy(profileItem); - CoreType = SelectedSource?.CoreType?.ToString(); - } + SelectedSource = profileItem.IndexId.IsNullOrEmpty() ? profileItem : JsonUtils.DeepCopy(profileItem); + CoreType = SelectedSource?.CoreType?.ToString(); + } - private async Task SaveServerAsync() - { - string remarks = SelectedSource.Remarks; - if (Utils.IsNullOrEmpty(remarks)) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); - return; - } + private async Task SaveServerAsync() + { + string remarks = SelectedSource.Remarks; + if (Utils.IsNullOrEmpty(remarks)) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); + return; + } - if (Utils.IsNullOrEmpty(SelectedSource.Address)) - { - NoticeHandler.Instance.Enqueue(ResUI.FillServerAddressCustom); - return; - } - SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType); + if (Utils.IsNullOrEmpty(SelectedSource.Address)) + { + NoticeHandler.Instance.Enqueue(ResUI.FillServerAddressCustom); + return; + } + SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType); - if (await ConfigHandler.EditCustomServer(_config, SelectedSource) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } + if (await ConfigHandler.EditCustomServer(_config, SelectedSource) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } - public async Task BrowseServer(string fileName) - { - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } + public async Task BrowseServer(string fileName) + { + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } - var item = await AppHandler.Instance.GetProfileItem(SelectedSource.IndexId); - item ??= SelectedSource; - item.Address = fileName; - if (await ConfigHandler.AddCustomServer(_config, item, false) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer); - if (Utils.IsNotEmpty(item.IndexId)) - { - SelectedSource = JsonUtils.DeepCopy(item); - } - IsModified = true; - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.FailedImportedCustomServer); - } - } + var item = await AppHandler.Instance.GetProfileItem(SelectedSource.IndexId); + item ??= SelectedSource; + item.Address = fileName; + if (await ConfigHandler.AddCustomServer(_config, item, false) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer); + if (Utils.IsNotEmpty(item.IndexId)) + { + SelectedSource = JsonUtils.DeepCopy(item); + } + IsModified = true; + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.FailedImportedCustomServer); + } + } - private async Task EditServer() - { - var address = SelectedSource.Address; - if (Utils.IsNullOrEmpty(address)) - { - NoticeHandler.Instance.Enqueue(ResUI.FillServerAddressCustom); - return; - } + private async Task EditServer() + { + var address = SelectedSource.Address; + if (Utils.IsNullOrEmpty(address)) + { + NoticeHandler.Instance.Enqueue(ResUI.FillServerAddressCustom); + return; + } - address = Utils.GetConfigPath(address); - if (File.Exists(address)) - { - ProcUtils.ProcessStart(address); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.FailedReadConfiguration); - } - await Task.CompletedTask; - } - } -} \ No newline at end of file + address = Utils.GetConfigPath(address); + if (File.Exists(address)) + { + ProcUtils.ProcessStart(address); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.FailedReadConfiguration); + } + await Task.CompletedTask; + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs index 39c77271..206c5cfe 100644 --- a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs @@ -1,97 +1,97 @@ -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Reactive; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class AddServerViewModel : MyReactiveObject - { - [Reactive] - public ProfileItem SelectedSource { get; set; } + public class AddServerViewModel : MyReactiveObject + { + [Reactive] + public ProfileItem SelectedSource { get; set; } - [Reactive] - public string? CoreType { get; set; } + [Reactive] + public string? CoreType { get; set; } - public ReactiveCommand SaveCmd { get; } + public ReactiveCommand SaveCmd { get; } - public AddServerViewModel(ProfileItem profileItem, Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public AddServerViewModel(ProfileItem profileItem, Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveServerAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveServerAsync(); + }); - if (profileItem.IndexId.IsNullOrEmpty()) - { - profileItem.Network = Global.DefaultNetwork; - profileItem.HeaderType = Global.None; - profileItem.RequestHost = ""; - profileItem.StreamSecurity = ""; - SelectedSource = profileItem; - } - else - { - SelectedSource = JsonUtils.DeepCopy(profileItem); - } - CoreType = SelectedSource?.CoreType?.ToString(); - } + if (profileItem.IndexId.IsNullOrEmpty()) + { + profileItem.Network = Global.DefaultNetwork; + profileItem.HeaderType = Global.None; + profileItem.RequestHost = ""; + profileItem.StreamSecurity = ""; + SelectedSource = profileItem; + } + else + { + SelectedSource = JsonUtils.DeepCopy(profileItem); + } + CoreType = SelectedSource?.CoreType?.ToString(); + } - private async Task SaveServerAsync() - { - if (Utils.IsNullOrEmpty(SelectedSource.Remarks)) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); - return; - } + private async Task SaveServerAsync() + { + if (Utils.IsNullOrEmpty(SelectedSource.Remarks)) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); + return; + } - if (Utils.IsNullOrEmpty(SelectedSource.Address)) - { - NoticeHandler.Instance.Enqueue(ResUI.FillServerAddress); - return; - } - var port = SelectedSource.Port.ToString(); - if (Utils.IsNullOrEmpty(port) || !Utils.IsNumeric(port) - || SelectedSource.Port <= 0 || SelectedSource.Port >= Global.MaxPort) - { - NoticeHandler.Instance.Enqueue(ResUI.FillCorrectServerPort); - return; - } - if (SelectedSource.ConfigType == EConfigType.Shadowsocks) - { - if (Utils.IsNullOrEmpty(SelectedSource.Id)) - { - NoticeHandler.Instance.Enqueue(ResUI.FillPassword); - return; - } - if (Utils.IsNullOrEmpty(SelectedSource.Security)) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectEncryption); - return; - } - } - if (SelectedSource.ConfigType != EConfigType.SOCKS - && SelectedSource.ConfigType != EConfigType.HTTP) - { - if (Utils.IsNullOrEmpty(SelectedSource.Id)) - { - NoticeHandler.Instance.Enqueue(ResUI.FillUUID); - return; - } - } - SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType); + if (Utils.IsNullOrEmpty(SelectedSource.Address)) + { + NoticeHandler.Instance.Enqueue(ResUI.FillServerAddress); + return; + } + var port = SelectedSource.Port.ToString(); + if (Utils.IsNullOrEmpty(port) || !Utils.IsNumeric(port) + || SelectedSource.Port <= 0 || SelectedSource.Port >= Global.MaxPort) + { + NoticeHandler.Instance.Enqueue(ResUI.FillCorrectServerPort); + return; + } + if (SelectedSource.ConfigType == EConfigType.Shadowsocks) + { + if (Utils.IsNullOrEmpty(SelectedSource.Id)) + { + NoticeHandler.Instance.Enqueue(ResUI.FillPassword); + return; + } + if (Utils.IsNullOrEmpty(SelectedSource.Security)) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectEncryption); + return; + } + } + if (SelectedSource.ConfigType != EConfigType.SOCKS + && SelectedSource.ConfigType != EConfigType.HTTP) + { + if (Utils.IsNullOrEmpty(SelectedSource.Id)) + { + NoticeHandler.Instance.Enqueue(ResUI.FillUUID); + return; + } + } + SelectedSource.CoreType = CoreType.IsNullOrEmpty() ? null : (ECoreType)Enum.Parse(typeof(ECoreType), CoreType); - if (await ConfigHandler.AddServer(_config, SelectedSource) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } - } -} \ No newline at end of file + if (await ConfigHandler.AddServer(_config, SelectedSource) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/BackupAndRestoreViewModel.cs b/v2rayN/ServiceLib/ViewModels/BackupAndRestoreViewModel.cs index 1b7fcc45..3ad9381e 100644 --- a/v2rayN/ServiceLib/ViewModels/BackupAndRestoreViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/BackupAndRestoreViewModel.cs @@ -1,182 +1,182 @@ -using ReactiveUI; +using System.Reactive; +using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; -using System.Reactive; namespace ServiceLib.ViewModels { - public class BackupAndRestoreViewModel : MyReactiveObject - { - private readonly string _guiConfigs = "guiConfigs"; - private static string BackupFileName => $"backup_{DateTime.Now:yyyyMMddHHmmss}.zip"; + public class BackupAndRestoreViewModel : MyReactiveObject + { + private readonly string _guiConfigs = "guiConfigs"; + private static string BackupFileName => $"backup_{DateTime.Now:yyyyMMddHHmmss}.zip"; - public ReactiveCommand RemoteBackupCmd { get; } - public ReactiveCommand RemoteRestoreCmd { get; } - public ReactiveCommand WebDavCheckCmd { get; } + public ReactiveCommand RemoteBackupCmd { get; } + public ReactiveCommand RemoteRestoreCmd { get; } + public ReactiveCommand WebDavCheckCmd { get; } - [Reactive] - public WebDavItem SelectedSource { get; set; } + [Reactive] + public WebDavItem SelectedSource { get; set; } - [Reactive] - public string OperationMsg { get; set; } + [Reactive] + public string OperationMsg { get; set; } - public BackupAndRestoreViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public BackupAndRestoreViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () => - { - await WebDavCheck(); - }); - RemoteBackupCmd = ReactiveCommand.CreateFromTask(async () => - { - await RemoteBackup(); - }); - RemoteRestoreCmd = ReactiveCommand.CreateFromTask(async () => - { - await RemoteRestore(); - }); + WebDavCheckCmd = ReactiveCommand.CreateFromTask(async () => + { + await WebDavCheck(); + }); + RemoteBackupCmd = ReactiveCommand.CreateFromTask(async () => + { + await RemoteBackup(); + }); + RemoteRestoreCmd = ReactiveCommand.CreateFromTask(async () => + { + await RemoteRestore(); + }); - SelectedSource = JsonUtils.DeepCopy(_config.WebDavItem); - } + SelectedSource = JsonUtils.DeepCopy(_config.WebDavItem); + } - private void DisplayOperationMsg(string msg = "") - { - OperationMsg = msg; - } + private void DisplayOperationMsg(string msg = "") + { + OperationMsg = msg; + } - private async Task WebDavCheck() - { - DisplayOperationMsg(); - _config.WebDavItem = SelectedSource; - await ConfigHandler.SaveConfig(_config); + private async Task WebDavCheck() + { + DisplayOperationMsg(); + _config.WebDavItem = SelectedSource; + await ConfigHandler.SaveConfig(_config); - var result = await WebDavHandler.Instance.CheckConnection(); - if (result) - { - DisplayOperationMsg(ResUI.OperationSuccess); - } - else - { - DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); - } - } + var result = await WebDavHandler.Instance.CheckConnection(); + if (result) + { + DisplayOperationMsg(ResUI.OperationSuccess); + } + else + { + DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); + } + } - private async Task RemoteBackup() - { - DisplayOperationMsg(); - var fileName = Utils.GetBackupPath(BackupFileName); - var result = await CreateZipFileFromDirectory(fileName); - if (result) - { - var result2 = await WebDavHandler.Instance.PutFile(fileName); - if (result2) - { - DisplayOperationMsg(ResUI.OperationSuccess); - return; - } - } + private async Task RemoteBackup() + { + DisplayOperationMsg(); + var fileName = Utils.GetBackupPath(BackupFileName); + var result = await CreateZipFileFromDirectory(fileName); + if (result) + { + var result2 = await WebDavHandler.Instance.PutFile(fileName); + if (result2) + { + DisplayOperationMsg(ResUI.OperationSuccess); + return; + } + } - DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); - } + DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); + } - private async Task RemoteRestore() - { - DisplayOperationMsg(); - var fileName = Utils.GetTempPath(Utils.GetGuid()); - var result = await WebDavHandler.Instance.GetRawFile(fileName); - if (result) - { - await LocalRestore(fileName); - return; - } + private async Task RemoteRestore() + { + DisplayOperationMsg(); + var fileName = Utils.GetTempPath(Utils.GetGuid()); + var result = await WebDavHandler.Instance.GetRawFile(fileName); + if (result) + { + await LocalRestore(fileName); + return; + } - DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); - } + DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); + } - public async Task LocalBackup(string fileName) - { - DisplayOperationMsg(); - var result = await CreateZipFileFromDirectory(fileName); - if (result) - { - DisplayOperationMsg(ResUI.OperationSuccess); - } - else - { - DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); - } + public async Task LocalBackup(string fileName) + { + DisplayOperationMsg(); + var result = await CreateZipFileFromDirectory(fileName); + if (result) + { + DisplayOperationMsg(ResUI.OperationSuccess); + } + else + { + DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); + } - return result; - } + return result; + } - public async Task LocalRestore(string fileName) - { - DisplayOperationMsg(); - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - //exist - if (!File.Exists(fileName)) - { - return; - } - //check - var lstFiles = FileManager.GetFilesFromZip(fileName); - if (lstFiles is null || !lstFiles.Any(t => t.Contains(_guiConfigs))) - { - DisplayOperationMsg(ResUI.LocalRestoreInvalidZipTips); - return; - } + public async Task LocalRestore(string fileName) + { + DisplayOperationMsg(); + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + //exist + if (!File.Exists(fileName)) + { + return; + } + //check + var lstFiles = FileManager.GetFilesFromZip(fileName); + if (lstFiles is null || !lstFiles.Any(t => t.Contains(_guiConfigs))) + { + DisplayOperationMsg(ResUI.LocalRestoreInvalidZipTips); + return; + } - //backup first - var fileBackup = Utils.GetBackupPath(BackupFileName); - var result = await CreateZipFileFromDirectory(fileBackup); - if (result) - { - var service = Locator.Current.GetService(); - await service?.MyAppExitAsync(true); - await SQLiteHelper.Instance.DisposeDbConnectionAsync(); + //backup first + var fileBackup = Utils.GetBackupPath(BackupFileName); + var result = await CreateZipFileFromDirectory(fileBackup); + if (result) + { + var service = Locator.Current.GetService(); + await service?.MyAppExitAsync(true); + await SQLiteHelper.Instance.DisposeDbConnectionAsync(); - var toPath = Utils.GetConfigPath(); - FileManager.ZipExtractToFile(fileName, toPath, ""); + var toPath = Utils.GetConfigPath(); + FileManager.ZipExtractToFile(fileName, toPath, ""); - if (Utils.IsWindows()) - { - ProcUtils.RebootAsAdmin(false); - } - else - { - if (Utils.UpgradeAppExists(out var upgradeFileName)) - { - ProcUtils.ProcessStart(upgradeFileName, Global.RebootAs, Utils.StartupPath()); - } - } - service?.Shutdown(true); - } - else - { - DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); - } - } + if (Utils.IsWindows()) + { + ProcUtils.RebootAsAdmin(false); + } + else + { + if (Utils.UpgradeAppExists(out var upgradeFileName)) + { + ProcUtils.ProcessStart(upgradeFileName, Global.RebootAs, Utils.StartupPath()); + } + } + service?.Shutdown(true); + } + else + { + DisplayOperationMsg(WebDavHandler.Instance.GetLastError()); + } + } - private async Task CreateZipFileFromDirectory(string fileName) - { - if (Utils.IsNullOrEmpty(fileName)) - { - return false; - } + private async Task CreateZipFileFromDirectory(string fileName) + { + if (Utils.IsNullOrEmpty(fileName)) + { + return false; + } - var configDir = Utils.GetConfigPath(); - var configDirZipTemp = Utils.GetTempPath($"v2rayN_{DateTime.Now:yyyyMMddHHmmss}"); - var configDirTemp = Path.Combine(configDirZipTemp, _guiConfigs); + var configDir = Utils.GetConfigPath(); + var configDirZipTemp = Utils.GetTempPath($"v2rayN_{DateTime.Now:yyyyMMddHHmmss}"); + var configDirTemp = Path.Combine(configDirZipTemp, _guiConfigs); - FileManager.CopyDirectory(configDir, configDirTemp, false, true, "cache.db"); - var ret = FileManager.CreateFromDirectory(configDirZipTemp, fileName); - Directory.Delete(configDirZipTemp, true); - return await Task.FromResult(ret); - } - } -} \ No newline at end of file + FileManager.CopyDirectory(configDir, configDirTemp, false, true, "cache.db"); + var ret = FileManager.CreateFromDirectory(configDirZipTemp, fileName); + Directory.Delete(configDirZipTemp, true); + return await Task.FromResult(ret); + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index a7db1070..cc50c9e9 100644 --- a/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -1,306 +1,308 @@ -using DynamicData; +using System.Reactive; +using System.Runtime.InteropServices; +using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; -using System.Reactive; -using System.Runtime.InteropServices; namespace ServiceLib.ViewModels { - public class CheckUpdateViewModel : MyReactiveObject - { - private const string _geo = "GeoFiles"; - private string _v2rayN = ECoreType.v2rayN.ToString(); - private List _lstUpdated = []; + public class CheckUpdateViewModel : MyReactiveObject + { + private const string _geo = "GeoFiles"; + private string _v2rayN = ECoreType.v2rayN.ToString(); + private List _lstUpdated = []; - private IObservableCollection _checkUpdateModel = new ObservableCollectionExtended(); - public IObservableCollection CheckUpdateModels => _checkUpdateModel; - public ReactiveCommand CheckUpdateCmd { get; } - [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } + private IObservableCollection _checkUpdateModel = new ObservableCollectionExtended(); + public IObservableCollection CheckUpdateModels => _checkUpdateModel; + public ReactiveCommand CheckUpdateCmd { get; } + [Reactive] public bool EnableCheckPreReleaseUpdate { get; set; } - public CheckUpdateViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public CheckUpdateViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - CheckUpdateCmd = ReactiveCommand.CreateFromTask(async () => - { - await CheckUpdate(); - }); + CheckUpdateCmd = ReactiveCommand.CreateFromTask(async () => + { + await CheckUpdate(); + }); - EnableCheckPreReleaseUpdate = _config.CheckUpdateItem.CheckPreReleaseUpdate; + EnableCheckPreReleaseUpdate = _config.CheckUpdateItem.CheckPreReleaseUpdate; - this.WhenAnyValue( - x => x.EnableCheckPreReleaseUpdate, - y => y == true) - .Subscribe(c => { _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); + this.WhenAnyValue( + x => x.EnableCheckPreReleaseUpdate, + y => y == true) + .Subscribe(c => { _config.CheckUpdateItem.CheckPreReleaseUpdate = EnableCheckPreReleaseUpdate; }); - RefreshCheckUpdateItems(); - } + RefreshCheckUpdateItems(); + } - private void RefreshCheckUpdateItems() - { - _checkUpdateModel.Clear(); + private void RefreshCheckUpdateItems() + { + _checkUpdateModel.Clear(); - if (RuntimeInformation.ProcessArchitecture != Architecture.X86) - { - _checkUpdateModel.Add(GetCheckUpdateModel(_v2rayN)); - //Not Windows and under Win10 - if (!(Utils.IsWindows() && Environment.OSVersion.Version.Major < 10)) - { - _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.Xray.ToString())); - _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString())); - _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString())); - } - } - _checkUpdateModel.Add(GetCheckUpdateModel(_geo)); - } + if (RuntimeInformation.ProcessArchitecture != Architecture.X86) + { + _checkUpdateModel.Add(GetCheckUpdateModel(_v2rayN)); + //Not Windows and under Win10 + if (!(Utils.IsWindows() && Environment.OSVersion.Version.Major < 10)) + { + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.Xray.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.mihomo.ToString())); + _checkUpdateModel.Add(GetCheckUpdateModel(ECoreType.sing_box.ToString())); + } + } + _checkUpdateModel.Add(GetCheckUpdateModel(_geo)); + } - private CheckUpdateModel GetCheckUpdateModel(string coreType) - { - return new() - { - IsSelected = _config.CheckUpdateItem.SelectedCoreTypes?.Contains(coreType) ?? true, - CoreType = coreType, - Remarks = ResUI.menuCheckUpdate, - }; - } + private CheckUpdateModel GetCheckUpdateModel(string coreType) + { + return new() + { + IsSelected = _config.CheckUpdateItem.SelectedCoreTypes?.Contains(coreType) ?? true, + CoreType = coreType, + Remarks = ResUI.menuCheckUpdate, + }; + } - private async Task SaveSelectedCoreTypes() - { - _config.CheckUpdateItem.SelectedCoreTypes = _checkUpdateModel.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList(); - await ConfigHandler.SaveConfig(_config); - } + private async Task SaveSelectedCoreTypes() + { + _config.CheckUpdateItem.SelectedCoreTypes = _checkUpdateModel.Where(t => t.IsSelected == true).Select(t => t.CoreType ?? "").ToList(); + await ConfigHandler.SaveConfig(_config); + } - private async Task CheckUpdate() - { - _lstUpdated.Clear(); - _lstUpdated = _checkUpdateModel.Where(x => x.IsSelected == true) - .Select(x => new CheckUpdateModel() { CoreType = x.CoreType }).ToList(); - await SaveSelectedCoreTypes(); + private async Task CheckUpdate() + { + _lstUpdated.Clear(); + _lstUpdated = _checkUpdateModel.Where(x => x.IsSelected == true) + .Select(x => new CheckUpdateModel() { CoreType = x.CoreType }).ToList(); + await SaveSelectedCoreTypes(); - for (var k = _checkUpdateModel.Count - 1; k >= 0; k--) - { - var item = _checkUpdateModel[k]; - if (item.IsSelected != true) continue; + for (var k = _checkUpdateModel.Count - 1; k >= 0; k--) + { + var item = _checkUpdateModel[k]; + if (item.IsSelected != true) + continue; - UpdateView(item.CoreType, "..."); - if (item.CoreType == _geo) - { - await CheckUpdateGeo(); - } - else if (item.CoreType == _v2rayN) - { - await CheckUpdateN(EnableCheckPreReleaseUpdate); - } - else if (item.CoreType == ECoreType.Xray.ToString()) - { - await CheckUpdateCore(item, EnableCheckPreReleaseUpdate); - } - else - { - await CheckUpdateCore(item, false); - } - } + UpdateView(item.CoreType, "..."); + if (item.CoreType == _geo) + { + await CheckUpdateGeo(); + } + else if (item.CoreType == _v2rayN) + { + await CheckUpdateN(EnableCheckPreReleaseUpdate); + } + else if (item.CoreType == ECoreType.Xray.ToString()) + { + await CheckUpdateCore(item, EnableCheckPreReleaseUpdate); + } + else + { + await CheckUpdateCore(item, false); + } + } - await UpdateFinished(); - } + await UpdateFinished(); + } - private void UpdatedPlusPlus(string coreType, string fileName) - { - var item = _lstUpdated.FirstOrDefault(x => x.CoreType == coreType); - if (item == null) - { - return; - } - item.IsFinished = true; - if (!fileName.IsNullOrEmpty()) - { - item.FileName = fileName; - } - } + private void UpdatedPlusPlus(string coreType, string fileName) + { + var item = _lstUpdated.FirstOrDefault(x => x.CoreType == coreType); + if (item == null) + { + return; + } + item.IsFinished = true; + if (!fileName.IsNullOrEmpty()) + { + item.FileName = fileName; + } + } - private async Task CheckUpdateGeo() - { - void _updateUI(bool success, string msg) - { - UpdateView(_geo, msg); - if (success) - { - UpdatedPlusPlus(_geo, ""); - } - } - await (new UpdateService()).UpdateGeoFileAll(_config, _updateUI) - .ContinueWith(t => - { - UpdatedPlusPlus(_geo, ""); - }); - } + private async Task CheckUpdateGeo() + { + void _updateUI(bool success, string msg) + { + UpdateView(_geo, msg); + if (success) + { + UpdatedPlusPlus(_geo, ""); + } + } + await new UpdateService().UpdateGeoFileAll(_config, _updateUI) + .ContinueWith(t => + { + UpdatedPlusPlus(_geo, ""); + }); + } - private async Task CheckUpdateN(bool preRelease) - { - void _updateUI(bool success, string msg) - { - UpdateView(_v2rayN, msg); - if (success) - { - UpdateView(_v2rayN, ResUI.OperationSuccess); - UpdatedPlusPlus(_v2rayN, msg); - } - } - await (new UpdateService()).CheckUpdateGuiN(_config, _updateUI, preRelease) - .ContinueWith(t => - { - UpdatedPlusPlus(_v2rayN, ""); - }); - } + private async Task CheckUpdateN(bool preRelease) + { + void _updateUI(bool success, string msg) + { + UpdateView(_v2rayN, msg); + if (success) + { + UpdateView(_v2rayN, ResUI.OperationSuccess); + UpdatedPlusPlus(_v2rayN, msg); + } + } + await new UpdateService().CheckUpdateGuiN(_config, _updateUI, preRelease) + .ContinueWith(t => + { + UpdatedPlusPlus(_v2rayN, ""); + }); + } - private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease) - { - void _updateUI(bool success, string msg) - { - UpdateView(model.CoreType, msg); - if (success) - { - UpdateView(model.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); + private async Task CheckUpdateCore(CheckUpdateModel model, bool preRelease) + { + void _updateUI(bool success, string msg) + { + UpdateView(model.CoreType, msg); + if (success) + { + UpdateView(model.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfullyMore); - UpdatedPlusPlus(model.CoreType, msg); - } - } - var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType); - await (new UpdateService()).CheckUpdateCore(type, _config, _updateUI, preRelease) - .ContinueWith(t => - { - UpdatedPlusPlus(model.CoreType, ""); - }); - } + UpdatedPlusPlus(model.CoreType, msg); + } + } + var type = (ECoreType)Enum.Parse(typeof(ECoreType), model.CoreType); + await new UpdateService().CheckUpdateCore(type, _config, _updateUI, preRelease) + .ContinueWith(t => + { + UpdatedPlusPlus(model.CoreType, ""); + }); + } - private async Task UpdateFinished() - { - if (_lstUpdated.Count > 0 && _lstUpdated.Count(x => x.IsFinished == true) == _lstUpdated.Count) - { - _updateView?.Invoke(EViewAction.DispatcherCheckUpdateFinished, false); - await Task.Delay(2000); - await UpgradeCore(); + private async Task UpdateFinished() + { + if (_lstUpdated.Count > 0 && _lstUpdated.Count(x => x.IsFinished == true) == _lstUpdated.Count) + { + _updateView?.Invoke(EViewAction.DispatcherCheckUpdateFinished, false); + await Task.Delay(2000); + await UpgradeCore(); - if (_lstUpdated.Any(x => x.CoreType == _v2rayN && x.IsFinished == true)) - { - await Task.Delay(1000); - UpgradeN(); - } - await Task.Delay(1000); - _updateView?.Invoke(EViewAction.DispatcherCheckUpdateFinished, true); - } - } + if (_lstUpdated.Any(x => x.CoreType == _v2rayN && x.IsFinished == true)) + { + await Task.Delay(1000); + UpgradeN(); + } + await Task.Delay(1000); + _updateView?.Invoke(EViewAction.DispatcherCheckUpdateFinished, true); + } + } - public void UpdateFinishedResult(bool blReload) - { - if (blReload) - { - Locator.Current.GetService()?.Reload(); - } - else - { - Locator.Current.GetService()?.CloseCore(); - } - } + public void UpdateFinishedResult(bool blReload) + { + if (blReload) + { + Locator.Current.GetService()?.Reload(); + } + else + { + Locator.Current.GetService()?.CloseCore(); + } + } - private void UpgradeN() - { - try - { - var fileName = _lstUpdated.FirstOrDefault(x => x.CoreType == _v2rayN)?.FileName; - if (fileName.IsNullOrEmpty()) - { - return; - } - if (!Utils.UpgradeAppExists(out _)) - { - UpdateView(_v2rayN, ResUI.UpgradeAppNotExistTip); - return; - } - Locator.Current.GetService()?.UpgradeApp(fileName); - } - catch (Exception ex) - { - UpdateView(_v2rayN, ex.Message); - } - } + private void UpgradeN() + { + try + { + var fileName = _lstUpdated.FirstOrDefault(x => x.CoreType == _v2rayN)?.FileName; + if (fileName.IsNullOrEmpty()) + { + return; + } + if (!Utils.UpgradeAppExists(out _)) + { + UpdateView(_v2rayN, ResUI.UpgradeAppNotExistTip); + return; + } + Locator.Current.GetService()?.UpgradeApp(fileName); + } + catch (Exception ex) + { + UpdateView(_v2rayN, ex.Message); + } + } - private async Task UpgradeCore() - { - foreach (var item in _lstUpdated) - { - if (item.FileName.IsNullOrEmpty()) - { - continue; - } + private async Task UpgradeCore() + { + foreach (var item in _lstUpdated) + { + if (item.FileName.IsNullOrEmpty()) + { + continue; + } - var fileName = item.FileName; - if (!File.Exists(fileName)) - { - continue; - } - var toPath = Utils.GetBinPath("", item.CoreType); + var fileName = item.FileName; + if (!File.Exists(fileName)) + { + continue; + } + var toPath = Utils.GetBinPath("", item.CoreType); - if (fileName.Contains(".tar.gz")) - { - FileManager.DecompressTarFile(fileName, toPath); - var dir = new DirectoryInfo(toPath); - if (dir.Exists) - { - foreach (var subDir in dir.GetDirectories()) - { - FileManager.CopyDirectory(subDir.FullName, toPath, false, true); - subDir.Delete(true); - } - } - } - else if (fileName.Contains(".gz")) - { - FileManager.DecompressFile(fileName, toPath, item.CoreType); - } - else - { - FileManager.ZipExtractToFile(fileName, toPath, "geo"); - } + if (fileName.Contains(".tar.gz")) + { + FileManager.DecompressTarFile(fileName, toPath); + var dir = new DirectoryInfo(toPath); + if (dir.Exists) + { + foreach (var subDir in dir.GetDirectories()) + { + FileManager.CopyDirectory(subDir.FullName, toPath, false, true); + subDir.Delete(true); + } + } + } + else if (fileName.Contains(".gz")) + { + FileManager.DecompressFile(fileName, toPath, item.CoreType); + } + else + { + FileManager.ZipExtractToFile(fileName, toPath, "geo"); + } - if (Utils.IsNonWindows()) - { - var filesList = (new DirectoryInfo(toPath)).GetFiles().Select(u => u.FullName).ToList(); - foreach (var file in filesList) - { - await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType.ToLower())); - } - } + if (Utils.IsNonWindows()) + { + var filesList = new DirectoryInfo(toPath).GetFiles().Select(u => u.FullName).ToList(); + foreach (var file in filesList) + { + await Utils.SetLinuxChmod(Path.Combine(toPath, item.CoreType.ToLower())); + } + } - UpdateView(item.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfully); + UpdateView(item.CoreType, ResUI.MsgUpdateV2rayCoreSuccessfully); - if (File.Exists(fileName)) - { - File.Delete(fileName); - } - } - } + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + } + } - private void UpdateView(string coreType, string msg) - { - var item = new CheckUpdateModel() - { - CoreType = coreType, - Remarks = msg, - }; - _updateView?.Invoke(EViewAction.DispatcherCheckUpdate, item); - } + private void UpdateView(string coreType, string msg) + { + var item = new CheckUpdateModel() + { + CoreType = coreType, + Remarks = msg, + }; + _updateView?.Invoke(EViewAction.DispatcherCheckUpdate, item); + } - public void UpdateViewResult(CheckUpdateModel model) - { - var found = _checkUpdateModel.FirstOrDefault(t => t.CoreType == model.CoreType); - if (found == null) return; - var itemCopy = JsonUtils.DeepCopy(found); - itemCopy.Remarks = model.Remarks; - _checkUpdateModel.Replace(found, itemCopy); - } - } -} \ No newline at end of file + public void UpdateViewResult(CheckUpdateModel model) + { + var found = _checkUpdateModel.FirstOrDefault(t => t.CoreType == model.CoreType); + if (found == null) + return; + var itemCopy = JsonUtils.DeepCopy(found); + itemCopy.Remarks = model.Remarks; + _checkUpdateModel.Replace(found, itemCopy); + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs b/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs index cb73ca31..cd53b48e 100644 --- a/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ClashConnectionsViewModel.cs @@ -1,143 +1,144 @@ +using System.Reactive; +using System.Reactive.Linq; using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; -using System.Reactive.Linq; namespace ServiceLib.ViewModels { - public class ClashConnectionsViewModel : MyReactiveObject - { - private IObservableCollection _connectionItems = new ObservableCollectionExtended(); - public IObservableCollection ConnectionItems => _connectionItems; + public class ClashConnectionsViewModel : MyReactiveObject + { + private IObservableCollection _connectionItems = new ObservableCollectionExtended(); + public IObservableCollection ConnectionItems => _connectionItems; - [Reactive] - public ClashConnectionModel SelectedSource { get; set; } + [Reactive] + public ClashConnectionModel SelectedSource { get; set; } - public ReactiveCommand ConnectionCloseCmd { get; } - public ReactiveCommand ConnectionCloseAllCmd { get; } + public ReactiveCommand ConnectionCloseCmd { get; } + public ReactiveCommand ConnectionCloseAllCmd { get; } - [Reactive] - public string HostFilter { get; set; } + [Reactive] + public string HostFilter { get; set; } - [Reactive] - public bool AutoRefresh { get; set; } + [Reactive] + public bool AutoRefresh { get; set; } - public ClashConnectionsViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; - AutoRefresh = _config.ClashUIItem.ConnectionsAutoRefresh; + public ClashConnectionsViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; + AutoRefresh = _config.ClashUIItem.ConnectionsAutoRefresh; - var canEditRemove = this.WhenAnyValue( - x => x.SelectedSource, - selectedSource => selectedSource != null && Utils.IsNotEmpty(selectedSource.Id)); + var canEditRemove = this.WhenAnyValue( + x => x.SelectedSource, + selectedSource => selectedSource != null && Utils.IsNotEmpty(selectedSource.Id)); - this.WhenAnyValue( - x => x.AutoRefresh, - y => y == true) - .Subscribe(c => { _config.ClashUIItem.ConnectionsAutoRefresh = AutoRefresh; }); - ConnectionCloseCmd = ReactiveCommand.CreateFromTask(async () => - { - await ClashConnectionClose(false); - }, canEditRemove); + this.WhenAnyValue( + x => x.AutoRefresh, + y => y == true) + .Subscribe(c => { _config.ClashUIItem.ConnectionsAutoRefresh = AutoRefresh; }); + ConnectionCloseCmd = ReactiveCommand.CreateFromTask(async () => + { + await ClashConnectionClose(false); + }, canEditRemove); - ConnectionCloseAllCmd = ReactiveCommand.CreateFromTask(async () => - { - await ClashConnectionClose(true); - }); + ConnectionCloseAllCmd = ReactiveCommand.CreateFromTask(async () => + { + await ClashConnectionClose(true); + }); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - var lastTime = DateTime.Now; + private async Task Init() + { + var lastTime = DateTime.Now; - Observable.Interval(TimeSpan.FromSeconds(5)) - .Subscribe(async x => - { - if (!(AutoRefresh && _config.UiItem.ShowInTaskbar && _config.IsRunningCore(ECoreType.sing_box))) - { - return; - } - var dtNow = DateTime.Now; - if (_config.ClashUIItem.ConnectionsRefreshInterval > 0) - { - if ((dtNow - lastTime).Minutes % _config.ClashUIItem.ConnectionsRefreshInterval == 0) - { - await GetClashConnections(); - lastTime = dtNow; - } - Task.Delay(1000).Wait(); - } - }); - await Task.CompletedTask; - } + Observable.Interval(TimeSpan.FromSeconds(5)) + .Subscribe(async x => + { + if (!(AutoRefresh && _config.UiItem.ShowInTaskbar && _config.IsRunningCore(ECoreType.sing_box))) + { + return; + } + var dtNow = DateTime.Now; + if (_config.ClashUIItem.ConnectionsRefreshInterval > 0) + { + if ((dtNow - lastTime).Minutes % _config.ClashUIItem.ConnectionsRefreshInterval == 0) + { + await GetClashConnections(); + lastTime = dtNow; + } + Task.Delay(1000).Wait(); + } + }); + await Task.CompletedTask; + } - private async Task GetClashConnections() - { - var ret = await ClashApiHandler.Instance.GetClashConnectionsAsync(_config); - if (ret == null) - { - return; - } + private async Task GetClashConnections() + { + var ret = await ClashApiHandler.Instance.GetClashConnectionsAsync(_config); + if (ret == null) + { + return; + } - _updateView?.Invoke(EViewAction.DispatcherRefreshConnections, ret?.connections); - } + _updateView?.Invoke(EViewAction.DispatcherRefreshConnections, ret?.connections); + } - public void RefreshConnections(List? connections) - { - _connectionItems.Clear(); + public void RefreshConnections(List? connections) + { + _connectionItems.Clear(); - var dtNow = DateTime.Now; - var lstModel = new List(); - foreach (var item in connections ?? new()) - { - var host = $"{(Utils.IsNullOrEmpty(item.metadata.host) ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}"; - if (HostFilter.IsNotEmpty() && !host.Contains(HostFilter)) - { - continue; - } + var dtNow = DateTime.Now; + var lstModel = new List(); + foreach (var item in connections ?? new()) + { + var host = $"{(Utils.IsNullOrEmpty(item.metadata.host) ? item.metadata.destinationIP : item.metadata.host)}:{item.metadata.destinationPort}"; + if (HostFilter.IsNotEmpty() && !host.Contains(HostFilter)) + { + continue; + } - ClashConnectionModel model = new(); + ClashConnectionModel model = new(); - model.Id = item.id; - model.Network = item.metadata.network; - model.Type = item.metadata.type; - model.Host = host; - var sp = (dtNow - item.start); - model.Time = sp.TotalSeconds < 0 ? 1 : sp.TotalSeconds; - model.Elapsed = sp.ToString(@"hh\:mm\:ss"); - item.chains?.Reverse(); - model.Chain = $"{item.rule} , {string.Join("->", item.chains ?? new())}"; + model.Id = item.id; + model.Network = item.metadata.network; + model.Type = item.metadata.type; + model.Host = host; + var sp = dtNow - item.start; + model.Time = sp.TotalSeconds < 0 ? 1 : sp.TotalSeconds; + model.Elapsed = sp.ToString(@"hh\:mm\:ss"); + item.chains?.Reverse(); + model.Chain = $"{item.rule} , {string.Join("->", item.chains ?? new())}"; - lstModel.Add(model); - } - if (lstModel.Count <= 0) { return; } + lstModel.Add(model); + } + if (lstModel.Count <= 0) + { return; } - _connectionItems.AddRange(lstModel); - } + _connectionItems.AddRange(lstModel); + } - public async Task ClashConnectionClose(bool all) - { - var id = string.Empty; - if (!all) - { - var item = SelectedSource; - if (item is null) - { - return; - } - id = item.Id; - } - else - { - _connectionItems.Clear(); - } - await ClashApiHandler.Instance.ClashConnectionClose(id); - await GetClashConnections(); - } - } -} \ No newline at end of file + public async Task ClashConnectionClose(bool all) + { + var id = string.Empty; + if (!all) + { + var item = SelectedSource; + if (item is null) + { + return; + } + id = item.Id; + } + else + { + _connectionItems.Clear(); + } + await ClashApiHandler.Instance.ClashConnectionClose(id); + await GetClashConnections(); + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs index 254d9f48..96d9e9a7 100644 --- a/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ClashProxiesViewModel.cs @@ -1,466 +1,466 @@ +using System.Reactive; +using System.Reactive.Linq; using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; -using System.Reactive.Linq; using static ServiceLib.Models.ClashProviders; using static ServiceLib.Models.ClashProxies; namespace ServiceLib.ViewModels { - public class ClashProxiesViewModel : MyReactiveObject - { - private Dictionary? _proxies; - private Dictionary? _providers; - private int _delayTimeout = 99999999; + public class ClashProxiesViewModel : MyReactiveObject + { + private Dictionary? _proxies; + private Dictionary? _providers; + private int _delayTimeout = 99999999; - private IObservableCollection _proxyGroups = new ObservableCollectionExtended(); - private IObservableCollection _proxyDetails = new ObservableCollectionExtended(); + private IObservableCollection _proxyGroups = new ObservableCollectionExtended(); + private IObservableCollection _proxyDetails = new ObservableCollectionExtended(); - public IObservableCollection ProxyGroups => _proxyGroups; - public IObservableCollection ProxyDetails => _proxyDetails; + public IObservableCollection ProxyGroups => _proxyGroups; + public IObservableCollection ProxyDetails => _proxyDetails; - [Reactive] - public ClashProxyModel SelectedGroup { get; set; } + [Reactive] + public ClashProxyModel SelectedGroup { get; set; } - [Reactive] - public ClashProxyModel SelectedDetail { get; set; } + [Reactive] + public ClashProxyModel SelectedDetail { get; set; } - public ReactiveCommand ProxiesReloadCmd { get; } - public ReactiveCommand ProxiesDelaytestCmd { get; } - public ReactiveCommand ProxiesDelaytestPartCmd { get; } - public ReactiveCommand ProxiesSelectActivityCmd { get; } + public ReactiveCommand ProxiesReloadCmd { get; } + public ReactiveCommand ProxiesDelaytestCmd { get; } + public ReactiveCommand ProxiesDelaytestPartCmd { get; } + public ReactiveCommand ProxiesSelectActivityCmd { get; } - [Reactive] - public int RuleModeSelected { get; set; } + [Reactive] + public int RuleModeSelected { get; set; } - [Reactive] - public int SortingSelected { get; set; } + [Reactive] + public int SortingSelected { get; set; } - [Reactive] - public bool AutoRefresh { get; set; } + [Reactive] + public bool AutoRefresh { get; set; } - public ClashProxiesViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public ClashProxiesViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () => - { - await ProxiesReload(); - }); - ProxiesDelaytestCmd = ReactiveCommand.CreateFromTask(async () => - { - await ProxiesDelayTest(true); - }); + ProxiesReloadCmd = ReactiveCommand.CreateFromTask(async () => + { + await ProxiesReload(); + }); + ProxiesDelaytestCmd = ReactiveCommand.CreateFromTask(async () => + { + await ProxiesDelayTest(true); + }); - ProxiesDelaytestPartCmd = ReactiveCommand.CreateFromTask(async () => - { - await ProxiesDelayTest(false); - }); - ProxiesSelectActivityCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetActiveProxy(); - }); + ProxiesDelaytestPartCmd = ReactiveCommand.CreateFromTask(async () => + { + await ProxiesDelayTest(false); + }); + ProxiesSelectActivityCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetActiveProxy(); + }); - SelectedGroup = new(); - SelectedDetail = new(); - AutoRefresh = _config.ClashUIItem.ProxiesAutoRefresh; - SortingSelected = _config.ClashUIItem.ProxiesSorting; - RuleModeSelected = (int)_config.ClashUIItem.RuleMode; + SelectedGroup = new(); + SelectedDetail = new(); + AutoRefresh = _config.ClashUIItem.ProxiesAutoRefresh; + SortingSelected = _config.ClashUIItem.ProxiesSorting; + RuleModeSelected = (int)_config.ClashUIItem.RuleMode; - this.WhenAnyValue( - x => x.SelectedGroup, - y => y != null && Utils.IsNotEmpty(y.Name)) - .Subscribe(c => RefreshProxyDetails(c)); + this.WhenAnyValue( + x => x.SelectedGroup, + y => y != null && Utils.IsNotEmpty(y.Name)) + .Subscribe(c => RefreshProxyDetails(c)); - this.WhenAnyValue( - x => x.RuleModeSelected, - y => y >= 0) - .Subscribe(async c => await DoRulemodeSelected(c)); + this.WhenAnyValue( + x => x.RuleModeSelected, + y => y >= 0) + .Subscribe(async c => await DoRulemodeSelected(c)); - this.WhenAnyValue( - x => x.SortingSelected, - y => y >= 0) - .Subscribe(c => DoSortingSelected(c)); + this.WhenAnyValue( + x => x.SortingSelected, + y => y >= 0) + .Subscribe(c => DoSortingSelected(c)); - this.WhenAnyValue( - x => x.AutoRefresh, - y => y == true) - .Subscribe(c => { _config.ClashUIItem.ProxiesAutoRefresh = AutoRefresh; }); + this.WhenAnyValue( + x => x.AutoRefresh, + y => y == true) + .Subscribe(c => { _config.ClashUIItem.ProxiesAutoRefresh = AutoRefresh; }); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - await ProxiesReload(); - _ = DelayTestTask(); - } + private async Task Init() + { + await ProxiesReload(); + _ = DelayTestTask(); + } - private async Task DoRulemodeSelected(bool c) - { - if (!c) - { - return; - } - if (_config.ClashUIItem.RuleMode == (ERuleMode)RuleModeSelected) - { - return; - } - await SetRuleModeCheck((ERuleMode)RuleModeSelected); - } + private async Task DoRulemodeSelected(bool c) + { + if (!c) + { + return; + } + if (_config.ClashUIItem.RuleMode == (ERuleMode)RuleModeSelected) + { + return; + } + await SetRuleModeCheck((ERuleMode)RuleModeSelected); + } - public async Task SetRuleModeCheck(ERuleMode mode) - { - if (_config.ClashUIItem.RuleMode == mode) - { - return; - } - await SetRuleMode(mode); - } + public async Task SetRuleModeCheck(ERuleMode mode) + { + if (_config.ClashUIItem.RuleMode == mode) + { + return; + } + await SetRuleMode(mode); + } - private void DoSortingSelected(bool c) - { - if (!c) - { - return; - } - if (SortingSelected != _config.ClashUIItem.ProxiesSorting) - { - _config.ClashUIItem.ProxiesSorting = SortingSelected; - } + private void DoSortingSelected(bool c) + { + if (!c) + { + return; + } + if (SortingSelected != _config.ClashUIItem.ProxiesSorting) + { + _config.ClashUIItem.ProxiesSorting = SortingSelected; + } - RefreshProxyDetails(c); - } + RefreshProxyDetails(c); + } - private void UpdateHandler(bool notify, string msg) - { - NoticeHandler.Instance.SendMessageEx(msg); - } + private void UpdateHandler(bool notify, string msg) + { + NoticeHandler.Instance.SendMessageEx(msg); + } - public async Task ProxiesReload() - { - await GetClashProxies(true); - await ProxiesDelayTest(); - } + public async Task ProxiesReload() + { + await GetClashProxies(true); + await ProxiesDelayTest(); + } - public async Task ProxiesDelayTest() - { - await ProxiesDelayTest(true); - } + public async Task ProxiesDelayTest() + { + await ProxiesDelayTest(true); + } - #region proxy function + #region proxy function - private async Task SetRuleMode(ERuleMode mode) - { - _config.ClashUIItem.RuleMode = mode; + private async Task SetRuleMode(ERuleMode mode) + { + _config.ClashUIItem.RuleMode = mode; - if (mode != ERuleMode.Unchanged) - { - Dictionary headers = new() - { - { "mode", mode.ToString().ToLower() } - }; - await ClashApiHandler.Instance.ClashConfigUpdate(headers); - } - } + if (mode != ERuleMode.Unchanged) + { + Dictionary headers = new() + { + { "mode", mode.ToString().ToLower() } + }; + await ClashApiHandler.Instance.ClashConfigUpdate(headers); + } + } - private async Task GetClashProxies(bool refreshUI) - { - var ret = await ClashApiHandler.Instance.GetClashProxiesAsync(_config); - if (ret?.Item1 == null || ret.Item2 == null) - { - return; - } - _proxies = ret.Item1.proxies; - _providers = ret?.Item2.providers; + private async Task GetClashProxies(bool refreshUI) + { + var ret = await ClashApiHandler.Instance.GetClashProxiesAsync(_config); + if (ret?.Item1 == null || ret.Item2 == null) + { + return; + } + _proxies = ret.Item1.proxies; + _providers = ret?.Item2.providers; - if (refreshUI) - { - _updateView?.Invoke(EViewAction.DispatcherRefreshProxyGroups, null); - } - } + if (refreshUI) + { + _updateView?.Invoke(EViewAction.DispatcherRefreshProxyGroups, null); + } + } - public void RefreshProxyGroups() - { - var selectedName = SelectedGroup?.Name; - _proxyGroups.Clear(); + public void RefreshProxyGroups() + { + var selectedName = SelectedGroup?.Name; + _proxyGroups.Clear(); - var proxyGroups = ClashApiHandler.Instance.GetClashProxyGroups(); - if (proxyGroups != null && proxyGroups.Count > 0) - { - foreach (var it in proxyGroups) - { - if (Utils.IsNullOrEmpty(it.name) || !_proxies.ContainsKey(it.name)) - { - continue; - } - var item = _proxies[it.name]; - if (!Global.allowSelectType.Contains(item.type.ToLower())) - { - continue; - } - _proxyGroups.Add(new ClashProxyModel() - { - Now = item.now, - Name = item.name, - Type = item.type - }); - } - } + var proxyGroups = ClashApiHandler.Instance.GetClashProxyGroups(); + if (proxyGroups != null && proxyGroups.Count > 0) + { + foreach (var it in proxyGroups) + { + if (Utils.IsNullOrEmpty(it.name) || !_proxies.ContainsKey(it.name)) + { + continue; + } + var item = _proxies[it.name]; + if (!Global.allowSelectType.Contains(item.type.ToLower())) + { + continue; + } + _proxyGroups.Add(new ClashProxyModel() + { + Now = item.now, + Name = item.name, + Type = item.type + }); + } + } - //from api - foreach (KeyValuePair kv in _proxies) - { - if (!Global.allowSelectType.Contains(kv.Value.type.ToLower())) - { - continue; - } - var item = _proxyGroups.Where(t => t.Name == kv.Key).FirstOrDefault(); - if (item != null && Utils.IsNotEmpty(item.Name)) - { - continue; - } - _proxyGroups.Add(new ClashProxyModel() - { - Now = kv.Value.now, - Name = kv.Key, - Type = kv.Value.type - }); - } + //from api + foreach (KeyValuePair kv in _proxies) + { + if (!Global.allowSelectType.Contains(kv.Value.type.ToLower())) + { + continue; + } + var item = _proxyGroups.Where(t => t.Name == kv.Key).FirstOrDefault(); + if (item != null && Utils.IsNotEmpty(item.Name)) + { + continue; + } + _proxyGroups.Add(new ClashProxyModel() + { + Now = kv.Value.now, + Name = kv.Key, + Type = kv.Value.type + }); + } - if (_proxyGroups != null && _proxyGroups.Count > 0) - { - if (selectedName != null && _proxyGroups.Any(t => t.Name == selectedName)) - { - SelectedGroup = _proxyGroups.FirstOrDefault(t => t.Name == selectedName); - } - else - { - SelectedGroup = _proxyGroups.First(); - } - } - else - { - SelectedGroup = new(); - } - } + if (_proxyGroups != null && _proxyGroups.Count > 0) + { + if (selectedName != null && _proxyGroups.Any(t => t.Name == selectedName)) + { + SelectedGroup = _proxyGroups.FirstOrDefault(t => t.Name == selectedName); + } + else + { + SelectedGroup = _proxyGroups.First(); + } + } + else + { + SelectedGroup = new(); + } + } - private void RefreshProxyDetails(bool c) - { - _proxyDetails.Clear(); - if (!c) - { - return; - } - var name = SelectedGroup?.Name; - if (Utils.IsNullOrEmpty(name)) - { - return; - } - if (_proxies == null) - { - return; - } + private void RefreshProxyDetails(bool c) + { + _proxyDetails.Clear(); + if (!c) + { + return; + } + var name = SelectedGroup?.Name; + if (Utils.IsNullOrEmpty(name)) + { + return; + } + if (_proxies == null) + { + return; + } - _proxies.TryGetValue(name, out var proxy); - if (proxy == null || proxy.all == null) - { - return; - } - var lstDetails = new List(); - foreach (var item in proxy.all) - { - var IsActive = item == proxy.now; + _proxies.TryGetValue(name, out var proxy); + if (proxy == null || proxy.all == null) + { + return; + } + var lstDetails = new List(); + foreach (var item in proxy.all) + { + var IsActive = item == proxy.now; - var proxy2 = TryGetProxy(item); - if (proxy2 == null) - { - continue; - } - int delay = -1; - if (proxy2.history.Count > 0) - { - delay = proxy2.history[proxy2.history.Count - 1].delay; - } + var proxy2 = TryGetProxy(item); + if (proxy2 == null) + { + continue; + } + int delay = -1; + if (proxy2.history.Count > 0) + { + delay = proxy2.history[proxy2.history.Count - 1].delay; + } - lstDetails.Add(new ClashProxyModel() - { - IsActive = IsActive, - Name = item, - Type = proxy2.type, - Delay = delay <= 0 ? _delayTimeout : delay, - DelayName = delay <= 0 ? string.Empty : $"{delay}ms", - }); - } - //sort - switch (SortingSelected) - { - case 0: - lstDetails = lstDetails.OrderBy(t => t.Delay).ToList(); - break; + lstDetails.Add(new ClashProxyModel() + { + IsActive = IsActive, + Name = item, + Type = proxy2.type, + Delay = delay <= 0 ? _delayTimeout : delay, + DelayName = delay <= 0 ? string.Empty : $"{delay}ms", + }); + } + //sort + switch (SortingSelected) + { + case 0: + lstDetails = lstDetails.OrderBy(t => t.Delay).ToList(); + break; - case 1: - lstDetails = lstDetails.OrderBy(t => t.Name).ToList(); - break; + case 1: + lstDetails = lstDetails.OrderBy(t => t.Name).ToList(); + break; - default: - break; - } - _proxyDetails.AddRange(lstDetails); - } + default: + break; + } + _proxyDetails.AddRange(lstDetails); + } - private ProxiesItem? TryGetProxy(string name) - { - if (_proxies is null) - return null; - _proxies.TryGetValue(name, out var proxy2); - if (proxy2 != null) - { - return proxy2; - } - //from providers - if (_providers != null) - { - foreach (KeyValuePair kv in _providers) - { - if (Global.proxyVehicleType.Contains(kv.Value.vehicleType.ToLower())) - { - var proxy3 = kv.Value.proxies.FirstOrDefault(t => t.name == name); - if (proxy3 != null) - { - return proxy3; - } - } - } - } - return null; - } + private ProxiesItem? TryGetProxy(string name) + { + if (_proxies is null) + return null; + _proxies.TryGetValue(name, out var proxy2); + if (proxy2 != null) + { + return proxy2; + } + //from providers + if (_providers != null) + { + foreach (KeyValuePair kv in _providers) + { + if (Global.proxyVehicleType.Contains(kv.Value.vehicleType.ToLower())) + { + var proxy3 = kv.Value.proxies.FirstOrDefault(t => t.name == name); + if (proxy3 != null) + { + return proxy3; + } + } + } + } + return null; + } - public async Task SetActiveProxy() - { - if (SelectedGroup == null || Utils.IsNullOrEmpty(SelectedGroup.Name)) - { - return; - } - if (SelectedDetail == null || Utils.IsNullOrEmpty(SelectedDetail.Name)) - { - return; - } - var name = SelectedGroup.Name; - if (Utils.IsNullOrEmpty(name)) - { - return; - } - var nameNode = SelectedDetail.Name; - if (Utils.IsNullOrEmpty(nameNode)) - { - return; - } - var selectedProxy = TryGetProxy(name); - if (selectedProxy == null || selectedProxy.type != "Selector") - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - return; - } + public async Task SetActiveProxy() + { + if (SelectedGroup == null || Utils.IsNullOrEmpty(SelectedGroup.Name)) + { + return; + } + if (SelectedDetail == null || Utils.IsNullOrEmpty(SelectedDetail.Name)) + { + return; + } + var name = SelectedGroup.Name; + if (Utils.IsNullOrEmpty(name)) + { + return; + } + var nameNode = SelectedDetail.Name; + if (Utils.IsNullOrEmpty(nameNode)) + { + return; + } + var selectedProxy = TryGetProxy(name); + if (selectedProxy == null || selectedProxy.type != "Selector") + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + return; + } - await ClashApiHandler.Instance.ClashSetActiveProxy(name, nameNode); + await ClashApiHandler.Instance.ClashSetActiveProxy(name, nameNode); - selectedProxy.now = nameNode; - var group = _proxyGroups.Where(it => it.Name == SelectedGroup.Name).FirstOrDefault(); - if (group != null) - { - group.Now = nameNode; - var group2 = JsonUtils.DeepCopy(group); - _proxyGroups.Replace(group, group2); + selectedProxy.now = nameNode; + var group = _proxyGroups.Where(it => it.Name == SelectedGroup.Name).FirstOrDefault(); + if (group != null) + { + group.Now = nameNode; + var group2 = JsonUtils.DeepCopy(group); + _proxyGroups.Replace(group, group2); - SelectedGroup = group2; - } - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } + SelectedGroup = group2; + } + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } - private async Task ProxiesDelayTest(bool blAll) - { - //UpdateHandler(false, "Clash Proxies Latency Test"); + private async Task ProxiesDelayTest(bool blAll) + { + //UpdateHandler(false, "Clash Proxies Latency Test"); - ClashApiHandler.Instance.ClashProxiesDelayTest(blAll, _proxyDetails.ToList(), async (item, result) => - { - if (item == null) - { - await GetClashProxies(true); - return; - } - if (Utils.IsNullOrEmpty(result)) - { - return; - } + ClashApiHandler.Instance.ClashProxiesDelayTest(blAll, _proxyDetails.ToList(), async (item, result) => + { + if (item == null) + { + await GetClashProxies(true); + return; + } + if (Utils.IsNullOrEmpty(result)) + { + return; + } - _updateView?.Invoke(EViewAction.DispatcherProxiesDelayTest, new SpeedTestResult() { IndexId = item.Name, Delay = result }); - }); - await Task.CompletedTask; - } + _updateView?.Invoke(EViewAction.DispatcherProxiesDelayTest, new SpeedTestResult() { IndexId = item.Name, Delay = result }); + }); + await Task.CompletedTask; + } - public void ProxiesDelayTestResult(SpeedTestResult result) - { - //UpdateHandler(false, $"{item.name}={result}"); - var detail = _proxyDetails.Where(it => it.Name == result.IndexId).FirstOrDefault(); - if (detail != null) - { - var dicResult = JsonUtils.Deserialize>(result.Delay); - if (dicResult != null && dicResult.ContainsKey("delay")) - { - detail.Delay = Convert.ToInt32(dicResult["delay"].ToString()); - detail.DelayName = $"{detail.Delay}ms"; - } - else if (dicResult != null && dicResult.ContainsKey("message")) - { - detail.Delay = _delayTimeout; - detail.DelayName = $"{dicResult["message"]}"; - } - else - { - detail.Delay = _delayTimeout; - detail.DelayName = string.Empty; - } - _proxyDetails.Replace(detail, JsonUtils.DeepCopy(detail)); - } - } + public void ProxiesDelayTestResult(SpeedTestResult result) + { + //UpdateHandler(false, $"{item.name}={result}"); + var detail = _proxyDetails.Where(it => it.Name == result.IndexId).FirstOrDefault(); + if (detail != null) + { + var dicResult = JsonUtils.Deserialize>(result.Delay); + if (dicResult != null && dicResult.ContainsKey("delay")) + { + detail.Delay = Convert.ToInt32(dicResult["delay"].ToString()); + detail.DelayName = $"{detail.Delay}ms"; + } + else if (dicResult != null && dicResult.ContainsKey("message")) + { + detail.Delay = _delayTimeout; + detail.DelayName = $"{dicResult["message"]}"; + } + else + { + detail.Delay = _delayTimeout; + detail.DelayName = string.Empty; + } + _proxyDetails.Replace(detail, JsonUtils.DeepCopy(detail)); + } + } - #endregion proxy function + #endregion proxy function - #region task + #region task - public async Task DelayTestTask() - { - var lastTime = DateTime.Now; - _ = Task.Run(async () => - { - while (true) - { - await Task.Delay(1000 * 60); + public async Task DelayTestTask() + { + var lastTime = DateTime.Now; + _ = Task.Run(async () => + { + while (true) + { + await Task.Delay(1000 * 60); - if (!(AutoRefresh && _config.UiItem.ShowInTaskbar && _config.IsRunningCore(ECoreType.sing_box))) - { - continue; - } - if (_config.ClashUIItem.ProxiesAutoDelayTestInterval <= 0) - { - continue; - } - var dtNow = DateTime.Now; - if ((dtNow - lastTime).Minutes % _config.ClashUIItem.ProxiesAutoDelayTestInterval != 0) - { - continue; - } - await ProxiesDelayTest(); - lastTime = dtNow; - } - }); - await Task.CompletedTask; - } + if (!(AutoRefresh && _config.UiItem.ShowInTaskbar && _config.IsRunningCore(ECoreType.sing_box))) + { + continue; + } + if (_config.ClashUIItem.ProxiesAutoDelayTestInterval <= 0) + { + continue; + } + var dtNow = DateTime.Now; + if ((dtNow - lastTime).Minutes % _config.ClashUIItem.ProxiesAutoDelayTestInterval != 0) + { + continue; + } + await ProxiesDelayTest(); + lastTime = dtNow; + } + }); + await Task.CompletedTask; + } - #endregion task - } -} \ No newline at end of file + #endregion task + } +} diff --git a/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs index 842a853d..652f19a5 100644 --- a/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/DNSSettingViewModel.cs @@ -1,117 +1,117 @@ +using System.Reactive; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; namespace ServiceLib.ViewModels { - public class DNSSettingViewModel : MyReactiveObject - { - [Reactive] public bool useSystemHosts { get; set; } - [Reactive] public string domainStrategy4Freedom { get; set; } - [Reactive] public string domainDNSAddress { get; set; } - [Reactive] public string normalDNS { get; set; } + public class DNSSettingViewModel : MyReactiveObject + { + [Reactive] public bool useSystemHosts { get; set; } + [Reactive] public string domainStrategy4Freedom { get; set; } + [Reactive] public string domainDNSAddress { get; set; } + [Reactive] public string normalDNS { get; set; } - [Reactive] public string domainStrategy4Freedom2 { get; set; } - [Reactive] public string domainDNSAddress2 { get; set; } - [Reactive] public string normalDNS2 { get; set; } - [Reactive] public string tunDNS2 { get; set; } + [Reactive] public string domainStrategy4Freedom2 { get; set; } + [Reactive] public string domainDNSAddress2 { get; set; } + [Reactive] public string normalDNS2 { get; set; } + [Reactive] public string tunDNS2 { get; set; } - public ReactiveCommand SaveCmd { get; } - public ReactiveCommand ImportDefConfig4V2rayCmd { get; } - public ReactiveCommand ImportDefConfig4SingboxCmd { get; } + public ReactiveCommand SaveCmd { get; } + public ReactiveCommand ImportDefConfig4V2rayCmd { get; } + public ReactiveCommand ImportDefConfig4SingboxCmd { get; } - public DNSSettingViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveSettingAsync(); - }); + public DNSSettingViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveSettingAsync(); + }); - ImportDefConfig4V2rayCmd = ReactiveCommand.CreateFromTask(async () => - { - normalDNS = Utils.GetEmbedText(Global.DNSV2rayNormalFileName); - await Task.CompletedTask; - }); + ImportDefConfig4V2rayCmd = ReactiveCommand.CreateFromTask(async () => + { + normalDNS = Utils.GetEmbedText(Global.DNSV2rayNormalFileName); + await Task.CompletedTask; + }); - ImportDefConfig4SingboxCmd = ReactiveCommand.CreateFromTask(async () => - { - normalDNS2 = Utils.GetEmbedText(Global.DNSSingboxNormalFileName); - tunDNS2 = Utils.GetEmbedText(Global.TunSingboxDNSFileName); - await Task.CompletedTask; - }); + ImportDefConfig4SingboxCmd = ReactiveCommand.CreateFromTask(async () => + { + normalDNS2 = Utils.GetEmbedText(Global.DNSSingboxNormalFileName); + tunDNS2 = Utils.GetEmbedText(Global.TunSingboxDNSFileName); + await Task.CompletedTask; + }); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); - useSystemHosts = item.UseSystemHosts; - domainStrategy4Freedom = item?.DomainStrategy4Freedom ?? string.Empty; - domainDNSAddress = item?.DomainDNSAddress ?? string.Empty; - normalDNS = item?.NormalDNS ?? string.Empty; + private async Task Init() + { + var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); + useSystemHosts = item.UseSystemHosts; + domainStrategy4Freedom = item?.DomainStrategy4Freedom ?? string.Empty; + domainDNSAddress = item?.DomainDNSAddress ?? string.Empty; + normalDNS = item?.NormalDNS ?? string.Empty; - var item2 = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); - domainStrategy4Freedom2 = item2?.DomainStrategy4Freedom ?? string.Empty; - domainDNSAddress2 = item2?.DomainDNSAddress ?? string.Empty; - normalDNS2 = item2?.NormalDNS ?? string.Empty; - tunDNS2 = item2?.TunDNS ?? string.Empty; - } + var item2 = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); + domainStrategy4Freedom2 = item2?.DomainStrategy4Freedom ?? string.Empty; + domainDNSAddress2 = item2?.DomainDNSAddress ?? string.Empty; + normalDNS2 = item2?.NormalDNS ?? string.Empty; + tunDNS2 = item2?.TunDNS ?? string.Empty; + } - private async Task SaveSettingAsync() - { - if (Utils.IsNotEmpty(normalDNS)) - { - var obj = JsonUtils.ParseJson(normalDNS); - if (obj != null && obj["servers"] != null) - { - } - else - { - if (normalDNS.Contains('{') || normalDNS.Contains('}')) - { - NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); - return; - } - } - } - if (Utils.IsNotEmpty(normalDNS2)) - { - var obj2 = JsonUtils.Deserialize(normalDNS2); - if (obj2 == null) - { - NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); - return; - } - } - if (Utils.IsNotEmpty(tunDNS2)) - { - var obj2 = JsonUtils.Deserialize(tunDNS2); - if (obj2 == null) - { - NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); - return; - } - } + private async Task SaveSettingAsync() + { + if (Utils.IsNotEmpty(normalDNS)) + { + var obj = JsonUtils.ParseJson(normalDNS); + if (obj != null && obj["servers"] != null) + { + } + else + { + if (normalDNS.Contains('{') || normalDNS.Contains('}')) + { + NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); + return; + } + } + } + if (Utils.IsNotEmpty(normalDNS2)) + { + var obj2 = JsonUtils.Deserialize(normalDNS2); + if (obj2 == null) + { + NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); + return; + } + } + if (Utils.IsNotEmpty(tunDNS2)) + { + var obj2 = JsonUtils.Deserialize(tunDNS2); + if (obj2 == null) + { + NoticeHandler.Instance.Enqueue(ResUI.FillCorrectDNSText); + return; + } + } - var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); - item.DomainStrategy4Freedom = domainStrategy4Freedom; - item.DomainDNSAddress = domainDNSAddress; - item.UseSystemHosts = useSystemHosts; - item.NormalDNS = normalDNS; - await ConfigHandler.SaveDNSItems(_config, item); + var item = await AppHandler.Instance.GetDNSItem(ECoreType.Xray); + item.DomainStrategy4Freedom = domainStrategy4Freedom; + item.DomainDNSAddress = domainDNSAddress; + item.UseSystemHosts = useSystemHosts; + item.NormalDNS = normalDNS; + await ConfigHandler.SaveDNSItems(_config, item); - var item2 = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); - item2.DomainStrategy4Freedom = domainStrategy4Freedom2; - item2.DomainDNSAddress = domainDNSAddress2; - item2.NormalDNS = JsonUtils.Serialize(JsonUtils.ParseJson(normalDNS2)); - item2.TunDNS = JsonUtils.Serialize(JsonUtils.ParseJson(tunDNS2)); - await ConfigHandler.SaveDNSItems(_config, item2); + var item2 = await AppHandler.Instance.GetDNSItem(ECoreType.sing_box); + item2.DomainStrategy4Freedom = domainStrategy4Freedom2; + item2.DomainDNSAddress = domainDNSAddress2; + item2.NormalDNS = JsonUtils.Serialize(JsonUtils.ParseJson(normalDNS2)); + item2.TunDNS = JsonUtils.Serialize(JsonUtils.ParseJson(tunDNS2)); + await ConfigHandler.SaveDNSItems(_config, item2); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - } -} \ No newline at end of file + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 8f60b5b1..45eb6a62 100644 --- a/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -1,614 +1,615 @@ +using System.Reactive; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; -using System.Reactive; namespace ServiceLib.ViewModels { - public class MainWindowViewModel : MyReactiveObject - { - #region Menu - - //servers - public ReactiveCommand AddVmessServerCmd { get; } - - public ReactiveCommand AddVlessServerCmd { get; } - public ReactiveCommand AddShadowsocksServerCmd { get; } - public ReactiveCommand AddSocksServerCmd { get; } - public ReactiveCommand AddHttpServerCmd { get; } - public ReactiveCommand AddTrojanServerCmd { get; } - public ReactiveCommand AddHysteria2ServerCmd { get; } - public ReactiveCommand AddTuicServerCmd { get; } - public ReactiveCommand AddWireguardServerCmd { get; } - public ReactiveCommand AddCustomServerCmd { get; } - public ReactiveCommand AddServerViaClipboardCmd { get; } - public ReactiveCommand AddServerViaScanCmd { get; } - public ReactiveCommand AddServerViaImageCmd { get; } - - //Subscription - public ReactiveCommand SubSettingCmd { get; } - - public ReactiveCommand SubUpdateCmd { get; } - public ReactiveCommand SubUpdateViaProxyCmd { get; } - public ReactiveCommand SubGroupUpdateCmd { get; } - public ReactiveCommand SubGroupUpdateViaProxyCmd { get; } - - //Setting - public ReactiveCommand OptionSettingCmd { get; } - - public ReactiveCommand RoutingSettingCmd { get; } - public ReactiveCommand DNSSettingCmd { get; } - public ReactiveCommand GlobalHotkeySettingCmd { get; } - public ReactiveCommand RebootAsAdminCmd { get; } - public ReactiveCommand ClearServerStatisticsCmd { get; } - public ReactiveCommand OpenTheFileLocationCmd { get; } - - //Presets - public ReactiveCommand RegionalPresetDefaultCmd { get; } - - public ReactiveCommand RegionalPresetRussiaCmd { get; } - - public ReactiveCommand RegionalPresetIranCmd { get; } - - public ReactiveCommand ReloadCmd { get; } - - [Reactive] - public bool BlReloadEnabled { get; set; } - - [Reactive] - public bool ShowClashUI { get; set; } - - [Reactive] - public int TabMainSelectedIndex { get; set; } - - #endregion Menu - - private bool _hasNextReloadJob = false; - - #region Init - - public MainWindowViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; - - #region WhenAnyValue && ReactiveCommand - - //servers - AddVmessServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.VMess); - }); - AddVlessServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.VLESS); - }); - AddShadowsocksServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.Shadowsocks); - }); - AddSocksServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.SOCKS); - }); - AddHttpServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.HTTP); - }); - AddTrojanServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.Trojan); - }); - AddHysteria2ServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.Hysteria2); - }); - AddTuicServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.TUIC); - }); - AddWireguardServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.WireGuard); - }); - AddCustomServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerAsync(true, EConfigType.Custom); - }); - AddServerViaClipboardCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerViaClipboardAsync(null); - }); - AddServerViaScanCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerViaScanAsync(); - }); - AddServerViaImageCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerViaImageAsync(); - }); - - //Subscription - SubSettingCmd = ReactiveCommand.CreateFromTask(async () => - { - await SubSettingAsync(); - }); - - SubUpdateCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess("", false); - }); - SubUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess("", true); - }); - SubGroupUpdateCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess(_config.SubIndexId, false); - }); - SubGroupUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess(_config.SubIndexId, true); - }); - - //Setting - OptionSettingCmd = ReactiveCommand.CreateFromTask(async () => - { - await OptionSettingAsync(); - }); - RoutingSettingCmd = ReactiveCommand.CreateFromTask(async () => - { - await RoutingSettingAsync(); - }); - DNSSettingCmd = ReactiveCommand.CreateFromTask(async () => - { - await DNSSettingAsync(); - }); - GlobalHotkeySettingCmd = ReactiveCommand.CreateFromTask(async () => - { - if (await _updateView?.Invoke(EViewAction.GlobalHotkeySettingWindow, null) == true) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } - }); - RebootAsAdminCmd = ReactiveCommand.CreateFromTask(async () => - { - await RebootAsAdmin(); - }); - ClearServerStatisticsCmd = ReactiveCommand.CreateFromTask(async () => - { - await ClearServerStatistics(); - }); - OpenTheFileLocationCmd = ReactiveCommand.CreateFromTask(async () => - { - await OpenTheFileLocation(); - }); - - ReloadCmd = ReactiveCommand.CreateFromTask(async () => - { - await Reload(); - }); - - RegionalPresetDefaultCmd = ReactiveCommand.CreateFromTask(async () => - { - await ApplyRegionalPreset(EPresetType.Default); - }); - - RegionalPresetRussiaCmd = ReactiveCommand.CreateFromTask(async () => - { - await ApplyRegionalPreset(EPresetType.Russia); - }); - - RegionalPresetIranCmd = ReactiveCommand.CreateFromTask(async () => - { - await ApplyRegionalPreset(EPresetType.Iran); - }); - - #endregion WhenAnyValue && ReactiveCommand - - _ = Init(); - } - - private async Task Init() - { - _config.UiItem.ShowInTaskbar = true; - - await ConfigHandler.InitBuiltinRouting(_config); - await ConfigHandler.InitBuiltinDNS(_config); - await ProfileExHandler.Instance.Init(); - await CoreHandler.Instance.Init(_config, UpdateHandler); - TaskHandler.Instance.RegUpdateTask(_config, UpdateTaskHandler); - - if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) - { - await StatisticsHandler.Instance.Init(_config, UpdateStatisticsHandler); - } - - BlReloadEnabled = true; - await Reload(); - await AutoHideStartup(); - Locator.Current.GetService()?.RefreshRoutingsMenu(); - } - - #endregion Init - - #region Actions - - private void UpdateHandler(bool notify, string msg) - { - NoticeHandler.Instance.SendMessage(msg); - if (notify) - { - NoticeHandler.Instance.Enqueue(msg); - } - } - - private void UpdateTaskHandler(bool success, string msg) - { - NoticeHandler.Instance.SendMessageEx(msg); - if (success) - { - var indexIdOld = _config.IndexId; - RefreshServers(); - if (indexIdOld != _config.IndexId) - { - _ = Reload(); - } - if (_config.UiItem.EnableAutoAdjustMainLvColWidth) - { - _updateView?.Invoke(EViewAction.AdjustMainLvColWidth, null); - } - } - } - - private void UpdateStatisticsHandler(ServerSpeedItem update) - { - if (!_config.UiItem.ShowInTaskbar) - { - return; - } - _updateView?.Invoke(EViewAction.DispatcherStatistics, update); - } - - public void SetStatisticsResult(ServerSpeedItem update) - { - if (_config.GuiItem.DisplayRealTimeSpeed) - { - Locator.Current.GetService()?.UpdateStatistics(update); - } - if (_config.GuiItem.EnableStatistics && (update.ProxyUp + update.ProxyDown) > 0 && DateTime.Now.Second % 9 == 0) - { - Locator.Current.GetService()?.UpdateStatistics(update); - } - } - - public async Task MyAppExitAsync(bool blWindowsShutDown) - { - try - { - Logging.SaveLog("MyAppExitAsync Begin"); - MessageBus.Current.SendMessage("", EMsgCommand.AppExit.ToString()); - - await ConfigHandler.SaveConfig(_config); - await SysProxyHandler.UpdateSysProxy(_config, true); - await ProfileExHandler.Instance.SaveTo(); - await StatisticsHandler.Instance.SaveTo(); - StatisticsHandler.Instance.Close(); - await CoreHandler.Instance.CoreStop(); - - Logging.SaveLog("MyAppExitAsync End"); - } - catch { } - finally - { - if (!blWindowsShutDown) - { - _updateView?.Invoke(EViewAction.Shutdown, false); - } - } - } - - public async Task UpgradeApp(string arg) - { - if (!Utils.UpgradeAppExists(out var upgradeFileName)) - { - NoticeHandler.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip); - Logging.SaveLog("UpgradeApp does not exist"); - return; - } - - var id = ProcUtils.ProcessStart(upgradeFileName, arg, Utils.StartupPath()); - if (id > 0) - { - await MyAppExitAsync(false); - } - } - - public void ShowHideWindow(bool? blShow) - { - _updateView?.Invoke(EViewAction.ShowHideWindow, blShow); - } - - public void Shutdown(bool byUser) - { - _updateView?.Invoke(EViewAction.Shutdown, byUser); - } - - #endregion Actions - - #region Servers && Groups - - private void RefreshServers() - { - MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); - } - - private void RefreshSubscriptions() - { - Locator.Current.GetService()?.RefreshSubscriptions(); - } - - #endregion Servers && Groups - - #region Add Servers - - public async Task AddServerAsync(bool blNew, EConfigType eConfigType) - { - ProfileItem item = new() - { - Subid = _config.SubIndexId, - ConfigType = eConfigType, - IsSub = false, - }; - - bool? ret = false; - if (eConfigType == EConfigType.Custom) - { - ret = await _updateView?.Invoke(EViewAction.AddServer2Window, item); - } - else - { - ret = await _updateView?.Invoke(EViewAction.AddServerWindow, item); - } - if (ret == true) - { - RefreshServers(); - if (item.IndexId == _config.IndexId) - { - await Reload(); - } - } - } - - public async Task AddServerViaClipboardAsync(string? clipboardData) - { - if (clipboardData == null) - { - await _updateView?.Invoke(EViewAction.AddServerViaClipboard, null); - return; - } - int ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false); - if (ret > 0) - { - RefreshSubscriptions(); - RefreshServers(); - NoticeHandler.Instance.Enqueue(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret)); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } - - public async Task AddServerViaScanAsync() - { - _updateView?.Invoke(EViewAction.ScanScreenTask, null); - await Task.CompletedTask; - } - - public async Task ScanScreenResult(byte[]? bytes) - { - var result = QRCodeHelper.ParseBarcode(bytes); - await AddScanResultAsync(result); - } - - public async Task AddServerViaImageAsync() - { - _updateView?.Invoke(EViewAction.ScanImageTask, null); - await Task.CompletedTask; - } - - public async Task ScanImageResult(string fileName) - { - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - - var result = QRCodeHelper.ParseBarcode(fileName); - await AddScanResultAsync(result); - } - - private async Task AddScanResultAsync(string? result) - { - if (Utils.IsNullOrEmpty(result)) - { - NoticeHandler.Instance.Enqueue(ResUI.NoValidQRcodeFound); - } - else - { - int ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false); - if (ret > 0) - { - RefreshSubscriptions(); - RefreshServers(); - NoticeHandler.Instance.Enqueue(ResUI.SuccessfullyImportedServerViaScan); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } - } - - #endregion Add Servers - - #region Subscription - - private async Task SubSettingAsync() - { - if (await _updateView?.Invoke(EViewAction.SubSettingWindow, null) == true) - { - RefreshSubscriptions(); - } - } - - public async Task UpdateSubscriptionProcess(string subId, bool blProxy) - { - await (new UpdateService()).UpdateSubscriptionProcess(_config, subId, blProxy, UpdateTaskHandler); - } - - #endregion Subscription - - #region Setting - - private async Task OptionSettingAsync() - { - var ret = await _updateView?.Invoke(EViewAction.OptionSettingWindow, null); - if (ret == true) - { - Locator.Current.GetService()?.InboundDisplayStatus(); - await Reload(); - } - } - - private async Task RoutingSettingAsync() - { - var ret = await _updateView?.Invoke(EViewAction.RoutingSettingWindow, null); - if (ret == true) - { - await ConfigHandler.InitBuiltinRouting(_config); - Locator.Current.GetService()?.RefreshRoutingsMenu(); - await Reload(); - } - } - - private async Task DNSSettingAsync() - { - var ret = await _updateView?.Invoke(EViewAction.DNSSettingWindow, null); - if (ret == true) - { - await Reload(); - } - } - - public async Task RebootAsAdmin() - { - ProcUtils.RebootAsAdmin(); - await MyAppExitAsync(false); - } - - private async Task ClearServerStatistics() - { - await StatisticsHandler.Instance.ClearAllServerStatistics(); - RefreshServers(); - } - - private async Task OpenTheFileLocation() - { - var path = Utils.StartupPath(); - if (Utils.IsWindows()) - { - ProcUtils.ProcessStart(path); - } - else if (Utils.IsLinux()) - { - ProcUtils.ProcessStart("nautilus", path); - } - else if (Utils.IsOSX()) - { - ProcUtils.ProcessStart("open", path); - } - await Task.CompletedTask; - } - - #endregion Setting - - #region core job - - public async Task Reload() - { - //If there are unfinished reload job, marked with next job. - if (!BlReloadEnabled) - { - _hasNextReloadJob = true; - return; - } - - BlReloadEnabled = false; - - await LoadCore(); - await SysProxyHandler.UpdateSysProxy(_config, false); - Locator.Current.GetService()?.TestServerAvailability(); - - _updateView?.Invoke(EViewAction.DispatcherReload, null); - - BlReloadEnabled = true; - if (_hasNextReloadJob) - { - _hasNextReloadJob = false; - await Reload(); - } - } - - public void ReloadResult() - { - // BlReloadEnabled = true; - //Locator.Current.GetService()?.ChangeSystemProxyAsync(_config.systemProxyItem.sysProxyType, false); - ShowClashUI = _config.IsRunningCore(ECoreType.sing_box); - if (ShowClashUI) - { - Locator.Current.GetService()?.ProxiesReload(); - } - else { TabMainSelectedIndex = 0; } - } - - private async Task LoadCore() - { - var node = await ConfigHandler.GetDefaultServer(_config); - await CoreHandler.Instance.LoadCore(node); - } - - public async Task CloseCore() - { - await ConfigHandler.SaveConfig(_config); - await CoreHandler.Instance.CoreStop(); - } - - private async Task AutoHideStartup() - { - if (_config.UiItem.AutoHideStartup) - { - ShowHideWindow(false); - } - await Task.CompletedTask; - } - - #endregion core job - - #region Presets - - public async Task ApplyRegionalPreset(EPresetType type) - { - await ConfigHandler.ApplyRegionalPreset(_config, type); - await ConfigHandler.InitRouting(_config); - Locator.Current.GetService()?.RefreshRoutingsMenu(); - - await ConfigHandler.SaveConfig(_config); - await new UpdateService().UpdateGeoFileAll(_config, UpdateHandler); - await Reload(); - } - - #endregion Presets - } -} \ No newline at end of file + public class MainWindowViewModel : MyReactiveObject + { + #region Menu + + //servers + public ReactiveCommand AddVmessServerCmd { get; } + + public ReactiveCommand AddVlessServerCmd { get; } + public ReactiveCommand AddShadowsocksServerCmd { get; } + public ReactiveCommand AddSocksServerCmd { get; } + public ReactiveCommand AddHttpServerCmd { get; } + public ReactiveCommand AddTrojanServerCmd { get; } + public ReactiveCommand AddHysteria2ServerCmd { get; } + public ReactiveCommand AddTuicServerCmd { get; } + public ReactiveCommand AddWireguardServerCmd { get; } + public ReactiveCommand AddCustomServerCmd { get; } + public ReactiveCommand AddServerViaClipboardCmd { get; } + public ReactiveCommand AddServerViaScanCmd { get; } + public ReactiveCommand AddServerViaImageCmd { get; } + + //Subscription + public ReactiveCommand SubSettingCmd { get; } + + public ReactiveCommand SubUpdateCmd { get; } + public ReactiveCommand SubUpdateViaProxyCmd { get; } + public ReactiveCommand SubGroupUpdateCmd { get; } + public ReactiveCommand SubGroupUpdateViaProxyCmd { get; } + + //Setting + public ReactiveCommand OptionSettingCmd { get; } + + public ReactiveCommand RoutingSettingCmd { get; } + public ReactiveCommand DNSSettingCmd { get; } + public ReactiveCommand GlobalHotkeySettingCmd { get; } + public ReactiveCommand RebootAsAdminCmd { get; } + public ReactiveCommand ClearServerStatisticsCmd { get; } + public ReactiveCommand OpenTheFileLocationCmd { get; } + + //Presets + public ReactiveCommand RegionalPresetDefaultCmd { get; } + + public ReactiveCommand RegionalPresetRussiaCmd { get; } + + public ReactiveCommand RegionalPresetIranCmd { get; } + + public ReactiveCommand ReloadCmd { get; } + + [Reactive] + public bool BlReloadEnabled { get; set; } + + [Reactive] + public bool ShowClashUI { get; set; } + + [Reactive] + public int TabMainSelectedIndex { get; set; } + + #endregion Menu + + private bool _hasNextReloadJob = false; + + #region Init + + public MainWindowViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; + + #region WhenAnyValue && ReactiveCommand + + //servers + AddVmessServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.VMess); + }); + AddVlessServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.VLESS); + }); + AddShadowsocksServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.Shadowsocks); + }); + AddSocksServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.SOCKS); + }); + AddHttpServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.HTTP); + }); + AddTrojanServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.Trojan); + }); + AddHysteria2ServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.Hysteria2); + }); + AddTuicServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.TUIC); + }); + AddWireguardServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.WireGuard); + }); + AddCustomServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerAsync(true, EConfigType.Custom); + }); + AddServerViaClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaClipboardAsync(null); + }); + AddServerViaScanCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaScanAsync(); + }); + AddServerViaImageCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaImageAsync(); + }); + + //Subscription + SubSettingCmd = ReactiveCommand.CreateFromTask(async () => + { + await SubSettingAsync(); + }); + + SubUpdateCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess("", false); + }); + SubUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess("", true); + }); + SubGroupUpdateCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(_config.SubIndexId, false); + }); + SubGroupUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(_config.SubIndexId, true); + }); + + //Setting + OptionSettingCmd = ReactiveCommand.CreateFromTask(async () => + { + await OptionSettingAsync(); + }); + RoutingSettingCmd = ReactiveCommand.CreateFromTask(async () => + { + await RoutingSettingAsync(); + }); + DNSSettingCmd = ReactiveCommand.CreateFromTask(async () => + { + await DNSSettingAsync(); + }); + GlobalHotkeySettingCmd = ReactiveCommand.CreateFromTask(async () => + { + if (await _updateView?.Invoke(EViewAction.GlobalHotkeySettingWindow, null) == true) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } + }); + RebootAsAdminCmd = ReactiveCommand.CreateFromTask(async () => + { + await RebootAsAdmin(); + }); + ClearServerStatisticsCmd = ReactiveCommand.CreateFromTask(async () => + { + await ClearServerStatistics(); + }); + OpenTheFileLocationCmd = ReactiveCommand.CreateFromTask(async () => + { + await OpenTheFileLocation(); + }); + + ReloadCmd = ReactiveCommand.CreateFromTask(async () => + { + await Reload(); + }); + + RegionalPresetDefaultCmd = ReactiveCommand.CreateFromTask(async () => + { + await ApplyRegionalPreset(EPresetType.Default); + }); + + RegionalPresetRussiaCmd = ReactiveCommand.CreateFromTask(async () => + { + await ApplyRegionalPreset(EPresetType.Russia); + }); + + RegionalPresetIranCmd = ReactiveCommand.CreateFromTask(async () => + { + await ApplyRegionalPreset(EPresetType.Iran); + }); + + #endregion WhenAnyValue && ReactiveCommand + + _ = Init(); + } + + private async Task Init() + { + _config.UiItem.ShowInTaskbar = true; + + await ConfigHandler.InitBuiltinRouting(_config); + await ConfigHandler.InitBuiltinDNS(_config); + await ProfileExHandler.Instance.Init(); + await CoreHandler.Instance.Init(_config, UpdateHandler); + TaskHandler.Instance.RegUpdateTask(_config, UpdateTaskHandler); + + if (_config.GuiItem.EnableStatistics || _config.GuiItem.DisplayRealTimeSpeed) + { + await StatisticsHandler.Instance.Init(_config, UpdateStatisticsHandler); + } + + BlReloadEnabled = true; + await Reload(); + await AutoHideStartup(); + Locator.Current.GetService()?.RefreshRoutingsMenu(); + } + + #endregion Init + + #region Actions + + private void UpdateHandler(bool notify, string msg) + { + NoticeHandler.Instance.SendMessage(msg); + if (notify) + { + NoticeHandler.Instance.Enqueue(msg); + } + } + + private void UpdateTaskHandler(bool success, string msg) + { + NoticeHandler.Instance.SendMessageEx(msg); + if (success) + { + var indexIdOld = _config.IndexId; + RefreshServers(); + if (indexIdOld != _config.IndexId) + { + _ = Reload(); + } + if (_config.UiItem.EnableAutoAdjustMainLvColWidth) + { + _updateView?.Invoke(EViewAction.AdjustMainLvColWidth, null); + } + } + } + + private void UpdateStatisticsHandler(ServerSpeedItem update) + { + if (!_config.UiItem.ShowInTaskbar) + { + return; + } + _updateView?.Invoke(EViewAction.DispatcherStatistics, update); + } + + public void SetStatisticsResult(ServerSpeedItem update) + { + if (_config.GuiItem.DisplayRealTimeSpeed) + { + Locator.Current.GetService()?.UpdateStatistics(update); + } + if (_config.GuiItem.EnableStatistics && (update.ProxyUp + update.ProxyDown) > 0 && DateTime.Now.Second % 9 == 0) + { + Locator.Current.GetService()?.UpdateStatistics(update); + } + } + + public async Task MyAppExitAsync(bool blWindowsShutDown) + { + try + { + Logging.SaveLog("MyAppExitAsync Begin"); + MessageBus.Current.SendMessage("", EMsgCommand.AppExit.ToString()); + + await ConfigHandler.SaveConfig(_config); + await SysProxyHandler.UpdateSysProxy(_config, true); + await ProfileExHandler.Instance.SaveTo(); + await StatisticsHandler.Instance.SaveTo(); + StatisticsHandler.Instance.Close(); + await CoreHandler.Instance.CoreStop(); + + Logging.SaveLog("MyAppExitAsync End"); + } + catch { } + finally + { + if (!blWindowsShutDown) + { + _updateView?.Invoke(EViewAction.Shutdown, false); + } + } + } + + public async Task UpgradeApp(string arg) + { + if (!Utils.UpgradeAppExists(out var upgradeFileName)) + { + NoticeHandler.Instance.SendMessageAndEnqueue(ResUI.UpgradeAppNotExistTip); + Logging.SaveLog("UpgradeApp does not exist"); + return; + } + + var id = ProcUtils.ProcessStart(upgradeFileName, arg, Utils.StartupPath()); + if (id > 0) + { + await MyAppExitAsync(false); + } + } + + public void ShowHideWindow(bool? blShow) + { + _updateView?.Invoke(EViewAction.ShowHideWindow, blShow); + } + + public void Shutdown(bool byUser) + { + _updateView?.Invoke(EViewAction.Shutdown, byUser); + } + + #endregion Actions + + #region Servers && Groups + + private void RefreshServers() + { + MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); + } + + private void RefreshSubscriptions() + { + Locator.Current.GetService()?.RefreshSubscriptions(); + } + + #endregion Servers && Groups + + #region Add Servers + + public async Task AddServerAsync(bool blNew, EConfigType eConfigType) + { + ProfileItem item = new() + { + Subid = _config.SubIndexId, + ConfigType = eConfigType, + IsSub = false, + }; + + bool? ret = false; + if (eConfigType == EConfigType.Custom) + { + ret = await _updateView?.Invoke(EViewAction.AddServer2Window, item); + } + else + { + ret = await _updateView?.Invoke(EViewAction.AddServerWindow, item); + } + if (ret == true) + { + RefreshServers(); + if (item.IndexId == _config.IndexId) + { + await Reload(); + } + } + } + + public async Task AddServerViaClipboardAsync(string? clipboardData) + { + if (clipboardData == null) + { + await _updateView?.Invoke(EViewAction.AddServerViaClipboard, null); + return; + } + int ret = await ConfigHandler.AddBatchServers(_config, clipboardData, _config.SubIndexId, false); + if (ret > 0) + { + RefreshSubscriptions(); + RefreshServers(); + NoticeHandler.Instance.Enqueue(string.Format(ResUI.SuccessfullyImportedServerViaClipboard, ret)); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } + + public async Task AddServerViaScanAsync() + { + _updateView?.Invoke(EViewAction.ScanScreenTask, null); + await Task.CompletedTask; + } + + public async Task ScanScreenResult(byte[]? bytes) + { + var result = QRCodeHelper.ParseBarcode(bytes); + await AddScanResultAsync(result); + } + + public async Task AddServerViaImageAsync() + { + _updateView?.Invoke(EViewAction.ScanImageTask, null); + await Task.CompletedTask; + } + + public async Task ScanImageResult(string fileName) + { + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + + var result = QRCodeHelper.ParseBarcode(fileName); + await AddScanResultAsync(result); + } + + private async Task AddScanResultAsync(string? result) + { + if (Utils.IsNullOrEmpty(result)) + { + NoticeHandler.Instance.Enqueue(ResUI.NoValidQRcodeFound); + } + else + { + int ret = await ConfigHandler.AddBatchServers(_config, result, _config.SubIndexId, false); + if (ret > 0) + { + RefreshSubscriptions(); + RefreshServers(); + NoticeHandler.Instance.Enqueue(ResUI.SuccessfullyImportedServerViaScan); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } + } + + #endregion Add Servers + + #region Subscription + + private async Task SubSettingAsync() + { + if (await _updateView?.Invoke(EViewAction.SubSettingWindow, null) == true) + { + RefreshSubscriptions(); + } + } + + public async Task UpdateSubscriptionProcess(string subId, bool blProxy) + { + await new UpdateService().UpdateSubscriptionProcess(_config, subId, blProxy, UpdateTaskHandler); + } + + #endregion Subscription + + #region Setting + + private async Task OptionSettingAsync() + { + var ret = await _updateView?.Invoke(EViewAction.OptionSettingWindow, null); + if (ret == true) + { + Locator.Current.GetService()?.InboundDisplayStatus(); + await Reload(); + } + } + + private async Task RoutingSettingAsync() + { + var ret = await _updateView?.Invoke(EViewAction.RoutingSettingWindow, null); + if (ret == true) + { + await ConfigHandler.InitBuiltinRouting(_config); + Locator.Current.GetService()?.RefreshRoutingsMenu(); + await Reload(); + } + } + + private async Task DNSSettingAsync() + { + var ret = await _updateView?.Invoke(EViewAction.DNSSettingWindow, null); + if (ret == true) + { + await Reload(); + } + } + + public async Task RebootAsAdmin() + { + ProcUtils.RebootAsAdmin(); + await MyAppExitAsync(false); + } + + private async Task ClearServerStatistics() + { + await StatisticsHandler.Instance.ClearAllServerStatistics(); + RefreshServers(); + } + + private async Task OpenTheFileLocation() + { + var path = Utils.StartupPath(); + if (Utils.IsWindows()) + { + ProcUtils.ProcessStart(path); + } + else if (Utils.IsLinux()) + { + ProcUtils.ProcessStart("nautilus", path); + } + else if (Utils.IsOSX()) + { + ProcUtils.ProcessStart("open", path); + } + await Task.CompletedTask; + } + + #endregion Setting + + #region core job + + public async Task Reload() + { + //If there are unfinished reload job, marked with next job. + if (!BlReloadEnabled) + { + _hasNextReloadJob = true; + return; + } + + BlReloadEnabled = false; + + await LoadCore(); + await SysProxyHandler.UpdateSysProxy(_config, false); + Locator.Current.GetService()?.TestServerAvailability(); + + _updateView?.Invoke(EViewAction.DispatcherReload, null); + + BlReloadEnabled = true; + if (_hasNextReloadJob) + { + _hasNextReloadJob = false; + await Reload(); + } + } + + public void ReloadResult() + { + // BlReloadEnabled = true; + //Locator.Current.GetService()?.ChangeSystemProxyAsync(_config.systemProxyItem.sysProxyType, false); + ShowClashUI = _config.IsRunningCore(ECoreType.sing_box); + if (ShowClashUI) + { + Locator.Current.GetService()?.ProxiesReload(); + } + else + { TabMainSelectedIndex = 0; } + } + + private async Task LoadCore() + { + var node = await ConfigHandler.GetDefaultServer(_config); + await CoreHandler.Instance.LoadCore(node); + } + + public async Task CloseCore() + { + await ConfigHandler.SaveConfig(_config); + await CoreHandler.Instance.CoreStop(); + } + + private async Task AutoHideStartup() + { + if (_config.UiItem.AutoHideStartup) + { + ShowHideWindow(false); + } + await Task.CompletedTask; + } + + #endregion core job + + #region Presets + + public async Task ApplyRegionalPreset(EPresetType type) + { + await ConfigHandler.ApplyRegionalPreset(_config, type); + await ConfigHandler.InitRouting(_config); + Locator.Current.GetService()?.RefreshRoutingsMenu(); + + await ConfigHandler.SaveConfig(_config); + await new UpdateService().UpdateGeoFileAll(_config, UpdateHandler); + await Reload(); + } + + #endregion Presets + } +} diff --git a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs index 54eb6ede..8c88c9a0 100644 --- a/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/MsgViewModel.cs @@ -1,122 +1,122 @@ -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Collections.Concurrent; using System.Text.RegularExpressions; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class MsgViewModel : MyReactiveObject - { - private ConcurrentQueue _queueMsg = new(); - private int _numMaxMsg = 500; - private bool _lastMsgFilterNotAvailable; - private bool _blLockShow = false; + public class MsgViewModel : MyReactiveObject + { + private ConcurrentQueue _queueMsg = new(); + private int _numMaxMsg = 500; + private bool _lastMsgFilterNotAvailable; + private bool _blLockShow = false; - [Reactive] - public string MsgFilter { get; set; } + [Reactive] + public string MsgFilter { get; set; } - [Reactive] - public bool AutoRefresh { get; set; } + [Reactive] + public bool AutoRefresh { get; set; } - public MsgViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; - MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty; - AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true; + public MsgViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; + MsgFilter = _config.MsgUIItem.MainMsgFilter ?? string.Empty; + AutoRefresh = _config.MsgUIItem.AutoRefresh ?? true; - this.WhenAnyValue( - x => x.MsgFilter) - .Subscribe(c => DoMsgFilter()); + this.WhenAnyValue( + x => x.MsgFilter) + .Subscribe(c => DoMsgFilter()); - this.WhenAnyValue( - x => x.AutoRefresh, - y => y == true) - .Subscribe(c => { _config.MsgUIItem.AutoRefresh = AutoRefresh; }); + this.WhenAnyValue( + x => x.AutoRefresh, + y => y == true) + .Subscribe(c => { _config.MsgUIItem.AutoRefresh = AutoRefresh; }); - MessageBus.Current.Listen(EMsgCommand.SendMsgView.ToString()).Subscribe(OnNext); - } + MessageBus.Current.Listen(EMsgCommand.SendMsgView.ToString()).Subscribe(OnNext); + } - private async void OnNext(string x) - { - await AppendQueueMsg(x); - } + private async void OnNext(string x) + { + await AppendQueueMsg(x); + } - private async Task AppendQueueMsg(string msg) - { - //if (msg == Global.CommandClearMsg) - //{ - // ClearMsg(); - // return; - //} - if (AutoRefresh == false) - { - return; - } - _ = EnqueueQueueMsg(msg); + private async Task AppendQueueMsg(string msg) + { + //if (msg == Global.CommandClearMsg) + //{ + // ClearMsg(); + // return; + //} + if (AutoRefresh == false) + { + return; + } + _ = EnqueueQueueMsg(msg); - if (_blLockShow) - { - return; - } - if (!_config.UiItem.ShowInTaskbar) - { - return; - } + if (_blLockShow) + { + return; + } + if (!_config.UiItem.ShowInTaskbar) + { + return; + } - _blLockShow = true; + _blLockShow = true; - await Task.Delay(500); - var txt = string.Join("", _queueMsg.ToArray()); - await _updateView?.Invoke(EViewAction.DispatcherShowMsg, txt); + await Task.Delay(500); + var txt = string.Join("", _queueMsg.ToArray()); + await _updateView?.Invoke(EViewAction.DispatcherShowMsg, txt); - _blLockShow = false; - } + _blLockShow = false; + } - private async Task EnqueueQueueMsg(string msg) - { - //filter msg - if (MsgFilter.IsNotEmpty() && !_lastMsgFilterNotAvailable) - { - try - { - if (!Regex.IsMatch(msg, MsgFilter)) - { - return; - } - } - catch (Exception ex) - { - _queueMsg.Enqueue(ex.Message); - _lastMsgFilterNotAvailable = true; - } - } + private async Task EnqueueQueueMsg(string msg) + { + //filter msg + if (MsgFilter.IsNotEmpty() && !_lastMsgFilterNotAvailable) + { + try + { + if (!Regex.IsMatch(msg, MsgFilter)) + { + return; + } + } + catch (Exception ex) + { + _queueMsg.Enqueue(ex.Message); + _lastMsgFilterNotAvailable = true; + } + } - //Enqueue - if (_queueMsg.Count > _numMaxMsg) - { - for (int k = 0; k < _queueMsg.Count - _numMaxMsg; k++) - { - _queueMsg.TryDequeue(out _); - } - } - _queueMsg.Enqueue(msg); - if (!msg.EndsWith(Environment.NewLine)) - { - _queueMsg.Enqueue(Environment.NewLine); - } - await Task.CompletedTask; - } + //Enqueue + if (_queueMsg.Count > _numMaxMsg) + { + for (int k = 0; k < _queueMsg.Count - _numMaxMsg; k++) + { + _queueMsg.TryDequeue(out _); + } + } + _queueMsg.Enqueue(msg); + if (!msg.EndsWith(Environment.NewLine)) + { + _queueMsg.Enqueue(Environment.NewLine); + } + await Task.CompletedTask; + } - public void ClearMsg() - { - _queueMsg.Clear(); - } + public void ClearMsg() + { + _queueMsg.Clear(); + } - private void DoMsgFilter() - { - _config.MsgUIItem.MainMsgFilter = MsgFilter; - _lastMsgFilterNotAvailable = false; - } - } -} \ No newline at end of file + private void DoMsgFilter() + { + _config.MsgUIItem.MainMsgFilter = MsgFilter; + _lastMsgFilterNotAvailable = false; + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs index 955adcbe..35642744 100644 --- a/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/OptionSettingViewModel.cs @@ -1,418 +1,418 @@ -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Reactive; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class OptionSettingViewModel : MyReactiveObject - { - #region Core + public class OptionSettingViewModel : MyReactiveObject + { + #region Core - [Reactive] public int localPort { get; set; } - [Reactive] public bool SecondLocalPortEnabled { get; set; } - [Reactive] public bool udpEnabled { get; set; } - [Reactive] public bool sniffingEnabled { get; set; } - public IList destOverride { get; set; } - [Reactive] public bool routeOnly { get; set; } - [Reactive] public bool allowLANConn { get; set; } - [Reactive] public bool newPort4LAN { get; set; } - [Reactive] public string user { get; set; } - [Reactive] public string pass { get; set; } - [Reactive] public bool muxEnabled { get; set; } - [Reactive] public bool logEnabled { get; set; } - [Reactive] public string loglevel { get; set; } - [Reactive] public bool defAllowInsecure { get; set; } - [Reactive] public string defFingerprint { get; set; } - [Reactive] public string defUserAgent { get; set; } - [Reactive] public string mux4SboxProtocol { get; set; } - [Reactive] public bool enableCacheFile4Sbox { get; set; } - [Reactive] public int hyUpMbps { get; set; } - [Reactive] public int hyDownMbps { get; set; } - [Reactive] public bool enableFragment { get; set; } + [Reactive] public int localPort { get; set; } + [Reactive] public bool SecondLocalPortEnabled { get; set; } + [Reactive] public bool udpEnabled { get; set; } + [Reactive] public bool sniffingEnabled { get; set; } + public IList destOverride { get; set; } + [Reactive] public bool routeOnly { get; set; } + [Reactive] public bool allowLANConn { get; set; } + [Reactive] public bool newPort4LAN { get; set; } + [Reactive] public string user { get; set; } + [Reactive] public string pass { get; set; } + [Reactive] public bool muxEnabled { get; set; } + [Reactive] public bool logEnabled { get; set; } + [Reactive] public string loglevel { get; set; } + [Reactive] public bool defAllowInsecure { get; set; } + [Reactive] public string defFingerprint { get; set; } + [Reactive] public string defUserAgent { get; set; } + [Reactive] public string mux4SboxProtocol { get; set; } + [Reactive] public bool enableCacheFile4Sbox { get; set; } + [Reactive] public int hyUpMbps { get; set; } + [Reactive] public int hyDownMbps { get; set; } + [Reactive] public bool enableFragment { get; set; } - #endregion Core + #endregion Core - #region Core KCP + #region Core KCP - //[Reactive] public int Kcpmtu { get; set; } - //[Reactive] public int Kcptti { get; set; } - //[Reactive] public int KcpuplinkCapacity { get; set; } - //[Reactive] public int KcpdownlinkCapacity { get; set; } - //[Reactive] public int KcpreadBufferSize { get; set; } - //[Reactive] public int KcpwriteBufferSize { get; set; } - //[Reactive] public bool Kcpcongestion { get; set; } + //[Reactive] public int Kcpmtu { get; set; } + //[Reactive] public int Kcptti { get; set; } + //[Reactive] public int KcpuplinkCapacity { get; set; } + //[Reactive] public int KcpdownlinkCapacity { get; set; } + //[Reactive] public int KcpreadBufferSize { get; set; } + //[Reactive] public int KcpwriteBufferSize { get; set; } + //[Reactive] public bool Kcpcongestion { get; set; } - #endregion Core KCP + #endregion Core KCP - #region UI + #region UI - [Reactive] public bool AutoRun { get; set; } - [Reactive] public bool EnableStatistics { get; set; } - [Reactive] public bool KeepOlderDedupl { get; set; } - [Reactive] public bool DisplayRealTimeSpeed { get; set; } - [Reactive] public bool EnableAutoAdjustMainLvColWidth { get; set; } - [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } - [Reactive] public bool EnableSecurityProtocolTls13 { get; set; } - [Reactive] public bool AutoHideStartup { get; set; } - [Reactive] public bool Hide2TrayWhenClose { get; set; } - [Reactive] public bool EnableDragDropSort { get; set; } - [Reactive] public bool DoubleClick2Activate { get; set; } - [Reactive] public int AutoUpdateInterval { get; set; } - [Reactive] public int TrayMenuServersLimit { get; set; } - [Reactive] public string CurrentFontFamily { get; set; } - [Reactive] public int SpeedTestTimeout { get; set; } - [Reactive] public string SpeedTestUrl { get; set; } - [Reactive] public string SpeedPingTestUrl { get; set; } - [Reactive] public int SpeedTestPageSize { get; set; } - [Reactive] public bool EnableHWA { get; set; } - [Reactive] public string SubConvertUrl { get; set; } - [Reactive] public int MainGirdOrientation { get; set; } - [Reactive] public string GeoFileSourceUrl { get; set; } - [Reactive] public string SrsFileSourceUrl { get; set; } - [Reactive] public string RoutingRulesSourceUrl { get; set; } + [Reactive] public bool AutoRun { get; set; } + [Reactive] public bool EnableStatistics { get; set; } + [Reactive] public bool KeepOlderDedupl { get; set; } + [Reactive] public bool DisplayRealTimeSpeed { get; set; } + [Reactive] public bool EnableAutoAdjustMainLvColWidth { get; set; } + [Reactive] public bool EnableUpdateSubOnlyRemarksExist { get; set; } + [Reactive] public bool EnableSecurityProtocolTls13 { get; set; } + [Reactive] public bool AutoHideStartup { get; set; } + [Reactive] public bool Hide2TrayWhenClose { get; set; } + [Reactive] public bool EnableDragDropSort { get; set; } + [Reactive] public bool DoubleClick2Activate { get; set; } + [Reactive] public int AutoUpdateInterval { get; set; } + [Reactive] public int TrayMenuServersLimit { get; set; } + [Reactive] public string CurrentFontFamily { get; set; } + [Reactive] public int SpeedTestTimeout { get; set; } + [Reactive] public string SpeedTestUrl { get; set; } + [Reactive] public string SpeedPingTestUrl { get; set; } + [Reactive] public int SpeedTestPageSize { get; set; } + [Reactive] public bool EnableHWA { get; set; } + [Reactive] public string SubConvertUrl { get; set; } + [Reactive] public int MainGirdOrientation { get; set; } + [Reactive] public string GeoFileSourceUrl { get; set; } + [Reactive] public string SrsFileSourceUrl { get; set; } + [Reactive] public string RoutingRulesSourceUrl { get; set; } - #endregion UI + #endregion UI - #region System proxy + #region System proxy - [Reactive] public bool notProxyLocalAddress { get; set; } - [Reactive] public string systemProxyAdvancedProtocol { get; set; } - [Reactive] public string systemProxyExceptions { get; set; } + [Reactive] public bool notProxyLocalAddress { get; set; } + [Reactive] public string systemProxyAdvancedProtocol { get; set; } + [Reactive] public string systemProxyExceptions { get; set; } - #endregion System proxy + #endregion System proxy - #region Tun mode + #region Tun mode - [Reactive] public bool TunStrictRoute { get; set; } - [Reactive] public string TunStack { get; set; } - [Reactive] public int TunMtu { get; set; } - [Reactive] public bool TunEnableExInbound { get; set; } - [Reactive] public bool TunEnableIPv6Address { get; set; } - [Reactive] public string TunLinuxSudoPassword { get; set; } + [Reactive] public bool TunStrictRoute { get; set; } + [Reactive] public string TunStack { get; set; } + [Reactive] public int TunMtu { get; set; } + [Reactive] public bool TunEnableExInbound { get; set; } + [Reactive] public bool TunEnableIPv6Address { get; set; } + [Reactive] public string TunLinuxSudoPassword { get; set; } - #endregion Tun mode + #endregion Tun mode - #region CoreType + #region CoreType - [Reactive] public string CoreType1 { get; set; } - [Reactive] public string CoreType2 { get; set; } - [Reactive] public string CoreType3 { get; set; } - [Reactive] public string CoreType4 { get; set; } - [Reactive] public string CoreType5 { get; set; } - [Reactive] public string CoreType6 { get; set; } + [Reactive] public string CoreType1 { get; set; } + [Reactive] public string CoreType2 { get; set; } + [Reactive] public string CoreType3 { get; set; } + [Reactive] public string CoreType4 { get; set; } + [Reactive] public string CoreType5 { get; set; } + [Reactive] public string CoreType6 { get; set; } - #endregion CoreType + #endregion CoreType - public ReactiveCommand SaveCmd { get; } + public ReactiveCommand SaveCmd { get; } - public OptionSettingViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public OptionSettingViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveSettingAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveSettingAsync(); + }); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - await _updateView?.Invoke(EViewAction.InitSettingFont, null); + private async Task Init() + { + await _updateView?.Invoke(EViewAction.InitSettingFont, null); - #region Core + #region Core - var inbound = _config.Inbound.First(); - localPort = inbound.LocalPort; - SecondLocalPortEnabled = inbound.SecondLocalPortEnabled; - udpEnabled = inbound.UdpEnabled; - sniffingEnabled = inbound.SniffingEnabled; - routeOnly = inbound.RouteOnly; - allowLANConn = inbound.AllowLANConn; - newPort4LAN = inbound.NewPort4LAN; - user = inbound.User; - pass = inbound.Pass; - muxEnabled = _config.CoreBasicItem.MuxEnabled; - logEnabled = _config.CoreBasicItem.LogEnabled; - loglevel = _config.CoreBasicItem.Loglevel; - defAllowInsecure = _config.CoreBasicItem.DefAllowInsecure; - defFingerprint = _config.CoreBasicItem.DefFingerprint; - defUserAgent = _config.CoreBasicItem.DefUserAgent; - mux4SboxProtocol = _config.Mux4SboxItem.Protocol; - enableCacheFile4Sbox = _config.CoreBasicItem.EnableCacheFile4Sbox; - hyUpMbps = _config.HysteriaItem.UpMbps; - hyDownMbps = _config.HysteriaItem.DownMbps; - enableFragment = _config.CoreBasicItem.EnableFragment; + var inbound = _config.Inbound.First(); + localPort = inbound.LocalPort; + SecondLocalPortEnabled = inbound.SecondLocalPortEnabled; + udpEnabled = inbound.UdpEnabled; + sniffingEnabled = inbound.SniffingEnabled; + routeOnly = inbound.RouteOnly; + allowLANConn = inbound.AllowLANConn; + newPort4LAN = inbound.NewPort4LAN; + user = inbound.User; + pass = inbound.Pass; + muxEnabled = _config.CoreBasicItem.MuxEnabled; + logEnabled = _config.CoreBasicItem.LogEnabled; + loglevel = _config.CoreBasicItem.Loglevel; + defAllowInsecure = _config.CoreBasicItem.DefAllowInsecure; + defFingerprint = _config.CoreBasicItem.DefFingerprint; + defUserAgent = _config.CoreBasicItem.DefUserAgent; + mux4SboxProtocol = _config.Mux4SboxItem.Protocol; + enableCacheFile4Sbox = _config.CoreBasicItem.EnableCacheFile4Sbox; + hyUpMbps = _config.HysteriaItem.UpMbps; + hyDownMbps = _config.HysteriaItem.DownMbps; + enableFragment = _config.CoreBasicItem.EnableFragment; - #endregion Core + #endregion Core - #region Core KCP + #region Core KCP - //Kcpmtu = _config.kcpItem.mtu; - //Kcptti = _config.kcpItem.tti; - //KcpuplinkCapacity = _config.kcpItem.uplinkCapacity; - //KcpdownlinkCapacity = _config.kcpItem.downlinkCapacity; - //KcpreadBufferSize = _config.kcpItem.readBufferSize; - //KcpwriteBufferSize = _config.kcpItem.writeBufferSize; - //Kcpcongestion = _config.kcpItem.congestion; + //Kcpmtu = _config.kcpItem.mtu; + //Kcptti = _config.kcpItem.tti; + //KcpuplinkCapacity = _config.kcpItem.uplinkCapacity; + //KcpdownlinkCapacity = _config.kcpItem.downlinkCapacity; + //KcpreadBufferSize = _config.kcpItem.readBufferSize; + //KcpwriteBufferSize = _config.kcpItem.writeBufferSize; + //Kcpcongestion = _config.kcpItem.congestion; - #endregion Core KCP + #endregion Core KCP - #region UI + #region UI - AutoRun = _config.GuiItem.AutoRun; - EnableStatistics = _config.GuiItem.EnableStatistics; - DisplayRealTimeSpeed = _config.GuiItem.DisplayRealTimeSpeed; - KeepOlderDedupl = _config.GuiItem.KeepOlderDedupl; - EnableAutoAdjustMainLvColWidth = _config.UiItem.EnableAutoAdjustMainLvColWidth; - EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; - EnableSecurityProtocolTls13 = _config.GuiItem.EnableSecurityProtocolTls13; - AutoHideStartup = _config.UiItem.AutoHideStartup; - Hide2TrayWhenClose = _config.UiItem.Hide2TrayWhenClose; - EnableDragDropSort = _config.UiItem.EnableDragDropSort; - DoubleClick2Activate = _config.UiItem.DoubleClick2Activate; - AutoUpdateInterval = _config.GuiItem.AutoUpdateInterval; - TrayMenuServersLimit = _config.GuiItem.TrayMenuServersLimit; - CurrentFontFamily = _config.UiItem.CurrentFontFamily; - SpeedTestTimeout = _config.SpeedTestItem.SpeedTestTimeout; - SpeedTestUrl = _config.SpeedTestItem.SpeedTestUrl; - SpeedTestPageSize = _config.SpeedTestItem.SpeedTestPageSize; - SpeedPingTestUrl = _config.SpeedTestItem.SpeedPingTestUrl; - EnableHWA = _config.GuiItem.EnableHWA; - SubConvertUrl = _config.ConstItem.SubConvertUrl; - MainGirdOrientation = (int)_config.UiItem.MainGirdOrientation; - GeoFileSourceUrl = _config.ConstItem.GeoSourceUrl; - SrsFileSourceUrl = _config.ConstItem.SrsSourceUrl; - RoutingRulesSourceUrl = _config.ConstItem.RouteRulesTemplateSourceUrl; + AutoRun = _config.GuiItem.AutoRun; + EnableStatistics = _config.GuiItem.EnableStatistics; + DisplayRealTimeSpeed = _config.GuiItem.DisplayRealTimeSpeed; + KeepOlderDedupl = _config.GuiItem.KeepOlderDedupl; + EnableAutoAdjustMainLvColWidth = _config.UiItem.EnableAutoAdjustMainLvColWidth; + EnableUpdateSubOnlyRemarksExist = _config.UiItem.EnableUpdateSubOnlyRemarksExist; + EnableSecurityProtocolTls13 = _config.GuiItem.EnableSecurityProtocolTls13; + AutoHideStartup = _config.UiItem.AutoHideStartup; + Hide2TrayWhenClose = _config.UiItem.Hide2TrayWhenClose; + EnableDragDropSort = _config.UiItem.EnableDragDropSort; + DoubleClick2Activate = _config.UiItem.DoubleClick2Activate; + AutoUpdateInterval = _config.GuiItem.AutoUpdateInterval; + TrayMenuServersLimit = _config.GuiItem.TrayMenuServersLimit; + CurrentFontFamily = _config.UiItem.CurrentFontFamily; + SpeedTestTimeout = _config.SpeedTestItem.SpeedTestTimeout; + SpeedTestUrl = _config.SpeedTestItem.SpeedTestUrl; + SpeedTestPageSize = _config.SpeedTestItem.SpeedTestPageSize; + SpeedPingTestUrl = _config.SpeedTestItem.SpeedPingTestUrl; + EnableHWA = _config.GuiItem.EnableHWA; + SubConvertUrl = _config.ConstItem.SubConvertUrl; + MainGirdOrientation = (int)_config.UiItem.MainGirdOrientation; + GeoFileSourceUrl = _config.ConstItem.GeoSourceUrl; + SrsFileSourceUrl = _config.ConstItem.SrsSourceUrl; + RoutingRulesSourceUrl = _config.ConstItem.RouteRulesTemplateSourceUrl; - #endregion UI + #endregion UI - #region System proxy + #region System proxy - notProxyLocalAddress = _config.SystemProxyItem.NotProxyLocalAddress; - systemProxyAdvancedProtocol = _config.SystemProxyItem.SystemProxyAdvancedProtocol; - systemProxyExceptions = _config.SystemProxyItem.SystemProxyExceptions; + notProxyLocalAddress = _config.SystemProxyItem.NotProxyLocalAddress; + systemProxyAdvancedProtocol = _config.SystemProxyItem.SystemProxyAdvancedProtocol; + systemProxyExceptions = _config.SystemProxyItem.SystemProxyExceptions; - #endregion System proxy + #endregion System proxy - #region Tun mode + #region Tun mode - TunStrictRoute = _config.TunModeItem.StrictRoute; - TunStack = _config.TunModeItem.Stack; - TunMtu = _config.TunModeItem.Mtu; - TunEnableExInbound = _config.TunModeItem.EnableExInbound; - TunEnableIPv6Address = _config.TunModeItem.EnableIPv6Address; - TunLinuxSudoPassword = _config.TunModeItem.LinuxSudoPwd; + TunStrictRoute = _config.TunModeItem.StrictRoute; + TunStack = _config.TunModeItem.Stack; + TunMtu = _config.TunModeItem.Mtu; + TunEnableExInbound = _config.TunModeItem.EnableExInbound; + TunEnableIPv6Address = _config.TunModeItem.EnableIPv6Address; + TunLinuxSudoPassword = _config.TunModeItem.LinuxSudoPwd; - #endregion Tun mode + #endregion Tun mode - await InitCoreType(); - } + await InitCoreType(); + } - private async Task InitCoreType() - { - if (_config.CoreTypeItem == null) - { - _config.CoreTypeItem = new List(); - } + private async Task InitCoreType() + { + if (_config.CoreTypeItem == null) + { + _config.CoreTypeItem = new List(); + } - foreach (EConfigType it in Enum.GetValues(typeof(EConfigType))) - { - if (_config.CoreTypeItem.FindIndex(t => t.ConfigType == it) >= 0) - { - continue; - } + foreach (EConfigType it in Enum.GetValues(typeof(EConfigType))) + { + if (_config.CoreTypeItem.FindIndex(t => t.ConfigType == it) >= 0) + { + continue; + } - _config.CoreTypeItem.Add(new CoreTypeItem() - { - ConfigType = it, - CoreType = ECoreType.Xray - }); - } - _config.CoreTypeItem.ForEach(it => - { - var type = it.CoreType.ToString(); - switch ((int)it.ConfigType) - { - case 1: - CoreType1 = type; - break; + _config.CoreTypeItem.Add(new CoreTypeItem() + { + ConfigType = it, + CoreType = ECoreType.Xray + }); + } + _config.CoreTypeItem.ForEach(it => + { + var type = it.CoreType.ToString(); + switch ((int)it.ConfigType) + { + case 1: + CoreType1 = type; + break; - case 2: - CoreType2 = type; - break; + case 2: + CoreType2 = type; + break; - case 3: - CoreType3 = type; - break; + case 3: + CoreType3 = type; + break; - case 4: - CoreType4 = type; - break; + case 4: + CoreType4 = type; + break; - case 5: - CoreType5 = type; - break; + case 5: + CoreType5 = type; + break; - case 6: - CoreType6 = type; - break; - } - }); - await Task.CompletedTask; - } + case 6: + CoreType6 = type; + break; + } + }); + await Task.CompletedTask; + } - private async Task SaveSettingAsync() - { - if (Utils.IsNullOrEmpty(localPort.ToString()) || !Utils.IsNumeric(localPort.ToString()) - || localPort <= 0 || localPort >= Global.MaxPort) - { - NoticeHandler.Instance.Enqueue(ResUI.FillLocalListeningPort); - return; - } - var needReboot = (EnableStatistics != _config.GuiItem.EnableStatistics - || DisplayRealTimeSpeed != _config.GuiItem.DisplayRealTimeSpeed - || EnableDragDropSort != _config.UiItem.EnableDragDropSort - || EnableHWA != _config.GuiItem.EnableHWA - || CurrentFontFamily != _config.UiItem.CurrentFontFamily - || MainGirdOrientation != (int)_config.UiItem.MainGirdOrientation); + private async Task SaveSettingAsync() + { + if (Utils.IsNullOrEmpty(localPort.ToString()) || !Utils.IsNumeric(localPort.ToString()) + || localPort <= 0 || localPort >= Global.MaxPort) + { + NoticeHandler.Instance.Enqueue(ResUI.FillLocalListeningPort); + return; + } + var needReboot = EnableStatistics != _config.GuiItem.EnableStatistics + || DisplayRealTimeSpeed != _config.GuiItem.DisplayRealTimeSpeed + || EnableDragDropSort != _config.UiItem.EnableDragDropSort + || EnableHWA != _config.GuiItem.EnableHWA + || CurrentFontFamily != _config.UiItem.CurrentFontFamily + || MainGirdOrientation != (int)_config.UiItem.MainGirdOrientation; - //if (Utile.IsNullOrEmpty(Kcpmtu.ToString()) || !Utile.IsNumeric(Kcpmtu.ToString()) - // || Utile.IsNullOrEmpty(Kcptti.ToString()) || !Utile.IsNumeric(Kcptti.ToString()) - // || Utile.IsNullOrEmpty(KcpuplinkCapacity.ToString()) || !Utile.IsNumeric(KcpuplinkCapacity.ToString()) - // || Utile.IsNullOrEmpty(KcpdownlinkCapacity.ToString()) || !Utile.IsNumeric(KcpdownlinkCapacity.ToString()) - // || Utile.IsNullOrEmpty(KcpreadBufferSize.ToString()) || !Utile.IsNumeric(KcpreadBufferSize.ToString()) - // || Utile.IsNullOrEmpty(KcpwriteBufferSize.ToString()) || !Utile.IsNumeric(KcpwriteBufferSize.ToString())) - //{ - // NoticeHandler.Instance.Enqueue(ResUI.FillKcpParameters); - // return; - //} + //if (Utile.IsNullOrEmpty(Kcpmtu.ToString()) || !Utile.IsNumeric(Kcpmtu.ToString()) + // || Utile.IsNullOrEmpty(Kcptti.ToString()) || !Utile.IsNumeric(Kcptti.ToString()) + // || Utile.IsNullOrEmpty(KcpuplinkCapacity.ToString()) || !Utile.IsNumeric(KcpuplinkCapacity.ToString()) + // || Utile.IsNullOrEmpty(KcpdownlinkCapacity.ToString()) || !Utile.IsNumeric(KcpdownlinkCapacity.ToString()) + // || Utile.IsNullOrEmpty(KcpreadBufferSize.ToString()) || !Utile.IsNumeric(KcpreadBufferSize.ToString()) + // || Utile.IsNullOrEmpty(KcpwriteBufferSize.ToString()) || !Utile.IsNumeric(KcpwriteBufferSize.ToString())) + //{ + // NoticeHandler.Instance.Enqueue(ResUI.FillKcpParameters); + // return; + //} - //Core - _config.Inbound.First().LocalPort = localPort; - _config.Inbound.First().SecondLocalPortEnabled = SecondLocalPortEnabled; - _config.Inbound.First().UdpEnabled = udpEnabled; - _config.Inbound.First().SniffingEnabled = sniffingEnabled; - _config.Inbound.First().DestOverride = destOverride?.ToList(); - _config.Inbound.First().RouteOnly = routeOnly; - _config.Inbound.First().AllowLANConn = allowLANConn; - _config.Inbound.First().NewPort4LAN = newPort4LAN; - _config.Inbound.First().User = user; - _config.Inbound.First().Pass = pass; - if (_config.Inbound.Count > 1) - { - _config.Inbound.RemoveAt(1); - } - _config.CoreBasicItem.LogEnabled = logEnabled; - _config.CoreBasicItem.Loglevel = loglevel; - _config.CoreBasicItem.MuxEnabled = muxEnabled; - _config.CoreBasicItem.DefAllowInsecure = defAllowInsecure; - _config.CoreBasicItem.DefFingerprint = defFingerprint; - _config.CoreBasicItem.DefUserAgent = defUserAgent; - _config.Mux4SboxItem.Protocol = mux4SboxProtocol; - _config.CoreBasicItem.EnableCacheFile4Sbox = enableCacheFile4Sbox; - _config.HysteriaItem.UpMbps = hyUpMbps; - _config.HysteriaItem.DownMbps = hyDownMbps; - _config.CoreBasicItem.EnableFragment = enableFragment; + //Core + _config.Inbound.First().LocalPort = localPort; + _config.Inbound.First().SecondLocalPortEnabled = SecondLocalPortEnabled; + _config.Inbound.First().UdpEnabled = udpEnabled; + _config.Inbound.First().SniffingEnabled = sniffingEnabled; + _config.Inbound.First().DestOverride = destOverride?.ToList(); + _config.Inbound.First().RouteOnly = routeOnly; + _config.Inbound.First().AllowLANConn = allowLANConn; + _config.Inbound.First().NewPort4LAN = newPort4LAN; + _config.Inbound.First().User = user; + _config.Inbound.First().Pass = pass; + if (_config.Inbound.Count > 1) + { + _config.Inbound.RemoveAt(1); + } + _config.CoreBasicItem.LogEnabled = logEnabled; + _config.CoreBasicItem.Loglevel = loglevel; + _config.CoreBasicItem.MuxEnabled = muxEnabled; + _config.CoreBasicItem.DefAllowInsecure = defAllowInsecure; + _config.CoreBasicItem.DefFingerprint = defFingerprint; + _config.CoreBasicItem.DefUserAgent = defUserAgent; + _config.Mux4SboxItem.Protocol = mux4SboxProtocol; + _config.CoreBasicItem.EnableCacheFile4Sbox = enableCacheFile4Sbox; + _config.HysteriaItem.UpMbps = hyUpMbps; + _config.HysteriaItem.DownMbps = hyDownMbps; + _config.CoreBasicItem.EnableFragment = enableFragment; - _config.GuiItem.AutoRun = AutoRun; - _config.GuiItem.EnableStatistics = EnableStatistics; - _config.GuiItem.DisplayRealTimeSpeed = DisplayRealTimeSpeed; - _config.GuiItem.KeepOlderDedupl = KeepOlderDedupl; - _config.UiItem.EnableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth; - _config.UiItem.EnableUpdateSubOnlyRemarksExist = EnableUpdateSubOnlyRemarksExist; - _config.GuiItem.EnableSecurityProtocolTls13 = EnableSecurityProtocolTls13; - _config.UiItem.AutoHideStartup = AutoHideStartup; - _config.UiItem.Hide2TrayWhenClose = Hide2TrayWhenClose; - _config.GuiItem.AutoUpdateInterval = AutoUpdateInterval; - _config.UiItem.EnableDragDropSort = EnableDragDropSort; - _config.UiItem.DoubleClick2Activate = DoubleClick2Activate; - _config.GuiItem.TrayMenuServersLimit = TrayMenuServersLimit; - _config.UiItem.CurrentFontFamily = CurrentFontFamily; - _config.SpeedTestItem.SpeedTestTimeout = SpeedTestTimeout; - _config.SpeedTestItem.SpeedTestPageSize = SpeedTestPageSize; - _config.SpeedTestItem.SpeedTestUrl = SpeedTestUrl; - _config.SpeedTestItem.SpeedPingTestUrl = SpeedPingTestUrl; - _config.GuiItem.EnableHWA = EnableHWA; - _config.ConstItem.SubConvertUrl = SubConvertUrl; - _config.UiItem.MainGirdOrientation = (EGirdOrientation)MainGirdOrientation; - _config.ConstItem.GeoSourceUrl = GeoFileSourceUrl; - _config.ConstItem.SrsSourceUrl = SrsFileSourceUrl; - _config.ConstItem.RouteRulesTemplateSourceUrl = RoutingRulesSourceUrl; + _config.GuiItem.AutoRun = AutoRun; + _config.GuiItem.EnableStatistics = EnableStatistics; + _config.GuiItem.DisplayRealTimeSpeed = DisplayRealTimeSpeed; + _config.GuiItem.KeepOlderDedupl = KeepOlderDedupl; + _config.UiItem.EnableAutoAdjustMainLvColWidth = EnableAutoAdjustMainLvColWidth; + _config.UiItem.EnableUpdateSubOnlyRemarksExist = EnableUpdateSubOnlyRemarksExist; + _config.GuiItem.EnableSecurityProtocolTls13 = EnableSecurityProtocolTls13; + _config.UiItem.AutoHideStartup = AutoHideStartup; + _config.UiItem.Hide2TrayWhenClose = Hide2TrayWhenClose; + _config.GuiItem.AutoUpdateInterval = AutoUpdateInterval; + _config.UiItem.EnableDragDropSort = EnableDragDropSort; + _config.UiItem.DoubleClick2Activate = DoubleClick2Activate; + _config.GuiItem.TrayMenuServersLimit = TrayMenuServersLimit; + _config.UiItem.CurrentFontFamily = CurrentFontFamily; + _config.SpeedTestItem.SpeedTestTimeout = SpeedTestTimeout; + _config.SpeedTestItem.SpeedTestPageSize = SpeedTestPageSize; + _config.SpeedTestItem.SpeedTestUrl = SpeedTestUrl; + _config.SpeedTestItem.SpeedPingTestUrl = SpeedPingTestUrl; + _config.GuiItem.EnableHWA = EnableHWA; + _config.ConstItem.SubConvertUrl = SubConvertUrl; + _config.UiItem.MainGirdOrientation = (EGirdOrientation)MainGirdOrientation; + _config.ConstItem.GeoSourceUrl = GeoFileSourceUrl; + _config.ConstItem.SrsSourceUrl = SrsFileSourceUrl; + _config.ConstItem.RouteRulesTemplateSourceUrl = RoutingRulesSourceUrl; - //systemProxy - _config.SystemProxyItem.SystemProxyExceptions = systemProxyExceptions; - _config.SystemProxyItem.NotProxyLocalAddress = notProxyLocalAddress; - _config.SystemProxyItem.SystemProxyAdvancedProtocol = systemProxyAdvancedProtocol; + //systemProxy + _config.SystemProxyItem.SystemProxyExceptions = systemProxyExceptions; + _config.SystemProxyItem.NotProxyLocalAddress = notProxyLocalAddress; + _config.SystemProxyItem.SystemProxyAdvancedProtocol = systemProxyAdvancedProtocol; - //tun mode - _config.TunModeItem.StrictRoute = TunStrictRoute; - _config.TunModeItem.Stack = TunStack; - _config.TunModeItem.Mtu = TunMtu; - _config.TunModeItem.EnableExInbound = TunEnableExInbound; - _config.TunModeItem.EnableIPv6Address = TunEnableIPv6Address; - if (TunLinuxSudoPassword != _config.TunModeItem.LinuxSudoPwd) - { - _config.TunModeItem.LinuxSudoPwd = DesUtils.Encrypt(TunLinuxSudoPassword); - } + //tun mode + _config.TunModeItem.StrictRoute = TunStrictRoute; + _config.TunModeItem.Stack = TunStack; + _config.TunModeItem.Mtu = TunMtu; + _config.TunModeItem.EnableExInbound = TunEnableExInbound; + _config.TunModeItem.EnableIPv6Address = TunEnableIPv6Address; + if (TunLinuxSudoPassword != _config.TunModeItem.LinuxSudoPwd) + { + _config.TunModeItem.LinuxSudoPwd = DesUtils.Encrypt(TunLinuxSudoPassword); + } - //coreType - await SaveCoreType(); + //coreType + await SaveCoreType(); - if (await ConfigHandler.SaveConfig(_config) == 0) - { - await AutoStartupHandler.UpdateTask(_config); - AppHandler.Instance.Reset(); + if (await ConfigHandler.SaveConfig(_config) == 0) + { + await AutoStartupHandler.UpdateTask(_config); + AppHandler.Instance.Reset(); - NoticeHandler.Instance.Enqueue(needReboot ? ResUI.NeedRebootTips : ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } + NoticeHandler.Instance.Enqueue(needReboot ? ResUI.NeedRebootTips : ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } - private async Task SaveCoreType() - { - for (int k = 1; k <= _config.CoreTypeItem.Count; k++) - { - var item = _config.CoreTypeItem[k - 1]; - var type = string.Empty; - switch ((int)item.ConfigType) - { - case 1: - type = CoreType1; - break; + private async Task SaveCoreType() + { + for (int k = 1; k <= _config.CoreTypeItem.Count; k++) + { + var item = _config.CoreTypeItem[k - 1]; + var type = string.Empty; + switch ((int)item.ConfigType) + { + case 1: + type = CoreType1; + break; - case 2: - type = CoreType2; - break; + case 2: + type = CoreType2; + break; - case 3: - type = CoreType3; - break; + case 3: + type = CoreType3; + break; - case 4: - type = CoreType4; - break; + case 4: + type = CoreType4; + break; - case 5: - type = CoreType5; - break; + case 5: + type = CoreType5; + break; - case 6: - type = CoreType6; - break; + case 6: + type = CoreType6; + break; - default: - continue; - } - item.CoreType = (ECoreType)Enum.Parse(typeof(ECoreType), type); - } - await Task.CompletedTask; - } - } -} \ No newline at end of file + default: + continue; + } + item.CoreType = (ECoreType)Enum.Parse(typeof(ECoreType), type); + } + await Task.CompletedTask; + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index 7c8b2d82..6f47fefe 100644 --- a/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -1,844 +1,844 @@ +using System.Reactive; +using System.Reactive.Linq; +using System.Text; using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; -using System.Reactive; -using System.Reactive.Linq; -using System.Text; namespace ServiceLib.ViewModels { - public class ProfilesViewModel : MyReactiveObject - { - #region private prop + public class ProfilesViewModel : MyReactiveObject + { + #region private prop - private List _lstProfile; - private string _serverFilter = string.Empty; - private Dictionary _dicHeaderSort = new(); + private List _lstProfile; + private string _serverFilter = string.Empty; + private Dictionary _dicHeaderSort = new(); - #endregion private prop + #endregion private prop - #region ObservableCollection + #region ObservableCollection - private IObservableCollection _profileItems = new ObservableCollectionExtended(); - public IObservableCollection ProfileItems => _profileItems; + private IObservableCollection _profileItems = new ObservableCollectionExtended(); + public IObservableCollection ProfileItems => _profileItems; - private IObservableCollection _subItems = new ObservableCollectionExtended(); - public IObservableCollection SubItems => _subItems; + private IObservableCollection _subItems = new ObservableCollectionExtended(); + public IObservableCollection SubItems => _subItems; - private IObservableCollection _servers = new ObservableCollectionExtended(); + private IObservableCollection _servers = new ObservableCollectionExtended(); - [Reactive] - public ProfileItemModel SelectedProfile { get; set; } + [Reactive] + public ProfileItemModel SelectedProfile { get; set; } - public IList SelectedProfiles { get; set; } + public IList SelectedProfiles { get; set; } - [Reactive] - public SubItem SelectedSub { get; set; } + [Reactive] + public SubItem SelectedSub { get; set; } - [Reactive] - public SubItem SelectedMoveToGroup { get; set; } + [Reactive] + public SubItem SelectedMoveToGroup { get; set; } - [Reactive] - public ComboItem SelectedServer { get; set; } + [Reactive] + public ComboItem SelectedServer { get; set; } - [Reactive] - public string ServerFilter { get; set; } - - [Reactive] - public bool BlServers { get; set; } - - #endregion ObservableCollection - - #region Menu - - //servers delete - public ReactiveCommand EditServerCmd { get; } - - public ReactiveCommand RemoveServerCmd { get; } - public ReactiveCommand RemoveDuplicateServerCmd { get; } - public ReactiveCommand CopyServerCmd { get; } - public ReactiveCommand SetDefaultServerCmd { get; } - public ReactiveCommand ShareServerCmd { get; } - public ReactiveCommand SetDefaultMultipleServerCmd { get; } - public ReactiveCommand SetDefaultLoadBalanceServerCmd { get; } - - //servers move - public ReactiveCommand MoveTopCmd { get; } - - public ReactiveCommand MoveUpCmd { get; } - public ReactiveCommand MoveDownCmd { get; } - public ReactiveCommand MoveBottomCmd { get; } - - //servers ping - public ReactiveCommand MixedTestServerCmd { get; } - - public ReactiveCommand TcpingServerCmd { get; } - public ReactiveCommand RealPingServerCmd { get; } - public ReactiveCommand SpeedServerCmd { get; } - public ReactiveCommand SortServerResultCmd { get; } - - //servers export - public ReactiveCommand Export2ClientConfigCmd { get; } - - public ReactiveCommand Export2ClientConfigClipboardCmd { get; } - public ReactiveCommand Export2ShareUrlCmd { get; } - public ReactiveCommand Export2ShareUrlBase64Cmd { get; } - - public ReactiveCommand AddSubCmd { get; } - public ReactiveCommand EditSubCmd { get; } - - #endregion Menu - - #region Init - - public ProfilesViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; - - #region WhenAnyValue && ReactiveCommand - - var canEditRemove = this.WhenAnyValue( - x => x.SelectedProfile, - selectedSource => selectedSource != null && !selectedSource.IndexId.IsNullOrEmpty()); - - this.WhenAnyValue( - x => x.SelectedSub, - y => y != null && !y.Remarks.IsNullOrEmpty() && _config.SubIndexId != y.Id) - .Subscribe(async c => await SubSelectedChangedAsync(c)); - this.WhenAnyValue( - x => x.SelectedMoveToGroup, - y => y != null && !y.Remarks.IsNullOrEmpty()) - .Subscribe(async c => await MoveToGroup(c)); - - this.WhenAnyValue( - x => x.SelectedServer, - y => y != null && !y.Text.IsNullOrEmpty()) - .Subscribe(async c => await ServerSelectedChanged(c)); - - this.WhenAnyValue( - x => x.ServerFilter, - y => y != null && _serverFilter != y) - .Subscribe(c => ServerFilterChanged(c)); - - //servers delete - EditServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditServerAsync(EConfigType.Custom); - }, canEditRemove); - RemoveServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await RemoveServerAsync(); - }, canEditRemove); - RemoveDuplicateServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await RemoveDuplicateServer(); - }); - CopyServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await CopyServer(); - }, canEditRemove); - SetDefaultServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetDefaultServer(); - }, canEditRemove); - ShareServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await ShareServerAsync(); - }, canEditRemove); - SetDefaultMultipleServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetDefaultMultipleServer(ECoreType.sing_box); - }, canEditRemove); - SetDefaultLoadBalanceServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetDefaultMultipleServer(ECoreType.Xray); - }, canEditRemove); - - //servers move - MoveTopCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveServer(EMove.Top); - }, canEditRemove); - MoveUpCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveServer(EMove.Up); - }, canEditRemove); - MoveDownCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveServer(EMove.Down); - }, canEditRemove); - MoveBottomCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveServer(EMove.Bottom); - }, canEditRemove); - - //servers ping - MixedTestServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await ServerSpeedtest(ESpeedActionType.Mixedtest); - }); - TcpingServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await ServerSpeedtest(ESpeedActionType.Tcping); - }, canEditRemove); - RealPingServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await ServerSpeedtest(ESpeedActionType.Realping); - }, canEditRemove); - SpeedServerCmd = ReactiveCommand.CreateFromTask(async () => - { - await ServerSpeedtest(ESpeedActionType.Speedtest); - }, canEditRemove); - SortServerResultCmd = ReactiveCommand.CreateFromTask(async () => - { - await SortServer(EServerColName.DelayVal.ToString()); - }); - //servers export - Export2ClientConfigCmd = ReactiveCommand.CreateFromTask(async () => - { - await Export2ClientConfigAsync(false); - }, canEditRemove); - Export2ClientConfigClipboardCmd = ReactiveCommand.CreateFromTask(async () => - { - await Export2ClientConfigAsync(true); - }, canEditRemove); - Export2ShareUrlCmd = ReactiveCommand.CreateFromTask(async () => - { - await Export2ShareUrlAsync(false); - }, canEditRemove); - Export2ShareUrlBase64Cmd = ReactiveCommand.CreateFromTask(async () => - { - await Export2ShareUrlAsync(true); - }, canEditRemove); - - //Subscription - AddSubCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditSubAsync(true); - }); - EditSubCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditSubAsync(false); - }); - - #endregion WhenAnyValue && ReactiveCommand - - if (_updateView != null) - { - MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); - } - - _ = Init(); - } - - private async Task Init() - { - SelectedProfile = new(); - SelectedSub = new(); - SelectedMoveToGroup = new(); - SelectedServer = new(); - - await RefreshSubscriptions(); - RefreshServers(); - } - - #endregion Init - - #region Actions - - private async void OnNext(string x) - { - await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null); - } - - private void Reload() - { - Locator.Current.GetService()?.Reload(); - } - - private void UpdateSpeedtestHandler(SpeedTestResult result) - { - _updateView?.Invoke(EViewAction.DispatcherSpeedTest, result); - } - - public void SetSpeedTestResult(SpeedTestResult result) - { - if (Utils.IsNullOrEmpty(result.IndexId)) - { - NoticeHandler.Instance.SendMessageEx(result.Delay); - NoticeHandler.Instance.Enqueue(result.Delay); - return; - } - var item = _profileItems.Where(it => it.IndexId == result.IndexId).FirstOrDefault(); - if (item != null) - { - if (Utils.IsNotEmpty(result.Delay)) - { - int.TryParse(result.Delay, out int temp); - item.Delay = temp; - item.DelayVal = $"{result.Delay} {Global.DelayUnit}"; - } - if (Utils.IsNotEmpty(result.Speed)) - { - item.SpeedVal = $"{result.Speed} {Global.SpeedUnit}"; - } - _profileItems.Replace(item, JsonUtils.DeepCopy(item)); - } - } - - public void UpdateStatistics(ServerSpeedItem update) - { - try - { - var item = _profileItems.Where(it => it.IndexId == update.IndexId).FirstOrDefault(); - if (item != null) - { - item.TodayDown = Utils.HumanFy(update.TodayDown); - item.TodayUp = Utils.HumanFy(update.TodayUp); - item.TotalDown = Utils.HumanFy(update.TotalDown); - item.TotalUp = Utils.HumanFy(update.TotalUp); - - if (SelectedProfile?.IndexId == item.IndexId) - { - var temp = JsonUtils.DeepCopy(item); - _profileItems.Replace(item, temp); - SelectedProfile = temp; - } - else - { - _profileItems.Replace(item, JsonUtils.DeepCopy(item)); - } - } - } - catch - { - } - } - - public async Task AutofitColumnWidthAsync() - { - await _updateView?.Invoke(EViewAction.AdjustMainLvColWidth, null); - } - - #endregion Actions - - #region Servers && Groups - - private async Task SubSelectedChangedAsync(bool c) - { - if (!c) - { - return; - } - _config.SubIndexId = SelectedSub?.Id; - - RefreshServers(); - - await _updateView?.Invoke(EViewAction.ProfilesFocus, null); - } - - private void ServerFilterChanged(bool c) - { - if (!c) - { - return; - } - _serverFilter = ServerFilter; - if (Utils.IsNullOrEmpty(_serverFilter)) - { - RefreshServers(); - } - } - - public void RefreshServers() - { - MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); - } - - public async Task RefreshServersBiz() - { - var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter); - _lstProfile = JsonUtils.Deserialize>(JsonUtils.Serialize(lstModel)) ?? []; - - _profileItems.Clear(); - _profileItems.AddRange(lstModel); - if (lstModel.Count > 0) - { - var selected = lstModel.FirstOrDefault(t => t.IndexId == _config.IndexId); - if (selected != null) - { - SelectedProfile = selected; - } - else - { - SelectedProfile = lstModel.First(); - } - } - } - - public async Task RefreshSubscriptions() - { - _subItems.Clear(); - - _subItems.Add(new SubItem { Remarks = ResUI.AllGroupServers }); - - foreach (var item in await AppHandler.Instance.SubItems()) - { - _subItems.Add(item); - } - if (_config.SubIndexId != null && _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null) - { - SelectedSub = _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId); - } - else - { - SelectedSub = _subItems.First(); - } - } - - private async Task?> GetProfileItemsEx(string subid, string filter) - { - var lstModel = await AppHandler.Instance.ProfileItems(_config.SubIndexId, filter); - - await ConfigHandler.SetDefaultServer(_config, lstModel); - - var lstServerStat = (_config.GuiItem.EnableStatistics ? StatisticsHandler.Instance.ServerStat : null) ?? []; - var lstProfileExs = await ProfileExHandler.Instance.GetProfileExs(); - lstModel = (from t in lstModel - join t2 in lstServerStat on t.IndexId equals t2.IndexId into t2b - from t22 in t2b.DefaultIfEmpty() - join t3 in lstProfileExs on t.IndexId equals t3.IndexId into t3b - from t33 in t3b.DefaultIfEmpty() - select new ProfileItemModel - { - IndexId = t.IndexId, - ConfigType = t.ConfigType, - Remarks = t.Remarks, - Address = t.Address, - Port = t.Port, - Security = t.Security, - Network = t.Network, - StreamSecurity = t.StreamSecurity, - Subid = t.Subid, - SubRemarks = t.SubRemarks, - IsActive = t.IndexId == _config.IndexId, - Sort = t33 == null ? 0 : t33.Sort, - Delay = t33 == null ? 0 : t33.Delay, - DelayVal = t33?.Delay != 0 ? $"{t33?.Delay} {Global.DelayUnit}" : string.Empty, - SpeedVal = t33?.Speed != 0 ? $"{t33?.Speed} {Global.SpeedUnit}" : string.Empty, - TodayDown = t22 == null ? "" : Utils.HumanFy(t22.TodayDown), - TodayUp = t22 == null ? "" : Utils.HumanFy(t22.TodayUp), - TotalDown = t22 == null ? "" : Utils.HumanFy(t22.TotalDown), - TotalUp = t22 == null ? "" : Utils.HumanFy(t22.TotalUp) - }).OrderBy(t => t.Sort).ToList(); - - return lstModel; - } - - #endregion Servers && Groups - - #region Add Servers - - private async Task?> GetProfileItems(bool latest) - { - var lstSelecteds = new List(); - if (SelectedProfiles == null || SelectedProfiles.Count <= 0) - { - return null; - } - - var orderProfiles = SelectedProfiles?.OrderBy(t => t.Sort); - if (latest) - { - foreach (var profile in orderProfiles) - { - var item = await AppHandler.Instance.GetProfileItem(profile.IndexId); - if (item is not null) - { - lstSelecteds.Add(item); - } - } - } - else - { - lstSelecteds = JsonUtils.Deserialize>(JsonUtils.Serialize(orderProfiles)); - } - - return lstSelecteds; - } - - public async Task EditServerAsync(EConfigType eConfigType) - { - if (Utils.IsNullOrEmpty(SelectedProfile?.IndexId)) - { - return; - } - var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); - return; - } - eConfigType = item.ConfigType; - - bool? ret = false; - if (eConfigType == EConfigType.Custom) - { - ret = await _updateView?.Invoke(EViewAction.AddServer2Window, item); - } - else - { - ret = await _updateView?.Invoke(EViewAction.AddServerWindow, item); - } - if (ret == true) - { - RefreshServers(); - if (item.IndexId == _config.IndexId) - { - Reload(); - } - } - } - - public async Task RemoveServerAsync() - { - var lstSelecteds = await GetProfileItems(true); - if (lstSelecteds == null) - { - return; - } - if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) - { - return; - } - var exists = lstSelecteds.Exists(t => t.IndexId == _config.IndexId); - - await ConfigHandler.RemoveServer(_config, lstSelecteds); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - if (lstSelecteds.Count == _profileItems.Count) - { - _profileItems.Clear(); - } - RefreshServers(); - if (exists) - { - Reload(); - } - } - - private async Task RemoveDuplicateServer() - { - var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId); - RefreshServers(); - Reload(); - NoticeHandler.Instance.Enqueue(string.Format(ResUI.RemoveDuplicateServerResult, tuple.Item1, tuple.Item2)); - } - - private async Task CopyServer() - { - var lstSelecteds = await GetProfileItems(false); - if (lstSelecteds == null) - { - return; - } - if (await ConfigHandler.CopyServer(_config, lstSelecteds) == 0) - { - RefreshServers(); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } - } - - public async Task SetDefaultServer() - { - if (Utils.IsNullOrEmpty(SelectedProfile?.IndexId)) - { - return; - } - await SetDefaultServer(SelectedProfile.IndexId); - } - - public async Task SetDefaultServer(string indexId) - { - if (Utils.IsNullOrEmpty(indexId)) - { - return; - } - if (indexId == _config.IndexId) - { - return; - } - var item = await AppHandler.Instance.GetProfileItem(indexId); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); - return; - } - - if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0) - { - RefreshServers(); - Reload(); - } - } - - private async Task ServerSelectedChanged(bool c) - { - if (!c) - { - return; - } - if (SelectedServer == null) - { - return; - } - if (Utils.IsNullOrEmpty(SelectedServer.ID)) - { - return; - } - await SetDefaultServer(SelectedServer.ID); - } - - public async Task ShareServerAsync() - { - var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); - return; - } - var url = FmtHandler.GetShareUri(item); - if (Utils.IsNullOrEmpty(url)) - { - return; - } - - await _updateView?.Invoke(EViewAction.ShareServer, url); - } - - private async Task SetDefaultMultipleServer(ECoreType coreType) - { - var lstSelecteds = await GetProfileItems(true); - if (lstSelecteds == null) - { - return; - } - - var ret = await ConfigHandler.AddCustomServer4Multiple(_config, lstSelecteds, coreType); - if (ret.Success != true) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - return; - } - if (ret?.Data?.ToString() == _config.IndexId) - { - RefreshServers(); - Reload(); - } - else - { - await SetDefaultServer(ret?.Data?.ToString()); - } - } - - public async Task SortServer(string colName) - { - if (Utils.IsNullOrEmpty(colName)) - { - return; - } - - _dicHeaderSort.TryAdd(colName, true); - _dicHeaderSort.TryGetValue(colName, out bool asc); - if (await ConfigHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0) - { - return; - } - _dicHeaderSort[colName] = !asc; - RefreshServers(); - } - - //move server - private async Task MoveToGroup(bool c) - { - if (!c) - { - return; - } - - var lstSelecteds = await GetProfileItems(true); - if (lstSelecteds == null) - { - return; - } - - await ConfigHandler.MoveToGroup(_config, lstSelecteds, SelectedMoveToGroup.Id); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - - RefreshServers(); - SelectedMoveToGroup = null; - SelectedMoveToGroup = new(); - //Reload(); - } - - public async Task MoveServer(EMove eMove) - { - var item = _lstProfile.FirstOrDefault(t => t.IndexId == SelectedProfile.IndexId); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); - return; - } - - int index = _lstProfile.IndexOf(item); - if (index < 0) - { - return; - } - if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0) - { - RefreshServers(); - } - } - - public async Task MoveServerTo(int startIndex, ProfileItemModel targetItem) - { - var targetIndex = _profileItems.IndexOf(targetItem); - if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex) - { - if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0) - { - RefreshServers(); - } - } - } - - public async Task ServerSpeedtest(ESpeedActionType actionType) - { - if (actionType == ESpeedActionType.Mixedtest) - { - SelectedProfiles = _profileItems; - } - var lstSelecteds = await GetProfileItems(false); - if (lstSelecteds == null) - { - return; - } - //ClearTestResult(); - - _ = new SpeedtestService(_config, lstSelecteds, actionType, UpdateSpeedtestHandler); - } - - public void ServerSpeedtestStop() - { - MessageBus.Current.SendMessage("", EMsgCommand.StopSpeedtest.ToString()); - } - - private async Task Export2ClientConfigAsync(bool blClipboard) - { - var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); - return; - } - if (blClipboard) - { - var result = await CoreConfigHandler.GenerateClientConfig(item, null); - if (result.Success != true) - { - NoticeHandler.Instance.Enqueue(result.Msg); - } - else - { - await _updateView?.Invoke(EViewAction.SetClipboardData, result.Data); - NoticeHandler.Instance.SendMessage(ResUI.OperationSuccess); - } - } - else - { - await _updateView?.Invoke(EViewAction.SaveFileDialog, item); - } - } - - public async Task Export2ClientConfigResult(string fileName, ProfileItem item) - { - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } - var result = await CoreConfigHandler.GenerateClientConfig(item, fileName); - if (result.Success != true) - { - NoticeHandler.Instance.Enqueue(result.Msg); - } - else - { - NoticeHandler.Instance.SendMessageAndEnqueue(string.Format(ResUI.SaveClientConfigurationIn, fileName)); - } - } - - public async Task Export2ShareUrlAsync(bool blEncode) - { - var lstSelecteds = await GetProfileItems(true); - if (lstSelecteds == null) - { - return; - } - - StringBuilder sb = new(); - foreach (var it in lstSelecteds) - { - var url = FmtHandler.GetShareUri(it); - if (Utils.IsNullOrEmpty(url)) - { - continue; - } - sb.Append(url); - sb.AppendLine(); - } - if (sb.Length > 0) - { - if (blEncode) - { - await _updateView?.Invoke(EViewAction.SetClipboardData, Utils.Base64Encode(sb.ToString())); - } - else - { - await _updateView?.Invoke(EViewAction.SetClipboardData, sb.ToString()); - } - NoticeHandler.Instance.SendMessage(ResUI.BatchExportURLSuccessfully); - } - } - - #endregion Add Servers - - #region Subscription - - private async Task EditSubAsync(bool blNew) - { - SubItem item; - if (blNew) - { - item = new(); - } - else - { - item = await AppHandler.Instance.GetSubItem(_config.SubIndexId); - if (item is null) - { - return; - } - } - if (await _updateView?.Invoke(EViewAction.SubEditWindow, item) == true) - { - await RefreshSubscriptions(); - await SubSelectedChangedAsync(true); - } - } - - #endregion Subscription - } -} \ No newline at end of file + [Reactive] + public string ServerFilter { get; set; } + + [Reactive] + public bool BlServers { get; set; } + + #endregion ObservableCollection + + #region Menu + + //servers delete + public ReactiveCommand EditServerCmd { get; } + + public ReactiveCommand RemoveServerCmd { get; } + public ReactiveCommand RemoveDuplicateServerCmd { get; } + public ReactiveCommand CopyServerCmd { get; } + public ReactiveCommand SetDefaultServerCmd { get; } + public ReactiveCommand ShareServerCmd { get; } + public ReactiveCommand SetDefaultMultipleServerCmd { get; } + public ReactiveCommand SetDefaultLoadBalanceServerCmd { get; } + + //servers move + public ReactiveCommand MoveTopCmd { get; } + + public ReactiveCommand MoveUpCmd { get; } + public ReactiveCommand MoveDownCmd { get; } + public ReactiveCommand MoveBottomCmd { get; } + + //servers ping + public ReactiveCommand MixedTestServerCmd { get; } + + public ReactiveCommand TcpingServerCmd { get; } + public ReactiveCommand RealPingServerCmd { get; } + public ReactiveCommand SpeedServerCmd { get; } + public ReactiveCommand SortServerResultCmd { get; } + + //servers export + public ReactiveCommand Export2ClientConfigCmd { get; } + + public ReactiveCommand Export2ClientConfigClipboardCmd { get; } + public ReactiveCommand Export2ShareUrlCmd { get; } + public ReactiveCommand Export2ShareUrlBase64Cmd { get; } + + public ReactiveCommand AddSubCmd { get; } + public ReactiveCommand EditSubCmd { get; } + + #endregion Menu + + #region Init + + public ProfilesViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; + + #region WhenAnyValue && ReactiveCommand + + var canEditRemove = this.WhenAnyValue( + x => x.SelectedProfile, + selectedSource => selectedSource != null && !selectedSource.IndexId.IsNullOrEmpty()); + + this.WhenAnyValue( + x => x.SelectedSub, + y => y != null && !y.Remarks.IsNullOrEmpty() && _config.SubIndexId != y.Id) + .Subscribe(async c => await SubSelectedChangedAsync(c)); + this.WhenAnyValue( + x => x.SelectedMoveToGroup, + y => y != null && !y.Remarks.IsNullOrEmpty()) + .Subscribe(async c => await MoveToGroup(c)); + + this.WhenAnyValue( + x => x.SelectedServer, + y => y != null && !y.Text.IsNullOrEmpty()) + .Subscribe(async c => await ServerSelectedChanged(c)); + + this.WhenAnyValue( + x => x.ServerFilter, + y => y != null && _serverFilter != y) + .Subscribe(c => ServerFilterChanged(c)); + + //servers delete + EditServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditServerAsync(EConfigType.Custom); + }, canEditRemove); + RemoveServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await RemoveServerAsync(); + }, canEditRemove); + RemoveDuplicateServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await RemoveDuplicateServer(); + }); + CopyServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await CopyServer(); + }, canEditRemove); + SetDefaultServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultServer(); + }, canEditRemove); + ShareServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await ShareServerAsync(); + }, canEditRemove); + SetDefaultMultipleServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultMultipleServer(ECoreType.sing_box); + }, canEditRemove); + SetDefaultLoadBalanceServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetDefaultMultipleServer(ECoreType.Xray); + }, canEditRemove); + + //servers move + MoveTopCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveServer(EMove.Top); + }, canEditRemove); + MoveUpCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveServer(EMove.Up); + }, canEditRemove); + MoveDownCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveServer(EMove.Down); + }, canEditRemove); + MoveBottomCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveServer(EMove.Bottom); + }, canEditRemove); + + //servers ping + MixedTestServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await ServerSpeedtest(ESpeedActionType.Mixedtest); + }); + TcpingServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await ServerSpeedtest(ESpeedActionType.Tcping); + }, canEditRemove); + RealPingServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await ServerSpeedtest(ESpeedActionType.Realping); + }, canEditRemove); + SpeedServerCmd = ReactiveCommand.CreateFromTask(async () => + { + await ServerSpeedtest(ESpeedActionType.Speedtest); + }, canEditRemove); + SortServerResultCmd = ReactiveCommand.CreateFromTask(async () => + { + await SortServer(EServerColName.DelayVal.ToString()); + }); + //servers export + Export2ClientConfigCmd = ReactiveCommand.CreateFromTask(async () => + { + await Export2ClientConfigAsync(false); + }, canEditRemove); + Export2ClientConfigClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await Export2ClientConfigAsync(true); + }, canEditRemove); + Export2ShareUrlCmd = ReactiveCommand.CreateFromTask(async () => + { + await Export2ShareUrlAsync(false); + }, canEditRemove); + Export2ShareUrlBase64Cmd = ReactiveCommand.CreateFromTask(async () => + { + await Export2ShareUrlAsync(true); + }, canEditRemove); + + //Subscription + AddSubCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditSubAsync(true); + }); + EditSubCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditSubAsync(false); + }); + + #endregion WhenAnyValue && ReactiveCommand + + if (_updateView != null) + { + MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); + } + + _ = Init(); + } + + private async Task Init() + { + SelectedProfile = new(); + SelectedSub = new(); + SelectedMoveToGroup = new(); + SelectedServer = new(); + + await RefreshSubscriptions(); + RefreshServers(); + } + + #endregion Init + + #region Actions + + private async void OnNext(string x) + { + await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null); + } + + private void Reload() + { + Locator.Current.GetService()?.Reload(); + } + + private void UpdateSpeedtestHandler(SpeedTestResult result) + { + _updateView?.Invoke(EViewAction.DispatcherSpeedTest, result); + } + + public void SetSpeedTestResult(SpeedTestResult result) + { + if (Utils.IsNullOrEmpty(result.IndexId)) + { + NoticeHandler.Instance.SendMessageEx(result.Delay); + NoticeHandler.Instance.Enqueue(result.Delay); + return; + } + var item = _profileItems.Where(it => it.IndexId == result.IndexId).FirstOrDefault(); + if (item != null) + { + if (Utils.IsNotEmpty(result.Delay)) + { + int.TryParse(result.Delay, out int temp); + item.Delay = temp; + item.DelayVal = $"{result.Delay} {Global.DelayUnit}"; + } + if (Utils.IsNotEmpty(result.Speed)) + { + item.SpeedVal = $"{result.Speed} {Global.SpeedUnit}"; + } + _profileItems.Replace(item, JsonUtils.DeepCopy(item)); + } + } + + public void UpdateStatistics(ServerSpeedItem update) + { + try + { + var item = _profileItems.Where(it => it.IndexId == update.IndexId).FirstOrDefault(); + if (item != null) + { + item.TodayDown = Utils.HumanFy(update.TodayDown); + item.TodayUp = Utils.HumanFy(update.TodayUp); + item.TotalDown = Utils.HumanFy(update.TotalDown); + item.TotalUp = Utils.HumanFy(update.TotalUp); + + if (SelectedProfile?.IndexId == item.IndexId) + { + var temp = JsonUtils.DeepCopy(item); + _profileItems.Replace(item, temp); + SelectedProfile = temp; + } + else + { + _profileItems.Replace(item, JsonUtils.DeepCopy(item)); + } + } + } + catch + { + } + } + + public async Task AutofitColumnWidthAsync() + { + await _updateView?.Invoke(EViewAction.AdjustMainLvColWidth, null); + } + + #endregion Actions + + #region Servers && Groups + + private async Task SubSelectedChangedAsync(bool c) + { + if (!c) + { + return; + } + _config.SubIndexId = SelectedSub?.Id; + + RefreshServers(); + + await _updateView?.Invoke(EViewAction.ProfilesFocus, null); + } + + private void ServerFilterChanged(bool c) + { + if (!c) + { + return; + } + _serverFilter = ServerFilter; + if (Utils.IsNullOrEmpty(_serverFilter)) + { + RefreshServers(); + } + } + + public void RefreshServers() + { + MessageBus.Current.SendMessage("", EMsgCommand.RefreshProfiles.ToString()); + } + + public async Task RefreshServersBiz() + { + var lstModel = await GetProfileItemsEx(_config.SubIndexId, _serverFilter); + _lstProfile = JsonUtils.Deserialize>(JsonUtils.Serialize(lstModel)) ?? []; + + _profileItems.Clear(); + _profileItems.AddRange(lstModel); + if (lstModel.Count > 0) + { + var selected = lstModel.FirstOrDefault(t => t.IndexId == _config.IndexId); + if (selected != null) + { + SelectedProfile = selected; + } + else + { + SelectedProfile = lstModel.First(); + } + } + } + + public async Task RefreshSubscriptions() + { + _subItems.Clear(); + + _subItems.Add(new SubItem { Remarks = ResUI.AllGroupServers }); + + foreach (var item in await AppHandler.Instance.SubItems()) + { + _subItems.Add(item); + } + if (_config.SubIndexId != null && _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId) != null) + { + SelectedSub = _subItems.FirstOrDefault(t => t.Id == _config.SubIndexId); + } + else + { + SelectedSub = _subItems.First(); + } + } + + private async Task?> GetProfileItemsEx(string subid, string filter) + { + var lstModel = await AppHandler.Instance.ProfileItems(_config.SubIndexId, filter); + + await ConfigHandler.SetDefaultServer(_config, lstModel); + + var lstServerStat = (_config.GuiItem.EnableStatistics ? StatisticsHandler.Instance.ServerStat : null) ?? []; + var lstProfileExs = await ProfileExHandler.Instance.GetProfileExs(); + lstModel = (from t in lstModel + join t2 in lstServerStat on t.IndexId equals t2.IndexId into t2b + from t22 in t2b.DefaultIfEmpty() + join t3 in lstProfileExs on t.IndexId equals t3.IndexId into t3b + from t33 in t3b.DefaultIfEmpty() + select new ProfileItemModel + { + IndexId = t.IndexId, + ConfigType = t.ConfigType, + Remarks = t.Remarks, + Address = t.Address, + Port = t.Port, + Security = t.Security, + Network = t.Network, + StreamSecurity = t.StreamSecurity, + Subid = t.Subid, + SubRemarks = t.SubRemarks, + IsActive = t.IndexId == _config.IndexId, + Sort = t33 == null ? 0 : t33.Sort, + Delay = t33 == null ? 0 : t33.Delay, + DelayVal = t33?.Delay != 0 ? $"{t33?.Delay} {Global.DelayUnit}" : string.Empty, + SpeedVal = t33?.Speed != 0 ? $"{t33?.Speed} {Global.SpeedUnit}" : string.Empty, + TodayDown = t22 == null ? "" : Utils.HumanFy(t22.TodayDown), + TodayUp = t22 == null ? "" : Utils.HumanFy(t22.TodayUp), + TotalDown = t22 == null ? "" : Utils.HumanFy(t22.TotalDown), + TotalUp = t22 == null ? "" : Utils.HumanFy(t22.TotalUp) + }).OrderBy(t => t.Sort).ToList(); + + return lstModel; + } + + #endregion Servers && Groups + + #region Add Servers + + private async Task?> GetProfileItems(bool latest) + { + var lstSelecteds = new List(); + if (SelectedProfiles == null || SelectedProfiles.Count <= 0) + { + return null; + } + + var orderProfiles = SelectedProfiles?.OrderBy(t => t.Sort); + if (latest) + { + foreach (var profile in orderProfiles) + { + var item = await AppHandler.Instance.GetProfileItem(profile.IndexId); + if (item is not null) + { + lstSelecteds.Add(item); + } + } + } + else + { + lstSelecteds = JsonUtils.Deserialize>(JsonUtils.Serialize(orderProfiles)); + } + + return lstSelecteds; + } + + public async Task EditServerAsync(EConfigType eConfigType) + { + if (Utils.IsNullOrEmpty(SelectedProfile?.IndexId)) + { + return; + } + var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); + return; + } + eConfigType = item.ConfigType; + + bool? ret = false; + if (eConfigType == EConfigType.Custom) + { + ret = await _updateView?.Invoke(EViewAction.AddServer2Window, item); + } + else + { + ret = await _updateView?.Invoke(EViewAction.AddServerWindow, item); + } + if (ret == true) + { + RefreshServers(); + if (item.IndexId == _config.IndexId) + { + Reload(); + } + } + } + + public async Task RemoveServerAsync() + { + var lstSelecteds = await GetProfileItems(true); + if (lstSelecteds == null) + { + return; + } + if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) + { + return; + } + var exists = lstSelecteds.Exists(t => t.IndexId == _config.IndexId); + + await ConfigHandler.RemoveServer(_config, lstSelecteds); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + if (lstSelecteds.Count == _profileItems.Count) + { + _profileItems.Clear(); + } + RefreshServers(); + if (exists) + { + Reload(); + } + } + + private async Task RemoveDuplicateServer() + { + var tuple = await ConfigHandler.DedupServerList(_config, _config.SubIndexId); + RefreshServers(); + Reload(); + NoticeHandler.Instance.Enqueue(string.Format(ResUI.RemoveDuplicateServerResult, tuple.Item1, tuple.Item2)); + } + + private async Task CopyServer() + { + var lstSelecteds = await GetProfileItems(false); + if (lstSelecteds == null) + { + return; + } + if (await ConfigHandler.CopyServer(_config, lstSelecteds) == 0) + { + RefreshServers(); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } + } + + public async Task SetDefaultServer() + { + if (Utils.IsNullOrEmpty(SelectedProfile?.IndexId)) + { + return; + } + await SetDefaultServer(SelectedProfile.IndexId); + } + + public async Task SetDefaultServer(string indexId) + { + if (Utils.IsNullOrEmpty(indexId)) + { + return; + } + if (indexId == _config.IndexId) + { + return; + } + var item = await AppHandler.Instance.GetProfileItem(indexId); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); + return; + } + + if (await ConfigHandler.SetDefaultServerIndex(_config, indexId) == 0) + { + RefreshServers(); + Reload(); + } + } + + private async Task ServerSelectedChanged(bool c) + { + if (!c) + { + return; + } + if (SelectedServer == null) + { + return; + } + if (Utils.IsNullOrEmpty(SelectedServer.ID)) + { + return; + } + await SetDefaultServer(SelectedServer.ID); + } + + public async Task ShareServerAsync() + { + var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); + return; + } + var url = FmtHandler.GetShareUri(item); + if (Utils.IsNullOrEmpty(url)) + { + return; + } + + await _updateView?.Invoke(EViewAction.ShareServer, url); + } + + private async Task SetDefaultMultipleServer(ECoreType coreType) + { + var lstSelecteds = await GetProfileItems(true); + if (lstSelecteds == null) + { + return; + } + + var ret = await ConfigHandler.AddCustomServer4Multiple(_config, lstSelecteds, coreType); + if (ret.Success != true) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + return; + } + if (ret?.Data?.ToString() == _config.IndexId) + { + RefreshServers(); + Reload(); + } + else + { + await SetDefaultServer(ret?.Data?.ToString()); + } + } + + public async Task SortServer(string colName) + { + if (Utils.IsNullOrEmpty(colName)) + { + return; + } + + _dicHeaderSort.TryAdd(colName, true); + _dicHeaderSort.TryGetValue(colName, out bool asc); + if (await ConfigHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0) + { + return; + } + _dicHeaderSort[colName] = !asc; + RefreshServers(); + } + + //move server + private async Task MoveToGroup(bool c) + { + if (!c) + { + return; + } + + var lstSelecteds = await GetProfileItems(true); + if (lstSelecteds == null) + { + return; + } + + await ConfigHandler.MoveToGroup(_config, lstSelecteds, SelectedMoveToGroup.Id); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + + RefreshServers(); + SelectedMoveToGroup = null; + SelectedMoveToGroup = new(); + //Reload(); + } + + public async Task MoveServer(EMove eMove) + { + var item = _lstProfile.FirstOrDefault(t => t.IndexId == SelectedProfile.IndexId); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); + return; + } + + int index = _lstProfile.IndexOf(item); + if (index < 0) + { + return; + } + if (await ConfigHandler.MoveServer(_config, _lstProfile, index, eMove) == 0) + { + RefreshServers(); + } + } + + public async Task MoveServerTo(int startIndex, ProfileItemModel targetItem) + { + var targetIndex = _profileItems.IndexOf(targetItem); + if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex) + { + if (await ConfigHandler.MoveServer(_config, _lstProfile, startIndex, EMove.Position, targetIndex) == 0) + { + RefreshServers(); + } + } + } + + public async Task ServerSpeedtest(ESpeedActionType actionType) + { + if (actionType == ESpeedActionType.Mixedtest) + { + SelectedProfiles = _profileItems; + } + var lstSelecteds = await GetProfileItems(false); + if (lstSelecteds == null) + { + return; + } + //ClearTestResult(); + + _ = new SpeedtestService(_config, lstSelecteds, actionType, UpdateSpeedtestHandler); + } + + public void ServerSpeedtestStop() + { + MessageBus.Current.SendMessage("", EMsgCommand.StopSpeedtest.ToString()); + } + + private async Task Export2ClientConfigAsync(bool blClipboard) + { + var item = await AppHandler.Instance.GetProfileItem(SelectedProfile.IndexId); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectServer); + return; + } + if (blClipboard) + { + var result = await CoreConfigHandler.GenerateClientConfig(item, null); + if (result.Success != true) + { + NoticeHandler.Instance.Enqueue(result.Msg); + } + else + { + await _updateView?.Invoke(EViewAction.SetClipboardData, result.Data); + NoticeHandler.Instance.SendMessage(ResUI.OperationSuccess); + } + } + else + { + await _updateView?.Invoke(EViewAction.SaveFileDialog, item); + } + } + + public async Task Export2ClientConfigResult(string fileName, ProfileItem item) + { + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } + var result = await CoreConfigHandler.GenerateClientConfig(item, fileName); + if (result.Success != true) + { + NoticeHandler.Instance.Enqueue(result.Msg); + } + else + { + NoticeHandler.Instance.SendMessageAndEnqueue(string.Format(ResUI.SaveClientConfigurationIn, fileName)); + } + } + + public async Task Export2ShareUrlAsync(bool blEncode) + { + var lstSelecteds = await GetProfileItems(true); + if (lstSelecteds == null) + { + return; + } + + StringBuilder sb = new(); + foreach (var it in lstSelecteds) + { + var url = FmtHandler.GetShareUri(it); + if (Utils.IsNullOrEmpty(url)) + { + continue; + } + sb.Append(url); + sb.AppendLine(); + } + if (sb.Length > 0) + { + if (blEncode) + { + await _updateView?.Invoke(EViewAction.SetClipboardData, Utils.Base64Encode(sb.ToString())); + } + else + { + await _updateView?.Invoke(EViewAction.SetClipboardData, sb.ToString()); + } + NoticeHandler.Instance.SendMessage(ResUI.BatchExportURLSuccessfully); + } + } + + #endregion Add Servers + + #region Subscription + + private async Task EditSubAsync(bool blNew) + { + SubItem item; + if (blNew) + { + item = new(); + } + else + { + item = await AppHandler.Instance.GetSubItem(_config.SubIndexId); + if (item is null) + { + return; + } + } + if (await _updateView?.Invoke(EViewAction.SubEditWindow, item) == true) + { + await RefreshSubscriptions(); + await SubSelectedChangedAsync(true); + } + } + + #endregion Subscription + } +} diff --git a/v2rayN/ServiceLib/ViewModels/RoutingRuleDetailsViewModel.cs b/v2rayN/ServiceLib/ViewModels/RoutingRuleDetailsViewModel.cs index a17ac19c..151eba91 100644 --- a/v2rayN/ServiceLib/ViewModels/RoutingRuleDetailsViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/RoutingRuleDetailsViewModel.cs @@ -1,93 +1,93 @@ -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Reactive; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class RoutingRuleDetailsViewModel : MyReactiveObject - { - public IList ProtocolItems { get; set; } - public IList InboundTagItems { get; set; } + public class RoutingRuleDetailsViewModel : MyReactiveObject + { + public IList ProtocolItems { get; set; } + public IList InboundTagItems { get; set; } - [Reactive] - public RulesItem SelectedSource { get; set; } + [Reactive] + public RulesItem SelectedSource { get; set; } - [Reactive] - public string Domain { get; set; } + [Reactive] + public string Domain { get; set; } - [Reactive] - public string IP { get; set; } + [Reactive] + public string IP { get; set; } - [Reactive] - public string Process { get; set; } + [Reactive] + public string Process { get; set; } - [Reactive] - public bool AutoSort { get; set; } + [Reactive] + public bool AutoSort { get; set; } - public ReactiveCommand SaveCmd { get; } + public ReactiveCommand SaveCmd { get; } - public RoutingRuleDetailsViewModel(RulesItem rulesItem, Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public RoutingRuleDetailsViewModel(RulesItem rulesItem, Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveRulesAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveRulesAsync(); + }); - if (rulesItem.Id.IsNullOrEmpty()) - { - rulesItem.Id = Utils.GetGuid(false); - rulesItem.OutboundTag = Global.ProxyTag; - rulesItem.Enabled = true; - SelectedSource = rulesItem; - } - else - { - SelectedSource = rulesItem; - } + if (rulesItem.Id.IsNullOrEmpty()) + { + rulesItem.Id = Utils.GetGuid(false); + rulesItem.OutboundTag = Global.ProxyTag; + rulesItem.Enabled = true; + SelectedSource = rulesItem; + } + else + { + SelectedSource = rulesItem; + } - Domain = Utils.List2String(SelectedSource.Domain, true); - IP = Utils.List2String(SelectedSource.Ip, true); - Process = Utils.List2String(SelectedSource.Process, true); - } + Domain = Utils.List2String(SelectedSource.Domain, true); + IP = Utils.List2String(SelectedSource.Ip, true); + Process = Utils.List2String(SelectedSource.Process, true); + } - private async Task SaveRulesAsync() - { - Domain = Utils.Convert2Comma(Domain); - IP = Utils.Convert2Comma(IP); - Process = Utils.Convert2Comma(Process); + private async Task SaveRulesAsync() + { + Domain = Utils.Convert2Comma(Domain); + IP = Utils.Convert2Comma(IP); + Process = Utils.Convert2Comma(Process); - if (AutoSort) - { - SelectedSource.Domain = Utils.String2ListSorted(Domain); - SelectedSource.Ip = Utils.String2ListSorted(IP); - SelectedSource.Process = Utils.String2ListSorted(Process); - } - else - { - SelectedSource.Domain = Utils.String2List(Domain); - SelectedSource.Ip = Utils.String2List(IP); - SelectedSource.Process = Utils.String2List(Process); - } - SelectedSource.Protocol = ProtocolItems?.ToList(); - SelectedSource.InboundTag = InboundTagItems?.ToList(); + if (AutoSort) + { + SelectedSource.Domain = Utils.String2ListSorted(Domain); + SelectedSource.Ip = Utils.String2ListSorted(IP); + SelectedSource.Process = Utils.String2ListSorted(Process); + } + else + { + SelectedSource.Domain = Utils.String2List(Domain); + SelectedSource.Ip = Utils.String2List(IP); + SelectedSource.Process = Utils.String2List(Process); + } + SelectedSource.Protocol = ProtocolItems?.ToList(); + SelectedSource.InboundTag = InboundTagItems?.ToList(); - var hasRule = SelectedSource.Domain?.Count > 0 - || SelectedSource.Ip?.Count > 0 - || SelectedSource.Protocol?.Count > 0 - || SelectedSource.Process?.Count > 0 - || Utils.IsNotEmpty(SelectedSource.Port) - || Utils.IsNotEmpty(SelectedSource.Network); + var hasRule = SelectedSource.Domain?.Count > 0 + || SelectedSource.Ip?.Count > 0 + || SelectedSource.Protocol?.Count > 0 + || SelectedSource.Process?.Count > 0 + || Utils.IsNotEmpty(SelectedSource.Port) + || Utils.IsNotEmpty(SelectedSource.Network); - if (!hasRule) - { - NoticeHandler.Instance.Enqueue(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Network/Port/Protocol/Domain/IP/Process")); - return; - } - //NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - await _updateView?.Invoke(EViewAction.CloseWindow, null); - } - } -} \ No newline at end of file + if (!hasRule) + { + NoticeHandler.Instance.Enqueue(string.Format(ResUI.RoutingRuleDetailRequiredTips, "Network/Port/Protocol/Domain/IP/Process")); + return; + } + //NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + await _updateView?.Invoke(EViewAction.CloseWindow, null); + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/RoutingRuleSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/RoutingRuleSettingViewModel.cs index 1dd23893..8c3bffcf 100644 --- a/v2rayN/ServiceLib/ViewModels/RoutingRuleSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/RoutingRuleSettingViewModel.cs @@ -1,341 +1,341 @@ -using DynamicData.Binding; -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Reactive; using System.Text.Json; using System.Text.Json.Serialization; +using DynamicData.Binding; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class RoutingRuleSettingViewModel : MyReactiveObject - { - private List _rules; + public class RoutingRuleSettingViewModel : MyReactiveObject + { + private List _rules; - [Reactive] - public RoutingItem SelectedRouting { get; set; } + [Reactive] + public RoutingItem SelectedRouting { get; set; } - private IObservableCollection _rulesItems = new ObservableCollectionExtended(); - public IObservableCollection RulesItems => _rulesItems; + private IObservableCollection _rulesItems = new ObservableCollectionExtended(); + public IObservableCollection RulesItems => _rulesItems; - [Reactive] - public RulesItemModel SelectedSource { get; set; } + [Reactive] + public RulesItemModel SelectedSource { get; set; } - public IList SelectedSources { get; set; } + public IList SelectedSources { get; set; } - public ReactiveCommand RuleAddCmd { get; } - public ReactiveCommand ImportRulesFromFileCmd { get; } - public ReactiveCommand ImportRulesFromClipboardCmd { get; } - public ReactiveCommand ImportRulesFromUrlCmd { get; } - public ReactiveCommand RuleRemoveCmd { get; } - public ReactiveCommand RuleExportSelectedCmd { get; } - public ReactiveCommand MoveTopCmd { get; } - public ReactiveCommand MoveUpCmd { get; } - public ReactiveCommand MoveDownCmd { get; } - public ReactiveCommand MoveBottomCmd { get; } + public ReactiveCommand RuleAddCmd { get; } + public ReactiveCommand ImportRulesFromFileCmd { get; } + public ReactiveCommand ImportRulesFromClipboardCmd { get; } + public ReactiveCommand ImportRulesFromUrlCmd { get; } + public ReactiveCommand RuleRemoveCmd { get; } + public ReactiveCommand RuleExportSelectedCmd { get; } + public ReactiveCommand MoveTopCmd { get; } + public ReactiveCommand MoveUpCmd { get; } + public ReactiveCommand MoveDownCmd { get; } + public ReactiveCommand MoveBottomCmd { get; } - public ReactiveCommand SaveCmd { get; } + public ReactiveCommand SaveCmd { get; } - public RoutingRuleSettingViewModel(RoutingItem routingItem, Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public RoutingRuleSettingViewModel(RoutingItem routingItem, Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - var canEditRemove = this.WhenAnyValue( - x => x.SelectedSource, - selectedSource => selectedSource != null && !selectedSource.OutboundTag.IsNullOrEmpty()); + var canEditRemove = this.WhenAnyValue( + x => x.SelectedSource, + selectedSource => selectedSource != null && !selectedSource.OutboundTag.IsNullOrEmpty()); - RuleAddCmd = ReactiveCommand.CreateFromTask(async () => - { - await RuleEditAsync(true); - }); - ImportRulesFromFileCmd = ReactiveCommand.CreateFromTask(async () => - { - await _updateView?.Invoke(EViewAction.ImportRulesFromFile, null); - }); - ImportRulesFromClipboardCmd = ReactiveCommand.CreateFromTask(async () => - { - await ImportRulesFromClipboardAsync(null); - }); - ImportRulesFromUrlCmd = ReactiveCommand.CreateFromTask(async () => - { - await ImportRulesFromUrl(); - }); + RuleAddCmd = ReactiveCommand.CreateFromTask(async () => + { + await RuleEditAsync(true); + }); + ImportRulesFromFileCmd = ReactiveCommand.CreateFromTask(async () => + { + await _updateView?.Invoke(EViewAction.ImportRulesFromFile, null); + }); + ImportRulesFromClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await ImportRulesFromClipboardAsync(null); + }); + ImportRulesFromUrlCmd = ReactiveCommand.CreateFromTask(async () => + { + await ImportRulesFromUrl(); + }); - RuleRemoveCmd = ReactiveCommand.CreateFromTask(async () => - { - await RuleRemoveAsync(); - }, canEditRemove); - RuleExportSelectedCmd = ReactiveCommand.CreateFromTask(async () => - { - await RuleExportSelectedAsync(); - }, canEditRemove); + RuleRemoveCmd = ReactiveCommand.CreateFromTask(async () => + { + await RuleRemoveAsync(); + }, canEditRemove); + RuleExportSelectedCmd = ReactiveCommand.CreateFromTask(async () => + { + await RuleExportSelectedAsync(); + }, canEditRemove); - MoveTopCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveRule(EMove.Top); - }, canEditRemove); - MoveUpCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveRule(EMove.Up); - }, canEditRemove); - MoveDownCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveRule(EMove.Down); - }, canEditRemove); - MoveBottomCmd = ReactiveCommand.CreateFromTask(async () => - { - await MoveRule(EMove.Bottom); - }, canEditRemove); + MoveTopCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveRule(EMove.Top); + }, canEditRemove); + MoveUpCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveRule(EMove.Up); + }, canEditRemove); + MoveDownCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveRule(EMove.Down); + }, canEditRemove); + MoveBottomCmd = ReactiveCommand.CreateFromTask(async () => + { + await MoveRule(EMove.Bottom); + }, canEditRemove); - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveRoutingAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveRoutingAsync(); + }); - SelectedSource = new(); - SelectedRouting = routingItem; - _rules = routingItem.Id.IsNullOrEmpty() ? new() : JsonUtils.Deserialize>(SelectedRouting.RuleSet); + SelectedSource = new(); + SelectedRouting = routingItem; + _rules = routingItem.Id.IsNullOrEmpty() ? new() : JsonUtils.Deserialize>(SelectedRouting.RuleSet); - RefreshRulesItems(); - } + RefreshRulesItems(); + } - public void RefreshRulesItems() - { - _rulesItems.Clear(); + public void RefreshRulesItems() + { + _rulesItems.Clear(); - foreach (var item in _rules) - { - var it = new RulesItemModel() - { - Id = item.Id, - OutboundTag = item.OutboundTag, - Port = item.Port, - Network = item.Network, - Protocols = Utils.List2String(item.Protocol), - InboundTags = Utils.List2String(item.InboundTag), - Domains = Utils.List2String(item.Domain), - Ips = Utils.List2String(item.Ip), - Enabled = item.Enabled, - Remarks = item.Remarks, - }; - _rulesItems.Add(it); - } - } + foreach (var item in _rules) + { + var it = new RulesItemModel() + { + Id = item.Id, + OutboundTag = item.OutboundTag, + Port = item.Port, + Network = item.Network, + Protocols = Utils.List2String(item.Protocol), + InboundTags = Utils.List2String(item.InboundTag), + Domains = Utils.List2String(item.Domain), + Ips = Utils.List2String(item.Ip), + Enabled = item.Enabled, + Remarks = item.Remarks, + }; + _rulesItems.Add(it); + } + } - public async Task RuleEditAsync(bool blNew) - { - RulesItem? item; - if (blNew) - { - item = new(); - } - else - { - item = _rules.FirstOrDefault(t => t.Id == SelectedSource?.Id); - if (item is null) - { - return; - } - } - if (await _updateView?.Invoke(EViewAction.RoutingRuleDetailsWindow, item) == true) - { - if (blNew) - { - _rules.Add(item); - } - RefreshRulesItems(); - } - } + public async Task RuleEditAsync(bool blNew) + { + RulesItem? item; + if (blNew) + { + item = new(); + } + else + { + item = _rules.FirstOrDefault(t => t.Id == SelectedSource?.Id); + if (item is null) + { + return; + } + } + if (await _updateView?.Invoke(EViewAction.RoutingRuleDetailsWindow, item) == true) + { + if (blNew) + { + _rules.Add(item); + } + RefreshRulesItems(); + } + } - public async Task RuleRemoveAsync() - { - if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); - return; - } - if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) - { - return; - } - foreach (var it in SelectedSources ?? [SelectedSource]) - { - var item = _rules.FirstOrDefault(t => t.Id == it?.Id); - if (item != null) - { - _rules.Remove(item); - } - } + public async Task RuleRemoveAsync() + { + if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); + return; + } + if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) + { + return; + } + foreach (var it in SelectedSources ?? [SelectedSource]) + { + var item = _rules.FirstOrDefault(t => t.Id == it?.Id); + if (item != null) + { + _rules.Remove(item); + } + } - RefreshRulesItems(); - } + RefreshRulesItems(); + } - public async Task RuleExportSelectedAsync() - { - if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); - return; - } + public async Task RuleExportSelectedAsync() + { + if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); + return; + } - var lst = new List(); - var sources = SelectedSources ?? [SelectedSource]; - foreach (var it in _rules) - { - if (sources.Any(t => t.Id == it?.Id)) - { - var item2 = JsonUtils.DeepCopy(it); - item2.Id = null; - lst.Add(item2 ?? new()); - } - } - if (lst.Count > 0) - { - var options = new JsonSerializerOptions - { - WriteIndented = true, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - PropertyNamingPolicy = JsonNamingPolicy.CamelCase, - }; - await _updateView?.Invoke(EViewAction.SetClipboardData, JsonUtils.Serialize(lst, options)); - } - } + var lst = new List(); + var sources = SelectedSources ?? [SelectedSource]; + foreach (var it in _rules) + { + if (sources.Any(t => t.Id == it?.Id)) + { + var item2 = JsonUtils.DeepCopy(it); + item2.Id = null; + lst.Add(item2 ?? new()); + } + } + if (lst.Count > 0) + { + var options = new JsonSerializerOptions + { + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase, + }; + await _updateView?.Invoke(EViewAction.SetClipboardData, JsonUtils.Serialize(lst, options)); + } + } - public async Task MoveRule(EMove eMove) - { - if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); - return; - } + public async Task MoveRule(EMove eMove) + { + if (SelectedSource is null || SelectedSource.OutboundTag.IsNullOrEmpty()) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); + return; + } - var item = _rules.FirstOrDefault(t => t.Id == SelectedSource?.Id); - if (item == null) - { - return; - } - var index = _rules.IndexOf(item); - if (await ConfigHandler.MoveRoutingRule(_rules, index, eMove) == 0) - { - RefreshRulesItems(); - } - } + var item = _rules.FirstOrDefault(t => t.Id == SelectedSource?.Id); + if (item == null) + { + return; + } + var index = _rules.IndexOf(item); + if (await ConfigHandler.MoveRoutingRule(_rules, index, eMove) == 0) + { + RefreshRulesItems(); + } + } - private async Task SaveRoutingAsync() - { - string remarks = SelectedRouting.Remarks; - if (Utils.IsNullOrEmpty(remarks)) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); - return; - } - var item = SelectedRouting; - foreach (var it in _rules) - { - it.Id = Utils.GetGuid(false); - } - item.RuleNum = _rules.Count; - item.RuleSet = JsonUtils.Serialize(_rules, false); + private async Task SaveRoutingAsync() + { + string remarks = SelectedRouting.Remarks; + if (Utils.IsNullOrEmpty(remarks)) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); + return; + } + var item = SelectedRouting; + foreach (var it in _rules) + { + it.Id = Utils.GetGuid(false); + } + item.RuleNum = _rules.Count; + item.RuleSet = JsonUtils.Serialize(_rules, false); - if (await ConfigHandler.SaveRoutingItem(_config, item) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } + if (await ConfigHandler.SaveRoutingItem(_config, item) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } - #region Import rules + #region Import rules - public async Task ImportRulesFromFileAsync(string fileName) - { - if (Utils.IsNullOrEmpty(fileName)) - { - return; - } + public async Task ImportRulesFromFileAsync(string fileName) + { + if (Utils.IsNullOrEmpty(fileName)) + { + return; + } - var result = Utils.LoadResource(fileName); - if (Utils.IsNullOrEmpty(result)) - { - return; - } - var ret = await AddBatchRoutingRulesAsync(SelectedRouting, result); - if (ret == 0) - { - RefreshRulesItems(); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } - } + var result = Utils.LoadResource(fileName); + if (Utils.IsNullOrEmpty(result)) + { + return; + } + var ret = await AddBatchRoutingRulesAsync(SelectedRouting, result); + if (ret == 0) + { + RefreshRulesItems(); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } + } - public async Task ImportRulesFromClipboardAsync(string? clipboardData) - { - if (clipboardData == null) - { - await _updateView?.Invoke(EViewAction.ImportRulesFromClipboard, null); - return; - } - var ret = await AddBatchRoutingRulesAsync(SelectedRouting, clipboardData); - if (ret == 0) - { - RefreshRulesItems(); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } - } + public async Task ImportRulesFromClipboardAsync(string? clipboardData) + { + if (clipboardData == null) + { + await _updateView?.Invoke(EViewAction.ImportRulesFromClipboard, null); + return; + } + var ret = await AddBatchRoutingRulesAsync(SelectedRouting, clipboardData); + if (ret == 0) + { + RefreshRulesItems(); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } + } - private async Task ImportRulesFromUrl() - { - var url = SelectedRouting.Url; - if (Utils.IsNullOrEmpty(url)) - { - NoticeHandler.Instance.Enqueue(ResUI.MsgNeedUrl); - return; - } + private async Task ImportRulesFromUrl() + { + var url = SelectedRouting.Url; + if (Utils.IsNullOrEmpty(url)) + { + NoticeHandler.Instance.Enqueue(ResUI.MsgNeedUrl); + return; + } - DownloadService downloadHandle = new DownloadService(); - var result = await downloadHandle.TryDownloadString(url, true, ""); - var ret = await AddBatchRoutingRulesAsync(SelectedRouting, result); - if (ret == 0) - { - RefreshRulesItems(); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - } - } + DownloadService downloadHandle = new DownloadService(); + var result = await downloadHandle.TryDownloadString(url, true, ""); + var ret = await AddBatchRoutingRulesAsync(SelectedRouting, result); + if (ret == 0) + { + RefreshRulesItems(); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + } + } - private async Task AddBatchRoutingRulesAsync(RoutingItem routingItem, string? clipboardData) - { - bool blReplace = false; - if (await _updateView?.Invoke(EViewAction.AddBatchRoutingRulesYesNo, null) == false) - { - blReplace = true; - } - if (Utils.IsNullOrEmpty(clipboardData)) - { - return -1; - } - var lstRules = JsonUtils.Deserialize>(clipboardData); - if (lstRules == null) - { - return -1; - } - foreach (var rule in lstRules) - { - rule.Id = Utils.GetGuid(false); - } + private async Task AddBatchRoutingRulesAsync(RoutingItem routingItem, string? clipboardData) + { + bool blReplace = false; + if (await _updateView?.Invoke(EViewAction.AddBatchRoutingRulesYesNo, null) == false) + { + blReplace = true; + } + if (Utils.IsNullOrEmpty(clipboardData)) + { + return -1; + } + var lstRules = JsonUtils.Deserialize>(clipboardData); + if (lstRules == null) + { + return -1; + } + foreach (var rule in lstRules) + { + rule.Id = Utils.GetGuid(false); + } - if (blReplace) - { - _rules = lstRules; - } - else - { - _rules.AddRange(lstRules); - } - return 0; - } + if (blReplace) + { + _rules = lstRules; + } + else + { + _rules.AddRange(lstRules); + } + return 0; + } - #endregion Import rules - } -} \ No newline at end of file + #endregion Import rules + } +} diff --git a/v2rayN/ServiceLib/ViewModels/RoutingSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/RoutingSettingViewModel.cs index 111d249c..67208ddf 100644 --- a/v2rayN/ServiceLib/ViewModels/RoutingSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/RoutingSettingViewModel.cs @@ -1,205 +1,205 @@ -using DynamicData.Binding; +using System.Reactive; +using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; namespace ServiceLib.ViewModels { - public class RoutingSettingViewModel : MyReactiveObject - { - #region Reactive + public class RoutingSettingViewModel : MyReactiveObject + { + #region Reactive - private IObservableCollection _routingItems = new ObservableCollectionExtended(); - public IObservableCollection RoutingItems => _routingItems; + private IObservableCollection _routingItems = new ObservableCollectionExtended(); + public IObservableCollection RoutingItems => _routingItems; - [Reactive] - public RoutingItemModel SelectedSource { get; set; } + [Reactive] + public RoutingItemModel SelectedSource { get; set; } - public IList SelectedSources { get; set; } + public IList SelectedSources { get; set; } - [Reactive] - public string domainStrategy { get; set; } + [Reactive] + public string domainStrategy { get; set; } - [Reactive] - public string domainMatcher { get; set; } + [Reactive] + public string domainMatcher { get; set; } - [Reactive] - public string domainStrategy4Singbox { get; set; } + [Reactive] + public string domainStrategy4Singbox { get; set; } - public ReactiveCommand RoutingAdvancedAddCmd { get; } - public ReactiveCommand RoutingAdvancedRemoveCmd { get; } - public ReactiveCommand RoutingAdvancedSetDefaultCmd { get; } - public ReactiveCommand RoutingAdvancedImportRulesCmd { get; } + public ReactiveCommand RoutingAdvancedAddCmd { get; } + public ReactiveCommand RoutingAdvancedRemoveCmd { get; } + public ReactiveCommand RoutingAdvancedSetDefaultCmd { get; } + public ReactiveCommand RoutingAdvancedImportRulesCmd { get; } - public ReactiveCommand SaveCmd { get; } - public bool IsModified { get; set; } + public ReactiveCommand SaveCmd { get; } + public bool IsModified { get; set; } - #endregion Reactive + #endregion Reactive - public RoutingSettingViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public RoutingSettingViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - var canEditRemove = this.WhenAnyValue( - x => x.SelectedSource, - selectedSource => selectedSource != null && !selectedSource.Remarks.IsNullOrEmpty()); + var canEditRemove = this.WhenAnyValue( + x => x.SelectedSource, + selectedSource => selectedSource != null && !selectedSource.Remarks.IsNullOrEmpty()); - RoutingAdvancedAddCmd = ReactiveCommand.CreateFromTask(async () => - { - await RoutingAdvancedEditAsync(true); - }); - RoutingAdvancedRemoveCmd = ReactiveCommand.CreateFromTask(async () => - { - await RoutingAdvancedRemoveAsync(); - }, canEditRemove); - RoutingAdvancedSetDefaultCmd = ReactiveCommand.CreateFromTask(async () => - { - await RoutingAdvancedSetDefault(); - }, canEditRemove); - RoutingAdvancedImportRulesCmd = ReactiveCommand.CreateFromTask(async () => - { - await RoutingAdvancedImportRules(); - }); + RoutingAdvancedAddCmd = ReactiveCommand.CreateFromTask(async () => + { + await RoutingAdvancedEditAsync(true); + }); + RoutingAdvancedRemoveCmd = ReactiveCommand.CreateFromTask(async () => + { + await RoutingAdvancedRemoveAsync(); + }, canEditRemove); + RoutingAdvancedSetDefaultCmd = ReactiveCommand.CreateFromTask(async () => + { + await RoutingAdvancedSetDefault(); + }, canEditRemove); + RoutingAdvancedImportRulesCmd = ReactiveCommand.CreateFromTask(async () => + { + await RoutingAdvancedImportRules(); + }); - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveRoutingAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveRoutingAsync(); + }); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - SelectedSource = new(); + private async Task Init() + { + SelectedSource = new(); - domainStrategy = _config.RoutingBasicItem.DomainStrategy; - domainMatcher = _config.RoutingBasicItem.DomainMatcher; - domainStrategy4Singbox = _config.RoutingBasicItem.DomainStrategy4Singbox; + domainStrategy = _config.RoutingBasicItem.DomainStrategy; + domainMatcher = _config.RoutingBasicItem.DomainMatcher; + domainStrategy4Singbox = _config.RoutingBasicItem.DomainStrategy4Singbox; - await ConfigHandler.InitBuiltinRouting(_config); - await RefreshRoutingItems(); - } + await ConfigHandler.InitBuiltinRouting(_config); + await RefreshRoutingItems(); + } - #region Refresh Save + #region Refresh Save - public async Task RefreshRoutingItems() - { - _routingItems.Clear(); + public async Task RefreshRoutingItems() + { + _routingItems.Clear(); - var routings = await AppHandler.Instance.RoutingItems(); - foreach (var item in routings) - { - bool def = false; - if (item.Id == _config.RoutingBasicItem.RoutingIndexId) - { - def = true; - } + var routings = await AppHandler.Instance.RoutingItems(); + foreach (var item in routings) + { + bool def = false; + if (item.Id == _config.RoutingBasicItem.RoutingIndexId) + { + def = true; + } - var it = new RoutingItemModel() - { - IsActive = def, - RuleNum = item.RuleNum, - Id = item.Id, - Remarks = item.Remarks, - Url = item.Url, - CustomIcon = item.CustomIcon, - CustomRulesetPath4Singbox = item.CustomRulesetPath4Singbox, - Sort = item.Sort, - }; - _routingItems.Add(it); - } - } + var it = new RoutingItemModel() + { + IsActive = def, + RuleNum = item.RuleNum, + Id = item.Id, + Remarks = item.Remarks, + Url = item.Url, + CustomIcon = item.CustomIcon, + CustomRulesetPath4Singbox = item.CustomRulesetPath4Singbox, + Sort = item.Sort, + }; + _routingItems.Add(it); + } + } - private async Task SaveRoutingAsync() - { - _config.RoutingBasicItem.DomainStrategy = domainStrategy; - _config.RoutingBasicItem.DomainMatcher = domainMatcher; - _config.RoutingBasicItem.DomainStrategy4Singbox = domainStrategy4Singbox; + private async Task SaveRoutingAsync() + { + _config.RoutingBasicItem.DomainStrategy = domainStrategy; + _config.RoutingBasicItem.DomainMatcher = domainMatcher; + _config.RoutingBasicItem.DomainStrategy4Singbox = domainStrategy4Singbox; - if (await ConfigHandler.SaveConfig(_config) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } + if (await ConfigHandler.SaveConfig(_config) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } - #endregion Refresh Save + #endregion Refresh Save - public async Task RoutingAdvancedEditAsync(bool blNew) - { - RoutingItem item; - if (blNew) - { - item = new(); - } - else - { - item = await AppHandler.Instance.GetRoutingItem(SelectedSource?.Id); - if (item is null) - { - return; - } - } - if (await _updateView?.Invoke(EViewAction.RoutingRuleSettingWindow, item) == true) - { - await RefreshRoutingItems(); - IsModified = true; - } - } + public async Task RoutingAdvancedEditAsync(bool blNew) + { + RoutingItem item; + if (blNew) + { + item = new(); + } + else + { + item = await AppHandler.Instance.GetRoutingItem(SelectedSource?.Id); + if (item is null) + { + return; + } + } + if (await _updateView?.Invoke(EViewAction.RoutingRuleSettingWindow, item) == true) + { + await RefreshRoutingItems(); + IsModified = true; + } + } - public async Task RoutingAdvancedRemoveAsync() - { - if (SelectedSource is null || SelectedSource.Remarks.IsNullOrEmpty()) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); - return; - } - if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) - { - return; - } - foreach (var it in SelectedSources ?? [SelectedSource]) - { - var item = await AppHandler.Instance.GetRoutingItem(it?.Id); - if (item != null) - { - await ConfigHandler.RemoveRoutingItem(item); - } - } + public async Task RoutingAdvancedRemoveAsync() + { + if (SelectedSource is null || SelectedSource.Remarks.IsNullOrEmpty()) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); + return; + } + if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) + { + return; + } + foreach (var it in SelectedSources ?? [SelectedSource]) + { + var item = await AppHandler.Instance.GetRoutingItem(it?.Id); + if (item != null) + { + await ConfigHandler.RemoveRoutingItem(item); + } + } - await RefreshRoutingItems(); - IsModified = true; - } + await RefreshRoutingItems(); + IsModified = true; + } - public async Task RoutingAdvancedSetDefault() - { - var item = await AppHandler.Instance.GetRoutingItem(SelectedSource?.Id); - if (item is null) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); - return; - } + public async Task RoutingAdvancedSetDefault() + { + var item = await AppHandler.Instance.GetRoutingItem(SelectedSource?.Id); + if (item is null) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseSelectRules); + return; + } - if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) - { - await RefreshRoutingItems(); - IsModified = true; - } - } + if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) + { + await RefreshRoutingItems(); + IsModified = true; + } + } - private async Task RoutingAdvancedImportRules() - { - if (await ConfigHandler.InitRouting(_config, true) == 0) - { - await RefreshRoutingItems(); - IsModified = true; - } - } - } -} \ No newline at end of file + private async Task RoutingAdvancedImportRules() + { + if (await ConfigHandler.InitRouting(_config, true) == 0) + { + await RefreshRoutingItems(); + IsModified = true; + } + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs index 99cf95f2..cc421d51 100644 --- a/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs @@ -1,499 +1,502 @@ -using DynamicData.Binding; +using System.Reactive; +using System.Text; +using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Splat; -using System.Reactive; -using System.Text; namespace ServiceLib.ViewModels { - public class StatusBarViewModel : MyReactiveObject - { - #region ObservableCollection + public class StatusBarViewModel : MyReactiveObject + { + #region ObservableCollection - private IObservableCollection _routingItems = new ObservableCollectionExtended(); - public IObservableCollection RoutingItems => _routingItems; + private IObservableCollection _routingItems = new ObservableCollectionExtended(); + public IObservableCollection RoutingItems => _routingItems; - private IObservableCollection _servers = new ObservableCollectionExtended(); - public IObservableCollection Servers => _servers; + private IObservableCollection _servers = new ObservableCollectionExtended(); + public IObservableCollection Servers => _servers; - [Reactive] - public RoutingItem SelectedRouting { get; set; } + [Reactive] + public RoutingItem SelectedRouting { get; set; } - [Reactive] - public ComboItem SelectedServer { get; set; } + [Reactive] + public ComboItem SelectedServer { get; set; } - [Reactive] - public bool BlServers { get; set; } + [Reactive] + public bool BlServers { get; set; } - #endregion ObservableCollection + #endregion ObservableCollection - public ReactiveCommand AddServerViaClipboardCmd { get; } - public ReactiveCommand AddServerViaScanCmd { get; } - public ReactiveCommand SubUpdateCmd { get; } - public ReactiveCommand SubUpdateViaProxyCmd { get; } - public ReactiveCommand CopyProxyCmdToClipboardCmd { get; } - public ReactiveCommand NotifyLeftClickCmd { get; } + public ReactiveCommand AddServerViaClipboardCmd { get; } + public ReactiveCommand AddServerViaScanCmd { get; } + public ReactiveCommand SubUpdateCmd { get; } + public ReactiveCommand SubUpdateViaProxyCmd { get; } + public ReactiveCommand CopyProxyCmdToClipboardCmd { get; } + public ReactiveCommand NotifyLeftClickCmd { get; } - #region System Proxy + #region System Proxy - [Reactive] - public bool BlSystemProxyClear { get; set; } + [Reactive] + public bool BlSystemProxyClear { get; set; } - [Reactive] - public bool BlSystemProxySet { get; set; } + [Reactive] + public bool BlSystemProxySet { get; set; } - [Reactive] - public bool BlSystemProxyNothing { get; set; } + [Reactive] + public bool BlSystemProxyNothing { get; set; } - [Reactive] - public bool BlSystemProxyPac { get; set; } + [Reactive] + public bool BlSystemProxyPac { get; set; } - public ReactiveCommand SystemProxyClearCmd { get; } - public ReactiveCommand SystemProxySetCmd { get; } - public ReactiveCommand SystemProxyNothingCmd { get; } - public ReactiveCommand SystemProxyPacCmd { get; } + public ReactiveCommand SystemProxyClearCmd { get; } + public ReactiveCommand SystemProxySetCmd { get; } + public ReactiveCommand SystemProxyNothingCmd { get; } + public ReactiveCommand SystemProxyPacCmd { get; } - [Reactive] - public bool BlRouting { get; set; } + [Reactive] + public bool BlRouting { get; set; } - [Reactive] - public int SystemProxySelected { get; set; } - - #endregion System Proxy - - #region UI - - [Reactive] - public string InboundDisplay { get; set; } - - [Reactive] - public string InboundLanDisplay { get; set; } - - [Reactive] - public string RunningServerDisplay { get; set; } - - [Reactive] - public string RunningServerToolTipText { get; set; } - - [Reactive] - public string RunningInfoDisplay { get; set; } - - [Reactive] - public string SpeedProxyDisplay { get; set; } - - [Reactive] - public string SpeedDirectDisplay { get; set; } - - [Reactive] - public bool EnableTun { get; set; } - - #endregion UI - - public StatusBarViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - SelectedRouting = new(); - SelectedServer = new(); - RunningServerToolTipText = "-"; - - if (_config.TunModeItem.EnableTun && AllowEnableTun()) - { - EnableTun = true; - } - else - { - _config.TunModeItem.EnableTun = EnableTun = false; - } - - #region WhenAnyValue && ReactiveCommand - - this.WhenAnyValue( - x => x.SelectedRouting, - y => y != null && !y.Remarks.IsNullOrEmpty()) - .Subscribe(async c => await RoutingSelectedChangedAsync(c)); - - this.WhenAnyValue( - x => x.SelectedServer, - y => y != null && !y.Text.IsNullOrEmpty()) - .Subscribe(c => ServerSelectedChanged(c)); - - SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType; - this.WhenAnyValue( - x => x.SystemProxySelected, - y => y >= 0) - .Subscribe(async c => await DoSystemProxySelected(c)); - - this.WhenAnyValue( - x => x.EnableTun, - y => y == true) - .Subscribe(async c => await DoEnableTun(c)); - - CopyProxyCmdToClipboardCmd = ReactiveCommand.CreateFromTask(async () => - { - await CopyProxyCmdToClipboard(); - }); - - NotifyLeftClickCmd = ReactiveCommand.CreateFromTask(async () => - { - Locator.Current.GetService()?.ShowHideWindow(null); - await Task.CompletedTask; - }); - - AddServerViaClipboardCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerViaClipboard(); - }); - AddServerViaScanCmd = ReactiveCommand.CreateFromTask(async () => - { - await AddServerViaScan(); - }); - SubUpdateCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess(false); - }); - SubUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => - { - await UpdateSubscriptionProcess(true); - }); - - //System proxy - SystemProxyClearCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetListenerType(ESysProxyType.ForcedClear); - }); - SystemProxySetCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetListenerType(ESysProxyType.ForcedChange); - }); - SystemProxyNothingCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetListenerType(ESysProxyType.Unchanged); - }); - SystemProxyPacCmd = ReactiveCommand.CreateFromTask(async () => - { - await SetListenerType(ESysProxyType.Pac); - }); - - #endregion WhenAnyValue && ReactiveCommand - - if (updateView != null) - { - InitUpdateView(updateView); - } - _ = Init(); - } - - private async Task Init() - { - await RefreshRoutingsMenu(); - await InboundDisplayStatus(); - await ChangeSystemProxyAsync(_config.SystemProxyItem.SysProxyType, true); - } - - public void InitUpdateView(Func>? updateView) - { - _updateView = updateView; - if (_updateView != null) - { - MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); - } - } - - private async void OnNext(string x) - { - await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null); - } - - private async Task CopyProxyCmdToClipboard() - { - var cmd = Utils.IsWindows() ? "set" : "export"; - var address = $"{Global.Loopback}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}"; - - var sb = new StringBuilder(); - sb.AppendLine($"{cmd} http_proxy={Global.HttpProtocol}{address}"); - sb.AppendLine($"{cmd} https_proxy={Global.HttpProtocol}{address}"); - sb.AppendLine($"{cmd} all_proxy={Global.Socks5Protocol}{address}"); - sb.AppendLine(""); - sb.AppendLine($"{cmd} HTTP_PROXY={Global.HttpProtocol}{address}"); - sb.AppendLine($"{cmd} HTTPS_PROXY={Global.HttpProtocol}{address}"); - sb.AppendLine($"{cmd} ALL_PROXY={Global.Socks5Protocol}{address}"); - - await _updateView?.Invoke(EViewAction.SetClipboardData, sb.ToString()); - } - - private async Task AddServerViaClipboard() - { - var service = Locator.Current.GetService(); - if (service != null) await service.AddServerViaClipboardAsync(null); - } - - private async Task AddServerViaScan() - { - var service = Locator.Current.GetService(); - if (service != null) await service.AddServerViaScanAsync(); - } - - private async Task UpdateSubscriptionProcess(bool blProxy) - { - var service = Locator.Current.GetService(); - if (service != null) await service.UpdateSubscriptionProcess("", blProxy); - } - - public async Task RefreshServersBiz() - { - await RefreshServersMenu(); - - //display running server - var running = await ConfigHandler.GetDefaultServer(_config); - if (running != null) - { - RunningServerDisplay = - RunningServerToolTipText = running.GetSummary(); - } - else - { - RunningServerDisplay = - RunningServerToolTipText = ResUI.CheckServerSettings; - } - } - - private async Task RefreshServersMenu() - { - var lstModel = await AppHandler.Instance.ProfileItems(_config.SubIndexId, ""); - - _servers.Clear(); - if (lstModel.Count > _config.GuiItem.TrayMenuServersLimit) - { - BlServers = false; - return; - } - - BlServers = true; - for (int k = 0; k < lstModel.Count; k++) - { - ProfileItem it = lstModel[k]; - string name = it.GetSummary(); - - var item = new ComboItem() { ID = it.IndexId, Text = name }; - _servers.Add(item); - if (_config.IndexId == it.IndexId) - { - SelectedServer = item; - } - } - } - - private void ServerSelectedChanged(bool c) - { - if (!c) - { - return; - } - if (SelectedServer == null) - { - return; - } - if (Utils.IsNullOrEmpty(SelectedServer.ID)) - { - return; - } - Locator.Current.GetService()?.SetDefaultServer(SelectedServer.ID); - } - - public async Task TestServerAvailability() - { - var item = await ConfigHandler.GetDefaultServer(_config); - if (item == null) - { - return; - } - await (new UpdateService()).RunAvailabilityCheck(async (bool success, string msg) => - { - NoticeHandler.Instance.SendMessageEx(msg); - _updateView?.Invoke(EViewAction.DispatcherServerAvailability, msg); - }); - } - - public void TestServerAvailabilityResult(string msg) - { - RunningInfoDisplay = msg; - } - - #region System proxy and Routings - - public async Task SetListenerType(ESysProxyType type) - { - if (_config.SystemProxyItem.SysProxyType == type) - { - return; - } - _config.SystemProxyItem.SysProxyType = type; - await ChangeSystemProxyAsync(type, true); - NoticeHandler.Instance.SendMessageEx($"{ResUI.TipChangeSystemProxy} - {_config.SystemProxyItem.SysProxyType.ToString()}"); - - SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType; - await ConfigHandler.SaveConfig(_config); - } - - public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange) - { - await SysProxyHandler.UpdateSysProxy(_config, false); - - BlSystemProxyClear = (type == ESysProxyType.ForcedClear); - BlSystemProxySet = (type == ESysProxyType.ForcedChange); - BlSystemProxyNothing = (type == ESysProxyType.Unchanged); - BlSystemProxyPac = (type == ESysProxyType.Pac); - - if (blChange) - { - _updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null); - } - } - - public async Task RefreshRoutingsMenu() - { - _routingItems.Clear(); - - BlRouting = true; - var routings = await AppHandler.Instance.RoutingItems(); - foreach (var item in routings) - { - _routingItems.Add(item); - if (item.Id == _config.RoutingBasicItem.RoutingIndexId) - { - SelectedRouting = item; - } - } - } - - private async Task RoutingSelectedChangedAsync(bool c) - { - if (!c) - { - return; - } - - if (SelectedRouting == null) - { - return; - } - - var item = await AppHandler.Instance.GetRoutingItem(SelectedRouting?.Id); - if (item is null) - { - return; - } - if (_config.RoutingBasicItem.RoutingIndexId == item.Id) - { - return; - } - - if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) - { - NoticeHandler.Instance.SendMessageEx(ResUI.TipChangeRouting); - Locator.Current.GetService()?.Reload(); - _updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null); - } - } - - private async Task DoSystemProxySelected(bool c) - { - if (!c) - { - return; - } - if (_config.SystemProxyItem.SysProxyType == (ESysProxyType)SystemProxySelected) - { - return; - } - await SetListenerType((ESysProxyType)SystemProxySelected); - } - - private async Task DoEnableTun(bool c) - { - if (_config.TunModeItem.EnableTun != EnableTun) - { - _config.TunModeItem.EnableTun = EnableTun; - // When running as a non-administrator, reboot to administrator mode - if (EnableTun && AllowEnableTun() == false) - { - if (Utils.IsWindows()) - { - _config.TunModeItem.EnableTun = false; - Locator.Current.GetService()?.RebootAsAdmin(); - return; - } - else if (Utils.IsOSX()) - { - _config.TunModeItem.EnableTun = false; - NoticeHandler.Instance.SendMessageAndEnqueue(ResUI.TbSettingsLinuxSudoPasswordIsEmpty); - return; - } - } - await ConfigHandler.SaveConfig(_config); - Locator.Current.GetService()?.Reload(); - } - } - - private bool AllowEnableTun() - { - if (Utils.IsWindows()) - { - return AppHandler.Instance.IsAdministrator; - } - else if (Utils.IsLinux()) - { - return _config.TunModeItem.LinuxSudoPwd.IsNotEmpty(); - } - else if (Utils.IsOSX()) - { - return _config.TunModeItem.LinuxSudoPwd.IsNotEmpty(); - } - return false; - } - - #endregion System proxy and Routings - - #region UI - - public async Task InboundDisplayStatus() - { - StringBuilder sb = new(); - sb.Append($"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}"); - if (_config.Inbound.First().SecondLocalPortEnabled) - { - sb.Append($",{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks2)}"); - } - sb.Append(']'); - InboundDisplay = $"{ResUI.LabLocal}:{sb}"; - - if (_config.Inbound.First().AllowLANConn) - { - var lan = _config.Inbound.First().NewPort4LAN - ? $"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks3)}]" - : $"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}]"; - InboundLanDisplay = $"{ResUI.LabLAN}:{lan}"; - } - else - { - InboundLanDisplay = $"{ResUI.LabLAN}:{Global.None}"; - } - await Task.CompletedTask; - } - - public void UpdateStatistics(ServerSpeedItem update) - { - try - { - SpeedProxyDisplay = string.Format(ResUI.SpeedDisplayText, Global.ProxyTag, Utils.HumanFy(update.ProxyUp), Utils.HumanFy(update.ProxyDown)); - SpeedDirectDisplay = string.Format(ResUI.SpeedDisplayText, Global.DirectTag, Utils.HumanFy(update.DirectUp), Utils.HumanFy(update.DirectDown)); - } - catch - { - } - } - - #endregion UI - } -} \ No newline at end of file + [Reactive] + public int SystemProxySelected { get; set; } + + #endregion System Proxy + + #region UI + + [Reactive] + public string InboundDisplay { get; set; } + + [Reactive] + public string InboundLanDisplay { get; set; } + + [Reactive] + public string RunningServerDisplay { get; set; } + + [Reactive] + public string RunningServerToolTipText { get; set; } + + [Reactive] + public string RunningInfoDisplay { get; set; } + + [Reactive] + public string SpeedProxyDisplay { get; set; } + + [Reactive] + public string SpeedDirectDisplay { get; set; } + + [Reactive] + public bool EnableTun { get; set; } + + #endregion UI + + public StatusBarViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + SelectedRouting = new(); + SelectedServer = new(); + RunningServerToolTipText = "-"; + + if (_config.TunModeItem.EnableTun && AllowEnableTun()) + { + EnableTun = true; + } + else + { + _config.TunModeItem.EnableTun = EnableTun = false; + } + + #region WhenAnyValue && ReactiveCommand + + this.WhenAnyValue( + x => x.SelectedRouting, + y => y != null && !y.Remarks.IsNullOrEmpty()) + .Subscribe(async c => await RoutingSelectedChangedAsync(c)); + + this.WhenAnyValue( + x => x.SelectedServer, + y => y != null && !y.Text.IsNullOrEmpty()) + .Subscribe(c => ServerSelectedChanged(c)); + + SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType; + this.WhenAnyValue( + x => x.SystemProxySelected, + y => y >= 0) + .Subscribe(async c => await DoSystemProxySelected(c)); + + this.WhenAnyValue( + x => x.EnableTun, + y => y == true) + .Subscribe(async c => await DoEnableTun(c)); + + CopyProxyCmdToClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await CopyProxyCmdToClipboard(); + }); + + NotifyLeftClickCmd = ReactiveCommand.CreateFromTask(async () => + { + Locator.Current.GetService()?.ShowHideWindow(null); + await Task.CompletedTask; + }); + + AddServerViaClipboardCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaClipboard(); + }); + AddServerViaScanCmd = ReactiveCommand.CreateFromTask(async () => + { + await AddServerViaScan(); + }); + SubUpdateCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(false); + }); + SubUpdateViaProxyCmd = ReactiveCommand.CreateFromTask(async () => + { + await UpdateSubscriptionProcess(true); + }); + + //System proxy + SystemProxyClearCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.ForcedClear); + }); + SystemProxySetCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.ForcedChange); + }); + SystemProxyNothingCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.Unchanged); + }); + SystemProxyPacCmd = ReactiveCommand.CreateFromTask(async () => + { + await SetListenerType(ESysProxyType.Pac); + }); + + #endregion WhenAnyValue && ReactiveCommand + + if (updateView != null) + { + InitUpdateView(updateView); + } + _ = Init(); + } + + private async Task Init() + { + await RefreshRoutingsMenu(); + await InboundDisplayStatus(); + await ChangeSystemProxyAsync(_config.SystemProxyItem.SysProxyType, true); + } + + public void InitUpdateView(Func>? updateView) + { + _updateView = updateView; + if (_updateView != null) + { + MessageBus.Current.Listen(EMsgCommand.RefreshProfiles.ToString()).Subscribe(OnNext); + } + } + + private async void OnNext(string x) + { + await _updateView?.Invoke(EViewAction.DispatcherRefreshServersBiz, null); + } + + private async Task CopyProxyCmdToClipboard() + { + var cmd = Utils.IsWindows() ? "set" : "export"; + var address = $"{Global.Loopback}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}"; + + var sb = new StringBuilder(); + sb.AppendLine($"{cmd} http_proxy={Global.HttpProtocol}{address}"); + sb.AppendLine($"{cmd} https_proxy={Global.HttpProtocol}{address}"); + sb.AppendLine($"{cmd} all_proxy={Global.Socks5Protocol}{address}"); + sb.AppendLine(""); + sb.AppendLine($"{cmd} HTTP_PROXY={Global.HttpProtocol}{address}"); + sb.AppendLine($"{cmd} HTTPS_PROXY={Global.HttpProtocol}{address}"); + sb.AppendLine($"{cmd} ALL_PROXY={Global.Socks5Protocol}{address}"); + + await _updateView?.Invoke(EViewAction.SetClipboardData, sb.ToString()); + } + + private async Task AddServerViaClipboard() + { + var service = Locator.Current.GetService(); + if (service != null) + await service.AddServerViaClipboardAsync(null); + } + + private async Task AddServerViaScan() + { + var service = Locator.Current.GetService(); + if (service != null) + await service.AddServerViaScanAsync(); + } + + private async Task UpdateSubscriptionProcess(bool blProxy) + { + var service = Locator.Current.GetService(); + if (service != null) + await service.UpdateSubscriptionProcess("", blProxy); + } + + public async Task RefreshServersBiz() + { + await RefreshServersMenu(); + + //display running server + var running = await ConfigHandler.GetDefaultServer(_config); + if (running != null) + { + RunningServerDisplay = + RunningServerToolTipText = running.GetSummary(); + } + else + { + RunningServerDisplay = + RunningServerToolTipText = ResUI.CheckServerSettings; + } + } + + private async Task RefreshServersMenu() + { + var lstModel = await AppHandler.Instance.ProfileItems(_config.SubIndexId, ""); + + _servers.Clear(); + if (lstModel.Count > _config.GuiItem.TrayMenuServersLimit) + { + BlServers = false; + return; + } + + BlServers = true; + for (int k = 0; k < lstModel.Count; k++) + { + ProfileItem it = lstModel[k]; + string name = it.GetSummary(); + + var item = new ComboItem() { ID = it.IndexId, Text = name }; + _servers.Add(item); + if (_config.IndexId == it.IndexId) + { + SelectedServer = item; + } + } + } + + private void ServerSelectedChanged(bool c) + { + if (!c) + { + return; + } + if (SelectedServer == null) + { + return; + } + if (Utils.IsNullOrEmpty(SelectedServer.ID)) + { + return; + } + Locator.Current.GetService()?.SetDefaultServer(SelectedServer.ID); + } + + public async Task TestServerAvailability() + { + var item = await ConfigHandler.GetDefaultServer(_config); + if (item == null) + { + return; + } + await new UpdateService().RunAvailabilityCheck(async (bool success, string msg) => + { + NoticeHandler.Instance.SendMessageEx(msg); + _updateView?.Invoke(EViewAction.DispatcherServerAvailability, msg); + }); + } + + public void TestServerAvailabilityResult(string msg) + { + RunningInfoDisplay = msg; + } + + #region System proxy and Routings + + public async Task SetListenerType(ESysProxyType type) + { + if (_config.SystemProxyItem.SysProxyType == type) + { + return; + } + _config.SystemProxyItem.SysProxyType = type; + await ChangeSystemProxyAsync(type, true); + NoticeHandler.Instance.SendMessageEx($"{ResUI.TipChangeSystemProxy} - {_config.SystemProxyItem.SysProxyType.ToString()}"); + + SystemProxySelected = (int)_config.SystemProxyItem.SysProxyType; + await ConfigHandler.SaveConfig(_config); + } + + public async Task ChangeSystemProxyAsync(ESysProxyType type, bool blChange) + { + await SysProxyHandler.UpdateSysProxy(_config, false); + + BlSystemProxyClear = type == ESysProxyType.ForcedClear; + BlSystemProxySet = type == ESysProxyType.ForcedChange; + BlSystemProxyNothing = type == ESysProxyType.Unchanged; + BlSystemProxyPac = type == ESysProxyType.Pac; + + if (blChange) + { + _updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null); + } + } + + public async Task RefreshRoutingsMenu() + { + _routingItems.Clear(); + + BlRouting = true; + var routings = await AppHandler.Instance.RoutingItems(); + foreach (var item in routings) + { + _routingItems.Add(item); + if (item.Id == _config.RoutingBasicItem.RoutingIndexId) + { + SelectedRouting = item; + } + } + } + + private async Task RoutingSelectedChangedAsync(bool c) + { + if (!c) + { + return; + } + + if (SelectedRouting == null) + { + return; + } + + var item = await AppHandler.Instance.GetRoutingItem(SelectedRouting?.Id); + if (item is null) + { + return; + } + if (_config.RoutingBasicItem.RoutingIndexId == item.Id) + { + return; + } + + if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) + { + NoticeHandler.Instance.SendMessageEx(ResUI.TipChangeRouting); + Locator.Current.GetService()?.Reload(); + _updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null); + } + } + + private async Task DoSystemProxySelected(bool c) + { + if (!c) + { + return; + } + if (_config.SystemProxyItem.SysProxyType == (ESysProxyType)SystemProxySelected) + { + return; + } + await SetListenerType((ESysProxyType)SystemProxySelected); + } + + private async Task DoEnableTun(bool c) + { + if (_config.TunModeItem.EnableTun != EnableTun) + { + _config.TunModeItem.EnableTun = EnableTun; + // When running as a non-administrator, reboot to administrator mode + if (EnableTun && AllowEnableTun() == false) + { + if (Utils.IsWindows()) + { + _config.TunModeItem.EnableTun = false; + Locator.Current.GetService()?.RebootAsAdmin(); + return; + } + else if (Utils.IsOSX()) + { + _config.TunModeItem.EnableTun = false; + NoticeHandler.Instance.SendMessageAndEnqueue(ResUI.TbSettingsLinuxSudoPasswordIsEmpty); + return; + } + } + await ConfigHandler.SaveConfig(_config); + Locator.Current.GetService()?.Reload(); + } + } + + private bool AllowEnableTun() + { + if (Utils.IsWindows()) + { + return AppHandler.Instance.IsAdministrator; + } + else if (Utils.IsLinux()) + { + return _config.TunModeItem.LinuxSudoPwd.IsNotEmpty(); + } + else if (Utils.IsOSX()) + { + return _config.TunModeItem.LinuxSudoPwd.IsNotEmpty(); + } + return false; + } + + #endregion System proxy and Routings + + #region UI + + public async Task InboundDisplayStatus() + { + StringBuilder sb = new(); + sb.Append($"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}"); + if (_config.Inbound.First().SecondLocalPortEnabled) + { + sb.Append($",{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks2)}"); + } + sb.Append(']'); + InboundDisplay = $"{ResUI.LabLocal}:{sb}"; + + if (_config.Inbound.First().AllowLANConn) + { + var lan = _config.Inbound.First().NewPort4LAN + ? $"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks3)}]" + : $"[{EInboundProtocol.mixed}:{AppHandler.Instance.GetLocalPort(EInboundProtocol.socks)}]"; + InboundLanDisplay = $"{ResUI.LabLAN}:{lan}"; + } + else + { + InboundLanDisplay = $"{ResUI.LabLAN}:{Global.None}"; + } + await Task.CompletedTask; + } + + public void UpdateStatistics(ServerSpeedItem update) + { + try + { + SpeedProxyDisplay = string.Format(ResUI.SpeedDisplayText, Global.ProxyTag, Utils.HumanFy(update.ProxyUp), Utils.HumanFy(update.ProxyDown)); + SpeedDirectDisplay = string.Format(ResUI.SpeedDisplayText, Global.DirectTag, Utils.HumanFy(update.DirectUp), Utils.HumanFy(update.DirectDown)); + } + catch + { + } + } + + #endregion UI + } +} diff --git a/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs b/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs index 03588adc..da535a97 100644 --- a/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/SubEditViewModel.cs @@ -1,64 +1,64 @@ -using ReactiveUI; -using ReactiveUI.Fody.Helpers; using System.Reactive; +using ReactiveUI; +using ReactiveUI.Fody.Helpers; namespace ServiceLib.ViewModels { - public class SubEditViewModel : MyReactiveObject - { - [Reactive] - public SubItem SelectedSource { get; set; } + public class SubEditViewModel : MyReactiveObject + { + [Reactive] + public SubItem SelectedSource { get; set; } - public ReactiveCommand SaveCmd { get; } + public ReactiveCommand SaveCmd { get; } - public SubEditViewModel(SubItem subItem, Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public SubEditViewModel(SubItem subItem, Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - SaveCmd = ReactiveCommand.CreateFromTask(async () => - { - await SaveSubAsync(); - }); + SaveCmd = ReactiveCommand.CreateFromTask(async () => + { + await SaveSubAsync(); + }); - SelectedSource = subItem.Id.IsNullOrEmpty() ? subItem : JsonUtils.DeepCopy(subItem); - } + SelectedSource = subItem.Id.IsNullOrEmpty() ? subItem : JsonUtils.DeepCopy(subItem); + } - private async Task SaveSubAsync() - { - var remarks = SelectedSource.Remarks; - if (Utils.IsNullOrEmpty(remarks)) - { - NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); - return; - } + private async Task SaveSubAsync() + { + var remarks = SelectedSource.Remarks; + if (Utils.IsNullOrEmpty(remarks)) + { + NoticeHandler.Instance.Enqueue(ResUI.PleaseFillRemarks); + return; + } - var url = SelectedSource.Url; - if (url.IsNotEmpty()) - { - var uri = Utils.TryUri(url); - if (uri == null) - { - NoticeHandler.Instance.Enqueue(ResUI.InvalidUrlTip); - return; - } - //Do not allow http protocol - if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) - { - NoticeHandler.Instance.Enqueue(ResUI.InsecureUrlProtocol); - //return; - } - } + var url = SelectedSource.Url; + if (url.IsNotEmpty()) + { + var uri = Utils.TryUri(url); + if (uri == null) + { + NoticeHandler.Instance.Enqueue(ResUI.InvalidUrlTip); + return; + } + //Do not allow http protocol + if (url.StartsWith(Global.HttpProtocol) && !Utils.IsPrivateNetwork(uri.IdnHost)) + { + NoticeHandler.Instance.Enqueue(ResUI.InsecureUrlProtocol); + //return; + } + } - if (await ConfigHandler.AddSubItem(_config, SelectedSource) == 0) - { - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - _updateView?.Invoke(EViewAction.CloseWindow, null); - } - else - { - NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); - } - } - } -} \ No newline at end of file + if (await ConfigHandler.AddSubItem(_config, SelectedSource) == 0) + { + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + _updateView?.Invoke(EViewAction.CloseWindow, null); + } + else + { + NoticeHandler.Instance.Enqueue(ResUI.OperationFailed); + } + } + } +} diff --git a/v2rayN/ServiceLib/ViewModels/SubSettingViewModel.cs b/v2rayN/ServiceLib/ViewModels/SubSettingViewModel.cs index 7b9c1139..df5b7352 100644 --- a/v2rayN/ServiceLib/ViewModels/SubSettingViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/SubSettingViewModel.cs @@ -1,105 +1,105 @@ -using DynamicData; +using System.Reactive; +using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive; namespace ServiceLib.ViewModels { - public class SubSettingViewModel : MyReactiveObject - { - private IObservableCollection _subItems = new ObservableCollectionExtended(); - public IObservableCollection SubItems => _subItems; + public class SubSettingViewModel : MyReactiveObject + { + private IObservableCollection _subItems = new ObservableCollectionExtended(); + public IObservableCollection SubItems => _subItems; - [Reactive] - public SubItem SelectedSource { get; set; } + [Reactive] + public SubItem SelectedSource { get; set; } - public IList SelectedSources { get; set; } + public IList SelectedSources { get; set; } - public ReactiveCommand SubAddCmd { get; } - public ReactiveCommand SubDeleteCmd { get; } - public ReactiveCommand SubEditCmd { get; } - public ReactiveCommand SubShareCmd { get; } - public bool IsModified { get; set; } + public ReactiveCommand SubAddCmd { get; } + public ReactiveCommand SubDeleteCmd { get; } + public ReactiveCommand SubEditCmd { get; } + public ReactiveCommand SubShareCmd { get; } + public bool IsModified { get; set; } - public SubSettingViewModel(Func>? updateView) - { - _config = AppHandler.Instance.Config; - _updateView = updateView; + public SubSettingViewModel(Func>? updateView) + { + _config = AppHandler.Instance.Config; + _updateView = updateView; - var canEditRemove = this.WhenAnyValue( - x => x.SelectedSource, - selectedSource => selectedSource != null && !selectedSource.Id.IsNullOrEmpty()); + var canEditRemove = this.WhenAnyValue( + x => x.SelectedSource, + selectedSource => selectedSource != null && !selectedSource.Id.IsNullOrEmpty()); - SubAddCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditSubAsync(true); - }); - SubDeleteCmd = ReactiveCommand.CreateFromTask(async () => - { - await DeleteSubAsync(); - }, canEditRemove); - SubEditCmd = ReactiveCommand.CreateFromTask(async () => - { - await EditSubAsync(false); - }, canEditRemove); - SubShareCmd = ReactiveCommand.CreateFromTask(async () => - { - await _updateView?.Invoke(EViewAction.ShareSub, SelectedSource?.Url); - }, canEditRemove); + SubAddCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditSubAsync(true); + }); + SubDeleteCmd = ReactiveCommand.CreateFromTask(async () => + { + await DeleteSubAsync(); + }, canEditRemove); + SubEditCmd = ReactiveCommand.CreateFromTask(async () => + { + await EditSubAsync(false); + }, canEditRemove); + SubShareCmd = ReactiveCommand.CreateFromTask(async () => + { + await _updateView?.Invoke(EViewAction.ShareSub, SelectedSource?.Url); + }, canEditRemove); - _ = Init(); - } + _ = Init(); + } - private async Task Init() - { - SelectedSource = new(); + private async Task Init() + { + SelectedSource = new(); - await RefreshSubItems(); - } + await RefreshSubItems(); + } - public async Task RefreshSubItems() - { - _subItems.Clear(); - _subItems.AddRange(await AppHandler.Instance.SubItems()); - } + public async Task RefreshSubItems() + { + _subItems.Clear(); + _subItems.AddRange(await AppHandler.Instance.SubItems()); + } - public async Task EditSubAsync(bool blNew) - { - SubItem item; - if (blNew) - { - item = new(); - } - else - { - item = await AppHandler.Instance.GetSubItem(SelectedSource?.Id); - if (item is null) - { - return; - } - } - if (await _updateView?.Invoke(EViewAction.SubEditWindow, item) == true) - { - await RefreshSubItems(); - IsModified = true; - } - } + public async Task EditSubAsync(bool blNew) + { + SubItem item; + if (blNew) + { + item = new(); + } + else + { + item = await AppHandler.Instance.GetSubItem(SelectedSource?.Id); + if (item is null) + { + return; + } + } + if (await _updateView?.Invoke(EViewAction.SubEditWindow, item) == true) + { + await RefreshSubItems(); + IsModified = true; + } + } - private async Task DeleteSubAsync() - { - if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) - { - return; - } + private async Task DeleteSubAsync() + { + if (await _updateView?.Invoke(EViewAction.ShowYesNo, null) == false) + { + return; + } - foreach (var it in SelectedSources ?? [SelectedSource]) - { - await ConfigHandler.DeleteSubItem(_config, it.Id); - } - await RefreshSubItems(); - NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); - IsModified = true; - } - } -} \ No newline at end of file + foreach (var it in SelectedSources ?? [SelectedSource]) + { + await ConfigHandler.DeleteSubItem(_config, it.Id); + } + await RefreshSubItems(); + NoticeHandler.Instance.Enqueue(ResUI.OperationSuccess); + IsModified = true; + } + } +} diff --git a/v2rayN/v2rayN.Desktop/App.axaml b/v2rayN/v2rayN.Desktop/App.axaml index 99852cd2..40794f66 100644 --- a/v2rayN/v2rayN.Desktop/App.axaml +++ b/v2rayN/v2rayN.Desktop/App.axaml @@ -1,64 +1,64 @@ - - - - - - - - - - - - - + x:Class="v2rayN.Desktop.App" + xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:dialogHost="clr-namespace:DialogHostAvalonia;assembly=DialogHost.Avalonia" + xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" + xmlns:semi="https://irihi.tech/semi" + xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib" + x:DataType="vms:StatusBarViewModel" + Name="v2rayN" + RequestedThemeVariant="Default"> + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/App.axaml.cs b/v2rayN/v2rayN.Desktop/App.axaml.cs index 06b59d53..25f301dc 100644 --- a/v2rayN/v2rayN.Desktop/App.axaml.cs +++ b/v2rayN/v2rayN.Desktop/App.axaml.cs @@ -9,70 +9,72 @@ namespace v2rayN.Desktop; public partial class App : Application { - public override void Initialize() - { - if (!AppHandler.Instance.InitApp()) - { - Environment.Exit(0); - return; - } - AvaloniaXamlLoader.Load(this); + public override void Initialize() + { + if (!AppHandler.Instance.InitApp()) + { + Environment.Exit(0); + return; + } + AvaloniaXamlLoader.Load(this); - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; - var ViewModel = new StatusBarViewModel(null); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(StatusBarViewModel)); - this.DataContext = ViewModel; - } + var ViewModel = new StatusBarViewModel(null); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(StatusBarViewModel)); + this.DataContext = ViewModel; + } - public override void OnFrameworkInitializationCompleted() - { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - AppHandler.Instance.InitComponents(); + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + AppHandler.Instance.InitComponents(); - desktop.Exit += OnExit; - desktop.MainWindow = new MainWindow(); - } + desktop.Exit += OnExit; + desktop.MainWindow = new MainWindow(); + } - base.OnFrameworkInitializationCompleted(); - } + base.OnFrameworkInitializationCompleted(); + } - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - if (e.ExceptionObject != null) - { - Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!); - } - } + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (e.ExceptionObject != null) + { + Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!); + } + } - private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) - { - Logging.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception); - } + private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) + { + Logging.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception); + } - private void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs e) - { - } + private void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs e) + { + } - private async void MenuAddServerViaClipboardClick(object? sender, EventArgs e) - { - if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - if (desktop.MainWindow != null) - { - var clipboardData = await AvaUtils.GetClipboardData(desktop.MainWindow); - var service = Locator.Current.GetService(); - if (service != null) _ = service.AddServerViaClipboardAsync(clipboardData); - } - } - } + private async void MenuAddServerViaClipboardClick(object? sender, EventArgs e) + { + if (Application.Current?.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + { + if (desktop.MainWindow != null) + { + var clipboardData = await AvaUtils.GetClipboardData(desktop.MainWindow); + var service = Locator.Current.GetService(); + if (service != null) + _ = service.AddServerViaClipboardAsync(clipboardData); + } + } + } - private async void MenuExit_Click(object? sender, EventArgs e) - { - var service = Locator.Current.GetService(); - if (service != null) await service.MyAppExitAsync(true); - service?.Shutdown(true); - } + private async void MenuExit_Click(object? sender, EventArgs e) + { + var service = Locator.Current.GetService(); + if (service != null) + await service.MyAppExitAsync(true); + service?.Shutdown(true); + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Assets/GlobalStyles.axaml b/v2rayN/v2rayN.Desktop/Assets/GlobalStyles.axaml index aaeec2c5..b037191a 100644 --- a/v2rayN/v2rayN.Desktop/Assets/GlobalStyles.axaml +++ b/v2rayN/v2rayN.Desktop/Assets/GlobalStyles.axaml @@ -1,23 +1,23 @@ - - - - - + + + + + - - - - - - \ No newline at end of file + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Common/AppBuilderExtension.cs b/v2rayN/v2rayN.Desktop/Common/AppBuilderExtension.cs index 13bbf1d1..6b94798c 100644 --- a/v2rayN/v2rayN.Desktop/Common/AppBuilderExtension.cs +++ b/v2rayN/v2rayN.Desktop/Common/AppBuilderExtension.cs @@ -1,18 +1,18 @@ -using Avalonia; +using Avalonia; using Avalonia.Media; namespace v2rayN.Desktop.Common { - public static class AppBuilderExtension - { - public static AppBuilder WithFontByDefault(this AppBuilder appBuilder) - { - var uri = Path.Combine(Global.AvaAssets, "Fonts#Noto Sans SC"); - return appBuilder.With(new FontManagerOptions() - { - DefaultFamilyName = uri, - FontFallbacks = new[] { new FontFallback { FontFamily = new FontFamily(uri) } } - }); - } - } -} \ No newline at end of file + public static class AppBuilderExtension + { + public static AppBuilder WithFontByDefault(this AppBuilder appBuilder) + { + var uri = Path.Combine(Global.AvaAssets, "Fonts#Noto Sans SC"); + return appBuilder.With(new FontManagerOptions() + { + DefaultFamilyName = uri, + FontFallbacks = new[] { new FontFallback { FontFamily = new FontFamily(uri) } } + }); + } + } +} diff --git a/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs b/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs index bd5c5906..79df2fe5 100644 --- a/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs +++ b/v2rayN/v2rayN.Desktop/Common/AvaUtils.cs @@ -1,4 +1,4 @@ -using Avalonia; +using Avalonia; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Media.Imaging; @@ -6,49 +6,51 @@ using Avalonia.Platform; namespace v2rayN.Desktop.Common { - internal class AvaUtils - { - public static async Task GetClipboardData(Window owner) - { - try - { - var clipboard = TopLevel.GetTopLevel(owner)?.Clipboard; - if (clipboard == null) return null; - return await clipboard.GetTextAsync(); - } - catch - { - return null; - } - } + internal class AvaUtils + { + public static async Task GetClipboardData(Window owner) + { + try + { + var clipboard = TopLevel.GetTopLevel(owner)?.Clipboard; + if (clipboard == null) + return null; + return await clipboard.GetTextAsync(); + } + catch + { + return null; + } + } - public static async Task SetClipboardData(Visual? visual, string strData) - { - try - { - var clipboard = TopLevel.GetTopLevel(visual)?.Clipboard; - if (clipboard == null) return; - var dataObject = new DataObject(); - dataObject.Set(DataFormats.Text, strData); - await clipboard.SetDataObjectAsync(dataObject); - } - catch - { - } - } + public static async Task SetClipboardData(Visual? visual, string strData) + { + try + { + var clipboard = TopLevel.GetTopLevel(visual)?.Clipboard; + if (clipboard == null) + return; + var dataObject = new DataObject(); + dataObject.Set(DataFormats.Text, strData); + await clipboard.SetDataObjectAsync(dataObject); + } + catch + { + } + } - public static WindowIcon GetAppIcon(ESysProxyType sysProxyType) - { - var index = (int)sysProxyType + 1; - var fileName = Utils.GetPath($"NotifyIcon{index}.ico"); - if (File.Exists(fileName)) - { - return new(fileName); - } + public static WindowIcon GetAppIcon(ESysProxyType sysProxyType) + { + var index = (int)sysProxyType + 1; + var fileName = Utils.GetPath($"NotifyIcon{index}.ico"); + if (File.Exists(fileName)) + { + return new(fileName); + } - var uri = new Uri(Path.Combine(Global.AvaAssets, $"NotifyIcon{index}.ico")); - using var bitmap = new Bitmap(AssetLoader.Open(uri)); - return new(bitmap); - } - } -} \ No newline at end of file + var uri = new Uri(Path.Combine(Global.AvaAssets, $"NotifyIcon{index}.ico")); + using var bitmap = new Bitmap(AssetLoader.Open(uri)); + return new(bitmap); + } + } +} diff --git a/v2rayN/v2rayN.Desktop/Common/UI.cs b/v2rayN/v2rayN.Desktop/Common/UI.cs index 74cfa6eb..20be39df 100644 --- a/v2rayN/v2rayN.Desktop/Common/UI.cs +++ b/v2rayN/v2rayN.Desktop/Common/UI.cs @@ -1,52 +1,54 @@ -using Avalonia.Controls; +using Avalonia.Controls; using Avalonia.Platform.Storage; using MsBox.Avalonia; using MsBox.Avalonia.Enums; namespace v2rayN.Desktop.Common { - internal class UI - { - private static readonly string caption = Global.AppName; + internal class UI + { + private static readonly string caption = Global.AppName; - public static async Task ShowYesNo(Window owner, string msg) - { - var box = MessageBoxManager.GetMessageBoxStandard(caption, msg, ButtonEnum.YesNo); - return await box.ShowWindowDialogAsync(owner); - } + public static async Task ShowYesNo(Window owner, string msg) + { + var box = MessageBoxManager.GetMessageBoxStandard(caption, msg, ButtonEnum.YesNo); + return await box.ShowWindowDialogAsync(owner); + } - public static async Task OpenFileDialog(Window owner, FilePickerFileType? filter) - { - var sp = GetStorageProvider(owner); - if (sp is null) return null; - - // Start async operation to open the dialog. - var files = await sp.OpenFilePickerAsync(new FilePickerOpenOptions - { - AllowMultiple = false, - FileTypeFilter = filter is null ? [FilePickerFileTypes.All, FilePickerFileTypes.ImagePng] : [filter] - }); + public static async Task OpenFileDialog(Window owner, FilePickerFileType? filter) + { + var sp = GetStorageProvider(owner); + if (sp is null) + return null; - return files.FirstOrDefault()?.TryGetLocalPath(); - } + // Start async operation to open the dialog. + var files = await sp.OpenFilePickerAsync(new FilePickerOpenOptions + { + AllowMultiple = false, + FileTypeFilter = filter is null ? [FilePickerFileTypes.All, FilePickerFileTypes.ImagePng] : [filter] + }); - public static async Task SaveFileDialog(Window owner, string filter) - { - var sp = GetStorageProvider(owner); - if (sp is null) return null; + return files.FirstOrDefault()?.TryGetLocalPath(); + } - // Start async operation to open the dialog. - var files = await sp.SaveFilePickerAsync(new FilePickerSaveOptions - { - }); + public static async Task SaveFileDialog(Window owner, string filter) + { + var sp = GetStorageProvider(owner); + if (sp is null) + return null; - return files?.TryGetLocalPath(); - } + // Start async operation to open the dialog. + var files = await sp.SaveFilePickerAsync(new FilePickerSaveOptions + { + }); - private static IStorageProvider? GetStorageProvider(Window owner) - { - var topLevel = TopLevel.GetTopLevel(owner); - return topLevel?.StorageProvider; - } - } -} \ No newline at end of file + return files?.TryGetLocalPath(); + } + + private static IStorageProvider? GetStorageProvider(Window owner) + { + var topLevel = TopLevel.GetTopLevel(owner); + return topLevel?.StorageProvider; + } + } +} diff --git a/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs b/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs index e61425f5..47c490d5 100644 --- a/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs +++ b/v2rayN/v2rayN.Desktop/Converters/DelayColorConverter.cs @@ -1,26 +1,26 @@ -using Avalonia.Data.Converters; -using Avalonia.Media; using System.Globalization; +using Avalonia.Data.Converters; +using Avalonia.Media; namespace v2rayN.Desktop.Converters { - public class DelayColorConverter : IValueConverter - { - public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) - { - int.TryParse(value?.ToString(), out var delay); + public class DelayColorConverter : IValueConverter + { + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + int.TryParse(value?.ToString(), out var delay); - if (delay <= 0) - return new SolidColorBrush(Colors.Red); - if (delay <= 500) - return new SolidColorBrush(Colors.Green); - else - return new SolidColorBrush(Colors.IndianRed); - } + if (delay <= 0) + return new SolidColorBrush(Colors.Red); + if (delay <= 500) + return new SolidColorBrush(Colors.Green); + else + return new SolidColorBrush(Colors.IndianRed); + } - public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) - { - return null; - } - } -} \ No newline at end of file + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return null; + } + } +} diff --git a/v2rayN/v2rayN.Desktop/FodyWeavers.xml b/v2rayN/v2rayN.Desktop/FodyWeavers.xml index 63fc1484..af4b7300 100644 --- a/v2rayN/v2rayN.Desktop/FodyWeavers.xml +++ b/v2rayN/v2rayN.Desktop/FodyWeavers.xml @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/v2rayN/v2rayN.Desktop/GlobalUsings.cs b/v2rayN/v2rayN.Desktop/GlobalUsings.cs index bc789ab0..16f7a7b7 100644 --- a/v2rayN/v2rayN.Desktop/GlobalUsings.cs +++ b/v2rayN/v2rayN.Desktop/GlobalUsings.cs @@ -1,8 +1,8 @@ -global using ServiceLib; +global using ServiceLib; global using ServiceLib.Base; global using ServiceLib.Common; global using ServiceLib.Enums; global using ServiceLib.Handler; global using ServiceLib.Models; global using ServiceLib.Resx; -global using ServiceLib.ViewModels; \ No newline at end of file +global using ServiceLib.ViewModels; diff --git a/v2rayN/v2rayN.Desktop/Program.cs b/v2rayN/v2rayN.Desktop/Program.cs index 5d1c6493..9e0628b5 100644 --- a/v2rayN/v2rayN.Desktop/Program.cs +++ b/v2rayN/v2rayN.Desktop/Program.cs @@ -6,51 +6,51 @@ namespace v2rayN.Desktop; internal class Program { - public static EventWaitHandle ProgramStarted; + public static EventWaitHandle ProgramStarted; - // Initialization code. Don't use any Avalonia, third-party APIs or any - // SynchronizationContext-reliant code before AppMain is called: things aren't initialized - // yet and stuff might break. - [STAThread] - public static void Main(string[] args) - { - OnStartup(args); + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) + { + OnStartup(args); - BuildAvaloniaApp() - .StartWithClassicDesktopLifetime(args); - } + BuildAvaloniaApp() + .StartWithClassicDesktopLifetime(args); + } - private static void OnStartup(string[]? Args) - { - if (Utils.IsWindows()) - { - var exePathKey = Utils.GetMd5(Utils.GetExePath()); - var rebootas = (Args ?? Array.Empty()).Any(t => t == Global.RebootAs); - ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); - if (!rebootas && !bCreatedNew) - { - ProgramStarted.Set(); - Environment.Exit(0); - return; - } - } - else - { - _ = new Mutex(true, "v2rayN", out var bOnlyOneInstance); - if (!bOnlyOneInstance) - { - Environment.Exit(0); - return; - } - } - } + private static void OnStartup(string[]? Args) + { + if (Utils.IsWindows()) + { + var exePathKey = Utils.GetMd5(Utils.GetExePath()); + var rebootas = (Args ?? Array.Empty()).Any(t => t == Global.RebootAs); + ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); + if (!rebootas && !bCreatedNew) + { + ProgramStarted.Set(); + Environment.Exit(0); + return; + } + } + else + { + _ = new Mutex(true, "v2rayN", out var bOnlyOneInstance); + if (!bOnlyOneInstance) + { + Environment.Exit(0); + return; + } + } + } - // Avalonia configuration, don't remove; also used by visual designer. - public static AppBuilder BuildAvaloniaApp() - => AppBuilder.Configure() - .UsePlatformDetect() - //.WithInterFont() - .WithFontByDefault() - .LogToTrace() - .UseReactiveUI(); -} \ No newline at end of file + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + //.WithInterFont() + .WithFontByDefault() + .LogToTrace() + .UseReactiveUI(); +} diff --git a/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs b/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs index afdf78c2..ed8dfcad 100644 --- a/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs +++ b/v2rayN/v2rayN.Desktop/ViewModels/ThemeSettingViewModel.cs @@ -1,3 +1,4 @@ +using System.Reactive.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Notifications; @@ -7,151 +8,151 @@ using Avalonia.Styling; using ReactiveUI; using ReactiveUI.Fody.Helpers; using Semi.Avalonia; -using System.Reactive.Linq; namespace v2rayN.Desktop.ViewModels { - public class ThemeSettingViewModel : MyReactiveObject - { - [Reactive] public string CurrentTheme { get; set; } + public class ThemeSettingViewModel : MyReactiveObject + { + [Reactive] public string CurrentTheme { get; set; } - [Reactive] public int CurrentFontSize { get; set; } + [Reactive] public int CurrentFontSize { get; set; } - [Reactive] public string CurrentLanguage { get; set; } + [Reactive] public string CurrentLanguage { get; set; } - public ThemeSettingViewModel() - { - _config = AppHandler.Instance.Config; + public ThemeSettingViewModel() + { + _config = AppHandler.Instance.Config; - BindingUI(); - RestoreUI(); - } + BindingUI(); + RestoreUI(); + } - private void RestoreUI() - { - ModifyTheme(); - ModifyFontFamily(); - ModifyFontSize(); - } + private void RestoreUI() + { + ModifyTheme(); + ModifyFontFamily(); + ModifyFontSize(); + } - private void BindingUI() - { - CurrentTheme = _config.UiItem.CurrentTheme; - CurrentFontSize = _config.UiItem.CurrentFontSize; - CurrentLanguage = _config.UiItem.CurrentLanguage; + private void BindingUI() + { + CurrentTheme = _config.UiItem.CurrentTheme; + CurrentFontSize = _config.UiItem.CurrentFontSize; + CurrentLanguage = _config.UiItem.CurrentLanguage; - this.WhenAnyValue(x => x.CurrentTheme) - .Subscribe(c => - { - if (_config.UiItem.CurrentTheme != CurrentTheme) - { - _config.UiItem.CurrentTheme = CurrentTheme; - ModifyTheme(); - ConfigHandler.SaveConfig(_config); - } - }); + this.WhenAnyValue(x => x.CurrentTheme) + .Subscribe(c => + { + if (_config.UiItem.CurrentTheme != CurrentTheme) + { + _config.UiItem.CurrentTheme = CurrentTheme; + ModifyTheme(); + ConfigHandler.SaveConfig(_config); + } + }); - this.WhenAnyValue( - x => x.CurrentFontSize, - y => y > 0) - .Subscribe(c => - { - if (_config.UiItem.CurrentFontSize != CurrentFontSize && CurrentFontSize >= Global.MinFontSize) - { - _config.UiItem.CurrentFontSize = CurrentFontSize; - ModifyFontSize(); - ConfigHandler.SaveConfig(_config); - } - }); + this.WhenAnyValue( + x => x.CurrentFontSize, + y => y > 0) + .Subscribe(c => + { + if (_config.UiItem.CurrentFontSize != CurrentFontSize && CurrentFontSize >= Global.MinFontSize) + { + _config.UiItem.CurrentFontSize = CurrentFontSize; + ModifyFontSize(); + ConfigHandler.SaveConfig(_config); + } + }); - this.WhenAnyValue( - x => x.CurrentLanguage, - y => y != null && !y.IsNullOrEmpty()) - .Subscribe(c => - { - if (Utils.IsNotEmpty(CurrentLanguage) && _config.UiItem.CurrentLanguage != CurrentLanguage) - { - _config.UiItem.CurrentLanguage = CurrentLanguage; - Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); - ConfigHandler.SaveConfig(_config); - NoticeHandler.Instance.Enqueue(ResUI.NeedRebootTips); - } - }); - } + this.WhenAnyValue( + x => x.CurrentLanguage, + y => y != null && !y.IsNullOrEmpty()) + .Subscribe(c => + { + if (Utils.IsNotEmpty(CurrentLanguage) && _config.UiItem.CurrentLanguage != CurrentLanguage) + { + _config.UiItem.CurrentLanguage = CurrentLanguage; + Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); + ConfigHandler.SaveConfig(_config); + NoticeHandler.Instance.Enqueue(ResUI.NeedRebootTips); + } + }); + } - private void ModifyTheme() - { - var app = Application.Current; - if (app is not null) - { - app.RequestedThemeVariant = CurrentTheme switch - { - nameof(ETheme.Dark) => ThemeVariant.Dark, - nameof(ETheme.Light) => ThemeVariant.Light, - nameof(ETheme.Aquatic) => SemiTheme.Aquatic, - nameof(ETheme.Desert) => SemiTheme.Desert, - nameof(ETheme.Dusk) => SemiTheme.Dusk, - nameof(ETheme.NightSky) => SemiTheme.NightSky, - _ => ThemeVariant.Default, - }; - } - } + private void ModifyTheme() + { + var app = Application.Current; + if (app is not null) + { + app.RequestedThemeVariant = CurrentTheme switch + { + nameof(ETheme.Dark) => ThemeVariant.Dark, + nameof(ETheme.Light) => ThemeVariant.Light, + nameof(ETheme.Aquatic) => SemiTheme.Aquatic, + nameof(ETheme.Desert) => SemiTheme.Desert, + nameof(ETheme.Dusk) => SemiTheme.Dusk, + nameof(ETheme.NightSky) => SemiTheme.NightSky, + _ => ThemeVariant.Default, + }; + } + } - private void ModifyFontSize() - { - double size = CurrentFontSize; - if (size < Global.MinFontSize) return; + private void ModifyFontSize() + { + double size = CurrentFontSize; + if (size < Global.MinFontSize) + return; - Style style = new(x => Selectors.Or( - x.OfType - - + + + - - - + + + - - - - + + + + - + - + - - - - + + + + - - + + - - + + - - + + - - - - + + + + - - + + - - + + - - + + - - + + - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs index 008d6e6b..4699e266 100644 --- a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs @@ -6,366 +6,366 @@ using System.Reactive.Disposables; namespace v2rayN.Desktop.Views { - public partial class AddServerWindow : ReactiveWindow - { - public AddServerWindow() - { - InitializeComponent(); - } + public partial class AddServerWindow : ReactiveWindow + { + public AddServerWindow() + { + InitializeComponent(); + } - public AddServerWindow(ProfileItem profileItem) - { - InitializeComponent(); + public AddServerWindow(ProfileItem profileItem) + { + InitializeComponent(); - this.Loaded += Window_Loaded; - btnCancel.Click += (s, e) => this.Close(); - cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged; - cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged; - btnGUID.Click += btnGUID_Click; - btnGUID5.Click += btnGUID_Click; + this.Loaded += Window_Loaded; + btnCancel.Click += (s, e) => this.Close(); + cmbNetwork.SelectionChanged += CmbNetwork_SelectionChanged; + cmbStreamSecurity.SelectionChanged += CmbStreamSecurity_SelectionChanged; + btnGUID.Click += btnGUID_Click; + btnGUID5.Click += btnGUID_Click; - ViewModel = new AddServerViewModel(profileItem, UpdateViewHandler); + ViewModel = new AddServerViewModel(profileItem, UpdateViewHandler); - Global.CoreTypes.ForEach(it => - { - cmbCoreType.Items.Add(it); - }); - cmbCoreType.Items.Add(string.Empty); + Global.CoreTypes.ForEach(it => + { + cmbCoreType.Items.Add(it); + }); + cmbCoreType.Items.Add(string.Empty); - cmbStreamSecurity.Items.Add(string.Empty); - cmbStreamSecurity.Items.Add(Global.StreamSecurity); + cmbStreamSecurity.Items.Add(string.Empty); + cmbStreamSecurity.Items.Add(Global.StreamSecurity); - Global.Networks.ForEach(it => - { - cmbNetwork.Items.Add(it); - }); - Global.Fingerprints.ForEach(it => - { - cmbFingerprint.Items.Add(it); - cmbFingerprint2.Items.Add(it); - }); - Global.AllowInsecure.ForEach(it => - { - cmbAllowInsecure.Items.Add(it); - }); - Global.Alpns.ForEach(it => - { - cmbAlpn.Items.Add(it); - }); + Global.Networks.ForEach(it => + { + cmbNetwork.Items.Add(it); + }); + Global.Fingerprints.ForEach(it => + { + cmbFingerprint.Items.Add(it); + cmbFingerprint2.Items.Add(it); + }); + Global.AllowInsecure.ForEach(it => + { + cmbAllowInsecure.Items.Add(it); + }); + Global.Alpns.ForEach(it => + { + cmbAlpn.Items.Add(it); + }); - switch (profileItem.ConfigType) - { - case EConfigType.VMess: - gridVMess.IsVisible = true; - Global.VmessSecurities.ForEach(it => - { - cmbSecurity.Items.Add(it); - }); - if (profileItem.Security.IsNullOrEmpty()) - { - profileItem.Security = Global.DefaultSecurity; - } - break; + switch (profileItem.ConfigType) + { + case EConfigType.VMess: + gridVMess.IsVisible = true; + Global.VmessSecurities.ForEach(it => + { + cmbSecurity.Items.Add(it); + }); + if (profileItem.Security.IsNullOrEmpty()) + { + profileItem.Security = Global.DefaultSecurity; + } + break; - case EConfigType.Shadowsocks: - gridSs.IsVisible = true; - AppHandler.Instance.GetShadowsocksSecurities(profileItem).ForEach(it => - { - cmbSecurity3.Items.Add(it); - }); - break; + case EConfigType.Shadowsocks: + gridSs.IsVisible = true; + AppHandler.Instance.GetShadowsocksSecurities(profileItem).ForEach(it => + { + cmbSecurity3.Items.Add(it); + }); + break; - case EConfigType.SOCKS: - case EConfigType.HTTP: - gridSocks.IsVisible = true; - break; + case EConfigType.SOCKS: + case EConfigType.HTTP: + gridSocks.IsVisible = true; + break; - case EConfigType.VLESS: - gridVLESS.IsVisible = true; - cmbStreamSecurity.Items.Add(Global.StreamSecurityReality); - Global.Flows.ForEach(it => - { - cmbFlow5.Items.Add(it); - }); - if (profileItem.Security.IsNullOrEmpty()) - { - profileItem.Security = Global.None; - } - break; + case EConfigType.VLESS: + gridVLESS.IsVisible = true; + cmbStreamSecurity.Items.Add(Global.StreamSecurityReality); + Global.Flows.ForEach(it => + { + cmbFlow5.Items.Add(it); + }); + if (profileItem.Security.IsNullOrEmpty()) + { + profileItem.Security = Global.None; + } + break; - case EConfigType.Trojan: - gridTrojan.IsVisible = true; - cmbStreamSecurity.Items.Add(Global.StreamSecurityReality); - Global.Flows.ForEach(it => - { - cmbFlow6.Items.Add(it); - }); - break; + case EConfigType.Trojan: + gridTrojan.IsVisible = true; + cmbStreamSecurity.Items.Add(Global.StreamSecurityReality); + Global.Flows.ForEach(it => + { + cmbFlow6.Items.Add(it); + }); + break; - case EConfigType.Hysteria2: - gridHysteria2.IsVisible = true; - sepa2.IsVisible = false; - gridTransport.IsVisible = false; - cmbCoreType.IsEnabled = false; - cmbFingerprint.IsEnabled = false; - cmbFingerprint.SelectedValue = string.Empty; - break; + case EConfigType.Hysteria2: + gridHysteria2.IsVisible = true; + sepa2.IsVisible = false; + gridTransport.IsVisible = false; + cmbCoreType.IsEnabled = false; + cmbFingerprint.IsEnabled = false; + cmbFingerprint.SelectedValue = string.Empty; + break; - case EConfigType.TUIC: - gridTuic.IsVisible = true; - sepa2.IsVisible = false; - gridTransport.IsVisible = false; - cmbCoreType.IsEnabled = false; - cmbFingerprint.IsEnabled = false; - cmbFingerprint.SelectedValue = string.Empty; + case EConfigType.TUIC: + gridTuic.IsVisible = true; + sepa2.IsVisible = false; + gridTransport.IsVisible = false; + cmbCoreType.IsEnabled = false; + cmbFingerprint.IsEnabled = false; + cmbFingerprint.SelectedValue = string.Empty; - Global.TuicCongestionControls.ForEach(it => - { - cmbHeaderType8.Items.Add(it); - }); - break; + Global.TuicCongestionControls.ForEach(it => + { + cmbHeaderType8.Items.Add(it); + }); + break; - case EConfigType.WireGuard: - gridWireguard.IsVisible = true; + case EConfigType.WireGuard: + gridWireguard.IsVisible = true; - sepa2.IsVisible = false; - gridTransport.IsVisible = false; - gridTls.IsVisible = false; - cmbCoreType.IsEnabled = false; + sepa2.IsVisible = false; + gridTransport.IsVisible = false; + gridTls.IsVisible = false; + cmbCoreType.IsEnabled = false; - break; - } + break; + } - gridTlsMore.IsVisible = false; + gridTlsMore.IsVisible = false; - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.CoreType, v => v.cmbCoreType.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Remarks, v => v.txtRemarks.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Address, v => v.txtAddress.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Port, v => v.txtPort.Text).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.CoreType, v => v.cmbCoreType.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Remarks, v => v.txtRemarks.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Address, v => v.txtAddress.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Port, v => v.txtPort.Text).DisposeWith(disposables); - switch (profileItem.ConfigType) - { - case EConfigType.VMess: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.AlterId, v => v.txtAlterId.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.cmbSecurity.SelectedValue).DisposeWith(disposables); - break; + switch (profileItem.ConfigType) + { + case EConfigType.VMess: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.AlterId, v => v.txtAlterId.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.cmbSecurity.SelectedValue).DisposeWith(disposables); + break; - case EConfigType.Shadowsocks: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId3.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.cmbSecurity3.SelectedValue).DisposeWith(disposables); - break; + case EConfigType.Shadowsocks: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId3.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.cmbSecurity3.SelectedValue).DisposeWith(disposables); + break; - case EConfigType.SOCKS: - case EConfigType.HTTP: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId4.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity4.Text).DisposeWith(disposables); - break; + case EConfigType.SOCKS: + case EConfigType.HTTP: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId4.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity4.Text).DisposeWith(disposables); + break; - case EConfigType.VLESS: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId5.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Flow, v => v.cmbFlow5.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity5.Text).DisposeWith(disposables); - break; + case EConfigType.VLESS: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId5.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Flow, v => v.cmbFlow5.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity5.Text).DisposeWith(disposables); + break; - case EConfigType.Trojan: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId6.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Flow, v => v.cmbFlow6.SelectedValue).DisposeWith(disposables); - break; + case EConfigType.Trojan: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId6.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Flow, v => v.cmbFlow6.SelectedValue).DisposeWith(disposables); + break; - case EConfigType.Hysteria2: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId7.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath7.Text).DisposeWith(disposables); - break; + case EConfigType.Hysteria2: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId7.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath7.Text).DisposeWith(disposables); + break; - case EConfigType.TUIC: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId8.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity8.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType8.SelectedValue).DisposeWith(disposables); - break; + case EConfigType.TUIC: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId8.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Security, v => v.txtSecurity8.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType8.SelectedValue).DisposeWith(disposables); + break; - case EConfigType.WireGuard: - this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId9.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.PublicKey, v => v.txtPublicKey9.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath9.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost9.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId9.Text).DisposeWith(disposables); - break; - } - this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Extra, v => v.txtExtra.Text).DisposeWith(disposables); + case EConfigType.WireGuard: + this.Bind(ViewModel, vm => vm.SelectedSource.Id, v => v.txtId9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.PublicKey, v => v.txtPublicKey9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost9.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId9.Text).DisposeWith(disposables); + break; + } + this.Bind(ViewModel, vm => vm.SelectedSource.Network, v => v.cmbNetwork.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.RequestHost, v => v.txtRequestHost.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Path, v => v.txtPath.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Extra, v => v.txtExtra.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.StreamSecurity, v => v.cmbStreamSecurity.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Sni, v => v.txtSNI.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.AllowInsecure, v => v.cmbAllowInsecure.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Fingerprint, v => v.cmbFingerprint.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Alpn, v => v.cmbAlpn.SelectedValue).DisposeWith(disposables); - //reality - this.Bind(ViewModel, vm => vm.SelectedSource.Sni, v => v.txtSNI2.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Fingerprint, v => v.cmbFingerprint2.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.PublicKey, v => v.txtPublicKey.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.SpiderX, v => v.txtSpiderX.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.StreamSecurity, v => v.cmbStreamSecurity.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Sni, v => v.txtSNI.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.AllowInsecure, v => v.cmbAllowInsecure.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Fingerprint, v => v.cmbFingerprint.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Alpn, v => v.cmbAlpn.SelectedValue).DisposeWith(disposables); + //reality + this.Bind(ViewModel, vm => vm.SelectedSource.Sni, v => v.txtSNI2.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Fingerprint, v => v.cmbFingerprint2.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.PublicKey, v => v.txtPublicKey.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.ShortId, v => v.txtShortId.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.SpiderX, v => v.txtSpiderX.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); - }); + this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); + }); - this.Title = $"{profileItem.ConfigType}"; - } + this.Title = $"{profileItem.ConfigType}"; + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.CloseWindow: - this.Close(true); - break; - } - return await Task.FromResult(true); - } + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.CloseWindow: + this.Close(true); + break; + } + return await Task.FromResult(true); + } - private void Window_Loaded(object? sender, RoutedEventArgs e) - { - txtRemarks.Focus(); - } + private void Window_Loaded(object? sender, RoutedEventArgs e) + { + txtRemarks.Focus(); + } - private void CmbNetwork_SelectionChanged(object? sender, SelectionChangedEventArgs e) - { - SetHeaderType(); - SetTips(); - } + private void CmbNetwork_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + SetHeaderType(); + SetTips(); + } - private void CmbStreamSecurity_SelectionChanged(object? sender, SelectionChangedEventArgs e) - { - var security = cmbStreamSecurity.SelectedItem.ToString(); - if (security == Global.StreamSecurityReality) - { - gridRealityMore.IsVisible = true; - gridTlsMore.IsVisible = false; - } - else if (security == Global.StreamSecurity) - { - gridRealityMore.IsVisible = false; - gridTlsMore.IsVisible = true; - } - else - { - gridRealityMore.IsVisible = false; - gridTlsMore.IsVisible = false; - } - } + private void CmbStreamSecurity_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + var security = cmbStreamSecurity.SelectedItem.ToString(); + if (security == Global.StreamSecurityReality) + { + gridRealityMore.IsVisible = true; + gridTlsMore.IsVisible = false; + } + else if (security == Global.StreamSecurity) + { + gridRealityMore.IsVisible = false; + gridTlsMore.IsVisible = true; + } + else + { + gridRealityMore.IsVisible = false; + gridTlsMore.IsVisible = false; + } + } - private void btnGUID_Click(object? sender, RoutedEventArgs e) - { - txtId.Text = - txtId5.Text = Utils.GetGuid(); - } + private void btnGUID_Click(object? sender, RoutedEventArgs e) + { + txtId.Text = + txtId5.Text = Utils.GetGuid(); + } - private void SetHeaderType() - { - cmbHeaderType.Items.Clear(); + private void SetHeaderType() + { + cmbHeaderType.Items.Clear(); - var network = cmbNetwork.SelectedItem.ToString(); - if (Utils.IsNullOrEmpty(network)) - { - cmbHeaderType.Items.Add(Global.None); - return; - } + var network = cmbNetwork.SelectedItem.ToString(); + if (Utils.IsNullOrEmpty(network)) + { + cmbHeaderType.Items.Add(Global.None); + return; + } - if (network == nameof(ETransport.tcp)) - { - cmbHeaderType.Items.Add(Global.None); - cmbHeaderType.Items.Add(Global.TcpHeaderHttp); - } - else if (network is nameof(ETransport.kcp) or nameof(ETransport.quic)) - { - cmbHeaderType.Items.Add(Global.None); - Global.KcpHeaderTypes.ForEach(it => - { - cmbHeaderType.Items.Add(it); - }); - } - else if (network is nameof(ETransport.xhttp)) - { - Global.XhttpMode.ForEach(it => - { - cmbHeaderType.Items.Add(it); - }); - } - else if (network == nameof(ETransport.grpc)) - { - cmbHeaderType.Items.Add(Global.GrpcGunMode); - cmbHeaderType.Items.Add(Global.GrpcMultiMode); - } - else - { - cmbHeaderType.Items.Add(Global.None); - } - cmbHeaderType.SelectedIndex = 0; - } + if (network == nameof(ETransport.tcp)) + { + cmbHeaderType.Items.Add(Global.None); + cmbHeaderType.Items.Add(Global.TcpHeaderHttp); + } + else if (network is nameof(ETransport.kcp) or nameof(ETransport.quic)) + { + cmbHeaderType.Items.Add(Global.None); + Global.KcpHeaderTypes.ForEach(it => + { + cmbHeaderType.Items.Add(it); + }); + } + else if (network is nameof(ETransport.xhttp)) + { + Global.XhttpMode.ForEach(it => + { + cmbHeaderType.Items.Add(it); + }); + } + else if (network == nameof(ETransport.grpc)) + { + cmbHeaderType.Items.Add(Global.GrpcGunMode); + cmbHeaderType.Items.Add(Global.GrpcMultiMode); + } + else + { + cmbHeaderType.Items.Add(Global.None); + } + cmbHeaderType.SelectedIndex = 0; + } - private void SetTips() - { - var network = cmbNetwork.SelectedItem.ToString(); - if (Utils.IsNullOrEmpty(network)) - { - network = Global.DefaultNetwork; - } - labHeaderType.IsVisible = true; - btnExtra.IsVisible = false; - tipRequestHost.Text = - tipPath.Text = - tipHeaderType.Text = string.Empty; + private void SetTips() + { + var network = cmbNetwork.SelectedItem.ToString(); + if (Utils.IsNullOrEmpty(network)) + { + network = Global.DefaultNetwork; + } + labHeaderType.IsVisible = true; + btnExtra.IsVisible = false; + tipRequestHost.Text = + tipPath.Text = + tipHeaderType.Text = string.Empty; - switch (network) - { - case nameof(ETransport.tcp): - tipRequestHost.Text = ResUI.TransportRequestHostTip1; - tipHeaderType.Text = ResUI.TransportHeaderTypeTip1; - break; + switch (network) + { + case nameof(ETransport.tcp): + tipRequestHost.Text = ResUI.TransportRequestHostTip1; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip1; + break; - case nameof(ETransport.kcp): - tipHeaderType.Text = ResUI.TransportHeaderTypeTip2; - tipPath.Text = ResUI.TransportPathTip5; - break; + case nameof(ETransport.kcp): + tipHeaderType.Text = ResUI.TransportHeaderTypeTip2; + tipPath.Text = ResUI.TransportPathTip5; + break; - case nameof(ETransport.ws): - case nameof(ETransport.httpupgrade): - tipRequestHost.Text = ResUI.TransportRequestHostTip2; - tipPath.Text = ResUI.TransportPathTip1; - break; + case nameof(ETransport.ws): + case nameof(ETransport.httpupgrade): + tipRequestHost.Text = ResUI.TransportRequestHostTip2; + tipPath.Text = ResUI.TransportPathTip1; + break; - case nameof(ETransport.xhttp): - tipRequestHost.Text = ResUI.TransportRequestHostTip2; - tipPath.Text = ResUI.TransportPathTip1; - tipHeaderType.Text = ResUI.TransportHeaderTypeTip5; - labHeaderType.IsVisible = false; - btnExtra.IsVisible = true; - break; + case nameof(ETransport.xhttp): + tipRequestHost.Text = ResUI.TransportRequestHostTip2; + tipPath.Text = ResUI.TransportPathTip1; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip5; + labHeaderType.IsVisible = false; + btnExtra.IsVisible = true; + break; - case nameof(ETransport.h2): - tipRequestHost.Text = ResUI.TransportRequestHostTip3; - tipPath.Text = ResUI.TransportPathTip2; - break; + case nameof(ETransport.h2): + tipRequestHost.Text = ResUI.TransportRequestHostTip3; + tipPath.Text = ResUI.TransportPathTip2; + break; - case nameof(ETransport.quic): - tipRequestHost.Text = ResUI.TransportRequestHostTip4; - tipPath.Text = ResUI.TransportPathTip3; - tipHeaderType.Text = ResUI.TransportHeaderTypeTip3; - break; + case nameof(ETransport.quic): + tipRequestHost.Text = ResUI.TransportRequestHostTip4; + tipPath.Text = ResUI.TransportPathTip3; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip3; + break; - case nameof(ETransport.grpc): - tipRequestHost.Text = ResUI.TransportRequestHostTip5; - tipPath.Text = ResUI.TransportPathTip4; - tipHeaderType.Text = ResUI.TransportHeaderTypeTip4; - labHeaderType.IsVisible = false; - break; - } - } - } + case nameof(ETransport.grpc): + tipRequestHost.Text = ResUI.TransportRequestHostTip5; + tipPath.Text = ResUI.TransportPathTip4; + tipHeaderType.Text = ResUI.TransportHeaderTypeTip4; + labHeaderType.IsVisible = false; + break; + } + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/BackupAndRestoreView.axaml b/v2rayN/v2rayN.Desktop/Views/BackupAndRestoreView.axaml index badb2061..5556b537 100644 --- a/v2rayN/v2rayN.Desktop/Views/BackupAndRestoreView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/BackupAndRestoreView.axaml @@ -1,214 +1,214 @@ - - - - + + + + - - - - + + + + - - + + - - + + - - + - + - - + - + - - - + + + - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs index 297d2c11..9f9e2ee7 100644 --- a/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ClashConnectionsView.axaml.cs @@ -7,59 +7,60 @@ using System.Reactive.Disposables; namespace v2rayN.Desktop.Views { - public partial class ClashConnectionsView : ReactiveUserControl - { - public ClashConnectionsView() - { - InitializeComponent(); - ViewModel = new ClashConnectionsViewModel(UpdateViewHandler); - btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; + public partial class ClashConnectionsView : ReactiveUserControl + { + public ClashConnectionsView() + { + InitializeComponent(); + ViewModel = new ClashConnectionsViewModel(UpdateViewHandler); + btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ConnectionItems, v => v.lstConnections.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstConnections.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ConnectionItems, v => v.lstConnections.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstConnections.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.HostFilter, v => v.txtHostFilter.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); - } + this.Bind(ViewModel, vm => vm.HostFilter, v => v.txtHostFilter.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherRefreshConnections: - if (obj is null) return false; - Dispatcher.UIThread.Post(() => - ViewModel?.RefreshConnections((List?)obj), - DispatcherPriority.Default); - break; - } + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshConnections: + if (obj is null) + return false; + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshConnections((List?)obj), + DispatcherPriority.Default); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - private void BtnAutofitColumnWidth_Click(object? sender, RoutedEventArgs e) - { - AutofitColumnWidth(); - } + private void BtnAutofitColumnWidth_Click(object? sender, RoutedEventArgs e) + { + AutofitColumnWidth(); + } - private void AutofitColumnWidth() - { - foreach (var it in lstConnections.Columns) - { - it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); - } - } + private void AutofitColumnWidth() + { + foreach (var it in lstConnections.Columns) + { + it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); + } + } - private void btnClose_Click(object? sender, RoutedEventArgs e) - { - ViewModel?.ClashConnectionClose(false); - } - } + private void btnClose_Click(object? sender, RoutedEventArgs e) + { + ViewModel?.ClashConnectionClose(false); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml index 34baeaed..2a67944f 100644 --- a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml @@ -1,171 +1,171 @@ - - - + x:Class="v2rayN.Desktop.Views.ClashProxiesView" + xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:conv="using:v2rayN.Desktop.Converters" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" + xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib" + d:DesignHeight="450" + d:DesignWidth="800" + x:DataType="vms:ClashProxiesViewModel" + mc:Ignorable="d"> + + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs index d46a2b2b..7466cbe3 100644 --- a/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ClashProxiesView.axaml.cs @@ -8,74 +8,75 @@ using System.Reactive.Disposables; namespace v2rayN.Desktop.Views { - public partial class ClashProxiesView : ReactiveUserControl - { - public ClashProxiesView() - { - InitializeComponent(); - ViewModel = new ClashProxiesViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); - lstProxyDetails.DoubleTapped += LstProxyDetails_DoubleTapped; - this.KeyDown += ClashProxiesView_KeyDown; + public partial class ClashProxiesView : ReactiveUserControl + { + public ClashProxiesView() + { + InitializeComponent(); + ViewModel = new ClashProxiesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); + lstProxyDetails.DoubleTapped += LstProxyDetails_DoubleTapped; + this.KeyDown += ClashProxiesView_KeyDown; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ProxyGroups, v => v.lstProxyGroups.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedGroup, v => v.lstProxyGroups.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProxyGroups, v => v.lstProxyGroups.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedGroup, v => v.lstProxyGroups.SelectedItem).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.ProxyDetails, v => v.lstProxyDetails.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedDetail, v => v.lstProxyDetails.SelectedItem).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.ProxyDetails, v => v.lstProxyDetails.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedDetail, v => v.lstProxyDetails.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesReloadCmd, v => v.menuProxiesReload).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestCmd, v => v.menuProxiesDelaytest).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesReloadCmd, v => v.menuProxiesReload).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestCmd, v => v.menuProxiesDelaytest).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestPartCmd, v => v.menuProxiesDelaytestPart).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesSelectActivityCmd, v => v.menuProxiesSelectActivity).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestPartCmd, v => v.menuProxiesDelaytestPart).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesSelectActivityCmd, v => v.menuProxiesSelectActivity).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.RuleModeSelected, v => v.cmbRulemode.SelectedIndex).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); - } + this.Bind(ViewModel, vm => vm.RuleModeSelected, v => v.cmbRulemode.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherRefreshProxyGroups: - Dispatcher.UIThread.Post(() => - ViewModel?.RefreshProxyGroups(), - DispatcherPriority.Default); - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshProxyGroups: + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshProxyGroups(), + DispatcherPriority.Default); + break; - case EViewAction.DispatcherProxiesDelayTest: - if (obj is null) return false; - Dispatcher.UIThread.Post(() => - ViewModel?.ProxiesDelayTestResult((SpeedTestResult)obj), - DispatcherPriority.Default); - break; - } + case EViewAction.DispatcherProxiesDelayTest: + if (obj is null) + return false; + Dispatcher.UIThread.Post(() => + ViewModel?.ProxiesDelayTestResult((SpeedTestResult)obj), + DispatcherPriority.Default); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - private void ClashProxiesView_KeyDown(object? sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.F5: - ViewModel?.ProxiesReload(); - break; + private void ClashProxiesView_KeyDown(object? sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.F5: + ViewModel?.ProxiesReload(); + break; - case Key.Enter: - ViewModel?.SetActiveProxy(); - break; - } - } + case Key.Enter: + ViewModel?.SetActiveProxy(); + break; + } + } - private void LstProxyDetails_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) - { - ViewModel?.SetActiveProxy(); - } - } + private void LstProxyDetails_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + ViewModel?.SetActiveProxy(); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml index 80eae9d9..c7c832b4 100644 --- a/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/DNSSettingWindow.axaml @@ -1,174 +1,174 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs index 8d233993..0c6fead1 100644 --- a/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/MsgView.axaml.cs @@ -7,72 +7,73 @@ using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views { - public partial class MsgView : ReactiveUserControl - { - public MsgView() - { - InitializeComponent(); + public partial class MsgView : ReactiveUserControl + { + public MsgView() + { + InitializeComponent(); - ViewModel = new MsgViewModel(UpdateViewHandler); + ViewModel = new MsgViewModel(UpdateViewHandler); - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.MsgFilter, v => v.cmbMsgFilter.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); - } + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.MsgFilter, v => v.cmbMsgFilter.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherShowMsg: - if (obj is null) return false; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherShowMsg: + if (obj is null) + return false; - Dispatcher.UIThread.Post(() => - ShowMsg(obj), - DispatcherPriority.ApplicationIdle); - break; - } - return await Task.FromResult(true); - } + Dispatcher.UIThread.Post(() => + ShowMsg(obj), + DispatcherPriority.ApplicationIdle); + break; + } + return await Task.FromResult(true); + } - private void ShowMsg(object msg) - { - txtMsg.Text = msg.ToString(); - if (togScrollToEnd.IsChecked ?? true) - { - txtMsg.CaretIndex = int.MaxValue; - } - } + private void ShowMsg(object msg) + { + txtMsg.Text = msg.ToString(); + if (togScrollToEnd.IsChecked ?? true) + { + txtMsg.CaretIndex = int.MaxValue; + } + } - public void ClearMsg() - { - ViewModel?.ClearMsg(); - txtMsg.Clear(); - } + public void ClearMsg() + { + ViewModel?.ClearMsg(); + txtMsg.Clear(); + } - private void menuMsgViewSelectAll_Click(object? sender, RoutedEventArgs e) - { - txtMsg.Focus(); - txtMsg.SelectAll(); - } + private void menuMsgViewSelectAll_Click(object? sender, RoutedEventArgs e) + { + txtMsg.Focus(); + txtMsg.SelectAll(); + } - private async void menuMsgViewCopy_Click(object? sender, RoutedEventArgs e) - { - var data = txtMsg.SelectedText.TrimEx(); - await AvaUtils.SetClipboardData(this, data); - } + private async void menuMsgViewCopy_Click(object? sender, RoutedEventArgs e) + { + var data = txtMsg.SelectedText.TrimEx(); + await AvaUtils.SetClipboardData(this, data); + } - private async void menuMsgViewCopyAll_Click(object? sender, RoutedEventArgs e) - { - var data = txtMsg.Text.TrimEx(); - await AvaUtils.SetClipboardData(this, data); - } + private async void menuMsgViewCopyAll_Click(object? sender, RoutedEventArgs e) + { + var data = txtMsg.Text.TrimEx(); + await AvaUtils.SetClipboardData(this, data); + } - private void menuMsgViewClear_Click(object? sender, RoutedEventArgs e) - { - ClearMsg(); - } - } + private void menuMsgViewClear_Click(object? sender, RoutedEventArgs e) + { + ClearMsg(); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml index 88c8e2aa..17e9432a 100644 --- a/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/OptionSettingWindow.axaml @@ -1,899 +1,899 @@ - - - - - + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs index 07d2733e..fcee758b 100644 --- a/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ProfilesView.axaml.cs @@ -12,466 +12,474 @@ using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views { - public partial class ProfilesView : ReactiveUserControl - { - private static Config _config; - private Window? _window; + public partial class ProfilesView : ReactiveUserControl + { + private static Config _config; + private Window? _window; - public ProfilesView() - { - InitializeComponent(); - } + public ProfilesView() + { + InitializeComponent(); + } - public ProfilesView(Window window) - { - InitializeComponent(); + public ProfilesView(Window window) + { + InitializeComponent(); - _config = AppHandler.Instance.Config; - _window = window; + _config = AppHandler.Instance.Config; + _window = window; - menuSelectAll.Click += menuSelectAll_Click; - btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; - txtServerFilter.KeyDown += TxtServerFilter_KeyDown; - lstProfiles.KeyDown += LstProfiles_KeyDown; - lstProfiles.SelectionChanged += lstProfiles_SelectionChanged; - lstProfiles.DoubleTapped += LstProfiles_DoubleTapped; - lstProfiles.LoadingRow += LstProfiles_LoadingRow; - lstProfiles.Sorting += LstProfiles_Sorting; - //if (_config.uiItem.enableDragDropSort) - //{ - // lstProfiles.AllowDrop = true; - // lstProfiles.PreviewMouseLeftButtonDown += LstProfiles_PreviewMouseLeftButtonDown; - // lstProfiles.MouseMove += LstProfiles_MouseMove; - // lstProfiles.DragEnter += LstProfiles_DragEnter; - // lstProfiles.Drop += LstProfiles_Drop; - //} + menuSelectAll.Click += menuSelectAll_Click; + btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; + txtServerFilter.KeyDown += TxtServerFilter_KeyDown; + lstProfiles.KeyDown += LstProfiles_KeyDown; + lstProfiles.SelectionChanged += lstProfiles_SelectionChanged; + lstProfiles.DoubleTapped += LstProfiles_DoubleTapped; + lstProfiles.LoadingRow += LstProfiles_LoadingRow; + lstProfiles.Sorting += LstProfiles_Sorting; + //if (_config.uiItem.enableDragDropSort) + //{ + // lstProfiles.AllowDrop = true; + // lstProfiles.PreviewMouseLeftButtonDown += LstProfiles_PreviewMouseLeftButtonDown; + // lstProfiles.MouseMove += LstProfiles_MouseMove; + // lstProfiles.DragEnter += LstProfiles_DragEnter; + // lstProfiles.Drop += LstProfiles_Drop; + //} - ViewModel = new ProfilesViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); + ViewModel = new ProfilesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ProfileItems, v => v.lstProfiles.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedProfile, v => v.lstProfiles.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProfileItems, v => v.lstProfiles.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedProfile, v => v.lstProfiles.SelectedItem).DisposeWith(disposables); - // this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstGroup.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSub, v => v.lstGroup.SelectedItem).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.ServerFilter, v => v.txtServerFilter.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.AddSubCmd, v => v.btnAddSub).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.EditSubCmd, v => v.btnEditSub).DisposeWith(disposables); + // this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSub, v => v.lstGroup.SelectedItem).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.ServerFilter, v => v.txtServerFilter.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.AddSubCmd, v => v.btnAddSub).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.EditSubCmd, v => v.btnEditSub).DisposeWith(disposables); - //servers delete - this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); + //servers delete + this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); - //servers move - //this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedMoveToGroup, v => v.cmbMoveToGroup.SelectedItem).DisposeWith(disposables); + //servers move + //this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedMoveToGroup, v => v.cmbMoveToGroup.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveTopCmd, v => v.menuMoveTop).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveUpCmd, v => v.menuMoveUp).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveDownCmd, v => v.menuMoveDown).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveBottomCmd, v => v.menuMoveBottom).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveTopCmd, v => v.menuMoveTop).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveUpCmd, v => v.menuMoveUp).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveDownCmd, v => v.menuMoveDown).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveBottomCmd, v => v.menuMoveBottom).DisposeWith(disposables); - //servers ping - this.BindCommand(ViewModel, vm => vm.MixedTestServerCmd, v => v.menuMixedTestServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.TcpingServerCmd, v => v.menuTcpingServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RealPingServerCmd, v => v.menuRealPingServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SpeedServerCmd, v => v.menuSpeedServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SortServerResultCmd, v => v.menuSortServerResult).DisposeWith(disposables); + //servers ping + this.BindCommand(ViewModel, vm => vm.MixedTestServerCmd, v => v.menuMixedTestServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.TcpingServerCmd, v => v.menuTcpingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RealPingServerCmd, v => v.menuRealPingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SpeedServerCmd, v => v.menuSpeedServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SortServerResultCmd, v => v.menuSortServerResult).DisposeWith(disposables); - //servers export - this.BindCommand(ViewModel, vm => vm.Export2ClientConfigCmd, v => v.menuExport2ClientConfig).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); - }); + //servers export + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigCmd, v => v.menuExport2ClientConfig).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); + }); - RestoreUI(); - ViewModel?.RefreshServers(); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); - } + RestoreUI(); + ViewModel?.RefreshServers(); + MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); + } - private async void LstProfiles_Sorting(object? sender, DataGridColumnEventArgs e) - { - e.Handled = true; - await ViewModel?.SortServer(e.Column.Tag.ToString()); - e.Handled = false; - } + private async void LstProfiles_Sorting(object? sender, DataGridColumnEventArgs e) + { + e.Handled = true; + await ViewModel?.SortServer(e.Column.Tag.ToString()); + e.Handled = false; + } - //#region Event + //#region Event - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.SetClipboardData: - if (obj is null) return false; - await AvaUtils.SetClipboardData(this, (string)obj); - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.SetClipboardData: + if (obj is null) + return false; + await AvaUtils.SetClipboardData(this, (string)obj); + break; - case EViewAction.AdjustMainLvColWidth: - Dispatcher.UIThread.Post(() => - AutofitColumnWidth(), - DispatcherPriority.Default); + case EViewAction.AdjustMainLvColWidth: + Dispatcher.UIThread.Post(() => + AutofitColumnWidth(), + DispatcherPriority.Default); - break; + break; - case EViewAction.ProfilesFocus: - lstProfiles.Focus(); - break; + case EViewAction.ProfilesFocus: + lstProfiles.Focus(); + break; - case EViewAction.ShowYesNo: - if (await UI.ShowYesNo(_window, ResUI.RemoveServer) == ButtonResult.No) - { - return false; - } - break; + case EViewAction.ShowYesNo: + if (await UI.ShowYesNo(_window, ResUI.RemoveServer) == ButtonResult.No) + { + return false; + } + break; - case EViewAction.SaveFileDialog: - if (obj is null) return false; - var fileName = await UI.SaveFileDialog(_window, ""); - if (fileName.IsNullOrEmpty()) - { - return false; - } - ViewModel?.Export2ClientConfigResult(fileName, (ProfileItem)obj); - break; + case EViewAction.SaveFileDialog: + if (obj is null) + return false; + var fileName = await UI.SaveFileDialog(_window, ""); + if (fileName.IsNullOrEmpty()) + { + return false; + } + ViewModel?.Export2ClientConfigResult(fileName, (ProfileItem)obj); + break; - case EViewAction.AddServerWindow: - if (obj is null) return false; - return await new AddServerWindow((ProfileItem)obj).ShowDialog(_window); + case EViewAction.AddServerWindow: + if (obj is null) + return false; + return await new AddServerWindow((ProfileItem)obj).ShowDialog(_window); - case EViewAction.AddServer2Window: - if (obj is null) return false; - return await new AddServer2Window((ProfileItem)obj).ShowDialog(_window); + case EViewAction.AddServer2Window: + if (obj is null) + return false; + return await new AddServer2Window((ProfileItem)obj).ShowDialog(_window); - case EViewAction.ShareServer: - if (obj is null) return false; - await ShareServer((string)obj); - break; + case EViewAction.ShareServer: + if (obj is null) + return false; + await ShareServer((string)obj); + break; - case EViewAction.SubEditWindow: - if (obj is null) return false; - return await new SubEditWindow((SubItem)obj).ShowDialog(_window); + case EViewAction.SubEditWindow: + if (obj is null) + return false; + return await new SubEditWindow((SubItem)obj).ShowDialog(_window); - case EViewAction.DispatcherSpeedTest: - if (obj is null) return false; - Dispatcher.UIThread.Post(() => - ViewModel?.SetSpeedTestResult((SpeedTestResult)obj), - DispatcherPriority.Default); + case EViewAction.DispatcherSpeedTest: + if (obj is null) + return false; + Dispatcher.UIThread.Post(() => + ViewModel?.SetSpeedTestResult((SpeedTestResult)obj), + DispatcherPriority.Default); - break; + break; - case EViewAction.DispatcherRefreshServersBiz: - Dispatcher.UIThread.Post(() => - ViewModel?.RefreshServersBiz(), - DispatcherPriority.Default); - break; - } + case EViewAction.DispatcherRefreshServersBiz: + Dispatcher.UIThread.Post(() => + ViewModel?.RefreshServersBiz(), + DispatcherPriority.Default); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - public async Task ShareServer(string url) - { - if (Utils.IsNullOrEmpty(url)) - { - return; - } + public async Task ShareServer(string url) + { + if (Utils.IsNullOrEmpty(url)) + { + return; + } - var dialog = new QrcodeView(url); - await DialogHost.Show(dialog); - } + var dialog = new QrcodeView(url); + await DialogHost.Show(dialog); + } - private void lstProfiles_SelectionChanged(object? sender, SelectionChangedEventArgs e) - { - ViewModel.SelectedProfiles = lstProfiles.SelectedItems.Cast().ToList(); - } + private void lstProfiles_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + ViewModel.SelectedProfiles = lstProfiles.SelectedItems.Cast().ToList(); + } - private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) - { - var source = e.Source as Border; - if (source?.Name == "HeaderBackground") return; - if (_config.UiItem.DoubleClick2Activate) - { - ViewModel?.SetDefaultServer(); - } - else - { - ViewModel?.EditServerAsync(EConfigType.Custom); - } - } + private void LstProfiles_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + var source = e.Source as Border; + if (source?.Name == "HeaderBackground") + return; + if (_config.UiItem.DoubleClick2Activate) + { + ViewModel?.SetDefaultServer(); + } + else + { + ViewModel?.EditServerAsync(EConfigType.Custom); + } + } - private void LstProfiles_LoadingRow(object? sender, DataGridRowEventArgs e) - { - e.Row.Header = $" {e.Row.GetIndex() + 1}"; - } + private void LstProfiles_LoadingRow(object? sender, DataGridRowEventArgs e) + { + e.Row.Header = $" {e.Row.GetIndex() + 1}"; + } - //private void LstProfiles_ColumnHeader_Click(object? sender, RoutedEventArgs e) - //{ - // var colHeader = sender as DataGridColumnHeader; - // if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null) - // { - // return; - // } + //private void LstProfiles_ColumnHeader_Click(object? sender, RoutedEventArgs e) + //{ + // var colHeader = sender as DataGridColumnHeader; + // if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null) + // { + // return; + // } - // var colName = ((MyDGTextColumn)colHeader.Column).ExName; - // ViewModel?.SortServer(colName); - //} + // var colName = ((MyDGTextColumn)colHeader.Column).ExName; + // ViewModel?.SortServer(colName); + //} - private void menuSelectAll_Click(object? sender, RoutedEventArgs e) - { - lstProfiles.SelectAll(); - } + private void menuSelectAll_Click(object? sender, RoutedEventArgs e) + { + lstProfiles.SelectAll(); + } - private void LstProfiles_KeyDown(object? sender, KeyEventArgs e) - { - if (e.KeyModifiers is KeyModifiers.Control or KeyModifiers.Meta) - { - switch (e.Key) - { - case Key.A: - menuSelectAll_Click(null, null); - break; + private void LstProfiles_KeyDown(object? sender, KeyEventArgs e) + { + if (e.KeyModifiers is KeyModifiers.Control or KeyModifiers.Meta) + { + switch (e.Key) + { + case Key.A: + menuSelectAll_Click(null, null); + break; - case Key.C: - ViewModel?.Export2ShareUrlAsync(false); - break; + case Key.C: + ViewModel?.Export2ShareUrlAsync(false); + break; - case Key.D: - ViewModel?.EditServerAsync(EConfigType.Custom); - break; + case Key.D: + ViewModel?.EditServerAsync(EConfigType.Custom); + break; - case Key.F: - ViewModel?.ShareServerAsync(); - break; + case Key.F: + ViewModel?.ShareServerAsync(); + break; - case Key.O: - ViewModel?.ServerSpeedtest(ESpeedActionType.Tcping); - break; + case Key.O: + ViewModel?.ServerSpeedtest(ESpeedActionType.Tcping); + break; - case Key.R: - ViewModel?.ServerSpeedtest(ESpeedActionType.Realping); - break; + case Key.R: + ViewModel?.ServerSpeedtest(ESpeedActionType.Realping); + break; - case Key.T: - ViewModel?.ServerSpeedtest(ESpeedActionType.Speedtest); - break; + case Key.T: + ViewModel?.ServerSpeedtest(ESpeedActionType.Speedtest); + break; - case Key.E: - ViewModel?.ServerSpeedtest(ESpeedActionType.Mixedtest); - break; - } - } - else - { - if (e.Key is Key.Enter or Key.Return) - { - ViewModel?.SetDefaultServer(); - } - else if (e.Key == Key.Delete) - { - ViewModel?.RemoveServerAsync(); - } - else if (e.Key == Key.T) - { - ViewModel?.MoveServer(EMove.Top); - } - else if (e.Key == Key.U) - { - ViewModel?.MoveServer(EMove.Up); - } - else if (e.Key == Key.D) - { - ViewModel?.MoveServer(EMove.Down); - } - else if (e.Key == Key.B) - { - ViewModel?.MoveServer(EMove.Bottom); - } - else if (e.Key == Key.Escape) - { - ViewModel?.ServerSpeedtestStop(); - } - } - } + case Key.E: + ViewModel?.ServerSpeedtest(ESpeedActionType.Mixedtest); + break; + } + } + else + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.SetDefaultServer(); + } + else if (e.Key == Key.Delete) + { + ViewModel?.RemoveServerAsync(); + } + else if (e.Key == Key.T) + { + ViewModel?.MoveServer(EMove.Top); + } + else if (e.Key == Key.U) + { + ViewModel?.MoveServer(EMove.Up); + } + else if (e.Key == Key.D) + { + ViewModel?.MoveServer(EMove.Down); + } + else if (e.Key == Key.B) + { + ViewModel?.MoveServer(EMove.Bottom); + } + else if (e.Key == Key.Escape) + { + ViewModel?.ServerSpeedtestStop(); + } + } + } - private void BtnAutofitColumnWidth_Click(object? sender, RoutedEventArgs e) - { - AutofitColumnWidth(); - } + private void BtnAutofitColumnWidth_Click(object? sender, RoutedEventArgs e) + { + AutofitColumnWidth(); + } - private void AutofitColumnWidth() - { - foreach (var it in lstProfiles.Columns) - { - it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); - } - } + private void AutofitColumnWidth() + { + foreach (var it in lstProfiles.Columns) + { + it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); + } + } - private void TxtServerFilter_KeyDown(object? sender, KeyEventArgs e) - { - if (e.Key is Key.Enter or Key.Return) - { - ViewModel?.RefreshServers(); - } - } + private void TxtServerFilter_KeyDown(object? sender, KeyEventArgs e) + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.RefreshServers(); + } + } - //#endregion Event + //#endregion Event - //#region UI + //#region UI - private void RestoreUI() - { - var lvColumnItem = _config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList(); - var displayIndex = 0; - foreach (var item in lvColumnItem) - { - foreach (var item2 in lstProfiles.Columns) - { - if (item2.Tag == null) - { - continue; - } - if (item2.Tag.Equals(item.Name)) - { - if (item.Width < 0) - { - item2.IsVisible = false; - } - else - { - item2.Width = new DataGridLength(item.Width, DataGridLengthUnitType.Pixel); - item2.DisplayIndex = displayIndex++; - } - if (item.Name.ToLower().StartsWith("to")) - { - item2.IsVisible = _config.GuiItem.EnableStatistics; - } - } - } - } - } + private void RestoreUI() + { + var lvColumnItem = _config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList(); + var displayIndex = 0; + foreach (var item in lvColumnItem) + { + foreach (var item2 in lstProfiles.Columns) + { + if (item2.Tag == null) + { + continue; + } + if (item2.Tag.Equals(item.Name)) + { + if (item.Width < 0) + { + item2.IsVisible = false; + } + else + { + item2.Width = new DataGridLength(item.Width, DataGridLengthUnitType.Pixel); + item2.DisplayIndex = displayIndex++; + } + if (item.Name.ToLower().StartsWith("to")) + { + item2.IsVisible = _config.GuiItem.EnableStatistics; + } + } + } + } + } - private void StorageUI(string? n = null) - { - List lvColumnItem = new(); - for (int k = 0; k < lstProfiles.Columns.Count; k++) - { - var item2 = lstProfiles.Columns[k]; - if (item2.Tag == null) - { - continue; - } - lvColumnItem.Add(new() - { - Name = (string)item2.Tag, - Width = item2.IsVisible == true ? Utils.ToInt(item2.ActualWidth) : -1, - Index = item2.DisplayIndex - }); - } - _config.UiItem.MainColumnItem = lvColumnItem; - } + private void StorageUI(string? n = null) + { + List lvColumnItem = new(); + for (int k = 0; k < lstProfiles.Columns.Count; k++) + { + var item2 = lstProfiles.Columns[k]; + if (item2.Tag == null) + { + continue; + } + lvColumnItem.Add(new() + { + Name = (string)item2.Tag, + Width = item2.IsVisible == true ? Utils.ToInt(item2.ActualWidth) : -1, + Index = item2.DisplayIndex + }); + } + _config.UiItem.MainColumnItem = lvColumnItem; + } - //#endregion UI + //#endregion UI - //#region Drag and Drop + //#region Drag and Drop - //private Point startPoint = new(); - //private int startIndex = -1; - //private string formatData = "ProfileItemModel"; + //private Point startPoint = new(); + //private int startIndex = -1; + //private string formatData = "ProfileItemModel"; - ///// - ///// Helper to search up the VisualTree - ///// - ///// - ///// - ///// - //private static T? FindAncestor(DependencyObject current) where T : DependencyObject - //{ - // do - // { - // if (current is T) - // { - // return (T)current; - // } - // current = VisualTreeHelper.GetParent(current); - // } - // while (current != null); - // return null; - //} + ///// + ///// Helper to search up the VisualTree + ///// + ///// + ///// + ///// + //private static T? FindAncestor(DependencyObject current) where T : DependencyObject + //{ + // do + // { + // if (current is T) + // { + // return (T)current; + // } + // current = VisualTreeHelper.GetParent(current); + // } + // while (current != null); + // return null; + //} - //private void LstProfiles_PreviewMouseLeftButtonDown(object? sender, MouseButtonEventArgs e) - //{ - // // Get current mouse position - // startPoint = e.GetPosition(null); - //} + //private void LstProfiles_PreviewMouseLeftButtonDown(object? sender, MouseButtonEventArgs e) + //{ + // // Get current mouse position + // startPoint = e.GetPosition(null); + //} - //private void LstProfiles_MouseMove(object? sender, MouseEventArgs e) - //{ - // // Get the current mouse position - // Point mousePos = e.GetPosition(null); - // Vector diff = startPoint - mousePos; + //private void LstProfiles_MouseMove(object? sender, MouseEventArgs e) + //{ + // // Get the current mouse position + // Point mousePos = e.GetPosition(null); + // Vector diff = startPoint - mousePos; - // if (e.LeftButton == MouseButtonState.Pressed && - // (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || - // Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) - // { - // // Get the dragged Item - // if (sender is not DataGrid listView) return; - // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); - // if (listViewItem == null) return; // Abort - // // Find the data behind the ListViewItem - // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); - // if (item == null) return; // Abort - // // Initialize the drag & drop operation - // startIndex = lstProfiles.SelectedIndex; - // DataObject dragData = new(formatData, item); - // DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); - // } - //} + // if (e.LeftButton == MouseButtonState.Pressed && + // (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || + // Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) + // { + // // Get the dragged Item + // if (sender is not DataGrid listView) return; + // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + // if (listViewItem == null) return; // Abort + // // Find the data behind the ListViewItem + // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + // if (item == null) return; // Abort + // // Initialize the drag & drop operation + // startIndex = lstProfiles.SelectedIndex; + // DataObject dragData = new(formatData, item); + // DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); + // } + //} - //private void LstProfiles_DragEnter(object? sender, DragEventArgs e) - //{ - // if (!e.Data.GetDataPresent(formatData) || sender != e.Source) - // { - // e.Effects = DragDropEffects.None; - // } - //} + //private void LstProfiles_DragEnter(object? sender, DragEventArgs e) + //{ + // if (!e.Data.GetDataPresent(formatData) || sender != e.Source) + // { + // e.Effects = DragDropEffects.None; + // } + //} - //private void LstProfiles_Drop(object? sender, DragEventArgs e) - //{ - // if (e.Data.GetDataPresent(formatData) && sender == e.Source) - // { - // // Get the drop Item destination - // if (sender is not DataGrid listView) return; - // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); - // if (listViewItem == null) - // { - // // Abort - // e.Effects = DragDropEffects.None; - // return; - // } - // // Find the data behind the Item - // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); - // if (item == null) return; - // // Move item into observable collection - // // (this will be automatically reflected to lstView.ItemsSource) - // e.Effects = DragDropEffects.Move; + //private void LstProfiles_Drop(object? sender, DragEventArgs e) + //{ + // if (e.Data.GetDataPresent(formatData) && sender == e.Source) + // { + // // Get the drop Item destination + // if (sender is not DataGrid listView) return; + // var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + // if (listViewItem == null) + // { + // // Abort + // e.Effects = DragDropEffects.None; + // return; + // } + // // Find the data behind the Item + // ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + // if (item == null) return; + // // Move item into observable collection + // // (this will be automatically reflected to lstView.ItemsSource) + // e.Effects = DragDropEffects.Move; - // ViewModel?.MoveServerTo(startIndex, item); + // ViewModel?.MoveServerTo(startIndex, item); - // startIndex = -1; - // } - //} + // startIndex = -1; + // } + //} - //#endregion Drag and Drop - } + //#endregion Drag and Drop + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml index d6a6f70f..cb3599ff 100644 --- a/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml @@ -1,26 +1,26 @@ - - - + + + - + - - \ No newline at end of file + + diff --git a/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml.cs index 93c0aaec..081d3044 100644 --- a/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/QrcodeView.axaml.cs @@ -3,35 +3,36 @@ using Avalonia.Media.Imaging; namespace v2rayN.Desktop.Views { - public partial class QrcodeView : UserControl - { - public QrcodeView() - { - InitializeComponent(); - } + public partial class QrcodeView : UserControl + { + public QrcodeView() + { + InitializeComponent(); + } - public QrcodeView(string? url) - { - InitializeComponent(); + public QrcodeView(string? url) + { + InitializeComponent(); - txtContent.Text = url; - imgQrcode.Source = GetQRCode(url); + txtContent.Text = url; + imgQrcode.Source = GetQRCode(url); - // btnCancel.Click += (s, e) => this.Close(); - } + // btnCancel.Click += (s, e) => this.Close(); + } - private Bitmap? GetQRCode(string? url) - { - var bytes = QRCodeHelper.GenQRCode(url); - return ByteToBitmap(bytes); - } + private Bitmap? GetQRCode(string? url) + { + var bytes = QRCodeHelper.GenQRCode(url); + return ByteToBitmap(bytes); + } - private Bitmap? ByteToBitmap(byte[]? bytes) - { - if (bytes is null) return null; + private Bitmap? ByteToBitmap(byte[]? bytes) + { + if (bytes is null) + return null; - using var ms = new MemoryStream(bytes); - return new Bitmap(ms); - } - } + using var ms = new MemoryStream(bytes); + return new Bitmap(ms); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml b/v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml index fa515eb6..8df8ed73 100644 --- a/v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/RoutingRuleDetailsWindow.axaml @@ -1,211 +1,211 @@ - - - - - - + + + + + + - - - + + + - - - - - - - + + + + + + + - - + + - - - + + + - - - - + + + + - - - - - - - + + + - + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + diff --git a/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml.cs index 3402ced2..8cd79ded 100644 --- a/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/SubEditWindow.axaml.cs @@ -6,61 +6,61 @@ using System.Reactive.Disposables; namespace v2rayN.Desktop.Views { - public partial class SubEditWindow : ReactiveWindow - { - public SubEditWindow() - { - InitializeComponent(); - } + public partial class SubEditWindow : ReactiveWindow + { + public SubEditWindow() + { + InitializeComponent(); + } - public SubEditWindow(SubItem subItem) - { - InitializeComponent(); + public SubEditWindow(SubItem subItem) + { + InitializeComponent(); - Loaded += Window_Loaded; - btnCancel.Click += (s, e) => this.Close(); + Loaded += Window_Loaded; + btnCancel.Click += (s, e) => this.Close(); - ViewModel = new SubEditViewModel(subItem, UpdateViewHandler); + ViewModel = new SubEditViewModel(subItem, UpdateViewHandler); - Global.SubConvertTargets.ForEach(it => - { - cmbConvertTarget.Items.Add(it); - }); + Global.SubConvertTargets.ForEach(it => + { + cmbConvertTarget.Items.Add(it); + }); - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.SelectedSource.Remarks, v => v.txtRemarks.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Url, v => v.txtUrl.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.MoreUrl, v => v.txtMoreUrl.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Enabled, v => v.togEnable.IsChecked).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.AutoUpdateInterval, v => v.txtAutoUpdateInterval.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.UserAgent, v => v.txtUserAgent.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Sort, v => v.txtSort.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Filter, v => v.txtFilter.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.ConvertTarget, v => v.cmbConvertTarget.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.PrevProfile, v => v.txtPrevProfile.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.NextProfile, v => v.txtNextProfile.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.PreSocksPort, v => v.txtPreSocksPort.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource.Memo, v => v.txtMemo.Text).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.SelectedSource.Remarks, v => v.txtRemarks.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Url, v => v.txtUrl.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.MoreUrl, v => v.txtMoreUrl.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Enabled, v => v.togEnable.IsChecked).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.AutoUpdateInterval, v => v.txtAutoUpdateInterval.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.UserAgent, v => v.txtUserAgent.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Sort, v => v.txtSort.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Filter, v => v.txtFilter.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.ConvertTarget, v => v.cmbConvertTarget.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.PrevProfile, v => v.txtPrevProfile.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.NextProfile, v => v.txtNextProfile.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.PreSocksPort, v => v.txtPreSocksPort.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Memo, v => v.txtMemo.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); - }); - } + this.BindCommand(ViewModel, vm => vm.SaveCmd, v => v.btnSave).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.CloseWindow: - this.Close(true); - break; - } - return await Task.FromResult(true); - } + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.CloseWindow: + this.Close(true); + break; + } + return await Task.FromResult(true); + } - private void Window_Loaded(object? sender, RoutedEventArgs e) - { - txtRemarks.Focus(); - } - } + private void Window_Loaded(object? sender, RoutedEventArgs e) + { + txtRemarks.Focus(); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml b/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml index fce4d7b4..2774f13f 100644 --- a/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml +++ b/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml @@ -1,77 +1,77 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml.cs index b37f5ac1..879a0e19 100644 --- a/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/SubSettingWindow.axaml.cs @@ -10,96 +10,98 @@ using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views { - public partial class SubSettingWindow : ReactiveWindow - { - private bool _manualClose = false; + public partial class SubSettingWindow : ReactiveWindow + { + private bool _manualClose = false; - public SubSettingWindow() - { - InitializeComponent(); + public SubSettingWindow() + { + InitializeComponent(); - menuClose.Click += menuClose_Click; - this.Closing += SubSettingWindow_Closing; - ViewModel = new SubSettingViewModel(UpdateViewHandler); - lstSubscription.DoubleTapped += LstSubscription_DoubleTapped; - lstSubscription.SelectionChanged += LstSubscription_SelectionChanged; + menuClose.Click += menuClose_Click; + this.Closing += SubSettingWindow_Closing; + ViewModel = new SubSettingViewModel(UpdateViewHandler); + lstSubscription.DoubleTapped += LstSubscription_DoubleTapped; + lstSubscription.SelectionChanged += LstSubscription_SelectionChanged; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstSubscription.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstSubscription.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstSubscription.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstSubscription.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubAddCmd, v => v.menuSubAdd).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubDeleteCmd, v => v.menuSubDelete).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubEditCmd, v => v.menuSubEdit).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubShareCmd, v => v.menuSubShare).DisposeWith(disposables); - }); - } + this.BindCommand(ViewModel, vm => vm.SubAddCmd, v => v.menuSubAdd).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubDeleteCmd, v => v.menuSubDelete).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubEditCmd, v => v.menuSubEdit).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubShareCmd, v => v.menuSubShare).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.CloseWindow: - this.Close(); - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.CloseWindow: + this.Close(); + break; - case EViewAction.ShowYesNo: - if (await UI.ShowYesNo(this, ResUI.RemoveServer) == ButtonResult.No) - { - return false; - } - break; + case EViewAction.ShowYesNo: + if (await UI.ShowYesNo(this, ResUI.RemoveServer) == ButtonResult.No) + { + return false; + } + break; - case EViewAction.SubEditWindow: - if (obj is null) return false; - var window = new SubEditWindow((SubItem)obj); - await window.ShowDialog(this); - break; + case EViewAction.SubEditWindow: + if (obj is null) + return false; + var window = new SubEditWindow((SubItem)obj); + await window.ShowDialog(this); + break; - case EViewAction.ShareSub: - if (obj is null) return false; - await ShareSub((string)obj); - break; - } - return await Task.FromResult(true); - } + case EViewAction.ShareSub: + if (obj is null) + return false; + await ShareSub((string)obj); + break; + } + return await Task.FromResult(true); + } - private async Task ShareSub(string url) - { - if (Utils.IsNullOrEmpty(url)) - { - return; - } - var dialog = new QrcodeView(url); - await DialogHost.Show(dialog, "dialogHostSub"); - } + private async Task ShareSub(string url) + { + if (Utils.IsNullOrEmpty(url)) + { + return; + } + var dialog = new QrcodeView(url); + await DialogHost.Show(dialog, "dialogHostSub"); + } - private void LstSubscription_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) - { - ViewModel?.EditSubAsync(false); - } + private void LstSubscription_DoubleTapped(object? sender, Avalonia.Input.TappedEventArgs e) + { + ViewModel?.EditSubAsync(false); + } - private void LstSubscription_SelectionChanged(object? sender, SelectionChangedEventArgs e) - { - ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast().ToList(); - } + private void LstSubscription_SelectionChanged(object? sender, SelectionChangedEventArgs e) + { + ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast().ToList(); + } - private void menuClose_Click(object? sender, RoutedEventArgs e) - { - _manualClose = true; - this.Close(ViewModel?.IsModified); - } + private void menuClose_Click(object? sender, RoutedEventArgs e) + { + _manualClose = true; + this.Close(ViewModel?.IsModified); + } - private void SubSettingWindow_Closing(object? sender, WindowClosingEventArgs e) - { - if (ViewModel?.IsModified == true) - { - if (!_manualClose) - { - menuClose_Click(null, null); - } - } - } - } + private void SubSettingWindow_Closing(object? sender, WindowClosingEventArgs e) + { + if (ViewModel?.IsModified == true) + { + if (!_manualClose) + { + menuClose_Click(null, null); + } + } + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml index 08727d33..9b078982 100644 --- a/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml +++ b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml @@ -1,71 +1,71 @@ - - - - - + + + + + - - \ No newline at end of file + + diff --git a/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs index 601b0958..0e4648bf 100644 --- a/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/ThemeSettingView.axaml.cs @@ -6,37 +6,37 @@ using v2rayN.Desktop.ViewModels; namespace v2rayN.Desktop.Views { - /// - /// ThemeSettingView.xaml - /// - public partial class ThemeSettingView : ReactiveUserControl - { - public ThemeSettingView() - { - InitializeComponent(); - ViewModel = new ThemeSettingViewModel(); + /// + /// ThemeSettingView.xaml + /// + public partial class ThemeSettingView : ReactiveUserControl + { + public ThemeSettingView() + { + InitializeComponent(); + ViewModel = new ThemeSettingViewModel(); - foreach (ETheme it in Enum.GetValues(typeof(ETheme))) - { - cmbCurrentTheme.Items.Add(it.ToString()); - } + foreach (ETheme it in Enum.GetValues(typeof(ETheme))) + { + cmbCurrentTheme.Items.Add(it.ToString()); + } - for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++) - { - cmbCurrentFontSize.Items.Add(i); - } + for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++) + { + cmbCurrentFontSize.Items.Add(i); + } - Global.Languages.ForEach(it => - { - cmbCurrentLanguage.Items.Add(it); - }); + Global.Languages.ForEach(it => + { + cmbCurrentLanguage.Items.Add(it); + }); - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.CurrentTheme, v => v.cmbCurrentTheme.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.SelectedValue).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.SelectedValue).DisposeWith(disposables); - }); - } - } + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.CurrentTheme, v => v.cmbCurrentTheme.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.SelectedValue).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.SelectedValue).DisposeWith(disposables); + }); + } + } } \ No newline at end of file diff --git a/v2rayN/v2rayN/App.xaml b/v2rayN/v2rayN/App.xaml index b22ea83b..49a31268 100644 --- a/v2rayN/v2rayN/App.xaml +++ b/v2rayN/v2rayN/App.xaml @@ -1,4 +1,4 @@ - - \ No newline at end of file + diff --git a/v2rayN/v2rayN/App.xaml.cs b/v2rayN/v2rayN/App.xaml.cs index 42c086fc..4493e2a9 100644 --- a/v2rayN/v2rayN/App.xaml.cs +++ b/v2rayN/v2rayN/App.xaml.cs @@ -4,73 +4,73 @@ using System.Windows.Threading; namespace v2rayN { - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application - { - public static EventWaitHandle ProgramStarted; - private static Config _config; + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application + { + public static EventWaitHandle ProgramStarted; + private static Config _config; - public App() - { - this.DispatcherUnhandledException += App_DispatcherUnhandledException; - AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; - } + public App() + { + this.DispatcherUnhandledException += App_DispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException; + } - /// - /// 只打开一个进程 - /// - /// - protected override void OnStartup(StartupEventArgs e) - { - var exePathKey = Utils.GetMd5(Utils.GetExePath()); + /// + /// 只打开一个进程 + /// + /// + protected override void OnStartup(StartupEventArgs e) + { + var exePathKey = Utils.GetMd5(Utils.GetExePath()); - var rebootas = (e.Args ?? Array.Empty()).Any(t => t == Global.RebootAs); - ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); - if (!rebootas && !bCreatedNew) - { - ProgramStarted.Set(); - Environment.Exit(0); - return; - } + var rebootas = (e.Args ?? Array.Empty()).Any(t => t == Global.RebootAs); + ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); + if (!rebootas && !bCreatedNew) + { + ProgramStarted.Set(); + Environment.Exit(0); + return; + } - if (!AppHandler.Instance.InitApp()) - { - UI.Show($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用"); - Environment.Exit(0); - return; - } + if (!AppHandler.Instance.InitApp()) + { + UI.Show($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用"); + Environment.Exit(0); + return; + } - AppHandler.Instance.InitComponents(); - base.OnStartup(e); - } + AppHandler.Instance.InitComponents(); + base.OnStartup(e); + } - private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) - { - Logging.SaveLog("App_DispatcherUnhandledException", e.Exception); - e.Handled = true; - } + private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + Logging.SaveLog("App_DispatcherUnhandledException", e.Exception); + e.Handled = true; + } - private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) - { - if (e.ExceptionObject != null) - { - Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!); - } - } + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (e.ExceptionObject != null) + { + Logging.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!); + } + } - private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) - { - Logging.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception); - } + private void TaskScheduler_UnobservedTaskException(object? sender, UnobservedTaskExceptionEventArgs e) + { + Logging.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception); + } - protected override void OnExit(ExitEventArgs e) - { - Logging.SaveLog("OnExit"); - base.OnExit(e); - Process.GetCurrentProcess().Kill(); - } - } -} \ No newline at end of file + protected override void OnExit(ExitEventArgs e) + { + Logging.SaveLog("OnExit"); + base.OnExit(e); + Process.GetCurrentProcess().Kill(); + } + } +} diff --git a/v2rayN/v2rayN/AssemblyInfo.cs b/v2rayN/v2rayN/AssemblyInfo.cs index 4f943deb..427f2025 100644 --- a/v2rayN/v2rayN/AssemblyInfo.cs +++ b/v2rayN/v2rayN/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Windows; [assembly: ThemeInfo( - ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located - //(used if a resource is not found in the page, - // or application resource dictionaries) - ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located - //(used if a resource is not found in the page, - // app, or any theme specific resource dictionaries) -)] \ No newline at end of file + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/v2rayN/v2rayN/Base/MyDGTextColumn.cs b/v2rayN/v2rayN/Base/MyDGTextColumn.cs index 427ffacc..60f0a585 100644 --- a/v2rayN/v2rayN/Base/MyDGTextColumn.cs +++ b/v2rayN/v2rayN/Base/MyDGTextColumn.cs @@ -1,9 +1,9 @@ -using System.Windows.Controls; +using System.Windows.Controls; namespace v2rayN.Base { - internal class MyDGTextColumn : DataGridTextColumn - { - public string ExName { get; set; } - } -} \ No newline at end of file + internal class MyDGTextColumn : DataGridTextColumn + { + public string ExName { get; set; } + } +} diff --git a/v2rayN/v2rayN/Common/QRCodeHelper.cs b/v2rayN/v2rayN/Common/QRCodeHelper.cs index 2791c521..1bf1d3cc 100644 --- a/v2rayN/v2rayN/Common/QRCodeHelper.cs +++ b/v2rayN/v2rayN/Common/QRCodeHelper.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Drawing; using System.Windows; using System.Windows.Interop; @@ -7,66 +7,66 @@ using System.Windows.Media.Imaging; namespace v2rayN { - public class QRCodeHelper - { - public static ImageSource? GetQRCode(string? strContent) - { - if (strContent is null) - { - return null; - } - try - { - var qrCodeImage = ServiceLib.Common.QRCodeHelper.GenQRCode(strContent); - return qrCodeImage is null ? null : ByteToImage(qrCodeImage); - } - catch - { - return null; - } - } + public class QRCodeHelper + { + public static ImageSource? GetQRCode(string? strContent) + { + if (strContent is null) + { + return null; + } + try + { + var qrCodeImage = ServiceLib.Common.QRCodeHelper.GenQRCode(strContent); + return qrCodeImage is null ? null : ByteToImage(qrCodeImage); + } + catch + { + return null; + } + } - public static byte[]? CaptureScreen(Window window) - { - try - { - GetDpi(window, out var dpiX, out var dpiY); + public static byte[]? CaptureScreen(Window window) + { + try + { + GetDpi(window, out var dpiX, out var dpiY); - var left = (int)(SystemParameters.WorkArea.Left); - var top = (int)(SystemParameters.WorkArea.Top); - var width = (int)(SystemParameters.WorkArea.Width / dpiX); - var height = (int)(SystemParameters.WorkArea.Height / dpiY); + var left = (int)SystemParameters.WorkArea.Left; + var top = (int)SystemParameters.WorkArea.Top; + var width = (int)(SystemParameters.WorkArea.Width / dpiX); + var height = (int)(SystemParameters.WorkArea.Height / dpiY); - using var fullImage = new Bitmap(width, height); - using var g = Graphics.FromImage(fullImage); + using var fullImage = new Bitmap(width, height); + using var g = Graphics.FromImage(fullImage); - g.CopyFromScreen(left, top, 0, 0, fullImage.Size, CopyPixelOperation.SourceCopy); - //fullImage.Save("test1.png", ImageFormat.Png); - return ImageToByte(fullImage); - } - catch - { - return null; - } - } + g.CopyFromScreen(left, top, 0, 0, fullImage.Size, CopyPixelOperation.SourceCopy); + //fullImage.Save("test1.png", ImageFormat.Png); + return ImageToByte(fullImage); + } + catch + { + return null; + } + } - private static void GetDpi(Window window, out float x, out float y) - { - var hWnd = new WindowInteropHelper(window).EnsureHandle(); - var g = Graphics.FromHwnd(hWnd); + private static void GetDpi(Window window, out float x, out float y) + { + var hWnd = new WindowInteropHelper(window).EnsureHandle(); + var g = Graphics.FromHwnd(hWnd); - x = 96 / g.DpiX; - y = 96 / g.DpiY; - } + x = 96 / g.DpiX; + y = 96 / g.DpiY; + } - private static ImageSource? ByteToImage(IEnumerable imageData) - { - return new ImageSourceConverter().ConvertFrom(imageData) as BitmapSource; - } + private static ImageSource? ByteToImage(IEnumerable imageData) + { + return new ImageSourceConverter().ConvertFrom(imageData) as BitmapSource; + } - private static byte[]? ImageToByte(Image img) - { - return new ImageConverter().ConvertTo(img, typeof(byte[])) as byte[]; - } - } -} \ No newline at end of file + private static byte[]? ImageToByte(Image img) + { + return new ImageConverter().ConvertTo(img, typeof(byte[])) as byte[]; + } + } +} diff --git a/v2rayN/v2rayN/Common/UI.cs b/v2rayN/v2rayN/Common/UI.cs index 29caed22..b04bbe72 100644 --- a/v2rayN/v2rayN/Common/UI.cs +++ b/v2rayN/v2rayN/Common/UI.cs @@ -1,59 +1,59 @@ -using Microsoft.Win32; using System.Windows; +using Microsoft.Win32; namespace v2rayN { - internal class UI - { - private static readonly string caption = Global.AppName; + internal class UI + { + private static readonly string caption = Global.AppName; - public static void Show(string msg) - { - MessageBox.Show(msg, caption, MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK); - } + public static void Show(string msg) + { + MessageBox.Show(msg, caption, MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK); + } - public static MessageBoxResult ShowYesNo(string msg) - { - return MessageBox.Show(msg, caption, MessageBoxButton.YesNo, MessageBoxImage.Question); - } + public static MessageBoxResult ShowYesNo(string msg) + { + return MessageBox.Show(msg, caption, MessageBoxButton.YesNo, MessageBoxImage.Question); + } - public static bool? OpenFileDialog(out string fileName, string filter) - { - fileName = string.Empty; + public static bool? OpenFileDialog(out string fileName, string filter) + { + fileName = string.Empty; - var fileDialog = new OpenFileDialog - { - Multiselect = false, - Filter = filter - }; + var fileDialog = new OpenFileDialog + { + Multiselect = false, + Filter = filter + }; - if (fileDialog.ShowDialog() != true) - { - return false; - } - fileName = fileDialog.FileName; + if (fileDialog.ShowDialog() != true) + { + return false; + } + fileName = fileDialog.FileName; - return true; - } + return true; + } - public static bool? SaveFileDialog(out string fileName, string filter) - { - fileName = string.Empty; + public static bool? SaveFileDialog(out string fileName, string filter) + { + fileName = string.Empty; - SaveFileDialog fileDialog = new() - { - Filter = filter, - FilterIndex = 2, - RestoreDirectory = true - }; - if (fileDialog.ShowDialog() != true) - { - return false; - } + SaveFileDialog fileDialog = new() + { + Filter = filter, + FilterIndex = 2, + RestoreDirectory = true + }; + if (fileDialog.ShowDialog() != true) + { + return false; + } - fileName = fileDialog.FileName; + fileName = fileDialog.FileName; - return true; - } - } -} \ No newline at end of file + return true; + } + } +} diff --git a/v2rayN/v2rayN/Common/WindowsUtils.cs b/v2rayN/v2rayN/Common/WindowsUtils.cs index 6a0792d8..196d59ed 100644 --- a/v2rayN/v2rayN/Common/WindowsUtils.cs +++ b/v2rayN/v2rayN/Common/WindowsUtils.cs @@ -1,4 +1,3 @@ -using Microsoft.Win32; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; @@ -8,132 +7,133 @@ using System.Windows; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; +using Microsoft.Win32; namespace v2rayN { - internal static class WindowsUtils - { - private static readonly string _tag = "WindowsUtils"; + internal static class WindowsUtils + { + private static readonly string _tag = "WindowsUtils"; - /// - /// 获取剪贴板数 - /// - /// - public static string? GetClipboardData() - { - string? strData = string.Empty; - try - { - IDataObject data = Clipboard.GetDataObject(); - if (data.GetDataPresent(DataFormats.UnicodeText)) - { - strData = data.GetData(DataFormats.UnicodeText)?.ToString(); - } - return strData; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - } - return strData; - } + /// + /// 获取剪贴板数 + /// + /// + public static string? GetClipboardData() + { + var strData = string.Empty; + try + { + IDataObject data = Clipboard.GetDataObject(); + if (data.GetDataPresent(DataFormats.UnicodeText)) + { + strData = data.GetData(DataFormats.UnicodeText)?.ToString(); + } + return strData; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + } + return strData; + } - /// - /// 拷贝至剪贴板 - /// - /// - public static void SetClipboardData(string strData) - { - try - { - Clipboard.SetText(strData); - } - catch - { - } - } + /// + /// 拷贝至剪贴板 + /// + /// + public static void SetClipboardData(string strData) + { + try + { + Clipboard.SetText(strData); + } + catch + { + } + } - [DllImport("dwmapi.dll")] - public static extern int DwmSetWindowAttribute(IntPtr hwnd, DWMWINDOWATTRIBUTE attribute, ref int attributeValue, uint attributeSize); + [DllImport("dwmapi.dll")] + public static extern int DwmSetWindowAttribute(nint hwnd, DWMWINDOWATTRIBUTE attribute, ref int attributeValue, uint attributeSize); - public static ImageSource IconToImageSource(Icon icon) - { - return Imaging.CreateBitmapSourceFromHIcon( - icon.Handle, - new System.Windows.Int32Rect(0, 0, icon.Width, icon.Height), - BitmapSizeOptions.FromEmptyOptions()); - } + public static ImageSource IconToImageSource(Icon icon) + { + return Imaging.CreateBitmapSourceFromHIcon( + icon.Handle, + new Int32Rect(0, 0, icon.Width, icon.Height), + BitmapSizeOptions.FromEmptyOptions()); + } - public static void RemoveTunDevice() - { - try - { - var sum = MD5.HashData(Encoding.UTF8.GetBytes("wintunsingbox_tun")); - var guid = new Guid(sum); - string pnputilPath = @"C:\Windows\System32\pnputil.exe"; - string arg = $$""" /remove-device "SWD\Wintun\{{{guid}}}" """; + public static void RemoveTunDevice() + { + try + { + var sum = MD5.HashData(Encoding.UTF8.GetBytes("wintunsingbox_tun")); + var guid = new Guid(sum); + var pnputilPath = @"C:\Windows\System32\pnputil.exe"; + var arg = $$""" /remove-device "SWD\Wintun\{{{guid}}}" """; - // Try to remove the device - Process proc = new() - { - StartInfo = new() - { - FileName = pnputilPath, - Arguments = arg, - RedirectStandardOutput = true, - UseShellExecute = false, - CreateNoWindow = true - } - }; + // Try to remove the device + Process proc = new() + { + StartInfo = new() + { + FileName = pnputilPath, + Arguments = arg, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + } + }; - proc.Start(); - var output = proc.StandardOutput.ReadToEnd(); - proc.WaitForExit(); - } - catch - { - } - } + proc.Start(); + var output = proc.StandardOutput.ReadToEnd(); + proc.WaitForExit(); + } + catch + { + } + } - public static void SetDarkBorder(Window window, string? theme) - { - var isDark = theme switch - { - nameof(ETheme.Dark) => true, - nameof(ETheme.Light) => false, - _ => IsDarkTheme(), - }; + public static void SetDarkBorder(Window window, string? theme) + { + var isDark = theme switch + { + nameof(ETheme.Dark) => true, + nameof(ETheme.Light) => false, + _ => IsDarkTheme(), + }; - SetDarkBorder(window, isDark); - } + SetDarkBorder(window, isDark); + } - private static void SetDarkBorder(Window window, bool dark) - { - // Make sure the handle is created before the window is shown - IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle(); - int attribute = dark ? 1 : 0; - uint attributeSize = (uint)Marshal.SizeOf(attribute); - DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref attribute, attributeSize); - DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, attributeSize); - } + private static void SetDarkBorder(Window window, bool dark) + { + // Make sure the handle is created before the window is shown + var hWnd = new WindowInteropHelper(window).EnsureHandle(); + var attribute = dark ? 1 : 0; + var attributeSize = (uint)Marshal.SizeOf(attribute); + DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref attribute, attributeSize); + DwmSetWindowAttribute(hWnd, DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, attributeSize); + } - private static bool IsDarkTheme() - { - using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); - var obj = key?.GetValue("AppsUseLightTheme"); - int.TryParse(obj?.ToString(), out var value); - return value == 0; - } + private static bool IsDarkTheme() + { + using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); + var obj = key?.GetValue("AppsUseLightTheme"); + int.TryParse(obj?.ToString(), out var value); + return value == 0; + } - #region Windows API + #region Windows API - [Flags] - public enum DWMWINDOWATTRIBUTE : uint - { - DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19, - DWMWA_USE_IMMERSIVE_DARK_MODE = 20, - } + [Flags] + public enum DWMWINDOWATTRIBUTE : uint + { + DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19, + DWMWA_USE_IMMERSIVE_DARK_MODE = 20, + } - #endregion Windows API - } -} \ No newline at end of file + #endregion Windows API + } +} diff --git a/v2rayN/v2rayN/Converters/DelayColorConverter.cs b/v2rayN/v2rayN/Converters/DelayColorConverter.cs index d65c67da..acb71ea2 100644 --- a/v2rayN/v2rayN/Converters/DelayColorConverter.cs +++ b/v2rayN/v2rayN/Converters/DelayColorConverter.cs @@ -1,25 +1,25 @@ -using System.Windows.Data; +using System.Windows.Data; using System.Windows.Media; namespace v2rayN.Converters { - public class DelayColorConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) - { - int.TryParse(value.ToString(), out var delay); + public class DelayColorConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + int.TryParse(value.ToString(), out var delay); - if (delay <= 0) - return new SolidColorBrush(Colors.Red); - if (delay <= 500) - return new SolidColorBrush(Colors.Green); - else - return new SolidColorBrush(Colors.IndianRed); - } + if (delay <= 0) + return new SolidColorBrush(Colors.Red); + if (delay <= 500) + return new SolidColorBrush(Colors.Green); + else + return new SolidColorBrush(Colors.IndianRed); + } - public object? ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) - { - return null; - } - } -} \ No newline at end of file + public object? ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + return null; + } + } +} diff --git a/v2rayN/v2rayN/Converters/InverseBooleanConverter.cs b/v2rayN/v2rayN/Converters/InverseBooleanConverter.cs index d5809a37..7833e437 100644 --- a/v2rayN/v2rayN/Converters/InverseBooleanConverter.cs +++ b/v2rayN/v2rayN/Converters/InverseBooleanConverter.cs @@ -1,24 +1,24 @@ -using System.Globalization; +using System.Globalization; using System.Windows.Data; namespace v2rayN.Converters { - [ValueConversion(typeof(bool), typeof(bool))] - public class InverseBooleanConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (targetType != typeof(bool)) - { - throw new InvalidOperationException("The target must be a boolean"); - } + [ValueConversion(typeof(bool), typeof(bool))] + public class InverseBooleanConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (targetType != typeof(bool)) + { + throw new InvalidOperationException("The target must be a boolean"); + } - return !(bool)value; - } + return !(bool)value; + } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/v2rayN/v2rayN/Converters/MaterialDesignFonts.cs b/v2rayN/v2rayN/Converters/MaterialDesignFonts.cs index 20d9d5b5..6c13fef8 100644 --- a/v2rayN/v2rayN/Converters/MaterialDesignFonts.cs +++ b/v2rayN/v2rayN/Converters/MaterialDesignFonts.cs @@ -1,26 +1,26 @@ -using System.Windows.Media; +using System.Windows.Media; namespace v2rayN.Converters { - public class MaterialDesignFonts - { - public static FontFamily MyFont { get; } + public class MaterialDesignFonts + { + public static FontFamily MyFont { get; } - static MaterialDesignFonts() - { - try - { - var fontFamily = AppHandler.Instance.Config.UiItem.CurrentFontFamily; - if (Utils.IsNotEmpty(fontFamily)) - { - var fontPath = Utils.GetFontsPath(); - MyFont = new FontFamily(new Uri(@$"file:///{fontPath}\"), $"./#{fontFamily}"); - } - } - catch - { - } - MyFont ??= new FontFamily("Microsoft YaHei"); - } - } -} \ No newline at end of file + static MaterialDesignFonts() + { + try + { + var fontFamily = AppHandler.Instance.Config.UiItem.CurrentFontFamily; + if (Utils.IsNotEmpty(fontFamily)) + { + var fontPath = Utils.GetFontsPath(); + MyFont = new FontFamily(new Uri(@$"file:///{fontPath}\"), $"./#{fontFamily}"); + } + } + catch + { + } + MyFont ??= new FontFamily("Microsoft YaHei"); + } + } +} diff --git a/v2rayN/v2rayN/FodyWeavers.xml b/v2rayN/v2rayN/FodyWeavers.xml index 63fc1484..af4b7300 100644 --- a/v2rayN/v2rayN/FodyWeavers.xml +++ b/v2rayN/v2rayN/FodyWeavers.xml @@ -1,3 +1,3 @@ - - - \ No newline at end of file + + + diff --git a/v2rayN/v2rayN/GlobalUsings.cs b/v2rayN/v2rayN/GlobalUsings.cs index bc789ab0..16f7a7b7 100644 --- a/v2rayN/v2rayN/GlobalUsings.cs +++ b/v2rayN/v2rayN/GlobalUsings.cs @@ -1,8 +1,8 @@ -global using ServiceLib; +global using ServiceLib; global using ServiceLib.Base; global using ServiceLib.Common; global using ServiceLib.Enums; global using ServiceLib.Handler; global using ServiceLib.Models; global using ServiceLib.Resx; -global using ServiceLib.ViewModels; \ No newline at end of file +global using ServiceLib.ViewModels; diff --git a/v2rayN/v2rayN/Handler/HotkeyHandler.cs b/v2rayN/v2rayN/Handler/HotkeyHandler.cs index 3ae7ddf5..d9514370 100644 --- a/v2rayN/v2rayN/Handler/HotkeyHandler.cs +++ b/v2rayN/v2rayN/Handler/HotkeyHandler.cs @@ -1,4 +1,4 @@ -using System.ComponentModel; +using System.ComponentModel; using System.Runtime.InteropServices; using System.Text; using System.Windows; @@ -7,172 +7,179 @@ using System.Windows.Interop; namespace v2rayN.Handler { - public sealed class HotkeyHandler - { - private static readonly Lazy _instance = new(() => new()); - public static HotkeyHandler Instance = _instance.Value; + public sealed class HotkeyHandler + { + private static readonly Lazy _instance = new(() => new()); + public static HotkeyHandler Instance = _instance.Value; - private const int WmHotkey = 0x0312; + private const int WmHotkey = 0x0312; - private Config _config - { - get => AppHandler.Instance.Config; - } + private Config _config + { + get => AppHandler.Instance.Config; + } - private Dictionary> _hotkeyTriggerDic; + private Dictionary> _hotkeyTriggerDic; - public bool IsPause { get; set; } = false; + public bool IsPause { get; set; } = false; - public event Action? UpdateViewEvent; + public event Action? UpdateViewEvent; - public event Action? HotkeyTriggerEvent; + public event Action? HotkeyTriggerEvent; - public HotkeyHandler() - { - _hotkeyTriggerDic = new(); - ComponentDispatcher.ThreadPreprocessMessage += OnThreadPreProcessMessage; - Init(); - } + public HotkeyHandler() + { + _hotkeyTriggerDic = new(); + ComponentDispatcher.ThreadPreprocessMessage += OnThreadPreProcessMessage; + Init(); + } - private void Init() - { - _hotkeyTriggerDic.Clear(); - if (_config.GlobalHotkeys == null) return; - foreach (var item in _config.GlobalHotkeys) - { - if (item.KeyCode != null && (Key)item.KeyCode != Key.None) - { - int key = KeyInterop.VirtualKeyFromKey((Key)item.KeyCode); - KeyModifiers modifiers = KeyModifiers.None; - if (item.Control) modifiers |= KeyModifiers.Ctrl; - if (item.Shift) modifiers |= KeyModifiers.Shift; - if (item.Alt) modifiers |= KeyModifiers.Alt; - key = (key << 16) | (int)modifiers; - if (!_hotkeyTriggerDic.ContainsKey(key)) - { - _hotkeyTriggerDic.Add(key, new() { item.EGlobalHotkey }); - } - else - { - if (!_hotkeyTriggerDic[key].Contains(item.EGlobalHotkey)) - _hotkeyTriggerDic[key].Add(item.EGlobalHotkey); - } - } - } - } + private void Init() + { + _hotkeyTriggerDic.Clear(); + if (_config.GlobalHotkeys == null) + return; + foreach (var item in _config.GlobalHotkeys) + { + if (item.KeyCode != null && (Key)item.KeyCode != Key.None) + { + int key = KeyInterop.VirtualKeyFromKey((Key)item.KeyCode); + KeyModifiers modifiers = KeyModifiers.None; + if (item.Control) + modifiers |= KeyModifiers.Ctrl; + if (item.Shift) + modifiers |= KeyModifiers.Shift; + if (item.Alt) + modifiers |= KeyModifiers.Alt; + key = (key << 16) | (int)modifiers; + if (!_hotkeyTriggerDic.ContainsKey(key)) + { + _hotkeyTriggerDic.Add(key, new() { item.EGlobalHotkey }); + } + else + { + if (!_hotkeyTriggerDic[key].Contains(item.EGlobalHotkey)) + _hotkeyTriggerDic[key].Add(item.EGlobalHotkey); + } + } + } + } - public void Load() - { - foreach (var _hotkeyCode in _hotkeyTriggerDic.Keys) - { - var hotkeyInfo = GetHotkeyInfo(_hotkeyCode); - bool isSuccess = false; - string msg; + public void Load() + { + foreach (var _hotkeyCode in _hotkeyTriggerDic.Keys) + { + var hotkeyInfo = GetHotkeyInfo(_hotkeyCode); + bool isSuccess = false; + string msg; - Application.Current?.Dispatcher.Invoke(() => - { - isSuccess = RegisterHotKey(IntPtr.Zero, _hotkeyCode, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); - }); - foreach (var name in hotkeyInfo.Names) - { - if (isSuccess) - { - msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{name}({hotkeyInfo.hotkeyStr})"); - } - else - { - var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; - msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{name}({hotkeyInfo.hotkeyStr})", errInfo); - } - UpdateViewEvent?.Invoke(false, msg); - } - } - } + Application.Current?.Dispatcher.Invoke(() => + { + isSuccess = RegisterHotKey(IntPtr.Zero, _hotkeyCode, hotkeyInfo.fsModifiers, hotkeyInfo.vKey); + }); + foreach (var name in hotkeyInfo.Names) + { + if (isSuccess) + { + msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{name}({hotkeyInfo.hotkeyStr})"); + } + else + { + var errInfo = new Win32Exception(Marshal.GetLastWin32Error()).Message; + msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{name}({hotkeyInfo.hotkeyStr})", errInfo); + } + UpdateViewEvent?.Invoke(false, msg); + } + } + } - public void ReLoad() - { - foreach (var hotkey in _hotkeyTriggerDic.Keys) - { - Application.Current?.Dispatcher.Invoke(() => - { - UnregisterHotKey(IntPtr.Zero, hotkey); - }); - } - Init(); - Load(); - } + public void ReLoad() + { + foreach (var hotkey in _hotkeyTriggerDic.Keys) + { + Application.Current?.Dispatcher.Invoke(() => + { + UnregisterHotKey(IntPtr.Zero, hotkey); + }); + } + Init(); + Load(); + } - private (int fsModifiers, int vKey, string hotkeyStr, List Names) GetHotkeyInfo(int hotkeycode) - { - var _fsModifiers = hotkeycode & 0xffff; - var _vkey = (hotkeycode >> 16) & 0xffff; - var _hotkeyStr = new StringBuilder(); - var _names = new List(); + private (int fsModifiers, int vKey, string hotkeyStr, List Names) GetHotkeyInfo(int hotkeycode) + { + var _fsModifiers = hotkeycode & 0xffff; + var _vkey = (hotkeycode >> 16) & 0xffff; + var _hotkeyStr = new StringBuilder(); + var _names = new List(); - var mdif = (KeyModifiers)_fsModifiers; - var key = KeyInterop.KeyFromVirtualKey(_vkey); - if ((mdif & KeyModifiers.Ctrl) == KeyModifiers.Ctrl) _hotkeyStr.Append($"{KeyModifiers.Ctrl}+"); - if ((mdif & KeyModifiers.Alt) == KeyModifiers.Alt) _hotkeyStr.Append($"{KeyModifiers.Alt}+"); - if ((mdif & KeyModifiers.Shift) == KeyModifiers.Shift) _hotkeyStr.Append($"{KeyModifiers.Shift}+"); - _hotkeyStr.Append(key.ToString()); + var mdif = (KeyModifiers)_fsModifiers; + var key = KeyInterop.KeyFromVirtualKey(_vkey); + if ((mdif & KeyModifiers.Ctrl) == KeyModifiers.Ctrl) + _hotkeyStr.Append($"{KeyModifiers.Ctrl}+"); + if ((mdif & KeyModifiers.Alt) == KeyModifiers.Alt) + _hotkeyStr.Append($"{KeyModifiers.Alt}+"); + if ((mdif & KeyModifiers.Shift) == KeyModifiers.Shift) + _hotkeyStr.Append($"{KeyModifiers.Shift}+"); + _hotkeyStr.Append(key.ToString()); - foreach (var name in _hotkeyTriggerDic[hotkeycode]) - { - _names.Add(name.ToString()); - } + foreach (var name in _hotkeyTriggerDic[hotkeycode]) + { + _names.Add(name.ToString()); + } - return (_fsModifiers, _vkey, _hotkeyStr.ToString(), _names); - } + return (_fsModifiers, _vkey, _hotkeyStr.ToString(), _names); + } - private void OnThreadPreProcessMessage(ref MSG msg, ref bool handled) - { - if (msg.message != WmHotkey || !_hotkeyTriggerDic.ContainsKey((int)msg.lParam)) - { - return; - } - handled = true; - var _hotKeyCode = (int)msg.lParam; - if (IsPause) - { - Application.Current?.Dispatcher.Invoke(() => - { - UIElement? element = Keyboard.FocusedElement as UIElement; - if (element != null) - { - var _keyEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, - PresentationSource.FromVisual(element), 0, - KeyInterop.KeyFromVirtualKey(GetHotkeyInfo(_hotKeyCode).vKey)) - { - RoutedEvent = UIElement.KeyDownEvent - }; - element.RaiseEvent(_keyEventArgs); - } - }); - } - else - { - foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) - { - HotkeyTriggerEvent?.Invoke(keyEvent); - } - } - } + private void OnThreadPreProcessMessage(ref MSG msg, ref bool handled) + { + if (msg.message != WmHotkey || !_hotkeyTriggerDic.ContainsKey((int)msg.lParam)) + { + return; + } + handled = true; + var _hotKeyCode = (int)msg.lParam; + if (IsPause) + { + Application.Current?.Dispatcher.Invoke(() => + { + UIElement? element = Keyboard.FocusedElement as UIElement; + if (element != null) + { + var _keyEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, + PresentationSource.FromVisual(element), 0, + KeyInterop.KeyFromVirtualKey(GetHotkeyInfo(_hotKeyCode).vKey)) + { + RoutedEvent = UIElement.KeyDownEvent + }; + element.RaiseEvent(_keyEventArgs); + } + }); + } + else + { + foreach (var keyEvent in _hotkeyTriggerDic[(int)msg.lParam]) + { + HotkeyTriggerEvent?.Invoke(keyEvent); + } + } + } - [DllImport("user32.dll", SetLastError = true)] - private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); + [DllImport("user32.dll", SetLastError = true)] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); - [DllImport("user32.dll", SetLastError = true)] - private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + [DllImport("user32.dll", SetLastError = true)] + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); - [Flags] - private enum KeyModifiers - { - None = 0x0000, - Alt = 0x0001, - Ctrl = 0x0002, - Shift = 0x0004, - Win = 0x0008, - NoRepeat = 0x4000 - } - } -} \ No newline at end of file + [Flags] + private enum KeyModifiers + { + None = 0x0000, + Alt = 0x0001, + Ctrl = 0x0002, + Shift = 0x0004, + Win = 0x0008, + NoRepeat = 0x4000 + } + } +} diff --git a/v2rayN/v2rayN/Handler/WindowsHandler.cs b/v2rayN/v2rayN/Handler/WindowsHandler.cs index 95404085..785eff73 100644 --- a/v2rayN/v2rayN/Handler/WindowsHandler.cs +++ b/v2rayN/v2rayN/Handler/WindowsHandler.cs @@ -1,105 +1,105 @@ -using System.Drawing; +using System.Drawing; using System.IO; using System.Windows.Media.Imaging; namespace v2rayN.Handler { - public sealed class WindowsHandler - { - private static readonly Lazy instance = new(() => new()); - public static WindowsHandler Instance => instance.Value; - private static readonly string _tag = "WindowsHandler"; + public sealed class WindowsHandler + { + private static readonly Lazy instance = new(() => new()); + public static WindowsHandler Instance => instance.Value; + private static readonly string _tag = "WindowsHandler"; - public async Task GetNotifyIcon(Config config) - { - try - { - var index = (int)config.SystemProxyItem.SysProxyType; + public async Task GetNotifyIcon(Config config) + { + try + { + var index = (int)config.SystemProxyItem.SysProxyType; - //Load from routing setting - var createdIcon = await GetNotifyIcon4Routing(config); - if (createdIcon != null) - { - return createdIcon; - } + //Load from routing setting + var createdIcon = await GetNotifyIcon4Routing(config); + if (createdIcon != null) + { + return createdIcon; + } - //Load from local file - var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico"); - if (File.Exists(fileName)) - { - return new Icon(fileName); - } - return index switch - { - 0 => Properties.Resources.NotifyIcon1, - 1 => Properties.Resources.NotifyIcon2, - 2 => Properties.Resources.NotifyIcon3, - 3 => Properties.Resources.NotifyIcon4, - _ => Properties.Resources.NotifyIcon1, // default - }; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return Properties.Resources.NotifyIcon1; - } - } + //Load from local file + var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico"); + if (File.Exists(fileName)) + { + return new Icon(fileName); + } + return index switch + { + 0 => Properties.Resources.NotifyIcon1, + 1 => Properties.Resources.NotifyIcon2, + 2 => Properties.Resources.NotifyIcon3, + 3 => Properties.Resources.NotifyIcon4, + _ => Properties.Resources.NotifyIcon1, // default + }; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return Properties.Resources.NotifyIcon1; + } + } - public System.Windows.Media.ImageSource GetAppIcon(Config config) - { - var index = (int)config.SystemProxyItem.SysProxyType + 1; - return BitmapFrame.Create(new Uri($"pack://application:,,,/Resources/NotifyIcon{index}.ico", UriKind.RelativeOrAbsolute)); - } + public System.Windows.Media.ImageSource GetAppIcon(Config config) + { + var index = (int)config.SystemProxyItem.SysProxyType + 1; + return BitmapFrame.Create(new Uri($"pack://application:,,,/Resources/NotifyIcon{index}.ico", UriKind.RelativeOrAbsolute)); + } - private async Task GetNotifyIcon4Routing(Config config) - { - try - { - var item = await ConfigHandler.GetDefaultRouting(config); - if (item == null || Utils.IsNullOrEmpty(item.CustomIcon) || !File.Exists(item.CustomIcon)) - { - return null; - } + private async Task GetNotifyIcon4Routing(Config config) + { + try + { + var item = await ConfigHandler.GetDefaultRouting(config); + if (item == null || Utils.IsNullOrEmpty(item.CustomIcon) || !File.Exists(item.CustomIcon)) + { + return null; + } - Color color = ColorTranslator.FromHtml("#3399CC"); - int index = (int)config.SystemProxyItem.SysProxyType; - if (index > 0) - { - color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; - } + Color color = ColorTranslator.FromHtml("#3399CC"); + int index = (int)config.SystemProxyItem.SysProxyType; + if (index > 0) + { + color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1]; + } - int width = 128; - int height = 128; + int width = 128; + int height = 128; - Bitmap bitmap = new(width, height); - Graphics graphics = Graphics.FromImage(bitmap); - SolidBrush drawBrush = new(color); + Bitmap bitmap = new(width, height); + Graphics graphics = Graphics.FromImage(bitmap); + SolidBrush drawBrush = new(color); - graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; - //graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); - graphics.DrawImage(new Bitmap(item.CustomIcon), 0, 0, width, height); - graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2); + graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; + //graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height)); + graphics.DrawImage(new Bitmap(item.CustomIcon), 0, 0, width, height); + graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2); - Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); + Icon createdIcon = Icon.FromHandle(bitmap.GetHicon()); - drawBrush.Dispose(); - graphics.Dispose(); - bitmap.Dispose(); + drawBrush.Dispose(); + graphics.Dispose(); + bitmap.Dispose(); - return createdIcon; - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); - return null; - } - } + return createdIcon; + } + catch (Exception ex) + { + Logging.SaveLog(_tag, ex); + return null; + } + } - public void RegisterGlobalHotkey(Config config, Action handler, Action? update) - { - HotkeyHandler.Instance.UpdateViewEvent += update; - HotkeyHandler.Instance.HotkeyTriggerEvent += handler; - HotkeyHandler.Instance.Load(); - } - } -} \ No newline at end of file + public void RegisterGlobalHotkey(Config config, Action handler, Action? update) + { + HotkeyHandler.Instance.UpdateViewEvent += update; + HotkeyHandler.Instance.HotkeyTriggerEvent += handler; + HotkeyHandler.Instance.Load(); + } + } +} diff --git a/v2rayN/v2rayN/Properties/Resources.Designer.cs b/v2rayN/v2rayN/Properties/Resources.Designer.cs index 2394f731..1d92c83b 100644 --- a/v2rayN/v2rayN/Properties/Resources.Designer.cs +++ b/v2rayN/v2rayN/Properties/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // 此代码由工具生成。 // 运行时版本:4.0.30319.42000 @@ -9,225 +9,225 @@ //------------------------------------------------------------------------------ namespace v2rayN.Properties { - using System; - - - /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 - /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal 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() { - } - - /// - /// 返回此类使用的缓存的 ResourceManager 实例。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap about { - get { - object obj = ResourceManager.GetObject("about", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap active { - get { - object obj = ResourceManager.GetObject("active", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap checkupdate { - get { - object obj = ResourceManager.GetObject("checkupdate", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap help { - get { - object obj = ResourceManager.GetObject("help", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap minimize { - get { - object obj = ResourceManager.GetObject("minimize", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap notify { - get { - object obj = ResourceManager.GetObject("notify", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 - /// - internal static System.Drawing.Icon NotifyIcon1 { - get { - object obj = ResourceManager.GetObject("NotifyIcon1", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 - /// - internal static System.Drawing.Icon NotifyIcon2 { - get { - object obj = ResourceManager.GetObject("NotifyIcon2", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 - /// - internal static System.Drawing.Icon NotifyIcon3 { - get { - object obj = ResourceManager.GetObject("NotifyIcon3", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 - /// - internal static System.Drawing.Icon NotifyIcon4 { - get { - object obj = ResourceManager.GetObject("NotifyIcon4", resourceCulture); - return ((System.Drawing.Icon)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap option { - get { - object obj = ResourceManager.GetObject("option", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap promotion { - get { - object obj = ResourceManager.GetObject("promotion", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap restart { - get { - object obj = ResourceManager.GetObject("restart", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap server { - get { - object obj = ResourceManager.GetObject("server", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap share { - get { - object obj = ResourceManager.GetObject("share", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap speedtest { - get { - object obj = ResourceManager.GetObject("speedtest", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// 查找 System.Drawing.Bitmap 类型的本地化资源。 - /// - internal static System.Drawing.Bitmap sub { - get { - object obj = ResourceManager.GetObject("sub", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - } + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal 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() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("v2rayN.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap about { + get { + object obj = ResourceManager.GetObject("about", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap active { + get { + object obj = ResourceManager.GetObject("active", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap checkupdate { + get { + object obj = ResourceManager.GetObject("checkupdate", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap minimize { + get { + object obj = ResourceManager.GetObject("minimize", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap notify { + get { + object obj = ResourceManager.GetObject("notify", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon1 { + get { + object obj = ResourceManager.GetObject("NotifyIcon1", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon2 { + get { + object obj = ResourceManager.GetObject("NotifyIcon2", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon3 { + get { + object obj = ResourceManager.GetObject("NotifyIcon3", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon NotifyIcon4 { + get { + object obj = ResourceManager.GetObject("NotifyIcon4", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap option { + get { + object obj = ResourceManager.GetObject("option", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap promotion { + get { + object obj = ResourceManager.GetObject("promotion", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap restart { + get { + object obj = ResourceManager.GetObject("restart", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap server { + get { + object obj = ResourceManager.GetObject("server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap share { + get { + object obj = ResourceManager.GetObject("share", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap speedtest { + get { + object obj = ResourceManager.GetObject("speedtest", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sub { + get { + object obj = ResourceManager.GetObject("sub", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } } diff --git a/v2rayN/v2rayN/ViewModels/ThemeSettingViewModel.cs b/v2rayN/v2rayN/ViewModels/ThemeSettingViewModel.cs index 35654d3d..ac98c5b4 100644 --- a/v2rayN/v2rayN/ViewModels/ThemeSettingViewModel.cs +++ b/v2rayN/v2rayN/ViewModels/ThemeSettingViewModel.cs @@ -1,3 +1,7 @@ +using System.Reactive.Linq; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; using DynamicData; using DynamicData.Binding; using MaterialDesignColors; @@ -5,184 +9,181 @@ using MaterialDesignColors.ColorManipulation; using MaterialDesignThemes.Wpf; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using System.Reactive.Linq; -using System.Runtime.InteropServices; -using System.Windows; -using System.Windows.Interop; namespace v2rayN.ViewModels { - public class ThemeSettingViewModel : MyReactiveObject - { - private readonly PaletteHelper _paletteHelper = new(); + public class ThemeSettingViewModel : MyReactiveObject + { + private readonly PaletteHelper _paletteHelper = new(); - private IObservableCollection _swatches = new ObservableCollectionExtended(); - public IObservableCollection Swatches => _swatches; + private IObservableCollection _swatches = new ObservableCollectionExtended(); + public IObservableCollection Swatches => _swatches; - [Reactive] - public Swatch SelectedSwatch { get; set; } + [Reactive] + public Swatch SelectedSwatch { get; set; } - [Reactive] public string CurrentTheme { get; set; } + [Reactive] public string CurrentTheme { get; set; } - [Reactive] public int CurrentFontSize { get; set; } + [Reactive] public int CurrentFontSize { get; set; } - [Reactive] public string CurrentLanguage { get; set; } + [Reactive] public string CurrentLanguage { get; set; } - public ThemeSettingViewModel() - { - _config = AppHandler.Instance.Config; + public ThemeSettingViewModel() + { + _config = AppHandler.Instance.Config; - RegisterSystemColorSet(_config, Application.Current.MainWindow, ModifyTheme); + RegisterSystemColorSet(_config, Application.Current.MainWindow, ModifyTheme); - BindingUI(); - RestoreUI(); - } + BindingUI(); + RestoreUI(); + } - private void RestoreUI() - { - ModifyTheme(); - ModifyFontSize(); - if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty()) - { - var swatch = new SwatchesProvider().Swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName); - if (swatch != null - && swatch.ExemplarHue != null - && swatch.ExemplarHue?.Color != null) - { - ChangePrimaryColor(swatch.ExemplarHue.Color); - } - } - } + private void RestoreUI() + { + ModifyTheme(); + ModifyFontSize(); + if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty()) + { + var swatch = new SwatchesProvider().Swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName); + if (swatch != null + && swatch.ExemplarHue != null + && swatch.ExemplarHue?.Color != null) + { + ChangePrimaryColor(swatch.ExemplarHue.Color); + } + } + } - private void BindingUI() - { - _swatches.AddRange(new SwatchesProvider().Swatches); - if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty()) - { - SelectedSwatch = _swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName); - } - CurrentTheme = _config.UiItem.CurrentTheme; - CurrentFontSize = _config.UiItem.CurrentFontSize; - CurrentLanguage = _config.UiItem.CurrentLanguage; + private void BindingUI() + { + _swatches.AddRange(new SwatchesProvider().Swatches); + if (!_config.UiItem.ColorPrimaryName.IsNullOrEmpty()) + { + SelectedSwatch = _swatches.FirstOrDefault(t => t.Name == _config.UiItem.ColorPrimaryName); + } + CurrentTheme = _config.UiItem.CurrentTheme; + CurrentFontSize = _config.UiItem.CurrentFontSize; + CurrentLanguage = _config.UiItem.CurrentLanguage; - this.WhenAnyValue( - x => x.CurrentTheme, - y => y != null && !y.IsNullOrEmpty()) - .Subscribe(c => - { - if (_config.UiItem.CurrentTheme != CurrentTheme) - { - _config.UiItem.CurrentTheme = CurrentTheme; - ModifyTheme(); - ConfigHandler.SaveConfig(_config); - } - }); + this.WhenAnyValue( + x => x.CurrentTheme, + y => y != null && !y.IsNullOrEmpty()) + .Subscribe(c => + { + if (_config.UiItem.CurrentTheme != CurrentTheme) + { + _config.UiItem.CurrentTheme = CurrentTheme; + ModifyTheme(); + ConfigHandler.SaveConfig(_config); + } + }); - this.WhenAnyValue( - x => x.SelectedSwatch, - y => y != null && !y.Name.IsNullOrEmpty()) - .Subscribe(c => - { - if (SelectedSwatch == null - || SelectedSwatch.Name.IsNullOrEmpty() - || SelectedSwatch.ExemplarHue == null - || SelectedSwatch.ExemplarHue?.Color == null) - { - return; - } - if (_config.UiItem.ColorPrimaryName != SelectedSwatch?.Name) - { - _config.UiItem.ColorPrimaryName = SelectedSwatch?.Name; - ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color); - ConfigHandler.SaveConfig(_config); - } - }); + this.WhenAnyValue( + x => x.SelectedSwatch, + y => y != null && !y.Name.IsNullOrEmpty()) + .Subscribe(c => + { + if (SelectedSwatch == null + || SelectedSwatch.Name.IsNullOrEmpty() + || SelectedSwatch.ExemplarHue == null + || SelectedSwatch.ExemplarHue?.Color == null) + { + return; + } + if (_config.UiItem.ColorPrimaryName != SelectedSwatch?.Name) + { + _config.UiItem.ColorPrimaryName = SelectedSwatch?.Name; + ChangePrimaryColor(SelectedSwatch.ExemplarHue.Color); + ConfigHandler.SaveConfig(_config); + } + }); - this.WhenAnyValue( - x => x.CurrentFontSize, - y => y > 0) - .Subscribe(c => - { - if (_config.UiItem.CurrentFontSize != CurrentFontSize) - { - _config.UiItem.CurrentFontSize = CurrentFontSize; - ModifyFontSize(); - ConfigHandler.SaveConfig(_config); - } - }); + this.WhenAnyValue( + x => x.CurrentFontSize, + y => y > 0) + .Subscribe(c => + { + if (_config.UiItem.CurrentFontSize != CurrentFontSize) + { + _config.UiItem.CurrentFontSize = CurrentFontSize; + ModifyFontSize(); + ConfigHandler.SaveConfig(_config); + } + }); - this.WhenAnyValue( - x => x.CurrentLanguage, - y => y != null && !y.IsNullOrEmpty()) - .Subscribe(c => - { - if (Utils.IsNotEmpty(CurrentLanguage) && _config.UiItem.CurrentLanguage != CurrentLanguage) - { - _config.UiItem.CurrentLanguage = CurrentLanguage; - Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); - ConfigHandler.SaveConfig(_config); - NoticeHandler.Instance.Enqueue(ResUI.NeedRebootTips); - } - }); - } + this.WhenAnyValue( + x => x.CurrentLanguage, + y => y != null && !y.IsNullOrEmpty()) + .Subscribe(c => + { + if (Utils.IsNotEmpty(CurrentLanguage) && _config.UiItem.CurrentLanguage != CurrentLanguage) + { + _config.UiItem.CurrentLanguage = CurrentLanguage; + Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); + ConfigHandler.SaveConfig(_config); + NoticeHandler.Instance.Enqueue(ResUI.NeedRebootTips); + } + }); + } - public void ModifyTheme() - { - var baseTheme = CurrentTheme switch - { - nameof(ETheme.Dark) => BaseTheme.Dark, - nameof(ETheme.Light) => BaseTheme.Light, - _ => BaseTheme.Inherit, - }; + public void ModifyTheme() + { + var baseTheme = CurrentTheme switch + { + nameof(ETheme.Dark) => BaseTheme.Dark, + nameof(ETheme.Light) => BaseTheme.Light, + _ => BaseTheme.Inherit, + }; - var theme = _paletteHelper.GetTheme(); - theme.SetBaseTheme(baseTheme); - _paletteHelper.SetTheme(theme); + var theme = _paletteHelper.GetTheme(); + theme.SetBaseTheme(baseTheme); + _paletteHelper.SetTheme(theme); - WindowsUtils.SetDarkBorder(Application.Current.MainWindow, CurrentTheme); - } + WindowsUtils.SetDarkBorder(Application.Current.MainWindow, CurrentTheme); + } - private void ModifyFontSize() - { - double size = (long)CurrentFontSize; - if (size < Global.MinFontSize) return; + private void ModifyFontSize() + { + double size = CurrentFontSize; + if (size < Global.MinFontSize) + return; - Application.Current.Resources["StdFontSize"] = size; - Application.Current.Resources["StdFontSize1"] = size + 1; - Application.Current.Resources["StdFontSize-1"] = size - 1; - } + Application.Current.Resources["StdFontSize"] = size; + Application.Current.Resources["StdFontSize1"] = size + 1; + Application.Current.Resources["StdFontSize-1"] = size - 1; + } - public void ChangePrimaryColor(System.Windows.Media.Color color) - { - var theme = _paletteHelper.GetTheme(); + public void ChangePrimaryColor(System.Windows.Media.Color color) + { + var theme = _paletteHelper.GetTheme(); - theme.PrimaryLight = new ColorPair(color.Lighten()); - theme.PrimaryMid = new ColorPair(color); - theme.PrimaryDark = new ColorPair(color.Darken()); + theme.PrimaryLight = new ColorPair(color.Lighten()); + theme.PrimaryMid = new ColorPair(color); + theme.PrimaryDark = new ColorPair(color.Darken()); - _paletteHelper.SetTheme(theme); - } + _paletteHelper.SetTheme(theme); + } - public void RegisterSystemColorSet(Config config, Window window, Action updateFunc) - { - var helper = new WindowInteropHelper(window); - var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); - hwndSource.AddHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => - { - if (config.UiItem.CurrentTheme == nameof(ETheme.FollowSystem)) - { - const int WM_SETTINGCHANGE = 0x001A; - if (msg == WM_SETTINGCHANGE) - { - if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") - { - updateFunc?.Invoke(); - } - } - } + public void RegisterSystemColorSet(Config config, Window window, Action updateFunc) + { + var helper = new WindowInteropHelper(window); + var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle()); + hwndSource.AddHook((IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) => + { + if (config.UiItem.CurrentTheme == nameof(ETheme.FollowSystem)) + { + const int WM_SETTINGCHANGE = 0x001A; + if (msg == WM_SETTINGCHANGE) + { + if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") + { + updateFunc?.Invoke(); + } + } + } - return IntPtr.Zero; - }); - } - } -} \ No newline at end of file + return IntPtr.Zero; + }); + } + } +} diff --git a/v2rayN/v2rayN/Views/AddServer2Window.xaml b/v2rayN/v2rayN/Views/AddServer2Window.xaml index 2560338c..5e1cc5df 100644 --- a/v2rayN/v2rayN/Views/AddServer2Window.xaml +++ b/v2rayN/v2rayN/Views/AddServer2Window.xaml @@ -1,201 +1,201 @@ - - - - + - + - - - + + + - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs b/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs index acc0cfec..2a92619e 100644 --- a/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs +++ b/v2rayN/v2rayN/Views/ClashConnectionsView.xaml.cs @@ -1,68 +1,69 @@ -using ReactiveUI; using System.Reactive.Disposables; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; +using ReactiveUI; namespace v2rayN.Views { - /// - /// Interaction logic for ConnectionsView.xaml - /// - public partial class ClashConnectionsView - { - public ClashConnectionsView() - { - InitializeComponent(); - ViewModel = new ClashConnectionsViewModel(UpdateViewHandler); - btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; + /// + /// Interaction logic for ConnectionsView.xaml + /// + public partial class ClashConnectionsView + { + public ClashConnectionsView() + { + InitializeComponent(); + ViewModel = new ClashConnectionsViewModel(UpdateViewHandler); + btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ConnectionItems, v => v.lstConnections.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstConnections.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ConnectionItems, v => v.lstConnections.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstConnections.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseCmd, v => v.menuConnectionClose).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.menuConnectionCloseAll).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.HostFilter, v => v.txtHostFilter.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); - } + this.Bind(ViewModel, vm => vm.HostFilter, v => v.txtHostFilter.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ConnectionCloseAllCmd, v => v.btnConnectionCloseAll).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherRefreshConnections: - if (obj is null) return false; - Application.Current?.Dispatcher.Invoke((() => - { - ViewModel?.RefreshConnections((List?)obj); - }), DispatcherPriority.Normal); - break; - } + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshConnections: + if (obj is null) + return false; + Application.Current?.Dispatcher.Invoke(() => + { + ViewModel?.RefreshConnections((List?)obj); + }, DispatcherPriority.Normal); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - private void BtnAutofitColumnWidth_Click(object sender, RoutedEventArgs e) - { - AutofitColumnWidth(); - } + private void BtnAutofitColumnWidth_Click(object sender, RoutedEventArgs e) + { + AutofitColumnWidth(); + } - private void AutofitColumnWidth() - { - foreach (var it in lstConnections.Columns) - { - it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); - } - } + private void AutofitColumnWidth() + { + foreach (var it in lstConnections.Columns) + { + it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); + } + } - private void btnClose_Click(object sender, System.Windows.RoutedEventArgs e) - { - ViewModel?.ClashConnectionClose(false); - } - } -} \ No newline at end of file + private void btnClose_Click(object sender, System.Windows.RoutedEventArgs e) + { + ViewModel?.ClashConnectionClose(false); + } + } +} diff --git a/v2rayN/v2rayN/Views/ClashProxiesView.xaml b/v2rayN/v2rayN/Views/ClashProxiesView.xaml index 35910211..4e6224b1 100644 --- a/v2rayN/v2rayN/Views/ClashProxiesView.xaml +++ b/v2rayN/v2rayN/Views/ClashProxiesView.xaml @@ -1,191 +1,191 @@ - - - - + x:Class="v2rayN.Views.ClashProxiesView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:converters="clr-namespace:v2rayN.Converters" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:reactiveui="http://reactiveui.net" + xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" + xmlns:vms="clr-namespace:ServiceLib.ViewModels;assembly=ServiceLib" + d:DesignHeight="450" + d:DesignWidth="800" + x:TypeArguments="vms:ClashProxiesViewModel" + KeyDown="ProxiesView_KeyDown" + Style="{StaticResource ViewGlobal}" + mc:Ignorable="d"> + + + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/ClashProxiesView.xaml.cs b/v2rayN/v2rayN/Views/ClashProxiesView.xaml.cs index 5142f72b..415ed4ce 100644 --- a/v2rayN/v2rayN/Views/ClashProxiesView.xaml.cs +++ b/v2rayN/v2rayN/Views/ClashProxiesView.xaml.cs @@ -1,85 +1,86 @@ -using ReactiveUI; -using Splat; using System.Reactive.Disposables; using System.Windows; using System.Windows.Input; using System.Windows.Threading; +using ReactiveUI; +using Splat; namespace v2rayN.Views { - /// - /// Interaction logic for ProxiesView.xaml - /// - public partial class ClashProxiesView - { - public ClashProxiesView() - { - InitializeComponent(); - ViewModel = new ClashProxiesViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); - lstProxyDetails.PreviewMouseDoubleClick += lstProxyDetails_PreviewMouseDoubleClick; + /// + /// Interaction logic for ProxiesView.xaml + /// + public partial class ClashProxiesView + { + public ClashProxiesView() + { + InitializeComponent(); + ViewModel = new ClashProxiesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ClashProxiesViewModel)); + lstProxyDetails.PreviewMouseDoubleClick += lstProxyDetails_PreviewMouseDoubleClick; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ProxyGroups, v => v.lstProxyGroups.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedGroup, v => v.lstProxyGroups.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProxyGroups, v => v.lstProxyGroups.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedGroup, v => v.lstProxyGroups.SelectedItem).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.ProxyDetails, v => v.lstProxyDetails.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedDetail, v => v.lstProxyDetails.SelectedItem).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.ProxyDetails, v => v.lstProxyDetails.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedDetail, v => v.lstProxyDetails.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesReloadCmd, v => v.menuProxiesReload).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestCmd, v => v.menuProxiesDelaytest).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesReloadCmd, v => v.menuProxiesReload).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestCmd, v => v.menuProxiesDelaytest).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestPartCmd, v => v.menuProxiesDelaytestPart).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ProxiesSelectActivityCmd, v => v.menuProxiesSelectActivity).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesDelaytestPartCmd, v => v.menuProxiesDelaytestPart).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ProxiesSelectActivityCmd, v => v.menuProxiesSelectActivity).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.RuleModeSelected, v => v.cmbRulemode.SelectedIndex).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); - } + this.Bind(ViewModel, vm => vm.RuleModeSelected, v => v.cmbRulemode.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SortingSelected, v => v.cmbSorting.SelectedIndex).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherRefreshProxyGroups: - Application.Current?.Dispatcher.Invoke((() => - { - ViewModel?.RefreshProxyGroups(); - }), DispatcherPriority.Normal); - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherRefreshProxyGroups: + Application.Current?.Dispatcher.Invoke(() => + { + ViewModel?.RefreshProxyGroups(); + }, DispatcherPriority.Normal); + break; - case EViewAction.DispatcherProxiesDelayTest: + case EViewAction.DispatcherProxiesDelayTest: - if (obj is null) return false; - Application.Current?.Dispatcher.Invoke((() => - { - ViewModel?.ProxiesDelayTestResult((SpeedTestResult)obj); - }), DispatcherPriority.Normal); - break; - } + if (obj is null) + return false; + Application.Current?.Dispatcher.Invoke(() => + { + ViewModel?.ProxiesDelayTestResult((SpeedTestResult)obj); + }, DispatcherPriority.Normal); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - private void ProxiesView_KeyDown(object sender, KeyEventArgs e) - { - switch (e.Key) - { - case Key.F5: - ViewModel?.ProxiesReload(); - break; + private void ProxiesView_KeyDown(object sender, KeyEventArgs e) + { + switch (e.Key) + { + case Key.F5: + ViewModel?.ProxiesReload(); + break; - case Key.Enter: - ViewModel?.SetActiveProxy(); - break; - } - } + case Key.Enter: + ViewModel?.SetActiveProxy(); + break; + } + } - private void lstProxyDetails_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) - { - ViewModel?.SetActiveProxy(); - } - } -} \ No newline at end of file + private void lstProxyDetails_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) + { + ViewModel?.SetActiveProxy(); + } + } +} diff --git a/v2rayN/v2rayN/Views/DNSSettingWindow.xaml b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml index 813ae6c0..2a78ebe7 100644 --- a/v2rayN/v2rayN/Views/DNSSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/DNSSettingWindow.xaml @@ -1,207 +1,207 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/MsgView.xaml.cs b/v2rayN/v2rayN/Views/MsgView.xaml.cs index dfc69248..fd0579d0 100644 --- a/v2rayN/v2rayN/Views/MsgView.xaml.cs +++ b/v2rayN/v2rayN/Views/MsgView.xaml.cs @@ -1,90 +1,91 @@ -using ReactiveUI; using System.Reactive.Disposables; using System.Windows; using System.Windows.Threading; +using ReactiveUI; namespace v2rayN.Views { - public partial class MsgView - { - public MsgView() - { - InitializeComponent(); + public partial class MsgView + { + public MsgView() + { + InitializeComponent(); - ViewModel = new MsgViewModel(UpdateViewHandler); + ViewModel = new MsgViewModel(UpdateViewHandler); - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.MsgFilter, v => v.cmbMsgFilter.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); - }); + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.MsgFilter, v => v.cmbMsgFilter.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); + }); - btnCopy.Click += menuMsgViewCopyAll_Click; - btnClear.Click += menuMsgViewClear_Click; - menuMsgViewSelectAll.Click += menuMsgViewSelectAll_Click; - menuMsgViewCopy.Click += menuMsgViewCopy_Click; - menuMsgViewCopyAll.Click += menuMsgViewCopyAll_Click; - menuMsgViewClear.Click += menuMsgViewClear_Click; + btnCopy.Click += menuMsgViewCopyAll_Click; + btnClear.Click += menuMsgViewClear_Click; + menuMsgViewSelectAll.Click += menuMsgViewSelectAll_Click; + menuMsgViewCopy.Click += menuMsgViewCopy_Click; + menuMsgViewCopyAll.Click += menuMsgViewCopyAll_Click; + menuMsgViewClear.Click += menuMsgViewClear_Click; - Global.PresetMsgFilters.ForEach(it => - { - cmbMsgFilter.Items.Add(it); - }); - } + Global.PresetMsgFilters.ForEach(it => + { + cmbMsgFilter.Items.Add(it); + }); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.DispatcherShowMsg: - if (obj is null) return false; - Application.Current?.Dispatcher.Invoke((() => - { - ShowMsg(obj); - }), DispatcherPriority.ApplicationIdle); - break; - } - return await Task.FromResult(true); - } + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.DispatcherShowMsg: + if (obj is null) + return false; + Application.Current?.Dispatcher.Invoke(() => + { + ShowMsg(obj); + }, DispatcherPriority.ApplicationIdle); + break; + } + return await Task.FromResult(true); + } - private void ShowMsg(object msg) - { - txtMsg.BeginChange(); - txtMsg.Text = msg.ToString(); - if (togScrollToEnd.IsChecked ?? true) - { - txtMsg.ScrollToEnd(); - } - txtMsg.EndChange(); - } + private void ShowMsg(object msg) + { + txtMsg.BeginChange(); + txtMsg.Text = msg.ToString(); + if (togScrollToEnd.IsChecked ?? true) + { + txtMsg.ScrollToEnd(); + } + txtMsg.EndChange(); + } - public void ClearMsg() - { - ViewModel?.ClearMsg(); - txtMsg.Clear(); - } + public void ClearMsg() + { + ViewModel?.ClearMsg(); + txtMsg.Clear(); + } - private void menuMsgViewSelectAll_Click(object sender, System.Windows.RoutedEventArgs e) - { - txtMsg.Focus(); - txtMsg.SelectAll(); - } + private void menuMsgViewSelectAll_Click(object sender, System.Windows.RoutedEventArgs e) + { + txtMsg.Focus(); + txtMsg.SelectAll(); + } - private void menuMsgViewCopy_Click(object sender, System.Windows.RoutedEventArgs e) - { - var data = txtMsg.SelectedText.TrimEx(); - WindowsUtils.SetClipboardData(data); - } + private void menuMsgViewCopy_Click(object sender, System.Windows.RoutedEventArgs e) + { + var data = txtMsg.SelectedText.TrimEx(); + WindowsUtils.SetClipboardData(data); + } - private void menuMsgViewCopyAll_Click(object sender, System.Windows.RoutedEventArgs e) - { - var data = txtMsg.Text; - WindowsUtils.SetClipboardData(data); - } + private void menuMsgViewCopyAll_Click(object sender, System.Windows.RoutedEventArgs e) + { + var data = txtMsg.Text; + WindowsUtils.SetClipboardData(data); + } - private void menuMsgViewClear_Click(object sender, System.Windows.RoutedEventArgs e) - { - ClearMsg(); - } - } -} \ No newline at end of file + private void menuMsgViewClear_Click(object sender, System.Windows.RoutedEventArgs e) + { + ClearMsg(); + } + } +} diff --git a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml index 606b91d2..21c4a731 100644 --- a/v2rayN/v2rayN/Views/OptionSettingWindow.xaml +++ b/v2rayN/v2rayN/Views/OptionSettingWindow.xaml @@ -1,1200 +1,1200 @@ - - - - - + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs index b838cd56..8fdb305d 100644 --- a/v2rayN/v2rayN/Views/ProfilesView.xaml.cs +++ b/v2rayN/v2rayN/Views/ProfilesView.xaml.cs @@ -1,6 +1,3 @@ -using MaterialDesignThemes.Wpf; -using ReactiveUI; -using Splat; using System.Reactive.Disposables; using System.Windows; using System.Windows.Controls; @@ -8,448 +5,463 @@ using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; +using MaterialDesignThemes.Wpf; +using ReactiveUI; +using Splat; using v2rayN.Base; using Point = System.Windows.Point; namespace v2rayN.Views { - public partial class ProfilesView - { - private static Config _config; + public partial class ProfilesView + { + private static Config _config; - public ProfilesView() - { - InitializeComponent(); - lstGroup.MaxHeight = Math.Floor(SystemParameters.WorkArea.Height * 0.20 / 40) * 40; + public ProfilesView() + { + InitializeComponent(); + lstGroup.MaxHeight = Math.Floor(SystemParameters.WorkArea.Height * 0.20 / 40) * 40; - _config = AppHandler.Instance.Config; + _config = AppHandler.Instance.Config; - btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; - txtServerFilter.PreviewKeyDown += TxtServerFilter_PreviewKeyDown; - lstProfiles.PreviewKeyDown += LstProfiles_PreviewKeyDown; - lstProfiles.SelectionChanged += lstProfiles_SelectionChanged; - lstProfiles.LoadingRow += LstProfiles_LoadingRow; - menuSelectAll.Click += menuSelectAll_Click; + btnAutofitColumnWidth.Click += BtnAutofitColumnWidth_Click; + txtServerFilter.PreviewKeyDown += TxtServerFilter_PreviewKeyDown; + lstProfiles.PreviewKeyDown += LstProfiles_PreviewKeyDown; + lstProfiles.SelectionChanged += lstProfiles_SelectionChanged; + lstProfiles.LoadingRow += LstProfiles_LoadingRow; + menuSelectAll.Click += menuSelectAll_Click; - if (_config.UiItem.EnableDragDropSort) - { - lstProfiles.AllowDrop = true; - lstProfiles.PreviewMouseLeftButtonDown += LstProfiles_PreviewMouseLeftButtonDown; - lstProfiles.MouseMove += LstProfiles_MouseMove; - lstProfiles.DragEnter += LstProfiles_DragEnter; - lstProfiles.Drop += LstProfiles_Drop; - } + if (_config.UiItem.EnableDragDropSort) + { + lstProfiles.AllowDrop = true; + lstProfiles.PreviewMouseLeftButtonDown += LstProfiles_PreviewMouseLeftButtonDown; + lstProfiles.MouseMove += LstProfiles_MouseMove; + lstProfiles.DragEnter += LstProfiles_DragEnter; + lstProfiles.Drop += LstProfiles_Drop; + } - ViewModel = new ProfilesViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); + ViewModel = new ProfilesViewModel(UpdateViewHandler); + Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(ProfilesViewModel)); - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.ProfileItems, v => v.lstProfiles.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedProfile, v => v.lstProfiles.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.ProfileItems, v => v.lstProfiles.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedProfile, v => v.lstProfiles.SelectedItem).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstGroup.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSub, v => v.lstGroup.SelectedItem).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.ServerFilter, v => v.txtServerFilter.Text).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.AddSubCmd, v => v.btnAddSub).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.EditSubCmd, v => v.btnEditSub).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSub, v => v.lstGroup.SelectedItem).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.ServerFilter, v => v.txtServerFilter.Text).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.AddSubCmd, v => v.btnAddSub).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.EditSubCmd, v => v.btnEditSub).DisposeWith(disposables); - //servers delete - this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); + //servers delete + this.BindCommand(ViewModel, vm => vm.EditServerCmd, v => v.menuEditServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveServerCmd, v => v.menuRemoveServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RemoveDuplicateServerCmd, v => v.menuRemoveDuplicateServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.CopyServerCmd, v => v.menuCopyServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultServerCmd, v => v.menuSetDefaultServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.ShareServerCmd, v => v.menuShareServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultMultipleServerCmd, v => v.menuSetDefaultMultipleServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SetDefaultLoadBalanceServerCmd, v => v.menuSetDefaultLoadBalanceServer).DisposeWith(disposables); - //servers move - this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedMoveToGroup, v => v.cmbMoveToGroup.SelectedItem).DisposeWith(disposables); + //servers move + this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.cmbMoveToGroup.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedMoveToGroup, v => v.cmbMoveToGroup.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveTopCmd, v => v.menuMoveTop).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveUpCmd, v => v.menuMoveUp).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveDownCmd, v => v.menuMoveDown).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.MoveBottomCmd, v => v.menuMoveBottom).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveTopCmd, v => v.menuMoveTop).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveUpCmd, v => v.menuMoveUp).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveDownCmd, v => v.menuMoveDown).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.MoveBottomCmd, v => v.menuMoveBottom).DisposeWith(disposables); - //servers ping - this.BindCommand(ViewModel, vm => vm.MixedTestServerCmd, v => v.menuMixedTestServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.TcpingServerCmd, v => v.menuTcpingServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.RealPingServerCmd, v => v.menuRealPingServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SpeedServerCmd, v => v.menuSpeedServer).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SortServerResultCmd, v => v.menuSortServerResult).DisposeWith(disposables); + //servers ping + this.BindCommand(ViewModel, vm => vm.MixedTestServerCmd, v => v.menuMixedTestServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.TcpingServerCmd, v => v.menuTcpingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.RealPingServerCmd, v => v.menuRealPingServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SpeedServerCmd, v => v.menuSpeedServer).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SortServerResultCmd, v => v.menuSortServerResult).DisposeWith(disposables); - //servers export - this.BindCommand(ViewModel, vm => vm.Export2ClientConfigCmd, v => v.menuExport2ClientConfig).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); - }); + //servers export + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigCmd, v => v.menuExport2ClientConfig).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ClientConfigClipboardCmd, v => v.menuExport2ClientConfigClipboard).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlCmd, v => v.menuExport2ShareUrl).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.Export2ShareUrlBase64Cmd, v => v.menuExport2ShareUrlBase64).DisposeWith(disposables); + }); - RestoreUI(); - ViewModel?.RefreshServers(); - MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); - } + RestoreUI(); + ViewModel?.RefreshServers(); + MessageBus.Current.Listen(EMsgCommand.AppExit.ToString()).Subscribe(StorageUI); + } - #region Event + #region Event - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.SetClipboardData: - if (obj is null) return false; - WindowsUtils.SetClipboardData((string)obj); - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.SetClipboardData: + if (obj is null) + return false; + WindowsUtils.SetClipboardData((string)obj); + break; - case EViewAction.AdjustMainLvColWidth: - Application.Current?.Dispatcher.Invoke((() => - { - AutofitColumnWidth(); - }), DispatcherPriority.Normal); - break; + case EViewAction.AdjustMainLvColWidth: + Application.Current?.Dispatcher.Invoke(() => + { + AutofitColumnWidth(); + }, DispatcherPriority.Normal); + break; - case EViewAction.ProfilesFocus: - lstProfiles.Focus(); - break; + case EViewAction.ProfilesFocus: + lstProfiles.Focus(); + break; - case EViewAction.ShowYesNo: - if (UI.ShowYesNo(ResUI.RemoveServer) == MessageBoxResult.No) - { - return false; - } - break; + case EViewAction.ShowYesNo: + if (UI.ShowYesNo(ResUI.RemoveServer) == MessageBoxResult.No) + { + return false; + } + break; - case EViewAction.SaveFileDialog: - if (obj is null) return false; - if (UI.SaveFileDialog(out string fileName, "Config|*.json") != true) - { - return false; - } - ViewModel?.Export2ClientConfigResult(fileName, (ProfileItem)obj); - break; + case EViewAction.SaveFileDialog: + if (obj is null) + return false; + if (UI.SaveFileDialog(out string fileName, "Config|*.json") != true) + { + return false; + } + ViewModel?.Export2ClientConfigResult(fileName, (ProfileItem)obj); + break; - case EViewAction.AddServerWindow: - if (obj is null) return false; - return (new AddServerWindow((ProfileItem)obj)).ShowDialog() ?? false; + case EViewAction.AddServerWindow: + if (obj is null) + return false; + return new AddServerWindow((ProfileItem)obj).ShowDialog() ?? false; - case EViewAction.AddServer2Window: - if (obj is null) return false; - return (new AddServer2Window((ProfileItem)obj)).ShowDialog() ?? false; + case EViewAction.AddServer2Window: + if (obj is null) + return false; + return new AddServer2Window((ProfileItem)obj).ShowDialog() ?? false; - case EViewAction.ShareServer: - if (obj is null) return false; - ShareServer((string)obj); - break; + case EViewAction.ShareServer: + if (obj is null) + return false; + ShareServer((string)obj); + break; - case EViewAction.SubEditWindow: - if (obj is null) return false; - return (new SubEditWindow((SubItem)obj)).ShowDialog() ?? false; + case EViewAction.SubEditWindow: + if (obj is null) + return false; + return new SubEditWindow((SubItem)obj).ShowDialog() ?? false; - case EViewAction.DispatcherSpeedTest: - if (obj is null) return false; - Application.Current?.Dispatcher.Invoke((() => - { - ViewModel?.SetSpeedTestResult((SpeedTestResult)obj); - }), DispatcherPriority.Normal); - break; + case EViewAction.DispatcherSpeedTest: + if (obj is null) + return false; + Application.Current?.Dispatcher.Invoke(() => + { + ViewModel?.SetSpeedTestResult((SpeedTestResult)obj); + }, DispatcherPriority.Normal); + break; - case EViewAction.DispatcherRefreshServersBiz: - Application.Current?.Dispatcher.Invoke((() => - { - ViewModel?.RefreshServersBiz(); - }), DispatcherPriority.Normal); - break; - } + case EViewAction.DispatcherRefreshServersBiz: + Application.Current?.Dispatcher.Invoke(() => + { + ViewModel?.RefreshServersBiz(); + }, DispatcherPriority.Normal); + break; + } - return await Task.FromResult(true); - } + return await Task.FromResult(true); + } - public async void ShareServer(string url) - { - var img = QRCodeHelper.GetQRCode(url); - var dialog = new QrcodeView() - { - imgQrcode = { Source = img }, - txtContent = { Text = url }, - }; + public async void ShareServer(string url) + { + var img = QRCodeHelper.GetQRCode(url); + var dialog = new QrcodeView() + { + imgQrcode = { Source = img }, + txtContent = { Text = url }, + }; - await DialogHost.Show(dialog, "RootDialog"); - } + await DialogHost.Show(dialog, "RootDialog"); + } - private void lstProfiles_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) - { - ViewModel.SelectedProfiles = lstProfiles.SelectedItems.Cast().ToList(); - } + private void lstProfiles_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) + { + ViewModel.SelectedProfiles = lstProfiles.SelectedItems.Cast().ToList(); + } - private void LstProfiles_LoadingRow(object? sender, DataGridRowEventArgs e) - { - e.Row.Header = $" {e.Row.GetIndex() + 1}"; - } + private void LstProfiles_LoadingRow(object? sender, DataGridRowEventArgs e) + { + e.Row.Header = $" {e.Row.GetIndex() + 1}"; + } - private void LstProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - if (_config.UiItem.DoubleClick2Activate) - { - ViewModel?.SetDefaultServer(); - } - else - { - ViewModel?.EditServerAsync(EConfigType.Custom); - } - } + private void LstProfiles_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + if (_config.UiItem.DoubleClick2Activate) + { + ViewModel?.SetDefaultServer(); + } + else + { + ViewModel?.EditServerAsync(EConfigType.Custom); + } + } - private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e) - { - var colHeader = sender as DataGridColumnHeader; - if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null) - { - return; - } + private void LstProfiles_ColumnHeader_Click(object sender, RoutedEventArgs e) + { + var colHeader = sender as DataGridColumnHeader; + if (colHeader == null || colHeader.TabIndex < 0 || colHeader.Column == null) + { + return; + } - var colName = ((MyDGTextColumn)colHeader.Column).ExName; - ViewModel?.SortServer(colName); - } + var colName = ((MyDGTextColumn)colHeader.Column).ExName; + ViewModel?.SortServer(colName); + } - private void menuSelectAll_Click(object sender, RoutedEventArgs e) - { - lstProfiles.SelectAll(); - } + private void menuSelectAll_Click(object sender, RoutedEventArgs e) + { + lstProfiles.SelectAll(); + } - private void LstProfiles_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) - { - switch (e.Key) - { - case Key.A: - menuSelectAll_Click(null, null); - break; + private void LstProfiles_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) + { + switch (e.Key) + { + case Key.A: + menuSelectAll_Click(null, null); + break; - case Key.C: - ViewModel?.Export2ShareUrlAsync(false); - break; + case Key.C: + ViewModel?.Export2ShareUrlAsync(false); + break; - case Key.D: - ViewModel?.EditServerAsync(EConfigType.Custom); - break; + case Key.D: + ViewModel?.EditServerAsync(EConfigType.Custom); + break; - case Key.F: - ViewModel?.ShareServerAsync(); - break; + case Key.F: + ViewModel?.ShareServerAsync(); + break; - case Key.O: - ViewModel?.ServerSpeedtest(ESpeedActionType.Tcping); - break; + case Key.O: + ViewModel?.ServerSpeedtest(ESpeedActionType.Tcping); + break; - case Key.R: - ViewModel?.ServerSpeedtest(ESpeedActionType.Realping); - break; + case Key.R: + ViewModel?.ServerSpeedtest(ESpeedActionType.Realping); + break; - case Key.T: - ViewModel?.ServerSpeedtest(ESpeedActionType.Speedtest); - break; + case Key.T: + ViewModel?.ServerSpeedtest(ESpeedActionType.Speedtest); + break; - case Key.E: - ViewModel?.ServerSpeedtest(ESpeedActionType.Mixedtest); - break; - } - } - else - { - if (e.Key is Key.Enter or Key.Return) - { - ViewModel?.SetDefaultServer(); - } - else if (e.Key == Key.Delete) - { - ViewModel?.RemoveServerAsync(); - } - else if (e.Key == Key.T) - { - ViewModel?.MoveServer(EMove.Top); - } - else if (e.Key == Key.U) - { - ViewModel?.MoveServer(EMove.Up); - } - else if (e.Key == Key.D) - { - ViewModel?.MoveServer(EMove.Down); - } - else if (e.Key == Key.B) - { - ViewModel?.MoveServer(EMove.Bottom); - } - else if (e.Key == Key.Escape) - { - ViewModel?.ServerSpeedtestStop(); - } - } - } + case Key.E: + ViewModel?.ServerSpeedtest(ESpeedActionType.Mixedtest); + break; + } + } + else + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.SetDefaultServer(); + } + else if (e.Key == Key.Delete) + { + ViewModel?.RemoveServerAsync(); + } + else if (e.Key == Key.T) + { + ViewModel?.MoveServer(EMove.Top); + } + else if (e.Key == Key.U) + { + ViewModel?.MoveServer(EMove.Up); + } + else if (e.Key == Key.D) + { + ViewModel?.MoveServer(EMove.Down); + } + else if (e.Key == Key.B) + { + ViewModel?.MoveServer(EMove.Bottom); + } + else if (e.Key == Key.Escape) + { + ViewModel?.ServerSpeedtestStop(); + } + } + } - private void BtnAutofitColumnWidth_Click(object sender, RoutedEventArgs e) - { - AutofitColumnWidth(); - } + private void BtnAutofitColumnWidth_Click(object sender, RoutedEventArgs e) + { + AutofitColumnWidth(); + } - private void AutofitColumnWidth() - { - foreach (var it in lstProfiles.Columns) - { - it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); - } - } + private void AutofitColumnWidth() + { + foreach (var it in lstProfiles.Columns) + { + it.Width = new DataGridLength(1, DataGridLengthUnitType.Auto); + } + } - private void TxtServerFilter_PreviewKeyDown(object sender, KeyEventArgs e) - { - if (e.Key is Key.Enter or Key.Return) - { - ViewModel?.RefreshServers(); - } - } + private void TxtServerFilter_PreviewKeyDown(object sender, KeyEventArgs e) + { + if (e.Key is Key.Enter or Key.Return) + { + ViewModel?.RefreshServers(); + } + } - #endregion Event + #endregion Event - #region UI + #region UI - private void RestoreUI() - { - var lvColumnItem = _config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList(); - var displayIndex = 0; - foreach (var item in lvColumnItem) - { - foreach (MyDGTextColumn item2 in lstProfiles.Columns) - { - if (item2.ExName == item.Name) - { - if (item.Width < 0) - { - item2.Visibility = Visibility.Hidden; - } - else - { - item2.Width = item.Width; - item2.DisplayIndex = displayIndex++; - } - if (item.Name.ToLower().StartsWith("to")) - { - item2.Visibility = _config.GuiItem.EnableStatistics ? Visibility.Visible : Visibility.Hidden; - } - } - } - } - } + private void RestoreUI() + { + var lvColumnItem = _config.UiItem.MainColumnItem.OrderBy(t => t.Index).ToList(); + var displayIndex = 0; + foreach (var item in lvColumnItem) + { + foreach (MyDGTextColumn item2 in lstProfiles.Columns) + { + if (item2.ExName == item.Name) + { + if (item.Width < 0) + { + item2.Visibility = Visibility.Hidden; + } + else + { + item2.Width = item.Width; + item2.DisplayIndex = displayIndex++; + } + if (item.Name.ToLower().StartsWith("to")) + { + item2.Visibility = _config.GuiItem.EnableStatistics ? Visibility.Visible : Visibility.Hidden; + } + } + } + } + } - private void StorageUI(string? n = null) - { - List lvColumnItem = new(); - for (int k = 0; k < lstProfiles.Columns.Count; k++) - { - var item2 = (MyDGTextColumn)lstProfiles.Columns[k]; - lvColumnItem.Add(new() - { - Name = item2.ExName, - Width = item2.Visibility == Visibility.Visible ? Utils.ToInt(item2.ActualWidth) : -1, - Index = item2.DisplayIndex - }); - } - _config.UiItem.MainColumnItem = lvColumnItem; - } + private void StorageUI(string? n = null) + { + List lvColumnItem = new(); + for (int k = 0; k < lstProfiles.Columns.Count; k++) + { + var item2 = (MyDGTextColumn)lstProfiles.Columns[k]; + lvColumnItem.Add(new() + { + Name = item2.ExName, + Width = item2.Visibility == Visibility.Visible ? Utils.ToInt(item2.ActualWidth) : -1, + Index = item2.DisplayIndex + }); + } + _config.UiItem.MainColumnItem = lvColumnItem; + } - #endregion UI + #endregion UI - #region Drag and Drop + #region Drag and Drop - private Point startPoint = new(); - private int startIndex = -1; - private string formatData = "ProfileItemModel"; + private Point startPoint = new(); + private int startIndex = -1; + private string formatData = "ProfileItemModel"; - /// - /// Helper to search up the VisualTree - /// - /// - /// - /// - private static T? FindAncestor(DependencyObject current) where T : DependencyObject - { - do - { - if (current is T) - { - return (T)current; - } - current = VisualTreeHelper.GetParent(current); - } - while (current != null); - return null; - } + /// + /// Helper to search up the VisualTree + /// + /// + /// + /// + private static T? FindAncestor(DependencyObject current) where T : DependencyObject + { + do + { + if (current is T) + { + return (T)current; + } + current = VisualTreeHelper.GetParent(current); + } + while (current != null); + return null; + } - private void LstProfiles_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - // Get current mouse position - startPoint = e.GetPosition(null); - } + private void LstProfiles_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + // Get current mouse position + startPoint = e.GetPosition(null); + } - private void LstProfiles_MouseMove(object sender, MouseEventArgs e) - { - // Get the current mouse position - Point mousePos = e.GetPosition(null); - Vector diff = startPoint - mousePos; + private void LstProfiles_MouseMove(object sender, MouseEventArgs e) + { + // Get the current mouse position + Point mousePos = e.GetPosition(null); + Vector diff = startPoint - mousePos; - if (e.LeftButton == MouseButtonState.Pressed && - (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || - Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) - { - // Get the dragged Item - if (sender is not DataGrid listView) return; - var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); - if (listViewItem == null) return; // Abort - // Find the data behind the ListViewItem - ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); - if (item == null) return; // Abort - // Initialize the drag & drop operation - startIndex = lstProfiles.SelectedIndex; - DataObject dragData = new(formatData, item); - DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); - } - } + if (e.LeftButton == MouseButtonState.Pressed && + (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || + Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) + { + // Get the dragged Item + if (sender is not DataGrid listView) + return; + var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + if (listViewItem == null) + return; // Abort + // Find the data behind the ListViewItem + ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + if (item == null) + return; // Abort + // Initialize the drag & drop operation + startIndex = lstProfiles.SelectedIndex; + DataObject dragData = new(formatData, item); + DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); + } + } - private void LstProfiles_DragEnter(object sender, DragEventArgs e) - { - if (!e.Data.GetDataPresent(formatData) || sender != e.Source) - { - e.Effects = DragDropEffects.None; - } - } + private void LstProfiles_DragEnter(object sender, DragEventArgs e) + { + if (!e.Data.GetDataPresent(formatData) || sender != e.Source) + { + e.Effects = DragDropEffects.None; + } + } - private void LstProfiles_Drop(object sender, DragEventArgs e) - { - if (e.Data.GetDataPresent(formatData) && sender == e.Source) - { - // Get the drop Item destination - if (sender is not DataGrid listView) return; - var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); - if (listViewItem == null) - { - // Abort - e.Effects = DragDropEffects.None; - return; - } - // Find the data behind the Item - ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); - if (item == null) return; - // Move item into observable collection - // (this will be automatically reflected to lstView.ItemsSource) - e.Effects = DragDropEffects.Move; + private void LstProfiles_Drop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(formatData) && sender == e.Source) + { + // Get the drop Item destination + if (sender is not DataGrid listView) + return; + var listViewItem = FindAncestor((DependencyObject)e.OriginalSource); + if (listViewItem == null) + { + // Abort + e.Effects = DragDropEffects.None; + return; + } + // Find the data behind the Item + ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); + if (item == null) + return; + // Move item into observable collection + // (this will be automatically reflected to lstView.ItemsSource) + e.Effects = DragDropEffects.Move; - ViewModel?.MoveServerTo(startIndex, item); + ViewModel?.MoveServerTo(startIndex, item); - startIndex = -1; - } - } + startIndex = -1; + } + } - #endregion Drag and Drop - } -} \ No newline at end of file + #endregion Drag and Drop + } +} diff --git a/v2rayN/v2rayN/Views/QrcodeView.xaml b/v2rayN/v2rayN/Views/QrcodeView.xaml index d6c59457..09ad760e 100644 --- a/v2rayN/v2rayN/Views/QrcodeView.xaml +++ b/v2rayN/v2rayN/Views/QrcodeView.xaml @@ -1,49 +1,49 @@ - - - - - - - + + + + + + + - + - + - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/v2rayN/v2rayN/Views/SubSettingWindow.xaml.cs b/v2rayN/v2rayN/Views/SubSettingWindow.xaml.cs index a326354f..dcfd98ec 100644 --- a/v2rayN/v2rayN/Views/SubSettingWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/SubSettingWindow.xaml.cs @@ -1,110 +1,112 @@ -using MaterialDesignThemes.Wpf; -using ReactiveUI; using System.ComponentModel; using System.Reactive.Disposables; using System.Windows; using System.Windows.Input; +using MaterialDesignThemes.Wpf; +using ReactiveUI; namespace v2rayN.Views { - public partial class SubSettingWindow - { - public SubSettingWindow() - { - InitializeComponent(); + public partial class SubSettingWindow + { + public SubSettingWindow() + { + InitializeComponent(); - this.Owner = Application.Current.MainWindow; + this.Owner = Application.Current.MainWindow; - ViewModel = new SubSettingViewModel(UpdateViewHandler); - this.Closing += SubSettingWindow_Closing; - lstSubscription.MouseDoubleClick += LstSubscription_MouseDoubleClick; - lstSubscription.SelectionChanged += LstSubscription_SelectionChanged; - menuClose.Click += menuClose_Click; + ViewModel = new SubSettingViewModel(UpdateViewHandler); + this.Closing += SubSettingWindow_Closing; + lstSubscription.MouseDoubleClick += LstSubscription_MouseDoubleClick; + lstSubscription.SelectionChanged += LstSubscription_SelectionChanged; + menuClose.Click += menuClose_Click; - this.WhenActivated(disposables => - { - this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstSubscription.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstSubscription.SelectedItem).DisposeWith(disposables); + this.WhenActivated(disposables => + { + this.OneWayBind(ViewModel, vm => vm.SubItems, v => v.lstSubscription.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource, v => v.lstSubscription.SelectedItem).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubAddCmd, v => v.menuSubAdd).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubDeleteCmd, v => v.menuSubDelete).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubEditCmd, v => v.menuSubEdit).DisposeWith(disposables); - this.BindCommand(ViewModel, vm => vm.SubShareCmd, v => v.menuSubShare).DisposeWith(disposables); - }); - WindowsUtils.SetDarkBorder(this, AppHandler.Instance.Config.UiItem.CurrentTheme); - } + this.BindCommand(ViewModel, vm => vm.SubAddCmd, v => v.menuSubAdd).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubDeleteCmd, v => v.menuSubDelete).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubEditCmd, v => v.menuSubEdit).DisposeWith(disposables); + this.BindCommand(ViewModel, vm => vm.SubShareCmd, v => v.menuSubShare).DisposeWith(disposables); + }); + WindowsUtils.SetDarkBorder(this, AppHandler.Instance.Config.UiItem.CurrentTheme); + } - private async Task UpdateViewHandler(EViewAction action, object? obj) - { - switch (action) - { - case EViewAction.CloseWindow: - this.DialogResult = true; - break; + private async Task UpdateViewHandler(EViewAction action, object? obj) + { + switch (action) + { + case EViewAction.CloseWindow: + this.DialogResult = true; + break; - case EViewAction.ShowYesNo: - if (UI.ShowYesNo(ResUI.RemoveServer) == MessageBoxResult.No) - { - return false; - } - break; + case EViewAction.ShowYesNo: + if (UI.ShowYesNo(ResUI.RemoveServer) == MessageBoxResult.No) + { + return false; + } + break; - case EViewAction.SubEditWindow: - if (obj is null) return false; - return (new SubEditWindow((SubItem)obj)).ShowDialog() ?? false; + case EViewAction.SubEditWindow: + if (obj is null) + return false; + return new SubEditWindow((SubItem)obj).ShowDialog() ?? false; - case EViewAction.ShareSub: - if (obj is null) return false; - ShareSub((string)obj); - break; - } - return await Task.FromResult(true); - } + case EViewAction.ShareSub: + if (obj is null) + return false; + ShareSub((string)obj); + break; + } + return await Task.FromResult(true); + } - private async void ShareSub(string url) - { - if (Utils.IsNullOrEmpty(url)) - { - return; - } - var img = QRCodeHelper.GetQRCode(url); - var dialog = new QrcodeView() - { - imgQrcode = { Source = img }, - txtContent = { Text = url }, - }; + private async void ShareSub(string url) + { + if (Utils.IsNullOrEmpty(url)) + { + return; + } + var img = QRCodeHelper.GetQRCode(url); + var dialog = new QrcodeView() + { + imgQrcode = { Source = img }, + txtContent = { Text = url }, + }; - await DialogHost.Show(dialog, "SubDialog"); - } + await DialogHost.Show(dialog, "SubDialog"); + } - private void SubSettingWindow_Closing(object? sender, CancelEventArgs e) - { - if (ViewModel?.IsModified == true) - { - this.DialogResult = true; - } - } + private void SubSettingWindow_Closing(object? sender, CancelEventArgs e) + { + if (ViewModel?.IsModified == true) + { + this.DialogResult = true; + } + } - private void LstSubscription_MouseDoubleClick(object sender, MouseButtonEventArgs e) - { - ViewModel?.EditSubAsync(false); - } + private void LstSubscription_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + ViewModel?.EditSubAsync(false); + } - private void LstSubscription_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) - { - ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast().ToList(); - } + private void LstSubscription_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) + { + ViewModel.SelectedSources = lstSubscription.SelectedItems.Cast().ToList(); + } - private void menuClose_Click(object sender, System.Windows.RoutedEventArgs e) - { - if (ViewModel?.IsModified == true) - { - this.DialogResult = true; - } - else - { - this.Close(); - } - } - } -} \ No newline at end of file + private void menuClose_Click(object sender, System.Windows.RoutedEventArgs e) + { + if (ViewModel?.IsModified == true) + { + this.DialogResult = true; + } + else + { + this.Close(); + } + } + } +} diff --git a/v2rayN/v2rayN/Views/ThemeSettingView.xaml b/v2rayN/v2rayN/Views/ThemeSettingView.xaml index d51479ef..d416ab68 100644 --- a/v2rayN/v2rayN/Views/ThemeSettingView.xaml +++ b/v2rayN/v2rayN/Views/ThemeSettingView.xaml @@ -1,87 +1,87 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - - \ No newline at end of file + + + + + diff --git a/v2rayN/v2rayN/Views/ThemeSettingView.xaml.cs b/v2rayN/v2rayN/Views/ThemeSettingView.xaml.cs index 2cc80f3b..5e2a1edd 100644 --- a/v2rayN/v2rayN/Views/ThemeSettingView.xaml.cs +++ b/v2rayN/v2rayN/Views/ThemeSettingView.xaml.cs @@ -1,42 +1,43 @@ -using ReactiveUI; using System.Reactive.Disposables; +using ReactiveUI; using v2rayN.ViewModels; namespace v2rayN.Views { - /// - /// ThemeSettingView.xaml - /// - public partial class ThemeSettingView - { - public ThemeSettingView() - { - InitializeComponent(); - ViewModel = new ThemeSettingViewModel(); - foreach (ETheme it in Enum.GetValues(typeof(ETheme))) - { - if ((int)it > 2) continue; - cmbCurrentTheme.Items.Add(it.ToString()); - } + /// + /// ThemeSettingView.xaml + /// + public partial class ThemeSettingView + { + public ThemeSettingView() + { + InitializeComponent(); + ViewModel = new ThemeSettingViewModel(); + foreach (ETheme it in Enum.GetValues(typeof(ETheme))) + { + if ((int)it > 2) + continue; + cmbCurrentTheme.Items.Add(it.ToString()); + } - for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++) - { - cmbCurrentFontSize.Items.Add(i.ToString()); - } + for (int i = Global.MinFontSize; i <= Global.MinFontSize + 10; i++) + { + cmbCurrentFontSize.Items.Add(i.ToString()); + } - Global.Languages.ForEach(it => - { - cmbCurrentLanguage.Items.Add(it); - }); + Global.Languages.ForEach(it => + { + cmbCurrentLanguage.Items.Add(it); + }); - this.WhenActivated(disposables => - { - this.Bind(ViewModel, vm => vm.CurrentTheme, v => v.cmbCurrentTheme.SelectedValue).DisposeWith(disposables); - this.OneWayBind(ViewModel, vm => vm.Swatches, v => v.cmbSwatches.ItemsSource).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables); - }); - } - } -} \ No newline at end of file + this.WhenActivated(disposables => + { + this.Bind(ViewModel, vm => vm.CurrentTheme, v => v.cmbCurrentTheme.SelectedValue).DisposeWith(disposables); + this.OneWayBind(ViewModel, vm => vm.Swatches, v => v.cmbSwatches.ItemsSource).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSwatch, v => v.cmbSwatches.SelectedItem).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentFontSize, v => v.cmbCurrentFontSize.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.CurrentLanguage, v => v.cmbCurrentLanguage.Text).DisposeWith(disposables); + }); + } + } +} diff --git a/v2rayN/v2rayN/app.manifest b/v2rayN/v2rayN/app.manifest index 1246cc30..00f97e16 100644 --- a/v2rayN/v2rayN/app.manifest +++ b/v2rayN/v2rayN/app.manifest @@ -1,12 +1,12 @@ - + - - - true - PerMonitorV2 - - - + + + true + PerMonitorV2 + + + @@ -17,7 +17,7 @@ processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" - /> + /> - \ No newline at end of file +