From 4997d0ab2d3576cca23823b1823424fe90d03ad4 Mon Sep 17 00:00:00 2001 From: Thomas Ottenhus Date: Wed, 21 Feb 2024 17:26:40 +0100 Subject: [PATCH] WebApiHost (#82) * Re-add those projects to solution * API host Implementation * Fix vulnerable versions without bump * WebApi Host finalized * Include FeatureManagement * Add FeatureManager * Add PS1 script zur Erzeugung neuer Libraries * Finalize WebAPI-Host * Enable Claim based feature filter * Expose some of the builders * Build pipeline * Rough readme * XMLDocs * Clean up warnings * Preview version --------- Co-authored-by: Ottenhus, Thomas --- .editorconfig | 2 + .github/workflows/JGUZDV.WebApiHost.yml | 23 + AddLibrary.ps1 | 19 + NuGet-Packages.sln | 941 +++++++++++++----- .../src/Constants.cs | 6 + .../src/DataProtectionBuilderExtensions.cs | 7 +- .../src/JGUZDVDataProtectionExtensions.cs | 14 + .../src/Constants.cs | 8 - .../src/JGUZDVLoggingExtensions.cs | 11 +- .../ClaimRequirementsStrings.fr.resx | 174 ++++ ....Components.ClaimRequirements.Tests.csproj | 13 - .../src/JGUZDV.Blazor.Components.csproj | 4 +- .../src/JGUZDV.Blazor.StateManagement.csproj | 2 +- ...JGUZDV.Blazor.StateManagement.Tests.csproj | 11 +- .../JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs | 2 +- .../src/ClaimRequirement.cs | 15 + .../src/ClaimRequirementCollection.cs | 31 +- .../src/ClaimRequirementOptions.cs | 41 +- .../src/ClaimValueRequirement.cs | 39 +- .../src/ClaimsPrincipalExtension.cs | 6 + .../src/NullRequirement.cs | 11 + .../Converters/ClaimsPrincipalConverter.cs | 6 +- .../src/Converters/DateOnlyConverter.cs | 5 + .../Converters/StringTrimmingJsonConverter.cs | 9 + .../src/Converters/TimeOnlyConverter.cs | 5 + .../src/JsonSerializerOptionsExtensions.cs | 11 +- .../src/Constants.cs | 10 + .../src/JGUZDVHostBuilderLoggingExtensions.cs | 23 +- .../src/SerilogHelpers.cs | 2 +- .../src/Controllers/FeatureManager.cs | 51 + .../src/Extensions/ConfigurationExtensions.cs | 10 + .../ClaimRequirementFeatureFilter.cs | 33 + .../src/JGUZDV.WebApiHost.csproj | 38 + .../src/Properties/launchSettings.json | 12 + libraries/JGUZDV.WebApiHost/src/README.md | 67 ++ libraries/JGUZDV.WebApiHost/src/WebApiHost.cs | 283 ++++++ .../JGUZDV.WebApiHost/test/GlobalUsings.cs | 1 + .../test/JGUZDV.WebApiHost.Tests.csproj | 16 + libraries/JGUZDV.WebApiHost/test/UnitTest1.cs | 6 + 39 files changed, 1670 insertions(+), 298 deletions(-) create mode 100644 .github/workflows/JGUZDV.WebApiHost.yml create mode 100644 AddLibrary.ps1 delete mode 100644 libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs create mode 100644 libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx create mode 100644 libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs create mode 100644 libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs create mode 100644 libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs create mode 100644 libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj create mode 100644 libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json create mode 100644 libraries/JGUZDV.WebApiHost/src/README.md create mode 100644 libraries/JGUZDV.WebApiHost/src/WebApiHost.cs create mode 100644 libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs create mode 100644 libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj create mode 100644 libraries/JGUZDV.WebApiHost/test/UnitTest1.cs diff --git a/.editorconfig b/.editorconfig index 58328a8..70747a3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -175,6 +175,7 @@ csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_top_level_statements = true:silent csharp_style_prefer_null_check_over_type_check = true:suggestion csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_style_prefer_primary_constructors = true:suggestion #### Naming styles #### [*.{cs,vb}] @@ -370,4 +371,5 @@ tab_width = 4 indent_size = 4 end_of_line = crlf dotnet_style_namespace_match_folder = true:suggestion +dotnet_style_prefer_collection_expression = true:suggestion diff --git a/.github/workflows/JGUZDV.WebApiHost.yml b/.github/workflows/JGUZDV.WebApiHost.yml new file mode 100644 index 0000000..f2b14c8 --- /dev/null +++ b/.github/workflows/JGUZDV.WebApiHost.yml @@ -0,0 +1,23 @@ +name: JGUZDV.WebApiHost + +on: + workflow_dispatch: + inputs: + push-to-nuget: + description: Push package to NuGet + type: boolean + + pull_request: + branches: + - main + paths: + - libraries/JGUZDV.WebApiHost/** + +jobs: + call_default_build: + uses: ./.github/workflows/default_build.yml + with: + library-name: JGUZDV.WebApiHost + push-to-nuget: ${{ inputs.push-to-nuget != '' && inputs.push-to-nuget }} + secrets: + NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} \ No newline at end of file diff --git a/AddLibrary.ps1 b/AddLibrary.ps1 new file mode 100644 index 0000000..e6c052b --- /dev/null +++ b/AddLibrary.ps1 @@ -0,0 +1,19 @@ +param( + [Parameter(Mandatory = $true, ValueFromPipeline=$true)] + [string] $LibraryName, + + [Parameter()] + [string] $Template = 'classlib' +) + +process { + Push-Location $PSScriptRoot + + Invoke-Expression "dotnet new $Template -n $LibraryName -o ./libraries/$LibraryName/src" + Invoke-Expression "dotnet new xunit -n $LibraryName.Tests -o ./libraries/$LibraryName/test" + + Invoke-Expression "dotnet sln . add ./libraries/$LibraryName/src" + Invoke-Expression "dotnet sln . add ./libraries/$LibraryName/test" + + Pop-Location +} \ No newline at end of file diff --git a/NuGet-Packages.sln b/NuGet-Packages.sln index 1e4b055..54ff87b 100644 --- a/NuGet-Packages.sln +++ b/NuGet-Packages.sln @@ -7,6 +7,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitignore = .gitignore + AddLibrary.ps1 = AddLibrary.ps1 LICENSE = LICENSE EndProjectSection EndProject @@ -15,294 +16,766 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libraries", "libraries", "{ libraries\Directory.Build.props = libraries\Directory.Build.props EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.ActiveDirectory.ClaimProvider", "JGUZDV.ActiveDirectory.ClaimProvider", "{FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{50252EFB-8629-4B1D-AC2F-5F29CB6F684D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\src\JGUZDV.ActiveDirectory.ClaimProvider.csproj", "{675D258E-525C-4048-8E88-97C5E78ED819}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging", "libraries\JGUZDV.AspNetCore.Logging\src\JGUZDV.AspNetCore.Logging.csproj", "{311DE251-20A2-42C0-BD6C-2A327221D3C3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider.Tests", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\test\JGUZDV.ActiveDirectory.ClaimProvider.Tests.csproj", "{5CE38D63-D07F-46F1-9008-8206AB6F4231}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging.Tests", "libraries\JGUZDV.AspNetCore.Logging\test\JGUZDV.AspNetCore.Logging.Tests.csproj", "{6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.Authentication.Cookies", "JGUZDV.AspNetCore.Authentication.Cookies", "{ED0A40A7-2790-42F3-822E-C475F021D7D8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection", "libraries\JGUZDV.AspNetCore.DataProtection\src\JGUZDV.AspNetCore.DataProtection.csproj", "{F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\src\JGUZDV.AspNetCore.Authentication.Cookies.csproj", "{3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection.Tests", "libraries\JGUZDV.AspNetCore.DataProtection\test\JGUZDV.AspNetCore.DataProtection.Tests.csproj", "{97B58430-AAA3-4283-85FC-2BA1ED37514E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies.Tests", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\test\JGUZDV.AspNetCore.Authentication.Cookies.Tests.csproj", "{FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq", "libraries\JGUZDV.Linq\src\JGUZDV.Linq.csproj", "{C551EE51-B06E-4554-9114-763150B8908E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.DataProtection", "JGUZDV.AspNetCore.DataProtection", "{F86B6B96-D027-4FF4-931D-69AA0891F539}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq.Tests", "libraries\JGUZDV.Linq\test\JGUZDV.Linq.Tests.csproj", "{07AAE83F-56C7-4A9A-9972-7F9BE53D031A}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection", "libraries\JGUZDV.AspNetCore.DataProtection\src\JGUZDV.AspNetCore.DataProtection.csproj", "{29CE7134-3831-4E4A-A502-C84233D1ED35}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS", "libraries\JGUZDV.CQRS\src\JGUZDV.CQRS.csproj", "{A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.DataProtection.Tests", "libraries\JGUZDV.AspNetCore.DataProtection\test\JGUZDV.AspNetCore.DataProtection.Tests.csproj", "{20E70A44-016E-470C-947D-C1FC4161D1FB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.Tests", "libraries\JGUZDV.CQRS\test\JGUZDV.CQRS.Tests.csproj", "{7372528E-F5B9-49C6-8EC4-8F793DFC081D}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.AspNetCore.Logging", "JGUZDV.AspNetCore.Logging", "{458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore", "libraries\JGUZDV.CQRS.AspNetCore\src\JGUZDV.CQRS.AspNetCore.csproj", "{A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging", "libraries\JGUZDV.AspNetCore.Logging\src\JGUZDV.AspNetCore.Logging.csproj", "{5D5F2C2A-24CD-4C27-902D-FA439E84AD13}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore.Tests", "libraries\JGUZDV.CQRS.AspNetCore\test\JGUZDV.CQRS.AspNetCore.Tests.csproj", "{4B50EE32-BF4F-4FE4-918D-3B35695CD829}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Logging.Tests", "libraries\JGUZDV.AspNetCore.Logging\test\JGUZDV.AspNetCore.Logging.Tests.csproj", "{88A3D096-F763-47DB-A94B-040D416746E8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging", "libraries\JGUZDV.Extensions.Logging\src\JGUZDV.Extensions.Logging.csproj", "{AB284655-5FE2-4DF9-BCF9-87A8962C086E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components", "JGUZDV.Blazor.Components", "{DD6389E2-3940-4E3A-AB5F-3B041AFDCAED}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging.Tests", "libraries\JGUZDV.Extensions.Logging\test\JGUZDV.Extensions.Logging.Tests.csproj", "{EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Samples", "libraries\JGUZDV.Blazor.Components\samples\JGUZDV.Blazor.Components.Samples.csproj", "{FB3900A8-72B4-4186-90A8-9FA9F585C20E}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n", "libraries\JGUZDV.L10n\src\JGUZDV.L10n.csproj", "{175E14F2-E526-4DEA-9E05-AA87E48DBD7D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components", "libraries\JGUZDV.Blazor.Components\src\JGUZDV.Blazor.Components.csproj", "{73A3EE19-DEE8-4F79-85F5-DE42FE638F16}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.Tests", "libraries\JGUZDV.L10n\test\JGUZDV.L10n.Tests.csproj", "{D95B0932-CC64-440A-A956-D9D9EF9E1A99}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Tests", "libraries\JGUZDV.Blazor.Components\test\JGUZDV.Blazor.Components.Tests.csproj", "{ADADE7CE-4766-4220-AF7B-F51B5C1F334B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework", "libraries\JGUZDV.L10n.EntityFramework\src\JGUZDV.L10n.EntityFramework.csproj", "{9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components.ClaimRequirements", "JGUZDV.Blazor.Components.ClaimRequirements", "{CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework.Tests", "libraries\JGUZDV.L10n.EntityFramework\test\JGUZDV.L10n.EntityFramework.Tests.csproj", "{AECC9062-83E1-4B62-906D-1055E61E71DE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.ClaimRequirements", "libraries\JGUZDV.Blazor.Components.ClaimRequirements\src\JGUZDV.Blazor.Components.ClaimRequirements.csproj", "{662FB941-E473-401D-B856-BC6564101B5D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization", "libraries\JGUZDV.Extensions.Authorization\src\JGUZDV.Extensions.Authorization.csproj", "{3DFED352-5E7E-4688-8371-8B55EB800705}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.ClaimRequirements.Tests", "libraries\JGUZDV.Blazor.Components.ClaimRequirements\test\JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj", "{8E600186-574C-41F7-AC0F-B8BC61ED03F7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization.Tests", "libraries\JGUZDV.Extensions.Authorization\test\JGUZDV.Extensions.Authorization.Tests.csproj", "{793F6A63-30B3-44BC-A205-50031E27E31C}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.Components.L10n", "JGUZDV.Blazor.Components.L10n", "{51FA04BB-81A2-4EA7-B722-CF4A16BA75E8}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{AA0D0715-5EAE-437A-ABF5-D596B127544B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.L10n", "libraries\JGUZDV.Blazor.Components.L10n\src\JGUZDV.Blazor.Components.L10n.csproj", "{C806F47E-41BF-47D8-975B-A19C8EC14E39}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Samples", "libraries\JGUZDV.Blazor.Components\samples\JGUZDV.Blazor.Components.Samples.csproj", "{4AAFE071-EC5E-4F28-961C-7BB1259DC452}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.L10n.Tests", "libraries\JGUZDV.Blazor.Components.L10n\test\JGUZDV.Blazor.Components.L10n.Tests.csproj", "{76CE3554-41C4-402F-805E-C7C90387B8DD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components", "libraries\JGUZDV.Blazor.Components\src\JGUZDV.Blazor.Components.csproj", "{E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.StateManagement", "JGUZDV.Blazor.StateManagement", "{31F5F80A-A66E-4443-BA0B-052D5B836CD6}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.Components.Tests", "libraries\JGUZDV.Blazor.Components\test\JGUZDV.Blazor.Components.Tests.csproj", "{B39492DF-D142-4F68-BAE9-2862D4B2E865}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.StateManagement", "libraries\JGUZDV.Blazor.StateManagement\src\JGUZDV.Blazor.StateManagement.csproj", "{2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json", "libraries\JGUZDV.Extensions.Json\src\JGUZDV.Extensions.Json.csproj", "{17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.StateManagement.Tests", "libraries\JGUZDV.Blazor.StateManagement\test\JGUZDV.Blazor.StateManagement.Tests.csproj", "{26405220-3D38-4D2E-867E-DC53130B0FEB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json.Tests", "libraries\JGUZDV.Extensions.Json\test\JGUZDV.Extensions.Json.Tests.csproj", "{E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Blazor.WasmServerHost", "JGUZDV.Blazor.WasmServerHost", "{1645F9F0-9447-4249-B15C-790FF70E1968}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage", "libraries\JGUZDV.ClientStorage\src\JGUZDV.ClientStorage.csproj", "{5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost", "libraries\JGUZDV.Blazor.WasmServerHost\src\JGUZDV.Blazor.WasmServerHost.csproj", "{4CD5DE24-C829-4038-8875-1C8B63C96EB7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Tests", "libraries\JGUZDV.ClientStorage\test\JGUZDV.ClientStorage.Tests.csproj", "{BB820FE9-4253-428E-A65A-95CF269022E9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost.Tests", "libraries\JGUZDV.Blazor.WasmServerHost\test\JGUZDV.Blazor.WasmServerHost.Tests.csproj", "{DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider.Tests", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\test\JGUZDV.ActiveDirectory.ClaimProvider.Tests.csproj", "{3B8F0A74-D7DD-4FA7-A6DF-568640868A24}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.ClientStorage", "JGUZDV.ClientStorage", "{BEE249C5-60E0-43AE-BE52-F65A736BCF32}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ActiveDirectory.ClaimProvider", "libraries\JGUZDV.ActiveDirectory.ClaimProvider\src\JGUZDV.ActiveDirectory.ClaimProvider.csproj", "{1DE8AF4D-4D46-4766-844E-819757AC4E4C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage", "libraries\JGUZDV.ClientStorage\src\JGUZDV.ClientStorage.csproj", "{5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\src\JGUZDV.AspNetCore.Authentication.Cookies.csproj", "{D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Tests", "libraries\JGUZDV.ClientStorage\test\JGUZDV.ClientStorage.Tests.csproj", "{9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.AspNetCore.Authentication.Cookies.Tests", "libraries\JGUZDV.AspNetCore.Authentication.Cookies\test\JGUZDV.AspNetCore.Authentication.Cookies.Tests.csproj", "{AADC7783-3155-4905-9524-61EE2E5E01C2}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.CQRS", "JGUZDV.CQRS", "{D2EEC902-ED1E-419F-9BDA-E91C35498B9A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager", "libraries\JGUZDV.OpenIddict.KeyManager\src\JGUZDV.OpenIddict.KeyManager.csproj", "{115784A8-B2A6-4790-99D3-C41049CBC1C9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS", "libraries\JGUZDV.CQRS\src\JGUZDV.CQRS.csproj", "{70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager.Tests", "libraries\JGUZDV.OpenIddict.KeyManager\test\JGUZDV.OpenIddict.KeyManager.Tests.csproj", "{397C9A29-83DB-4944-9D4E-93159CDA60B6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.Tests", "libraries\JGUZDV.CQRS\test\JGUZDV.CQRS.Tests.csproj", "{86427769-9110-4A15-894E-264601C062BD}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost", "libraries\JGUZDV.Blazor.WasmServerHost\src\JGUZDV.Blazor.WasmServerHost.csproj", "{68E91C38-4D95-4DCE-9BC2-4AE71236B289}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.CQRS.AspNetCore", "JGUZDV.CQRS.AspNetCore", "{449665D2-57FF-4DFC-BB3A-6E397C49CE72}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Blazor.WasmServerHost.Tests", "libraries\JGUZDV.Blazor.WasmServerHost\test\JGUZDV.Blazor.WasmServerHost.Tests.csproj", "{A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore", "libraries\JGUZDV.CQRS.AspNetCore\src\JGUZDV.CQRS.AspNetCore.csproj", "{D8484887-7778-4307-B7A1-4E7CDA711E91}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy", "libraries\JGUZDV.YARP.SimpleReverseProxy\src\JGUZDV.YARP.SimpleReverseProxy.csproj", "{7D6C1BB8-4E00-4DB0-9063-859A98C69927}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.CQRS.AspNetCore.Tests", "libraries\JGUZDV.CQRS.AspNetCore\test\JGUZDV.CQRS.AspNetCore.Tests.csproj", "{F00F6E41-A1E5-45DA-A579-EA17696CC19A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy.Tests", "libraries\JGUZDV.YARP.SimpleReverseProxy\test\JGUZDV.YARP.SimpleReverseProxy.Tests.csproj", "{2E589423-3B93-4444-830B-8742E6BF8FD1}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Authorization", "JGUZDV.Extensions.Authorization", "{06DEFC5F-DBE4-4B79-B025-08E097216E5A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost", "libraries\JGUZDV.JobHost\src\JGUZDV.JobHost.csproj", "{02F83C77-C526-41D5-853B-1E40EF7F5CDA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization", "libraries\JGUZDV.Extensions.Authorization\src\JGUZDV.Extensions.Authorization.csproj", "{F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost.Tests", "libraries\JGUZDV.JobHost\test\JGUZDV.JobHost.Tests.csproj", "{E081A3D2-23D1-4C02-80F0-2832DCB502EF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Authorization.Tests", "libraries\JGUZDV.Extensions.Authorization\test\JGUZDV.Extensions.Authorization.Tests.csproj", "{64994378-C809-4702-BF71-9CACEFEB47E5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.ClientStorage.Blazor", "libraries\JGUZDV.ClientStorage.Blazor\JGUZDV.ClientStorage.Blazor.csproj", "{FD6D3808-5542-458E-88C0-4918F074D8A3}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Json", "JGUZDV.Extensions.Json", "{47CC715C-603B-4C1A-88B5-14562727C6E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json", "libraries\JGUZDV.Extensions.Json\src\JGUZDV.Extensions.Json.csproj", "{A3E254D9-8D81-4EC3-B52C-55D9354E9955}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Json.Tests", "libraries\JGUZDV.Extensions.Json\test\JGUZDV.Extensions.Json.Tests.csproj", "{F05F64E2-8906-4AD1-89E5-5F40A30F55BB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Extensions.Logging", "JGUZDV.Extensions.Logging", "{D9C7551A-2F65-4D5F-9D4E-A42704D850B5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging", "libraries\JGUZDV.Extensions.Logging\src\JGUZDV.Extensions.Logging.csproj", "{0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Extensions.Logging.Tests", "libraries\JGUZDV.Extensions.Logging\test\JGUZDV.Extensions.Logging.Tests.csproj", "{130E8BF8-97A3-468C-80A8-92247DCBFF51}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.JobHost", "JGUZDV.JobHost", "{B06ACF77-B0EF-42F4-BA33-776F7496E2E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost", "libraries\JGUZDV.JobHost\src\JGUZDV.JobHost.csproj", "{57FBEC02-58DA-435C-82FC-BE9EEC064362}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.JobHost.Tests", "libraries\JGUZDV.JobHost\test\JGUZDV.JobHost.Tests.csproj", "{A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.L10n", "JGUZDV.L10n", "{D93740E7-7EAB-4B4C-957E-E21CD73AA1BA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n", "libraries\JGUZDV.L10n\src\JGUZDV.L10n.csproj", "{B385CC10-A10B-4986-8BF3-443658D5C46B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.Tests", "libraries\JGUZDV.L10n\test\JGUZDV.L10n.Tests.csproj", "{F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.L10n.EntityFramework", "JGUZDV.L10n.EntityFramework", "{E5F92691-2BEB-491C-9219-CBA30A54A3E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework", "libraries\JGUZDV.L10n.EntityFramework\src\JGUZDV.L10n.EntityFramework.csproj", "{67E30962-CD08-4700-B1F8-8E7C029F40CF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.L10n.EntityFramework.Tests", "libraries\JGUZDV.L10n.EntityFramework\test\JGUZDV.L10n.EntityFramework.Tests.csproj", "{49AA7C6A-AB52-457C-BB9E-C927082DBA34}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.Linq", "JGUZDV.Linq", "{4F001AAE-FC38-4071-94B2-DC33FE5C3735}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq", "libraries\JGUZDV.Linq\src\JGUZDV.Linq.csproj", "{33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.Linq.Tests", "libraries\JGUZDV.Linq\test\JGUZDV.Linq.Tests.csproj", "{228AB90A-19B5-4678-802C-ECA16AA848ED}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.OpenIddict.KeyManager", "JGUZDV.OpenIddict.KeyManager", "{FAB5A604-6D92-46FA-9B3C-AF6165ED8042}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager", "libraries\JGUZDV.OpenIddict.KeyManager\src\JGUZDV.OpenIddict.KeyManager.csproj", "{6813FD87-FAA4-4572-ABF5-3730726E214B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.OpenIddict.KeyManager.Tests", "libraries\JGUZDV.OpenIddict.KeyManager\test\JGUZDV.OpenIddict.KeyManager.Tests.csproj", "{C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.YARP.SimpleReverseProxy", "JGUZDV.YARP.SimpleReverseProxy", "{B264316F-1CF0-4CF2-9D21-CB908688960D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy", "libraries\JGUZDV.YARP.SimpleReverseProxy\src\JGUZDV.YARP.SimpleReverseProxy.csproj", "{2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.YARP.SimpleReverseProxy.Tests", "libraries\JGUZDV.YARP.SimpleReverseProxy\test\JGUZDV.YARP.SimpleReverseProxy.Tests.csproj", "{2DB861F2-5DEA-481B-BECD-6F00EC8C6802}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JGUZDV.WebApiHost", "JGUZDV.WebApiHost", "{4AADAD6A-4BA0-427E-9EA1-4AFE211C1200}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.WebApiHost", "libraries\JGUZDV.WebApiHost\src\JGUZDV.WebApiHost.csproj", "{53D9AE20-2981-411C-87CD-5DCD71D181B4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JGUZDV.WebApiHost.Tests", "libraries\JGUZDV.WebApiHost\test\JGUZDV.WebApiHost.Tests.csproj", "{892EA5E4-A98F-4A36-B901-8A1FAB27623E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {311DE251-20A2-42C0-BD6C-2A327221D3C3}.Release|Any CPU.Build.0 = Release|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E}.Release|Any CPU.Build.0 = Release|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F}.Release|Any CPU.Build.0 = Release|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97B58430-AAA3-4283-85FC-2BA1ED37514E}.Release|Any CPU.Build.0 = Release|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C551EE51-B06E-4554-9114-763150B8908E}.Release|Any CPU.Build.0 = Release|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A}.Release|Any CPU.Build.0 = Release|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F}.Release|Any CPU.Build.0 = Release|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7372528E-F5B9-49C6-8EC4-8F793DFC081D}.Release|Any CPU.Build.0 = Release|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57}.Release|Any CPU.Build.0 = Release|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4B50EE32-BF4F-4FE4-918D-3B35695CD829}.Release|Any CPU.Build.0 = Release|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB284655-5FE2-4DF9-BCF9-87A8962C086E}.Release|Any CPU.Build.0 = Release|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C}.Release|Any CPU.Build.0 = Release|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D}.Release|Any CPU.Build.0 = Release|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D95B0932-CC64-440A-A956-D9D9EF9E1A99}.Release|Any CPU.Build.0 = Release|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E}.Release|Any CPU.Build.0 = Release|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AECC9062-83E1-4B62-906D-1055E61E71DE}.Release|Any CPU.Build.0 = Release|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DFED352-5E7E-4688-8371-8B55EB800705}.Release|Any CPU.Build.0 = Release|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {793F6A63-30B3-44BC-A205-50031E27E31C}.Release|Any CPU.Build.0 = Release|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4AAFE071-EC5E-4F28-961C-7BB1259DC452}.Release|Any CPU.Build.0 = Release|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B}.Release|Any CPU.Build.0 = Release|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B39492DF-D142-4F68-BAE9-2862D4B2E865}.Release|Any CPU.Build.0 = Release|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Debug|Any CPU.Build.0 = Debug|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Release|Any CPU.ActiveCfg = Release|Any CPU - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08}.Release|Any CPU.Build.0 = Release|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72}.Release|Any CPU.Build.0 = Release|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1}.Release|Any CPU.Build.0 = Release|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BB820FE9-4253-428E-A65A-95CF269022E9}.Release|Any CPU.Build.0 = Release|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24}.Release|Any CPU.Build.0 = Release|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DE8AF4D-4D46-4766-844E-819757AC4E4C}.Release|Any CPU.Build.0 = Release|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0}.Release|Any CPU.Build.0 = Release|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AADC7783-3155-4905-9524-61EE2E5E01C2}.Release|Any CPU.Build.0 = Release|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {115784A8-B2A6-4790-99D3-C41049CBC1C9}.Release|Any CPU.Build.0 = Release|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {397C9A29-83DB-4944-9D4E-93159CDA60B6}.Release|Any CPU.Build.0 = Release|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68E91C38-4D95-4DCE-9BC2-4AE71236B289}.Release|Any CPU.Build.0 = Release|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD}.Release|Any CPU.Build.0 = Release|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D6C1BB8-4E00-4DB0-9063-859A98C69927}.Release|Any CPU.Build.0 = Release|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E589423-3B93-4444-830B-8742E6BF8FD1}.Release|Any CPU.Build.0 = Release|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02F83C77-C526-41D5-853B-1E40EF7F5CDA}.Release|Any CPU.Build.0 = Release|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E081A3D2-23D1-4C02-80F0-2832DCB502EF}.Release|Any CPU.Build.0 = Release|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD6D3808-5542-458E-88C0-4918F074D8A3}.Release|Any CPU.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|Any CPU.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x64.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x64.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x86.ActiveCfg = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Debug|x86.Build.0 = Debug|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|Any CPU.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|Any CPU.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x64.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x64.Build.0 = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x86.ActiveCfg = Release|Any CPU + {675D258E-525C-4048-8E88-97C5E78ED819}.Release|x86.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x64.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x64.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x86.ActiveCfg = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Debug|x86.Build.0 = Debug|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|Any CPU.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x64.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x64.Build.0 = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x86.ActiveCfg = Release|Any CPU + {5CE38D63-D07F-46F1-9008-8206AB6F4231}.Release|x86.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x64.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Debug|x86.Build.0 = Debug|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|Any CPU.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x64.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x64.Build.0 = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x86.ActiveCfg = Release|Any CPU + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C}.Release|x86.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x64.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x64.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Debug|x86.Build.0 = Debug|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|Any CPU.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x64.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x64.Build.0 = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x86.ActiveCfg = Release|Any CPU + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0}.Release|x86.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x64.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x64.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x86.ActiveCfg = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Debug|x86.Build.0 = Debug|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|Any CPU.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x64.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x64.Build.0 = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x86.ActiveCfg = Release|Any CPU + {29CE7134-3831-4E4A-A502-C84233D1ED35}.Release|x86.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x64.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x64.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x86.ActiveCfg = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Debug|x86.Build.0 = Debug|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|Any CPU.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x64.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x64.Build.0 = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x86.ActiveCfg = Release|Any CPU + {20E70A44-016E-470C-947D-C1FC4161D1FB}.Release|x86.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x64.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Debug|x86.Build.0 = Debug|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|Any CPU.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x64.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x64.Build.0 = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x86.ActiveCfg = Release|Any CPU + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13}.Release|x86.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x64.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Debug|x86.Build.0 = Debug|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|Any CPU.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x64.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x64.Build.0 = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x86.ActiveCfg = Release|Any CPU + {88A3D096-F763-47DB-A94B-040D416746E8}.Release|x86.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x64.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Debug|x86.Build.0 = Debug|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|Any CPU.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x64.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x64.Build.0 = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x86.ActiveCfg = Release|Any CPU + {FB3900A8-72B4-4186-90A8-9FA9F585C20E}.Release|x86.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x64.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x64.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x86.ActiveCfg = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Debug|x86.Build.0 = Debug|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|Any CPU.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x64.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x64.Build.0 = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x86.ActiveCfg = Release|Any CPU + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16}.Release|x86.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x64.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x64.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x86.ActiveCfg = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Debug|x86.Build.0 = Debug|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|Any CPU.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x64.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x64.Build.0 = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x86.ActiveCfg = Release|Any CPU + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B}.Release|x86.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x64.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x64.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x86.ActiveCfg = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Debug|x86.Build.0 = Debug|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|Any CPU.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x64.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x64.Build.0 = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x86.ActiveCfg = Release|Any CPU + {662FB941-E473-401D-B856-BC6564101B5D}.Release|x86.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x64.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x86.ActiveCfg = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Debug|x86.Build.0 = Debug|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|Any CPU.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x64.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x64.Build.0 = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x86.ActiveCfg = Release|Any CPU + {8E600186-574C-41F7-AC0F-B8BC61ED03F7}.Release|x86.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x64.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x64.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x86.ActiveCfg = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Debug|x86.Build.0 = Debug|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|Any CPU.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x64.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x64.Build.0 = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x86.ActiveCfg = Release|Any CPU + {C806F47E-41BF-47D8-975B-A19C8EC14E39}.Release|x86.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x64.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x64.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x86.ActiveCfg = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Debug|x86.Build.0 = Debug|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|Any CPU.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x64.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x64.Build.0 = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x86.ActiveCfg = Release|Any CPU + {76CE3554-41C4-402F-805E-C7C90387B8DD}.Release|x86.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x64.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x86.ActiveCfg = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Debug|x86.Build.0 = Debug|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|Any CPU.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x64.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x64.Build.0 = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x86.ActiveCfg = Release|Any CPU + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB}.Release|x86.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x64.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Debug|x86.Build.0 = Debug|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|Any CPU.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x64.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x64.Build.0 = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x86.ActiveCfg = Release|Any CPU + {26405220-3D38-4D2E-867E-DC53130B0FEB}.Release|x86.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x64.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x64.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x86.ActiveCfg = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Debug|x86.Build.0 = Debug|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|Any CPU.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x64.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x64.Build.0 = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x86.ActiveCfg = Release|Any CPU + {4CD5DE24-C829-4038-8875-1C8B63C96EB7}.Release|x86.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x64.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Debug|x86.Build.0 = Debug|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|Any CPU.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x64.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x64.Build.0 = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x86.ActiveCfg = Release|Any CPU + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7}.Release|x86.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x64.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x86.ActiveCfg = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Debug|x86.Build.0 = Debug|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|Any CPU.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x64.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x64.Build.0 = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x86.ActiveCfg = Release|Any CPU + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556}.Release|x86.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x64.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Debug|x86.Build.0 = Debug|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|Any CPU.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x64.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x64.Build.0 = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x86.ActiveCfg = Release|Any CPU + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B}.Release|x86.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x64.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x64.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x86.ActiveCfg = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Debug|x86.Build.0 = Debug|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|Any CPU.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x64.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x64.Build.0 = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x86.ActiveCfg = Release|Any CPU + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0}.Release|x86.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x64.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x64.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x86.ActiveCfg = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Debug|x86.Build.0 = Debug|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|Any CPU.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x64.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x64.Build.0 = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x86.ActiveCfg = Release|Any CPU + {86427769-9110-4A15-894E-264601C062BD}.Release|x86.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x64.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Debug|x86.Build.0 = Debug|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|Any CPU.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x64.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x64.Build.0 = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x86.ActiveCfg = Release|Any CPU + {D8484887-7778-4307-B7A1-4E7CDA711E91}.Release|x86.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x64.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x64.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x86.ActiveCfg = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Debug|x86.Build.0 = Debug|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|Any CPU.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x64.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x64.Build.0 = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x86.ActiveCfg = Release|Any CPU + {F00F6E41-A1E5-45DA-A579-EA17696CC19A}.Release|x86.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x64.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x64.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x86.ActiveCfg = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Debug|x86.Build.0 = Debug|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|Any CPU.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x64.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x64.Build.0 = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x86.ActiveCfg = Release|Any CPU + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B}.Release|x86.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x64.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x64.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x86.ActiveCfg = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Debug|x86.Build.0 = Debug|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|Any CPU.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x64.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x64.Build.0 = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x86.ActiveCfg = Release|Any CPU + {64994378-C809-4702-BF71-9CACEFEB47E5}.Release|x86.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x64.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x64.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x86.ActiveCfg = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Debug|x86.Build.0 = Debug|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|Any CPU.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x64.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x64.Build.0 = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x86.ActiveCfg = Release|Any CPU + {A3E254D9-8D81-4EC3-B52C-55D9354E9955}.Release|x86.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x64.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Debug|x86.Build.0 = Debug|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|Any CPU.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x64.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x64.Build.0 = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x86.ActiveCfg = Release|Any CPU + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB}.Release|x86.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x64.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x64.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x86.ActiveCfg = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Debug|x86.Build.0 = Debug|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|Any CPU.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x64.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x64.Build.0 = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x86.ActiveCfg = Release|Any CPU + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80}.Release|x86.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x64.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x64.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x86.ActiveCfg = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Debug|x86.Build.0 = Debug|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|Any CPU.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x64.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x64.Build.0 = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x86.ActiveCfg = Release|Any CPU + {130E8BF8-97A3-468C-80A8-92247DCBFF51}.Release|x86.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x64.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x64.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x86.ActiveCfg = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Debug|x86.Build.0 = Debug|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|Any CPU.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|Any CPU.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x64.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x64.Build.0 = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x86.ActiveCfg = Release|Any CPU + {57FBEC02-58DA-435C-82FC-BE9EEC064362}.Release|x86.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x64.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x64.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Debug|x86.Build.0 = Debug|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|Any CPU.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x64.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x64.Build.0 = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x86.ActiveCfg = Release|Any CPU + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5}.Release|x86.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x64.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Debug|x86.Build.0 = Debug|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|Any CPU.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x64.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x64.Build.0 = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x86.ActiveCfg = Release|Any CPU + {B385CC10-A10B-4986-8BF3-443658D5C46B}.Release|x86.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x64.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x64.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x86.ActiveCfg = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Debug|x86.Build.0 = Debug|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|Any CPU.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x64.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x64.Build.0 = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x86.ActiveCfg = Release|Any CPU + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018}.Release|x86.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x64.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Debug|x86.Build.0 = Debug|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|Any CPU.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x64.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x64.Build.0 = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x86.ActiveCfg = Release|Any CPU + {67E30962-CD08-4700-B1F8-8E7C029F40CF}.Release|x86.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|Any CPU.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x64.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x64.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x86.ActiveCfg = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Debug|x86.Build.0 = Debug|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|Any CPU.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|Any CPU.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x64.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x64.Build.0 = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x86.ActiveCfg = Release|Any CPU + {49AA7C6A-AB52-457C-BB9E-C927082DBA34}.Release|x86.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x64.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x64.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x86.ActiveCfg = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Debug|x86.Build.0 = Debug|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|Any CPU.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x64.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x64.Build.0 = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x86.ActiveCfg = Release|Any CPU + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD}.Release|x86.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x64.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x64.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x86.ActiveCfg = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Debug|x86.Build.0 = Debug|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|Any CPU.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x64.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x64.Build.0 = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x86.ActiveCfg = Release|Any CPU + {228AB90A-19B5-4678-802C-ECA16AA848ED}.Release|x86.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x64.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x64.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x86.ActiveCfg = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Debug|x86.Build.0 = Debug|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|Any CPU.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x64.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x64.Build.0 = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x86.ActiveCfg = Release|Any CPU + {6813FD87-FAA4-4572-ABF5-3730726E214B}.Release|x86.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x64.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Debug|x86.Build.0 = Debug|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|Any CPU.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x64.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x64.Build.0 = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x86.ActiveCfg = Release|Any CPU + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5}.Release|x86.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x64.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x64.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x86.ActiveCfg = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Debug|x86.Build.0 = Debug|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|Any CPU.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x64.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x64.Build.0 = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x86.ActiveCfg = Release|Any CPU + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010}.Release|x86.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x64.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x64.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x86.ActiveCfg = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Debug|x86.Build.0 = Debug|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|Any CPU.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x64.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x64.Build.0 = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x86.ActiveCfg = Release|Any CPU + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802}.Release|x86.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x64.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Debug|x86.Build.0 = Debug|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|Any CPU.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x64.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x64.Build.0 = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x86.ActiveCfg = Release|Any CPU + {53D9AE20-2981-411C-87CD-5DCD71D181B4}.Release|x86.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x64.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x64.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x86.ActiveCfg = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Debug|x86.Build.0 = Debug|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|Any CPU.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x64.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x64.Build.0 = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x86.ActiveCfg = Release|Any CPU + {892EA5E4-A98F-4A36-B901-8A1FAB27623E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {311DE251-20A2-42C0-BD6C-2A327221D3C3} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {6D6BD6AF-06E3-4FB2-ADEF-E373D2E94B3E} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {F840F15F-592B-4E82-BFEB-CA2F3DBA3C2F} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {97B58430-AAA3-4283-85FC-2BA1ED37514E} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {C551EE51-B06E-4554-9114-763150B8908E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {07AAE83F-56C7-4A9A-9972-7F9BE53D031A} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {A7A0EDB7-BFE4-4645-A8A3-0D42A5E1002F} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {7372528E-F5B9-49C6-8EC4-8F793DFC081D} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {A0A4DB02-4AB6-42FA-8F75-B0A58BCF8E57} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {4B50EE32-BF4F-4FE4-918D-3B35695CD829} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {AB284655-5FE2-4DF9-BCF9-87A8962C086E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {EC5DD74A-C0FB-4310-95FF-F8C9E2817F5C} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {175E14F2-E526-4DEA-9E05-AA87E48DBD7D} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {D95B0932-CC64-440A-A956-D9D9EF9E1A99} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {9610AFDB-AA50-4AFF-80E5-B8CA65D84A8E} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {AECC9062-83E1-4B62-906D-1055E61E71DE} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {3DFED352-5E7E-4688-8371-8B55EB800705} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {793F6A63-30B3-44BC-A205-50031E27E31C} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {AA0D0715-5EAE-437A-ABF5-D596B127544B} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} - {4AAFE071-EC5E-4F28-961C-7BB1259DC452} = {AA0D0715-5EAE-437A-ABF5-D596B127544B} - {E5097EE8-6385-4C20-9DE3-8902CEA4FE8B} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {B39492DF-D142-4F68-BAE9-2862D4B2E865} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {17C0DC51-C48D-4CAD-BF20-2C1BF7785A08} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {E3623DC7-BE65-4EBD-9E1D-D66BE0502F72} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {5EED8C4F-CE5B-4539-ABCE-5D07F4EE92B1} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {BB820FE9-4253-428E-A65A-95CF269022E9} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {3B8F0A74-D7DD-4FA7-A6DF-568640868A24} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {1DE8AF4D-4D46-4766-844E-819757AC4E4C} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {D0DE2AFA-498B-489B-9DC4-3AFC8CA60EF0} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {AADC7783-3155-4905-9524-61EE2E5E01C2} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {115784A8-B2A6-4790-99D3-C41049CBC1C9} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {397C9A29-83DB-4944-9D4E-93159CDA60B6} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {68E91C38-4D95-4DCE-9BC2-4AE71236B289} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {A2AF6E5E-C42E-47A1-AE81-ED81B84C57DD} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {7D6C1BB8-4E00-4DB0-9063-859A98C69927} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {2E589423-3B93-4444-830B-8742E6BF8FD1} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {02F83C77-C526-41D5-853B-1E40EF7F5CDA} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} - {E081A3D2-23D1-4C02-80F0-2832DCB502EF} = {50252EFB-8629-4B1D-AC2F-5F29CB6F684D} - {FD6D3808-5542-458E-88C0-4918F074D8A3} = {5F18EE62-3FBC-42F5-96DC-8C61C3D9EF27} + {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {675D258E-525C-4048-8E88-97C5E78ED819} = {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} + {5CE38D63-D07F-46F1-9008-8206AB6F4231} = {FBF7BAF0-B8E9-45C5-9B50-7B8DDD607467} + {ED0A40A7-2790-42F3-822E-C475F021D7D8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {3848AAF1-D8CA-4C55-A0B6-FCE23DDE8D9C} = {ED0A40A7-2790-42F3-822E-C475F021D7D8} + {FDFA7DDF-05D0-44F6-9000-71A4DD07BED0} = {ED0A40A7-2790-42F3-822E-C475F021D7D8} + {F86B6B96-D027-4FF4-931D-69AA0891F539} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {29CE7134-3831-4E4A-A502-C84233D1ED35} = {F86B6B96-D027-4FF4-931D-69AA0891F539} + {20E70A44-016E-470C-947D-C1FC4161D1FB} = {F86B6B96-D027-4FF4-931D-69AA0891F539} + {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {5D5F2C2A-24CD-4C27-902D-FA439E84AD13} = {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} + {88A3D096-F763-47DB-A94B-040D416746E8} = {458FC9E2-3D73-44AF-BE0A-C5C0F23AFE2B} + {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {FB3900A8-72B4-4186-90A8-9FA9F585C20E} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {73A3EE19-DEE8-4F79-85F5-DE42FE638F16} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {ADADE7CE-4766-4220-AF7B-F51B5C1F334B} = {DD6389E2-3940-4E3A-AB5F-3B041AFDCAED} + {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {662FB941-E473-401D-B856-BC6564101B5D} = {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} + {8E600186-574C-41F7-AC0F-B8BC61ED03F7} = {CD85DC7B-D7D3-4DFF-99D1-B7841BD1F4D8} + {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {C806F47E-41BF-47D8-975B-A19C8EC14E39} = {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} + {76CE3554-41C4-402F-805E-C7C90387B8DD} = {51FA04BB-81A2-4EA7-B722-CF4A16BA75E8} + {31F5F80A-A66E-4443-BA0B-052D5B836CD6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {2C82E6F1-FEDC-46A1-AE8F-AF550CFA52AB} = {31F5F80A-A66E-4443-BA0B-052D5B836CD6} + {26405220-3D38-4D2E-867E-DC53130B0FEB} = {31F5F80A-A66E-4443-BA0B-052D5B836CD6} + {1645F9F0-9447-4249-B15C-790FF70E1968} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {4CD5DE24-C829-4038-8875-1C8B63C96EB7} = {1645F9F0-9447-4249-B15C-790FF70E1968} + {DBD08C7B-B0FD-4EBD-8D3E-41EDFDD35EA7} = {1645F9F0-9447-4249-B15C-790FF70E1968} + {BEE249C5-60E0-43AE-BE52-F65A736BCF32} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {5A65ADF6-09D7-4934-92D2-6EA8EB3D3556} = {BEE249C5-60E0-43AE-BE52-F65A736BCF32} + {9A27AAA8-AFE9-43D4-A3C6-E5D3DAC2ED2B} = {BEE249C5-60E0-43AE-BE52-F65A736BCF32} + {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {70C6FC9D-94BC-4394-AA8E-EB4A329FADB0} = {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} + {86427769-9110-4A15-894E-264601C062BD} = {D2EEC902-ED1E-419F-9BDA-E91C35498B9A} + {449665D2-57FF-4DFC-BB3A-6E397C49CE72} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {D8484887-7778-4307-B7A1-4E7CDA711E91} = {449665D2-57FF-4DFC-BB3A-6E397C49CE72} + {F00F6E41-A1E5-45DA-A579-EA17696CC19A} = {449665D2-57FF-4DFC-BB3A-6E397C49CE72} + {06DEFC5F-DBE4-4B79-B025-08E097216E5A} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {F3565C4B-7BF8-4AB5-94B1-2FCD1B5CCF4B} = {06DEFC5F-DBE4-4B79-B025-08E097216E5A} + {64994378-C809-4702-BF71-9CACEFEB47E5} = {06DEFC5F-DBE4-4B79-B025-08E097216E5A} + {47CC715C-603B-4C1A-88B5-14562727C6E0} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {A3E254D9-8D81-4EC3-B52C-55D9354E9955} = {47CC715C-603B-4C1A-88B5-14562727C6E0} + {F05F64E2-8906-4AD1-89E5-5F40A30F55BB} = {47CC715C-603B-4C1A-88B5-14562727C6E0} + {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {0D48D910-83B8-4FEE-A0AD-E0FB3536BC80} = {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} + {130E8BF8-97A3-468C-80A8-92247DCBFF51} = {D9C7551A-2F65-4D5F-9D4E-A42704D850B5} + {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {57FBEC02-58DA-435C-82FC-BE9EEC064362} = {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} + {A8DDE01F-50DC-49D1-805B-4F9331A3DDD5} = {B06ACF77-B0EF-42F4-BA33-776F7496E2E6} + {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {B385CC10-A10B-4986-8BF3-443658D5C46B} = {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} + {F8BBA3C2-9DAC-412D-8084-E69F5F2F3018} = {D93740E7-7EAB-4B4C-957E-E21CD73AA1BA} + {E5F92691-2BEB-491C-9219-CBA30A54A3E6} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {67E30962-CD08-4700-B1F8-8E7C029F40CF} = {E5F92691-2BEB-491C-9219-CBA30A54A3E6} + {49AA7C6A-AB52-457C-BB9E-C927082DBA34} = {E5F92691-2BEB-491C-9219-CBA30A54A3E6} + {4F001AAE-FC38-4071-94B2-DC33FE5C3735} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {33895E03-3FB0-4FE1-9660-A0A8D1F92FDD} = {4F001AAE-FC38-4071-94B2-DC33FE5C3735} + {228AB90A-19B5-4678-802C-ECA16AA848ED} = {4F001AAE-FC38-4071-94B2-DC33FE5C3735} + {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {6813FD87-FAA4-4572-ABF5-3730726E214B} = {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} + {C6B6D866-3CD2-4724-BE9C-E70A78C9D9D5} = {FAB5A604-6D92-46FA-9B3C-AF6165ED8042} + {B264316F-1CF0-4CF2-9D21-CB908688960D} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {2EC9B3D0-C6AB-45D7-BF92-8016D83A4010} = {B264316F-1CF0-4CF2-9D21-CB908688960D} + {2DB861F2-5DEA-481B-BECD-6F00EC8C6802} = {B264316F-1CF0-4CF2-9D21-CB908688960D} + {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} = {DA4DE709-E5BC-4B93-88D2-838656C217CE} + {53D9AE20-2981-411C-87CD-5DCD71D181B4} = {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} + {892EA5E4-A98F-4A36-B901-8A1FAB27623E} = {4AADAD6A-4BA0-427E-9EA1-4AFE211C1200} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution + RESX_SortFileContentOnSave = True + RESX_NeutralResourcesLanguage = de-DE SolutionGuid = {46ECC226-1874-4539-8589-8B2029909C4A} EndGlobalSection EndGlobal diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs index 4a0131e..23d9afe 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/Constants.cs @@ -1,6 +1,12 @@ namespace JGUZDV.AspNetCore.DataProtection; +/// +/// Public constants for this package +/// public static class Constants { + /// + /// Default section name for the configuration + /// public const string DefaultSectionName = "JGUZDV:DataProtection"; } diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs index c09929a..980d25f 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/DataProtectionBuilderExtensions.cs @@ -7,9 +7,14 @@ namespace JGUZDV.AspNetCore.DataProtection; +/// +/// Extension methods for configuring data protection. +/// public static class DataProtectionBuilderExtensions { - + /// + /// Configures the data protection system with the specified configuration. + /// public static IDataProtectionBuilder UseDataProtectionConfig(this IDataProtectionBuilder builder, IConfigurationSection configuration, IWebHostEnvironment? environment) { var config = new Configuration(); diff --git a/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs b/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs index e306350..ca7272c 100644 --- a/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.DataProtection/src/JGUZDVDataProtectionExtensions.cs @@ -6,14 +6,28 @@ namespace Microsoft.Extensions.DependencyInjection; +/// +/// Extension methods for configuring data protection. +/// public static class JGUZDVDataProtectionExtensions { + /// + /// Adds data protection to the application using the specified configuration. + /// public static IDataProtectionBuilder AddJGUZDVDataProtection(this IServiceCollection services, IConfigurationSection configurationSection, IWebHostEnvironment? environment = null) => services.AddDataProtection().UseDataProtectionConfig(configurationSection, environment); + + /// + /// Adds data protection to the application using the specified configuration. + /// public static IDataProtectionBuilder AddJGUZDVDataProtection(this IServiceCollection services, IConfiguration config, IWebHostEnvironment? environment = null) => services.AddJGUZDVDataProtection(config.GetSection(Constants.DefaultSectionName), environment); + + /// + /// Adds data protection to the application using the specified configuration. + /// public static IDataProtectionBuilder AddJGUZDVDataProtection(this WebApplicationBuilder builder, string sectionName = Constants.DefaultSectionName) => builder.Services.AddJGUZDVDataProtection(builder.Configuration.GetSection(sectionName), builder.Environment); } diff --git a/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs b/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs deleted file mode 100644 index dcd5563..0000000 --- a/libraries/JGUZDV.AspNetCore.Logging/src/Constants.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace JGUZDV.AspNetCore.Logging -{ - public class Constants - { - public const string DefaultSectionName = "Logging"; - public const string DefaultEventLogSource = ".NET Runtime"; - } -} diff --git a/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs b/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs index 0467e0e..6c76a0a 100644 --- a/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs +++ b/libraries/JGUZDV.AspNetCore.Logging/src/JGUZDVLoggingExtensions.cs @@ -1,11 +1,16 @@ -using JGUZDV.AspNetCore.Logging; -using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder; namespace Microsoft.Extensions.DependencyInjection; +/// +/// Extension methods for configuring logging. +/// public static class JGUZDVLoggingExtensions { - public static WebApplicationBuilder UseJGUZDVLogging(this WebApplicationBuilder builder, string configSectionName = Constants.DefaultSectionName) + /// + /// Configures the web host to use the default logging configuration. + /// + public static WebApplicationBuilder UseJGUZDVLogging(this WebApplicationBuilder builder, string configSectionName = JGUZDV.Extensions.Logging.Constants.DefaultSectionName) { builder.Host.UseJGUZDVLogging(configSectionName); return builder; diff --git a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx new file mode 100644 index 0000000..e1fbef4 --- /dev/null +++ b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/src/Resources/ClaimRequirementsStrings.fr.resx @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ajouter une règle de type/valeur + + + Ajouter un ensemble de règles + + + Taper + + + Valeur + + + Sélectionner un raccourci + + + Tous (ET) + + + Au moins un (OU) + + + Supprimer + + + jeter + + + Sauvegarder + + + Comparaison type pour type + + + Type de comparaison pour la valeur + + + Désactivez le caractère générique (*) + + + ET + + + Aucune règle n'a été définie. + + + Type de comparaison + + + Types de comparaison + + + OU + + \ No newline at end of file diff --git a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj index 0204de9..1a0b856 100644 --- a/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj +++ b/libraries/JGUZDV.Blazor.Components.ClaimRequirements/test/JGUZDV.Blazor.Components.ClaimRequirements.Tests.csproj @@ -9,17 +9,4 @@ true - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - diff --git a/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj b/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj index 6587a39..253c0b9 100644 --- a/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj +++ b/libraries/JGUZDV.Blazor.Components/src/JGUZDV.Blazor.Components.csproj @@ -23,8 +23,8 @@ - - + + diff --git a/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj b/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj index 93704c1..b8c24d4 100644 --- a/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj +++ b/libraries/JGUZDV.Blazor.StateManagement/src/JGUZDV.Blazor.StateManagement.csproj @@ -22,7 +22,7 @@ - + diff --git a/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj b/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj index 9be4e2a..ca492cd 100644 --- a/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj +++ b/libraries/JGUZDV.Blazor.StateManagement/test/JGUZDV.Blazor.StateManagement.Tests.csproj @@ -6,21 +6,12 @@ enable false + true - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - diff --git a/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs b/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs index 037d853..3efbf4b 100644 --- a/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs +++ b/libraries/JGUZDV.CQRS/src/CQRSDecoratorAttribute.cs @@ -2,7 +2,7 @@ { /// /// Flags a class as a "Decorator". - /// Decorators won't be automatically registered as ICommandHandler<> or IQueryHandler<> during DI setup. + /// Decorators won't be automatically registered as ICommandHandler<> or IQueryHandler<> during DI setup. /// [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] public sealed class CQRSDecoratorAttribute : Attribute { } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs index 86963f6..07c439b 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirement.cs @@ -4,17 +4,32 @@ namespace JGUZDV.Extensions.Authorization; +/// +/// Represents a requirement that can be satisfied by a set of claims or a claims principal. +/// [JsonDerivedType(typeof(ClaimValueRequirement), typeDiscriminator: "Value")] [JsonDerivedType(typeof(ClaimRequirementCollection), typeDiscriminator: "List")] [JsonDerivedType(typeof(NullRequirement), typeDiscriminator: "Null")] public abstract class ClaimRequirement : IEquatable { + /// + /// Determines if the requirement is satisfied by the specified principal. + /// public virtual bool IsSatisfiedBy(ClaimsPrincipal? principal) => IsSatisfiedBy(principal?.Claims); + /// + /// Determines if the requirement is satisfied by the specified claims. + /// public abstract bool IsSatisfiedBy(IEnumerable? claims); + /// + /// Deep clones the requirement. + /// public abstract ClaimRequirement Clone(); + /// + /// Determines if the requirement is equal to the specified requirement. + /// public abstract bool Equals(ClaimRequirement? other); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs index ff9b932..819436b 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementCollection.cs @@ -3,8 +3,14 @@ namespace JGUZDV.Extensions.Authorization; +/// +/// Represents a collection of requrements that can be combined with either or or and as combination logic. +/// public sealed class ClaimRequirementCollection : ClaimRequirement { + /// + /// Initializes a new instance of the class. + /// [JsonConstructor] public ClaimRequirementCollection(List requirements, RequirementCollectionMatchType matchType) { @@ -12,16 +18,26 @@ public ClaimRequirementCollection(List requirements, Requireme MatchType = matchType; } + /// + /// Initializes a new instance of the class. + /// public ClaimRequirementCollection(RequirementCollectionMatchType matchType, params ClaimRequirement[] requirements) { Requirements = requirements.ToList(); MatchType = matchType; } + /// + /// Gets the requirements in the collection. + /// public List Requirements { get; } - public RequirementCollectionMatchType MatchType { get; } + /// + /// Gets the match type for the collection. + /// + public RequirementCollectionMatchType MatchType { get; } + /// public override bool IsSatisfiedBy(IEnumerable? claims) => claims != null && Requirements.Any() && MatchType switch @@ -31,7 +47,7 @@ public override bool IsSatisfiedBy(IEnumerable? claims) _ => false }; - + /// public sealed override ClaimRequirementCollection Clone() { var requirements = new List(); @@ -43,6 +59,7 @@ public sealed override ClaimRequirementCollection Clone() return result; } + /// public sealed override bool Equals(ClaimRequirement? other) { if (other is not ClaimRequirementCollection c) @@ -54,8 +71,18 @@ public sealed override bool Equals(ClaimRequirement? other) } } +/// +/// Represents the match type for a collection of requirements. +/// public enum RequirementCollectionMatchType { + /// + /// Requirment can be satisfied if all requirements are satisfied (AND). + /// MatchAll, + + /// + /// Requirement can be satisfied if any requirement is satisfied (OR). + /// MatchAny } \ No newline at end of file diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs index 6feefd8..0b88fc0 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimRequirementOptions.cs @@ -3,22 +3,56 @@ namespace JGUZDV.Extensions.Authorization; +/// +/// Represents a requirement compatible with the aspnet core options pattern. +/// public class ClaimRequirementOptions : IValidatableObject { + /// + /// Gets or sets the match type for the collection (use with Requirements to create a ClaimRequirementCollection). + /// public RequirementCollectionMatchType MatchType { get; set; } = RequirementCollectionMatchType.MatchAny; + + /// + /// Gets or sets the requirements in the collection (use with MatchType to create a ClaimRequirementCollection). + /// public List? Requirements { get; set; } + /// + /// Gets or sets a single claim type (use with ClaimValue to create a ClaimValueRequirement). + /// public string? ClaimType { get; set; } + + /// + /// Gets or sets a single claim value (use with ClaimType to create a ClaimValueRequirement). + /// public string? ClaimValue { get; set; } + /// + /// Gets or sets a value indicating whether wildcard matching is disabled. + /// public bool DisableWildcardMatch { get; set; } = false; + + /// + /// Gets or sets the comparison type for the claim type. + /// public StringComparison ClaimTypeComparison { get; set; } = StringComparison.OrdinalIgnoreCase; + + /// + /// Gets or sets the comparison type for the claim value. + /// public StringComparison ClaimValueComparison { get; set; } = StringComparison.Ordinal; private ClaimRequirement? _claimRequirement; + + /// + /// Gets the claim requirement represented by the options. + /// - Either a ClaimRequirementCollection, if Requirements are defined + /// - Or a ClaimValueRequirement, if ClaimType and ClaimValue are defined + /// public ClaimRequirement ClaimRequirement { get { @@ -45,9 +79,14 @@ public ClaimRequirement ClaimRequirement { } } + /// + /// Determines if the requirement is satisfied by the specified principal. + /// public bool SatisfiesRequirement(ClaimsPrincipal principal) => ClaimRequirement.IsSatisfiedBy(principal); - + /// + /// Validates the options. + /// public IEnumerable Validate(ValidationContext validationContext) { if (Requirements != null) { diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs index 1ebd1a3..f642342 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimValueRequirement.cs @@ -3,8 +3,14 @@ namespace JGUZDV.Extensions.Authorization; +/// +/// Represents a requirement that is satisfied by a specific claim value and type. +/// public sealed class ClaimValueRequirement : ClaimRequirement { + /// + /// Initializes a new instance of the class. + /// [JsonConstructor] public ClaimValueRequirement(string claimType, string claimValue, bool disableWildcardMatch, @@ -21,19 +27,44 @@ public ClaimValueRequirement(string claimType, string claimValue, ClaimValueComparison = claimValueComparison; } + /// + /// Initializes a new instance of the class. + /// public ClaimValueRequirement(string claimType, string claimValue) : this(claimType, claimValue, false) { } + /// + /// Initializes a new instance of the class. + /// public ClaimValueRequirement(string claimType, string claimValue, bool disableWildcardMatch) : this(claimType, claimValue, disableWildcardMatch, StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal) { } + /// + /// Gets the claim type that the requirement is satisfied by. + /// public string ClaimType { get; } + + /// + /// Gets the claim value that the requirement is satisfied by. + /// public string ClaimValue { get; } + + /// + /// Gets a value indicating whether wildcard matching is disabled (allows * in ClaimValue or ClaimType). + /// public bool DisableWildcardMatch { get; } + + /// + /// Gets the comparison type for the claim type. + /// public StringComparison ClaimTypeComparison { get; } - public StringComparison ClaimValueComparison { get; } + /// + /// Gets the comparison type for the claim value. + /// + public StringComparison ClaimValueComparison { get; } + /// public sealed override bool IsSatisfiedBy(IEnumerable? claims) => claims?.Any() == true && claims.Any(c => (c.Type.Equals(ClaimType, ClaimTypeComparison) || (!DisableWildcardMatch && ClaimType.Equals("*"))) && @@ -41,7 +72,7 @@ public sealed override bool IsSatisfiedBy(IEnumerable? claims) ); - + /// public sealed override ClaimValueRequirement Clone() { return new ClaimValueRequirement( @@ -50,6 +81,7 @@ public sealed override ClaimValueRequirement Clone() ClaimTypeComparison, ClaimValueComparison); } + /// public sealed override bool Equals(ClaimRequirement? other) { if (other is not ClaimValueRequirement c) @@ -62,6 +94,9 @@ public sealed override bool Equals(ClaimRequirement? other) ClaimValueComparison == c.ClaimValueComparison; } + /// + /// Creates a new instance of the class from the specified claim. + /// public static ClaimValueRequirement FromClaim(Claim claim, bool allowWildcard = false) => new(claim.Type, claim.Value, !allowWildcard, StringComparison.Ordinal, StringComparison.Ordinal); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs b/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs index 7ca1c83..30e6f63 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/ClaimsPrincipalExtension.cs @@ -2,8 +2,14 @@ namespace JGUZDV.Extensions.Authorization { + /// + /// Extension methods for . + /// public static class ClaimsPrincipalExtension { + /// + /// Determines if the current user satisfies the specified requirement. + /// public static bool SatisfiesRequirement(this ClaimsPrincipal currentUser, ClaimRequirement requirement) => requirement.IsSatisfiedBy(currentUser); } diff --git a/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs b/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs index 04b6009..191f73c 100644 --- a/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs +++ b/libraries/JGUZDV.Extensions.Authorization/src/NullRequirement.cs @@ -2,16 +2,27 @@ namespace JGUZDV.Extensions.Authorization { + /// + /// Represents a requirement that is never satisfied. + /// public class NullRequirement : ClaimRequirement { + /// + /// Gets a singleton instance of the requirement. + /// public static NullRequirement Instance { get; } = new NullRequirement(); + /// public override NullRequirement Clone() => new NullRequirement(); + /// public override bool Equals(ClaimRequirement? other) => other is NullRequirement; + /// + /// Will always return false for the null requirement. + /// public override bool IsSatisfiedBy(IEnumerable? principal) => false; } diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs index ed95dca..33ab15a 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/ClaimsPrincipalConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters { + /// + /// Converts a to and from JSON. + /// public class ClaimsPrincipalConverter : JsonConverter { + /// public override ClaimsPrincipal? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType is JsonTokenType.Null) @@ -157,7 +161,7 @@ private static Claim ReadClaim(ref Utf8JsonReader reader) } - + /// public override void Write(Utf8JsonWriter writer, ClaimsPrincipal value, JsonSerializerOptions options) { writer.WriteStartObject(); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs index fd3ac1f..e24d0d1 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/DateOnlyConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters; +/// +/// Converts a to and from JSON. +/// public class DateOnlyConverter : JsonConverter { + /// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); @@ -15,6 +19,7 @@ public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso return DateOnly.ParseExact(value, "yyyy'-'MM'-'dd"); } + /// public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("yyyy'-'MM'-'dd")); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs index 743c314..69f955a 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/StringTrimmingJsonConverter.cs @@ -3,21 +3,30 @@ namespace JGUZDV.Extensions.Json.Converters; +/// +/// Converts a to and from JSON, trimming the value. +/// public class StringTrimmingJsonConverter : JsonConverter { private readonly bool _trimToNull; + /// + /// Initializes a new instance of the class. + /// + /// Decide, if emtpy strings should be replaced with null. public StringTrimmingJsonConverter(bool trimToNull = true) { _trimToNull = trimToNull; } + /// public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); return Trim(value); } + /// public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) { writer.WriteStringValue(Trim(value)); diff --git a/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs b/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs index 6146d3e..13108ca 100644 --- a/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs +++ b/libraries/JGUZDV.Extensions.Json/src/Converters/TimeOnlyConverter.cs @@ -4,8 +4,12 @@ namespace JGUZDV.Extensions.Json.Converters; +/// +/// Converts a to and from JSON. +/// public class TimeOnlyConverter : JsonConverter { + /// public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var value = reader.GetString(); @@ -15,6 +19,7 @@ public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, Jso return TimeOnly.ParseExact(value, "HH:mm:ss"); } + /// public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options) { writer.WriteStringValue(value.ToString("HH:mm:ss")); diff --git a/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs b/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs index f142555..a03a2d1 100644 --- a/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs +++ b/libraries/JGUZDV.Extensions.Json/src/JsonSerializerOptionsExtensions.cs @@ -4,14 +4,17 @@ namespace JGUZDV.Extensions.Json; +/// +/// Extension methods for . +/// public static class JsonSerializerOptionsExtensions { /// /// This will set some default behaviour to JsonSerializerOptions: -#if NET6_0 - /// - Add DateOnlyConverter - /// - Add TimeOnlyConverter -#endif + /// - if NET6_0: + /// - Add DateOnlyConverter + /// - Add TimeOnlyConverter + /// - always: /// - Add StringTrimmingJsonConverter /// - Set DefaultIgnoreCondition to "WhenWritingNull" /// - PropertyNamingPolicy to 'null' diff --git a/libraries/JGUZDV.Extensions.Logging/src/Constants.cs b/libraries/JGUZDV.Extensions.Logging/src/Constants.cs index ccaa043..f85c541 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/Constants.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/Constants.cs @@ -1,8 +1,18 @@ namespace JGUZDV.Extensions.Logging { + /// + /// Constants used by the logging extensions. + /// public class Constants { + /// + /// The default section name for logging configuration. + /// public const string DefaultSectionName = "Logging"; + + /// + /// The default event log source. + /// public const string DefaultEventLogSource = ".NET Runtime"; } } diff --git a/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs b/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs index 6d5c049..16f3149 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/JGUZDVHostBuilderLoggingExtensions.cs @@ -4,25 +4,20 @@ namespace Microsoft.Extensions.DependencyInjection; +/// +/// Extension methods for configuring logging. +/// public static class JGUZDVHostBuilderLoggingExtensions { + /// + /// Configures the host builder to use the default logging configuration. + /// public static IHostBuilder UseJGUZDVLogging(this IHostBuilder hostBuilder) => hostBuilder.UseJGUZDVLogging(Constants.DefaultSectionName); + /// + /// Configures the host builder to use the specified logging configuration. + /// public static IHostBuilder UseJGUZDVLogging(this IHostBuilder hostBuilder, string configSectionName) => hostBuilder.UseSerilog((ctx, logger) => logger.BuildSerilogLogger(ctx.HostingEnvironment, ctx.Configuration, configSectionName)); - -/* -#if NET7_0_OR_GREATER - public static HostApplicationBuilder UseJGUZDVLogging(this HostApplicationBuilder applicationBuilder) - => applicationBuilder.UseJGUZDVLogging(Constants.DefaultSectionName); - - public static HostApplicationBuilder UseJGUZDVLogging(this HostApplicationBuilder applicationBuilder, string configSectionName) - { - applicationBuilder - applicationBuilder.UseSerilog((ctx, logger) => logger.BuildSerilogLogger(ctx.HostingEnvironment, ctx.Configuration, configSectionName)); - } - -#endif -*/ } \ No newline at end of file diff --git a/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs b/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs index 1f5d612..d77c670 100644 --- a/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs +++ b/libraries/JGUZDV.Extensions.Logging/src/SerilogHelpers.cs @@ -8,7 +8,7 @@ namespace JGUZDV.Extensions.Logging; -public static class SerilogHelpers +internal static class SerilogHelpers { internal static void BuildSerilogLogger(this LoggerConfiguration logger, IHostEnvironment hostEnvironment, IConfiguration configuration, string configSectionName) { diff --git a/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs b/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs new file mode 100644 index 0000000..6433223 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Controllers/FeatureManager.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.FeatureManagement; + +namespace JGUZDV.WebApiHost.Controllers +{ + /// + /// Controller for feauture flags + /// + [ApiController] + public class FeatureManager : ControllerBase + { + private readonly IFeatureManager _featureManager; + + /// + /// .ctor + /// + public FeatureManager(IFeatureManager featureManager) + { + _featureManager = featureManager; + } + + /// + /// Returns a list of all features and their status for the current user. + /// + [HttpGet("app/features")] + [Produces] + public async Task GetFeatures() + { + var result = new List(); + + var featureNames = _featureManager.GetFeatureNamesAsync(); + await foreach(var featureName in featureNames) + { + var isEnabled = await _featureManager.IsEnabledAsync(featureName); + result.Add(new Feature(featureName, isEnabled)); + } + + return Ok(new FeatureList(result)); + } + + /// + /// Represents a feature and its status + /// + public record Feature(string Name, bool IsEnabled); + + /// + /// Represents a list of features and their status + /// + public record FeatureList(IEnumerable Features); + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs b/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs new file mode 100644 index 0000000..df65838 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Extensions/ConfigurationExtensions.cs @@ -0,0 +1,10 @@ +using Microsoft.Extensions.Configuration; + +namespace JGUZDV.Blazor.WasmServerHost.Extensions +{ + internal static class ConfigurationExtensions + { + public static bool HasConfigSection(this IConfiguration configuration, string configSection) + => configuration.GetSection(configSection).Exists(); + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs b/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs new file mode 100644 index 0000000..15cf7fe --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/FeatureManagement/ClaimRequirementFeatureFilter.cs @@ -0,0 +1,33 @@ +using JGUZDV.Extensions.Authorization; + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.FeatureManagement; + +namespace JGUZDV.WebApiHost.FeatureManagement +{ + [FilterAlias(nameof(ClaimRequirement))] + internal class ClaimRequirementFeatureFilter : IFeatureFilter + { + private readonly IHttpContextAccessor _httpContextAccessor; + + public ClaimRequirementFeatureFilter(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public Task EvaluateAsync(FeatureFilterEvaluationContext context) + { + var user = _httpContextAccessor.HttpContext?.User; + if(user == null) + { + return Task.FromResult(false); + } + + var requirementOptions = new ClaimRequirementOptions(); + context.Parameters.Bind(requirementOptions); + + return Task.FromResult(user.SatisfiesRequirement(requirementOptions.ClaimRequirement)); + } + } +} diff --git a/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj b/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj new file mode 100644 index 0000000..a911b67 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/JGUZDV.WebApiHost.csproj @@ -0,0 +1,38 @@ + + + + net8.0 + Library + + enable + enable + + de + JGUZDV.WebApiHost + + JGUZDV.WebApiHost + true + 1.0.0-beta + Thomas Ottenhus + Zentrum für Datenverarbeitung - JGU Mainz + Host for WebApi Applications based on our other packages + + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + false + + + + + + + + + + + + + + + + diff --git a/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json b/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json new file mode 100644 index 0000000..adad8cb --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "JGUZDV.WebApiHost": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:52061;http://localhost:52062" + } + } +} \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/src/README.md b/libraries/JGUZDV.WebApiHost/src/README.md new file mode 100644 index 0000000..20ff013 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/README.md @@ -0,0 +1,67 @@ +# JGUZDV.Blazor.WasmServerHost + +This package is intended to be used as a helper to configure services and the request +pipeline needed to host a AspNetCore WebAPI application. +It's highly opinionated and will use our other packeges to provide a default configuration. + +## Usage + +**Program.cs** +```csharp +var builder = WebApplicationBuilder.Create(args); +builder.ConfigureWebApiHost(); // You can extend this by using the provided actions + +var app = builder.Build(); + +app.ConfigureWebApiHost(); +app.Run(); +``` + +To use all features, you need to have configuration sections, each referring to a specific feature: + +**appsettings.json** +```json +{ + "Logging": { + ... // see https://nuget.org/jguzdv/JGUZDV.AspNetCore.Logging + }, + + "JGUZDV":{ + "DataProtection": { + ... // see https://nuget.org/jguzdv/JGUZDV.AspNetCore.DataProtection + }, + }, + + "Authentication": { + "JwtBearer": { + "Authority": "https://example.com", + "Audience": "example", + "RequiredScopes": [ "scope1", "scope2" ] + "ScopeType": "ClaimTypeOfScopes" // "scope" if empty + } + }, + + "DistributedCache": { // Omit if not needed + "ConnectionString": "...", + "SchemaName": "...", + "TableName": "..." + }, + + "FeatureManagement": { + "Feature1": true, + "Feature2": false, + "Feature3": { + "EnabledFor": [ + { + "Name": "ClaimRequirement", + "Parameters": { + "ClaimType": "custom-claim", + "ClaimValue": "value + + ... // see https://nuget.org/jguzdv/JGUZDV.Extensions.Authorization + } + } + } + }, +} +``` \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs b/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs new file mode 100644 index 0000000..260bfea --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/src/WebApiHost.cs @@ -0,0 +1,283 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Text.Json.Serialization; + +using JGUZDV.Blazor.WasmServerHost.Extensions; +using JGUZDV.Extensions.Json; +using JGUZDV.WebApiHost.FeatureManagement; + +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Http.Json; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.FeatureManagement; +using Microsoft.IdentityModel.Logging; + +namespace JGUZDV.WebApiHost; + +/// +/// WebApiHost is a helper class to configure a WebApiHost with common services and features. +/// +public static partial class WebApiHost +{ + /// + /// Default Config Sections for WebApiHost + /// + public static class ConfigSections + { +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + public const string Authentication = "Authentication"; + public const string DataProtection = AspNetCore.DataProtection.Constants.DefaultSectionName; + public const string DistributedCache = "DistributedCache"; + public const string FeatureManagement = "FeatureManagement"; + public const string Telemetry = "ApplicationInsights"; +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + } + + /// + /// Configures services of the WebApplicationBuilder: + /// - Adds JGUZDVLogging + /// - Adds ApiExplorer and Swagger + /// - Adds ProblemDetails + /// - Adds MVC controllers and sets default JsonOptions (minimal API as well as MVC) + /// - Adds RequestLocalization ("de", "en" as default) + /// - Adds Distributed Cache + /// - Adds Data Protection + /// - Adds Authentication and Authorization + /// - Adds Feature Management + /// - Adds Telemetry + /// - Adds HealthChecks + /// + public static WebApplicationBuilder ConfigureWebApiHostServices( + this WebApplicationBuilder builder, + Action? authenticationBuilderAction = null, + Action? dataProtectionBuilderAction = null, + Action? featureManagementBuilderAction = null, + Action? mvcBuilderAction = null + ) + { + var services = builder.Services; + var config = builder.Configuration; + var environment = builder.Environment; + + JwtSecurityTokenHandler.DefaultMapInboundClaims = false; + IdentityModelEventSource.ShowPII = builder.Configuration.GetValue("ShowPII", false); + + builder.UseJGUZDVLogging(); + + var sp = services.BuildServiceProvider(); + var loggerFactory = sp.GetService(); + + try + { + var logger = loggerFactory?.CreateLogger(nameof(WebApiHost)) ?? NullLogger.Instance; + + // Enable ApiExplorer + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(); + + // Enable Problem Details + services.AddProblemDetails(); + + // Enable MVC controllers + var mvcBuilder = services.AddControllers(); + mvcBuilderAction?.Invoke(mvcBuilder); + mvcBuilder.AddJsonOptions(opt => + { + opt.JsonSerializerOptions.SetJGUZDVDefaults(); + opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + + // Set json options for minimal API + services.Configure(opt => + { + opt.SerializerOptions.SetJGUZDVDefaults(); + opt.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + + + // Add Localization for DE, EN and RequestLocaltization + services.AddLocalization(); + var locales = config + .GetSection("RequestLocalization:Cultures") + .Get() ?? ["de", "en"]; + + services.AddRequestLocalization(opt => opt + .AddSupportedCultures(locales) + .AddSupportedUICultures(locales) + .SetDefaultCulture(locales[0]) + ); + + + // Add distributed cache + if (environment.IsProduction() && config.HasConfigSection(ConfigSections.DistributedCache)) + { + services.AddDistributedSqlServerCache(opt => config.GetSection(ConfigSections.DistributedCache).Bind(opt)); + } + else + { + services.AddDistributedMemoryCache(); + } + + if (!config.HasConfigSection(ConfigSections.DistributedCache)) + Log.MissingConfig(logger, ConfigSections.DistributedCache); + + + // Add data protection + IDataProtectionBuilder dataProtectionBuilder = + environment.IsProduction() && config.HasConfigSection(ConfigSections.DataProtection) + ? services.AddJGUZDVDataProtection(config, environment) + : services.AddDataProtection(); + + dataProtectionBuilderAction?.Invoke(dataProtectionBuilder); + + if (!config.HasConfigSection(ConfigSections.DataProtection)) + Log.MissingConfig(logger, ConfigSections.DataProtection); + + + // Add authentication and authorization + if (config.HasConfigSection(ConfigSections.Authentication)) + { + var configSection = config.GetSection($"{ConfigSections.Authentication}:JwtBearer"); + + var authBuilder = services + .AddAuthentication(opt => opt.DefaultScheme = JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(opt => + { + var validAudiences = configSection.GetSection("ValidAudiences").Get?>() ?? []; + var validateAudience = validAudiences?.Count > 0; + + opt.TokenValidationParameters.ValidateAudience = validateAudience; + opt.TokenValidationParameters.ValidAudiences = validAudiences; + + config.GetSection(ConfigSections.Authentication).Bind(opt); + + if (opt.TokenValidationParameters.ValidAudiences?.Any() != true) + Log.NoValidAudiences(logger); + }); + + authenticationBuilderAction?.Invoke(authBuilder); + + services.AddAuthorization(opt => + { + var scopes = configSection.GetSection("RequiredScopes").Get?>() ?? []; + if (scopes.Count == 0) + { + Log.NoRequiredScopes(logger); + } + else + { + var scopeClaimType = configSection["ScopeType"] ?? "scope"; + + opt.AddPolicy("ScopedDefault", p => + { + p.RequireAuthenticatedUser(); + p.RequireClaim("scope", scopes); + + }); + opt.DefaultPolicy = opt.GetPolicy("ScopedDefault")!; + } + }); + } + else + { + Log.MissingConfig(logger, ConfigSections.Authentication); + } + + + // Feature Management + if (config.HasConfigSection(ConfigSections.FeatureManagement)) + { + var featureManagementBuilder = services.AddScopedFeatureManagement( + config.GetSection(ConfigSections.FeatureManagement) + ) + .AddFeatureFilter(); + + featureManagementBuilderAction?.Invoke(featureManagementBuilder); + } + else + { + Log.MissingConfig(logger, ConfigSections.FeatureManagement); + } + + + // Telemetry + if (config.HasConfigSection(ConfigSections.Telemetry)) + { + // TODO: Add default calls for Telemetry and Healthchecks + services.AddHealthChecks(); + } + else + { + Log.MissingConfig(logger, ConfigSections.Telemetry); + services.AddHealthChecks(); + } + + return builder; + } + finally + { + loggerFactory?.Dispose(); + } + } + + + /// + /// Configures the web application pipeline: + /// - Adds DeveloperExceptionPage (in Development) + /// - Adds Routing + /// - Adds Authentication and Authorization + /// - Adds RequestLocalization + /// - Adds Controllers + /// - Adds HealthChecks + /// - Adds Swagger + /// - Adds SwaggerUI + /// + /// + /// + public static WebApplication ConfigureWebApiHost(this WebApplication app) + { + var conf = app.Configuration; + var env = app.Environment; + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + + app.UseRouting(); + + app.UseAuthentication(); + app.UseAuthorization(); + + app.UseRequestLocalization(); + + app.MapControllers(); + + app.MapHealthChecks("/health"); + app.MapGet("/docs", ctx => + { + ctx.Response.Redirect("/swagger"); + return Task.CompletedTask; + }); + + app.MapSwagger(); + app.UseSwaggerUI(); + + return app; + } + + + private partial class Log + { + [LoggerMessage(LogLevel.Information, "Could not find config {configSection}. The corresponding feature will not be added to services or pipeline.")] + public static partial void MissingConfig(ILogger logger, string configSection); + + [LoggerMessage(LogLevel.Information, "Could not find config Authentication:JwtBearer:ValidAudiences, audiences will not be considered.")] + public static partial void NoValidAudiences(ILogger logger); + + [LoggerMessage(LogLevel.Warning, "Could not find config Authentication:JwtBearer:RequiredScopes, consider addings required scopes to validate the token is meant for us.")] + public static partial void NoRequiredScopes(ILogger logger); + } +} diff --git a/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs b/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj b/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj new file mode 100644 index 0000000..5d14fd6 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/JGUZDV.WebApiHost.Tests.csproj @@ -0,0 +1,16 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + diff --git a/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs b/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs new file mode 100644 index 0000000..2224469 --- /dev/null +++ b/libraries/JGUZDV.WebApiHost/test/UnitTest1.cs @@ -0,0 +1,6 @@ +namespace JGUZDV.WebApiHost.Tests; + +public class UnitTest1 +{ + // TODO: Testability noch unklar +} \ No newline at end of file