Ecng.Interop
1.0.299
See the version list below for details.
dotnet add package Ecng.Interop --version 1.0.299
NuGet\Install-Package Ecng.Interop -Version 1.0.299
<PackageReference Include="Ecng.Interop" Version="1.0.299" />
<PackageVersion Include="Ecng.Interop" Version="1.0.299" />
<PackageReference Include="Ecng.Interop" />
paket add Ecng.Interop --version 1.0.299
#r "nuget: Ecng.Interop, 1.0.299"
#:package Ecng.Interop@1.0.299
#addin nuget:?package=Ecng.Interop&version=1.0.299
#tool nuget:?package=Ecng.Interop&version=1.0.299
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. |
NuGet packages (7)
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.301 | 44 | 1/4/2026 |
| 1.0.300 | 57 | 1/1/2026 |
| 1.0.299 | 61 | 12/31/2025 |
| 1.0.298 | 93 | 12/30/2025 |
| 1.0.297 | 83 | 12/30/2025 |
| 1.0.296 | 90 | 12/29/2025 |
| 1.0.295 | 95 | 12/26/2025 |
| 1.0.294 | 92 | 12/26/2025 |
| 1.0.293 | 88 | 12/26/2025 |
| 1.0.292 | 100 | 12/26/2025 |
| 1.0.291 | 172 | 12/25/2025 |
| 1.0.290 | 176 | 12/25/2025 |
| 1.0.289 | 182 | 12/22/2025 |
| 1.0.288 | 160 | 12/21/2025 |
| 1.0.287 | 251 | 12/19/2025 |
| 1.0.286 | 236 | 12/19/2025 |
| 1.0.285 | 335 | 12/17/2025 |
| 1.0.284 | 319 | 12/15/2025 |
| 1.0.283 | 185 | 12/12/2025 |
| 1.0.282 | 135 | 12/12/2025 |
| 1.0.281 | 842 | 11/29/2025 |
| 1.0.280 | 701 | 11/28/2025 |
| 1.0.279 | 705 | 11/28/2025 |
| 1.0.278 | 758 | 11/27/2025 |
| 1.0.277 | 857 | 11/24/2025 |
| 1.0.276 | 766 | 11/24/2025 |
| 1.0.275 | 768 | 11/23/2025 |
| 1.0.274 | 817 | 11/22/2025 |
| 1.0.273 | 1,068 | 11/20/2025 |
| 1.0.272 | 1,021 | 11/18/2025 |
| 1.0.271 | 972 | 11/18/2025 |
| 1.0.270 | 959 | 11/13/2025 |
| 1.0.269 | 853 | 11/13/2025 |
| 1.0.268 | 844 | 11/10/2025 |
| 1.0.267 | 1,728 | 11/1/2025 |
| 1.0.266 | 819 | 10/28/2025 |
| 1.0.265 | 828 | 10/27/2025 |
| 1.0.264 | 781 | 10/27/2025 |
| 1.0.263 | 697 | 10/25/2025 |
| 1.0.262 | 1,767 | 10/3/2025 |
| 1.0.261 | 1,004 | 9/25/2025 |
| 1.0.260 | 5,583 | 8/30/2025 |
| 1.0.259 | 1,025 | 8/14/2025 |
| 1.0.258 | 3,842 | 7/14/2025 |
| 1.0.257 | 826 | 7/13/2025 |
| 1.0.256 | 781 | 7/13/2025 |
| 1.0.255 | 745 | 7/12/2025 |
| 1.0.254 | 1,270 | 7/8/2025 |
| 1.0.253 | 3,240 | 6/16/2025 |
| 1.0.252 | 955 | 6/9/2025 |
| 1.0.251 | 867 | 6/8/2025 |
| 1.0.250 | 1,424 | 5/21/2025 |
| 1.0.249 | 788 | 5/17/2025 |
| 1.0.248 | 1,463 | 5/12/2025 |
| 1.0.247 | 854 | 5/12/2025 |
| 1.0.246 | 851 | 5/12/2025 |
| 1.0.245 | 794 | 5/11/2025 |
| 1.0.244 | 789 | 5/11/2025 |
| 1.0.243 | 767 | 5/11/2025 |
| 1.0.242 | 780 | 5/11/2025 |
| 1.0.241 | 805 | 5/6/2025 |
| 1.0.240 | 793 | 5/2/2025 |
| 1.0.239 | 914 | 4/17/2025 |
| 1.0.238 | 849 | 4/12/2025 |
| 1.0.237 | 2,490 | 3/20/2025 |
| 1.0.236 | 814 | 3/19/2025 |
| 1.0.235 | 2,179 | 2/26/2025 |
| 1.0.234 | 772 | 2/26/2025 |
| 1.0.233 | 2,281 | 2/5/2025 |
| 1.0.232 | 861 | 1/21/2025 |
| 1.0.231 | 787 | 1/14/2025 |
| 1.0.230 | 774 | 1/12/2025 |
| 1.0.229 | 764 | 1/10/2025 |
| 1.0.228 | 3,537 | 11/18/2024 |
| 1.0.227 | 1,334 | 11/7/2024 |
| 1.0.226 | 938 | 10/19/2024 |
| 1.0.225 | 2,780 | 10/5/2024 |
| 1.0.224 | 2,401 | 9/18/2024 |
| 1.0.223 | 799 | 9/17/2024 |
| 1.0.222 | 2,025 | 9/4/2024 |
| 1.0.221 | 778 | 9/3/2024 |
| 1.0.220 | 778 | 9/1/2024 |
| 1.0.219 | 1,786 | 8/23/2024 |
| 1.0.218 | 815 | 8/22/2024 |
| 1.0.217 | 5,176 | 6/12/2024 |
| 1.0.216 | 1,564 | 5/28/2024 |
| 1.0.215 | 2,751 | 5/4/2024 |
| 1.0.214 | 1,985 | 4/14/2024 |
| 1.0.213 | 2,273 | 3/28/2024 |
| 1.0.212 | 843 | 3/17/2024 |
| 1.0.211 | 2,256 | 2/23/2024 |
| 1.0.210 | 802 | 2/23/2024 |
| 1.0.209 | 2,315 | 2/18/2024 |
| 1.0.208 | 803 | 2/16/2024 |
| 1.0.207 | 782 | 2/16/2024 |
| 1.0.206 | 1,664 | 2/13/2024 |
| 1.0.205 | 1,578 | 2/8/2024 |
| 1.0.204 | 1,808 | 2/4/2024 |
| 1.0.203 | 1,908 | 1/23/2024 |
| 1.0.202 | 1,513 | 1/12/2024 |
| 1.0.201 | 2,183 | 1/2/2024 |
| 1.0.200 | 815 | 12/29/2023 |
| 1.0.199 | 19,658 | 12/10/2023 |
| 1.0.198 | 22,007 | 11/12/2023 |
| 1.0.197 | 18,330 | 11/10/2023 |
| 1.0.196 | 18,309 | 11/10/2023 |
| 1.0.195 | 18,325 | 11/9/2023 |
| 1.0.194 | 18,350 | 11/3/2023 |
| 1.0.193 | 18,328 | 11/1/2023 |
| 1.0.192 | 18,317 | 11/1/2023 |
| 1.0.191 | 23,303 | 9/8/2023 |
| 1.0.190 | 18,364 | 9/8/2023 |
| 1.0.189 | 829 | 9/8/2023 |
| 1.0.188 | 860 | 9/6/2023 |
| 1.0.187 | 18,395 | 9/3/2023 |
| 1.0.186 | 18,468 | 8/21/2023 |
| 1.0.185 | 900 | 8/14/2023 |
| 1.0.184 | 18,430 | 8/10/2023 |
| 1.0.183 | 23,374 | 6/29/2023 |
| 1.0.182 | 20,700 | 5/27/2023 |
| 1.0.181 | 18,462 | 5/19/2023 |
| 1.0.180 | 20,279 | 5/14/2023 |
| 1.0.179 | 19,831 | 5/8/2023 |
| 1.0.178 | 1,008 | 4/21/2023 |
| 1.0.177 | 24,865 | 4/3/2023 |
| 1.0.176 | 18,703 | 3/13/2023 |
| 1.0.175 | 21,064 | 3/6/2023 |
| 1.0.174 | 1,030 | 2/26/2023 |
| 1.0.173 | 25,957 | 2/9/2023 |
| 1.0.172 | 21,265 | 2/7/2023 |
| 1.0.171 | 18,578 | 2/4/2023 |
| 1.0.170 | 21,534 | 2/2/2023 |
| 1.0.169 | 21,569 | 1/30/2023 |
| 1.0.168 | 1,131 | 1/18/2023 |
| 1.0.167 | 26,197 | 12/30/2022 |
| 1.0.166 | 1,086 | 12/23/2022 |
| 1.0.165 | 1,075 | 12/14/2022 |
| 1.0.164 | 1,044 | 12/14/2022 |
| 1.0.163 | 1,030 | 12/14/2022 |
| 1.0.162 | 1,066 | 12/14/2022 |
| 1.0.161 | 1,046 | 12/14/2022 |
| 1.0.160 | 22,738 | 12/12/2022 |
| 1.0.159 | 22,502 | 12/8/2022 |
| 1.0.158 | 1,126 | 12/4/2022 |
| 1.0.157 | 1,066 | 12/4/2022 |
| 1.0.156 | 18,664 | 11/30/2022 |
| 1.0.155 | 18,632 | 11/29/2022 |
| 1.0.154 | 18,642 | 11/28/2022 |
| 1.0.153 | 18,674 | 11/18/2022 |
| 1.0.152 | 23,347 | 11/11/2022 |
| 1.0.151 | 18,638 | 11/11/2022 |
| 1.0.150 | 1,114 | 11/10/2022 |
| 1.0.149 | 18,697 | 11/5/2022 |
| 1.0.148 | 18,660 | 11/4/2022 |
| 1.0.147 | 36,973 | 11/1/2022 |
| 1.0.146 | 39,371 | 10/16/2022 |
| 1.0.145 | 18,828 | 9/25/2022 |
| 1.0.144 | 1,275 | 9/10/2022 |
| 1.0.143 | 1,206 | 9/10/2022 |
| 1.0.142 | 60,528 | 9/8/2022 |
| 1.0.141 | 18,784 | 9/8/2022 |
| 1.0.140 | 1,204 | 9/8/2022 |
| 1.0.139 | 18,783 | 9/4/2022 |
| 1.0.138 | 18,756 | 9/4/2022 |
| 1.0.137 | 84,384 | 8/24/2022 |
| 1.0.136 | 18,848 | 8/8/2022 |
| 1.0.135 | 18,756 | 8/8/2022 |
| 1.0.134 | 18,814 | 7/26/2022 |
| 1.0.133 | 18,759 | 7/26/2022 |
| 1.0.132 | 61,489 | 7/19/2022 |
| 1.0.131 | 42,926 | 7/18/2022 |
| 1.0.130 | 18,825 | 7/13/2022 |
| 1.0.129 | 18,810 | 7/8/2022 |
| 1.0.128 | 18,838 | 6/30/2022 |
| 1.0.127 | 18,848 | 6/18/2022 |
| 1.0.126 | 18,821 | 6/6/2022 |
| 1.0.125 | 102,736 | 4/30/2022 |
| 1.0.124 | 18,838 | 4/20/2022 |
| 1.0.123 | 18,847 | 4/10/2022 |
| 1.0.122 | 18,796 | 4/7/2022 |
| 1.0.121 | 18,820 | 4/7/2022 |
| 1.0.120 | 18,866 | 4/2/2022 |
| 1.0.119 | 25,780 | 3/29/2022 |
| 1.0.118 | 18,783 | 3/27/2022 |
| 1.0.117 | 1,265 | 3/27/2022 |
| 1.0.116 | 103,786 | 2/20/2022 |
| 1.0.115 | 18,800 | 2/20/2022 |
| 1.0.114 | 18,819 | 2/20/2022 |
| 1.0.113 | 18,822 | 2/20/2022 |
| 1.0.112 | 18,834 | 2/20/2022 |
| 1.0.111 | 18,802 | 2/20/2022 |
| 1.0.110 | 18,821 | 2/20/2022 |
| 1.0.109 | 18,830 | 2/20/2022 |
| 1.0.108 | 18,791 | 2/20/2022 |
| 1.0.107 | 18,785 | 2/19/2022 |
| 1.0.106 | 139,968 | 1/24/2022 |
| 1.0.105 | 162,709 | 12/29/2021 |
| 1.0.104 | 43,833 | 12/20/2021 |
| 1.0.103 | 18,740 | 12/13/2021 |
| 1.0.102 | 43,999 | 12/7/2021 |
| 1.0.101 | 18,651 | 12/7/2021 |
| 1.0.100 | 44,103 | 12/6/2021 |
| 1.0.99 | 18,659 | 12/6/2021 |
| 1.0.98 | 18,649 | 12/5/2021 |
| 1.0.97 | 1,115 | 12/2/2021 |
| 1.0.96 | 45,506 | 11/29/2021 |
| 1.0.95 | 43,679 | 11/22/2021 |
| 1.0.94 | 18,771 | 11/17/2021 |
| 1.0.93 | 18,728 | 11/14/2021 |
| 1.0.92 | 44,703 | 11/13/2021 |
| 1.0.91 | 18,769 | 11/11/2021 |
| 1.0.90 | 18,691 | 11/11/2021 |
| 1.0.89 | 18,725 | 11/10/2021 |
| 1.0.88 | 18,733 | 11/9/2021 |
| 1.0.87 | 73,836 | 11/5/2021 |
| 1.0.86 | 18,745 | 11/5/2021 |
| 1.0.85 | 18,703 | 11/4/2021 |
| 1.0.84 | 18,714 | 11/4/2021 |
| 1.0.83 | 18,721 | 11/3/2021 |
| 1.0.82 | 18,805 | 10/30/2021 |
| 1.0.81 | 47,256 | 10/21/2021 |
| 1.0.80 | 18,813 | 10/17/2021 |
| 1.0.79 | 73,294 | 10/14/2021 |
| 1.0.78 | 22,964 | 10/13/2021 |
| 1.0.77 | 18,749 | 10/12/2021 |
| 1.0.76 | 47,167 | 10/11/2021 |
| 1.0.75 | 18,698 | 10/9/2021 |
| 1.0.74 | 32,923 | 10/7/2021 |
| 1.0.73 | 49,284 | 10/7/2021 |
| 1.0.72 | 18,692 | 10/7/2021 |
| 1.0.71 | 1,202 | 10/6/2021 |
| 1.0.70 | 18,781 | 9/28/2021 |
| 1.0.69 | 48,134 | 9/23/2021 |
| 1.0.68 | 18,815 | 9/11/2021 |
| 1.0.67 | 18,738 | 9/10/2021 |
| 1.0.66 | 18,742 | 9/9/2021 |
| 1.0.65 | 18,689 | 9/8/2021 |
| 1.0.64 | 18,747 | 9/8/2021 |
| 1.0.63 | 46,641 | 9/6/2021 |
| 1.0.62 | 1,202 | 8/31/2021 |
| 1.0.61 | 1,156 | 8/30/2021 |
| 1.0.60 | 47,582 | 7/31/2021 |
| 1.0.59 | 72,322 | 7/30/2021 |
| 1.0.58 | 18,773 | 7/26/2021 |
| 1.0.57 | 99,000 | 7/5/2021 |
| 1.0.56 | 18,781 | 7/1/2021 |
| 1.0.55 | 74,869 | 6/4/2021 |
| 1.0.54 | 100,098 | 4/26/2021 |
| 1.0.53 | 46,613 | 4/19/2021 |
| 1.0.52 | 152,379 | 4/7/2021 |
| 1.0.51 | 45,885 | 4/3/2021 |
| 1.0.50 | 161,811 | 3/22/2021 |
| 1.0.49 | 118,993 | 3/4/2021 |
| 1.0.48 | 45,927 | 2/26/2021 |
| 1.0.47 | 167,756 | 2/2/2021 |
| 1.0.46 | 51,697 | 1/26/2021 |
| 1.0.45 | 68,670 | 1/24/2021 |
| 1.0.44 | 1,217 | 1/24/2021 |
| 1.0.43 | 1,270 | 1/23/2021 |
| 1.0.42 | 51,515 | 1/20/2021 |
| 1.0.41 | 18,784 | 1/20/2021 |
| 1.0.40 | 43,951 | 1/18/2021 |
| 1.0.39 | 1,185 | 1/18/2021 |
| 1.0.38 | 43,062 | 1/16/2021 |
| 1.0.37 | 123,973 | 12/16/2020 |
| 1.0.36 | 70,749 | 12/14/2020 |
| 1.0.35 | 48,266 | 12/9/2020 |
| 1.0.34 | 19,154 | 12/7/2020 |
| 1.0.33 | 19,277 | 12/6/2020 |
| 1.0.32 | 19,191 | 12/2/2020 |
| 1.0.31 | 19,162 | 12/2/2020 |
| 1.0.30 | 44,819 | 12/1/2020 |
| 1.0.29 | 160,382 | 11/12/2020 |
| 1.0.29-atestpub | 732 | 11/11/2020 |
| 1.0.28 | 44,765 | 10/11/2020 |
| 1.0.27 | 98,566 | 9/9/2020 |
| 1.0.26 | 43,535 | 9/3/2020 |
| 1.0.25 | 44,076 | 8/20/2020 |
| 1.0.24 | 92,452 | 8/9/2020 |
| 1.0.23 | 25,919 | 7/28/2020 |
| 1.0.22 | 43,358 | 7/19/2020 |
| 1.0.21 | 66,478 | 7/6/2020 |
| 1.0.20 | 92,708 | 6/6/2020 |
| 1.0.19 | 26,922 | 6/4/2020 |
| 1.0.18 | 50,712 | 5/29/2020 |
| 1.0.17 | 68,156 | 5/21/2020 |
| 1.0.16 | 1,840 | 5/17/2020 |
| 1.0.15 | 71,348 | 5/12/2020 |
| 1.0.14 | 123,488 | 5/4/2020 |
| 1.0.13 | 22,600 | 4/24/2020 |
| 1.0.12 | 5,519 | 4/22/2020 |
| 1.0.11 | 19,511 | 4/22/2020 |
| 1.0.10 | 19,526 | 4/21/2020 |
| 1.0.9 | 47,534 | 4/18/2020 |
| 1.0.8 | 27,945 | 4/16/2020 |
| 1.0.7 | 2,044 | 4/16/2020 |
| 1.0.6 | 41,703 | 4/15/2020 |
| 1.0.5 | 43,596 | 4/11/2020 |
| 1.0.4 | 43,014 | 4/3/2020 |
| 1.0.3 | 2,028 | 4/1/2020 |
| 1.0.2 | 30,165 | 3/27/2020 |
| 1.0.1 | 29,109 | 3/22/2020 |
| 1.0.0 | 3,918 | 3/22/2020 |