Foundatio.AzureStorage 10.5.0

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
.NET Standard 2.0
dotnet add package Foundatio.AzureStorage --version 10.5.0
NuGet\Install-Package Foundatio.AzureStorage -Version 10.5.0
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="Foundatio.AzureStorage" Version="10.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureStorage --version 10.5.0
#r "nuget: Foundatio.AzureStorage, 10.5.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Foundatio.AzureStorage as a Cake Addin
#addin nuget:?package=Foundatio.AzureStorage&version=10.5.0

// Install Foundatio.AzureStorage as a Cake Tool
#tool nuget:?package=Foundatio.AzureStorage&version=10.5.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 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 but found Azure support lacking and local set up a pain. 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.sln 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 the InMemoryCacheClient and uses the IMessageBus to keep the cache in sync across processes.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: This cache implementation uses both the RedisCacheClient and InMemoryCacheClient implementations and uses the RedisMessageBus to keep the in memory cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and call to Redis if the item exists in the local cache.
  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 lock = await locker.AcquireAsync("test");
// ...
await lock.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. 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")

Metrics

We provide five implementations that derive from the IMetricsClient interface:

  1. InMemoryMetricsClient: An in memory metrics implementation.
  2. RedisMetricsClient: An Redis metrics implementation.
  3. StatsDMetricsClient: An statsd metrics implementation.
  4. MetricsNETClient: An Metrics.NET implementation.
  5. AppMetricsClient: An AppMetrics implementation.
  6. CloudWatchMetricsClient: An AWS CloudWatch implementation.

We recommend using all of the IMetricsClient implementations as singletons.

Sample
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

Sample Application

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

Roadmap

This is a list of high level things that we are planning to do:

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows net7.0 net7.0-android net7.0-ios net7.0-maccatalyst net7.0-macos net7.0-tvos net7.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Foundatio.AzureStorage:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

ReCloud.Business.Lgm

ReCloud Business Class Library

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Foundatio.AzureStorage:

Repository Stars
exceptionless/Exceptionless
Exceptionless server and jobs
Version Downloads Last updated
10.5.0 3,013 5/18/2022
10.4.0 2,285 3/8/2022
10.3.0 1,324 1/20/2022
10.2.0 6,493 7/8/2021
10.1.0 667 6/16/2021
10.0.2 13,375 1/20/2021
10.0.0 4,258 9/16/2020
10.0.0-beta9 411 8/25/2020
10.0.0-beta8 292 8/3/2020
10.0.0-beta7 298 7/29/2020
10.0.0-beta6 381 7/8/2020
10.0.0-beta3 403 6/14/2020
10.0.0-beta2 369 6/6/2020
10.0.0-beta10 332 9/15/2020
10.0.0-beta1 335 5/26/2020
9.0.0 20,180 1/16/2020
8.1.1537 79,926 8/30/2019
8.0.1530 11,360 5/14/2019
8.0.1528 671 4/16/2019
8.0.1525 1,246 2/24/2019
8.0.1523 548 2/22/2019
7.0.1507 14,058 9/7/2018
7.0.1505 1,543 5/9/2018
6.0.1479 8,513 11/30/2017
5.1.1460 3,092 7/4/2017
5.1.1456 917 5/5/2017
5.0.1336 1,179 3/14/2017
5.0.1334 856 3/13/2017
5.0.1331 826 3/12/2017
5.0.1329-pre 714 3/12/2017
5.0.1328-pre 737 3/12/2017
5.0.1327-pre 715 3/12/2017
5.0.1326-pre 733 3/12/2017
5.0.1324-pre 736 3/12/2017
4.3.1323-pre 711 3/11/2017
4.3.1319 865 3/1/2017
4.3.1317 850 2/23/2017
4.3.1316 871 2/22/2017
4.3.1315 944 2/22/2017
4.3.1314 891 2/20/2017
4.3.1312 820 2/20/2017
4.3.1311-pre 739 2/20/2017
4.3.1307 882 2/16/2017
4.3.1306 866 2/15/2017
4.3.1305 842 2/15/2017
4.3.1304-pre 724 2/15/2017
4.3.1303-pre 738 2/14/2017
4.3.1301 869 2/14/2017
4.3.1299 841 2/14/2017
4.3.1293 859 2/12/2017
4.3.1292 866 2/10/2017
4.3.1291 879 2/10/2017
4.3.1290 889 2/10/2017
4.3.1289 874 2/9/2017
4.3.1288 859 2/9/2017
4.3.1286 867 2/8/2017
4.3.1282 880 2/5/2017
4.3.1281 845 2/5/2017
4.3.1280 862 2/5/2017
4.3.1276-pre 704 2/5/2017
4.3.1177-pre 828 9/2/2016
4.3.1164-pre 758 8/21/2016
4.2.1205-pre 1,141 9/19/2016
4.2.1183 1,717 9/9/2016
4.2.1179 897 9/8/2016
4.2.1176 879 9/2/2016
4.2.1172 865 9/1/2016
4.2.1171-pre 754 9/1/2016
4.2.1169 938 8/22/2016
4.2.1167-pre 775 8/22/2016
4.2.1166-pre 759 8/22/2016
4.2.1161 894 8/10/2016
4.2.1156-pre 761 8/2/2016
4.2.1155 884 8/1/2016
4.2.1150 1,078 7/20/2016
4.2.1149-pre 745 7/19/2016
4.2.1148-pre 766 7/19/2016
4.2.1147-pre 759 7/19/2016
4.2.1146-pre 742 7/19/2016
4.2.1137 875 7/19/2016
4.2.1129-pre 762 7/19/2016
4.2.1128-pre 752 7/19/2016
4.2.1127-pre 723 7/19/2016
4.2.1126-pre 743 7/19/2016
4.2.1125-pre 774 7/19/2016
4.2.1123-pre 772 7/19/2016
4.2.1119-pre 759 7/18/2016
4.2.1113-pre 746 7/16/2016
4.2.1108-pre 758 7/15/2016
4.2.1107-pre 766 7/15/2016
4.2.1104-pre 938 7/13/2016
4.2.1099-pre 920 7/12/2016
4.2.1098-pre 925 7/12/2016
4.2.1093-pre 793 7/8/2016
4.2.1091-pre 761 7/8/2016
4.2.1090-pre 800 7/8/2016
4.2.1089-pre 811 7/7/2016
4.2.1087-pre 761 7/7/2016
4.2.1083-pre 812 7/6/2016
4.2.1082-pre 793 7/6/2016
4.2.1081-pre 752 7/6/2016
4.2.1079-pre 773 7/6/2016
4.2.1078-pre 778 7/6/2016
4.2.1073-pre 785 7/5/2016
4.2.1070-pre 741 7/5/2016
4.2.1069-pre 747 7/1/2016
4.2.1059-pre 761 7/1/2016
4.2.1046-pre 756 6/24/2016
4.2.1031-pre 726 6/24/2016
4.2.1028-pre 778 6/24/2016
4.2.1027-pre 740 6/24/2016
4.1.1009 1,317 6/15/2016
4.1.1002-pre 1,059 6/14/2016
4.1.995-pre 971 6/13/2016
4.1.989-pre 1,070 5/26/2016
4.1.983-pre 748 5/25/2016
4.1.982-pre 766 5/25/2016
4.1.978-pre 844 5/6/2016
4.1.977-pre 752 5/5/2016
4.1.975-pre 740 5/5/2016
4.0.958 1,009 5/1/2016
4.0.957 1,036 4/29/2016
4.0.956 1,038 4/29/2016
4.0.955 908 4/28/2016
4.0.941 1,130 4/27/2016
4.0.940 1,116 4/27/2016
4.0.925 988 4/27/2016
4.0.922 951 4/27/2016
4.0.909 1,086 4/20/2016
4.0.880 976 4/7/2016
4.0.869 949 3/30/2016
4.0.864 869 3/29/2016
4.0.861 884 3/29/2016
4.0.860 853 3/29/2016
4.0.857 892 3/29/2016
4.0.855 882 3/29/2016
4.0.846 982 3/22/2016
4.0.842 1,164 3/21/2016
4.0.836 937 3/18/2016
4.0.835 873 3/18/2016
4.0.834 889 3/17/2016
4.0.832 861 3/17/2016
4.0.831 861 3/16/2016
4.0.829 867 3/16/2016
4.0.828 874 3/15/2016
4.0.827 882 3/15/2016
4.0.826 899 3/15/2016
4.0.825 963 3/13/2016
4.0.821 946 3/11/2016
4.0.819 874 3/11/2016
4.0.818 862 3/11/2016
4.0.816 973 3/11/2016
4.0.815 955 3/11/2016
4.0.814 977 3/11/2016
4.0.813 970 3/10/2016
4.0.812 990 3/10/2016
4.0.811 962 3/10/2016
4.0.810 922 3/10/2016
4.0.809 904 3/10/2016
4.0.805 884 3/9/2016
4.0.797 868 3/9/2016
4.0.796 881 3/9/2016
4.0.794 879 3/9/2016
4.0.793 914 3/9/2016
4.0.792 878 3/8/2016
4.0.791 875 3/8/2016
4.0.790 869 3/8/2016
4.0.788 884 3/8/2016
4.0.774 910 3/2/2016
4.0.773 911 3/1/2016
4.0.772 882 3/1/2016
4.0.770 999 3/1/2016
4.0.769 943 3/1/2016
4.0.762 907 3/1/2016
4.0.761 1,037 3/1/2016
4.0.760 878 2/29/2016
4.0.759 931 2/29/2016
4.0.758 955 2/29/2016
4.0.757 886 2/29/2016
4.0.756 1,073 2/27/2016
4.0.755 1,075 2/27/2016
4.0.754 923 2/27/2016
4.0.753 1,362 2/27/2016
4.0.752 1,263 2/27/2016
4.0.750 1,119 2/27/2016
4.0.749 934 2/27/2016
4.0.747 993 2/26/2016
4.0.746 1,163 2/26/2016
4.0.744 1,200 2/26/2016
4.0.743 994 2/26/2016
4.0.742 1,041 2/26/2016
4.0.741 1,296 2/26/2016
4.0.739 1,221 2/25/2016
4.0.738 1,305 2/25/2016
4.0.734 1,254 2/25/2016
4.0.733-beta 940 2/25/2016
4.0.672 1,032 2/16/2016
4.0.669 1,062 2/11/2016
4.0.668 983 2/11/2016
3.0.654 913 2/10/2016
3.0.646 923 2/5/2016
3.0.645 876 2/5/2016
3.0.644 866 2/5/2016
3.0.639 912 2/3/2016
3.0.638 904 2/2/2016
3.0.637 930 2/1/2016
3.0.635 892 2/1/2016
3.0.633 959 1/27/2016
3.0.632 877 1/27/2016
3.0.629 1,035 1/18/2016
3.0.626 893 1/18/2016
3.0.625 1,056 1/18/2016
3.0.624 1,108 12/17/2015
3.0.623 933 12/9/2015
3.0.622 899 12/9/2015
3.0.621 937 12/9/2015
3.0.620 907 12/8/2015
3.0.613 1,009 12/4/2015
3.0.611 1,150 12/3/2015
3.0.610 1,093 11/30/2015
3.0.606 1,133 11/30/2015
3.0.605 984 11/25/2015
3.0.603 973 11/23/2015
3.0.601 983 11/23/2015
3.0.600 1,000 11/19/2015
3.0.599 963 11/19/2015
3.0.598 946 11/17/2015
3.0.592 926 11/12/2015
3.0.589 928 11/10/2015
3.0.588 936 11/10/2015
3.0.586 945 11/10/2015
3.0.584 911 11/10/2015
3.0.583 925 11/10/2015
3.0.581 924 11/6/2015
3.0.579 899 11/6/2015
3.0.576 915 11/5/2015
3.0.575 921 11/4/2015
3.0.574 925 11/4/2015
3.0.569 895 11/3/2015
3.0.568 893 11/3/2015
3.0.566 900 11/3/2015
3.0.545 1,049 10/28/2015
3.0.538 986 10/22/2015
3.0.537 904 10/21/2015
3.0.536 943 10/21/2015
3.0.534 925 10/21/2015
3.0.532 953 10/21/2015
3.0.531 975 10/21/2015
3.0.524 894 10/15/2015
3.0.523 1,044 10/10/2015
3.0.522 881 10/10/2015
3.0.520 955 10/9/2015
3.0.519 1,157 10/9/2015
3.0.518 1,070 10/9/2015
3.0.517 1,147 10/9/2015
3.0.516 1,134 10/7/2015
3.0.514 1,095 10/6/2015
3.0.513 1,240 10/6/2015
3.0.512 1,062 10/6/2015
3.0.509 1,072 10/1/2015
3.0.507 994 10/1/2015
3.0.505 1,076 9/30/2015
3.0.503 1,056 9/30/2015
3.0.502 1,015 9/30/2015
3.0.479 1,011 9/25/2015
3.0.476 946 9/24/2015
3.0.471 967 9/24/2015
3.0.470 1,029 9/24/2015
3.0.469 954 9/24/2015
3.0.468 976 9/24/2015
3.0.467 964 9/24/2015
3.0.465 982 9/24/2015
3.0.459 927 9/23/2015
3.0.456 932 9/23/2015
3.0.455 1,003 9/22/2015
3.0.454 985 9/19/2015
3.0.453 979 9/19/2015
3.0.452 963 9/18/2015
3.0.451 948 9/18/2015
3.0.450 967 9/18/2015
3.0.447 958 9/18/2015
2.0.378 988 9/5/2015
2.0.372 945 9/4/2015
2.0.370 939 9/4/2015
2.0.368 938 9/4/2015
2.0.365 943 9/3/2015
2.0.363 922 9/3/2015
2.0.361 940 9/3/2015
1.0.360 921 9/1/2015
1.0.359 915 9/1/2015
1.0.358 941 9/1/2015
1.0.356 954 8/31/2015
1.0.355 927 8/31/2015
1.0.354 945 8/29/2015
1.0.305 949 8/19/2015
1.0.299 1,289 8/8/2015
1.0.293 978 7/20/2015
1.0.292 1,053 7/20/2015
1.0.289 1,154 7/10/2015
1.0.288 911 7/10/2015
1.0.286 1,051 7/7/2015
1.0.285 950 7/7/2015
1.0.284 944 7/7/2015
1.0.282 957 7/6/2015
1.0.281 936 7/6/2015
1.0.279 941 7/6/2015
1.0.277 969 6/18/2015
1.0.276 949 6/8/2015
1.0.275 886 6/8/2015
1.0.274 911 6/8/2015
1.0.272 1,334 6/1/2015
1.0.269 974 5/25/2015
1.0.268 910 5/24/2015
1.0.266 941 5/24/2015
1.0.263 932 5/21/2015
1.0.258 922 5/19/2015
1.0.257 939 5/18/2015
1.0.256 1,040 5/17/2015
1.0.254 877 5/13/2015
1.0.253 896 5/13/2015
1.0.250 897 5/13/2015
1.0.249 906 5/12/2015
1.0.248 908 5/12/2015
1.0.245 938 5/12/2015
1.0.241 902 5/12/2015
1.0.240 920 5/12/2015
1.0.237 921 5/11/2015
1.0.234 937 5/9/2015
1.0.233 930 5/9/2015
1.0.231 909 5/7/2015
1.0.230 915 5/7/2015
1.0.229 893 5/7/2015
1.0.226 915 5/7/2015
1.0.217 1,117 4/28/2015
1.0.215 1,053 4/27/2015
1.0.213 1,132 4/23/2015
1.0.210 1,062 4/23/2015
1.0.209 1,035 4/15/2015
1.0.202 988 4/15/2015
1.0.201 1,011 4/15/2015
1.0.198 963 4/15/2015
1.0.197 964 4/15/2015
1.0.196 963 4/15/2015
1.0.195 960 4/15/2015
1.0.194 967 4/15/2015
1.0.193 953 4/15/2015
1.0.192 970 4/15/2015
1.0.191 1,003 4/14/2015
1.0.189 994 4/10/2015
1.0.187 978 4/9/2015
1.0.186 955 4/8/2015
1.0.185 1,085 4/6/2015
1.0.183 937 4/3/2015
1.0.181 967 4/3/2015
1.0.180 927 4/2/2015
1.0.178 974 4/1/2015
1.0.177 942 4/1/2015
1.0.175 937 4/1/2015
1.0.171 915 3/31/2015
1.0.170 945 3/31/2015
1.0.168 936 3/31/2015
1.0.164 965 3/30/2015
1.0.162 946 3/28/2015
1.0.160 964 3/27/2015
1.0.159 935 3/26/2015
1.0.156 1,162 3/24/2015
1.0.154 921 3/24/2015
1.0.152 942 3/24/2015
1.0.151 906 3/24/2015
1.0.150 925 3/23/2015
1.0.149 934 3/23/2015
1.0.148 948 3/23/2015
1.0.147 928 3/21/2015
1.0.146 918 3/20/2015
1.0.145 910 3/19/2015
1.0.143 931 3/18/2015
1.0.142 1,073 3/12/2015
1.0.141 919 3/12/2015
1.0.140 961 3/5/2015
1.0.139 992 3/5/2015
1.0.138 940 3/4/2015
1.0.137 1,270 3/3/2015
1.0.134 937 3/3/2015
1.0.129 1,165 3/3/2015
1.0.128 1,052 3/3/2015
1.0.125 1,075 2/28/2015
1.0.124 1,039 2/28/2015
1.0.122 909 2/28/2015
1.0.119 1,442 2/25/2015
1.0.117 1,508 2/24/2015
1.0.115 1,120 2/24/2015
1.0.114 1,265 2/23/2015
1.0.113 1,415 2/23/2015
1.0.112 1,403 2/23/2015
1.0.111 1,373 2/23/2015
1.0.110 1,172 2/23/2015
1.0.109 1,429 2/22/2015
1.0.108 1,172 2/22/2015
1.0.103 1,369 2/22/2015
1.0.0 1,459 2/21/2015