Foundatio 12.0.0

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

Pluggable foundation blocks for building loosely coupled distributed apps.

Includes implementations in Redis, Azure, AWS, RabbitMQ, Kafka and in memory (for development).

Why Foundatio?

When building several big cloud applications we found a lack of great solutions (that's not to say there isn't solutions out there) for many key pieces to building scalable distributed applications while keeping the development experience simple. Here are a few examples of why we built and use Foundatio:

  • Wanted to build against abstract interfaces so that we could easily change implementations.
  • Wanted the blocks to be dependency injection friendly.
  • Caching: We were initially using an open source Redis cache client but then it turned into a commercial product with high licensing costs. Not only that, but there weren't any in memory implementations so every developer was required to set up and configure Redis.
  • Message Bus: We initially looked at NServiceBus (great product) but it had high licensing costs (they have to eat too) but was not OSS friendly. We also looked into MassTransit (another great product) but found Azure support lacking at the time and local set up a pain (for in memory). We wanted a simple message bus that just worked locally or in the cloud.
  • Storage: We couldn't find any existing project that was decoupled and supported in memory, file storage or Azure Blob Storage.

To summarize, if you want pain free development and testing while allowing your app to scale, use Foundatio!

Implementations

Getting Started (Development)

Foundatio can be installed via the NuGet package manager. If you need help, please open an issue or join our Discord chat room. We’re always here to help if you have any questions!

This section is for development purposes only! If you are trying to use the Foundatio libraries, please get them from NuGet.

  1. You will need to have Visual Studio Code installed.
  2. Open the Foundatio.slnx Visual Studio solution file.

Using Foundatio

The sections below contain a small subset of what's possible with Foundatio. We recommend taking a peek at the source code for more information. Please let us know if you have any questions or need assistance!

Caching

Caching allows you to store and access data lightning fast, saving you exspensive operations to create or get data. We provide four different cache implementations that derive from the ICacheClient interface:

  1. InMemoryCacheClient: An in memory cache client implementation. This cache implementation is only valid for the lifetime of the process. It's worth noting that the in memory cache client has the ability to cache the last X items via the MaxItems property. We use this in Exceptionless to only keep the last 250 resolved geoip results.
  2. HybridCacheClient: This cache implementation uses both an ICacheClient and the InMemoryCacheClient and uses an IMessageBus to keep the cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and a call to the remote cache if the item exists in the local cache.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: An implementation of HybridCacheClient that uses the RedisCacheClient as ICacheClient and the RedisMessageBus as IMessageBus.
  5. ScopedCacheClient: This cache implementation takes an instance of ICacheClient and a string scope. The scope is prefixed onto every cache key. This makes it really easy to scope all cache keys and remove them with ease.

Sample

using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

Queues

Queues offer First In, First Out (FIFO) message delivery. We provide four different queue implementations that derive from the IQueue interface:

  1. InMemoryQueue: An in memory queue implementation. This queue implementation is only valid for the lifetime of the process.
  2. RedisQueue: An Redis queue implementation.
  3. AzureServiceBusQueue: An Azure Service Bus Queue implementation.
  4. AzureStorageQueue: An Azure Storage Queue implementation.
  5. SQSQueue: An AWS SQS implementation.

Sample

using Foundatio.Queues;

IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();

await queue.EnqueueAsync(new SimpleWorkItem {
    Data = "Hello"
});

var workItem = await queue.DequeueAsync();

Locks

Locks ensure a resource is only accessed by one consumer at any given time. We provide two different locking implementations that derive from the ILockProvider interface:

  1. CacheLockProvider: A lock implementation that uses cache to communicate between processes.
  2. ThrottlingLockProvider: A lock implementation that only allows a certain amount of locks through. You could use this to throttle api calls to some external service and it will throttle them across all processes asking for that lock.
  3. ScopedLockProvider: This lock implementation takes an instance of ILockProvider and a string scope. The scope is prefixed onto every lock key. This makes it really easy to scope all locks and release them with ease.

It's worth noting that all lock providers take a ICacheClient. This allows you to ensure your code locks properly across machines.

Sample

using Foundatio.Lock;

ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var testLock = await locker.AcquireAsync("test");
// ...
await testLock.ReleaseAsync();

ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();

Messaging

Allows you to publish and subscribe to messages flowing through your application. We provide four different message bus implementations that derive from the IMessageBus interface:

  1. InMemoryMessageBus: An in memory message bus implementation. This message bus implementation is only valid for the lifetime of the process.
  2. RedisMessageBus: A Redis message bus implementation.
  3. RabbitMQMessageBus: A RabbitMQ implementation.
  4. KafkaMessageBus: A Kafka implementation.
  5. AzureServiceBusMessageBus: An Azure Service Bus implementation.

Sample

using Foundatio.Messaging;

IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
  // Got message
});

await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });

Jobs

Allows you to run a long running process (in process or out of process) without worrying about it being terminated prematurely. We provide three different ways of defining a job, based on your use case:

  1. Jobs: All jobs must derive from the IJob interface. We also have a JobBase base class you can derive from which provides a JobContext and logging. You can then run jobs by calling RunAsync() on the job or by creating a instance of the JobRunner class and calling one of the Run methods. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using Foundatio.Jobs;

public class HelloWorldJob : JobBase {
  public int RunCount { get; set; }

  protected override Task<JobResult> RunInternalAsync(JobContext context) {
     RunCount++;
     return Task.FromResult(JobResult.Success);
  }
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
  1. Queue Processor Jobs: A queue processor job works great for working with jobs that will be driven from queued data. Queue Processor jobs must derive from QueueJobBase<T> class. You can then run jobs by calling RunAsync() on the job or passing it to the JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using Foundatio.Jobs;

public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
  public int RunCount { get; set; }

  public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}

  protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
     RunCount++;

     return Task.FromResult(JobResult.Success);
  }
}

public class HelloWorldQueueItem {
  public string Message { get; set; }
}
 // Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());

// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue

IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
  1. Work Item Jobs: A work item job will run in a job pool among other work item jobs. This type of job works great for things that don't happen often but should be in a job (Example: Deleting an entity that has many children.). It will be triggered when you publish a message on the message bus. The job must derive from the WorkItemHandlerBase class. You can then run all shared jobs via JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.

Sample

using System.Threading.Tasks;
using Foundatio.Jobs;

public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
  public override async Task HandleItemAsync(WorkItemContext ctx) {
    var workItem = ctx.GetData<HelloWorldWorkItem>();

    // We can report the progress over the message bus easily.
    // To receive these messages just inject IMessageSubscriber
    // and Subscribe to messages of type WorkItemStatus
    await ctx.ReportProgressAsync(0, "Starting Hello World Job");
    await Task.Delay(TimeSpan.FromSeconds(2.5));
    await ctx.ReportProgressAsync(50, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(70, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(90, "Reading value.");
    await Task.Delay(TimeSpan.FromSeconds(.5));

    await ctx.ReportProgressAsync(100, workItem.Message);
  }
}

public class HelloWorldWorkItem {
  public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();

// Register the handlers with dependency injection.
container.AddSingleton(handlers);

// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());

// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
 // To trigger the job we need to queue the HelloWorldWorkItem message.
 // This assumes that we injected an instance of IQueue<WorkItemData> queue

 // NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
 // Foundatio has an extension method that takes the model you post and serializes it to the
 // WorkItemData.Data property.
 await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });

File Storage

We provide different file storage implementations that derive from the IFileStorage interface:

  1. InMemoryFileStorage: An in memory file implementation. This file storage implementation is only valid for the lifetime of the process.
  2. FolderFileStorage: An file storage implementation that uses the hard drive for storage.
  3. AzureFileStorage: An Azure Blob storage implementation.
  4. S3FileStorage: An AWS S3 file storage implementation.
  5. RedisFileStorage: An Redis file storage implementation.
  6. MinioFileStorage An Minio file storage implementation.
  7. AliyunFileStorage: An Aliyun file storage implementation.
  8. SshNetFileStorage: An SFTP file storage implementation.

We recommend using all of the IFileStorage implementations as singletons.

Sample

using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

Resilience

Resilience policies provide a powerful way to handle transient failures and make your applications more robust by implementing retry logic, circuit breakers, and timeouts. The resilience system allows you to configure policies globally or per-operation, giving you fine-grained control over how Foundatio components handle failures.

The resilience system is built around the IResiliencePolicy interface and provides:

  1. Retry Logic: Automatically retry failed operations with configurable delays and maximum attempts
  2. Circuit Breaker: Temporarily stop calling failing services to prevent cascading failures
  3. Timeout: Set maximum execution time for operations
  4. Exponential Backoff: Gradually increase delays between retries with optional jitter
  5. Exception Filtering: Configure which exceptions should trigger retries

You can customize resilience behavior throughout Foundatio by implementing IResiliencePolicyProvider and passing it via options. This allows you to replace the default retry behavior in caching, queues, storage, and other Foundatio components.

Resilience Policy Sample

using Foundatio.Resilience;

// Create a basic resilience policy
var policy = new ResiliencePolicyBuilder()
    .WithMaxAttempts(5)
    .WithExponentialDelay(TimeSpan.FromSeconds(1))
    .WithTimeout(TimeSpan.FromMinutes(5))
    .WithJitter()
    .Build();

// Execute an operation with resilience
await policy.ExecuteAsync(async ct => {
    // Your operation that might fail
    await SomeUnreliableOperationAsync(ct);
});

Circuit Breaker Sample

using Foundatio.Resilience;

// Create a policy with circuit breaker
var policy = new ResiliencePolicyBuilder()
    .WithMaxAttempts(3)
    .WithCircuitBreaker(cb => cb
        .WithFailureRatio(0.5) // Open circuit at 50% failure rate
        .WithMinimumCalls(10)  // Need at least 10 calls before opening
        .WithBreakDuration(TimeSpan.FromMinutes(1)))
    .Build();

await policy.ExecuteAsync(async ct => {
    // This will be protected by the circuit breaker
    await CallExternalServiceAsync(ct);
});

Custom Resilience Provider Sample

using Foundatio.Resilience;

// Create a custom resilience provider for your application
var resilienceProvider = new ResiliencePolicyProvider()
    .WithDefaultPolicy(builder => builder
        .WithMaxAttempts(3)
        .WithExponentialDelay(TimeSpan.FromSeconds(1))
        .WithTimeout(TimeSpan.FromMinutes(2)))
    .WithPolicy("external-api", builder => builder
        .WithMaxAttempts(5)
        .WithCircuitBreaker()
        .WithTimeout(TimeSpan.FromSeconds(30)))
    .WithPolicy<MyService>(builder => builder
        .WithMaxAttempts(3)
        .WithLinearDelay()
        .WithTimeout(TimeSpan.FromSeconds(30)));

// Use named policies
var apiPolicy = resilienceProvider.GetPolicy("external-api");
await apiPolicy.ExecuteAsync(async ct => {
    await CallExternalApiAsync(ct);
});

// Use class based policies
var apiPolicy = resilienceProvider.GetPolicy<MyService>();
await apiPolicy.ExecuteAsync(async ct => {
    await CallMyServiceAsync(ct);
});

Sample Application

We have both slides and a sample application that shows off how to use Foundatio.

Thanks to all the people who have contributed

contributors

Showing the top 20 packages that depend on Foundatio.

Packages Downloads
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
10
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
11
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
14
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
15
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
16
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
17
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
18
Foundatio.Kafka
Pluggable foundation blocks for building distributed apps.
19

https://github.com/FoundatioFx/Foundatio/releases

Version Downloads Last updated
12.0.0 11 08/26/2025
11.1.0 13 05/17/2025
11.0.8 14 03/01/2025
11.0.7 15 03/01/2025
11.0.6 15 01/19/2025
11.0.5 15 01/19/2025
11.0.4 13 01/19/2025
11.0.3 15 01/19/2025
11.0.2 14 01/18/2025
11.0.1 13 01/18/2025
11.0.0 14 01/19/2025
10.7.1 16 01/19/2025
10.7.0 17 03/12/2024
10.6.1 16 03/01/2024
10.6.0 17 08/18/2023
10.5.0 16 03/01/2024
10.4.0 16 03/16/2024
10.3.1 17 03/12/2024
10.3.0 16 03/12/2024
10.2.5 17 03/12/2024
10.2.4 16 03/01/2024
10.2.3 16 03/12/2024
10.2.2 16 01/04/2024
10.2.1 15 02/08/2024
10.2.0 16 03/02/2024
10.1.4 15 03/01/2024
10.1.3 17 03/13/2024
10.1.2 16 12/13/2023
10.1.1 16 03/01/2024
10.1.0 17 03/12/2024
10.0.2 17 03/13/2024
10.0.1 15 03/13/2024
10.0.0 15 03/13/2024
10.0.0-beta9 12 03/16/2024
10.0.0-beta8 13 03/16/2024
10.0.0-beta7 14 03/17/2024
10.0.0-beta6 14 03/17/2024
10.0.0-beta5 14 03/17/2024
10.0.0-beta3 13 03/03/2024
10.0.0-beta2 12 03/16/2024
10.0.0-beta10 14 03/17/2024
10.0.0-beta1 15 02/27/2024
10.0.0-alpha3 15 03/22/2024
10.0.0-alpha2 16 03/17/2024
10.0.0-alpha1 16 03/17/2024
9.1.1 15 03/13/2024
9.1.0 13 01/26/2024
9.0.0 14 03/13/2024
8.1.2126 16 03/02/2024
8.1.2058 15 03/15/2024
8.1.2027 13 03/16/2024
8.0.1965 15 03/18/2024
8.0.1948 15 03/17/2024
7.1.1845 15 03/03/2024
7.1.1841 15 03/02/2024
7.1.1837 16 03/03/2024
7.1.1833 17 03/03/2024
7.0.1831 15 03/13/2024
7.0.1818 16 03/13/2024
7.0.1738 16 03/13/2024
7.0.1706 15 03/14/2024
6.0.1586 13 01/19/2025
5.1.1562 15 03/02/2024
5.1.1521 16 03/16/2024
5.1.1515 16 03/16/2024
5.1.1501 17 03/16/2024
5.1.1498 13 03/16/2024
5.1.1492 14 03/16/2024
5.1.1490 15 03/16/2024
5.1.1474 16 03/16/2024
5.1.1470 15 03/16/2024
5.1.1457 16 03/16/2024
5.1.1448 17 03/17/2024
5.1.1443 14 03/17/2024
5.0.1336 17 03/14/2024
5.0.1334 15 03/22/2024
5.0.1331 15 03/16/2024
5.0.1329-pre 13 03/02/2024
5.0.1328-pre 15 03/02/2024
5.0.1327-pre 13 03/16/2024
5.0.1326-pre 14 03/02/2024
5.0.1324-pre 14 03/06/2024
4.3.1323-pre 13 03/03/2024
4.3.1319 14 03/17/2024
4.3.1317 15 03/17/2024
4.3.1316 15 03/16/2024
4.3.1315 14 03/17/2024
4.3.1314 14 03/02/2024
4.3.1312 15 03/17/2024
4.3.1311-pre 14 03/03/2024
4.3.1307 15 03/03/2024
4.3.1306 17 03/16/2024
4.3.1305 16 03/17/2024
4.3.1304-pre 17 03/18/2024
4.3.1303-pre 13 03/19/2024
4.3.1301 17 03/16/2024
4.3.1299 18 03/17/2024
4.3.1297 13 03/16/2024
4.3.1293 15 03/16/2024
4.3.1292 16 03/16/2024
4.3.1291 16 03/17/2024
4.3.1290 16 03/17/2024
4.3.1289 15 03/16/2024
4.3.1288 15 03/16/2024
4.3.1286 14 03/17/2024
4.3.1282 15 03/14/2024
4.3.1281 13 03/16/2024
4.3.1280 16 03/16/2024
4.3.1276-pre 14 03/02/2024
4.3.1177-pre 13 03/17/2024
4.3.1164-pre 13 02/27/2024
4.2.1205-pre 14 03/18/2024
4.2.1183 15 03/16/2024
4.2.1179 14 03/17/2024
4.2.1176 13 01/19/2025
4.2.1172 16 03/03/2024
4.2.1171-pre 12 03/17/2024
4.2.1169 12 01/19/2025
4.2.1167-pre 13 03/18/2024
4.2.1166-pre 14 03/03/2024
4.2.1161 16 03/16/2024
4.2.1156-pre 14 03/18/2024
4.2.1155 16 03/16/2024
4.2.1150 14 03/16/2024
4.2.1149-pre 13 03/17/2024
4.2.1148-pre 15 03/03/2024
4.2.1147-pre 13 03/18/2024
4.2.1146-pre 13 03/17/2024
4.2.1137 15 03/17/2024
4.2.1129-pre 14 03/02/2024
4.2.1128-pre 15 03/03/2024
4.2.1127-pre 14 03/18/2024
4.2.1126-pre 13 03/02/2024
4.2.1125-pre 13 03/03/2024
4.2.1123-pre 14 03/03/2024
4.2.1119-pre 15 03/02/2024
4.2.1113-pre 15 03/18/2024
4.2.1108-pre 12 03/02/2024
4.2.1107-pre 12 03/18/2024
4.2.1104-pre 12 03/03/2024
4.2.1099-pre 14 03/17/2024
4.2.1098-pre 14 03/16/2024
4.2.1093-pre 13 03/03/2024
4.2.1091-pre 13 03/02/2024
4.2.1090-pre 14 03/05/2024
4.2.1089-pre 14 03/18/2024
4.2.1087-pre 15 03/17/2024
4.2.1083-pre 12 03/05/2024
4.2.1082-pre 13 03/02/2024
4.2.1081-pre 12 03/17/2024
4.2.1079-pre 13 03/18/2024
4.2.1078-pre 14 03/03/2024
4.2.1073-pre 13 03/17/2024
4.2.1070-pre 14 03/02/2024
4.2.1069-pre 13 03/18/2024
4.2.1059-pre 14 03/02/2024
4.2.1046-pre 16 03/02/2024
4.2.1031-pre 14 03/03/2024
4.2.1028-pre 14 03/02/2024
4.2.1027-pre 13 03/17/2024
4.1.1009 16 03/03/2024
4.1.1002-pre 14 03/16/2024
4.1.995-pre 17 03/03/2024
4.1.989-pre 17 03/05/2024
4.1.983-pre 13 03/02/2024
4.1.982-pre 12 03/02/2024
4.1.978-pre 14 03/02/2024
4.1.977-pre 15 03/05/2024
4.1.975-pre 17 03/02/2024
4.0.958 12 03/17/2024
4.0.957 13 03/17/2024
4.0.956 13 03/17/2024
4.0.955 13 03/16/2024
4.0.941 14 03/18/2024
4.0.940 13 03/16/2024
4.0.925 14 03/16/2024
4.0.922 13 03/16/2024
4.0.909 14 03/17/2024
4.0.880 12 03/17/2024
4.0.869 13 03/16/2024
4.0.864 13 03/17/2024
4.0.861 13 03/17/2024
4.0.860 14 03/17/2024
4.0.857 14 03/16/2024
4.0.855 12 03/03/2024
4.0.846 12 03/18/2024
4.0.842 13 03/17/2024
4.0.836 12 03/17/2024
4.0.835 11 01/19/2025
4.0.834 15 03/18/2024
4.0.832 12 03/18/2024
4.0.831 13 01/19/2025
4.0.829 14 03/17/2024
4.0.828 13 03/22/2024
4.0.827 14 03/17/2024
4.0.826 12 03/17/2024
4.0.825 14 03/17/2024
4.0.821 15 03/17/2024
4.0.819 13 03/17/2024
4.0.818 13 03/16/2024
4.0.816 13 03/17/2024
4.0.815 13 03/17/2024
4.0.814 17 03/22/2024
4.0.813 14 03/03/2024
4.0.812 14 03/16/2024
4.0.811 14 03/17/2024
4.0.810 14 03/16/2024
4.0.809 14 03/17/2024
4.0.805 15 03/03/2024
4.0.797 15 03/17/2024
4.0.796 11 03/16/2024
4.0.794 16 03/17/2024
4.0.793 14 03/16/2024
4.0.792 13 03/16/2024
4.0.791 13 03/17/2024
4.0.790 14 03/16/2024
4.0.788 14 03/17/2024
4.0.774 12 03/03/2024
4.0.773 13 03/22/2024
4.0.772 12 03/16/2024
4.0.770 13 03/17/2024
4.0.769 13 03/27/2024
4.0.762 16 03/16/2024
4.0.761 14 03/17/2024
4.0.760 13 03/16/2024
4.0.759 15 03/17/2024
4.0.758 14 03/16/2024
4.0.757 14 03/17/2024
4.0.756 15 03/17/2024
4.0.755 13 03/22/2024
4.0.754 13 03/16/2024
4.0.753 14 03/17/2024
4.0.752 14 03/17/2024
4.0.750 13 03/17/2024
4.0.749 13 03/22/2024
4.0.747 14 03/17/2024
4.0.746 13 03/17/2024
4.0.744 12 03/16/2024
4.0.743 13 03/17/2024
4.0.742 13 03/17/2024
4.0.741 13 03/17/2024
4.0.739 14 03/16/2024
4.0.738 12 03/14/2024
4.0.734 13 03/16/2024
4.0.733-beta 17 03/17/2024
4.0.672 13 03/17/2024
4.0.669 14 03/17/2024
4.0.668 14 03/17/2024
3.0.654 13 03/13/2024
3.0.646 13 03/13/2024
3.0.645 13 03/12/2024
3.0.644 13 03/12/2024
3.0.639 14 03/13/2024
3.0.638 13 03/13/2024
3.0.637 14 03/13/2024
3.0.635 13 03/13/2024
3.0.633 13 03/13/2024
3.0.632 11 03/03/2024
3.0.629 13 03/13/2024
3.0.626 14 03/13/2024
3.0.625 12 03/13/2024
3.0.624 14 03/13/2024
3.0.623 13 03/02/2024
3.0.622 12 03/13/2024
3.0.621 13 03/12/2024
3.0.620 12 03/22/2024
3.0.613 14 03/13/2024
3.0.611 14 03/02/2024
3.0.610 11 03/12/2024
3.0.606 14 03/13/2024
3.0.605 12 03/02/2024
3.0.603 13 03/13/2024
3.0.601 12 03/13/2024
3.0.600 13 03/13/2024
3.0.599 12 03/22/2024
3.0.598 14 03/13/2024
3.0.592 14 03/13/2024
3.0.589 13 03/13/2024
3.0.588 12 03/02/2024
3.0.586 14 03/13/2024
3.0.584 13 03/13/2024
3.0.583 15 03/13/2024
3.0.581 13 03/13/2024
3.0.579 13 03/13/2024
3.0.576 13 03/12/2024
3.0.575 14 03/12/2024
3.0.574 13 03/13/2024
3.0.569 13 03/13/2024
3.0.568 13 03/02/2024
3.0.566 16 03/12/2024
3.0.548 15 03/13/2024
3.0.545 14 03/12/2024
3.0.538 14 03/13/2024
3.0.537 12 03/12/2024
3.0.536 10 01/18/2025
3.0.534 17 03/13/2024
3.0.532 15 03/13/2024
3.0.531 13 01/19/2025
3.0.524 14 03/13/2024
3.0.523 12 03/13/2024
3.0.522 14 03/12/2024
3.0.520 13 03/13/2024
3.0.519 14 03/13/2024
3.0.518 14 03/02/2024
3.0.517 13 03/13/2024
3.0.516 12 03/13/2024
3.0.514 14 03/12/2024
3.0.513 13 03/13/2024
3.0.512 14 03/22/2024
3.0.509 13 03/13/2024
3.0.507 13 03/12/2024
3.0.505 12 03/13/2024
3.0.503 14 03/16/2024
3.0.502 12 03/13/2024
3.0.479 15 03/13/2024
3.0.476 14 03/13/2024
3.0.471 13 03/13/2024
3.0.470 13 03/13/2024
3.0.469 14 03/13/2024
3.0.468 14 03/13/2024
3.0.467 14 03/13/2024
3.0.465 14 03/13/2024
3.0.459 13 03/13/2024
3.0.456 13 03/12/2024
3.0.455 14 03/12/2024
3.0.454 13 03/12/2024
3.0.453 12 03/13/2024
3.0.452 13 03/13/2024
3.0.451 15 03/13/2024
3.0.450 14 03/13/2024
3.0.447 13 03/13/2024
2.0.378 12 03/16/2024
2.0.372 14 03/15/2024
2.0.370 13 03/14/2024
2.0.368 15 03/14/2024
2.0.365 13 03/12/2024
2.0.363 12 03/14/2024
2.0.361 15 03/14/2024
1.0.360 12 03/02/2024
1.0.359 13 02/29/2024
1.0.358 12 03/02/2024
1.0.356 14 03/13/2024
1.0.355 14 03/13/2024
1.0.354 12 03/22/2024
1.0.305 11 01/31/2025
1.0.299 13 03/16/2024
1.0.293 13 03/17/2024
1.0.292 13 03/16/2024
1.0.289 12 03/22/2024
1.0.288 14 03/26/2024
1.0.286 13 03/17/2024
1.0.285 14 03/16/2024
1.0.284 14 03/02/2024
1.0.282 14 03/16/2024
1.0.281 16 03/16/2024
1.0.279 13 03/16/2024
1.0.277 14 03/16/2024
1.0.276 13 03/16/2024
1.0.275 13 03/22/2024
1.0.274 14 03/16/2024
1.0.272 13 02/27/2024
1.0.269 13 03/16/2024
1.0.268 14 03/03/2024
1.0.266 14 03/03/2024
1.0.263 12 03/22/2024
1.0.258 12 03/03/2024
1.0.257 12 02/28/2024
1.0.256 13 03/18/2024
1.0.254 13 03/16/2024
1.0.253 14 03/19/2024
1.0.250 14 03/16/2024
1.0.249 14 03/17/2024
1.0.248 12 03/03/2024
1.0.245 15 03/02/2024
1.0.241 13 03/17/2024
1.0.240 15 03/18/2024
1.0.237 14 03/17/2024
1.0.234 16 03/03/2024
1.0.233 15 03/17/2024
1.0.231 15 03/16/2024
1.0.230 12 03/16/2024
1.0.229 12 01/19/2025
1.0.226 14 03/16/2024
1.0.217 12 03/16/2024
1.0.215 12 03/02/2024
1.0.213 14 03/03/2024
1.0.210 13 03/16/2024
1.0.209 16 03/16/2024
1.0.202 13 03/16/2024
1.0.201 14 02/28/2024
1.0.198 13 03/16/2024
1.0.197 14 03/22/2024
1.0.196 12 03/02/2024
1.0.195 13 03/03/2024
1.0.194 14 03/16/2024
1.0.193 15 03/03/2024
1.0.192 10 03/01/2025
1.0.191 13 03/17/2024
1.0.189 13 03/03/2024
1.0.187 15 03/02/2024
1.0.186 16 03/02/2024
1.0.185 14 03/03/2024
1.0.183 12 03/18/2024
1.0.181 16 03/16/2024
1.0.180 13 03/17/2024
1.0.178 14 02/28/2024
1.0.177 16 03/16/2024
1.0.175 14 03/17/2024
1.0.171 14 03/17/2024
1.0.170 11 01/18/2025
1.0.168 14 03/14/2024
1.0.164 12 03/02/2024
1.0.162 14 03/16/2024
1.0.160 14 03/17/2024
1.0.159 13 03/16/2024
1.0.157 14 03/03/2024
1.0.156 14 02/28/2024
1.0.154 14 03/16/2024
1.0.152 14 03/16/2024
1.0.151 12 03/17/2024
1.0.150 13 03/17/2024
1.0.149 16 03/03/2024
1.0.148 14 03/16/2024
1.0.147 14 03/17/2024
1.0.146 12 03/22/2024
1.0.145 13 03/17/2024
1.0.143 12 03/16/2024
1.0.142 13 03/17/2024
1.0.141 14 03/16/2024
1.0.140 13 03/17/2024
1.0.139 14 03/16/2024
1.0.138 13 02/28/2024
1.0.137 12 01/19/2025
1.0.134 12 03/16/2024
1.0.129 13 03/16/2024
1.0.128 14 03/15/2024
1.0.125 12 03/16/2024
1.0.124 12 01/19/2025
1.0.122 11 03/16/2024
1.0.119 12 03/03/2024
1.0.117 13 03/16/2024
1.0.115 14 03/03/2024
1.0.114 13 03/14/2024
1.0.113 14 03/16/2024
1.0.112 14 03/16/2024
1.0.111 14 02/28/2024
1.0.110 13 03/16/2024
1.0.109 11 01/19/2025
1.0.108 14 03/15/2024
1.0.103 14 03/16/2024
1.0.37 17 03/12/2024
1.0.36 16 03/12/2024
1.0.35 17 03/02/2024
1.0.34 17 03/13/2024
1.0.33 15 03/02/2024
1.0.32 15 03/13/2024
1.0.31 17 03/12/2024
1.0.30 16 03/12/2024
1.0.28 16 03/13/2024
1.0.27 15 03/14/2024
1.0.26 15 01/19/2025
1.0.25 16 03/13/2024
1.0.24 17 03/16/2024
1.0.23 14 03/22/2024
1.0.0 16 03/14/2024