Ecng.Interop
1.0.289
dotnet add package Ecng.Interop --version 1.0.289
NuGet\Install-Package Ecng.Interop -Version 1.0.289
<PackageReference Include="Ecng.Interop" Version="1.0.289" />
<PackageVersion Include="Ecng.Interop" Version="1.0.289" />
<PackageReference Include="Ecng.Interop" />
paket add Ecng.Interop --version 1.0.289
#r "nuget: Ecng.Interop, 1.0.289"
#:package Ecng.Interop@1.0.289
#addin nuget:?package=Ecng.Interop&version=1.0.289
#tool nuget:?package=Ecng.Interop&version=1.0.289
Ecng.Interop
A comprehensive .NET library for Platform/Invoke (P/Invoke) operations and native code interoperability. This library provides safe, easy-to-use wrappers for working with unmanaged memory, native libraries, and low-level data structures.
Table of Contents
Overview
Ecng.Interop simplifies the complexity of interoperating with native code by providing:
- Type-safe wrappers for unmanaged memory operations
- Automatic memory management with safe handles
- Helper methods for common marshaling scenarios
- Optimized fixed-size string types for performance-critical interop scenarios
- Utilities for loading and calling native libraries dynamically
Key Features
- Safe Memory Management: RAII-style memory management with
HGlobalSafeHandleandSafePointer - Dynamic Library Loading: Load and call functions from native DLLs at runtime
- String Marshaling: Support for ANSI, Unicode, UTF-8, and BSTR string formats
- Fixed-Size Strings: Pre-defined fixed-size string types (ASCII and UTF-8) for efficient marshaling
- Pointer Reading/Writing: Sequential pointer reading with
PtrReaderand type-safe pointer operations - Blittable Types: Specialized types like
BlittableDecimalfor direct memory layout compatibility - Time Structures: Compact time representations optimized for interop scenarios
- Cross-Platform: Works on Windows, Linux, and macOS
Installation
Add a reference to the Ecng.Interop project or include the compiled DLL in your project.
<ProjectReference Include="path\to\Ecng.Interop\Interop.csproj" />
Core Components
Dynamic Library Loading
Using DllLibrary Base Class
The DllLibrary class provides a managed way to load native libraries and access their functions.
using Ecng.Interop;
// Define your library wrapper
public class MyNativeLibrary : DllLibrary
{
public MyNativeLibrary(string dllPath) : base(dllPath)
{
// Retrieve function pointers as delegates
Add = GetHandler<AddDelegate>("Add");
Multiply = TryGetHandler<MultiplyDelegate>("Multiply"); // Returns null if not found
}
// Define delegate types matching native function signatures
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int AddDelegate(int a, int b);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate int MultiplyDelegate(int a, int b);
// Public wrapper methods
public Func<int, int, int> Add { get; }
public Func<int, int, int> Multiply { get; }
}
// Usage
using (var lib = new MyNativeLibrary(@"C:\path\to\native.dll"))
{
int result = lib.Add(10, 20); // Returns 30
Console.WriteLine($"Result: {result}");
// Check DLL version
Console.WriteLine($"DLL Version: {lib.DllVersion}");
}
Manual Library Loading
using Ecng.Interop;
// Load library manually
IntPtr libraryHandle = Marshaler.LoadLibrary(@"C:\path\to\library.dll");
try
{
// Get function pointer
IntPtr funcPtr = libraryHandle.GetProcAddress("MyFunction");
// Convert to delegate
var myFunc = funcPtr.GetDelegateForFunctionPointer<MyFunctionDelegate>();
// Call the function
int result = myFunc(42);
}
finally
{
// Free the library
libraryHandle.FreeLibrary();
}
Memory Management
HGlobalSafeHandle
HGlobalSafeHandle provides automatic cleanup of unmanaged memory allocated with Marshal.AllocHGlobal.
using Ecng.Interop;
// Allocate 1024 bytes of unmanaged memory
using (var handle = 1024.ToHGlobal())
{
IntPtr ptr = handle.DangerousGetHandle();
// Use the memory
Marshal.WriteInt32(ptr, 42);
int value = Marshal.ReadInt32(ptr);
Console.WriteLine($"Value: {value}"); // Output: Value: 42
}
// Memory is automatically freed when disposed
// Allocate and write a string
using (var handle = Encoding.UTF8.ToHGlobal("Hello, World!"))
{
IntPtr ptr = handle.DangerousGetHandle();
string decoded = Encoding.UTF8.ToString(ptr);
Console.WriteLine(decoded); // Output: Hello, World!
}
SafePointer
SafePointer wraps an unmanaged pointer with bounds checking and automatic shifting.
using Ecng.Interop;
// Allocate memory
IntPtr memory = Marshal.AllocHGlobal(100);
try
{
// Create a SafePointer with size boundary
var safePtr = new SafePointer(memory, 100);
// Read a value and auto-shift the pointer
int value1 = safePtr.Read<int>(autoShift: true);
int value2 = safePtr.Read<int>(autoShift: true);
// Read a structure
MyStruct myStruct = safePtr.ToStruct<MyStruct>(autoShift: true);
// Copy to byte array
byte[] buffer = new byte[20];
safePtr.CopyTo(buffer, autoShift: true);
// Manual shifting
safePtr.Shift<long>(); // Shift by sizeof(long)
safePtr.Shift(16); // Shift by 16 bytes
}
finally
{
Marshal.FreeHGlobal(memory);
}
GCHandle<T>
Generic wrapper around GCHandle for pinning managed objects.
using Ecng.Interop;
byte[] data = new byte[] { 1, 2, 3, 4, 5 };
// Pin the array in memory
using (var gcHandle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
// Create a safe pointer to the pinned data
SafePointer pointer = gcHandle.CreatePointer();
// Pass pointer to native code
NativeFunction(pointer.Pointer);
}
// Array is automatically unpinned when disposed
Pointer Utilities
PtrReader
Sequential reading from unmanaged memory pointers.
using Ecng.Interop;
IntPtr dataPtr = GetSomeNativeData();
var reader = new PtrReader(dataPtr);
// Read various types sequentially
byte b = reader.GetByte();
short s = reader.GetShort();
int i = reader.GetInt();
long l = reader.GetLong();
IntPtr p = reader.GetIntPtr();
// Read null-terminated strings
string str1 = reader.GetString();
// Read fixed-length strings
string str2 = reader.GetString(20); // Read 20 characters
Direct Pointer Operations
using Ecng.Interop;
IntPtr ptr = Marshal.AllocHGlobal(100);
try
{
// Write values
ptr.Write<int>(42);
(ptr + 4).Write<short>(100);
(ptr + 6).Write<byte>(255);
// Read values
int intValue = ptr.Read<int>();
short shortValue = (ptr + 4).Read<short>();
byte byteValue = (ptr + 6).Read<byte>();
// Copy to managed array
byte[] buffer = new byte[10];
ptr.CopyTo(buffer);
ptr.CopyTo(buffer, offset: 0, length: 10);
// Create spans (modern .NET)
Span<byte> span = ptr.ToSpan(100);
ReadOnlySpan<byte> roSpan = ptr.ToReadOnlySpan(100);
}
finally
{
ptr.FreeHGlobal();
}
String Marshaling
The library provides comprehensive string marshaling for different encodings.
using Ecng.Interop;
// ANSI strings
string text = "Hello, World!";
IntPtr ansiPtr = text.FromAnsi();
try
{
string decoded = ansiPtr.ToAnsi();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(ansiPtr);
}
// Unicode strings
IntPtr unicodePtr = text.FromUnicode();
try
{
string decoded = unicodePtr.ToUnicode();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(unicodePtr);
}
// Platform-dependent (Auto)
IntPtr autoPtr = text.FromAuto();
try
{
string decoded = autoPtr.ToAuto();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeHGlobal(autoPtr);
}
// BSTR (COM interop)
IntPtr bstrPtr = text.FromBSTR();
try
{
string decoded = bstrPtr.ToBSTR();
Console.WriteLine(decoded);
}
finally
{
Marshal.FreeBSTR(bstrPtr);
}
// UTF-8 with unsafe pointers
unsafe
{
byte* utf8Buffer = stackalloc byte[100];
text.ToUtf8(utf8Buffer, 100);
string decoded = 100.ToUtf8(utf8Buffer);
Console.WriteLine(decoded);
}
// ASCII with unsafe pointers
unsafe
{
byte* asciiBuffer = stackalloc byte[100];
text.ToAscii(asciiBuffer, 100);
string decoded = 100.ToAscii(asciiBuffer);
Console.WriteLine(decoded);
}
Type Marshaling
Structure Marshaling
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct MyNativeStruct
{
public int Id;
public double Value;
public byte Flag;
}
// Marshal from structure to pointer
MyNativeStruct data = new MyNativeStruct
{
Id = 1,
Value = 3.14,
Flag = 1
};
IntPtr ptr = data.StructToPtr();
try
{
// Pass ptr to native code
NativeFunction(ptr);
// Marshal back from pointer to structure
MyNativeStruct result = ptr.ToStruct<MyNativeStruct>();
Console.WriteLine($"ID: {result.Id}, Value: {result.Value}");
}
finally
{
Marshal.FreeHGlobal(ptr);
}
// Get pointer and size
(IntPtr ptr, int size) = data.StructToPtrEx();
try
{
Console.WriteLine($"Structure size: {size} bytes");
// Use ptr and size
}
finally
{
Marshal.FreeHGlobal(ptr);
}
BlittableDecimal
BlittableDecimal is a struct that matches the memory layout of decimal for direct marshaling.
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct PriceData
{
public int Quantity;
public BlittableDecimal Price; // Can be marshaled directly
}
PriceData data = new PriceData
{
Quantity = 100,
Price = (BlittableDecimal)123.45m
};
// Marshal to unmanaged memory
IntPtr ptr = data.StructToPtr();
try
{
// Pass to native code
NativeFunction(ptr);
// Read back
PriceData result = ptr.ToStruct<PriceData>();
decimal price = result.Price; // Implicit conversion
Console.WriteLine($"Quantity: {result.Quantity}, Price: {price}");
}
finally
{
Marshal.FreeHGlobal(ptr);
}
Fixed-Size Strings
Fixed-size string types provide efficient marshaling for scenarios where string length is known at compile time.
UTF-8 Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct NetworkPacket
{
public int PacketId;
public Utf8String16 Symbol; // 16 bytes
public Utf8String32 Message; // 32 bytes
public Utf8String8 Source; // 8 bytes
}
// Usage
NetworkPacket packet = new NetworkPacket
{
PacketId = 123,
Symbol = (Utf8String16)"AAPL",
Message = (Utf8String32)"Order executed",
Source = (Utf8String8)"NYSE"
};
// Convert to strings
string symbol = packet.Symbol; // Implicit conversion
string message = packet.Message;
string source = packet.Source.ToString();
Console.WriteLine($"Symbol: {symbol}, Message: {message}");
// Available UTF-8 sizes: 1-33, 48, 64, 65, 128, 129, 256
ASCII Fixed Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct LegacyRecord
{
public int RecordId;
public AsciiString32 Name; // 32 bytes ASCII
public AsciiString64 Address; // 64 bytes ASCII
public AsciiString16 City; // 16 bytes ASCII
}
// Usage
LegacyRecord record = new LegacyRecord
{
RecordId = 1,
Name = (AsciiString32)"John Doe",
Address = (AsciiString64)"123 Main Street",
City = (AsciiString16)"New York"
};
// Convert to strings
string name = record.Name; // Implicit conversion
string address = record.Address;
string city = record.City.ToString();
Console.WriteLine($"{name} from {city}");
// Available ASCII sizes: 1-32, 64, 128
Time Structures
Compact time representations optimized for native interop.
Time4Sec (4-byte time with second resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct LogEntry
{
public Time4Sec Timestamp; // 4 bytes instead of 8
public int EventId;
}
// Usage
LogEntry entry = new LogEntry
{
Timestamp = (Time4Sec)DateTime.UtcNow,
EventId = 123
};
// Convert to DateTime
DateTime dt = entry.Timestamp; // Implicit conversion
DateTimeOffset dto = entry.Timestamp;
Console.WriteLine($"Event at: {dt}");
Console.WriteLine($"Formatted: {entry.Timestamp.ToString("yyyy-MM-dd HH:mm:ss", null)}");
Time8Mls (8-byte time with millisecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct TradeData
{
public Time8Mls ExecutionTime;
public double Price;
public int Volume;
}
// Usage
TradeData trade = new TradeData
{
ExecutionTime = (Time8Mls)DateTime.UtcNow,
Price = 150.25,
Volume = 1000
};
DateTime executionTime = trade.ExecutionTime;
Console.WriteLine($"Trade executed at: {executionTime:yyyy-MM-dd HH:mm:ss.fff}");
Time8Mcs (8-byte time with microsecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct HighFrequencyTick
{
public Time8Mcs Timestamp;
public double BidPrice;
public double AskPrice;
}
// Usage
HighFrequencyTick tick = new HighFrequencyTick
{
Timestamp = (Time8Mcs)DateTime.UtcNow,
BidPrice = 100.50,
AskPrice = 100.51
};
DateTime tickTime = tick.Timestamp;
Console.WriteLine($"Tick at: {tickTime:HH:mm:ss.ffffff}");
TimeNano (nanosecond resolution)
using Ecng.Interop;
[StructLayout(LayoutKind.Sequential)]
public struct PrecisionEvent
{
public TimeNano Timestamp;
public int EventType;
}
// Usage
PrecisionEvent evt = new PrecisionEvent
{
Timestamp = (TimeNano)DateTime.UtcNow,
EventType = 5
};
DateTime eventTime = evt.Timestamp;
Console.WriteLine($"Precise event time: {eventTime:O}");
Hardware Information
Generate hardware-based identifiers for licensing or device identification.
using Ecng.Interop;
// Synchronous
string hardwareId = HardwareInfo.GetId();
Console.WriteLine($"Hardware ID: {hardwareId}");
// Asynchronous
string hardwareIdAsync = await HardwareInfo.GetIdAsync();
Console.WriteLine($"Hardware ID: {hardwareIdAsync}");
// With cancellation
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
try
{
string id = await HardwareInfo.GetIdAsync(cts.Token);
Console.WriteLine($"Hardware ID: {id}");
}
catch (OperationCanceledException)
{
Console.WriteLine("Hardware ID retrieval timed out");
}
The hardware ID is generated based on:
- Windows: CPU ID + Motherboard Serial Number (or MAC Address)
- Linux: Root partition UUID
- macOS: Platform UUID
Usage Examples
Complete Example: Calling Native Library
using Ecng.Interop;
using System.Runtime.InteropServices;
// Define the native structure
[StructLayout(LayoutKind.Sequential)]
public struct Point3D
{
public double X;
public double Y;
public double Z;
}
// Create library wrapper
public class MathLibrary : DllLibrary
{
public MathLibrary() : base("mathlib.dll")
{
CalculateDistance = GetHandler<CalculateDistanceDelegate>("CalculateDistance");
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate double CalculateDistanceDelegate(IntPtr point1, IntPtr point2);
private CalculateDistanceDelegate CalculateDistance;
public double GetDistance(Point3D p1, Point3D p2)
{
IntPtr ptr1 = p1.StructToPtr();
IntPtr ptr2 = p2.StructToPtr();
try
{
return CalculateDistance(ptr1, ptr2);
}
finally
{
ptr1.FreeHGlobal();
ptr2.FreeHGlobal();
}
}
}
// Usage
using (var lib = new MathLibrary())
{
Point3D p1 = new Point3D { X = 0, Y = 0, Z = 0 };
Point3D p2 = new Point3D { X = 3, Y = 4, Z = 0 };
double distance = lib.GetDistance(p1, p2);
Console.WriteLine($"Distance: {distance}"); // Output: Distance: 5
}
Complete Example: Working with Native Arrays
using Ecng.Interop;
using System.Runtime.InteropServices;
// Allocate array in unmanaged memory
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
int sizeInBytes = sizeof(int) * numbers.Length;
using (var handle = sizeInBytes.ToHGlobal())
{
IntPtr ptr = handle.DangerousGetHandle();
// Copy managed array to unmanaged memory
Marshal.Copy(numbers, 0, ptr, numbers.Length);
// Create SafePointer for safe iteration
var safePtr = new SafePointer(ptr, sizeInBytes);
// Read values
for (int i = 0; i < numbers.Length; i++)
{
int value = safePtr.Read<int>(autoShift: true);
Console.WriteLine($"Value {i}: {value}");
}
}
Complete Example: Reading Native Structure with Strings
using Ecng.Interop;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public unsafe struct UserData
{
public int UserId;
public AsciiString32 UserName;
public AsciiString64 Email;
public Time8Mls RegistrationDate;
}
// Read from native memory
IntPtr nativeDataPtr = GetUserDataFromNativeCode();
UserData user = nativeDataPtr.ToStruct<UserData>();
Console.WriteLine($"User ID: {user.UserId}");
Console.WriteLine($"Name: {(string)user.UserName}");
Console.WriteLine($"Email: {(string)user.Email}");
Console.WriteLine($"Registered: {(DateTime)user.RegistrationDate}");
Best Practices
Memory Management
- Always dispose resources: Use
usingstatements forDllLibrary,HGlobalSafeHandle, andGCHandle<T> - Prefer safe wrappers: Use
SafePointerover rawIntPtrwhen possible for bounds checking - Match allocation/deallocation: Use
FreeHGlobal()for memory allocated withAllocHGlobal()
// Good
using (var handle = 1024.ToHGlobal())
{
// Use memory
} // Automatically freed
// Avoid
IntPtr ptr = Marshal.AllocHGlobal(1024);
// ... might forget to free
String Marshaling
- Choose the right encoding: Use UTF-8 for modern APIs, ASCII for legacy systems
- Use fixed-size strings for structures: More efficient than string marshaling
- Be aware of null terminators: ANSI/Unicode strings are null-terminated
// Good for structures
[StructLayout(LayoutKind.Sequential)]
public struct Config
{
public Utf8String32 Name; // Fixed size, no allocation
}
// Avoid for structures (requires marshaling)
[StructLayout(LayoutKind.Sequential)]
public struct ConfigBad
{
[MarshalAs(UnmanagedType.LPStr)]
public string Name; // Requires allocation and marshaling
}
Platform Considerations
- Check platform: Use
OperatingSystemchecks when necessary - Handle pointer size: Use
IntPtr.Sizefor platform-dependent sizes - Test on target platforms: Marshaling behavior can differ between platforms
if (OperatingSystem.IsWindows())
{
// Windows-specific code
}
else if (OperatingSystem.IsLinux())
{
// Linux-specific code
}
Performance
- Pin arrays for bulk operations: Use
GCHandle<T>to avoid copying - Use stackalloc for small buffers: Avoid heap allocation when possible
- Batch operations: Minimize transitions between managed and unmanaged code
// Good: Single pinning for bulk operation
byte[] data = new byte[1000];
using (var handle = new GCHandle<byte[]>(data, GCHandleType.Pinned))
{
SafePointer ptr = handle.CreatePointer();
NativeBulkOperation(ptr.Pointer, data.Length);
}
// Avoid: Multiple small transitions
for (int i = 0; i < 1000; i++)
{
NativeSingleOperation(data[i]); // Many transitions
}
Platform Support
- .NET Standard 2.0: Compatible with .NET Framework 4.6.1+ and .NET Core 2.0+
- .NET 6.0: Full support
- .NET 10.0: Full support with latest features
- Operating Systems: Windows, Linux, macOS
Dependencies
- Ecng.Common: Core utilities
- WmiLight: Windows Management Instrumentation for hardware info
- Microsoft.Windows.CsWin32: Windows API source generator
Thread Safety
- Most classes are not thread-safe by default
DllLibraryinstances should not be shared between threads without synchronization- Memory allocation/deallocation is thread-safe (handled by the runtime)
License
This library is part of the StockSharp/Ecng project.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Ecng.Common (>= 1.0.231)
- WmiLight (>= 6.5.2)
-
net10.0
- Ecng.Common (>= 1.0.231)
- WmiLight (>= 6.5.2)
-
net6.0
- Ecng.Common (>= 1.0.231)
- WmiLight (>= 6.5.2)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Ecng.Interop:
| Package | Downloads |
|---|---|
|
StockSharp.Algo
Trading algorithms. More info on web site https://stocksharp.com/store/ |
|
|
StockSharp.Licensing
Licensing components. More info on web site https://stocksharp.com/store/ |
|
|
Ecng.Interop.Windows
Ecng system framework |
|
|
Ecng.ManagedWinapi
Ecng system framework |
|
|
StockSharp.RtsHistory
Trading and algorithmic trading platform (stock markets, forex, bitcoins and options). .NET API for InteractiveBrokers, GainCapital, OANDA, FIX/FAST, Binance etc. More info on web site https://stocksharp.com/store/api/ |
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on Ecng.Interop:
| Repository | Stars |
|---|---|
|
StockSharp/StockSharp
Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options).
|
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.289 | 39 | 12/22/2025 |
| 1.0.288 | 46 | 12/21/2025 |
| 1.0.287 | 205 | 12/19/2025 |
| 1.0.286 | 191 | 12/19/2025 |
| 1.0.285 | 306 | 12/17/2025 |
| 1.0.284 | 315 | 12/15/2025 |
| 1.0.283 | 175 | 12/12/2025 |
| 1.0.282 | 125 | 12/12/2025 |
| 1.0.281 | 259 | 11/29/2025 |
| 1.0.280 | 124 | 11/28/2025 |
| 1.0.279 | 128 | 11/28/2025 |
| 1.0.278 | 180 | 11/27/2025 |
| 1.0.277 | 281 | 11/24/2025 |
| 1.0.276 | 189 | 11/24/2025 |
| 1.0.275 | 190 | 11/23/2025 |
| 1.0.274 | 243 | 11/22/2025 |
| 1.0.273 | 487 | 11/20/2025 |
| 1.0.272 | 444 | 11/18/2025 |
| 1.0.271 | 395 | 11/18/2025 |
| 1.0.270 | 381 | 11/13/2025 |
| 1.0.269 | 277 | 11/13/2025 |
| 1.0.268 | 268 | 11/10/2025 |
| 1.0.267 | 1,150 | 11/1/2025 |
| 1.0.266 | 242 | 10/28/2025 |
| 1.0.265 | 251 | 10/27/2025 |
| 1.0.264 | 204 | 10/27/2025 |
| 1.0.263 | 122 | 10/25/2025 |
| 1.0.262 | 1,192 | 10/3/2025 |
| 1.0.261 | 427 | 9/25/2025 |
| 1.0.260 | 4,892 | 8/30/2025 |
| 1.0.259 | 451 | 8/14/2025 |
| 1.0.258 | 3,260 | 7/14/2025 |
| 1.0.257 | 251 | 7/13/2025 |
| 1.0.256 | 205 | 7/13/2025 |
| 1.0.255 | 172 | 7/12/2025 |
| 1.0.254 | 693 | 7/8/2025 |
| 1.0.253 | 2,662 | 6/16/2025 |
| 1.0.252 | 379 | 6/9/2025 |
| 1.0.251 | 294 | 6/8/2025 |
| 1.0.250 | 848 | 5/21/2025 |
| 1.0.249 | 212 | 5/17/2025 |
| 1.0.248 | 886 | 5/12/2025 |
| 1.0.247 | 278 | 5/12/2025 |
| 1.0.246 | 276 | 5/12/2025 |
| 1.0.245 | 220 | 5/11/2025 |
| 1.0.244 | 211 | 5/11/2025 |
| 1.0.243 | 193 | 5/11/2025 |
| 1.0.242 | 204 | 5/11/2025 |
| 1.0.241 | 232 | 5/6/2025 |
| 1.0.240 | 217 | 5/2/2025 |
| 1.0.239 | 339 | 4/17/2025 |
| 1.0.238 | 274 | 4/12/2025 |
| 1.0.237 | 1,911 | 3/20/2025 |
| 1.0.236 | 240 | 3/19/2025 |
| 1.0.235 | 1,597 | 2/26/2025 |
| 1.0.234 | 195 | 2/26/2025 |
| 1.0.233 | 1,705 | 2/5/2025 |
| 1.0.232 | 286 | 1/21/2025 |
| 1.0.231 | 208 | 1/14/2025 |
| 1.0.230 | 200 | 1/12/2025 |
| 1.0.229 | 187 | 1/10/2025 |
| 1.0.228 | 2,958 | 11/18/2024 |
| 1.0.227 | 758 | 11/7/2024 |
| 1.0.226 | 359 | 10/19/2024 |
| 1.0.225 | 2,205 | 10/5/2024 |
| 1.0.224 | 1,826 | 9/18/2024 |
| 1.0.223 | 222 | 9/17/2024 |
| 1.0.222 | 1,449 | 9/4/2024 |
| 1.0.221 | 204 | 9/3/2024 |
| 1.0.220 | 202 | 9/1/2024 |
| 1.0.219 | 1,210 | 8/23/2024 |
| 1.0.218 | 240 | 8/22/2024 |
| 1.0.217 | 4,602 | 6/12/2024 |
| 1.0.216 | 988 | 5/28/2024 |
| 1.0.215 | 2,177 | 5/4/2024 |
| 1.0.214 | 1,407 | 4/14/2024 |
| 1.0.213 | 1,698 | 3/28/2024 |
| 1.0.212 | 266 | 3/17/2024 |
| 1.0.211 | 1,681 | 2/23/2024 |
| 1.0.210 | 229 | 2/23/2024 |
| 1.0.209 | 1,740 | 2/18/2024 |
| 1.0.208 | 228 | 2/16/2024 |
| 1.0.207 | 208 | 2/16/2024 |
| 1.0.206 | 1,088 | 2/13/2024 |
| 1.0.205 | 1,003 | 2/8/2024 |
| 1.0.204 | 1,225 | 2/4/2024 |
| 1.0.203 | 1,332 | 1/23/2024 |
| 1.0.202 | 937 | 1/12/2024 |
| 1.0.201 | 1,609 | 1/2/2024 |
| 1.0.200 | 235 | 12/29/2023 |
| 1.0.199 | 13,052 | 12/10/2023 |
| 1.0.198 | 15,405 | 11/12/2023 |
| 1.0.197 | 11,729 | 11/10/2023 |
| 1.0.196 | 11,715 | 11/10/2023 |
| 1.0.195 | 11,724 | 11/9/2023 |
| 1.0.194 | 11,755 | 11/3/2023 |
| 1.0.193 | 11,729 | 11/1/2023 |
| 1.0.192 | 11,718 | 11/1/2023 |
| 1.0.191 | 16,702 | 9/8/2023 |
| 1.0.190 | 11,766 | 9/8/2023 |
| 1.0.189 | 255 | 9/8/2023 |
| 1.0.188 | 287 | 9/6/2023 |
| 1.0.187 | 11,796 | 9/3/2023 |
| 1.0.186 | 11,869 | 8/21/2023 |
| 1.0.185 | 327 | 8/14/2023 |
| 1.0.184 | 11,827 | 8/10/2023 |
| 1.0.183 | 16,775 | 6/29/2023 |
| 1.0.182 | 14,103 | 5/27/2023 |
| 1.0.181 | 11,860 | 5/19/2023 |
| 1.0.180 | 13,681 | 5/14/2023 |
| 1.0.179 | 13,231 | 5/8/2023 |
| 1.0.178 | 432 | 4/21/2023 |
| 1.0.177 | 18,267 | 4/3/2023 |
| 1.0.176 | 12,105 | 3/13/2023 |
| 1.0.175 | 14,459 | 3/6/2023 |
| 1.0.174 | 456 | 2/26/2023 |
| 1.0.173 | 19,357 | 2/9/2023 |
| 1.0.172 | 14,667 | 2/7/2023 |
| 1.0.171 | 11,977 | 2/4/2023 |
| 1.0.170 | 14,933 | 2/2/2023 |
| 1.0.169 | 14,967 | 1/30/2023 |
| 1.0.168 | 557 | 1/18/2023 |
| 1.0.167 | 19,597 | 12/30/2022 |
| 1.0.166 | 509 | 12/23/2022 |
| 1.0.165 | 501 | 12/14/2022 |
| 1.0.164 | 471 | 12/14/2022 |
| 1.0.163 | 457 | 12/14/2022 |
| 1.0.162 | 493 | 12/14/2022 |
| 1.0.161 | 470 | 12/14/2022 |
| 1.0.160 | 16,139 | 12/12/2022 |
| 1.0.159 | 15,901 | 12/8/2022 |
| 1.0.158 | 551 | 12/4/2022 |
| 1.0.157 | 492 | 12/4/2022 |
| 1.0.156 | 12,063 | 11/30/2022 |
| 1.0.155 | 12,031 | 11/29/2022 |
| 1.0.154 | 12,039 | 11/28/2022 |
| 1.0.153 | 12,076 | 11/18/2022 |
| 1.0.152 | 16,746 | 11/11/2022 |
| 1.0.151 | 12,037 | 11/11/2022 |
| 1.0.150 | 538 | 11/10/2022 |
| 1.0.149 | 12,094 | 11/5/2022 |
| 1.0.148 | 12,060 | 11/4/2022 |
| 1.0.147 | 30,372 | 11/1/2022 |
| 1.0.146 | 32,771 | 10/16/2022 |
| 1.0.145 | 12,228 | 9/25/2022 |
| 1.0.144 | 705 | 9/10/2022 |
| 1.0.143 | 633 | 9/10/2022 |
| 1.0.142 | 53,928 | 9/8/2022 |
| 1.0.141 | 12,186 | 9/8/2022 |
| 1.0.140 | 630 | 9/8/2022 |
| 1.0.139 | 12,182 | 9/4/2022 |
| 1.0.138 | 12,157 | 9/4/2022 |
| 1.0.137 | 83,811 | 8/24/2022 |
| 1.0.136 | 12,247 | 8/8/2022 |
| 1.0.135 | 12,154 | 8/8/2022 |
| 1.0.134 | 12,213 | 7/26/2022 |
| 1.0.133 | 12,160 | 7/26/2022 |
| 1.0.132 | 54,890 | 7/19/2022 |
| 1.0.131 | 42,352 | 7/18/2022 |
| 1.0.130 | 12,224 | 7/13/2022 |
| 1.0.129 | 12,208 | 7/8/2022 |
| 1.0.128 | 12,237 | 6/30/2022 |
| 1.0.127 | 12,249 | 6/18/2022 |
| 1.0.126 | 12,225 | 6/6/2022 |
| 1.0.125 | 96,133 | 4/30/2022 |
| 1.0.124 | 12,237 | 4/20/2022 |
| 1.0.123 | 12,245 | 4/10/2022 |
| 1.0.122 | 12,195 | 4/7/2022 |
| 1.0.121 | 12,217 | 4/7/2022 |
| 1.0.120 | 12,262 | 4/2/2022 |
| 1.0.119 | 19,179 | 3/29/2022 |
| 1.0.118 | 12,182 | 3/27/2022 |
| 1.0.117 | 689 | 3/27/2022 |
| 1.0.116 | 97,184 | 2/20/2022 |
| 1.0.115 | 12,198 | 2/20/2022 |
| 1.0.114 | 12,218 | 2/20/2022 |
| 1.0.113 | 12,219 | 2/20/2022 |
| 1.0.112 | 12,230 | 2/20/2022 |
| 1.0.111 | 12,197 | 2/20/2022 |
| 1.0.110 | 12,218 | 2/20/2022 |
| 1.0.109 | 12,225 | 2/20/2022 |
| 1.0.108 | 12,191 | 2/20/2022 |
| 1.0.107 | 12,185 | 2/19/2022 |
| 1.0.106 | 139,383 | 1/24/2022 |
| 1.0.105 | 156,112 | 12/29/2021 |
| 1.0.104 | 37,233 | 12/20/2021 |
| 1.0.103 | 12,141 | 12/13/2021 |
| 1.0.102 | 37,397 | 12/7/2021 |
| 1.0.101 | 12,050 | 12/7/2021 |
| 1.0.100 | 37,501 | 12/6/2021 |
| 1.0.99 | 12,058 | 12/6/2021 |
| 1.0.98 | 12,046 | 12/5/2021 |
| 1.0.97 | 541 | 12/2/2021 |
| 1.0.96 | 38,903 | 11/29/2021 |
| 1.0.95 | 37,078 | 11/22/2021 |
| 1.0.94 | 12,168 | 11/17/2021 |
| 1.0.93 | 12,126 | 11/14/2021 |
| 1.0.92 | 38,102 | 11/13/2021 |
| 1.0.91 | 12,164 | 11/11/2021 |
| 1.0.90 | 12,089 | 11/11/2021 |
| 1.0.89 | 12,124 | 11/10/2021 |
| 1.0.88 | 12,136 | 11/9/2021 |
| 1.0.87 | 67,232 | 11/5/2021 |
| 1.0.86 | 12,142 | 11/5/2021 |
| 1.0.85 | 12,100 | 11/4/2021 |
| 1.0.84 | 12,112 | 11/4/2021 |
| 1.0.83 | 12,117 | 11/3/2021 |
| 1.0.82 | 12,202 | 10/30/2021 |
| 1.0.81 | 40,657 | 10/21/2021 |
| 1.0.80 | 12,211 | 10/17/2021 |
| 1.0.79 | 66,693 | 10/14/2021 |
| 1.0.78 | 16,363 | 10/13/2021 |
| 1.0.77 | 12,148 | 10/12/2021 |
| 1.0.76 | 40,565 | 10/11/2021 |
| 1.0.75 | 12,095 | 10/9/2021 |
| 1.0.74 | 32,347 | 10/7/2021 |
| 1.0.73 | 42,681 | 10/7/2021 |
| 1.0.72 | 12,091 | 10/7/2021 |
| 1.0.71 | 626 | 10/6/2021 |
| 1.0.70 | 12,179 | 9/28/2021 |
| 1.0.69 | 41,529 | 9/23/2021 |
| 1.0.68 | 12,213 | 9/11/2021 |
| 1.0.67 | 12,137 | 9/10/2021 |
| 1.0.66 | 12,138 | 9/9/2021 |
| 1.0.65 | 12,087 | 9/8/2021 |
| 1.0.64 | 12,146 | 9/8/2021 |
| 1.0.63 | 40,037 | 9/6/2021 |
| 1.0.62 | 624 | 8/31/2021 |
| 1.0.61 | 581 | 8/30/2021 |
| 1.0.60 | 40,978 | 7/31/2021 |
| 1.0.59 | 65,720 | 7/30/2021 |
| 1.0.58 | 12,170 | 7/26/2021 |
| 1.0.57 | 92,398 | 7/5/2021 |
| 1.0.56 | 12,176 | 7/1/2021 |
| 1.0.55 | 68,257 | 6/4/2021 |
| 1.0.54 | 93,496 | 4/26/2021 |
| 1.0.53 | 40,014 | 4/19/2021 |
| 1.0.52 | 145,774 | 4/7/2021 |
| 1.0.51 | 39,284 | 4/3/2021 |
| 1.0.50 | 161,238 | 3/22/2021 |
| 1.0.49 | 112,391 | 3/4/2021 |
| 1.0.48 | 39,327 | 2/26/2021 |
| 1.0.47 | 161,150 | 2/2/2021 |
| 1.0.46 | 51,123 | 1/26/2021 |
| 1.0.45 | 62,064 | 1/24/2021 |
| 1.0.44 | 639 | 1/24/2021 |
| 1.0.43 | 694 | 1/23/2021 |
| 1.0.42 | 50,939 | 1/20/2021 |
| 1.0.41 | 12,184 | 1/20/2021 |
| 1.0.40 | 37,348 | 1/18/2021 |
| 1.0.39 | 609 | 1/18/2021 |
| 1.0.38 | 36,460 | 1/16/2021 |
| 1.0.37 | 117,368 | 12/16/2020 |
| 1.0.36 | 64,149 | 12/14/2020 |
| 1.0.35 | 41,664 | 12/9/2020 |
| 1.0.34 | 12,551 | 12/7/2020 |
| 1.0.33 | 12,674 | 12/6/2020 |
| 1.0.32 | 12,589 | 12/2/2020 |
| 1.0.31 | 12,563 | 12/2/2020 |
| 1.0.30 | 38,219 | 12/1/2020 |
| 1.0.29 | 153,780 | 11/12/2020 |
| 1.0.29-atestpub | 725 | 11/11/2020 |
| 1.0.28 | 38,162 | 10/11/2020 |
| 1.0.27 | 97,989 | 9/9/2020 |
| 1.0.26 | 36,929 | 9/3/2020 |
| 1.0.25 | 37,475 | 8/20/2020 |
| 1.0.24 | 85,850 | 8/9/2020 |
| 1.0.23 | 25,340 | 7/28/2020 |
| 1.0.22 | 36,757 | 7/19/2020 |
| 1.0.21 | 59,873 | 7/6/2020 |
| 1.0.20 | 86,097 | 6/6/2020 |
| 1.0.19 | 26,342 | 6/4/2020 |
| 1.0.18 | 50,125 | 5/29/2020 |
| 1.0.17 | 61,552 | 5/21/2020 |
| 1.0.16 | 1,264 | 5/17/2020 |
| 1.0.15 | 64,739 | 5/12/2020 |
| 1.0.14 | 116,880 | 5/4/2020 |
| 1.0.13 | 15,998 | 4/24/2020 |
| 1.0.12 | 4,943 | 4/22/2020 |
| 1.0.11 | 12,907 | 4/22/2020 |
| 1.0.10 | 12,927 | 4/21/2020 |
| 1.0.9 | 40,933 | 4/18/2020 |
| 1.0.8 | 27,367 | 4/16/2020 |
| 1.0.7 | 1,467 | 4/16/2020 |
| 1.0.6 | 35,100 | 4/15/2020 |
| 1.0.5 | 36,993 | 4/11/2020 |
| 1.0.4 | 36,415 | 4/3/2020 |
| 1.0.3 | 1,451 | 4/1/2020 |
| 1.0.2 | 23,565 | 3/27/2020 |
| 1.0.1 | 22,503 | 3/22/2020 |
| 1.0.0 | 3,338 | 3/22/2020 |