From b75f51b7b4e8e1dce9ee7ef8dc763841da48823d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:00:29 +0000 Subject: [PATCH 1/3] feat: Add Dapr.SecretsManagement projects (Abstractions, Runtime, Generators, Aggregator, Tests, Example) Implements #1510 - Migrates secret management into a purpose-specific client. Projects created: - Dapr.SecretsManagement.Abstractions: SecretStoreAttribute, SecretAttribute - Dapr.SecretsManagement.Runtime: gRPC client, builder, DI extensions - Dapr.SecretsManagement.Generators: Source generator for typed secret stores - Dapr.SecretsManagement: Aggregator meta-project (NoTargets) - Dapr.SecretsManagement.Runtime.Test: Unit tests - examples/SecretManagement: Demo project Agent-Logs-Url: https://github.com/dapr/dotnet-sdk/sessions/db970aa7-6b0c-450f-93f9-878185757985 Co-authored-by: WhitWaldo <2238529+WhitWaldo@users.noreply.github.com> --- .github/workflows/sdk_build.yml | 3 +- all.sln | 986 +++++++++++++++++- examples/SecretManagement/README.md | 36 + .../SecretManagementSample/IMyVaultSecrets.cs | 40 + .../SecretManagementSample/Program.cs | 66 ++ .../Properties/launchSettings.json | 13 + .../SecretManagementSample.csproj | 29 + src/Dapr.Common/AssemblyInfo.cs | 2 + ...Dapr.SecretsManagement.Abstractions.csproj | 8 + .../SecretAttribute.cs | 56 + .../SecretStoreAttribute.cs | 68 ++ .../WellKnownSecrets.cs | 30 + .../Dapr.SecretsManagement.Generators.csproj | 23 + .../KnownSymbols.cs | 23 + .../SecretStoreSourceGenerator.cs | 289 +++++ .../AssemblyInfo.cs | 16 + .../Dapr.SecretsManagement.Runtime.csproj | 21 + .../DaprSecretsManagementClient.cs | 120 +++ .../DaprSecretsManagementClientBuilder.cs | 37 + .../DaprSecretsManagementGrpcClient.cs | 137 +++ .../DaprSecretsManagementBuilder.cs | 28 + ...tsManagementServiceCollectionExtensions.cs | 39 + .../IDaprSecretsManagementBuilder.cs | 22 + .../Dapr.SecretsManagement.csproj | 181 ++++ ...Dapr.SecretsManagement.Runtime.Test.csproj | 29 + ...DaprSecretsManagementClientBuilderTests.cs | 101 ++ .../DaprSecretsManagementGrpcClientTests.cs | 100 ++ ...agementServiceCollectionExtensionsTests.cs | 54 + 28 files changed, 2516 insertions(+), 41 deletions(-) create mode 100644 examples/SecretManagement/README.md create mode 100644 examples/SecretManagement/SecretManagementSample/IMyVaultSecrets.cs create mode 100644 examples/SecretManagement/SecretManagementSample/Program.cs create mode 100644 examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json create mode 100644 examples/SecretManagement/SecretManagementSample/SecretManagementSample.csproj create mode 100644 src/Dapr.SecretsManagement.Abstractions/Dapr.SecretsManagement.Abstractions.csproj create mode 100644 src/Dapr.SecretsManagement.Abstractions/SecretAttribute.cs create mode 100644 src/Dapr.SecretsManagement.Abstractions/SecretStoreAttribute.cs create mode 100644 src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs create mode 100644 src/Dapr.SecretsManagement.Generators/Dapr.SecretsManagement.Generators.csproj create mode 100644 src/Dapr.SecretsManagement.Generators/KnownSymbols.cs create mode 100644 src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/AssemblyInfo.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/Dapr.SecretsManagement.Runtime.csproj create mode 100644 src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClient.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClientBuilder.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementGrpcClient.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementBuilder.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementServiceCollectionExtensions.cs create mode 100644 src/Dapr.SecretsManagement.Runtime/IDaprSecretsManagementBuilder.cs create mode 100644 src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj create mode 100644 test/Dapr.SecretsManagement.Runtime.Test/Dapr.SecretsManagement.Runtime.Test.csproj create mode 100644 test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementClientBuilderTests.cs create mode 100644 test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementGrpcClientTests.cs create mode 100644 test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementServiceCollectionExtensionsTests.cs diff --git a/.github/workflows/sdk_build.yml b/.github/workflows/sdk_build.yml index 7ae053aa1..9da2e1985 100644 --- a/.github/workflows/sdk_build.yml +++ b/.github/workflows/sdk_build.yml @@ -356,7 +356,8 @@ jobs: files=$(ls packages/*.nupkg | jq -R -s -c ' split("\n")[:-1] | map(select( - (test("/Dapr\\.Workflow\\.Versioning\\.(Abstractions|Generators|Runtime)\\.")) | not + ((test("/Dapr\\.Workflow\\.Versioning\\.(Abstractions|Generators|Runtime)\\.")) | not) and + ((test("/Dapr\\.SecretsManagement\\.(Abstractions|Generators|Runtime)\\.")) | not) )) ') echo "matrix=$files" >> $GITHUB_OUTPUT diff --git a/all.sln b/all.sln index 8c15f50b6..17ed3355f 100644 --- a/all.sln +++ b/all.sln @@ -1,4 +1,5 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.3.32929.385 MinimumVisualStudioVersion = 10.0.40219.1 @@ -253,437 +254,1344 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.IntegrationTest.Crypto EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.IntegrationTest.Actors", "test\Dapr.IntegrationTest.Actors\Dapr.IntegrationTest.Actors.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.SecretsManagement.Abstractions", "src\Dapr.SecretsManagement.Abstractions\Dapr.SecretsManagement.Abstractions.csproj", "{366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.SecretsManagement.Runtime", "src\Dapr.SecretsManagement.Runtime\Dapr.SecretsManagement.Runtime.csproj", "{F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.SecretsManagement.Generators", "src\Dapr.SecretsManagement.Generators\Dapr.SecretsManagement.Generators.csproj", "{B42DD6AA-255C-4606-8A1B-263B26650DED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.SecretsManagement", "src\Dapr.SecretsManagement\Dapr.SecretsManagement.csproj", "{1BECAC48-1C83-43D2-A91F-9AFA634A68C7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dapr.SecretsManagement.Runtime.Test", "test\Dapr.SecretsManagement.Runtime.Test\Dapr.SecretsManagement.Runtime.Test.csproj", "{87842296-C78B-42B9-8E96-5054E79CD700}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SecretManagement", "SecretManagement", "{929A8AD2-DB45-B92A-7930-EBDD2DBAF802}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SecretManagementSample", "examples\SecretManagement\SecretManagementSample\SecretManagementSample.csproj", "{ED74B33F-3CE7-42EB-BAA1-623F43900B15}" +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 {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|x64.ActiveCfg = Debug|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|x64.Build.0 = Debug|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|x86.ActiveCfg = Debug|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Debug|x86.Build.0 = Debug|Any CPU {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.ActiveCfg = Release|Any CPU {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|Any CPU.Build.0 = Release|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|x64.ActiveCfg = Release|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|x64.Build.0 = Release|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|x86.ActiveCfg = Release|Any CPU + {C2DB4B64-B7C3-4FED-8753-C040F677C69A}.Release|x86.Build.0 = Release|Any CPU {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|x64.ActiveCfg = Debug|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|x64.Build.0 = Debug|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|x86.ActiveCfg = Debug|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Debug|x86.Build.0 = Debug|Any CPU {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|Any CPU.ActiveCfg = Release|Any CPU {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|Any CPU.Build.0 = Release|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|x64.ActiveCfg = Release|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|x64.Build.0 = Release|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|x86.ActiveCfg = Release|Any CPU + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A}.Release|x86.Build.0 = Release|Any CPU {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|x64.Build.0 = Debug|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Debug|x86.Build.0 = Debug|Any CPU {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|Any CPU.Build.0 = Release|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|x64.ActiveCfg = Release|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|x64.Build.0 = Release|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|x86.ActiveCfg = Release|Any CPU + {B9C12532-0969-4DAC-A2F8-CA9208D7A901}.Release|x86.Build.0 = Release|Any CPU {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|x64.ActiveCfg = Debug|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|x64.Build.0 = Debug|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|x86.ActiveCfg = Debug|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Debug|x86.Build.0 = Debug|Any CPU {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|Any CPU.ActiveCfg = Release|Any CPU {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|Any CPU.Build.0 = Release|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|x64.ActiveCfg = Release|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|x64.Build.0 = Release|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|x86.ActiveCfg = Release|Any CPU + {62E41317-ED5D-4AA4-B129-C9E56C27354C}.Release|x86.Build.0 = Release|Any CPU {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|x64.ActiveCfg = Debug|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|x64.Build.0 = Debug|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|x86.ActiveCfg = Debug|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Debug|x86.Build.0 = Debug|Any CPU {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|Any CPU.Build.0 = Release|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|x64.ActiveCfg = Release|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|x64.Build.0 = Release|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|x86.ActiveCfg = Release|Any CPU + {08D602F6-7C11-4653-B70B-B56333BF6FD2}.Release|x86.Build.0 = Release|Any CPU {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|Any CPU.Build.0 = Debug|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|x64.ActiveCfg = Debug|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|x64.Build.0 = Debug|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|x86.ActiveCfg = Debug|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Debug|x86.Build.0 = Debug|Any CPU {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|Any CPU.ActiveCfg = Release|Any CPU {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|Any CPU.Build.0 = Release|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|x64.ActiveCfg = Release|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|x64.Build.0 = Release|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|x86.ActiveCfg = Release|Any CPU + {383609C1-F43F-49EB-85E4-1964EE7F0F14}.Release|x86.Build.0 = Release|Any CPU {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|x64.ActiveCfg = Debug|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|x64.Build.0 = Debug|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|x86.ActiveCfg = Debug|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Debug|x86.Build.0 = Debug|Any CPU {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|Any CPU.Build.0 = Release|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|x64.ActiveCfg = Release|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|x64.Build.0 = Release|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|x86.ActiveCfg = Release|Any CPU + {B314AD5E-10AC-418A-B021-D4206BF37ACF}.Release|x86.Build.0 = Release|Any CPU {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|x64.Build.0 = Debug|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Debug|x86.Build.0 = Debug|Any CPU {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|Any CPU.Build.0 = Release|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|x64.ActiveCfg = Release|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|x64.Build.0 = Release|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|x86.ActiveCfg = Release|Any CPU + {0CD1912D-5E27-4A2A-A998-164792E0D006}.Release|x86.Build.0 = Release|Any CPU {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|Any CPU.Build.0 = Debug|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|x64.ActiveCfg = Debug|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|x64.Build.0 = Debug|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|x86.ActiveCfg = Debug|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Debug|x86.Build.0 = Debug|Any CPU {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|Any CPU.ActiveCfg = Release|Any CPU {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|Any CPU.Build.0 = Release|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|x64.ActiveCfg = Release|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|x64.Build.0 = Release|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|x86.ActiveCfg = Release|Any CPU + {342783B5-F75B-4752-A3E2-B8CB7D09C080}.Release|x86.Build.0 = Release|Any CPU {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|x64.Build.0 = Debug|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Debug|x86.Build.0 = Debug|Any CPU {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|Any CPU.Build.0 = Release|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|x64.ActiveCfg = Release|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|x64.Build.0 = Release|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|x86.ActiveCfg = Release|Any CPU + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737}.Release|x86.Build.0 = Release|Any CPU {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|x64.ActiveCfg = Debug|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|x64.Build.0 = Debug|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|x86.ActiveCfg = Debug|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Debug|x86.Build.0 = Debug|Any CPU {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|Any CPU.ActiveCfg = Release|Any CPU {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|Any CPU.Build.0 = Release|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|x64.ActiveCfg = Release|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|x64.Build.0 = Release|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|x86.ActiveCfg = Release|Any CPU + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07}.Release|x86.Build.0 = Release|Any CPU {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|x64.ActiveCfg = Debug|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|x64.Build.0 = Debug|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|x86.ActiveCfg = Debug|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Debug|x86.Build.0 = Debug|Any CPU {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|Any CPU.ActiveCfg = Release|Any CPU {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|Any CPU.Build.0 = Release|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|x64.ActiveCfg = Release|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|x64.Build.0 = Release|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|x86.ActiveCfg = Release|Any CPU + {1BA7E772-8AA7-4D5A-800D-66B17F62421C}.Release|x86.Build.0 = Release|Any CPU {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|x64.ActiveCfg = Debug|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|x64.Build.0 = Debug|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|x86.ActiveCfg = Debug|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Debug|x86.Build.0 = Debug|Any CPU {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|Any CPU.ActiveCfg = Release|Any CPU {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|Any CPU.Build.0 = Release|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|x64.ActiveCfg = Release|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|x64.Build.0 = Release|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|x86.ActiveCfg = Release|Any CPU + {78FC19B2-396C-4ED2-BFD9-6C5667C61666}.Release|x86.Build.0 = Release|Any CPU {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|x64.ActiveCfg = Debug|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|x64.Build.0 = Debug|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|x86.ActiveCfg = Debug|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Debug|x86.Build.0 = Debug|Any CPU {B615B353-476C-43B9-A776-B193B0DBD256}.Release|Any CPU.ActiveCfg = Release|Any CPU {B615B353-476C-43B9-A776-B193B0DBD256}.Release|Any CPU.Build.0 = Release|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Release|x64.ActiveCfg = Release|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Release|x64.Build.0 = Release|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Release|x86.ActiveCfg = Release|Any CPU + {B615B353-476C-43B9-A776-B193B0DBD256}.Release|x86.Build.0 = Release|Any CPU {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|x64.ActiveCfg = Debug|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|x64.Build.0 = Debug|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|x86.ActiveCfg = Debug|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Debug|x86.Build.0 = Debug|Any CPU {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|Any CPU.ActiveCfg = Release|Any CPU {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|Any CPU.Build.0 = Release|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|x64.ActiveCfg = Release|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|x64.Build.0 = Release|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|x86.ActiveCfg = Release|Any CPU + {2EC50C79-782D-4985-ABB1-AD07F35D1621}.Release|x86.Build.0 = Release|Any CPU {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|x64.ActiveCfg = Debug|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|x64.Build.0 = Debug|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|x86.ActiveCfg = Debug|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Debug|x86.Build.0 = Debug|Any CPU {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|Any CPU.ActiveCfg = Release|Any CPU {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|Any CPU.Build.0 = Release|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|x64.ActiveCfg = Release|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|x64.Build.0 = Release|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|x86.ActiveCfg = Release|Any CPU + {15A16323-2CCA-472E-BE79-07259DAD5F6F}.Release|x86.Build.0 = Release|Any CPU {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|x64.Build.0 = Debug|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Debug|x86.Build.0 = Debug|Any CPU {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|Any CPU.Build.0 = Release|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|x64.ActiveCfg = Release|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|x64.Build.0 = Release|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|x86.ActiveCfg = Release|Any CPU + {5BACBA51-03FE-4CE1-B0F5-9E9C2A132FAB}.Release|x86.Build.0 = Release|Any CPU {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|x64.ActiveCfg = Debug|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|x64.Build.0 = Debug|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|x86.ActiveCfg = Debug|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Debug|x86.Build.0 = Debug|Any CPU {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|Any CPU.Build.0 = Release|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|x64.ActiveCfg = Release|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|x64.Build.0 = Release|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|x86.ActiveCfg = Release|Any CPU + {3160CC92-1D6E-42CB-AE89-9401C8CEC5CB}.Release|x86.Build.0 = Release|Any CPU {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|x64.ActiveCfg = Debug|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|x64.Build.0 = Debug|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|x86.ActiveCfg = Debug|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Debug|x86.Build.0 = Debug|Any CPU {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|Any CPU.Build.0 = Release|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|x64.ActiveCfg = Release|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|x64.Build.0 = Release|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|x86.ActiveCfg = Release|Any CPU + {7957E852-1291-4FAA-9034-FB66CE817FF1}.Release|x86.Build.0 = Release|Any CPU {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|x64.Build.0 = Debug|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Debug|x86.Build.0 = Debug|Any CPU {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|Any CPU.ActiveCfg = Release|Any CPU {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|Any CPU.Build.0 = Release|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|x64.ActiveCfg = Release|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|x64.Build.0 = Release|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|x86.ActiveCfg = Release|Any CPU + {626D74DD-4F37-4F74-87A3-5A6888684F5E}.Release|x86.Build.0 = Release|Any CPU {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|x64.ActiveCfg = Debug|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|x64.Build.0 = Debug|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|x86.ActiveCfg = Debug|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Debug|x86.Build.0 = Debug|Any CPU {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|Any CPU.ActiveCfg = Release|Any CPU {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|Any CPU.Build.0 = Release|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|x64.ActiveCfg = Release|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|x64.Build.0 = Release|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|x86.ActiveCfg = Release|Any CPU + {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C}.Release|x86.Build.0 = Release|Any CPU {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|x64.ActiveCfg = Debug|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|x64.Build.0 = Debug|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Debug|x86.Build.0 = Debug|Any CPU {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|Any CPU.ActiveCfg = Release|Any CPU {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|Any CPU.Build.0 = Release|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|x64.ActiveCfg = Release|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|x64.Build.0 = Release|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|x86.ActiveCfg = Release|Any CPU + {F70AC78E-8925-4770-832A-2FC67A620EB2}.Release|x86.Build.0 = Release|Any CPU {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|x64.ActiveCfg = Debug|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|x64.Build.0 = Debug|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|x86.ActiveCfg = Debug|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Debug|x86.Build.0 = Debug|Any CPU {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|Any CPU.Build.0 = Release|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|x64.ActiveCfg = Release|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|x64.Build.0 = Release|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|x86.ActiveCfg = Release|Any CPU + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0}.Release|x86.Build.0 = Release|Any CPU {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|x64.ActiveCfg = Debug|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|x64.Build.0 = Debug|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|x86.ActiveCfg = Debug|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Debug|x86.Build.0 = Debug|Any CPU {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|Any CPU.Build.0 = Release|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|x64.ActiveCfg = Release|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|x64.Build.0 = Release|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|x86.ActiveCfg = Release|Any CPU + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2}.Release|x86.Build.0 = Release|Any CPU {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|x64.ActiveCfg = Debug|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|x64.Build.0 = Debug|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|x86.ActiveCfg = Debug|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Debug|x86.Build.0 = Debug|Any CPU {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|Any CPU.ActiveCfg = Release|Any CPU {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|Any CPU.Build.0 = Release|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|x64.ActiveCfg = Release|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|x64.Build.0 = Release|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|x86.ActiveCfg = Release|Any CPU + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C}.Release|x86.Build.0 = Release|Any CPU {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|x64.ActiveCfg = Debug|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|x64.Build.0 = Debug|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Debug|x86.Build.0 = Debug|Any CPU {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|Any CPU.Build.0 = Release|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|x64.ActiveCfg = Release|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|x64.Build.0 = Release|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|x86.ActiveCfg = Release|Any CPU + {E8212911-344B-4638-ADC3-B215BCDCAFD1}.Release|x86.Build.0 = Release|Any CPU {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|x64.ActiveCfg = Debug|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|x64.Build.0 = Debug|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|x86.ActiveCfg = Debug|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Debug|x86.Build.0 = Debug|Any CPU {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|Any CPU.ActiveCfg = Release|Any CPU {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|Any CPU.Build.0 = Release|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|x64.ActiveCfg = Release|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|x64.Build.0 = Release|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|x86.ActiveCfg = Release|Any CPU + {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66}.Release|x86.Build.0 = Release|Any CPU {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|x64.Build.0 = Debug|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Debug|x86.Build.0 = Debug|Any CPU {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|Any CPU.Build.0 = Release|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|x64.ActiveCfg = Release|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|x64.Build.0 = Release|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|x86.ActiveCfg = Release|Any CPU + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7}.Release|x86.Build.0 = Release|Any CPU {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|x64.ActiveCfg = Debug|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|x64.Build.0 = Debug|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|x86.ActiveCfg = Debug|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Debug|x86.Build.0 = Debug|Any CPU {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|Any CPU.ActiveCfg = Release|Any CPU {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|Any CPU.Build.0 = Release|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|x64.ActiveCfg = Release|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|x64.Build.0 = Release|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|x86.ActiveCfg = Release|Any CPU + {35031EDB-C0DE-453A-8335-D2EBEA2FC640}.Release|x86.Build.0 = Release|Any CPU {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|x64.ActiveCfg = Debug|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|x64.Build.0 = Debug|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|x86.ActiveCfg = Debug|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Debug|x86.Build.0 = Debug|Any CPU {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|Any CPU.ActiveCfg = Release|Any CPU {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|Any CPU.Build.0 = Release|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|x64.ActiveCfg = Release|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|x64.Build.0 = Release|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|x86.ActiveCfg = Release|Any CPU + {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99}.Release|x86.Build.0 = Release|Any CPU {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|x64.ActiveCfg = Debug|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|x64.Build.0 = Debug|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|x86.ActiveCfg = Debug|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Debug|x86.Build.0 = Debug|Any CPU {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|Any CPU.ActiveCfg = Release|Any CPU {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|Any CPU.Build.0 = Release|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|x64.ActiveCfg = Release|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|x64.Build.0 = Release|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|x86.ActiveCfg = Release|Any CPU + {5C61ABED-7623-4C28-A5C9-C5972A0F669C}.Release|x86.Build.0 = Release|Any CPU {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|x64.ActiveCfg = Debug|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|x64.Build.0 = Debug|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|x86.ActiveCfg = Debug|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Debug|x86.Build.0 = Debug|Any CPU {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|Any CPU.ActiveCfg = Release|Any CPU {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|Any CPU.Build.0 = Release|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|x64.ActiveCfg = Release|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|x64.Build.0 = Release|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|x86.ActiveCfg = Release|Any CPU + {4A175C27-EAFE-47E7-90F6-873B37863656}.Release|x86.Build.0 = Release|Any CPU {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|x64.ActiveCfg = Debug|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|x64.Build.0 = Debug|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|x86.ActiveCfg = Debug|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Debug|x86.Build.0 = Debug|Any CPU {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|Any CPU.Build.0 = Release|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|x64.ActiveCfg = Release|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|x64.Build.0 = Release|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|x86.ActiveCfg = Release|Any CPU + {DDC41278-FB60-403A-B969-2AEBD7C2D83C}.Release|x86.Build.0 = Release|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|x64.ActiveCfg = Debug|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|x64.Build.0 = Debug|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|x86.ActiveCfg = Debug|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Debug|x86.Build.0 = Debug|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|Any CPU.ActiveCfg = Release|Any CPU {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|Any CPU.Build.0 = Release|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|x64.ActiveCfg = Release|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|x64.Build.0 = Release|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|x86.ActiveCfg = Release|Any CPU + {61C24126-F39D-4BEA-96DC-FC87BA730554}.Release|x86.Build.0 = Release|Any CPU {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|x64.Build.0 = Debug|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Debug|x86.Build.0 = Debug|Any CPU {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|Any CPU.Build.0 = Release|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|x64.ActiveCfg = Release|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|x64.Build.0 = Release|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|x86.ActiveCfg = Release|Any CPU + {CB903D21-4869-42EF-BDD6-5B1CFF674337}.Release|x86.Build.0 = Release|Any CPU {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|Any CPU.Build.0 = Debug|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|x64.ActiveCfg = Debug|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|x64.Build.0 = Debug|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|x86.ActiveCfg = Debug|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Debug|x86.Build.0 = Debug|Any CPU {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|Any CPU.ActiveCfg = Release|Any CPU {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|Any CPU.Build.0 = Release|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|x64.ActiveCfg = Release|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|x64.Build.0 = Release|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|x86.ActiveCfg = Release|Any CPU + {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625}.Release|x86.Build.0 = Release|Any CPU {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|x64.Build.0 = Debug|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Debug|x86.Build.0 = Debug|Any CPU {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|Any CPU.Build.0 = Release|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|x64.ActiveCfg = Release|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|x64.Build.0 = Release|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|x86.ActiveCfg = Release|Any CPU + {7C06FE2D-6C62-48F5-A505-F0D715C554DE}.Release|x86.Build.0 = Release|Any CPU {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|x64.Build.0 = Debug|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Debug|x86.Build.0 = Debug|Any CPU {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|Any CPU.Build.0 = Release|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|x64.ActiveCfg = Release|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|x64.Build.0 = Release|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|x86.ActiveCfg = Release|Any CPU + {AF89083D-4715-42E6-93E9-38497D12A8A6}.Release|x86.Build.0 = Release|Any CPU {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|x64.ActiveCfg = Debug|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|x64.Build.0 = Debug|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|x86.ActiveCfg = Debug|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Debug|x86.Build.0 = Debug|Any CPU {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|Any CPU.Build.0 = Release|Any CPU - {C74FBA78-13E8-407F-A173-4555AEE41FF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C74FBA78-13E8-407F-A173-4555AEE41FF3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C74FBA78-13E8-407F-A173-4555AEE41FF3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C74FBA78-13E8-407F-A173-4555AEE41FF3}.Release|Any CPU.Build.0 = Release|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|x64.ActiveCfg = Release|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|x64.Build.0 = Release|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|x86.ActiveCfg = Release|Any CPU + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940}.Release|x86.Build.0 = Release|Any CPU {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|x64.ActiveCfg = Debug|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|x64.Build.0 = Debug|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|x86.ActiveCfg = Debug|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Debug|x86.Build.0 = Debug|Any CPU {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|Any CPU.Build.0 = Release|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|x64.ActiveCfg = Release|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|x64.Build.0 = Release|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|x86.ActiveCfg = Release|Any CPU + {DFBABB04-50E9-42F6-B470-310E1B545638}.Release|x86.Build.0 = Release|Any CPU {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|x64.ActiveCfg = Debug|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|x64.Build.0 = Debug|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|x86.ActiveCfg = Debug|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Debug|x86.Build.0 = Debug|Any CPU {B445B19C-A925-4873-8CB7-8317898B6970}.Release|Any CPU.ActiveCfg = Release|Any CPU {B445B19C-A925-4873-8CB7-8317898B6970}.Release|Any CPU.Build.0 = Release|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Release|x64.ActiveCfg = Release|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Release|x64.Build.0 = Release|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Release|x86.ActiveCfg = Release|Any CPU + {B445B19C-A925-4873-8CB7-8317898B6970}.Release|x86.Build.0 = Release|Any CPU {CDB47863-BEBD-4841-A807-46D868962521}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CDB47863-BEBD-4841-A807-46D868962521}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Debug|x64.ActiveCfg = Debug|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Debug|x64.Build.0 = Debug|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Debug|x86.ActiveCfg = Debug|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Debug|x86.Build.0 = Debug|Any CPU {CDB47863-BEBD-4841-A807-46D868962521}.Release|Any CPU.ActiveCfg = Release|Any CPU {CDB47863-BEBD-4841-A807-46D868962521}.Release|Any CPU.Build.0 = Release|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Release|x64.ActiveCfg = Release|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Release|x64.Build.0 = Release|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Release|x86.ActiveCfg = Release|Any CPU + {CDB47863-BEBD-4841-A807-46D868962521}.Release|x86.Build.0 = Release|Any CPU {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|x64.ActiveCfg = Debug|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|x64.Build.0 = Debug|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|x86.ActiveCfg = Debug|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Debug|x86.Build.0 = Debug|Any CPU {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|Any CPU.Build.0 = Release|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|x64.ActiveCfg = Release|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|x64.Build.0 = Release|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|x86.ActiveCfg = Release|Any CPU + {273F2527-1658-4CCF-8DC6-600E921188C5}.Release|x86.Build.0 = Release|Any CPU {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|x64.Build.0 = Debug|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Debug|x86.Build.0 = Debug|Any CPU {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|Any CPU.Build.0 = Release|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|x64.ActiveCfg = Release|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|x64.Build.0 = Release|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|x86.ActiveCfg = Release|Any CPU + {2F3700EF-1CDA-4C15-AC88-360230000ECD}.Release|x86.Build.0 = Release|Any CPU {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|x64.ActiveCfg = Debug|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|x64.Build.0 = Debug|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|x86.ActiveCfg = Debug|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Debug|x86.Build.0 = Debug|Any CPU {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|Any CPU.ActiveCfg = Release|Any CPU {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|Any CPU.Build.0 = Release|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|x64.ActiveCfg = Release|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|x64.Build.0 = Release|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|x86.ActiveCfg = Release|Any CPU + {11011FF8-77EA-4B25-96C0-29D4D486EF1C}.Release|x86.Build.0 = Release|Any CPU {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|x64.ActiveCfg = Debug|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|x64.Build.0 = Debug|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|x86.ActiveCfg = Debug|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Debug|x86.Build.0 = Debug|Any CPU {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|Any CPU.ActiveCfg = Release|Any CPU {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|Any CPU.Build.0 = Release|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|x64.ActiveCfg = Release|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|x64.Build.0 = Release|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|x86.ActiveCfg = Release|Any CPU + {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F}.Release|x86.Build.0 = Release|Any CPU {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|x64.Build.0 = Debug|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Debug|x86.Build.0 = Debug|Any CPU {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|Any CPU.Build.0 = Release|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|x64.ActiveCfg = Release|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|x64.Build.0 = Release|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|x86.ActiveCfg = Release|Any CPU + {7F73A3D8-FFC2-4E31-AA3D-A4840316A8C6}.Release|x86.Build.0 = Release|Any CPU {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|x64.Build.0 = Debug|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Debug|x86.Build.0 = Debug|Any CPU {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|Any CPU.Build.0 = Release|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|x64.ActiveCfg = Release|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|x64.Build.0 = Release|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|x86.ActiveCfg = Release|Any CPU + {945DD3B7-94E5-435E-B3CB-796C20A652C7}.Release|x86.Build.0 = Release|Any CPU {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|x64.ActiveCfg = Debug|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|x64.Build.0 = Debug|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|x86.ActiveCfg = Debug|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Debug|x86.Build.0 = Debug|Any CPU {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|Any CPU.Build.0 = Release|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|x64.ActiveCfg = Release|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|x64.Build.0 = Release|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|x86.ActiveCfg = Release|Any CPU + {FD3E9371-3134-4235-8E80-32226DFB4B1F}.Release|x86.Build.0 = Release|Any CPU {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|x64.ActiveCfg = Debug|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|x64.Build.0 = Debug|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|x86.ActiveCfg = Debug|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Debug|x86.Build.0 = Debug|Any CPU {D83B27F3-4401-42F5-843E-147566B4999A}.Release|Any CPU.ActiveCfg = Release|Any CPU {D83B27F3-4401-42F5-843E-147566B4999A}.Release|Any CPU.Build.0 = Release|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Release|x64.ActiveCfg = Release|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Release|x64.Build.0 = Release|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Release|x86.ActiveCfg = Release|Any CPU + {D83B27F3-4401-42F5-843E-147566B4999A}.Release|x86.Build.0 = Release|Any CPU {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|x64.ActiveCfg = Debug|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|x64.Build.0 = Debug|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|x86.ActiveCfg = Debug|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Debug|x86.Build.0 = Debug|Any CPU {00359961-0C50-4BB1-A794-8B06DE991639}.Release|Any CPU.ActiveCfg = Release|Any CPU {00359961-0C50-4BB1-A794-8B06DE991639}.Release|Any CPU.Build.0 = Release|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Release|x64.ActiveCfg = Release|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Release|x64.Build.0 = Release|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Release|x86.ActiveCfg = Release|Any CPU + {00359961-0C50-4BB1-A794-8B06DE991639}.Release|x86.Build.0 = Release|Any CPU {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|x64.Build.0 = Debug|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Debug|x86.Build.0 = Debug|Any CPU {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|Any CPU.Build.0 = Release|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|x64.ActiveCfg = Release|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|x64.Build.0 = Release|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|x86.ActiveCfg = Release|Any CPU + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9}.Release|x86.Build.0 = Release|Any CPU {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|x64.ActiveCfg = Debug|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|x64.Build.0 = Debug|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|x86.ActiveCfg = Debug|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Debug|x86.Build.0 = Debug|Any CPU {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|Any CPU.ActiveCfg = Release|Any CPU {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|Any CPU.Build.0 = Release|Any CPU - {290D1278-F613-4DF3-9DF5-F37E38CDC363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {290D1278-F613-4DF3-9DF5-F37E38CDC363}.Debug|Any CPU.Build.0 = Debug|Any CPU - {290D1278-F613-4DF3-9DF5-F37E38CDC363}.Release|Any CPU.ActiveCfg = Release|Any CPU - {290D1278-F613-4DF3-9DF5-F37E38CDC363}.Release|Any CPU.Build.0 = Release|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|x64.ActiveCfg = Release|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|x64.Build.0 = Release|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|x86.ActiveCfg = Release|Any CPU + {0EAE36A1-B578-4F13-A113-7A477ECA1BDA}.Release|x86.Build.0 = Release|Any CPU {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|x64.ActiveCfg = Debug|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|x64.Build.0 = Debug|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|x86.ActiveCfg = Debug|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Debug|x86.Build.0 = Debug|Any CPU {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|Any CPU.Build.0 = Release|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|x64.ActiveCfg = Release|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|x64.Build.0 = Release|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|x86.ActiveCfg = Release|Any CPU + {C8BB6A85-A7EA-40C0-893D-F36F317829B3}.Release|x86.Build.0 = Release|Any CPU {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|x64.Build.0 = Debug|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Debug|x86.Build.0 = Debug|Any CPU {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|Any CPU.Build.0 = Release|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|x64.ActiveCfg = Release|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|x64.Build.0 = Release|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|x86.ActiveCfg = Release|Any CPU + {BF9828E9-5597-4D42-AA6E-6E6C12214204}.Release|x86.Build.0 = Release|Any CPU {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|x64.ActiveCfg = Debug|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|x64.Build.0 = Debug|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|x86.ActiveCfg = Debug|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Debug|x86.Build.0 = Debug|Any CPU {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|Any CPU.ActiveCfg = Release|Any CPU {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|Any CPU.Build.0 = Release|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|x64.ActiveCfg = Release|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|x64.Build.0 = Release|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|x86.ActiveCfg = Release|Any CPU + {9CAF360E-5AD3-4C4F-89A0-327EEB70D673}.Release|x86.Build.0 = Release|Any CPU {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|x64.ActiveCfg = Debug|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|x64.Build.0 = Debug|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|x86.ActiveCfg = Debug|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Debug|x86.Build.0 = Debug|Any CPU {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|Any CPU.Build.0 = Release|Any CPU - {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|x64.ActiveCfg = Release|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|x64.Build.0 = Release|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|x86.ActiveCfg = Release|Any CPU + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4}.Release|x86.Build.0 = Release|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|x64.ActiveCfg = Debug|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|x64.Build.0 = Debug|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|x86.ActiveCfg = Debug|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Debug|x86.Build.0 = Debug|Any CPU {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|Any CPU.ActiveCfg = Release|Any CPU {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|Any CPU.Build.0 = Release|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|x64.ActiveCfg = Release|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|x64.Build.0 = Release|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|x86.ActiveCfg = Release|Any CPU + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C}.Release|x86.Build.0 = Release|Any CPU {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|x64.Build.0 = Debug|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Debug|x86.Build.0 = Debug|Any CPU {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|Any CPU.Build.0 = Release|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|x64.ActiveCfg = Release|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|x64.Build.0 = Release|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|x86.ActiveCfg = Release|Any CPU + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539}.Release|x86.Build.0 = Release|Any CPU {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|x64.Build.0 = Debug|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Debug|x86.Build.0 = Debug|Any CPU {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|Any CPU.Build.0 = Release|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|x64.ActiveCfg = Release|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|x64.Build.0 = Release|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|x86.ActiveCfg = Release|Any CPU + {28B87C37-4B52-400F-B84D-64F134931BDC}.Release|x86.Build.0 = Release|Any CPU {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|x64.ActiveCfg = Debug|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|x64.Build.0 = Debug|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|x86.ActiveCfg = Debug|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Debug|x86.Build.0 = Debug|Any CPU {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|Any CPU.ActiveCfg = Release|Any CPU {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|Any CPU.Build.0 = Release|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|x64.ActiveCfg = Release|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|x64.Build.0 = Release|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|x86.ActiveCfg = Release|Any CPU + {CADEAE45-8981-4723-B641-9C28251C7D3B}.Release|x86.Build.0 = Release|Any CPU {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|x64.ActiveCfg = Debug|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|x64.Build.0 = Debug|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|x86.ActiveCfg = Debug|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Debug|x86.Build.0 = Debug|Any CPU {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|Any CPU.Build.0 = Release|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|x64.ActiveCfg = Release|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|x64.Build.0 = Release|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|x86.ActiveCfg = Release|Any CPU + {E49C822C-E921-48DF-897B-3E603CA596D2}.Release|x86.Build.0 = Release|Any CPU {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|x64.Build.0 = Debug|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Debug|x86.Build.0 = Debug|Any CPU {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|Any CPU.Build.0 = Release|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|x64.ActiveCfg = Release|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|x64.Build.0 = Release|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|x86.ActiveCfg = Release|Any CPU + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE}.Release|x86.Build.0 = Release|Any CPU {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|x64.Build.0 = Debug|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Debug|x86.Build.0 = Debug|Any CPU {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|Any CPU.Build.0 = Release|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|x64.ActiveCfg = Release|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|x64.Build.0 = Release|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|x86.ActiveCfg = Release|Any CPU + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A}.Release|x86.Build.0 = Release|Any CPU {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|Any CPU.Build.0 = Debug|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|x64.ActiveCfg = Debug|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|x64.Build.0 = Debug|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|x86.ActiveCfg = Debug|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Debug|x86.Build.0 = Debug|Any CPU {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|Any CPU.ActiveCfg = Release|Any CPU {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|Any CPU.Build.0 = Release|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|x64.ActiveCfg = Release|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|x64.Build.0 = Release|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|x86.ActiveCfg = Release|Any CPU + {160EFFA0-F6B9-49E4-B62B-68C0D53DB425}.Release|x86.Build.0 = Release|Any CPU {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|x64.Build.0 = Debug|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Debug|x86.Build.0 = Debug|Any CPU {B508EBD6-0F14-480C-A446-45A09052733B}.Release|Any CPU.ActiveCfg = Release|Any CPU {B508EBD6-0F14-480C-A446-45A09052733B}.Release|Any CPU.Build.0 = Release|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Release|x64.ActiveCfg = Release|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Release|x64.Build.0 = Release|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Release|x86.ActiveCfg = Release|Any CPU + {B508EBD6-0F14-480C-A446-45A09052733B}.Release|x86.Build.0 = Release|Any CPU {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|x64.Build.0 = Debug|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Debug|x86.Build.0 = Debug|Any CPU {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|Any CPU.ActiveCfg = Release|Any CPU {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|Any CPU.Build.0 = Release|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|x64.ActiveCfg = Release|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|x64.Build.0 = Release|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|x86.ActiveCfg = Release|Any CPU + {E070F694-335D-4D96-8951-F41D0A5F2A8B}.Release|x86.Build.0 = Release|Any CPU {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|Any CPU.Build.0 = Debug|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|x64.ActiveCfg = Debug|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|x64.Build.0 = Debug|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|x86.ActiveCfg = Debug|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Debug|x86.Build.0 = Debug|Any CPU {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|Any CPU.ActiveCfg = Release|Any CPU {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|Any CPU.Build.0 = Release|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|x64.ActiveCfg = Release|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|x64.Build.0 = Release|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|x86.ActiveCfg = Release|Any CPU + {097D5F6F-D26F-4BFB-9074-FA52577EB442}.Release|x86.Build.0 = Release|Any CPU {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|x64.ActiveCfg = Debug|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|x64.Build.0 = Debug|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|x86.ActiveCfg = Debug|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Debug|x86.Build.0 = Debug|Any CPU {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|Any CPU.ActiveCfg = Release|Any CPU {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|Any CPU.Build.0 = Release|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|x64.ActiveCfg = Release|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|x64.Build.0 = Release|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|x86.ActiveCfg = Release|Any CPU + {5764B1AA-66B8-43AE-9E0D-0B3B71714B92}.Release|x86.Build.0 = Release|Any CPU {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|x64.ActiveCfg = Debug|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|x64.Build.0 = Debug|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|x86.ActiveCfg = Debug|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Debug|x86.Build.0 = Debug|Any CPU {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|Any CPU.ActiveCfg = Release|Any CPU {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|Any CPU.Build.0 = Release|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|x64.ActiveCfg = Release|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|x64.Build.0 = Release|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|x86.ActiveCfg = Release|Any CPU + {3553BE3C-C188-460A-AC4C-D3D82DC0922A}.Release|x86.Build.0 = Release|Any CPU {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|x64.ActiveCfg = Debug|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|x64.Build.0 = Debug|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|x86.ActiveCfg = Debug|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Debug|x86.Build.0 = Debug|Any CPU {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|Any CPU.Build.0 = Release|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|x64.ActiveCfg = Release|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|x64.Build.0 = Release|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|x86.ActiveCfg = Release|Any CPU + {A6AA3F39-AB3E-4475-B3E2-D53549CBDA49}.Release|x86.Build.0 = Release|Any CPU {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|x64.ActiveCfg = Debug|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|x64.Build.0 = Debug|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|x86.ActiveCfg = Debug|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Debug|x86.Build.0 = Debug|Any CPU {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|Any CPU.ActiveCfg = Release|Any CPU {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|Any CPU.Build.0 = Release|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|x64.ActiveCfg = Release|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|x64.Build.0 = Release|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|x86.ActiveCfg = Release|Any CPU + {97A47B0B-9D3B-4CF0-A62C-650F2F211A59}.Release|x86.Build.0 = Release|Any CPU {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|x64.Build.0 = Debug|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Debug|x86.Build.0 = Debug|Any CPU {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|Any CPU.Build.0 = Release|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|x64.ActiveCfg = Release|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|x64.Build.0 = Release|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|x86.ActiveCfg = Release|Any CPU + {5BB15C36-BAF7-44F6-BF85-C533B8B47862}.Release|x86.Build.0 = Release|Any CPU {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|x64.ActiveCfg = Debug|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|x64.Build.0 = Debug|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|x86.ActiveCfg = Debug|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Debug|x86.Build.0 = Debug|Any CPU {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|Any CPU.Build.0 = Release|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|x64.ActiveCfg = Release|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|x64.Build.0 = Release|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|x86.ActiveCfg = Release|Any CPU + {6CD90C22-0F79-4D61-8DCE-5BE22C1304C4}.Release|x86.Build.0 = Release|Any CPU {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|x64.Build.0 = Debug|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Debug|x86.Build.0 = Debug|Any CPU {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|Any CPU.ActiveCfg = Release|Any CPU {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|Any CPU.Build.0 = Release|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|x64.ActiveCfg = Release|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|x64.Build.0 = Release|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|x86.ActiveCfg = Release|Any CPU + {AE9804A8-906C-4C3B-B2A8-41F4D3269C19}.Release|x86.Build.0 = Release|Any CPU {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|x64.Build.0 = Debug|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Debug|x86.Build.0 = Debug|Any CPU {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|Any CPU.Build.0 = Release|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|x64.ActiveCfg = Release|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|x64.Build.0 = Release|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|x86.ActiveCfg = Release|Any CPU + {CA680984-0D3A-40E5-88FD-E2A125C6A126}.Release|x86.Build.0 = Release|Any CPU {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|x64.ActiveCfg = Debug|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|x64.Build.0 = Debug|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|x86.ActiveCfg = Debug|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Debug|x86.Build.0 = Debug|Any CPU {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|Any CPU.ActiveCfg = Release|Any CPU {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|Any CPU.Build.0 = Release|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|x64.ActiveCfg = Release|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|x64.Build.0 = Release|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|x86.ActiveCfg = Release|Any CPU + {EDEEEAED-1856-4408-BAA6-A83E1B497B2A}.Release|x86.Build.0 = Release|Any CPU {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|x64.ActiveCfg = Debug|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|x64.Build.0 = Debug|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|x86.ActiveCfg = Debug|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Debug|x86.Build.0 = Debug|Any CPU {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|Any CPU.ActiveCfg = Release|Any CPU {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|Any CPU.Build.0 = Release|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|x64.ActiveCfg = Release|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|x64.Build.0 = Release|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|x86.ActiveCfg = Release|Any CPU + {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE}.Release|x86.Build.0 = Release|Any CPU {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|x64.ActiveCfg = Debug|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|x64.Build.0 = Debug|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|x86.ActiveCfg = Debug|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Debug|x86.Build.0 = Debug|Any CPU {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|Any CPU.ActiveCfg = Release|Any CPU {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|Any CPU.Build.0 = Release|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|x64.ActiveCfg = Release|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|x64.Build.0 = Release|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|x86.ActiveCfg = Release|Any CPU + {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93}.Release|x86.Build.0 = Release|Any CPU {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|x64.Build.0 = Debug|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Debug|x86.Build.0 = Debug|Any CPU {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|Any CPU.Build.0 = Release|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|x64.ActiveCfg = Release|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|x64.Build.0 = Release|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|x86.ActiveCfg = Release|Any CPU + {FB21FAC7-09F7-4F68-910C-224EE7150B35}.Release|x86.Build.0 = Release|Any CPU {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|x64.Build.0 = Debug|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Debug|x86.Build.0 = Debug|Any CPU {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|Any CPU.ActiveCfg = Release|Any CPU {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|Any CPU.Build.0 = Release|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|x64.ActiveCfg = Release|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|x64.Build.0 = Release|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|x86.ActiveCfg = Release|Any CPU + {667E2F91-3004-4409-B6B8-9216EAFC44CF}.Release|x86.Build.0 = Release|Any CPU {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|x64.ActiveCfg = Debug|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|x64.Build.0 = Debug|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Debug|x86.Build.0 = Debug|Any CPU {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|Any CPU.ActiveCfg = Release|Any CPU {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|Any CPU.Build.0 = Release|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|x64.ActiveCfg = Release|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|x64.Build.0 = Release|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|x86.ActiveCfg = Release|Any CPU + {77176EC6-C586-47B1-BB72-533327F9E7BE}.Release|x86.Build.0 = Release|Any CPU {030CB614-6148-4863-A39A-1251728DE51D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {030CB614-6148-4863-A39A-1251728DE51D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Debug|x64.ActiveCfg = Debug|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Debug|x64.Build.0 = Debug|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Debug|x86.ActiveCfg = Debug|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Debug|x86.Build.0 = Debug|Any CPU {030CB614-6148-4863-A39A-1251728DE51D}.Release|Any CPU.ActiveCfg = Release|Any CPU {030CB614-6148-4863-A39A-1251728DE51D}.Release|Any CPU.Build.0 = Release|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Release|x64.ActiveCfg = Release|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Release|x64.Build.0 = Release|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Release|x86.ActiveCfg = Release|Any CPU + {030CB614-6148-4863-A39A-1251728DE51D}.Release|x86.Build.0 = Release|Any CPU {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|x64.ActiveCfg = Debug|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|x64.Build.0 = Debug|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|x86.ActiveCfg = Debug|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Debug|x86.Build.0 = Debug|Any CPU {5AECC3FC-7374-4534-A305-397E3290E573}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AECC3FC-7374-4534-A305-397E3290E573}.Release|Any CPU.Build.0 = Release|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Release|x64.ActiveCfg = Release|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Release|x64.Build.0 = Release|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Release|x86.ActiveCfg = Release|Any CPU + {5AECC3FC-7374-4534-A305-397E3290E573}.Release|x86.Build.0 = Release|Any CPU {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|x64.Build.0 = Debug|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Debug|x86.Build.0 = Debug|Any CPU {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|Any CPU.Build.0 = Release|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|x64.ActiveCfg = Release|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|x64.Build.0 = Release|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|x86.ActiveCfg = Release|Any CPU + {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF}.Release|x86.Build.0 = Release|Any CPU {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|x64.ActiveCfg = Debug|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|x64.Build.0 = Debug|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|x86.ActiveCfg = Debug|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Debug|x86.Build.0 = Debug|Any CPU {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|Any CPU.ActiveCfg = Release|Any CPU {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|Any CPU.Build.0 = Release|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|x64.ActiveCfg = Release|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|x64.Build.0 = Release|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|x86.ActiveCfg = Release|Any CPU + {A05D1519-6A82-498F-B7C9-3D14E08D35CA}.Release|x86.Build.0 = Release|Any CPU {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|x64.Build.0 = Debug|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Debug|x86.Build.0 = Debug|Any CPU {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|Any CPU.Build.0 = Release|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|x64.ActiveCfg = Release|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|x64.Build.0 = Release|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|x86.ActiveCfg = Release|Any CPU + {5A93F96B-4D0E-479D-B540-29678A0998FA}.Release|x86.Build.0 = Release|Any CPU {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|x64.ActiveCfg = Debug|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|x64.Build.0 = Debug|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|x86.ActiveCfg = Debug|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Debug|x86.Build.0 = Debug|Any CPU {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|Any CPU.ActiveCfg = Release|Any CPU {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|Any CPU.Build.0 = Release|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|x64.ActiveCfg = Release|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|x64.Build.0 = Release|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|x86.ActiveCfg = Release|Any CPU + {E958E875-8DDE-4B25-BE3A-C0760EC89376}.Release|x86.Build.0 = Release|Any CPU {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|x64.ActiveCfg = Debug|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|x64.Build.0 = Debug|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|x86.ActiveCfg = Debug|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Debug|x86.Build.0 = Debug|Any CPU {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|Any CPU.ActiveCfg = Release|Any CPU {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|Any CPU.Build.0 = Release|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|x64.ActiveCfg = Release|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|x64.Build.0 = Release|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|x86.ActiveCfg = Release|Any CPU + {38AAD849-B59C-4011-B309-3E9F291E9B9F}.Release|x86.Build.0 = Release|Any CPU {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|x64.Build.0 = Debug|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Debug|x86.Build.0 = Debug|Any CPU {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|Any CPU.Build.0 = Release|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|x64.ActiveCfg = Release|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|x64.Build.0 = Release|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|x86.ActiveCfg = Release|Any CPU + {2D6EB9E0-C5BF-4BA4-B69F-0D2B5A0E36D5}.Release|x86.Build.0 = Release|Any CPU {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|x64.Build.0 = Debug|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Debug|x86.Build.0 = Debug|Any CPU {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|Any CPU.Build.0 = Release|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|x64.ActiveCfg = Release|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|x64.Build.0 = Release|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|x86.ActiveCfg = Release|Any CPU + {AD9F25C7-7BBD-459A-B3EF-1BE75C25E80A}.Release|x86.Build.0 = Release|Any CPU {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|x64.Build.0 = Debug|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Debug|x86.Build.0 = Debug|Any CPU {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|Any CPU.Build.0 = Release|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|x64.ActiveCfg = Release|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|x64.Build.0 = Release|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|x86.ActiveCfg = Release|Any CPU + {FB92C5BC-BEAB-465F-8976-CF2866A2D699}.Release|x86.Build.0 = Release|Any CPU {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|x64.ActiveCfg = Debug|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|x64.Build.0 = Debug|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|x86.ActiveCfg = Debug|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Debug|x86.Build.0 = Debug|Any CPU {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|Any CPU.Build.0 = Release|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|x64.ActiveCfg = Release|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|x64.Build.0 = Release|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|x86.ActiveCfg = Release|Any CPU + {B46E7964-03F5-450E-BF16-C3518EBF36CB}.Release|x86.Build.0 = Release|Any CPU {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|x64.Build.0 = Debug|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Debug|x86.Build.0 = Debug|Any CPU {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|Any CPU.Build.0 = Release|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|x64.ActiveCfg = Release|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|x64.Build.0 = Release|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|x86.ActiveCfg = Release|Any CPU + {BD1FA767-AC6D-429D-8BC0-3C0B52AA11FF}.Release|x86.Build.0 = Release|Any CPU {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|x64.Build.0 = Debug|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Debug|x86.Build.0 = Debug|Any CPU {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|Any CPU.Build.0 = Release|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|x64.ActiveCfg = Release|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|x64.Build.0 = Release|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|x86.ActiveCfg = Release|Any CPU + {CB619F1E-B90C-4BCB-9DDA-A5A4F5967661}.Release|x86.Build.0 = Release|Any CPU {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|x64.ActiveCfg = Debug|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|x64.Build.0 = Debug|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|x86.ActiveCfg = Debug|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Debug|x86.Build.0 = Debug|Any CPU {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|Any CPU.ActiveCfg = Release|Any CPU {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|Any CPU.Build.0 = Release|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|x64.ActiveCfg = Release|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|x64.Build.0 = Release|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|x86.ActiveCfg = Release|Any CPU + {1AD32297-630E-4DFB-B3E4-CAFCE993F27F}.Release|x86.Build.0 = Release|Any CPU {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|x64.ActiveCfg = Debug|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|x64.Build.0 = Debug|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|x86.ActiveCfg = Debug|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Debug|x86.Build.0 = Debug|Any CPU {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|Any CPU.ActiveCfg = Release|Any CPU {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|Any CPU.Build.0 = Release|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|x64.ActiveCfg = Release|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|x64.Build.0 = Release|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|x86.ActiveCfg = Release|Any CPU + {4FF7F075-2818-41E4-A88F-743417EA0A99}.Release|x86.Build.0 = Release|Any CPU {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|x64.ActiveCfg = Debug|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|x64.Build.0 = Debug|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Debug|x86.Build.0 = Debug|Any CPU {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|Any CPU.ActiveCfg = Release|Any CPU {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|Any CPU.Build.0 = Release|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|x64.ActiveCfg = Release|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|x64.Build.0 = Release|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|x86.ActiveCfg = Release|Any CPU + {837E02A5-D1C0-4F60-AF93-71117BF3B6DC}.Release|x86.Build.0 = Release|Any CPU {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|x64.ActiveCfg = Debug|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|x64.Build.0 = Debug|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|x86.ActiveCfg = Debug|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Debug|x86.Build.0 = Debug|Any CPU {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|Any CPU.ActiveCfg = Release|Any CPU {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|Any CPU.Build.0 = Release|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|x64.ActiveCfg = Release|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|x64.Build.0 = Release|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|x86.ActiveCfg = Release|Any CPU + {97CAEE0B-4020-4A86-97DA-9900FDF4DFC6}.Release|x86.Build.0 = Release|Any CPU {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|x64.ActiveCfg = Debug|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|x64.Build.0 = Debug|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|x86.ActiveCfg = Debug|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Debug|x86.Build.0 = Debug|Any CPU {01A20A89-53A1-4D5B-B563-89E157718474}.Release|Any CPU.ActiveCfg = Release|Any CPU {01A20A89-53A1-4D5B-B563-89E157718474}.Release|Any CPU.Build.0 = Release|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Release|x64.ActiveCfg = Release|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Release|x64.Build.0 = Release|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Release|x86.ActiveCfg = Release|Any CPU + {01A20A89-53A1-4D5B-B563-89E157718474}.Release|x86.Build.0 = Release|Any CPU {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|x64.Build.0 = Debug|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Debug|x86.Build.0 = Debug|Any CPU {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|Any CPU.ActiveCfg = Release|Any CPU {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|Any CPU.Build.0 = Release|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|x64.ActiveCfg = Release|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|x64.Build.0 = Release|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|x86.ActiveCfg = Release|Any CPU + {7B14879F-156B-417E-ACA3-0B5A69CC2F39}.Release|x86.Build.0 = Release|Any CPU {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x64.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|x86.Build.0 = Debug|Any CPU {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|Any CPU.Build.0 = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x64.Build.0 = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|x86.Build.0 = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|x64.ActiveCfg = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|x64.Build.0 = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|x86.ActiveCfg = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Debug|x86.Build.0 = Debug|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|Any CPU.Build.0 = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|x64.ActiveCfg = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|x64.Build.0 = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|x86.ActiveCfg = Release|Any CPU + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E}.Release|x86.Build.0 = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|x64.ActiveCfg = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|x64.Build.0 = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Debug|x86.Build.0 = Debug|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|Any CPU.Build.0 = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|x64.ActiveCfg = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|x64.Build.0 = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|x86.ActiveCfg = Release|Any CPU + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2}.Release|x86.Build.0 = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|x64.ActiveCfg = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|x64.Build.0 = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|x86.ActiveCfg = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Debug|x86.Build.0 = Debug|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|Any CPU.Build.0 = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|x64.ActiveCfg = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|x64.Build.0 = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|x86.ActiveCfg = Release|Any CPU + {B42DD6AA-255C-4606-8A1B-263B26650DED}.Release|x86.Build.0 = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|x64.Build.0 = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Debug|x86.Build.0 = Debug|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|Any CPU.Build.0 = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|x64.ActiveCfg = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|x64.Build.0 = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|x86.ActiveCfg = Release|Any CPU + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7}.Release|x86.Build.0 = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|x64.ActiveCfg = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|x64.Build.0 = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|x86.ActiveCfg = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Debug|x86.Build.0 = Debug|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|Any CPU.Build.0 = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|x64.ActiveCfg = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|x64.Build.0 = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|x86.ActiveCfg = Release|Any CPU + {87842296-C78B-42B9-8E96-5054E79CD700}.Release|x86.Build.0 = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|x64.ActiveCfg = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|x64.Build.0 = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|x86.ActiveCfg = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Debug|x86.Build.0 = Debug|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|Any CPU.Build.0 = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|x64.ActiveCfg = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|x64.Build.0 = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|x86.ActiveCfg = Release|Any CPU + {ED74B33F-3CE7-42EB-BAA1-623F43900B15}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {C2DB4B64-B7C3-4FED-8753-C040F677C69A} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {B9C12532-0969-4DAC-A2F8-CA9208D7A901} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {62E41317-ED5D-4AA4-B129-C9E56C27354C} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {08D602F6-7C11-4653-B70B-B56333BF6FD2} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {383609C1-F43F-49EB-85E4-1964EE7F0F14} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {B314AD5E-10AC-418A-B021-D4206BF37ACF} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {0CD1912D-5E27-4A2A-A998-164792E0D006} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {342783B5-F75B-4752-A3E2-B8CB7D09C080} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {95BAF30B-8089-42CE-8530-6DFBCE1F6A07} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {1BA7E772-8AA7-4D5A-800D-66B17F62421C} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {78FC19B2-396C-4ED2-BFD9-6C5667C61666} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {B615B353-476C-43B9-A776-B193B0DBD256} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {A11DC259-D1DB-4686-AD28-A427D0BABA83} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {2EC50C79-782D-4985-ABB1-AD07F35D1621} = {A11DC259-D1DB-4686-AD28-A427D0BABA83} @@ -696,7 +1604,12 @@ Global {CC0A5C98-ACDE-4139-BA2F-2995A9B8E18C} = {02374BD0-BF0B-40F8-A04A-C4C4D61D4992} {A7F41094-8648-446B-AECD-DCC2CC871F73} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {F70AC78E-8925-4770-832A-2FC67A620EB2} = {A7F41094-8648-446B-AECD-DCC2CC871F73} + {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C} = {047680F1-C0FE-4DE9-A257-62FA8599C834} + {E8212911-344B-4638-ADC3-B215BCDCAFD1} = {047680F1-C0FE-4DE9-A257-62FA8599C834} {F80F837E-D2FC-4FFC-B68F-3CF0EC015F66} = {A7F41094-8648-446B-AECD-DCC2CC871F73} + {5BE7F505-7D77-4C3A-ABFD-54088774DAA7} = {047680F1-C0FE-4DE9-A257-62FA8599C834} {35031EDB-C0DE-453A-8335-D2EBEA2FC640} = {A7F41094-8648-446B-AECD-DCC2CC871F73} {07578B6C-9B96-4B3D-BA2E-7800EFCA7F99} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} @@ -709,9 +1622,13 @@ Global {CB903D21-4869-42EF-BDD6-5B1CFF674337} = {7592AFA4-426B-42F3-AE82-957C86814482} {980B5FD8-0107-41F7-8FAD-E4E8BAE8A625} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {7C06FE2D-6C62-48F5-A505-F0D715C554DE} = {7592AFA4-426B-42F3-AE82-957C86814482} + {AF89083D-4715-42E6-93E9-38497D12A8A6} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {B5CDB0DC-B26D-48F1-B934-FE5C1C991940} = {047680F1-C0FE-4DE9-A257-62FA8599C834} {DFBABB04-50E9-42F6-B470-310E1B545638} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {B445B19C-A925-4873-8CB7-8317898B6970} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {CDB47863-BEBD-4841-A807-46D868962521} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {273F2527-1658-4CCF-8DC6-600E921188C5} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {2F3700EF-1CDA-4C15-AC88-360230000ECD} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {3046DBF4-C2FF-4F3A-9176-E1C01E0A90E5} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {11011FF8-77EA-4B25-96C0-29D4D486EF1C} = {3046DBF4-C2FF-4F3A-9176-E1C01E0A90E5} {43CB06A9-7E88-4C5F-BFB8-947E072CBC9F} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} @@ -720,18 +1637,26 @@ Global {FD3E9371-3134-4235-8E80-32226DFB4B1F} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {D83B27F3-4401-42F5-843E-147566B4999A} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {00359961-0C50-4BB1-A794-8B06DE991639} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} + {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {0EAE36A1-B578-4F13-A113-7A477ECA1BDA} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {C8BB6A85-A7EA-40C0-893D-F36F317829B3} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {BF9828E9-5597-4D42-AA6E-6E6C12214204} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {D9697361-232F-465D-A136-4561E0E88488} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {9CAF360E-5AD3-4C4F-89A0-327EEB70D673} = {D9697361-232F-465D-A136-4561E0E88488} - {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {E90114C6-86FC-43B8-AE5C-D9273CF21FE4} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {55A7D436-CC8C-47E6-B43A-DFE32E0FE38C} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {28B87C37-4B52-400F-B84D-64F134931BDC} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {CADEAE45-8981-4723-B641-9C28251C7D3B} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {E49C822C-E921-48DF-897B-3E603CA596D2} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {A2C0F203-11FF-4B7F-A94F-B9FD873573FE} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {7E23E229-6823-4D84-AF3A-AE14CEAEF52A} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {160EFFA0-F6B9-49E4-B62B-68C0D53DB425} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {B508EBD6-0F14-480C-A446-45A09052733B} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} + {E070F694-335D-4D96-8951-F41D0A5F2A8B} = {442E80E5-8040-4123-B88A-26FD36BA95D9} {6843B5B3-9E95-4022-B792-8A1DE6BFEFEC} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {097D5F6F-D26F-4BFB-9074-FA52577EB442} = {6843B5B3-9E95-4022-B792-8A1DE6BFEFEC} {442E80E5-8040-4123-B88A-26FD36BA95D9} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} - {E070F694-335D-4D96-8951-F41D0A5F2A8B} = {442E80E5-8040-4123-B88A-26FD36BA95D9} {5764B1AA-66B8-43AE-9E0D-0B3B71714B92} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {953D770B-2DE8-4D1B-B1D4-ED46F4F5F31A} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {55E08C7F-81C8-4D0B-AB18-87C89B261477} = {953D770B-2DE8-4D1B-B1D4-ED46F4F5F31A} @@ -746,40 +1671,14 @@ Global {9BD12D26-AD9B-4C76-A97F-7A89B7276ABE} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {11D2CA0F-6D38-4DC7-AE06-C1DAE7FC1C20} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} {F2DFB0FE-DF35-4D94-9CC9-43212B1D6F93} = {11D2CA0F-6D38-4DC7-AE06-C1DAE7FC1C20} + {FB21FAC7-09F7-4F68-910C-224EE7150B35} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} + {667E2F91-3004-4409-B6B8-9216EAFC44CF} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} {77176EC6-C586-47B1-BB72-533327F9E7BE} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {030CB614-6148-4863-A39A-1251728DE51D} = {BF3ED6BF-ADF3-4D25-8E89-02FB8D945CA9} {5AECC3FC-7374-4534-A305-397E3290E573} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {047680F1-C0FE-4DE9-A257-62FA8599C834} = {DD020B34-460F-455F-8D17-CF4A949F100B} - {B5CDB0DC-B26D-48F1-B934-FE5C1C991940} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {345FC3FB-D1E9-4AE8-9052-17D20AB01FA2} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {342783B5-F75B-4752-A3E2-B8CB7D09C080} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {1BA7E772-8AA7-4D5A-800D-66B17F62421C} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {2AED1542-A8ED-488D-B6D0-E16AB5D6EF6C} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {4AA9E7B7-36BF-4AAE-BFA3-C9CE8740F4A0} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {95BAF30B-8089-42CE-8530-6DFBCE1F6A07} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {5BE7F505-7D77-4C3A-ABFD-54088774DAA7} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {0CD1912D-5E27-4A2A-A998-164792E0D006} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {E8212911-344B-4638-ADC3-B215BCDCAFD1} = {047680F1-C0FE-4DE9-A257-62FA8599C834} {0AF0FE8D-C234-4F04-8514-32206ACE01BD} = {DD020B34-460F-455F-8D17-CF4A949F100B} - {A2C0F203-11FF-4B7F-A94F-B9FD873573FE} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {9C1D6ABA-5EDE-4FA0-A8A9-0AB98CB74737} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {AF89083D-4715-42E6-93E9-38497D12A8A6} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {41BF4392-54BD-4FE7-A3EB-CD045F88CA9A} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {2F3700EF-1CDA-4C15-AC88-360230000ECD} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {7E23E229-6823-4D84-AF3A-AE14CEAEF52A} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {B314AD5E-10AC-418A-B021-D4206BF37ACF} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {383609C1-F43F-49EB-85E4-1964EE7F0F14} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {CDB47863-BEBD-4841-A807-46D868962521} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {B508EBD6-0F14-480C-A446-45A09052733B} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {78FC19B2-396C-4ED2-BFD9-6C5667C61666} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {CADEAE45-8981-4723-B641-9C28251C7D3B} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {BF9828E9-5597-4D42-AA6E-6E6C12214204} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {4E04EB35-7FD2-4FDB-B09A-F75CE24053B9} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {CE0D5FEB-F6DB-4EB8-B8A9-6A4A32944539} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} - {E90114C6-86FC-43B8-AE5C-D9273CF21FE4} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} {8462B106-175A-423A-BA94-BE0D39D0BD8E} = {047680F1-C0FE-4DE9-A257-62FA8599C834} - {667E2F91-3004-4409-B6B8-9216EAFC44CF} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} - {FB21FAC7-09F7-4F68-910C-224EE7150B35} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} {CE5D4439-5B3C-4E97-B7E3-EB8610AEA3EF} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {A05D1519-6A82-498F-B7C9-3D14E08D35CA} = {27C5D71D-0721-4221-9286-B94AB07B58CF} {5A93F96B-4D0E-479D-B540-29678A0998FA} = {0AF0FE8D-C234-4F04-8514-32206ACE01BD} @@ -798,6 +1697,13 @@ Global {01A20A89-53A1-4D5B-B563-89E157718474} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} {7B14879F-156B-417E-ACA3-0B5A69CC2F39} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} {A1B2C3D4-E5F6-7890-ABCD-EF1234567890} = {8462B106-175A-423A-BA94-BE0D39D0BD8E} + {366FA402-B13D-4EE2-9BA4-A0C3134C6C6E} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {F99CE5A1-FDA1-415C-B1E6-C8787734ACD2} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {B42DD6AA-255C-4606-8A1B-263B26650DED} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {1BECAC48-1C83-43D2-A91F-9AFA634A68C7} = {27C5D71D-0721-4221-9286-B94AB07B58CF} + {87842296-C78B-42B9-8E96-5054E79CD700} = {DD020B34-460F-455F-8D17-CF4A949F100B} + {929A8AD2-DB45-B92A-7930-EBDD2DBAF802} = {D687DDC4-66C5-4667-9E3A-FD8B78ECAA78} + {ED74B33F-3CE7-42EB-BAA1-623F43900B15} = {929A8AD2-DB45-B92A-7930-EBDD2DBAF802} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {65220BF2-EAE1-4CB2-AA58-EBE80768CB40} diff --git a/examples/SecretManagement/README.md b/examples/SecretManagement/README.md new file mode 100644 index 000000000..f9c09f6f9 --- /dev/null +++ b/examples/SecretManagement/README.md @@ -0,0 +1,36 @@ +# Dapr Secrets Management Sample + +This sample demonstrates how to use the Dapr Secrets Management SDK to retrieve secrets from Dapr secret store components. + +## Features Demonstrated + +1. **Direct secret retrieval** — Using `DaprSecretsManagementClient` to fetch individual or bulk secrets via gRPC. +2. **Typed secret stores** — Using the `[SecretStore]` and `[Secret]` attributes with the source generator to create strongly-typed secret accessors. +3. **Dependency injection** — Registering the secrets client and typed stores via `IServiceCollection` extensions. + +## Prerequisites + +- [Dapr CLI](https://docs.dapr.io/getting-started/install-dapr-cli/) +- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0) +- A configured Dapr secret store component (e.g., local file, Kubernetes secrets, Azure Key Vault) + +## Running the Sample + +```bash +dapr run --app-id secret-sample --app-port 5234 -- dotnet run +``` + +## Endpoints + +| Method | Path | Description | +|--------|------|-------------| +| GET | `/secrets/{storeName}/{key}` | Retrieve a single secret by key | +| GET | `/secrets/{storeName}` | Retrieve all secrets from a store | + +## NuGet Package Note + +When consuming from NuGet, install the single **`Dapr.SecretsManagement`** package. The sub-projects (`Abstractions`, `Runtime`, `Generators`) are bundled into this one package and are not published individually. + +```xml + +``` diff --git a/examples/SecretManagement/SecretManagementSample/IMyVaultSecrets.cs b/examples/SecretManagement/SecretManagementSample/IMyVaultSecrets.cs new file mode 100644 index 000000000..18eca9b68 --- /dev/null +++ b/examples/SecretManagement/SecretManagementSample/IMyVaultSecrets.cs @@ -0,0 +1,40 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.SecretsManagement.Abstractions; + +namespace SecretManagementSample; + +/// +/// Example of a typed secret store interface. Apply the to an interface +/// and the Dapr Secrets Management source generator will produce: +/// 1. A concrete implementation that caches secrets loaded at startup. +/// 2. A DI registration extension method (e.g., AddMyVaultSecrets()). +/// +/// Properties without use the property name as the secret key. +/// Properties with use the specified secret name. +/// +[SecretStore("my-vault")] +public partial interface IMyVaultSecrets +{ + /// + /// The database connection string, retrieved from the "db-connection-string" secret key. + /// + [Secret("db-connection-string")] + string DatabaseConnection { get; } + + /// + /// The API key. Uses the property name "ApiKey" as the secret key. + /// + string ApiKey { get; } +} diff --git a/examples/SecretManagement/SecretManagementSample/Program.cs b/examples/SecretManagement/SecretManagementSample/Program.cs new file mode 100644 index 000000000..c8e8a3d45 --- /dev/null +++ b/examples/SecretManagement/SecretManagementSample/Program.cs @@ -0,0 +1,66 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.SecretsManagement; +using Dapr.SecretsManagement.Extensions; + +var builder = WebApplication.CreateBuilder(args); + +// Register the Dapr Secrets Management client with dependency injection. +// This makes DaprSecretsManagementClient available throughout the application. +builder.Services.AddDaprSecretsManagementClient(); + +// If you've defined a typed secret store interface with [SecretStore] and the source generator, +// you can register it here. For example: +// +// builder.Services.AddDaprSecretsManagementClient() +// .AddMyVaultSecrets(); // Generated extension method +// +// See IMyVaultSecrets.cs for the typed secret store interface definition. + +var app = builder.Build(); + +// --- Example 1: Direct secret retrieval --- +app.MapGet("/secrets/{storeName}/{key}", async ( + string storeName, + string key, + DaprSecretsManagementClient secretsClient, + CancellationToken cancellationToken) => +{ + var secret = await secretsClient.GetSecretAsync(storeName, key, cancellationToken: cancellationToken); + return Results.Ok(secret); +}); + +// --- Example 2: Bulk secret retrieval --- +app.MapGet("/secrets/{storeName}", async ( + string storeName, + DaprSecretsManagementClient secretsClient, + CancellationToken cancellationToken) => +{ + var secrets = await secretsClient.GetBulkSecretAsync(storeName, cancellationToken: cancellationToken); + return Results.Ok(secrets); +}); + +// --- Example 3: Using typed secret store (source-generated) --- +// If you have registered a typed secret store (see IMyVaultSecrets.cs), you can inject it directly: +// +// app.MapGet("/typed-secrets", (IMyVaultSecrets secrets) => +// { +// return Results.Ok(new +// { +// DatabaseConnection = secrets.DatabaseConnection, +// ApiKey = secrets.ApiKey +// }); +// }); + +app.Run(); diff --git a/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json b/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json new file mode 100644 index 000000000..c36e6a28f --- /dev/null +++ b/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "SecretManagementSample": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5234", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/examples/SecretManagement/SecretManagementSample/SecretManagementSample.csproj b/examples/SecretManagement/SecretManagementSample/SecretManagementSample.csproj new file mode 100644 index 000000000..50dc200bd --- /dev/null +++ b/examples/SecretManagement/SecretManagementSample/SecretManagementSample.csproj @@ -0,0 +1,29 @@ + + + + net10.0 + enable + enable + + + true + $(BaseIntermediateOutputPath)Generated + + + + + + + + + + diff --git a/src/Dapr.Common/AssemblyInfo.cs b/src/Dapr.Common/AssemblyInfo.cs index 5875274af..612d2da6a 100644 --- a/src/Dapr.Common/AssemblyInfo.cs +++ b/src/Dapr.Common/AssemblyInfo.cs @@ -26,6 +26,7 @@ [assembly: InternalsVisibleTo("Dapr.Extensions.Configuration, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Workflow, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Workflow.Grpc, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] +[assembly: InternalsVisibleTo("Dapr.SecretsManagement.Runtime, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Actors.AspNetCore.IntegrationTest, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Actors.AspNetCore.IntegrationTest.App, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] @@ -49,3 +50,4 @@ [assembly: InternalsVisibleTo("Dapr.Extensions.Configuration.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Jobs.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] [assembly: InternalsVisibleTo("Dapr.Messaging.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] +[assembly: InternalsVisibleTo("Dapr.SecretsManagement.Runtime.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2")] diff --git a/src/Dapr.SecretsManagement.Abstractions/Dapr.SecretsManagement.Abstractions.csproj b/src/Dapr.SecretsManagement.Abstractions/Dapr.SecretsManagement.Abstractions.csproj new file mode 100644 index 000000000..abba95de4 --- /dev/null +++ b/src/Dapr.SecretsManagement.Abstractions/Dapr.SecretsManagement.Abstractions.csproj @@ -0,0 +1,8 @@ + + + + enable + enable + + + diff --git a/src/Dapr.SecretsManagement.Abstractions/SecretAttribute.cs b/src/Dapr.SecretsManagement.Abstractions/SecretAttribute.cs new file mode 100644 index 000000000..211d9256a --- /dev/null +++ b/src/Dapr.SecretsManagement.Abstractions/SecretAttribute.cs @@ -0,0 +1,56 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +namespace Dapr.SecretsManagement.Abstractions; + +/// +/// Specifies the secret key name used when retrieving the value of the annotated property from a Dapr +/// secret store. When this attribute is omitted, the property name is used as the secret key. +/// +/// +/// This attribute should be applied to properties on an interface that is also annotated with +/// . The source generator uses this metadata to map each property +/// to the correct secret key during bulk secret retrieval. +/// +/// +/// +/// [SecretStore("my-vault")] +/// public partial interface IMySecrets +/// { +/// [Secret("database-connection-string")] +/// string DbConnection { get; } +/// } +/// +/// +[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)] +public sealed class SecretAttribute : Attribute +{ + /// + /// Initializes a new instance of the class. + /// + /// + /// The name of the secret key in the Dapr secret store. This value is used when calling the + /// Dapr Secrets API to retrieve the secret value. + /// + /// Thrown when is . + public SecretAttribute(string secretName) + { + ArgumentNullException.ThrowIfNull(secretName); + SecretName = secretName; + } + + /// + /// Gets the name of the secret key in the Dapr secret store. + /// + public string SecretName { get; } +} diff --git a/src/Dapr.SecretsManagement.Abstractions/SecretStoreAttribute.cs b/src/Dapr.SecretsManagement.Abstractions/SecretStoreAttribute.cs new file mode 100644 index 000000000..7e8ab73cb --- /dev/null +++ b/src/Dapr.SecretsManagement.Abstractions/SecretStoreAttribute.cs @@ -0,0 +1,68 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +namespace Dapr.SecretsManagement.Abstractions; + +/// +/// Marks an interface as a typed accessor for a Dapr secret store. When applied to a partial interface, +/// the Dapr Secrets Management source generator will produce a concrete implementation that retrieves secrets +/// from the specified Dapr secret store component and registers it in the dependency injection container. +/// +/// +/// +/// The interface should declare -typed read-only properties. Each property maps to a +/// single secret key in the store. The key name defaults to the property name but can be overridden with +/// . +/// +/// +/// Generated implementations load all mapped secrets in bulk at startup via an IHostedService and +/// expose them as synchronous properties. This makes secrets available immediately after host startup without +/// requiring callers to manage async flows. +/// +/// +/// +/// [SecretStore("my-vault")] +/// public partial interface IMySecrets +/// { +/// /// <summary>The database connection string.</summary> +/// [Secret("db-connection-string")] +/// string DatabaseConnection { get; } +/// +/// /// <summary>The API key (uses property name as secret key).</summary> +/// string ApiKey { get; } +/// } +/// +/// +/// +[AttributeUsage(AttributeTargets.Interface, Inherited = false, AllowMultiple = false)] +public sealed class SecretStoreAttribute : Attribute +{ + /// + /// Initializes a new instance of the class. + /// + /// + /// The name of the Dapr secret store component to retrieve secrets from. This must match the + /// metadata.name of a configured Dapr secret store component. + /// + /// Thrown when is . + public SecretStoreAttribute(string storeName) + { + ArgumentNullException.ThrowIfNull(storeName); + StoreName = storeName; + } + + /// + /// Gets the name of the Dapr secret store component that secrets will be retrieved from. + /// + public string StoreName { get; } +} diff --git a/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs b/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs new file mode 100644 index 000000000..3ca22eca8 --- /dev/null +++ b/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs @@ -0,0 +1,30 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +namespace Dapr.SecretsManagement.Abstractions; + +/// +/// Well-known names and constants related to Dapr Secrets Management. +/// +public static class WellKnownSecrets +{ + /// + /// The fully qualified name of . + /// + public const string SecretStoreAttributeFullName = "Dapr.SecretsManagement.Abstractions.SecretStoreAttribute"; + + /// + /// The fully qualified name of . + /// + public const string SecretAttributeFullName = "Dapr.SecretsManagement.Abstractions.SecretAttribute"; +} diff --git a/src/Dapr.SecretsManagement.Generators/Dapr.SecretsManagement.Generators.csproj b/src/Dapr.SecretsManagement.Generators/Dapr.SecretsManagement.Generators.csproj new file mode 100644 index 000000000..063de25a9 --- /dev/null +++ b/src/Dapr.SecretsManagement.Generators/Dapr.SecretsManagement.Generators.csproj @@ -0,0 +1,23 @@ + + + + + netstandard2.0 + false + enable + + true + true + + Dapr.SecretsManagement + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/src/Dapr.SecretsManagement.Generators/KnownSymbols.cs b/src/Dapr.SecretsManagement.Generators/KnownSymbols.cs new file mode 100644 index 000000000..b869974d9 --- /dev/null +++ b/src/Dapr.SecretsManagement.Generators/KnownSymbols.cs @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Microsoft.CodeAnalysis; + +namespace Dapr.SecretsManagement; + +/// +/// Caches well-known Roslyn symbols used during source generation. +/// +internal sealed record KnownSymbols( + INamedTypeSymbol? SecretStoreAttribute, + INamedTypeSymbol? SecretAttribute); diff --git a/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs b/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs new file mode 100644 index 000000000..ac86d5fe5 --- /dev/null +++ b/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs @@ -0,0 +1,289 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp.Syntax; + +namespace Dapr.SecretsManagement; + +/// +/// Incremental source generator that discovers interfaces annotated with [SecretStore], +/// reads their property mappings (including optional [Secret] attributes), and emits: +/// +/// A concrete implementation class that stores secret values retrieved from the Dapr secret store. +/// A DI registration extension method on IDaprSecretsManagementBuilder. +/// +/// +[Generator(LanguageNames.CSharp)] +public sealed class SecretStoreSourceGenerator : IIncrementalGenerator +{ + private const string SecretStoreAttributeFullName = "Dapr.SecretsManagement.Abstractions.SecretStoreAttribute"; + private const string SecretAttributeFullName = "Dapr.SecretsManagement.Abstractions.SecretAttribute"; + + /// + public void Initialize(IncrementalGeneratorInitializationContext context) + { + // Cache the attribute symbols. + var known = context.CompilationProvider.Select((c, _) => + new KnownSymbols( + SecretStoreAttribute: c.GetTypeByMetadataName(SecretStoreAttributeFullName), + SecretAttribute: c.GetTypeByMetadataName(SecretAttributeFullName))); + + // Report diagnostic if the attribute types are not found. + context.RegisterSourceOutput(known, (spc, ks) => + { + if (ks.SecretStoreAttribute is null) + { + spc.ReportDiagnostic(Diagnostic.Create( + new DiagnosticDescriptor( + "DAPRSEC001", + "SecretStore attribute not found", + "The source generator could not find the type '" + SecretStoreAttributeFullName + + "'. Ensure that Dapr.SecretsManagement.Abstractions is properly referenced.", + "Dapr.SecretsManagement", + DiagnosticSeverity.Warning, + isEnabledByDefault: true), + Location.None)); + } + }); + + // Discover candidate interface declarations with at least one attribute. + var candidates = context.SyntaxProvider.CreateSyntaxProvider( + predicate: static (node, _) => node is InterfaceDeclarationSyntax ids && ids.AttributeLists.Count > 0, + transform: static (ctx, ct) => + { + var interfaceSyntax = (InterfaceDeclarationSyntax)ctx.Node; + var symbol = ctx.SemanticModel.GetDeclaredSymbol(interfaceSyntax, ct); + return symbol as INamedTypeSymbol; + }) + .Where(static s => s is not null)!; + + // Combine candidates with known symbols and generate. + var combined = candidates.Combine(known); + + context.RegisterSourceOutput(combined, (spc, pair) => + { + var (interfaceSymbol, ks) = pair; + if (ks.SecretStoreAttribute is null || interfaceSymbol is null) + return; + + // Check if the interface has [SecretStore] attribute. + var storeAttrData = interfaceSymbol.GetAttributes().FirstOrDefault(a => + SymbolEqualityComparer.Default.Equals(a.AttributeClass, ks.SecretStoreAttribute)); + + if (storeAttrData is null) + return; + + // Extract the store name from the constructor argument. + if (storeAttrData.ConstructorArguments.Length < 1 || + storeAttrData.ConstructorArguments[0].Value is not string storeName) + return; + + // Collect properties and their secret key mappings. + var properties = new List<(string PropertyName, string SecretKey, string PropertyType)>(); + + foreach (var member in interfaceSymbol.GetMembers()) + { + if (member is not IPropertySymbol prop) + continue; + + if (prop.GetMethod is null) + continue; + + var secretKey = prop.Name; + + // Check for [Secret("key")] override. + if (ks.SecretAttribute is not null) + { + var secretAttrData = prop.GetAttributes().FirstOrDefault(a => + SymbolEqualityComparer.Default.Equals(a.AttributeClass, ks.SecretAttribute)); + + if (secretAttrData is not null && + secretAttrData.ConstructorArguments.Length > 0 && + secretAttrData.ConstructorArguments[0].Value is string overrideName) + { + secretKey = overrideName; + } + } + + properties.Add((prop.Name, secretKey, prop.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat))); + } + + if (properties.Count == 0) + return; + + // Resolve naming. + var interfaceName = interfaceSymbol.Name; + var namespaceName = interfaceSymbol.ContainingNamespace.IsGlobalNamespace + ? null + : interfaceSymbol.ContainingNamespace.ToDisplayString(); + + // Implementation class name: strip leading 'I' from interface name, append "SecretStoreClient". + var implName = interfaceName.StartsWith("I", StringComparison.Ordinal) && interfaceName.Length > 1 && char.IsUpper(interfaceName[1]) + ? interfaceName.Substring(1) + "SecretStoreClient" + : interfaceName + "SecretStoreClient"; + + var source = GenerateSource( + namespaceName, interfaceName, implName, storeName, + interfaceSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), + properties); + + var hintName = (namespaceName is not null ? namespaceName + "." : "") + implName + ".g.cs"; + spc.AddSource(hintName, source); + }); + } + + private static string GenerateSource( + string? namespaceName, + string interfaceName, + string implName, + string storeName, + string fullyQualifiedInterfaceName, + List<(string PropertyName, string SecretKey, string PropertyType)> properties) + { + var sb = new StringBuilder(); + + sb.AppendLine("// "); + sb.AppendLine("#nullable enable"); + sb.AppendLine(); + sb.AppendLine("using System;"); + sb.AppendLine("using System.CodeDom.Compiler;"); + sb.AppendLine("using System.Collections.Generic;"); + sb.AppendLine("using System.Threading;"); + sb.AppendLine("using System.Threading.Tasks;"); + sb.AppendLine("using Microsoft.Extensions.DependencyInjection;"); + sb.AppendLine("using Microsoft.Extensions.Hosting;"); + sb.AppendLine(); + + if (namespaceName is not null) + { + sb.AppendLine($"namespace {namespaceName}"); + sb.AppendLine("{"); + } + + // 1. Implementation class + sb.AppendLine($" /// "); + sb.AppendLine($" /// Auto-generated implementation of that retrieves secrets from the"); + sb.AppendLine($" /// Dapr secret store component named {EscapeXml(storeName)}."); + sb.AppendLine($" /// "); + sb.AppendLine($" [GeneratedCode(\"Dapr.SecretsManagement.Generators\", \"1.0.0\")]"); + sb.AppendLine($" internal sealed class {implName} : {fullyQualifiedInterfaceName}"); + sb.AppendLine(" {"); + sb.AppendLine(" private readonly Dictionary _secrets;"); + sb.AppendLine(); + sb.AppendLine($" internal {implName}(Dictionary secrets)"); + sb.AppendLine(" {"); + sb.AppendLine(" _secrets = secrets ?? throw new ArgumentNullException(nameof(secrets));"); + sb.AppendLine(" }"); + sb.AppendLine(); + + foreach (var (propName, secretKey, propType) in properties) + { + sb.AppendLine($" /// "); + sb.AppendLine($" public {propType} {propName} =>"); + sb.AppendLine($" _secrets.TryGetValue(\"{EscapeCSharpString(secretKey)}\", out var __{propName}Value)"); + sb.AppendLine($" ? __{propName}Value"); + sb.AppendLine($" : throw new KeyNotFoundException(\"Secret '{EscapeCSharpString(secretKey)}' was not found in store '{EscapeCSharpString(storeName)}'.\");"); + sb.AppendLine(); + } + + sb.AppendLine(" }"); + sb.AppendLine(); + + // 2. Hosted service that loads secrets at startup + var loaderName = implName.Replace("SecretStoreClient", "SecretStoreLoader"); + sb.AppendLine($" /// "); + sb.AppendLine($" /// Hosted service that pre-loads secrets from the {EscapeXml(storeName)} Dapr secret store"); + sb.AppendLine($" /// at application startup and registers the generated in the container."); + sb.AppendLine($" /// "); + sb.AppendLine($" [GeneratedCode(\"Dapr.SecretsManagement.Generators\", \"1.0.0\")]"); + sb.AppendLine($" internal sealed class {loaderName} : IHostedService"); + sb.AppendLine(" {"); + sb.AppendLine($" private readonly Dapr.SecretsManagement.DaprSecretsManagementClient _client;"); + sb.AppendLine($" private Dictionary? _secrets;"); + sb.AppendLine(); + sb.AppendLine($" public {loaderName}(Dapr.SecretsManagement.DaprSecretsManagementClient client)"); + sb.AppendLine(" {"); + sb.AppendLine(" _client = client ?? throw new ArgumentNullException(nameof(client));"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" internal Dictionary Secrets =>"); + sb.AppendLine(" _secrets ?? throw new InvalidOperationException("); + sb.AppendLine($" \"Secrets from store '{EscapeCSharpString(storeName)}' have not been loaded yet. Ensure the host has started.\");"); + sb.AppendLine(); + sb.AppendLine(" public async Task StartAsync(CancellationToken cancellationToken)"); + sb.AppendLine(" {"); + sb.AppendLine($" var bulk = await _client.GetBulkSecretAsync(\"{EscapeCSharpString(storeName)}\", cancellationToken: cancellationToken).ConfigureAwait(false);"); + sb.AppendLine(" var flat = new Dictionary();"); + sb.AppendLine(" foreach (var entry in bulk)"); + sb.AppendLine(" {"); + sb.AppendLine(" foreach (var kvp in entry.Value)"); + sb.AppendLine(" {"); + sb.AppendLine(" flat[kvp.Key] = kvp.Value;"); + sb.AppendLine(" }"); + sb.AppendLine(" }"); + sb.AppendLine(" _secrets = flat;"); + sb.AppendLine(" }"); + sb.AppendLine(); + sb.AppendLine(" public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;"); + sb.AppendLine(" }"); + sb.AppendLine(); + + // 3. DI registration extension + var methodName = "Add" + (interfaceName.StartsWith("I", StringComparison.Ordinal) && interfaceName.Length > 1 && char.IsUpper(interfaceName[1]) + ? interfaceName.Substring(1) + : interfaceName); + + sb.AppendLine($" /// "); + sb.AppendLine($" /// Extension methods for registering the generated implementation."); + sb.AppendLine($" /// "); + sb.AppendLine($" [GeneratedCode(\"Dapr.SecretsManagement.Generators\", \"1.0.0\")]"); + sb.AppendLine($" public static class {implName}Extensions"); + sb.AppendLine(" {"); + sb.AppendLine($" /// "); + sb.AppendLine($" /// Registers the generated typed secret store implementation for "); + sb.AppendLine($" /// with the dependency injection container. Secrets are loaded from the {EscapeXml(storeName)}"); + sb.AppendLine($" /// Dapr secret store at application startup via an ."); + sb.AppendLine($" /// "); + sb.AppendLine($" /// The Dapr Secrets Management builder."); + sb.AppendLine($" /// The builder instance for chaining."); + sb.AppendLine($" public static Dapr.SecretsManagement.IDaprSecretsManagementBuilder {methodName}("); + sb.AppendLine($" this Dapr.SecretsManagement.IDaprSecretsManagementBuilder builder)"); + sb.AppendLine(" {"); + sb.AppendLine($" builder.Services.AddSingleton<{loaderName}>();"); + sb.AppendLine($" builder.Services.AddSingleton(sp => sp.GetRequiredService<{loaderName}>());"); + sb.AppendLine($" builder.Services.AddSingleton<{fullyQualifiedInterfaceName}>(sp =>"); + sb.AppendLine($" new {implName}(sp.GetRequiredService<{loaderName}>().Secrets));"); + sb.AppendLine(" return builder;"); + sb.AppendLine(" }"); + sb.AppendLine(" }"); + + if (namespaceName is not null) + { + sb.AppendLine("}"); + } + + return sb.ToString(); + } + + private static string EscapeCSharpString(string value) => + value.Replace("\\", "\\\\").Replace("\"", "\\\""); + + private static string EscapeXml(string value) => + value.Replace("&", "&").Replace("<", "<").Replace(">", ">"); +} diff --git a/src/Dapr.SecretsManagement.Runtime/AssemblyInfo.cs b/src/Dapr.SecretsManagement.Runtime/AssemblyInfo.cs new file mode 100644 index 000000000..b6f1304b3 --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/AssemblyInfo.cs @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Dapr.SecretsManagement.Runtime.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100b1f597635c44597fcecb493e2b1327033b29b1a98ac956a1a538664b68f87d45fbaada0438a15a6265e62864947cc067d8da3a7d93c5eb2fcbb850e396c8684dba74ea477d82a1bbb18932c0efb30b64ff1677f85ae833818707ac8b49ad8062ca01d2c89d8ab1843ae73e8ba9649cd28666b539444dcdee3639f95e2a099bb2" )] diff --git a/src/Dapr.SecretsManagement.Runtime/Dapr.SecretsManagement.Runtime.csproj b/src/Dapr.SecretsManagement.Runtime/Dapr.SecretsManagement.Runtime.csproj new file mode 100644 index 000000000..a9648a8e2 --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/Dapr.SecretsManagement.Runtime.csproj @@ -0,0 +1,21 @@ + + + + enable + enable + + + + + + + + + + + + + + + + diff --git a/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClient.cs b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClient.cs new file mode 100644 index 000000000..335d7a8e5 --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClient.cs @@ -0,0 +1,120 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.Common; +using Autogenerated = Dapr.Client.Autogen.Grpc.v1.Dapr; + +namespace Dapr.SecretsManagement; + +/// +/// +/// Defines client operations for managing Dapr secrets. Use +/// to create a or register for use with dependency injection via +/// . +/// +/// +/// Implementations of implement because the +/// client accesses network resources. For best performance, create a single long-lived client instance and share +/// it for the lifetime of the application. This is done for you if created via the DI extensions. Avoid creating +/// and disposing a client instance for each operation that the application performs — this can lead to socket +/// exhaustion and other problems. +/// +/// +public abstract class DaprSecretsManagementClient( + Autogenerated.DaprClient client, + HttpClient httpClient, + string? daprApiToken = null) : IDaprClient +{ + private bool disposed; + + /// + /// The HTTP client used by the client for calling the Dapr runtime. + /// + /// + /// Property exposed for testing purposes. + /// + internal readonly HttpClient HttpClient = httpClient; + + /// + /// The Dapr API token value. + /// + /// + /// Property exposed for testing purposes. + /// + internal readonly string? DaprApiToken = daprApiToken; + + /// + /// The autogenerated Dapr gRPC client. + /// + /// + /// Property exposed for testing purposes. + /// + internal Autogenerated.DaprClient Client { get; } = client; + + /// + /// Gets the secret value for a specific key from the specified secret store. + /// + /// The name of the Dapr secret store component. + /// The secret key to retrieve. + /// + /// An optional collection of metadata key-value pairs that will be provided to the secret store component. + /// The valid metadata keys and values are determined by the type of secret store used. + /// + /// A that can be used to cancel the operation. + /// + /// A that resolves to a containing the secret + /// data. Some secret stores (such as Kubernetes) can store multiple values per key — each entry in the + /// dictionary represents one such value. + /// + public abstract Task> GetSecretAsync( + string storeName, + string key, + IReadOnlyDictionary? metadata = null, + CancellationToken cancellationToken = default); + + /// + /// Gets all secret values that the application is allowed to access from the specified secret store. + /// + /// The name of the Dapr secret store component. + /// + /// An optional collection of metadata key-value pairs that will be provided to the secret store component. + /// The valid metadata keys and values are determined by the type of secret store used. + /// + /// A that can be used to cancel the operation. + /// + /// A that resolves to a nested dictionary. The outer key is the secret name; the inner + /// dictionary contains one or more key-value pairs representing the secret data. + /// + public abstract Task>> GetBulkSecretAsync( + string storeName, + IReadOnlyDictionary? metadata = null, + CancellationToken cancellationToken = default); + + /// + public void Dispose() + { + if (!this.disposed) + { + Dispose(disposing: true); + this.disposed = true; + } + } + + /// + /// Disposes the resources associated with the object. + /// + /// if called by a call to the method; otherwise . + protected virtual void Dispose(bool disposing) + { + } +} diff --git a/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClientBuilder.cs b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClientBuilder.cs new file mode 100644 index 000000000..99c8320e1 --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementClientBuilder.cs @@ -0,0 +1,37 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.Common; +using Microsoft.Extensions.Configuration; +using Autogenerated = Dapr.Client.Autogen.Grpc.v1; + +namespace Dapr.SecretsManagement; + +/// +/// Builds a instance with the specified configuration. +/// +/// An optional instance used to resolve default settings. +public sealed class DaprSecretsManagementClientBuilder(IConfiguration? configuration = null) + : DaprGenericClientBuilder(configuration) +{ + /// + /// Builds the instance from the properties configured on this builder. + /// + /// A new instance. + public override DaprSecretsManagementClient Build() + { + var daprClientDependencies = this.BuildDaprClientDependencies(typeof(DaprSecretsManagementClient).Assembly); + var client = new Autogenerated.Dapr.DaprClient(daprClientDependencies.channel); + return new DaprSecretsManagementGrpcClient(client, daprClientDependencies.httpClient, daprClientDependencies.daprApiToken); + } +} diff --git a/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementGrpcClient.cs b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementGrpcClient.cs new file mode 100644 index 000000000..ad918418f --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/DaprSecretsManagementGrpcClient.cs @@ -0,0 +1,137 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.Common; +using Grpc.Core; +using Autogenerated = Dapr.Client.Autogen.Grpc.v1; + +namespace Dapr.SecretsManagement; + +/// +/// A gRPC-backed implementation of that communicates with the +/// Dapr sidecar to retrieve secrets from configured secret store components. +/// +internal sealed class DaprSecretsManagementGrpcClient( + Autogenerated.Dapr.DaprClient client, + HttpClient httpClient, + string? daprApiToken = null) + : DaprSecretsManagementClient(client, httpClient, daprApiToken: daprApiToken) +{ + /// + public override async Task> GetSecretAsync( + string storeName, + string key, + IReadOnlyDictionary? metadata = null, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(storeName); + ArgumentException.ThrowIfNullOrEmpty(key); + + var envelope = new Autogenerated.GetSecretRequest + { + StoreName = storeName, + Key = key + }; + + if (metadata is not null) + { + foreach (var kvp in metadata) + { + envelope.Metadata.Add(kvp.Key, kvp.Value); + } + } + + var callOptions = DaprClientUtilities.ConfigureGrpcCallOptions( + typeof(DaprSecretsManagementClient).Assembly, + this.DaprApiToken, + cancellationToken); + + try + { + var response = await Client.GetSecretAsync(envelope, callOptions).ConfigureAwait(false); + return response.Data.ToDictionary(kv => kv.Key, kv => kv.Value); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + throw; + } + catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled && cancellationToken.IsCancellationRequested) + { + throw new OperationCanceledException(cancellationToken); + } + catch (Exception ex) + { + throw new DaprException( + "Get secret operation failed: the Dapr endpoint indicated a failure. See InnerException for details.", + ex); + } + } + + /// + public override async Task>> GetBulkSecretAsync( + string storeName, + IReadOnlyDictionary? metadata = null, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(storeName); + + var envelope = new Autogenerated.GetBulkSecretRequest + { + StoreName = storeName + }; + + if (metadata is not null) + { + foreach (var kvp in metadata) + { + envelope.Metadata.Add(kvp.Key, kvp.Value); + } + } + + var callOptions = DaprClientUtilities.ConfigureGrpcCallOptions( + typeof(DaprSecretsManagementClient).Assembly, + this.DaprApiToken, + cancellationToken); + + try + { + var response = await Client.GetBulkSecretAsync(envelope, callOptions).ConfigureAwait(false); + return response.Data.ToDictionary( + r => r.Key, + r => (IReadOnlyDictionary)r.Value.Secrets.ToDictionary(s => s.Key, s => s.Value)); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + throw; + } + catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled && cancellationToken.IsCancellationRequested) + { + throw new OperationCanceledException(cancellationToken); + } + catch (Exception ex) + { + throw new DaprException( + "Bulk secret operation failed: the Dapr endpoint indicated a failure. See InnerException for details.", + ex); + } + } + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + this.HttpClient.Dispose(); + } + } +} diff --git a/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementBuilder.cs b/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementBuilder.cs new file mode 100644 index 000000000..8719856ea --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementBuilder.cs @@ -0,0 +1,28 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Microsoft.Extensions.DependencyInjection; + +namespace Dapr.SecretsManagement.Extensions; + +/// +/// Used by the fluent registration builder to configure a Dapr Secrets Management client. +/// +/// The service collection to register services with. +public sealed class DaprSecretsManagementBuilder(IServiceCollection services) : IDaprSecretsManagementBuilder +{ + /// + /// Gets the registered services on the builder. + /// + public IServiceCollection Services { get; } = services; +} diff --git a/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementServiceCollectionExtensions.cs b/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementServiceCollectionExtensions.cs new file mode 100644 index 000000000..bc5b50258 --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/Extensions/DaprSecretsManagementServiceCollectionExtensions.cs @@ -0,0 +1,39 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.Common.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Dapr.SecretsManagement.Extensions; + +/// +/// Contains extension methods for using Dapr Secrets Management with dependency injection. +/// +public static class DaprSecretsManagementServiceCollectionExtensions +{ + /// + /// Adds Dapr Secrets Management client support to the service collection. + /// + /// The to add services to. + /// + /// An optional callback used to configure the with injected services. + /// + /// The lifetime of the registered services. Defaults to . + /// An that can be used for further configuration. + public static IDaprSecretsManagementBuilder AddDaprSecretsManagementClient( + this IServiceCollection services, + Action? configure = null, + ServiceLifetime lifetime = ServiceLifetime.Singleton) => + services.AddDaprClient( + configure, lifetime); +} diff --git a/src/Dapr.SecretsManagement.Runtime/IDaprSecretsManagementBuilder.cs b/src/Dapr.SecretsManagement.Runtime/IDaprSecretsManagementBuilder.cs new file mode 100644 index 000000000..e05c81eea --- /dev/null +++ b/src/Dapr.SecretsManagement.Runtime/IDaprSecretsManagementBuilder.cs @@ -0,0 +1,22 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.Common; +using Microsoft.Extensions.DependencyInjection; + +namespace Dapr.SecretsManagement; + +/// +/// Responsible for registering Dapr Secrets Management service functionality. +/// +public interface IDaprSecretsManagementBuilder : IDaprServiceBuilder; diff --git a/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj new file mode 100644 index 000000000..aba09f7ad --- /dev/null +++ b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj @@ -0,0 +1,181 @@ + + + + true + Dapr.SecretsManagement + Provides a purpose-specific client, source generator, and DI integration for working with Dapr secret stores in .NET applications + + + true + + + false + + + true + + + $(NoWarn);NU5128 + + + false + + + + $(TargetsForTfmSpecificContentInPackage); + _BuildChildrenForCurrentTFM; + _CollectChildOutputsForCurrentTFM; + _AddAnalyzerOnce + + + + $(TargetsForPack);_BuildGeneratorOnce;_AddAnalyzer + + + + + + <_ExpectedDirectoryBuildProps>$(MSBuildProjectDirectory)\..\Directory.Build.props + + + + + + + + + + + + + + + + + + + + + + + + + + <_EffectiveTfmFolder>$(NuGetTargetFrameworkFolderName) + <_EffectiveTfmFolder Condition="'$(_EffectiveTfmFolder)'==''">$(TargetFramework) + + + + + + + + <_ChildDll Include="@(_BuiltChildOutputs)" Condition="'%(_BuiltChildOutputs.Extension)'=='.dll'" /> + + + <_ChildXml Include="%(_ChildDll.RootDir)%(_ChildDll.Directory)%(_ChildDll.Filename).xml" + Condition="Exists('%(_ChildDll.RootDir)%(_ChildDll.Directory)%(_ChildDll.Filename).xml')" /> + <_ChildPdb Include="%(_ChildDll.RootDir)%(_ChildDll.Directory)%(_ChildDll.Filename).pdb" + Condition="Exists('%(_ChildDll.RootDir)%(_ChildDll.Directory)%(_ChildDll.Filename).pdb')" /> + + + + $(TargetFramework) + lib/$(_EffectiveTfmFolder)/%(_ChildDll.Filename)%(_ChildDll.Extension) + + + + $(TargetFramework) + lib/$(_EffectiveTfmFolder)/%(_ChildXml.Filename).xml + + + + $(TargetFramework) + lib/$(_EffectiveTfmFolder)/%(_ChildPdb.Filename).pdb + + + + + + + + + <_IsFirstTfm Condition="'$(TargetFramework)' == 'net8.0'">true + + + + + + + + + + + + + + + + + <_AddAnalyzer Condition="'$(TargetFramework)' == 'net8.0'">true + + + + + $(TargetFramework) + analyzers/dotnet/cs/%(_AnalyzerOut.Filename)%(_AnalyzerOut.Extension) + + + + + + + + + + + + + + + + + + <_IsFirstTfm Condition="'$(TargetFramework)' == 'net8.0'">true + + + + + + + + + + + + diff --git a/test/Dapr.SecretsManagement.Runtime.Test/Dapr.SecretsManagement.Runtime.Test.csproj b/test/Dapr.SecretsManagement.Runtime.Test/Dapr.SecretsManagement.Runtime.Test.csproj new file mode 100644 index 000000000..4561e68b0 --- /dev/null +++ b/test/Dapr.SecretsManagement.Runtime.Test/Dapr.SecretsManagement.Runtime.Test.csproj @@ -0,0 +1,29 @@ + + + + enable + enable + false + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + diff --git a/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementClientBuilderTests.cs b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementClientBuilderTests.cs new file mode 100644 index 000000000..b32e1e998 --- /dev/null +++ b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementClientBuilderTests.cs @@ -0,0 +1,101 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using System.Text.Json; +using Grpc.Net.Client; + +namespace Dapr.SecretsManagement.Test; + +public sealed class DaprSecretsManagementClientBuilderTests +{ + [Fact] + public void Builder_UsesPropertyNameCaseInsensitiveByDefault() + { + var builder = new DaprSecretsManagementClientBuilder(); + Assert.True(builder.JsonSerializerOptions.PropertyNameCaseInsensitive); + } + + [Fact] + public void Builder_UsesPropertyNameCaseHandlingAsSpecified() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseJsonSerializationOptions(new JsonSerializerOptions + { + PropertyNameCaseInsensitive = false + }); + Assert.False(builder.JsonSerializerOptions.PropertyNameCaseInsensitive); + } + + [Fact] + public void Builder_UsesThrowOperationCanceledOnCancellation_ByDefault() + { + var builder = new DaprSecretsManagementClientBuilder(); + _ = builder.Build(); + Assert.True(builder.GrpcChannelOptions.ThrowOperationCanceledOnCancellation); + } + + [Fact] + public void Builder_DoesNotOverrideUserGrpcChannelOptions() + { + var builder = new DaprSecretsManagementClientBuilder(); + _ = builder.UseGrpcChannelOptions(new GrpcChannelOptions()).Build(); + Assert.False(builder.GrpcChannelOptions.ThrowOperationCanceledOnCancellation); + } + + [Fact] + public void Builder_ValidatesGrpcEndpointScheme() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseGrpcEndpoint("ftp://example.com"); + + var ex = Assert.Throws(() => builder.Build()); + Assert.Equal("The gRPC endpoint must use http or https.", ex.Message); + } + + [Fact] + public void Builder_ValidatesHttpEndpointScheme() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseHttpEndpoint("ftp://example.com"); + + var ex = Assert.Throws(() => builder.Build()); + Assert.Equal("The HTTP endpoint must use http or https.", ex.Message); + } + + [Fact] + public void Builder_SetsApiToken() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseDaprApiToken("test_token"); + _ = builder.Build(); + Assert.Equal("test_token", builder.DaprApiToken); + } + + [Fact] + public void Builder_SetsNullApiToken() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseDaprApiToken(null!); + _ = builder.Build(); + Assert.Null(builder.DaprApiToken); + } + + [Fact] + public void Builder_SetsTimeout() + { + var builder = new DaprSecretsManagementClientBuilder(); + builder.UseTimeout(TimeSpan.FromSeconds(2)); + _ = builder.Build(); + Assert.Equal(2, builder.Timeout.Seconds); + } +} diff --git a/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementGrpcClientTests.cs b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementGrpcClientTests.cs new file mode 100644 index 000000000..1856c27fc --- /dev/null +++ b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementGrpcClientTests.cs @@ -0,0 +1,100 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Moq; + +namespace Dapr.SecretsManagement.Test; + +public sealed class DaprSecretsManagementGrpcClientTests +{ + [Fact] + public async Task GetSecretAsync_ThrowsOnNullStoreName() + { + var mockClient = Mock.Of(); + var httpClient = Mock.Of(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + await Assert.ThrowsAsync(async () => + { + await client.GetSecretAsync(null!, "my-key", cancellationToken: TestContext.Current.CancellationToken); + }); + } + + [Fact] + public async Task GetSecretAsync_ThrowsOnNullKey() + { + var mockClient = Mock.Of(); + var httpClient = Mock.Of(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + await Assert.ThrowsAsync(async () => + { + await client.GetSecretAsync("my-store", null!, cancellationToken: TestContext.Current.CancellationToken); + }); + } + + [Fact] + public async Task GetSecretAsync_ThrowsOnEmptyKey() + { + var mockClient = Mock.Of(); + var httpClient = Mock.Of(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + await Assert.ThrowsAsync(async () => + { + await client.GetSecretAsync("my-store", "", cancellationToken: TestContext.Current.CancellationToken); + }); + } + + [Fact] + public async Task GetBulkSecretAsync_ThrowsOnNullStoreName() + { + var mockClient = Mock.Of(); + var httpClient = Mock.Of(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + await Assert.ThrowsAsync(async () => + { + await client.GetBulkSecretAsync(null!, cancellationToken: TestContext.Current.CancellationToken); + }); + } + + [Fact] + public void Dispose_CanBeCalledWithoutException() + { + var mockClient = Mock.Of(); + var httpClient = new HttpClient(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + // Should not throw. + client.Dispose(); + } + + [Fact] + public void Dispose_IsIdempotent() + { + var mockClient = Mock.Of(); + var httpClient = new HttpClient(); + + var client = new DaprSecretsManagementGrpcClient(mockClient, httpClient, null); + + // Calling Dispose multiple times should not throw. + client.Dispose(); + client.Dispose(); + } +} diff --git a/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementServiceCollectionExtensionsTests.cs b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementServiceCollectionExtensionsTests.cs new file mode 100644 index 000000000..1aff866d3 --- /dev/null +++ b/test/Dapr.SecretsManagement.Runtime.Test/DaprSecretsManagementServiceCollectionExtensionsTests.cs @@ -0,0 +1,54 @@ +// ------------------------------------------------------------------------ +// Copyright 2026 The Dapr Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + +using Dapr.SecretsManagement.Extensions; +using Microsoft.Extensions.DependencyInjection; + +namespace Dapr.SecretsManagement.Test; + +public sealed class DaprSecretsManagementServiceCollectionExtensionsTests +{ + [Fact] + public void AddDaprSecretsManagementClient_RegistersClientInServiceCollection() + { + var services = new ServiceCollection(); + var builder = services.AddDaprSecretsManagementClient(); + + Assert.NotNull(builder); + Assert.IsAssignableFrom(builder); + + var descriptor = services.FirstOrDefault(sd => sd.ServiceType == typeof(DaprSecretsManagementClient)); + Assert.NotNull(descriptor); + Assert.Equal(ServiceLifetime.Singleton, descriptor.Lifetime); + } + + [Fact] + public void AddDaprSecretsManagementClient_RespectsCustomLifetime() + { + var services = new ServiceCollection(); + services.AddDaprSecretsManagementClient(lifetime: ServiceLifetime.Transient); + + var descriptor = services.FirstOrDefault(sd => sd.ServiceType == typeof(DaprSecretsManagementClient)); + Assert.NotNull(descriptor); + Assert.Equal(ServiceLifetime.Transient, descriptor.Lifetime); + } + + [Fact] + public void AddDaprSecretsManagementClient_BuilderExposesSameServices() + { + var services = new ServiceCollection(); + var builder = services.AddDaprSecretsManagementClient(); + + Assert.Same(services, builder.Services); + } +} From 8514d77ab1f30bdf73bbef0eb04660ef312f5792 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:05:20 +0000 Subject: [PATCH 2/3] fix: Remove duplicate _BuildGeneratorIfFirstTFM target from aggregator csproj Agent-Logs-Url: https://github.com/dapr/dotnet-sdk/sessions/db970aa7-6b0c-450f-93f9-878185757985 Co-authored-by: WhitWaldo <2238529+WhitWaldo@users.noreply.github.com> --- .../Dapr.SecretsManagement.csproj | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj index aba09f7ad..10598951b 100644 --- a/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj +++ b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj @@ -156,25 +156,6 @@ Properties="Configuration=$(Configuration);TargetFramework=netstandard2.0" /> - - - - - - <_IsFirstTfm Condition="'$(TargetFramework)' == 'net8.0'">true - - - - - - - - From ff244d81975110bbc0cdef838205136b0f1ccaf8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:52:21 +0000 Subject: [PATCH 3/3] Address PR review feedback: standardize port, enable typed example, narrow public API, fix diagnostics, hash-based hint names - Standardize example port to 6543 (launchSettings.json + README.md) - Uncomment and wire up Example 3 (typed secret store via source generator) - Make WellKnownSecrets internal to narrow public API surface - Change diagnostic ID from DAPRSEC001 to DAPR1601 (consistent with DAPRxxyy convention) - Fix diagnostic message to reference Dapr.SecretsManagement (not the internal Abstractions sub-package) - Use FNV-1a hash of FQN for hint names to avoid collisions across namespaces - Simplify NuGet package description Agent-Logs-Url: https://github.com/dapr/dotnet-sdk/sessions/a7a790c9-bd31-4dd6-aad6-142a0b6d9c83 Co-authored-by: WhitWaldo <2238529+WhitWaldo@users.noreply.github.com> --- examples/SecretManagement/README.md | 3 +- .../SecretManagementSample/Program.cs | 36 ++++++++----------- .../Properties/launchSettings.json | 2 +- .../WellKnownSecrets.cs | 2 +- .../SecretStoreSourceGenerator.cs | 27 +++++++++++--- .../Dapr.SecretsManagement.csproj | 2 +- 6 files changed, 42 insertions(+), 30 deletions(-) diff --git a/examples/SecretManagement/README.md b/examples/SecretManagement/README.md index f9c09f6f9..9e523c8ba 100644 --- a/examples/SecretManagement/README.md +++ b/examples/SecretManagement/README.md @@ -17,7 +17,7 @@ This sample demonstrates how to use the Dapr Secrets Management SDK to retrieve ## Running the Sample ```bash -dapr run --app-id secret-sample --app-port 5234 -- dotnet run +dapr run --app-id secret-sample --app-port 6543 -- dotnet run ``` ## Endpoints @@ -26,6 +26,7 @@ dapr run --app-id secret-sample --app-port 5234 -- dotnet run |--------|------|-------------| | GET | `/secrets/{storeName}/{key}` | Retrieve a single secret by key | | GET | `/secrets/{storeName}` | Retrieve all secrets from a store | +| GET | `/typed-secrets` | Retrieve secrets using the source-generated typed store | ## NuGet Package Note diff --git a/examples/SecretManagement/SecretManagementSample/Program.cs b/examples/SecretManagement/SecretManagementSample/Program.cs index c8e8a3d45..963a5be7b 100644 --- a/examples/SecretManagement/SecretManagementSample/Program.cs +++ b/examples/SecretManagement/SecretManagementSample/Program.cs @@ -13,20 +13,14 @@ using Dapr.SecretsManagement; using Dapr.SecretsManagement.Extensions; +using SecretManagementSample; var builder = WebApplication.CreateBuilder(args); -// Register the Dapr Secrets Management client with dependency injection. -// This makes DaprSecretsManagementClient available throughout the application. -builder.Services.AddDaprSecretsManagementClient(); - -// If you've defined a typed secret store interface with [SecretStore] and the source generator, -// you can register it here. For example: -// -// builder.Services.AddDaprSecretsManagementClient() -// .AddMyVaultSecrets(); // Generated extension method -// -// See IMyVaultSecrets.cs for the typed secret store interface definition. +// Register the Dapr Secrets Management client and the source-generated typed secret store. +// AddMyVaultSecrets() is a generated extension method — see IMyVaultSecrets.cs. +builder.Services.AddDaprSecretsManagementClient() + .AddMyVaultSecrets(); var app = builder.Build(); @@ -51,16 +45,14 @@ return Results.Ok(secrets); }); -// --- Example 3: Using typed secret store (source-generated) --- -// If you have registered a typed secret store (see IMyVaultSecrets.cs), you can inject it directly: -// -// app.MapGet("/typed-secrets", (IMyVaultSecrets secrets) => -// { -// return Results.Ok(new -// { -// DatabaseConnection = secrets.DatabaseConnection, -// ApiKey = secrets.ApiKey -// }); -// }); +// --- Example 3: Using the source-generated typed secret store --- +app.MapGet("/typed-secrets", (SecretManagementSample.IMyVaultSecrets secrets) => +{ + return Results.Ok(new + { + DatabaseConnection = secrets.DatabaseConnection, + ApiKey = secrets.ApiKey + }); +}); app.Run(); diff --git a/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json b/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json index c36e6a28f..33cfac2df 100644 --- a/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json +++ b/examples/SecretManagement/SecretManagementSample/Properties/launchSettings.json @@ -4,7 +4,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": false, - "applicationUrl": "http://localhost:5234", + "applicationUrl": "http://localhost:6543", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs b/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs index 3ca22eca8..909f50303 100644 --- a/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs +++ b/src/Dapr.SecretsManagement.Abstractions/WellKnownSecrets.cs @@ -16,7 +16,7 @@ namespace Dapr.SecretsManagement.Abstractions; /// /// Well-known names and constants related to Dapr Secrets Management. /// -public static class WellKnownSecrets +internal static class WellKnownSecrets { /// /// The fully qualified name of . diff --git a/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs b/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs index ac86d5fe5..89d032f02 100644 --- a/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs +++ b/src/Dapr.SecretsManagement.Generators/SecretStoreSourceGenerator.cs @@ -51,10 +51,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context) { spc.ReportDiagnostic(Diagnostic.Create( new DiagnosticDescriptor( - "DAPRSEC001", + "DAPR1601", "SecretStore attribute not found", - "The source generator could not find the type '" + SecretStoreAttributeFullName + - "'. Ensure that Dapr.SecretsManagement.Abstractions is properly referenced.", + "The source generator could not find the SecretStoreAttribute type. " + + "Ensure that the Dapr.SecretsManagement package is properly referenced.", "Dapr.SecretsManagement", DiagnosticSeverity.Warning, isEnabledByDefault: true), @@ -143,7 +143,8 @@ public void Initialize(IncrementalGeneratorInitializationContext context) interfaceSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), properties); - var hintName = (namespaceName is not null ? namespaceName + "." : "") + implName + ".g.cs"; + var fqn = interfaceSymbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat); + var hintName = implName + "_" + GetStableHash(fqn).ToString("X8") + ".g.cs"; spc.AddSource(hintName, source); }); } @@ -286,4 +287,22 @@ private static string EscapeCSharpString(string value) => private static string EscapeXml(string value) => value.Replace("&", "&").Replace("<", "<").Replace(">", ">"); + + /// + /// Produces a stable, deterministic 32-bit hash from the given string. + /// Used to generate unique hint names when multiple types share the same simple name + /// across different namespaces. + /// + private static uint GetStableHash(string text) + { + unchecked + { + uint hash = 2166136261; + foreach (var ch in text) + { + hash = (hash ^ ch) * 16777619; + } + return hash; + } + } } diff --git a/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj index 10598951b..6bfabacb1 100644 --- a/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj +++ b/src/Dapr.SecretsManagement/Dapr.SecretsManagement.csproj @@ -3,7 +3,7 @@ true Dapr.SecretsManagement - Provides a purpose-specific client, source generator, and DI integration for working with Dapr secret stores in .NET applications + Dapr Secrets Management SDK for .NET true