Ecng.IO 1.0.242

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.IO --version 1.0.242
                    
NuGet\Install-Package Ecng.IO -Version 1.0.242
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.IO" Version="1.0.242" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.IO" Version="1.0.242" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.IO" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.IO --version 1.0.242
                    
#r "nuget: Ecng.IO, 1.0.242"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.IO@1.0.242
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.IO&version=1.0.242
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.IO&version=1.0.242
                    
Install as a Cake Tool

Ecng.IO

A comprehensive .NET library providing compression, decompression, and file system utilities with async support.

Overview

Ecng.IO is part of the Ecng system framework by StockSharp, offering powerful helpers for:

  • Data compression and decompression (GZip, Deflate, 7Zip/LZMA)
  • ZIP archive extraction
  • Fossil delta compression for efficient binary differencing
  • File and directory operations
  • Stream manipulation utilities
  • Path management

Target Frameworks

  • .NET Standard 2.0
  • .NET 6.0
  • .NET 10.0

Installation

Add a reference to the Ecng.IO project or NuGet package in your project.

<ProjectReference Include="path\to\Ecng.IO\IO.csproj" />

Features

1. Compression & Decompression

The CompressionHelper class provides extension methods for compressing and decompressing data using various algorithms.

GZip Compression
using Ecng.IO;

// Decompress GZip data to string
byte[] compressedData = GetGZipData();
string result = compressedData.UnGZip();

// Decompress GZip data to buffer
byte[] destination = new byte[1024];
int bytesWritten = compressedData.UnGZip(destination);

// Decompress from specific range
string result = compressedData.UnGZip(index: 0, count: 100);

// Modern .NET: Use spans for better performance
ReadOnlySpan<byte> compressedSpan = stackalloc byte[256];
string result = compressedSpan.UnGZip();
Deflate Compression
using Ecng.IO;
using System.IO.Compression;

// Compress data with Deflate
byte[] data = GetRawData();
byte[] compressed = data.DeflateTo();

// Decompress Deflate data
string decompressed = compressed.UnDeflate();

// Decompress to buffer
byte[] destination = new byte[1024];
int bytesWritten = compressed.UnDeflate(destination);

// Decompress with custom buffer size
byte[] decompressed = compressed.DeflateFrom(bufferSize: CompressionHelper.DefaultBufferSize);
7Zip/LZMA Compression
using Ecng.IO;

// Compress with LZMA
byte[] data = GetRawData();
byte[] compressed = data.Do7Zip();

// Decompress LZMA data
byte[] decompressed = compressed.Un7Zip();
Generic Compression API
using Ecng.IO;
using System.IO.Compression;

// Compress with any compression stream type
byte[] data = GetRawData();
byte[] compressed = data.Compress<GZipStream>(
    index: 0,
    count: data.Length,
    level: CompressionLevel.Optimal,
    bufferSize: CompressionHelper.DefaultBufferSize
);

// Decompress with any compression stream type
byte[] decompressed = compressed.Uncompress<GZipStream>(
    index: 0,
    count: compressed.Length,
    bufferSize: CompressionHelper.DefaultBufferSize
);
Async Compression
using Ecng.IO;
using System.IO.Compression;
using System.Threading;

// Compress asynchronously
byte[] data = GetRawData();
byte[] compressed = await data.CompressAsync<GZipStream>(
    level: CompressionLevel.Optimal,
    bufferSize: CompressionHelper.DefaultBufferSize,
    cancellationToken: CancellationToken.None
);

// Decompress asynchronously
byte[] decompressed = await compressed.UncompressAsync<DeflateStream>(
    bufferSize: CompressionHelper.DefaultBufferSize,
    cancellationToken: CancellationToken.None
);

// Compress stream to stream
using var inputStream = File.OpenRead("input.dat");
using var outputStream = File.Create("output.gz");
await inputStream.CompressAsync<GZipStream>(
    output: outputStream,
    level: CompressionLevel.Optimal,
    leaveOpen: false,
    bufferSize: CompressionHelper.DefaultBufferSize
);

// Decompress stream to stream
using var compressedStream = File.OpenRead("compressed.gz");
using var decompressedStream = File.Create("decompressed.dat");
await compressedStream.UncompressAsync<GZipStream>(
    output: decompressedStream,
    leaveOpen: false,
    bufferSize: CompressionHelper.DefaultBufferSize
);

2. ZIP Archive Handling

using Ecng.IO;

// Extract all entries from ZIP
byte[] zipData = File.ReadAllBytes("archive.zip");
using (var entries = zipData.Unzip())
{
    foreach (var (name, body) in entries)
    {
        Console.WriteLine($"File: {name}");
        // Process stream...
        body.CopyTo(outputStream);
    }
}

// Extract with filter
using (var entries = zipData.Unzip(filter: name => name.EndsWith(".txt")))
{
    foreach (var (name, body) in entries)
    {
        // Only .txt files are extracted
        ProcessTextFile(name, body);
    }
}

// Extract from stream
using var fileStream = File.OpenRead("archive.zip");
using (var entries = fileStream.Unzip(leaveOpen: false))
{
    foreach (var (name, body) in entries)
    {
        Console.WriteLine($"Processing: {name}");
    }
}

3. Fossil Delta Compression

Fossil delta compression is ideal for efficiently storing and transmitting differences between binary files, such as software updates or version control systems.

using Ecng.IO.Fossil;
using System.Threading;

// Create a delta between two versions
byte[] originalFile = File.ReadAllBytes("version1.bin");
byte[] newFile = File.ReadAllBytes("version2.bin");

byte[] delta = await Delta.Create(
    origin: originalFile,
    target: newFile,
    token: CancellationToken.None
);

// Delta is typically much smaller than the full new file
Console.WriteLine($"Original: {originalFile.Length} bytes");
Console.WriteLine($"New: {newFile.Length} bytes");
Console.WriteLine($"Delta: {delta.Length} bytes");

// Apply delta to reconstruct the new file
byte[] reconstructed = await Delta.Apply(
    origin: originalFile,
    delta: delta,
    token: CancellationToken.None
);

// Verify reconstruction
bool isIdentical = reconstructed.SequenceEqual(newFile); // true

// Get output size from delta without applying it
uint outputSize = Delta.OutputSize(delta);
Console.WriteLine($"Expected output size: {outputSize} bytes");

4. File and Directory Operations

The library extends the functionality available through Ecng.Common.IOHelper.

Directory Management
using Ecng.Common;

// Clear directory contents
DirectoryInfo dir = IOHelper.ClearDirectory(@"C:\temp\data");

// Clear with filter
DirectoryInfo dir = IOHelper.ClearDirectory(
    @"C:\temp\data",
    filter: path => Path.GetExtension(path) == ".tmp"
);

// Clear asynchronously
DirectoryInfo dir = await IOHelper.ClearDirectoryAsync(
    @"C:\temp\data",
    cancellationToken: cancellationToken
);

// Copy entire directory
IOHelper.CopyDirectory(@"C:\source", @"C:\destination");

// Copy asynchronously
await IOHelper.CopyDirectoryAsync(
    @"C:\source",
    @"C:\destination",
    cancellationToken
);

// Create temporary directory
string tempDir = IOHelper.CreateTempDir();
// Returns: C:\Users\...\AppData\Local\Temp\{GUID}

// Delete directory safely (no error if not exists)
@"C:\temp\data".SafeDeleteDir();

// Delete empty directories recursively
IOHelper.DeleteEmptyDirs(@"C:\project");

// Block until directory is deleted (useful for locked files)
bool stillExists = IOHelper.BlockDeleteDir(
    @"C:\temp\locked",
    isRecursive: true,
    iterCount: 1000,
    sleep: 10
);
File Operations
using Ecng.Common;

// Copy file and make writable
string destFile = IOHelper.CopyAndMakeWritable(
    @"C:\source\file.txt",
    @"C:\destination"
);

// Create directory for file if needed
string filePath = @"C:\deep\nested\path\file.txt";
bool wasCreated = filePath.CreateDirIfNotExists();

// Create file with content
IOHelper.CreateFile(
    rootPath: @"C:\data",
    relativePath: "logs",
    fileName: "app.log",
    content: Encoding.UTF8.GetBytes("Log entry")
);

// Check if file is locked
bool isLocked = IOHelper.IsFileLocked(@"C:\data\file.dat");

// Get assembly/file timestamp
DateTime buildTime = IOHelper.GetTimestamp(@"C:\app\MyApp.exe");
DateTime asmTime = typeof(MyClass).Assembly.GetTimestamp();
Path Utilities
using Ecng.Common;

// Convert to full path
string fullPath = @"relative\path\file.txt".ToFullPath();

// Add relative path segment
string combined = @"C:\base".AddRelative(@"subdir\file.txt");
// Returns: C:\base\subdir\file.txt

// Expand %Documents% variable
string path = @"%Documents%\MyApp\data.db".ToFullPathIfNeed();
// Returns: C:\Users\Username\Documents\MyApp\data.db

// Get relative path
string relative = @"C:\project\src\file.cs".GetRelativePath(@"C:\project");
// Returns: src\file.cs

// Normalize paths for comparison
string normalized = @"C:\Path\To\..\File.txt".NormalizePath();
string normalized2 = @"C:\path\to\..\file.txt".NormalizePath();

// Compare paths
bool areEqual = IOHelper.IsPathsEqual(
    @"C:\Path\To\File.txt",
    @"c:\path\to\file.txt"
); // true

// Check if path is directory
bool isDir = @"C:\Windows".IsDirectory();
bool isDir2 = @"C:\Windows".IsPathIsDir(); // alternative
Directory Queries
using Ecng.Common;

// Get directories with pattern
IEnumerable<string> dirs = IOHelper.GetDirectories(
    @"C:\projects",
    searchPattern: "*.Tests",
    searchOption: SearchOption.AllDirectories
);

// Get directories asynchronously
IEnumerable<string> dirs = await IOHelper.GetDirectoriesAsync(
    @"C:\projects",
    searchPattern: "*",
    searchOption: SearchOption.TopDirectoryOnly,
    cancellationToken: cancellationToken
);

// Get files asynchronously
IEnumerable<string> files = await IOHelper.GetFilesAsync(
    @"C:\logs",
    searchPattern: "*.log",
    searchOption: SearchOption.AllDirectories,
    cancellationToken: cancellationToken
);

// Check if directory exists and has content
bool hasInstall = IOHelper.CheckInstallation(@"C:\Program Files\MyApp");

// Check if directory contains files (recursive)
bool hasFiles = IOHelper.CheckDirContainFiles(@"C:\temp");

// Check if directory contains anything
bool hasContent = IOHelper.CheckDirContainsAnything(@"C:\temp");

// Get disk free space
long freeSpace = IOHelper.GetDiskFreeSpace("C:");
Console.WriteLine($"Free: {freeSpace.ToHumanReadableFileSize()}");

5. Stream Operations

Reading from Streams
using Ecng.Common;

// Read exact number of bytes
Stream stream = GetStream();
byte[] buffer = stream.ReadBuffer(size: 1024);

// Read bytes into buffer
byte[] data = new byte[512];
stream.ReadBytes(data, len: 256, pos: 0);

// Read bytes into Memory<byte>
Memory<byte> memory = new byte[512];
stream.ReadBytes(memory);

// Read full amount asynchronously (ensures all bytes are read)
byte[] buffer = new byte[1024];
int totalRead = await stream.ReadFullAsync(
    buffer,
    offset: 0,
    bytesToRead: 1024,
    cancellationToken
);

// Read typed data
int value = stream.Read<int>();
DateTime timestamp = stream.Read<DateTime>();
MyStruct data = stream.Read<MyStruct>();

// Read with dynamic size (for strings/arrays)
string text = (string)stream.Read(typeof(string));
byte[] bytes = (byte[])stream.Read(typeof(byte[]));

// Enumerate lines
foreach (string line in stream.EnumerateLines(Encoding.UTF8, leaveOpen: true))
{
    Console.WriteLine(line);
}
Writing to Streams
using Ecng.Common;

Stream stream = GetStream();

// Write bytes
byte[] data = GetData();
stream.WriteBytes(data, len: data.Length, pos: 0);

// Write raw data
stream.WriteRaw(data);
stream.WriteRaw(myObject); // Converts object to bytes

// Write with length prefix
stream.WriteEx("Hello"); // Writes length + data
stream.WriteEx(new byte[] { 1, 2, 3 }); // Writes length + data
Stream Utilities
using Ecng.Common;

// Save stream to file
stream.Save(@"C:\output\data.bin");

// Save byte array to file
byte[] data = GetData();
data.Save(@"C:\output\data.bin");

// Try save with error handling
bool success = data.TrySave(
    @"C:\output\data.bin",
    errorHandler: ex => Console.WriteLine($"Error: {ex.Message}")
);

// Get actual buffer from MemoryStream
var ms = new MemoryStream();
ms.Write(someData, 0, someData.Length);
ArraySegment<byte> segment = ms.GetActualBuffer();
// segment contains only written data, not entire buffer

// Truncate StreamWriter
using var writer = new StreamWriter(@"C:\log.txt");
writer.WriteLine("Entry 1");
writer.Truncate(); // Clears the file
writer.WriteLine("Entry 2");

6. Process Execution

using Ecng.Common;
using System.Diagnostics;

// Execute process and capture output
int exitCode = IOHelper.Execute(
    fileName: "git",
    arg: "status",
    output: line => Console.WriteLine($"OUT: {line}"),
    error: line => Console.WriteLine($"ERR: {line}"),
    waitForExit: TimeSpan.FromSeconds(30)
);

// Execute with advanced options
int exitCode = IOHelper.Execute(
    fileName: "dotnet",
    arg: "build",
    output: line => LogOutput(line),
    error: line => LogError(line),
    infoHandler: info => {
        info.WorkingDirectory = @"C:\project";
        info.EnvironmentVariables["CUSTOM_VAR"] = "value";
    },
    stdInput: "input data",
    priority: ProcessPriorityClass.High
);

// Execute asynchronously
int exitCode = await IOHelper.ExecuteAsync(
    fileName: "npm",
    arg: "install",
    output: line => Console.WriteLine(line),
    error: line => Console.Error.WriteLine(line),
    priority: ProcessPriorityClass.BelowNormal,
    cancellationToken: cancellationToken
);

7. Utility Functions

using Ecng.Common;

// Convert file size to human-readable format
long bytes = 1536000;
string size = bytes.ToHumanReadableFileSize();
// Returns: "1.5 MB"

// Get size of unmanaged type
int size = IOHelper.SizeOf<int>(); // 4
int size = IOHelper.SizeOf<DateTime>(); // 8 (stored as long)
int size = typeof(MyStruct).SizeOf();

// Open file or URL with default application
bool success = @"C:\document.pdf".OpenLink(raiseError: false);
bool success = "https://example.com".OpenLink(raiseError: true);

Buffer Sizes

The library uses a default buffer size for compression operations:

// Default buffer size: 80 KB
const int bufferSize = CompressionHelper.DefaultBufferSize; // 81920 bytes

You can customize buffer sizes for performance tuning:

// Use smaller buffer for memory-constrained environments
byte[] compressed = data.Compress<GZipStream>(bufferSize: 4096);

// Use larger buffer for better throughput
byte[] compressed = data.Compress<GZipStream>(bufferSize: 1024 * 1024);

Error Handling

All methods throw standard .NET exceptions:

  • ArgumentNullException - When required parameters are null
  • ArgumentOutOfRangeException - When sizes or indices are invalid
  • IOException - When I/O operations fail
  • UnauthorizedAccessException - When access is denied
  • DirectoryNotFoundException / FileNotFoundException - When paths don't exist
try
{
    var data = compressedData.UnGZip();
}
catch (ArgumentNullException ex)
{
    // Input was null
}
catch (IOException ex)
{
    // Decompression failed
}

Thread Safety

  • CompressionHelper methods are thread-safe as they operate on method parameters
  • Stream operations are not inherently thread-safe - synchronize access if needed
  • File operations should be synchronized when accessing the same files from multiple threads
  • Async methods support CancellationToken for cooperative cancellation

Performance Tips

  1. Use async methods for I/O-bound operations to avoid blocking threads
  2. Use Span/Memory APIs on .NET 6.0+ for better performance and less allocation
  3. Choose appropriate compression levels:
    • CompressionLevel.Fastest - Quick but larger files
    • CompressionLevel.Optimal - Balanced (default)
    • CompressionLevel.SmallestSize - Slow but smallest files (.NET 7+)
  4. Adjust buffer sizes based on your data and memory constraints
  5. Use Fossil Delta for incremental updates instead of full file transfers

Examples

Example 1: Compress and Save File

using Ecng.IO;
using System.IO.Compression;

// Read, compress, and save
byte[] original = File.ReadAllBytes(@"C:\data\large-file.json");
byte[] compressed = original.Compress<GZipStream>(
    level: CompressionLevel.Optimal
);
compressed.Save(@"C:\data\large-file.json.gz");

Console.WriteLine($"Original: {original.Length.ToHumanReadableFileSize()}");
Console.WriteLine($"Compressed: {compressed.Length.ToHumanReadableFileSize()}");
Console.WriteLine($"Ratio: {(100.0 * compressed.Length / original.Length):F1}%");

Example 2: Process ZIP Archive

using Ecng.IO;

byte[] zipData = File.ReadAllBytes(@"C:\downloads\archive.zip");

using (var entries = zipData.Unzip(filter: name => name.EndsWith(".csv")))
{
    foreach (var (fileName, stream) in entries)
    {
        Console.WriteLine($"Processing: {fileName}");

        using var reader = new StreamReader(stream);
        string csvContent = reader.ReadToEnd();

        // Process CSV...
        ProcessCsvData(csvContent);
    }
}

Example 3: Incremental Binary Updates with Fossil Delta

using Ecng.IO.Fossil;

// Server side: Create delta
byte[] v1 = File.ReadAllBytes(@"app-v1.0.exe");
byte[] v2 = File.ReadAllBytes(@"app-v2.0.exe");
byte[] delta = await Delta.Create(v1, v2, CancellationToken.None);

// Upload only the delta (much smaller than full v2)
await UploadToServer("update-1.0-to-2.0.delta", delta);

// Client side: Apply delta
byte[] currentVersion = File.ReadAllBytes(@"app.exe");
byte[] deltaUpdate = await DownloadFromServer("update-1.0-to-2.0.delta");
byte[] newVersion = await Delta.Apply(currentVersion, deltaUpdate, CancellationToken.None);

File.WriteAllBytes(@"app.exe", newVersion);

Example 4: Async Directory Processing

using Ecng.Common;

// Find all log files and compress them
var logFiles = await IOHelper.GetFilesAsync(
    @"C:\logs",
    searchPattern: "*.log",
    searchOption: SearchOption.AllDirectories,
    cancellationToken: cancellationToken
);

foreach (string logFile in logFiles)
{
    byte[] content = await File.ReadAllBytesAsync(logFile, cancellationToken);
    byte[] compressed = await content.CompressAsync<GZipStream>(
        cancellationToken: cancellationToken
    );

    await File.WriteAllBytesAsync(
        logFile + ".gz",
        compressed,
        cancellationToken
    );

    Console.WriteLine($"Compressed: {logFile}");
}

Example 5: Stream Processing Pipeline

using Ecng.IO;
using Ecng.Common;
using System.IO.Compression;

// Create a processing pipeline
await using var inputFile = File.OpenRead(@"C:\data\input.txt");
await using var compressed = new MemoryStream();
await using var encrypted = new MemoryStream();

// Compress
await inputFile.CompressAsync<GZipStream>(
    output: compressed,
    level: CompressionLevel.Optimal,
    leaveOpen: true
);

compressed.Position = 0;

// Further processing...
// (e.g., encrypt, hash, etc.)

// Save final result
compressed.Position = 0;
await using var output = File.Create(@"C:\data\output.bin");
await compressed.CopyToAsync(output);

License

Copyright © StockSharp 2010-2025

  • Ecng.Common - Core utilities and extensions
  • Ecng.Lzma - LZMA compression implementation
  • Ecng.Serialization - Serialization utilities

Support

For issues and questions, please visit the StockSharp repository or documentation.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (15)

Showing the top 5 NuGet packages that depend on Ecng.IO:

Package Downloads
Ecng.Interop

Ecng system framework

Ecng.Security

Ecng system framework

StockSharp.Algo

Trading algorithms. More info on web site https://stocksharp.com/store/

StockSharp.Fix

FIX/FAST

StockSharp.DukasCopy

DukasCopy

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Ecng.IO:

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.248 887 1/4/2026
1.0.247 530 1/1/2026
1.0.246 658 12/31/2025
1.0.245 658 12/30/2025
1.0.244 636 12/30/2025
1.0.243 90 12/29/2025
1.0.242 96 12/26/2025
1.0.241 86 12/26/2025
1.0.240 85 12/26/2025
1.0.239 103 12/26/2025
1.0.238 175 12/25/2025
1.0.237 177 12/25/2025
1.0.236 188 12/22/2025
1.0.235 166 12/21/2025
1.0.234 249 12/19/2025
1.0.233 234 12/19/2025
1.0.232 322 12/17/2025
1.0.231 315 12/15/2025
1.0.230 178 12/12/2025
1.0.229 130 12/12/2025
1.0.228 263 11/29/2025
1.0.227 131 11/28/2025
1.0.226 139 11/28/2025
1.0.225 193 11/27/2025
1.0.224 293 11/24/2025
1.0.223 200 11/24/2025
1.0.222 205 11/23/2025
1.0.221 250 11/22/2025
1.0.220 1,051 11/20/2025
1.0.219 444 11/18/2025
1.0.218 410 11/18/2025
1.0.217 392 11/13/2025
1.0.216 297 11/10/2025
1.0.215 1,164 11/1/2025
1.0.214 251 10/28/2025
1.0.213 256 10/27/2025
1.0.212 199 10/27/2025
1.0.211 132 10/25/2025
1.0.210 1,209 10/3/2025
1.0.209 421 9/25/2025
1.0.208 5,040 8/30/2025
1.0.207 3,060 7/13/2025
1.0.206 223 7/13/2025
1.0.205 198 7/12/2025
1.0.204 615 7/8/2025
1.0.203 3,385 6/16/2025
1.0.202 391 6/9/2025
1.0.201 286 6/8/2025
1.0.200 777 5/21/2025
1.0.199 222 5/17/2025
1.0.198 825 5/12/2025
1.0.197 284 5/12/2025
1.0.196 383 4/17/2025
1.0.195 2,846 3/20/2025
1.0.194 264 3/19/2025
1.0.193 1,416 2/26/2025
1.0.192 190 2/26/2025
1.0.191 2,601 2/5/2025
1.0.190 572 1/21/2025
1.0.189 674 1/14/2025
1.0.188 229 1/12/2025
1.0.187 216 1/10/2025
1.0.186 3,117 11/18/2024
1.0.185 656 11/7/2024
1.0.184 363 10/19/2024
1.0.183 2,283 10/5/2024
1.0.182 2,238 9/18/2024
1.0.181 230 9/17/2024
1.0.180 1,208 9/1/2024
1.0.179 6,654 6/12/2024
1.0.178 1,208 5/28/2024
1.0.177 1,657 5/4/2024
1.0.176 2,419 4/14/2024
1.0.175 1,988 3/28/2024
1.0.174 278 3/17/2024
1.0.173 2,056 2/23/2024
1.0.172 229 2/23/2024
1.0.171 1,503 2/18/2024
1.0.170 237 2/16/2024
1.0.169 949 2/13/2024
1.0.168 868 2/8/2024
1.0.167 1,158 2/4/2024
1.0.166 1,115 1/23/2024
1.0.165 2,006 1/12/2024
1.0.164 2,257 1/2/2024
1.0.163 409 12/29/2023
1.0.162 5,470 11/12/2023
1.0.161 187 11/10/2023
1.0.160 170 11/10/2023
1.0.159 404 11/9/2023
1.0.158 546 11/3/2023
1.0.157 212 11/1/2023
1.0.156 192 11/1/2023
1.0.155 5,766 9/8/2023
1.0.154 443 9/8/2023
1.0.153 419 9/3/2023
1.0.152 324 8/21/2023
1.0.151 724 8/14/2023
1.0.150 853 8/10/2023
1.0.149 5,413 6/29/2023
1.0.148 4,307 5/27/2023
1.0.147 1,027 5/19/2023
1.0.146 4,643 5/8/2023
1.0.145 3,579 4/21/2023
1.0.144 6,318 4/3/2023
1.0.143 4,069 3/13/2023
1.0.142 2,592 3/6/2023
1.0.141 1,373 2/26/2023
1.0.140 7,936 2/9/2023
1.0.139 4,138 2/7/2023
1.0.138 432 2/4/2023
1.0.137 3,253 2/2/2023
1.0.136 3,175 1/30/2023
1.0.135 4,359 1/18/2023
1.0.134 9,649 12/30/2022
1.0.133 1,591 12/23/2022
1.0.132 3,876 12/12/2022
1.0.131 6,812 12/4/2022
1.0.130 497 12/4/2022
1.0.129 524 11/30/2022
1.0.128 486 11/28/2022
1.0.127 2,602 11/18/2022
1.0.126 5,980 11/11/2022
1.0.125 530 11/11/2022
1.0.124 522 11/10/2022
1.0.123 572 11/5/2022
1.0.122 1,946 11/4/2022
1.0.121 18,518 11/1/2022
1.0.120 20,906 10/16/2022
1.0.119 685 9/25/2022
1.0.118 5,061 9/10/2022
1.0.117 42,252 9/8/2022
1.0.116 610 9/8/2022
1.0.115 623 9/8/2022
1.0.114 610 9/4/2022
1.0.113 83,386 8/24/2022
1.0.112 4,861 8/8/2022
1.0.111 2,517 7/26/2022
1.0.110 638 7/26/2022
1.0.109 43,264 7/19/2022
1.0.108 42,365 7/18/2022
1.0.107 3,891 7/13/2022
1.0.106 651 7/11/2022
1.0.105 635 7/8/2022
1.0.104 1,665 6/30/2022
1.0.103 1,652 6/18/2022
1.0.102 698 6/6/2022
1.0.101 84,555 4/30/2022
1.0.100 676 4/20/2022
1.0.99 682 4/10/2022
1.0.98 664 4/7/2022
1.0.97 659 4/7/2022
1.0.96 663 4/2/2022
1.0.95 7,398 3/29/2022
1.0.94 632 3/27/2022
1.0.93 238,129 1/24/2022
1.0.92 147,807 12/29/2021
1.0.91 25,866 12/20/2021
1.0.90 599 12/13/2021
1.0.89 50,651 12/6/2021
1.0.88 532 12/2/2021
1.0.87 27,607 11/29/2021
1.0.86 25,764 11/22/2021
1.0.85 613 11/17/2021
1.0.84 26,666 11/13/2021
1.0.83 570 11/10/2021
1.0.82 533 11/9/2021
1.0.81 56,310 11/5/2021
1.0.80 613 11/5/2021
1.0.79 570 11/4/2021
1.0.78 573 11/4/2021
1.0.77 587 11/3/2021
1.0.76 643 10/30/2021
1.0.75 29,425 10/21/2021
1.0.74 681 10/17/2021
1.0.73 55,278 10/14/2021
1.0.72 4,625 10/13/2021
1.0.71 555 10/12/2021
1.0.70 29,116 10/11/2021
1.0.69 579 10/9/2021
1.0.68 32,368 10/7/2021
1.0.67 30,972 10/7/2021
1.0.66 533 10/7/2021
1.0.65 608 10/6/2021
1.0.64 644 9/28/2021
1.0.63 30,322 9/23/2021
1.0.62 676 9/10/2021
1.0.61 612 9/9/2021
1.0.60 576 9/8/2021
1.0.59 568 9/8/2021
1.0.58 28,713 9/6/2021
1.0.57 603 8/31/2021
1.0.56 562 8/30/2021
1.0.55 29,752 7/31/2021
1.0.54 54,909 7/30/2021
1.0.53 654 7/26/2021
1.0.52 81,906 7/5/2021
1.0.51 609 7/1/2021
1.0.50 57,474 6/4/2021
1.0.49 82,971 4/26/2021
1.0.48 28,925 4/19/2021
1.0.47 135,620 4/7/2021
1.0.46 27,909 4/3/2021
1.0.45 163,175 3/22/2021
1.0.44 101,759 3/4/2021
1.0.43 28,005 2/26/2021
1.0.42 151,315 2/2/2021
1.0.41 101,387 1/24/2021
1.0.40 671 1/23/2021
1.0.39 51,474 1/20/2021
1.0.38 654 1/20/2021
1.0.37 26,269 1/18/2021
1.0.36 25,384 1/16/2021
1.0.35 104,400 12/16/2020
1.0.34 52,870 12/14/2020
1.0.33 29,856 12/9/2020
1.0.32 794 12/6/2020
1.0.31 722 12/2/2020
1.0.30 26,336 12/1/2020
1.0.29 145,491 11/12/2020
1.0.29-atestpub 551 11/11/2020
1.0.28 26,975 10/11/2020
1.0.27 100,057 9/9/2020
1.0.26 25,463 9/3/2020
1.0.25 26,163 8/20/2020
1.0.24 75,646 8/9/2020
1.0.23 25,620 7/28/2020
1.0.22 25,433 7/19/2020
1.0.21 49,325 7/6/2020
1.0.20 76,012 6/6/2020
1.0.19 26,425 6/4/2020
1.0.18 51,051 5/29/2020
1.0.17 51,078 5/21/2020
1.0.16 856 5/17/2020
1.0.15 51,756 5/12/2020
1.0.14 102,496 5/4/2020
1.0.13 869 4/24/2020
1.0.12 4,008 4/22/2020
1.0.11 751 4/22/2020
1.0.10 748 4/21/2020
1.0.9 28,115 4/18/2020
1.0.8 26,173 4/16/2020
1.0.7 741 4/16/2020
1.0.6 22,194 4/15/2020
1.0.5 23,599 4/11/2020
1.0.4 23,424 4/3/2020
1.0.3 779 4/1/2020
1.0.2 10,113 3/27/2020
1.0.1 9,111 3/22/2020
1.0.0 2,619 3/22/2020