I-Synergy.Framework.AspNetCore 2025.11027.11947.55-preview

Prefix Reserved
This is a prerelease version of I-Synergy.Framework.AspNetCore.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package I-Synergy.Framework.AspNetCore --version 2025.11027.11947.55-preview
                    
NuGet\Install-Package I-Synergy.Framework.AspNetCore -Version 2025.11027.11947.55-preview
                    
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="I-Synergy.Framework.AspNetCore" Version="2025.11027.11947.55-preview" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="I-Synergy.Framework.AspNetCore" Version="2025.11027.11947.55-preview" />
                    
Directory.Packages.props
<PackageReference Include="I-Synergy.Framework.AspNetCore" />
                    
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 I-Synergy.Framework.AspNetCore --version 2025.11027.11947.55-preview
                    
#r "nuget: I-Synergy.Framework.AspNetCore, 2025.11027.11947.55-preview"
                    
#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 I-Synergy.Framework.AspNetCore@2025.11027.11947.55-preview
                    
#: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=I-Synergy.Framework.AspNetCore&version=2025.11027.11947.55-preview&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.AspNetCore&version=2025.11027.11947.55-preview&prerelease
                    
Install as a Cake Tool

I-Synergy Framework ASP.NET Core

A comprehensive ASP.NET Core integration library for .NET 10.0 applications, providing middleware, filters, extensions, and utilities for building modern web APIs and applications. This package includes OpenTelemetry integration, health checks, global exception handling, result pattern extensions, and more.

NuGet License .NET

Features

  • OpenTelemetry integration for distributed tracing, metrics, and logging
  • Global exception handling with ProblemDetails responses
  • Health check endpoints with detailed JSON responses
  • Result pattern extensions for converting Result<T> to IActionResult
  • Action filters for validation, caching, and request filtering
  • Model binders for custom DateTime parsing
  • HTTP extensions for request/response manipulation
  • JWT token service abstractions for authentication
  • CORS configuration with environment-aware options
  • Service locator integration for legacy scenarios
  • View model base classes for MVC applications

Installation

Install the package via NuGet:

dotnet add package I-Synergy.Framework.AspNetCore

Quick Start

1. Configure Services with OpenTelemetry

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.Core.Abstractions.Services;
using ISynergy.Framework.Core.Services;

var builder = WebApplication.CreateBuilder(args);

// Add info service for application metadata
builder.Services.AddSingleton<IInfoService>(new InfoService(
    productName: "My API",
    productVersion: new Version(1, 0, 0)));

// Configure OpenTelemetry
builder.Logging.AddTelemetry(
    builder,
    builder.Services.BuildServiceProvider().GetRequiredService<IInfoService>(),
    tracerProviderBuilder =>
    {
        // Add custom instrumentation
        tracerProviderBuilder.AddSource("MyApi");
    },
    meterProviderBuilder =>
    {
        // Add custom metrics
        meterProviderBuilder.AddMeter("MyApi");
    });

// Add controllers and services
builder.Services.AddControllers();
builder.Services.AddHealthChecks()
    .AddCheck("api", () => HealthCheckResult.Healthy());

var app = builder.Build();

// Configure middleware pipeline
app.UseExceptionHandler();
app.MapDefaultHealthEndpoints();
app.MapControllers();

app.Run();

2. Use Result Pattern in Controllers

using ISynergy.Framework.Core.Models.Results;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetProduct(int id)
    {
        var result = await _productService.GetProductByIdAsync(id);

        // Convert Result<Product> to IActionResult
        return result.Match<Product, IActionResult>(
            value => value is not null ? Ok(value) : NoContent(),
            () => NotFound()
        );
    }

    [HttpPost]
    public async Task<IActionResult> CreateProduct([FromBody] ProductDto dto)
    {
        var result = await _productService.CreateProductAsync(dto);

        return result.Match<int, IActionResult>(
            id => CreatedAtAction(nameof(GetProduct), new { id }, id),
            () => BadRequest(result.ErrorMessage)
        );
    }

    [HttpGet]
    public async Task<IActionResult> GetProducts(
        [FromQuery] int pageIndex = 0,
        [FromQuery] int pageSize = 10)
    {
        var result = await _productService.GetProductsPagedAsync(pageIndex, pageSize);

        return result.Match<PaginatedResult<ProductDto>, IActionResult>(
            paginatedResult => Ok(paginatedResult),
            () => NotFound()
        );
    }
}

3. Add Action Filters

using ISynergy.Framework.AspNetCore.Filters;

[ApiController]
[Route("api/[controller]")]
[ValidateModelFilter] // Validates ModelState automatically
public class OrdersController : ControllerBase
{
    [HttpPost]
    [NoCache] // Prevents caching of this endpoint
    public async Task<IActionResult> CreateOrder([FromBody] OrderDto order)
    {
        // ModelState is already validated by ValidateModelFilter
        // Response will not be cached due to NoCacheFilter

        await _orderService.CreateOrderAsync(order);
        return Ok();
    }

    [HttpGet("local-only")]
    [RequestShouldBeLocalFilter] // Only allows requests from localhost
    public IActionResult GetSensitiveData()
    {
        return Ok(new { Secret = "This is sensitive" });
    }
}

4. Configure Global Exception Handling

var app = builder.Build();

// Add global exception handler
app.UseExceptionHandler(exceptionHandlerApp =>
{
    exceptionHandlerApp.Run(async context =>
    {
        var exceptionHandler = context.RequestServices
            .GetRequiredService<IExceptionHandler>();

        await exceptionHandler.TryHandleAsync(
            context,
            context.Features.Get<IExceptionHandlerFeature>()?.Error!,
            context.RequestAborted);
    });
});

// Or register the built-in GlobalExceptionHandler
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
app.UseExceptionHandler();

Architecture

Core Components

ISynergy.Framework.AspNetCore/
├── Extensions/                 # Extension methods
│   ├── TelemetryExtensions    # OpenTelemetry configuration
│   ├── HealthCheckExtensions  # Health check endpoints
│   ├── ResultExtensions       # Result pattern conversions
│   ├── HttpContextExtensions  # HttpContext utilities
│   └── WebApplicationExtensions
│
├── Filters/                   # Action filters
│   ├── ValidateModelFilterAttribute
│   ├── NoCacheFilterAttribute
│   ├── NullResultFilterAttribute
│   ├── NoNullModelsFilterAttribute
│   └── RequestShouldBeLocalFilterAttribute
│
├── Handlers/                  # Exception handlers
│   └── GlobalExceptionHandler
│
├── Binders/                   # Model binders
│   ├── DateTimeModelBinder
│   └── DateTimeModelBinderProvider
│
├── Abstractions/              # Service interfaces
│   └── IJwtTokenService
│
└── Options/                   # Configuration options
    ├── CORSOptions
    ├── KeyVaultOptions
    ├── AzureOptions
    └── TelemetryOptions

Core Features

OpenTelemetry Integration

Configure comprehensive observability for your application:

using ISynergy.Framework.AspNetCore.Extensions;

builder.Logging.AddTelemetry(
    builder,
    infoService,
    tracerProviderBuilder =>
    {
        // Add custom sources
        tracerProviderBuilder
            .AddSource("MyApi")
            .AddSource("MyApi.Database");

        // Add exporters
        if (builder.Environment.IsProduction())
        {
            tracerProviderBuilder.AddOtlpExporter(options =>
            {
                options.Endpoint = new Uri("http://otel-collector:4317");
            });
        }
    },
    meterProviderBuilder =>
    {
        // Add custom meters
        meterProviderBuilder.AddMeter("MyApi.Metrics");

        // Add exporters
        if (builder.Environment.IsProduction())
        {
            meterProviderBuilder.AddOtlpExporter();
        }
    },
    loggerProviderBuilder =>
    {
        // Configure logging
        if (builder.Environment.IsProduction())
        {
            loggerProviderBuilder.AddOtlpExporter();
        }
    });

Health Check Endpoints

Configure detailed health checks with JSON responses:

using ISynergy.Framework.AspNetCore.Extensions;

// Configure health checks
builder.Services.AddHealthChecks()
    .AddCheck("database", () => HealthCheckResult.Healthy(), tags: ["live"])
    .AddCheck("external-api", () => HealthCheckResult.Healthy())
    .AddCheck("cache", () => HealthCheckResult.Healthy(), tags: ["live"]);

var app = builder.Build();

// Map default health endpoints
app.MapDefaultHealthEndpoints();
// Creates:
// - /health (all checks must pass)
// - /alive (only checks tagged with "live" must pass)

// Or use custom health check endpoint with telemetry
app.MapTelemetryHealthChecks("/healthz");

Example health check response:

{
  "Status": "Healthy",
  "Duration": "00:00:00.0234567",
  "Info": [
    {
      "Key": "database",
      "Description": "Database connection is healthy",
      "Status": "Healthy",
      "Duration": "00:00:00.0123456",
      "Data": {}
    }
  ]
}

Action Filters

Model Validation Filter

Automatically validate ModelState:

[ApiController]
[Route("api/[controller]")]
[ValidateModelFilter]
public class UsersController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateUser([FromBody] CreateUserRequest request)
    {
        // If ModelState is invalid, filter returns BadRequest automatically
        // No need to check ModelState.IsValid here
        return Ok();
    }
}
No Cache Filter

Prevent caching of responses:

[HttpGet("real-time-data")]
[NoCache]
public IActionResult GetRealTimeData()
{
    // Response headers will include:
    // Cache-Control: no-store, no-cache, must-revalidate
    // Pragma: no-cache
    // Expires: 0
    return Ok(new { Timestamp = DateTime.UtcNow });
}
Local Request Filter

Restrict endpoints to localhost only:

[HttpGet("admin/diagnostics")]
[RequestShouldBeLocalFilter]
public IActionResult GetDiagnostics()
{
    // Returns 403 Forbidden if request is not from localhost
    return Ok(GetSystemDiagnostics());
}
Null Result Filter

Handle null results automatically:

[HttpGet("{id}")]
[NullResultFilter] // Returns 404 if result is null
public async Task<Product?> GetProduct(int id)
{
    return await _productService.GetProductByIdAsync(id);
    // If null, filter automatically returns 404 Not Found
}

HTTP Extensions

HttpContext Extensions
using ISynergy.Framework.AspNetCore.Extensions;

public class MyMiddleware
{
    public async Task InvokeAsync(HttpContext context)
    {
        // Get client IP address
        var ipAddress = context.GetClientIpAddress();

        // Check if request is from localhost
        if (context.IsLocalRequest())
        {
            // Handle local request
        }

        // Get user agent
        var userAgent = context.Request.GetUserAgent();

        await _next(context);
    }
}
HttpRequest Extensions
using ISynergy.Framework.AspNetCore.Extensions;

public IActionResult GetRequestInfo()
{
    var request = HttpContext.Request;

    var info = new
    {
        IsAjax = request.IsAjaxRequest(),
        IsMobile = request.IsMobileRequest(),
        UserAgent = request.GetUserAgent(),
        ContentType = request.ContentType
    };

    return Ok(info);
}

Custom DateTime Model Binder

Handle DateTime parsing with custom formats:

using ISynergy.Framework.AspNetCore.Providers;

// In Program.cs
builder.Services.AddControllers(options =>
{
    options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
});

// In Controller
[HttpGet]
public IActionResult GetOrders(
    [FromQuery] DateTime? startDate,
    [FromQuery] DateTime? endDate)
{
    // Supports multiple date formats automatically
    // - ISO 8601: 2024-01-15T10:30:00Z
    // - Custom formats: 01/15/2024
    return Ok();
}

Advanced Features

Result Pattern HTTP Extensions

Convert HttpResponseMessage to Result objects:

using ISynergy.Framework.AspNetCore.Extensions;

public class ApiClient
{
    private readonly HttpClient _httpClient;

    public async Task<Result<Product>> GetProductAsync(int id)
    {
        var response = await _httpClient.GetAsync($"api/products/{id}");

        // Convert HttpResponseMessage to Result<Product>
        var result = await response.ToResult<Product>();

        return result ?? Result<Product>.Fail("Invalid response");
    }

    public async Task<PaginatedResult<Product>> GetProductsAsync(int page)
    {
        var response = await _httpClient.GetAsync($"api/products?page={page}");

        // Convert to PaginatedResult
        var result = await response.ToPaginatedResult<Product>();

        return result ?? PaginatedResult<Product>.Empty;
    }
}

JWT Token Service

Implement JWT token generation and validation:

using ISynergy.Framework.AspNetCore.Abstractions.Services;
using ISynergy.Framework.Core.Models;

public class JwtTokenService : IJwtTokenService
{
    private readonly IConfiguration _configuration;

    public JwtTokenService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public Token GenerateJwtToken(TokenRequest request)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Secret"]);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.Name, request.Username),
                new Claim(ClaimTypes.Email, request.Email)
            }),
            Expires = DateTime.UtcNow.AddHours(8),
            SigningCredentials = new SigningCredentials(
                new SymmetricSecurityKey(key),
                SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        return new Token
        {
            AccessToken = tokenString,
            ExpiresIn = 28800,
            TokenType = "Bearer"
        };
    }

    public List<Claim> GetClaims(Token token)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jwtToken = tokenHandler.ReadJwtToken(token.AccessToken);
        return jwtToken.Claims.ToList();
    }

    public string GetSingleClaim(Token token, string claimType)
    {
        var claims = GetClaims(token);
        return claims.FirstOrDefault(c => c.Type == claimType)?.Value ?? string.Empty;
    }
}

// Register in DI
builder.Services.AddSingleton<IJwtTokenService, JwtTokenService>();

CORS Configuration

Configure CORS with environment-aware settings:

using ISynergy.Framework.AspNetCore.Options;

// In appsettings.json
{
  "CORS": {
    "AllowedOrigins": ["https://myapp.com", "https://admin.myapp.com"],
    "AllowedMethods": ["GET", "POST", "PUT", "DELETE"],
    "AllowedHeaders": ["*"],
    "AllowCredentials": true
  }
}

// In Program.cs
var corsOptions = builder.Configuration
    .GetSection("CORS")
    .Get<CORSOptions>();

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins(corsOptions.AllowedOrigins.ToArray())
            .WithMethods(corsOptions.AllowedMethods.ToArray())
            .WithHeaders(corsOptions.AllowedHeaders.ToArray());

        if (corsOptions.AllowCredentials)
            policy.AllowCredentials();
    });
});

app.UseCors();

Service Locator Integration

Use service locator for legacy scenarios:

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.Core.Locators;

var app = builder.Build();

// Set service locator provider
app.SetLocatorProvider();

// Now you can use ServiceLocator anywhere
public class LegacyService
{
    public void DoWork()
    {
        var logger = ServiceLocator.Default.GetInstance<ILogger>();
        logger.LogInformation("Working...");
    }
}

Best Practices

Use Result pattern extensions to maintain consistent API responses and error handling.

Always configure global exception handling to prevent sensitive error details from leaking to clients.

OpenTelemetry integration automatically instruments ASP.NET Core, HttpClient, and runtime metrics.

API Design

  • Use Result<T> pattern for all service methods
  • Return appropriate HTTP status codes (200, 201, 204, 400, 404, 500)
  • Use ProblemDetails for error responses
  • Implement health check endpoints for monitoring
  • Use action filters to avoid repetitive validation code

Security

  • Always validate input using [ValidateModelFilter] or manual validation
  • Use [RequestShouldBeLocalFilter] for administrative endpoints
  • Implement JWT token authentication for protected endpoints
  • Configure CORS appropriately for your environment
  • Never expose internal exception details in production

Performance

  • Use [NoCache] filter sparingly - only for real-time data
  • Implement health checks that don't impact application performance
  • Use async/await throughout the application
  • Configure response compression for API endpoints
  • Monitor telemetry data to identify bottlenecks

Observability

  • Configure OpenTelemetry early in application startup
  • Tag health checks appropriately (live, ready)
  • Use structured logging with proper log levels
  • Instrument custom operations with ActivitySource
  • Monitor metrics for request duration, error rates, and throughput

Testing

The framework is designed for testability:

[TestClass]
public class ProductsControllerTests
{
    [TestMethod]
    public async Task GetProduct_ReturnsOk_WhenProductExists()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(s => s.GetProductByIdAsync(1))
            .ReturnsAsync(Result<Product>.Success(new Product { Id = 1 }));

        var controller = new ProductsController(mockService.Object);

        // Act
        var result = await controller.GetProduct(1);

        // Assert
        Assert.IsInstanceOfType(result, typeof(OkObjectResult));
    }

    [TestMethod]
    public async Task GetProduct_ReturnsNotFound_WhenProductDoesNotExist()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(s => s.GetProductByIdAsync(999))
            .ReturnsAsync(Result<Product>.Fail("Not found"));

        var controller = new ProductsController(mockService.Object);

        // Act
        var result = await controller.GetProduct(999);

        // Assert
        Assert.IsInstanceOfType(result, typeof(NotFoundResult));
    }
}

Integration Testing

public class ApiIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;

    public ApiIntegrationTests(WebApplicationFactory<Program> factory)
    {
        _factory = factory;
    }

    [Fact]
    public async Task HealthEndpoint_ReturnsHealthy()
    {
        // Arrange
        var client = _factory.CreateClient();

        // Act
        var response = await client.GetAsync("/health");

        // Assert
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync();
        Assert.Contains("Healthy", content);
    }
}

Dependencies

  • ISynergy.Framework.Core - Core framework components
  • ISynergy.Framework.OpenTelemetry - OpenTelemetry integration
  • ISynergy.Framework.Storage - Storage abstractions
  • Microsoft.AspNetCore.App - ASP.NET Core framework
  • OpenTelemetry.Instrumentation.AspNetCore - ASP.NET Core instrumentation
  • OpenTelemetry.Instrumentation.Http - HttpClient instrumentation
  • OpenTelemetry.Instrumentation.Runtime - Runtime metrics

Configuration Examples

Complete Startup Configuration

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.AspNetCore.Handlers;
using ISynergy.Framework.AspNetCore.Filters;

var builder = WebApplication.CreateBuilder(args);

// Add services
builder.Services.AddControllers(options =>
{
    // Add model binders
    options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());

    // Add global filters
    options.Filters.Add<ValidateModelFilterAttribute>();
});

// Add OpenTelemetry
var infoService = new InfoService("MyApi", new Version(1, 0, 0));
builder.Services.AddSingleton<IInfoService>(infoService);

builder.Logging.AddTelemetry(builder, infoService);

// Add health checks
builder.Services.AddHealthChecks()
    .AddCheck("self", () => HealthCheckResult.Healthy(), tags: ["live"]);

// Add exception handling
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
builder.Services.AddProblemDetails();

// Add CORS
builder.Services.AddCors();

var app = builder.Build();

// Configure middleware pipeline
app.UseExceptionHandler();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultHealthEndpoints();
app.MapControllers();

app.SetLocatorProvider();

app.Run();

Documentation

For more information about the I-Synergy Framework:

  • I-Synergy.Framework.Core - Core framework components
  • I-Synergy.Framework.CQRS - CQRS implementation
  • I-Synergy.Framework.EntityFramework - Entity Framework integration
  • I-Synergy.Framework.OpenTelemetry - OpenTelemetry utilities

Support

For issues, questions, or contributions, please visit the GitHub repository.

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

NuGet packages (4)

Showing the top 4 NuGet packages that depend on I-Synergy.Framework.AspNetCore:

Package Downloads
I-Synergy.Framework.AspNetCore.Authentication

I-Synergy Framework Authentication

I-Synergy.Framework.AspNetCore.Globalization

I-Synergy Framework Globalization

I-Synergy.Framework.AspNetCore.Proxy

I-Synergy Framework Proxy for .net 8.0

I-Synergy.Framework.AspNetCore.Blazor

I-Synergy Framework Blazor

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2025.11102.10309.42-preview 0 11/2/2025
2025.11029.11433.38-preview 158 10/29/2025
2025.11029.10201.38-preview 161 10/29/2025
2025.11027.11947.55-preview 181 10/27/2025
2025.11022.12207.12-preview 179 10/22/2025
2025.11019.12053.37-preview 179 10/19/2025
2025.11016.11750.24-preview 176 10/16/2025
2025.11015.10219.44-preview 175 10/15/2025
2025.11014.10245.12-preview 180 10/14/2025
2025.11012.10130.11-preview 149 10/12/2025
2025.11010.10052.52-preview 220 10/9/2025
2025.11001.12118.13-preview 221 10/1/2025
2025.10925.10144.25-preview 247 9/25/2025
2025.10921.11353.29-preview 266 9/21/2025
2025.10913.11841.29-preview 199 9/13/2025
2025.10912.12351.59-preview 147 9/12/2025
2025.10912.10210.52-preview 221 9/12/2025
2025.10911.10131.43-preview 212 9/10/2025
2025.10910.12340.34-preview 227 9/10/2025
2025.10910.11327.15-preview 213 9/10/2025
2025.10910.11206.45-preview 220 9/10/2025
2025.10910.10230.58-preview 235 9/10/2025
2025.10908.12343.47-preview 227 9/8/2025
2025.10904.12337.35-preview 236 9/4/2025
2025.10904.12245.51-preview 233 9/4/2025
2025.10904.11425.5-preview 226 9/4/2025
2025.10904.10323.39-preview 240 9/4/2025
2025.10826.11425.3-preview 297 8/26/2025
2025.10825.12350.9-preview 230 8/25/2025
2025.10810.10248-preview 195 8/10/2025
2025.10809.10146.35-preview 221 8/9/2025
2025.10806.12031.49-preview 293 8/6/2025
2025.10806.11955.54-preview 287 8/6/2025
2025.10806.11433.24-preview 306 8/6/2025
2025.10709.10105.39-preview 211 7/8/2025
2025.10707.12320.3-preview 223 7/7/2025
2025.10706.11957.9-preview 210 7/6/2025
2025.10702.11752.47-preview 217 7/2/2025
2025.10702.11256.17-preview 219 7/2/2025
2025.10702.11119.10-preview 222 7/2/2025
2025.10702.10000.31-preview 216 7/1/2025
2025.10701.11524.1-preview 213 7/1/2025
2025.10701.11310.13-preview 227 7/1/2025
2025.10630.12022.58-preview 213 6/30/2025
2025.10612.12134.8-preview 395 6/12/2025
2025.10611.12313.53-preview 394 6/11/2025
2025.10603.10159.54-preview 245 6/3/2025
2025.10602.11908.9-preview 247 6/2/2025
2025.10601.10124.29-preview 200 5/31/2025
2025.10531.12235.29-preview 188 5/31/2025
2025.10530.10121.50-preview 255 5/29/2025
2025.10527.12202.4-preview 250 5/27/2025
2025.10526.12034.25-preview 218 5/26/2025
2025.10521.11828.30-preview 245 5/21/2025
2025.10520.11715.6-preview 245 5/20/2025
2025.10520.11515.16-preview 223 5/20/2025
2025.10518.12303.43-preview 249 5/18/2025
2025.10518.11257.36-preview 252 5/18/2025
2025.10517.12347.27-preview 183 5/17/2025
2025.10517.12003.6-preview 188 5/17/2025
2025.10516.11720.13-preview 271 5/16/2025
2025.10514.12334.2-preview 338 5/14/2025
2025.10514.10015.27-preview 325 5/13/2025
2025.10511.11032.32-preview 258 5/11/2025
2025.10413.11530 330 4/13/2025
2025.10413.11434.33-preview 314 4/13/2025
2025.10413.10205.50-preview 249 4/13/2025
2025.10412.11526.4-preview 206 4/12/2025
2025.10412.10141 235 4/12/2025
2025.10411.11811.23-preview 231 4/11/2025
2025.10411.11645.1-preview 237 4/11/2025
2025.10410.11458.35-preview 280 4/10/2025
2025.10405.10143.28-preview 170 4/5/2025
2025.10403.12208.1-preview 280 4/3/2025
2025.10403.11954.16-preview 267 4/3/2025
2025.10401.11908.24-preview 266 4/1/2025
2025.10401.11559.45-preview 277 4/1/2025
2025.10331.12215.59-preview 253 3/31/2025
2025.10331.12130.34-preview 268 3/31/2025
2025.10331.10056.40-preview 257 3/30/2025
2025.10328.10150.21-preview 233 3/28/2025
2025.10323.11359-preview 381 3/23/2025
2025.10320.11800 271 3/20/2025
2025.10320.11616.45-preview 235 3/20/2025
2025.10320.10000 229 3/19/2025
2025.10319.12311.26-preview 228 3/19/2025
2025.10319.12238.6-preview 253 3/19/2025
2025.10319.12057.59-preview 253 3/19/2025
2025.10318.10055 246 3/18/2025
2025.10317.11728.13-preview 240 3/17/2025
2025.10317.11201.3-preview 259 3/17/2025
2025.10315.11523.14-preview 180 3/15/2025
2025.10305.12342 329 3/5/2025
2025.10305.12321.9-preview 314 3/5/2025
2025.10301.12313 244 3/1/2025
2025.10301.12129.38-preview 185 3/1/2025
2025.10221.10043.29-preview 189 2/21/2025
2025.1051.1246 257 2/20/2025
2025.1051.44.54-preview 204 2/20/2025
2025.1044.1 217 2/13/2025
2025.1044.0.2-preview 191 2/13/2025
2025.1043.0.2-preview 191 2/12/2025
2025.1041.0.1-preview 214 2/10/2025
2025.1038.1 275 2/7/2025
2025.1038.0.1-preview 215 2/7/2025
2025.1035.1 266 2/4/2025
2025.1035.0.1-preview 240 2/4/2025
2025.1034.1 278 2/3/2025
2025.1034.0.1-preview 233 2/3/2025
2025.1033.0.5-preview 227 2/2/2025
2025.1033.0.3-preview 233 2/2/2025
2025.1033.0.2-preview 238 2/2/2025
2025.1033.0.1-preview 191 2/2/2025
2025.1025.1 281 1/25/2025
2025.1025.0.1-preview 225 1/25/2025
2025.1021.1 257 1/21/2025
2025.1021.0.1-preview 229 1/21/2025
2025.1020.1 239 1/20/2025
2025.1020.0.3-preview 232 1/20/2025
2025.1020.0.1-preview 233 1/20/2025
2025.1018.0.7-preview 206 1/18/2025
2025.1018.0.5-preview 232 1/18/2025
2025.1018.0.4-preview 227 1/18/2025
2025.1017.0.2-preview 212 1/17/2025
2025.1017.0.1-preview 240 1/17/2025
2025.1016.0.1-preview 213 1/16/2025
2025.1010.1 254 1/10/2025
2025.1010.0.1-preview 218 1/9/2025
2025.1009.0.3-preview 232 1/9/2025
2025.1007.1 263 1/7/2025
2025.1007.0.5-preview 230 1/7/2025
2025.1007.0.3-preview 228 1/7/2025
2025.1006.1 250 1/7/2025
2025.1005.1 295 1/5/2025
2025.1005.0.2-preview 230 1/5/2025
2025.1004.1 277 1/4/2025
2024.1366.1 256 12/31/2024
2024.1366.0.2-preview 239 12/31/2024
2024.1366.0.1-preview 262 12/31/2024
2024.1365.0.2-preview 203 12/30/2024
2024.1365.0.1-preview 232 12/30/2024
2024.1361.0.2-preview 238 12/26/2024
2024.1353.0.1-preview 218 12/18/2024
2024.1352.0.3-preview 233 12/17/2024
2024.1352.0.2-preview 221 12/17/2024
2024.1352.0.1-preview 213 12/17/2024
2024.1351.1 279 12/16/2024
2024.1351.0.3-preview 224 12/16/2024
2024.1350.1 274 12/15/2024
2024.1343.1 275 12/8/2024
2024.1339.1 279 12/4/2024
2024.1336.1 267 12/1/2024
2024.1332.1 253 11/27/2024
2024.1330.1 268 11/25/2024
2024.1328.1 258 11/23/2024
2024.1325.1 289 11/20/2024
2024.1323.1 290 11/18/2024
2024.1316.1 126 11/11/2024
2024.1307.1 113 11/2/2024
2024.1300.1 129 10/26/2024
2024.1294.1 149 10/20/2024
2024.1290.1 291 10/16/2024
2024.1283.1 297 10/8/2024
2024.1282.1 232 10/8/2024
2024.1278.1 258 10/4/2024
2024.1277.1 272 10/3/2024
2024.1275.2 232 10/1/2024
2024.1275.1 218 10/1/2024
2024.1274.1 211 9/30/2024
2024.1263.1 213 9/19/2024
2024.1261.1 266 9/17/2024
2024.1258.1 240 9/13/2024
2024.1257.1 216 9/13/2024
2024.1256.1 212 9/12/2024
2024.1254.1 236 9/10/2024
2024.1250.1 260 9/6/2024
2024.1249.1 246 9/5/2024
2024.1246.1 251 9/2/2024
2024.1245.1 245 9/1/2024
2024.1237.1 272 8/24/2024
2024.1235.0.1-preview 233 8/23/2024
2024.1230.1 226 8/18/2024
2024.1229.1 270 8/16/2024
2024.1228.1 233 8/15/2024
2024.1222.1 305 8/8/2024
2024.1221.1 230 8/7/2024
2024.1221.0.2-preview 219 8/8/2024
2024.1221.0.1-preview 220 8/8/2024
2024.1220.1 217 8/7/2024
2024.1219.0.2-preview 205 8/6/2024
2024.1219.0.1-preview 176 8/6/2024
2024.1217.0.2-preview 183 8/4/2024
2024.1217.0.1-preview 199 8/4/2024
2024.1216.0.2-preview 186 8/3/2024
2024.1216.0.1-preview 195 8/3/2024
2024.1208.0.1-preview 215 7/26/2024
2024.1207.0.7-preview 184 7/25/2024
2024.1207.0.5-preview 194 7/25/2024
2024.1166.1 319 6/14/2024
2024.1165.1 246 6/13/2024
2024.1164.1 211 6/12/2024
2024.1162.1 231 6/10/2024
2024.1158.1 288 6/6/2024
2024.1156.1 250 6/4/2024
2024.1152.1 311 5/31/2024
2024.1151.1 275 5/29/2024
2024.1150.2 243 5/29/2024
2024.1150.1 247 5/29/2024
2024.1149.1 239 5/28/2024
2024.1147.1 253 5/26/2024
2024.1146.2 232 5/25/2024
2024.1146.1 234 5/25/2024
2024.1145.1 260 5/24/2024
2024.1135.2 245 5/14/2024
2024.1135.1 232 5/14/2024
2024.1134.1 214 5/13/2024
2024.1130.1 269 5/9/2024
2024.1123.1 278 5/2/2024
2024.1121.1 267 4/30/2024
2024.1114.1 303 4/22/2024
2024.1113.0.5-preview 238 4/22/2024
2024.1113.0.3-preview 242 4/22/2024
2024.1113.0.2-preview 226 4/22/2024
2024.1113.0.1-preview 218 4/22/2024
2024.1108.0.1-preview 253 4/17/2024
2024.1107.0.1-preview 242 4/16/2024
2024.1094.2 266 4/3/2024
2024.1094.1 227 4/3/2024
2024.1092.1 243 4/1/2024
2024.1088.1 254 3/28/2024
2024.1085.1 270 3/25/2024
2024.1080.2 279 3/20/2024
2024.1080.1 267 3/20/2024
2024.1078.1 278 3/18/2024
2024.1077.1 272 3/17/2024
2024.1073.1 297 3/13/2024
2024.1070.1 302 3/10/2024
2024.1069.1 281 3/9/2024
2024.1068.1 285 3/8/2024
2024.1066.2 264 3/6/2024
2024.1066.1 270 3/6/2024
2024.1065.1 289 3/5/2024
2024.1065.0.1-preview 241 3/5/2024
2024.1063.2 283 3/3/2024
2024.1063.1 265 3/3/2024
2024.1062.1 282 3/2/2024
2024.1061.2 286 3/1/2024
2024.1061.1 270 3/1/2024
2024.1060.2 272 2/29/2024
2024.1060.1 256 2/29/2024
2024.1060.0.5-preview 241 2/29/2024
2024.1060.0.3-preview 242 2/29/2024
2024.1059.0.1-preview 204 2/28/2024
2024.1058.1 253 2/27/2024
2024.1056.1 234 2/25/2024
2024.1055.1 237 2/24/2024
2024.1052.1 290 2/21/2024
2024.1050.2 261 2/20/2024
2024.1050.1 253 2/19/2024
2024.1049.1 271 2/18/2024
2024.1048.1 277 2/17/2024
2024.1047.1 251 2/16/2024
2024.1035.1 275 2/4/2024
2024.1034.2 253 2/3/2024
2024.1029.1 346 1/29/2024
2024.1023.1 356 1/23/2024
2024.1022.1 360 1/22/2024
2024.1020.1 333 1/20/2024
2024.1019.1 344 1/19/2024
2024.1017.1 372 1/17/2024
2024.1012.1 371 1/12/2024
2024.1010.1 373 1/10/2024
2024.1008.1 380 1/8/2024
2024.1007.1 378 1/7/2024
2024.1005.1 377 1/5/2024
2024.1004.1 419 1/4/2024
2023.1365.1 411 12/31/2023
2023.1362.1 369 12/28/2023
2023.1361.1 354 12/27/2023
2023.1359.1 401 12/25/2023
2023.1358.1 332 12/24/2023
2023.1357.1 345 12/23/2023
2023.1342.1 428 12/8/2023
2023.1336.1 409 12/2/2023
2023.1332.1 379 11/28/2023
2023.1330.1 376 11/26/2023
2023.1325.1 389 11/21/2023
2023.1323.1 301 11/19/2023
2023.1320.1 271 11/17/2023
2023.1318.1 380 11/15/2023
2023.1317.1 320 11/13/2023
2023.1307.1 342 11/3/2023
2023.1305.1 346 11/1/2023
2023.1304.1 329 10/31/2023
2023.1294.1 328 10/21/2023
2023.1290.1 348 10/16/2023
2023.1289.1 303 10/16/2023
2023.1284.1 362 10/11/2023
2023.1276.1 367 10/3/2023
2023.1275.1 362 10/2/2023
2023.1272.1 377 9/29/2023
2023.1269.1 340 9/26/2023
2023.1242.1 461 8/30/2023
2023.1231.1 503 8/19/2023
2023.1229.1 477 8/17/2023
2023.1228.1 482 8/16/2023
2023.1227.1 477 8/15/2023
2023.1224.2 487 8/12/2023
2023.1224.1 504 8/12/2023
2023.1213.2 560 8/1/2023
2023.1213.1 520 8/1/2023
2023.1209.1 492 7/27/2023
2023.1201.1 528 7/20/2023
2023.1197.1 524 7/16/2023
2023.1178.1 556 6/27/2023
2023.1175.1 574 6/24/2023
2023.1174.1 538 6/22/2023
2023.1169.1 561 6/18/2023
2023.1165.1 548 6/14/2023
2023.1161.1 616 6/11/2023
2023.1159.1 623 6/7/2023
2023.1157.1 591 6/6/2023
2023.1146.1 579 5/27/2023
2023.1139.1 628 5/19/2023
2023.1137.1 666 5/17/2023
2023.1136.1 639 5/16/2023
2023.1118.1 681 4/28/2023
2023.1111.1 710 4/21/2023
2023.1110.1 740 4/20/2023
2023.1105.1 736 4/15/2023
2023.1103.1 712 4/13/2023
2023.1102.1 705 4/12/2023
2023.1101.1 699 4/11/2023
2023.1090.1 758 3/31/2023
2023.1089.1 768 3/30/2023
2023.1088.1 786 3/29/2023
2023.1082.1 831 3/23/2023
2023.1078.1 845 3/19/2023
2023.1070.1 825 3/11/2023
2023.1069.1 839 3/10/2023
2023.1064.1 853 3/5/2023
2023.1060.1 908 3/1/2023
2023.1057.1 894 2/26/2023
2023.1046.1 931 2/15/2023
2023.1043.2 938 2/12/2023
2023.1043.1 918 2/12/2023
2023.1042.1 902 2/11/2023
2023.1041.1 931 2/10/2023
2023.1039.1 890 2/8/2023
2023.1036.1 937 2/5/2023
2023.1035.1 944 2/4/2023
2023.1033.1 975 2/2/2023
2023.1030.1 981 1/30/2023
2023.1028.1 989 1/28/2023
2023.1026.1 962 1/26/2023
2023.1025.1 968 1/25/2023
2023.1024.1 943 1/24/2023
2023.1023.1 972 1/23/2023
2022.1319.1 646 11/15/2022
2022.1309.1 948 11/5/2022
2022.1307.1 952 11/3/2022
2022.1295.1 996 10/22/2022
2022.1290.1 1,007 10/17/2022
2022.1289.2 986 10/16/2022
2022.1289.1 964 10/16/2022
2022.1283.1 1,037 10/10/2022
2022.1282.1 985 10/9/2022
2022.1278.1 1,004 10/5/2022
2022.1272.2 1,002 9/29/2022
2022.1272.1 1,012 9/29/2022
2022.1271.1 1,025 9/28/2022
2022.1266.1 1,049 9/23/2022
2022.1259.1 1,041 9/16/2022
2022.1257.1 1,065 9/14/2022
2022.1250.1 1,042 9/7/2022
2022.1250.0.2-preview 343 9/7/2022
2022.1249.0.2-preview 335 9/6/2022
2022.1249.0.1-preview 312 9/6/2022
2022.1197.1 1,109 7/16/2022
2022.1196.1 1,075 7/15/2022
2022.1194.1 1,127 7/13/2022
2022.1182.1 1,106 7/1/2022
2022.1178.1 1,110 6/27/2022
2022.1166.1 1,123 6/15/2022
2022.1157.1 1,113 6/6/2022
2022.1150.1 1,129 5/30/2022
2022.1149.1 1,125 5/29/2022
2022.1144.1 1,106 5/24/2022
0.6.2 1,112 5/23/2022
0.6.1 1,086 5/23/2022
0.6.0 1,122 5/14/2022
0.5.3 1,158 5/8/2022
0.5.2 1,156 5/1/2022
0.5.1 1,127 5/1/2022
0.5.0 1,128 4/23/2022
0.4.1 1,129 4/15/2022
0.4.0 1,147 4/9/2022
0.3.3 1,160 4/8/2022
0.3.2 1,142 4/1/2022
0.3.1 1,133 3/29/2022
0.3.0 1,091 3/28/2022
0.2.3 1,141 3/28/2022
0.2.2 1,165 3/25/2022
0.2.1 1,127 3/21/2022
0.2.0 1,163 3/18/2022