Foundatio.AzureServiceBus 10.2.2 Prefix Reserved

Install-Package Foundatio.AzureServiceBus -Version 10.2.2
dotnet add package Foundatio.AzureServiceBus --version 10.2.2
<PackageReference Include="Foundatio.AzureServiceBus" Version="10.2.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureServiceBus --version 10.2.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.AzureServiceBus, 10.2.2"
#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.AzureServiceBus as a Cake Addin
#addin nuget:?package=Foundatio.AzureServiceBus&version=10.2.2

// Install Foundatio.AzureServiceBus as a Cake Tool
#tool nuget:?package=Foundatio.AzureServiceBus&version=10.2.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

Foundatio

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:

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Foundatio.AzureServiceBus:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.2.2 200 9/23/2021
10.2.0 1,518 7/8/2021
10.1.0 283 6/16/2021
10.0.2 1,604 1/20/2021
10.0.0 1,324 9/16/2020
10.0.0-beta9 247 8/25/2020
10.0.0-beta8 222 8/3/2020
10.0.0-beta7 220 7/29/2020
10.0.0-beta6 259 7/8/2020
10.0.0-beta5 405 6/20/2020
10.0.0-beta3 335 6/14/2020
10.0.0-beta2 331 6/6/2020
10.0.0-beta10 219 9/15/2020
10.0.0-beta1 294 5/26/2020
9.0.0 37,767 1/16/2020
8.1.1518 5,802 8/30/2019
8.0.1512 1,220 5/14/2019
8.0.1510 360 4/16/2019
8.0.1507 400 2/24/2019
8.0.1505 353 2/22/2019
7.0.1490 619 5/9/2018
6.0.1467 742 11/30/2017
5.1.1454 701 5/5/2017
5.0.1336 730 3/14/2017
5.0.1334 580 3/13/2017
5.0.1331 616 3/12/2017
5.0.1329-pre 569 3/12/2017
5.0.1328-pre 589 3/12/2017
5.0.1327-pre 587 3/12/2017
5.0.1326-pre 587 3/12/2017
5.0.1324-pre 583 3/12/2017
4.3.1323-pre 591 3/11/2017
4.3.1319 613 3/1/2017
4.3.1317 589 2/23/2017
4.3.1316 632 2/22/2017
4.3.1315 623 2/22/2017
4.3.1314 625 2/20/2017
4.3.1312 608 2/20/2017
4.3.1311-pre 636 2/20/2017
4.3.1307 627 2/16/2017
4.3.1306 610 2/15/2017
4.3.1305 611 2/15/2017
4.3.1304-pre 581 2/15/2017
4.3.1303-pre 603 2/14/2017
4.3.1301 600 2/14/2017
4.3.1299 601 2/14/2017
4.3.1293 630 2/12/2017
4.3.1292 598 2/10/2017
4.3.1291 648 2/10/2017
4.3.1290 616 2/10/2017
4.3.1289 615 2/9/2017
4.3.1288 600 2/9/2017
4.3.1286 614 2/8/2017
4.3.1282 600 2/5/2017
4.3.1281 599 2/5/2017
4.3.1280 591 2/5/2017
4.3.1276-pre 568 2/5/2017
4.3.1177-pre 615 9/2/2016
4.3.1164-pre 621 8/21/2016
4.2.1205-pre 603 9/19/2016
4.2.1183 763 9/9/2016
4.2.1179 637 9/8/2016
4.2.1176 627 9/2/2016
4.2.1172 598 9/1/2016
4.2.1171-pre 609 9/1/2016
4.2.1169 615 8/22/2016
4.2.1167-pre 578 8/22/2016
4.2.1166-pre 589 8/22/2016
4.2.1161 624 8/10/2016
4.2.1156-pre 611 8/2/2016
4.2.1155 618 8/1/2016
4.2.1150 639 7/20/2016
4.2.1149-pre 610 7/19/2016
4.2.1148-pre 604 7/19/2016
4.2.1147-pre 624 7/19/2016
4.2.1146-pre 589 7/19/2016
4.2.1137 673 7/19/2016
4.2.1129-pre 592 7/19/2016
4.2.1128-pre 623 7/19/2016
4.2.1127-pre 572 7/19/2016
4.2.1126-pre 607 7/19/2016
4.2.1125-pre 604 7/19/2016
4.2.1123-pre 610 7/19/2016
4.2.1119-pre 610 7/18/2016
4.2.1113-pre 634 7/16/2016
4.2.1108-pre 599 7/15/2016
4.2.1107-pre 622 7/15/2016
4.2.1104-pre 752 7/13/2016
4.2.1099-pre 761 7/12/2016
4.2.1098-pre 764 7/12/2016
4.2.1093-pre 630 7/8/2016
4.2.1091-pre 610 7/8/2016
4.2.1090-pre 626 7/8/2016
4.2.1089-pre 622 7/7/2016
4.2.1087-pre 638 7/7/2016
4.2.1083-pre 630 7/6/2016
4.2.1082-pre 613 7/6/2016
4.2.1081-pre 617 7/6/2016
4.2.1079-pre 636 7/6/2016
4.2.1078-pre 641 7/6/2016
4.2.1073-pre 631 7/5/2016
4.2.1070-pre 597 7/5/2016
4.2.1069-pre 602 7/1/2016
4.2.1059-pre 613 7/1/2016
4.2.1046-pre 585 6/24/2016
4.2.1031-pre 595 6/24/2016
4.2.1028-pre 599 6/24/2016
4.2.1027-pre 613 6/24/2016
4.1.1009 978 6/15/2016
4.1.1002-pre 593 6/14/2016
4.1.995-pre 800 6/13/2016
4.1.989-pre 595 5/26/2016
4.1.983-pre 585 5/25/2016
4.1.982-pre 610 5/25/2016
4.1.978-pre 616 5/6/2016
4.1.977-pre 617 5/5/2016
4.1.975-pre 602 5/5/2016
4.0.958 635 5/1/2016
4.0.957 660 4/29/2016
4.0.956 660 4/29/2016
4.0.955 633 4/28/2016
4.0.941 630 4/27/2016
4.0.940 636 4/27/2016
4.0.925 630 4/27/2016
4.0.922 661 4/27/2016
4.0.909 650 4/20/2016
4.0.880 670 4/7/2016
4.0.869 634 3/30/2016
4.0.864 644 3/29/2016
4.0.861 631 3/29/2016
4.0.860 641 3/29/2016
4.0.857 630 3/29/2016
4.0.855 617 3/29/2016
4.0.846 657 3/22/2016
4.0.842 613 3/21/2016
4.0.836 648 3/18/2016
4.0.835 643 3/18/2016
4.0.834 613 3/17/2016
4.0.832 656 3/17/2016
4.0.831 618 3/16/2016
4.0.829 610 3/16/2016
4.0.828 648 3/15/2016
4.0.827 654 3/15/2016
4.0.826 631 3/15/2016
4.0.825 673 3/13/2016
4.0.821 711 3/11/2016
4.0.819 658 3/11/2016
4.0.818 658 3/11/2016
4.0.816 677 3/11/2016
4.0.815 667 3/11/2016
4.0.814 685 3/11/2016
4.0.813 633 3/10/2016
4.0.812 725 3/10/2016
4.0.811 664 3/10/2016
4.0.810 640 3/10/2016
4.0.809 657 3/10/2016
4.0.805 605 3/9/2016
4.0.797 620 3/9/2016
4.0.796 633 3/9/2016
4.0.794 648 3/9/2016
4.0.793 618 3/9/2016
4.0.792 632 3/8/2016
4.0.791 606 3/8/2016
4.0.790 610 3/8/2016
4.0.788 652 3/8/2016
4.0.774 641 3/2/2016
4.0.773 628 3/1/2016
4.0.772 643 3/1/2016
4.0.770 626 3/1/2016
4.0.769 721 3/1/2016
4.0.762 622 3/1/2016
4.0.761 659 3/1/2016
4.0.760 624 2/29/2016
4.0.759 618 2/29/2016
4.0.758 638 2/29/2016
4.0.757 647 2/29/2016
4.0.756 643 2/27/2016
4.0.755 631 2/27/2016
4.0.754 606 2/27/2016
4.0.753 615 2/27/2016
4.0.752 632 2/27/2016
4.0.750 619 2/27/2016
4.0.749 640 2/27/2016
4.0.747 624 2/26/2016
4.0.746 632 2/26/2016
4.0.744 621 2/26/2016
4.0.743 635 2/26/2016
4.0.742 639 2/26/2016
4.0.741 630 2/26/2016
4.0.739 608 2/25/2016
4.0.738 624 2/25/2016
4.0.734 664 2/25/2016
4.0.733-beta 593 2/25/2016
4.0.672 643 2/16/2016
4.0.669 692 2/11/2016
4.0.668 680 2/11/2016
3.0.654 649 2/10/2016
3.0.646 654 2/5/2016
3.0.645 650 2/5/2016
3.0.644 604 2/5/2016
3.0.639 660 2/3/2016
3.0.638 646 2/2/2016
3.0.637 652 2/1/2016
3.0.635 622 2/1/2016
3.0.633 624 1/27/2016
3.0.632 660 1/27/2016
3.0.629 651 1/18/2016
3.0.626 638 1/18/2016
3.0.625 623 1/18/2016
3.0.624 651 12/17/2015
3.0.623 754 12/9/2015
3.0.622 647 12/9/2015
3.0.621 625 12/9/2015
3.0.620 628 12/8/2015
3.0.613 698 12/4/2015
3.0.611 637 12/3/2015
3.0.610 647 11/30/2015
3.0.606 641 11/30/2015
3.0.605 620 11/25/2015
3.0.603 660 11/23/2015
3.0.601 653 11/23/2015
3.0.600 660 11/19/2015
3.0.599 644 11/19/2015
3.0.598 643 11/17/2015
3.0.592 686 11/12/2015
3.0.589 664 11/10/2015
3.0.588 637 11/10/2015
3.0.586 689 11/10/2015
3.0.584 641 11/10/2015
3.0.583 666 11/10/2015
3.0.581 648 11/6/2015
3.0.579 655 11/6/2015
3.0.576 653 11/5/2015
3.0.575 650 11/4/2015
3.0.574 676 11/4/2015
3.0.569 666 11/3/2015
3.0.568 659 11/3/2015
3.0.566 663 11/3/2015
3.0.545 652 10/28/2015
3.0.538 680 10/22/2015
3.0.537 662 10/21/2015
3.0.536 646 10/21/2015
3.0.534 638 10/21/2015
3.0.532 693 10/21/2015
3.0.531 646 10/21/2015
3.0.524 666 10/15/2015
3.0.523 645 10/10/2015
3.0.522 676 10/10/2015
3.0.520 663 10/9/2015
3.0.519 658 10/9/2015
3.0.518 650 10/9/2015
3.0.517 643 10/9/2015
3.0.516 675 10/7/2015
3.0.514 686 10/6/2015
3.0.513 676 10/6/2015
3.0.512 682 10/6/2015
3.0.509 675 10/1/2015
3.0.507 665 10/1/2015
3.0.505 689 9/30/2015
3.0.503 722 9/30/2015
3.0.502 685 9/30/2015
3.0.479 672 9/25/2015
3.0.476 658 9/24/2015
3.0.471 675 9/24/2015
3.0.470 692 9/24/2015
3.0.469 685 9/24/2015
3.0.468 688 9/24/2015
3.0.467 676 9/24/2015
3.0.465 693 9/24/2015
3.0.459 681 9/23/2015
3.0.456 702 9/23/2015
3.0.455 674 9/22/2015
3.0.454 713 9/19/2015
3.0.453 717 9/19/2015
3.0.452 674 9/18/2015
3.0.451 694 9/18/2015
3.0.450 702 9/18/2015
3.0.447 678 9/18/2015
2.0.378 707 9/5/2015
2.0.372 692 9/4/2015
2.0.370 737 9/4/2015
2.0.368 684 9/4/2015
2.0.365 675 9/3/2015
2.0.363 665 9/3/2015
2.0.361 673 9/3/2015
1.0.360 655 9/1/2015
1.0.359 686 9/1/2015
1.0.358 681 9/1/2015
1.0.356 664 8/31/2015
1.0.355 755 8/31/2015
1.0.354 665 8/29/2015
1.0.305 704 8/19/2015
1.0.299 722 8/8/2015
1.0.293 677 7/20/2015
1.0.292 686 7/20/2015
1.0.289 680 7/10/2015
1.0.288 676 7/10/2015
1.0.286 717 7/7/2015
1.0.285 700 7/7/2015
1.0.284 684 7/7/2015
1.0.282 686 7/6/2015
1.0.281 678 7/6/2015
1.0.279 678 7/6/2015
1.0.277 645 6/18/2015
1.0.276 696 6/8/2015
1.0.275 690 6/8/2015
1.0.274 640 6/8/2015
1.0.272 686 6/1/2015
1.0.269 678 5/25/2015
1.0.268 688 5/24/2015
1.0.266 670 5/24/2015
1.0.263 685 5/21/2015
1.0.258 694 5/19/2015
1.0.257 673 5/18/2015
1.0.256 798 5/17/2015
1.0.254 651 5/13/2015
1.0.253 676 5/13/2015
1.0.250 684 5/13/2015
1.0.249 692 5/12/2015
1.0.248 671 5/12/2015
1.0.245 683 5/12/2015
1.0.241 700 5/12/2015
1.0.240 679 5/12/2015
1.0.237 687 5/11/2015
1.0.234 688 5/9/2015
1.0.233 670 5/9/2015
1.0.231 671 5/7/2015
1.0.230 711 5/7/2015
1.0.229 689 5/7/2015
1.0.226 689 5/7/2015
1.0.217 743 4/28/2015
1.0.215 685 4/27/2015
1.0.213 731 4/23/2015
1.0.210 685 4/23/2015
1.0.209 687 4/15/2015
1.0.202 698 4/15/2015
1.0.201 666 4/15/2015
1.0.198 691 4/15/2015
1.0.197 663 4/15/2015
1.0.196 680 4/15/2015
1.0.195 685 4/15/2015
1.0.194 683 4/15/2015
1.0.193 680 4/15/2015
1.0.192 700 4/15/2015
1.0.191 697 4/14/2015
1.0.189 700 4/10/2015
1.0.187 681 4/9/2015
1.0.186 712 4/8/2015
1.0.185 695 4/6/2015
1.0.183 698 4/3/2015
1.0.181 757 4/3/2015
1.0.180 715 4/2/2015
1.0.178 697 4/1/2015
1.0.177 698 4/1/2015
1.0.175 759 4/1/2015
1.0.171 702 3/31/2015
1.0.170 675 3/31/2015
1.0.168 683 3/31/2015
1.0.164 711 3/30/2015
1.0.162 688 3/28/2015
1.0.160 688 3/27/2015
1.0.159 679 3/26/2015
1.0.157 679 3/24/2015
1.0.156 716 3/24/2015
1.0.154 678 3/24/2015
1.0.152 670 3/24/2015
1.0.151 687 3/24/2015
1.0.150 731 3/23/2015
1.0.149 694 3/23/2015
1.0.148 668 3/23/2015
1.0.147 693 3/21/2015
1.0.146 687 3/20/2015
1.0.145 682 3/19/2015
1.0.143 766 3/18/2015
1.0.142 693 3/12/2015
1.0.141 663 3/12/2015
1.0.140 732 3/5/2015
1.0.139 695 3/5/2015
1.0.138 695 3/4/2015
1.0.137 678 3/3/2015
1.0.134 677 3/3/2015
1.0.129 693 3/3/2015
1.0.128 737 3/3/2015
1.0.125 672 2/28/2015
1.0.124 683 2/28/2015
1.0.122 726 2/28/2015
1.0.119 766 2/25/2015
1.0.117 715 2/24/2015
1.0.115 665 2/24/2015
1.0.114 703 2/23/2015
1.0.113 736 2/23/2015
1.0.112 761 2/23/2015
1.0.111 764 2/23/2015
1.0.110 787 2/23/2015
1.0.109 693 2/22/2015
1.0.108 686 2/22/2015
1.0.103 736 2/22/2015