From e6ac8ebf333a938d41197780d24ff674b8921cf9 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 8 Apr 2025 02:51:46 +0000 Subject: [PATCH 1/9] Scaffolding out a MCP Inspector resource This is only designed to work with SSE transport type, as it will configure that through Aspire. If you want to use SSE, you can still launch it, but it will require some manual configuration in the inspector UI once started. Currently it runs the inspector via `npx`, since there's no docker image available. Fixes #622 --- CommunityToolkit.Aspire.sln | 1252 +++++++++++++++++ Directory.Packages.props | 10 +- docs/diagnostics.md | 4 + ...Aspire.Hosting.McpInspector.AppHost.csproj | 22 + .../Program.cs | 9 + .../Properties/launchSettings.json | 29 + .../appsettings.json | 9 + ...pire.Hosting.McpInspector.McpServer.csproj | 6 + .../Program.cs | 21 + .../Properties/launchSettings.json | 23 + .../appsettings.json | 9 + ...Toolkit.Aspire.Hosting.McpInspector.csproj | 11 + .../McpInspectorResource.cs | 15 + .../McpInspectorResourceBuilderExtensions.cs | 49 + 14 files changed, 1463 insertions(+), 6 deletions(-) create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Program.cs create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Properties/launchSettings.json create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/appsettings.json create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Properties/launchSettings.json create mode 100644 examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/appsettings.json create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs diff --git a/CommunityToolkit.Aspire.sln b/CommunityToolkit.Aspire.sln index fbdb2aa9..f14fb2d9 100644 --- a/CommunityToolkit.Aspire.sln +++ b/CommunityToolkit.Aspire.sln @@ -373,612 +373,1860 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hos EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6.Tests", "tests\CommunityToolkit.Aspire.Hosting.k6.Tests\CommunityToolkit.Aspire.Hosting.k6.Tests.csproj", "{CCFE3593-49A7-4F03-A329-687490CD0143}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector", "src\CommunityToolkit.Aspire.Hosting.McpInspector\CommunityToolkit.Aspire.Hosting.McpInspector.csproj", "{A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mcp-inspector", "mcp-inspector", "{0CE3C255-7FF4-EA80-717A-A208DB412F1A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector.AppHost", "examples\mcp-inspector\CommunityToolkit.Aspire.Hosting.McpInspector.AppHost\CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj", "{DF023DD5-1158-4E2D-B542-21AF2E387428}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector.McpServer", "examples\mcp-inspector\CommunityToolkit.Aspire.Hosting.McpInspector.McpServer\CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj", "{F43484E3-6D87-476D-AD21-AB880C65B6C2}" +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 {DAA67050-44B3-458F-9818-5877D606866A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DAA67050-44B3-458F-9818-5877D606866A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x64.ActiveCfg = Debug|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x64.Build.0 = Debug|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x86.ActiveCfg = Debug|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x86.Build.0 = Debug|Any CPU {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.ActiveCfg = Release|Any CPU {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.Build.0 = Release|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Release|x64.ActiveCfg = Release|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Release|x64.Build.0 = Release|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Release|x86.ActiveCfg = Release|Any CPU + {DAA67050-44B3-458F-9818-5877D606866A}.Release|x86.Build.0 = Release|Any CPU {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x64.ActiveCfg = Debug|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x64.Build.0 = Debug|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x86.Build.0 = Debug|Any CPU {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|Any CPU.ActiveCfg = Release|Any CPU {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|Any CPU.Build.0 = Release|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x64.ActiveCfg = Release|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x64.Build.0 = Release|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x86.ActiveCfg = Release|Any CPU + {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x86.Build.0 = Release|Any CPU {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x64.Build.0 = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x86.Build.0 = Debug|Any CPU {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.Build.0 = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x64.ActiveCfg = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x64.Build.0 = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x86.ActiveCfg = Release|Any CPU + {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x86.Build.0 = Release|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x64.ActiveCfg = Debug|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x64.Build.0 = Debug|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x86.ActiveCfg = Debug|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x86.Build.0 = Debug|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|Any CPU.Build.0 = Release|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x64.ActiveCfg = Release|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x64.Build.0 = Release|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x86.ActiveCfg = Release|Any CPU + {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x86.Build.0 = Release|Any CPU {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x64.ActiveCfg = Debug|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x64.Build.0 = Debug|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x86.Build.0 = Debug|Any CPU {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|Any CPU.ActiveCfg = Release|Any CPU {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|Any CPU.Build.0 = Release|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x64.ActiveCfg = Release|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x64.Build.0 = Release|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x86.ActiveCfg = Release|Any CPU + {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x86.Build.0 = Release|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x64.ActiveCfg = Debug|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x64.Build.0 = Debug|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x86.ActiveCfg = Debug|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x86.Build.0 = Debug|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.ActiveCfg = Release|Any CPU {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.Build.0 = Release|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x64.ActiveCfg = Release|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x64.Build.0 = Release|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x86.ActiveCfg = Release|Any CPU + {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x86.Build.0 = Release|Any CPU {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x64.ActiveCfg = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x64.Build.0 = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x86.Build.0 = Debug|Any CPU {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.ActiveCfg = Release|Any CPU {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.Build.0 = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x64.ActiveCfg = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x64.Build.0 = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x86.ActiveCfg = Release|Any CPU + {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x86.Build.0 = Release|Any CPU {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x64.ActiveCfg = Debug|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x64.Build.0 = Debug|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x86.ActiveCfg = Debug|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x86.Build.0 = Debug|Any CPU {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|Any CPU.Build.0 = Release|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x64.ActiveCfg = Release|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x64.Build.0 = Release|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x86.ActiveCfg = Release|Any CPU + {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x86.Build.0 = Release|Any CPU {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x64.Build.0 = Debug|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x86.Build.0 = Debug|Any CPU {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|Any CPU.Build.0 = Release|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x64.ActiveCfg = Release|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x64.Build.0 = Release|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x86.ActiveCfg = Release|Any CPU + {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x86.Build.0 = Release|Any CPU {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x64.ActiveCfg = Debug|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x64.Build.0 = Debug|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x86.ActiveCfg = Debug|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x86.Build.0 = Debug|Any CPU {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|Any CPU.ActiveCfg = Release|Any CPU {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|Any CPU.Build.0 = Release|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x64.ActiveCfg = Release|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x64.Build.0 = Release|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x86.ActiveCfg = Release|Any CPU + {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x86.Build.0 = Release|Any CPU {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x64.ActiveCfg = Debug|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x64.Build.0 = Debug|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x86.ActiveCfg = Debug|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x86.Build.0 = Debug|Any CPU {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|Any CPU.ActiveCfg = Release|Any CPU {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|Any CPU.Build.0 = Release|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x64.ActiveCfg = Release|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x64.Build.0 = Release|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x86.ActiveCfg = Release|Any CPU + {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x86.Build.0 = Release|Any CPU {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x64.ActiveCfg = Debug|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x64.Build.0 = Debug|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x86.ActiveCfg = Debug|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x86.Build.0 = Debug|Any CPU {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|Any CPU.ActiveCfg = Release|Any CPU {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|Any CPU.Build.0 = Release|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x64.ActiveCfg = Release|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x64.Build.0 = Release|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x86.ActiveCfg = Release|Any CPU + {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x86.Build.0 = Release|Any CPU {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x64.ActiveCfg = Debug|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x64.Build.0 = Debug|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x86.ActiveCfg = Debug|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x86.Build.0 = Debug|Any CPU {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|Any CPU.ActiveCfg = Release|Any CPU {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|Any CPU.Build.0 = Release|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x64.ActiveCfg = Release|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x64.Build.0 = Release|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x86.ActiveCfg = Release|Any CPU + {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x86.Build.0 = Release|Any CPU {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x64.Build.0 = Debug|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x86.Build.0 = Debug|Any CPU {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|Any CPU.Build.0 = Release|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x64.ActiveCfg = Release|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x64.Build.0 = Release|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x86.ActiveCfg = Release|Any CPU + {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x86.Build.0 = Release|Any CPU {E8F93376-1367-4A7B-A729-116199804356}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8F93376-1367-4A7B-A729-116199804356}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Debug|x64.ActiveCfg = Debug|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Debug|x64.Build.0 = Debug|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Debug|x86.ActiveCfg = Debug|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Debug|x86.Build.0 = Debug|Any CPU {E8F93376-1367-4A7B-A729-116199804356}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8F93376-1367-4A7B-A729-116199804356}.Release|Any CPU.Build.0 = Release|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Release|x64.ActiveCfg = Release|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Release|x64.Build.0 = Release|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Release|x86.ActiveCfg = Release|Any CPU + {E8F93376-1367-4A7B-A729-116199804356}.Release|x86.Build.0 = Release|Any CPU {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x64.Build.0 = Debug|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x86.Build.0 = Debug|Any CPU {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|Any CPU.Build.0 = Release|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x64.ActiveCfg = Release|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x64.Build.0 = Release|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x86.ActiveCfg = Release|Any CPU + {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x86.Build.0 = Release|Any CPU {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x64.Build.0 = Debug|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x86.Build.0 = Debug|Any CPU {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|Any CPU.Build.0 = Release|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x64.ActiveCfg = Release|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x64.Build.0 = Release|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x86.ActiveCfg = Release|Any CPU + {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x86.Build.0 = Release|Any CPU {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x64.ActiveCfg = Debug|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x64.Build.0 = Debug|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x86.Build.0 = Debug|Any CPU {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|Any CPU.ActiveCfg = Release|Any CPU {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|Any CPU.Build.0 = Release|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x64.ActiveCfg = Release|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x64.Build.0 = Release|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x86.ActiveCfg = Release|Any CPU + {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x86.Build.0 = Release|Any CPU {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x64.Build.0 = Debug|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x86.Build.0 = Debug|Any CPU {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|Any CPU.Build.0 = Release|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x64.ActiveCfg = Release|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x64.Build.0 = Release|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x86.ActiveCfg = Release|Any CPU + {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x86.Build.0 = Release|Any CPU {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x64.ActiveCfg = Debug|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x64.Build.0 = Debug|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x86.Build.0 = Debug|Any CPU {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|Any CPU.Build.0 = Release|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x64.ActiveCfg = Release|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x64.Build.0 = Release|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x86.ActiveCfg = Release|Any CPU + {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x86.Build.0 = Release|Any CPU {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x64.ActiveCfg = Debug|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x64.Build.0 = Debug|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x86.ActiveCfg = Debug|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x86.Build.0 = Debug|Any CPU {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|Any CPU.ActiveCfg = Release|Any CPU {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|Any CPU.Build.0 = Release|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x64.ActiveCfg = Release|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x64.Build.0 = Release|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x86.ActiveCfg = Release|Any CPU + {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x86.Build.0 = Release|Any CPU {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x64.ActiveCfg = Debug|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x64.Build.0 = Debug|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x86.ActiveCfg = Debug|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x86.Build.0 = Debug|Any CPU {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|Any CPU.ActiveCfg = Release|Any CPU {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|Any CPU.Build.0 = Release|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x64.ActiveCfg = Release|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x64.Build.0 = Release|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x86.ActiveCfg = Release|Any CPU + {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x86.Build.0 = Release|Any CPU {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x64.ActiveCfg = Debug|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x64.Build.0 = Debug|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x86.ActiveCfg = Debug|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x86.Build.0 = Debug|Any CPU {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|Any CPU.ActiveCfg = Release|Any CPU {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|Any CPU.Build.0 = Release|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x64.ActiveCfg = Release|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x64.Build.0 = Release|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x86.ActiveCfg = Release|Any CPU + {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x86.Build.0 = Release|Any CPU {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x64.ActiveCfg = Debug|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x64.Build.0 = Debug|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x86.ActiveCfg = Debug|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x86.Build.0 = Debug|Any CPU {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|Any CPU.ActiveCfg = Release|Any CPU {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|Any CPU.Build.0 = Release|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x64.ActiveCfg = Release|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x64.Build.0 = Release|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x86.ActiveCfg = Release|Any CPU + {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x86.Build.0 = Release|Any CPU {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x64.ActiveCfg = Debug|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x64.Build.0 = Debug|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x86.ActiveCfg = Debug|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x86.Build.0 = Debug|Any CPU {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|Any CPU.ActiveCfg = Release|Any CPU {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|Any CPU.Build.0 = Release|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x64.ActiveCfg = Release|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x64.Build.0 = Release|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x86.ActiveCfg = Release|Any CPU + {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x86.Build.0 = Release|Any CPU {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x64.ActiveCfg = Debug|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x64.Build.0 = Debug|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x86.ActiveCfg = Debug|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x86.Build.0 = Debug|Any CPU {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|Any CPU.Build.0 = Release|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x64.ActiveCfg = Release|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x64.Build.0 = Release|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x86.ActiveCfg = Release|Any CPU + {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x86.Build.0 = Release|Any CPU {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x64.ActiveCfg = Debug|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x64.Build.0 = Debug|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x86.ActiveCfg = Debug|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x86.Build.0 = Debug|Any CPU {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|Any CPU.ActiveCfg = Release|Any CPU {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|Any CPU.Build.0 = Release|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x64.ActiveCfg = Release|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x64.Build.0 = Release|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x86.ActiveCfg = Release|Any CPU + {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x86.Build.0 = Release|Any CPU {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x64.Build.0 = Debug|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x86.Build.0 = Debug|Any CPU {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|Any CPU.Build.0 = Release|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x64.ActiveCfg = Release|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x64.Build.0 = Release|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x86.ActiveCfg = Release|Any CPU + {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x86.Build.0 = Release|Any CPU {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x64.ActiveCfg = Debug|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x64.Build.0 = Debug|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x86.ActiveCfg = Debug|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x86.Build.0 = Debug|Any CPU {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|Any CPU.ActiveCfg = Release|Any CPU {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|Any CPU.Build.0 = Release|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x64.ActiveCfg = Release|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x64.Build.0 = Release|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x86.ActiveCfg = Release|Any CPU + {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x86.Build.0 = Release|Any CPU {0AACC135-9624-423D-8988-69701C0FE428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AACC135-9624-423D-8988-69701C0FE428}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x64.ActiveCfg = Debug|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x64.Build.0 = Debug|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x86.ActiveCfg = Debug|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x86.Build.0 = Debug|Any CPU {0AACC135-9624-423D-8988-69701C0FE428}.Release|Any CPU.ActiveCfg = Release|Any CPU {0AACC135-9624-423D-8988-69701C0FE428}.Release|Any CPU.Build.0 = Release|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Release|x64.ActiveCfg = Release|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Release|x64.Build.0 = Release|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Release|x86.ActiveCfg = Release|Any CPU + {0AACC135-9624-423D-8988-69701C0FE428}.Release|x86.Build.0 = Release|Any CPU {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x64.Build.0 = Debug|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x86.Build.0 = Debug|Any CPU {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|Any CPU.Build.0 = Release|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x64.ActiveCfg = Release|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x64.Build.0 = Release|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x86.ActiveCfg = Release|Any CPU + {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x86.Build.0 = Release|Any CPU {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x64.Build.0 = Debug|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x86.ActiveCfg = Debug|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x86.Build.0 = Debug|Any CPU {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|Any CPU.Build.0 = Release|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x64.ActiveCfg = Release|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x64.Build.0 = Release|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x86.ActiveCfg = Release|Any CPU + {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x86.Build.0 = Release|Any CPU {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x64.ActiveCfg = Debug|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x64.Build.0 = Debug|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x86.ActiveCfg = Debug|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x86.Build.0 = Debug|Any CPU {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|Any CPU.ActiveCfg = Release|Any CPU {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|Any CPU.Build.0 = Release|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x64.ActiveCfg = Release|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x64.Build.0 = Release|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x86.ActiveCfg = Release|Any CPU + {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x86.Build.0 = Release|Any CPU {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x64.ActiveCfg = Debug|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x64.Build.0 = Debug|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x86.ActiveCfg = Debug|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x86.Build.0 = Debug|Any CPU {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|Any CPU.ActiveCfg = Release|Any CPU {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|Any CPU.Build.0 = Release|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x64.ActiveCfg = Release|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x64.Build.0 = Release|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x86.ActiveCfg = Release|Any CPU + {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x86.Build.0 = Release|Any CPU {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x64.ActiveCfg = Debug|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x64.Build.0 = Debug|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x86.ActiveCfg = Debug|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x86.Build.0 = Debug|Any CPU {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|Any CPU.Build.0 = Release|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x64.ActiveCfg = Release|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x64.Build.0 = Release|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x86.ActiveCfg = Release|Any CPU + {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x86.Build.0 = Release|Any CPU {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x64.ActiveCfg = Debug|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x64.Build.0 = Debug|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x86.Build.0 = Debug|Any CPU {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|Any CPU.Build.0 = Release|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x64.ActiveCfg = Release|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x64.Build.0 = Release|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x86.ActiveCfg = Release|Any CPU + {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x86.Build.0 = Release|Any CPU {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x64.ActiveCfg = Debug|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x64.Build.0 = Debug|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x86.Build.0 = Debug|Any CPU {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|Any CPU.Build.0 = Release|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x64.ActiveCfg = Release|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x64.Build.0 = Release|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x86.ActiveCfg = Release|Any CPU + {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x86.Build.0 = Release|Any CPU {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x64.ActiveCfg = Debug|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x64.Build.0 = Debug|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x86.ActiveCfg = Debug|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x86.Build.0 = Debug|Any CPU {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|Any CPU.ActiveCfg = Release|Any CPU {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|Any CPU.Build.0 = Release|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x64.ActiveCfg = Release|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x64.Build.0 = Release|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x86.ActiveCfg = Release|Any CPU + {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x86.Build.0 = Release|Any CPU {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x64.ActiveCfg = Debug|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x64.Build.0 = Debug|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x86.ActiveCfg = Debug|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x86.Build.0 = Debug|Any CPU {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|Any CPU.ActiveCfg = Release|Any CPU {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|Any CPU.Build.0 = Release|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x64.ActiveCfg = Release|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x64.Build.0 = Release|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x86.ActiveCfg = Release|Any CPU + {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x86.Build.0 = Release|Any CPU {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x64.ActiveCfg = Debug|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x64.Build.0 = Debug|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x86.ActiveCfg = Debug|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x86.Build.0 = Debug|Any CPU {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|Any CPU.ActiveCfg = Release|Any CPU {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|Any CPU.Build.0 = Release|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x64.ActiveCfg = Release|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x64.Build.0 = Release|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x86.ActiveCfg = Release|Any CPU + {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x86.Build.0 = Release|Any CPU {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x64.ActiveCfg = Debug|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x64.Build.0 = Debug|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x86.ActiveCfg = Debug|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x86.Build.0 = Debug|Any CPU {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|Any CPU.Build.0 = Release|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x64.ActiveCfg = Release|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x64.Build.0 = Release|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x86.ActiveCfg = Release|Any CPU + {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x86.Build.0 = Release|Any CPU {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x64.ActiveCfg = Debug|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x64.Build.0 = Debug|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x86.ActiveCfg = Debug|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x86.Build.0 = Debug|Any CPU {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|Any CPU.ActiveCfg = Release|Any CPU {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|Any CPU.Build.0 = Release|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x64.ActiveCfg = Release|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x64.Build.0 = Release|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x86.ActiveCfg = Release|Any CPU + {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x86.Build.0 = Release|Any CPU {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x64.ActiveCfg = Debug|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x64.Build.0 = Debug|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x86.ActiveCfg = Debug|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x86.Build.0 = Debug|Any CPU {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|Any CPU.ActiveCfg = Release|Any CPU {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|Any CPU.Build.0 = Release|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x64.ActiveCfg = Release|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x64.Build.0 = Release|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x86.ActiveCfg = Release|Any CPU + {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x86.Build.0 = Release|Any CPU {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x64.ActiveCfg = Debug|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x64.Build.0 = Debug|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x86.Build.0 = Debug|Any CPU {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|Any CPU.Build.0 = Release|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x64.ActiveCfg = Release|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x64.Build.0 = Release|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x86.ActiveCfg = Release|Any CPU + {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x86.Build.0 = Release|Any CPU {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x64.ActiveCfg = Debug|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x64.Build.0 = Debug|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x86.ActiveCfg = Debug|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x86.Build.0 = Debug|Any CPU {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|Any CPU.ActiveCfg = Release|Any CPU {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|Any CPU.Build.0 = Release|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x64.ActiveCfg = Release|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x64.Build.0 = Release|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x86.ActiveCfg = Release|Any CPU + {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x86.Build.0 = Release|Any CPU {1E753568-E34B-4E93-93F8-43764171725D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E753568-E34B-4E93-93F8-43764171725D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x64.Build.0 = Debug|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x86.Build.0 = Debug|Any CPU {1E753568-E34B-4E93-93F8-43764171725D}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E753568-E34B-4E93-93F8-43764171725D}.Release|Any CPU.Build.0 = Release|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Release|x64.ActiveCfg = Release|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Release|x64.Build.0 = Release|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Release|x86.ActiveCfg = Release|Any CPU + {1E753568-E34B-4E93-93F8-43764171725D}.Release|x86.Build.0 = Release|Any CPU {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x64.Build.0 = Debug|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x86.Build.0 = Debug|Any CPU {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|Any CPU.Build.0 = Release|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x64.ActiveCfg = Release|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x64.Build.0 = Release|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x86.ActiveCfg = Release|Any CPU + {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x86.Build.0 = Release|Any CPU {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|Any CPU.Build.0 = Debug|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x64.ActiveCfg = Debug|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x64.Build.0 = Debug|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x86.ActiveCfg = Debug|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x86.Build.0 = Debug|Any CPU {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|Any CPU.ActiveCfg = Release|Any CPU {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|Any CPU.Build.0 = Release|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x64.ActiveCfg = Release|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x64.Build.0 = Release|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x86.ActiveCfg = Release|Any CPU + {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x86.Build.0 = Release|Any CPU {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x64.ActiveCfg = Debug|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x64.Build.0 = Debug|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x86.ActiveCfg = Debug|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x86.Build.0 = Debug|Any CPU {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|Any CPU.ActiveCfg = Release|Any CPU {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|Any CPU.Build.0 = Release|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x64.ActiveCfg = Release|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x64.Build.0 = Release|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x86.ActiveCfg = Release|Any CPU + {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x86.Build.0 = Release|Any CPU {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x64.ActiveCfg = Debug|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x64.Build.0 = Debug|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x86.ActiveCfg = Debug|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x86.Build.0 = Debug|Any CPU {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|Any CPU.ActiveCfg = Release|Any CPU {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|Any CPU.Build.0 = Release|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x64.ActiveCfg = Release|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x64.Build.0 = Release|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x86.ActiveCfg = Release|Any CPU + {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x86.Build.0 = Release|Any CPU {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x64.ActiveCfg = Debug|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x64.Build.0 = Debug|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x86.ActiveCfg = Debug|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x86.Build.0 = Debug|Any CPU {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|Any CPU.ActiveCfg = Release|Any CPU {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|Any CPU.Build.0 = Release|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x64.ActiveCfg = Release|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x64.Build.0 = Release|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x86.ActiveCfg = Release|Any CPU + {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x86.Build.0 = Release|Any CPU {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x64.ActiveCfg = Debug|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x64.Build.0 = Debug|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x86.ActiveCfg = Debug|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x86.Build.0 = Debug|Any CPU {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|Any CPU.Build.0 = Release|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x64.ActiveCfg = Release|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x64.Build.0 = Release|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x86.ActiveCfg = Release|Any CPU + {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x86.Build.0 = Release|Any CPU {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x64.ActiveCfg = Debug|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x64.Build.0 = Debug|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x86.ActiveCfg = Debug|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x86.Build.0 = Debug|Any CPU {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|Any CPU.ActiveCfg = Release|Any CPU {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|Any CPU.Build.0 = Release|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x64.ActiveCfg = Release|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x64.Build.0 = Release|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x86.ActiveCfg = Release|Any CPU + {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x86.Build.0 = Release|Any CPU {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x64.Build.0 = Debug|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x86.Build.0 = Debug|Any CPU {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|Any CPU.Build.0 = Release|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x64.ActiveCfg = Release|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x64.Build.0 = Release|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x86.ActiveCfg = Release|Any CPU + {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x86.Build.0 = Release|Any CPU {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x64.ActiveCfg = Debug|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x64.Build.0 = Debug|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x86.ActiveCfg = Debug|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x86.Build.0 = Debug|Any CPU {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|Any CPU.ActiveCfg = Release|Any CPU {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|Any CPU.Build.0 = Release|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x64.ActiveCfg = Release|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x64.Build.0 = Release|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x86.ActiveCfg = Release|Any CPU + {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x86.Build.0 = Release|Any CPU {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|Any CPU.Build.0 = Debug|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x64.ActiveCfg = Debug|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x64.Build.0 = Debug|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x86.ActiveCfg = Debug|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x86.Build.0 = Debug|Any CPU {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|Any CPU.ActiveCfg = Release|Any CPU {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|Any CPU.Build.0 = Release|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x64.ActiveCfg = Release|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x64.Build.0 = Release|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x86.ActiveCfg = Release|Any CPU + {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x86.Build.0 = Release|Any CPU {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x64.ActiveCfg = Debug|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x64.Build.0 = Debug|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x86.ActiveCfg = Debug|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x86.Build.0 = Debug|Any CPU {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|Any CPU.ActiveCfg = Release|Any CPU {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|Any CPU.Build.0 = Release|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x64.ActiveCfg = Release|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x64.Build.0 = Release|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x86.ActiveCfg = Release|Any CPU + {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x86.Build.0 = Release|Any CPU {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x64.ActiveCfg = Debug|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x64.Build.0 = Debug|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x86.ActiveCfg = Debug|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x86.Build.0 = Debug|Any CPU {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|Any CPU.ActiveCfg = Release|Any CPU {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|Any CPU.Build.0 = Release|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x64.ActiveCfg = Release|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x64.Build.0 = Release|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x86.ActiveCfg = Release|Any CPU + {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x86.Build.0 = Release|Any CPU {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x64.ActiveCfg = Debug|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x64.Build.0 = Debug|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x86.ActiveCfg = Debug|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x86.Build.0 = Debug|Any CPU {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|Any CPU.ActiveCfg = Release|Any CPU {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|Any CPU.Build.0 = Release|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x64.ActiveCfg = Release|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x64.Build.0 = Release|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x86.ActiveCfg = Release|Any CPU + {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x86.Build.0 = Release|Any CPU {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x64.ActiveCfg = Debug|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x64.Build.0 = Debug|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x86.ActiveCfg = Debug|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x86.Build.0 = Debug|Any CPU {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|Any CPU.Build.0 = Release|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x64.ActiveCfg = Release|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x64.Build.0 = Release|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x86.ActiveCfg = Release|Any CPU + {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x86.Build.0 = Release|Any CPU {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x64.Build.0 = Debug|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x86.Build.0 = Debug|Any CPU {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|Any CPU.Build.0 = Release|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x64.ActiveCfg = Release|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x64.Build.0 = Release|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x86.ActiveCfg = Release|Any CPU + {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x86.Build.0 = Release|Any CPU {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x64.ActiveCfg = Debug|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x64.Build.0 = Debug|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x86.ActiveCfg = Debug|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x86.Build.0 = Debug|Any CPU {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|Any CPU.ActiveCfg = Release|Any CPU {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|Any CPU.Build.0 = Release|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x64.ActiveCfg = Release|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x64.Build.0 = Release|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x86.ActiveCfg = Release|Any CPU + {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x86.Build.0 = Release|Any CPU {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x64.Build.0 = Debug|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x86.Build.0 = Debug|Any CPU {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|Any CPU.Build.0 = Release|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x64.ActiveCfg = Release|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x64.Build.0 = Release|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x86.ActiveCfg = Release|Any CPU + {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x86.Build.0 = Release|Any CPU {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x64.ActiveCfg = Debug|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x64.Build.0 = Debug|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x86.ActiveCfg = Debug|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x86.Build.0 = Debug|Any CPU {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|Any CPU.Build.0 = Release|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x64.ActiveCfg = Release|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x64.Build.0 = Release|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x86.ActiveCfg = Release|Any CPU + {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x86.Build.0 = Release|Any CPU {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x64.ActiveCfg = Debug|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x64.Build.0 = Debug|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x86.ActiveCfg = Debug|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x86.Build.0 = Debug|Any CPU {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|Any CPU.Build.0 = Release|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x64.ActiveCfg = Release|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x64.Build.0 = Release|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x86.ActiveCfg = Release|Any CPU + {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x86.Build.0 = Release|Any CPU {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x64.Build.0 = Debug|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x86.Build.0 = Debug|Any CPU {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|Any CPU.Build.0 = Release|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x64.ActiveCfg = Release|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x64.Build.0 = Release|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x86.ActiveCfg = Release|Any CPU + {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x86.Build.0 = Release|Any CPU {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|Any CPU.Build.0 = Debug|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x64.ActiveCfg = Debug|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x64.Build.0 = Debug|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x86.ActiveCfg = Debug|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x86.Build.0 = Debug|Any CPU {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|Any CPU.ActiveCfg = Release|Any CPU {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|Any CPU.Build.0 = Release|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x64.ActiveCfg = Release|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x64.Build.0 = Release|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x86.ActiveCfg = Release|Any CPU + {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x86.Build.0 = Release|Any CPU {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x64.ActiveCfg = Debug|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x64.Build.0 = Debug|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x86.ActiveCfg = Debug|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x86.Build.0 = Debug|Any CPU {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|Any CPU.ActiveCfg = Release|Any CPU {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|Any CPU.Build.0 = Release|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x64.ActiveCfg = Release|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x64.Build.0 = Release|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x86.ActiveCfg = Release|Any CPU + {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x86.Build.0 = Release|Any CPU {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x64.ActiveCfg = Debug|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x64.Build.0 = Debug|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x86.ActiveCfg = Debug|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x86.Build.0 = Debug|Any CPU {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|Any CPU.ActiveCfg = Release|Any CPU {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|Any CPU.Build.0 = Release|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x64.ActiveCfg = Release|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x64.Build.0 = Release|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x86.ActiveCfg = Release|Any CPU + {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x86.Build.0 = Release|Any CPU {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|Any CPU.Build.0 = Debug|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x64.ActiveCfg = Debug|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x64.Build.0 = Debug|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x86.ActiveCfg = Debug|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x86.Build.0 = Debug|Any CPU {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|Any CPU.ActiveCfg = Release|Any CPU {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|Any CPU.Build.0 = Release|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x64.ActiveCfg = Release|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x64.Build.0 = Release|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x86.ActiveCfg = Release|Any CPU + {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x86.Build.0 = Release|Any CPU {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x64.ActiveCfg = Debug|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x64.Build.0 = Debug|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x86.ActiveCfg = Debug|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x86.Build.0 = Debug|Any CPU {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|Any CPU.Build.0 = Release|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x64.ActiveCfg = Release|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x64.Build.0 = Release|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x86.ActiveCfg = Release|Any CPU + {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x86.Build.0 = Release|Any CPU {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x64.Build.0 = Debug|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x86.Build.0 = Debug|Any CPU {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|Any CPU.Build.0 = Release|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x64.ActiveCfg = Release|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x64.Build.0 = Release|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x86.ActiveCfg = Release|Any CPU + {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x86.Build.0 = Release|Any CPU {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x64.ActiveCfg = Debug|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x64.Build.0 = Debug|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x86.ActiveCfg = Debug|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x86.Build.0 = Debug|Any CPU {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|Any CPU.ActiveCfg = Release|Any CPU {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|Any CPU.Build.0 = Release|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x64.ActiveCfg = Release|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x64.Build.0 = Release|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x86.ActiveCfg = Release|Any CPU + {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x86.Build.0 = Release|Any CPU {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x64.ActiveCfg = Debug|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x64.Build.0 = Debug|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x86.ActiveCfg = Debug|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x86.Build.0 = Debug|Any CPU {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|Any CPU.Build.0 = Release|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x64.ActiveCfg = Release|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x64.Build.0 = Release|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x86.ActiveCfg = Release|Any CPU + {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x86.Build.0 = Release|Any CPU {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x64.Build.0 = Debug|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x86.Build.0 = Debug|Any CPU {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|Any CPU.Build.0 = Release|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x64.ActiveCfg = Release|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x64.Build.0 = Release|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x86.ActiveCfg = Release|Any CPU + {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x86.Build.0 = Release|Any CPU {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x64.ActiveCfg = Debug|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x64.Build.0 = Debug|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x86.ActiveCfg = Debug|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x86.Build.0 = Debug|Any CPU {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|Any CPU.Build.0 = Release|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x64.ActiveCfg = Release|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x64.Build.0 = Release|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x86.ActiveCfg = Release|Any CPU + {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x86.Build.0 = Release|Any CPU {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x64.Build.0 = Debug|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x86.Build.0 = Debug|Any CPU {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|Any CPU.Build.0 = Release|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x64.ActiveCfg = Release|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x64.Build.0 = Release|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x86.ActiveCfg = Release|Any CPU + {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x86.Build.0 = Release|Any CPU {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x64.ActiveCfg = Debug|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x64.Build.0 = Debug|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x86.ActiveCfg = Debug|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x86.Build.0 = Debug|Any CPU {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|Any CPU.ActiveCfg = Release|Any CPU {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|Any CPU.Build.0 = Release|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x64.ActiveCfg = Release|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x64.Build.0 = Release|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x86.ActiveCfg = Release|Any CPU + {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x86.Build.0 = Release|Any CPU {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x64.ActiveCfg = Debug|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x64.Build.0 = Debug|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x86.ActiveCfg = Debug|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x86.Build.0 = Debug|Any CPU {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|Any CPU.ActiveCfg = Release|Any CPU {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|Any CPU.Build.0 = Release|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x64.ActiveCfg = Release|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x64.Build.0 = Release|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x86.ActiveCfg = Release|Any CPU + {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x86.Build.0 = Release|Any CPU {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x64.Build.0 = Debug|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x86.Build.0 = Debug|Any CPU {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|Any CPU.Build.0 = Release|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x64.ActiveCfg = Release|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x64.Build.0 = Release|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x86.ActiveCfg = Release|Any CPU + {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x86.Build.0 = Release|Any CPU {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x64.ActiveCfg = Debug|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x64.Build.0 = Debug|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x86.ActiveCfg = Debug|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x86.Build.0 = Debug|Any CPU {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|Any CPU.ActiveCfg = Release|Any CPU {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|Any CPU.Build.0 = Release|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x64.ActiveCfg = Release|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x64.Build.0 = Release|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x86.ActiveCfg = Release|Any CPU + {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x86.Build.0 = Release|Any CPU {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x64.ActiveCfg = Debug|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x64.Build.0 = Debug|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x86.ActiveCfg = Debug|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x86.Build.0 = Debug|Any CPU {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|Any CPU.ActiveCfg = Release|Any CPU {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|Any CPU.Build.0 = Release|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x64.ActiveCfg = Release|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x64.Build.0 = Release|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x86.ActiveCfg = Release|Any CPU + {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x86.Build.0 = Release|Any CPU {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x64.ActiveCfg = Debug|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x64.Build.0 = Debug|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x86.ActiveCfg = Debug|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x86.Build.0 = Debug|Any CPU {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|Any CPU.Build.0 = Release|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x64.ActiveCfg = Release|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x64.Build.0 = Release|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x86.ActiveCfg = Release|Any CPU + {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x86.Build.0 = Release|Any CPU {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x64.Build.0 = Debug|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x86.Build.0 = Debug|Any CPU {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|Any CPU.Build.0 = Release|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x64.ActiveCfg = Release|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x64.Build.0 = Release|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x86.ActiveCfg = Release|Any CPU + {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x86.Build.0 = Release|Any CPU {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x64.ActiveCfg = Debug|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x64.Build.0 = Debug|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x86.Build.0 = Debug|Any CPU {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|Any CPU.ActiveCfg = Release|Any CPU {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|Any CPU.Build.0 = Release|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x64.ActiveCfg = Release|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x64.Build.0 = Release|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x86.ActiveCfg = Release|Any CPU + {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x86.Build.0 = Release|Any CPU {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x64.ActiveCfg = Debug|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x64.Build.0 = Debug|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x86.ActiveCfg = Debug|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x86.Build.0 = Debug|Any CPU {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|Any CPU.ActiveCfg = Release|Any CPU {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|Any CPU.Build.0 = Release|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x64.ActiveCfg = Release|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x64.Build.0 = Release|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x86.ActiveCfg = Release|Any CPU + {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x86.Build.0 = Release|Any CPU {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x64.ActiveCfg = Debug|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x64.Build.0 = Debug|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x86.ActiveCfg = Debug|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x86.Build.0 = Debug|Any CPU {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|Any CPU.ActiveCfg = Release|Any CPU {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|Any CPU.Build.0 = Release|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x64.ActiveCfg = Release|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x64.Build.0 = Release|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x86.ActiveCfg = Release|Any CPU + {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x86.Build.0 = Release|Any CPU {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x64.ActiveCfg = Debug|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x64.Build.0 = Debug|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x86.ActiveCfg = Debug|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x86.Build.0 = Debug|Any CPU {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|Any CPU.ActiveCfg = Release|Any CPU {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|Any CPU.Build.0 = Release|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x64.ActiveCfg = Release|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x64.Build.0 = Release|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x86.ActiveCfg = Release|Any CPU + {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x86.Build.0 = Release|Any CPU {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x64.Build.0 = Debug|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x86.Build.0 = Debug|Any CPU {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|Any CPU.Build.0 = Release|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x64.ActiveCfg = Release|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x64.Build.0 = Release|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x86.ActiveCfg = Release|Any CPU + {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x86.Build.0 = Release|Any CPU {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x64.ActiveCfg = Debug|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x64.Build.0 = Debug|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x86.ActiveCfg = Debug|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x86.Build.0 = Debug|Any CPU {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|Any CPU.ActiveCfg = Release|Any CPU {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|Any CPU.Build.0 = Release|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x64.ActiveCfg = Release|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x64.Build.0 = Release|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x86.ActiveCfg = Release|Any CPU + {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x86.Build.0 = Release|Any CPU {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x64.ActiveCfg = Debug|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x64.Build.0 = Debug|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x86.ActiveCfg = Debug|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x86.Build.0 = Debug|Any CPU {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|Any CPU.ActiveCfg = Release|Any CPU {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|Any CPU.Build.0 = Release|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x64.ActiveCfg = Release|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x64.Build.0 = Release|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x86.ActiveCfg = Release|Any CPU + {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x86.Build.0 = Release|Any CPU {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x64.ActiveCfg = Debug|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x64.Build.0 = Debug|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x86.ActiveCfg = Debug|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x86.Build.0 = Debug|Any CPU {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|Any CPU.Build.0 = Release|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x64.ActiveCfg = Release|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x64.Build.0 = Release|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x86.ActiveCfg = Release|Any CPU + {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x86.Build.0 = Release|Any CPU {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x64.Build.0 = Debug|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x86.Build.0 = Debug|Any CPU {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|Any CPU.Build.0 = Release|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x64.ActiveCfg = Release|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x64.Build.0 = Release|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x86.ActiveCfg = Release|Any CPU + {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x86.Build.0 = Release|Any CPU {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x64.Build.0 = Debug|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x86.Build.0 = Debug|Any CPU {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|Any CPU.Build.0 = Release|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x64.ActiveCfg = Release|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x64.Build.0 = Release|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x86.ActiveCfg = Release|Any CPU + {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x86.Build.0 = Release|Any CPU {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x64.ActiveCfg = Debug|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x64.Build.0 = Debug|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x86.ActiveCfg = Debug|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x86.Build.0 = Debug|Any CPU {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|Any CPU.ActiveCfg = Release|Any CPU {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|Any CPU.Build.0 = Release|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x64.ActiveCfg = Release|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x64.Build.0 = Release|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x86.ActiveCfg = Release|Any CPU + {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x86.Build.0 = Release|Any CPU {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x64.ActiveCfg = Debug|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x64.Build.0 = Debug|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x86.ActiveCfg = Debug|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x86.Build.0 = Debug|Any CPU {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|Any CPU.Build.0 = Release|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x64.ActiveCfg = Release|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x64.Build.0 = Release|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x86.ActiveCfg = Release|Any CPU + {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x86.Build.0 = Release|Any CPU {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x64.Build.0 = Debug|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x86.Build.0 = Debug|Any CPU {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|Any CPU.Build.0 = Release|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x64.ActiveCfg = Release|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x64.Build.0 = Release|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x86.ActiveCfg = Release|Any CPU + {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x86.Build.0 = Release|Any CPU {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x64.Build.0 = Debug|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x86.Build.0 = Debug|Any CPU {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|Any CPU.Build.0 = Release|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x64.ActiveCfg = Release|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x64.Build.0 = Release|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x86.ActiveCfg = Release|Any CPU + {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x86.Build.0 = Release|Any CPU {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x64.ActiveCfg = Debug|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x64.Build.0 = Debug|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x86.ActiveCfg = Debug|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x86.Build.0 = Debug|Any CPU {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|Any CPU.ActiveCfg = Release|Any CPU {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|Any CPU.Build.0 = Release|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x64.ActiveCfg = Release|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x64.Build.0 = Release|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x86.ActiveCfg = Release|Any CPU + {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x86.Build.0 = Release|Any CPU {99441705-4BFA-499F-9897-371238665E38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {99441705-4BFA-499F-9897-371238665E38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Debug|x64.ActiveCfg = Debug|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Debug|x64.Build.0 = Debug|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Debug|x86.ActiveCfg = Debug|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Debug|x86.Build.0 = Debug|Any CPU {99441705-4BFA-499F-9897-371238665E38}.Release|Any CPU.ActiveCfg = Release|Any CPU {99441705-4BFA-499F-9897-371238665E38}.Release|Any CPU.Build.0 = Release|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Release|x64.ActiveCfg = Release|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Release|x64.Build.0 = Release|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Release|x86.ActiveCfg = Release|Any CPU + {99441705-4BFA-499F-9897-371238665E38}.Release|x86.Build.0 = Release|Any CPU {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x64.ActiveCfg = Debug|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x64.Build.0 = Debug|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x86.ActiveCfg = Debug|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x86.Build.0 = Debug|Any CPU {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|Any CPU.Build.0 = Release|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x64.ActiveCfg = Release|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x64.Build.0 = Release|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x86.ActiveCfg = Release|Any CPU + {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x86.Build.0 = Release|Any CPU {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x64.ActiveCfg = Debug|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x64.Build.0 = Debug|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x86.ActiveCfg = Debug|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x86.Build.0 = Debug|Any CPU {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|Any CPU.Build.0 = Release|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x64.ActiveCfg = Release|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x64.Build.0 = Release|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x86.ActiveCfg = Release|Any CPU + {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x86.Build.0 = Release|Any CPU {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x64.Build.0 = Debug|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x86.Build.0 = Debug|Any CPU {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|Any CPU.Build.0 = Release|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x64.ActiveCfg = Release|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x64.Build.0 = Release|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x86.ActiveCfg = Release|Any CPU + {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x86.Build.0 = Release|Any CPU {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x64.ActiveCfg = Debug|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x64.Build.0 = Debug|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x86.ActiveCfg = Debug|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x86.Build.0 = Debug|Any CPU {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|Any CPU.Build.0 = Release|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x64.ActiveCfg = Release|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x64.Build.0 = Release|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x86.ActiveCfg = Release|Any CPU + {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x86.Build.0 = Release|Any CPU {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x64.ActiveCfg = Debug|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x64.Build.0 = Debug|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x86.ActiveCfg = Debug|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x86.Build.0 = Debug|Any CPU {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|Any CPU.ActiveCfg = Release|Any CPU {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|Any CPU.Build.0 = Release|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x64.ActiveCfg = Release|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x64.Build.0 = Release|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x86.ActiveCfg = Release|Any CPU + {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x86.Build.0 = Release|Any CPU {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x64.Build.0 = Debug|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x86.Build.0 = Debug|Any CPU {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|Any CPU.Build.0 = Release|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x64.ActiveCfg = Release|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x64.Build.0 = Release|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x86.ActiveCfg = Release|Any CPU + {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x86.Build.0 = Release|Any CPU {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x64.ActiveCfg = Debug|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x64.Build.0 = Debug|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x86.Build.0 = Debug|Any CPU {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|Any CPU.Build.0 = Release|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x64.ActiveCfg = Release|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x64.Build.0 = Release|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x86.ActiveCfg = Release|Any CPU + {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x86.Build.0 = Release|Any CPU {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x64.Build.0 = Debug|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x86.Build.0 = Debug|Any CPU {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|Any CPU.Build.0 = Release|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x64.ActiveCfg = Release|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x64.Build.0 = Release|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x86.ActiveCfg = Release|Any CPU + {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x86.Build.0 = Release|Any CPU {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x64.ActiveCfg = Debug|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x64.Build.0 = Debug|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x86.ActiveCfg = Debug|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x86.Build.0 = Debug|Any CPU {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|Any CPU.ActiveCfg = Release|Any CPU {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|Any CPU.Build.0 = Release|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x64.ActiveCfg = Release|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x64.Build.0 = Release|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x86.ActiveCfg = Release|Any CPU + {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x86.Build.0 = Release|Any CPU {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x64.ActiveCfg = Debug|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x64.Build.0 = Debug|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x86.ActiveCfg = Debug|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x86.Build.0 = Debug|Any CPU {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|Any CPU.ActiveCfg = Release|Any CPU {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|Any CPU.Build.0 = Release|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x64.ActiveCfg = Release|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x64.Build.0 = Release|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x86.ActiveCfg = Release|Any CPU + {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x86.Build.0 = Release|Any CPU {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x64.ActiveCfg = Debug|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x64.Build.0 = Debug|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x86.Build.0 = Debug|Any CPU {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|Any CPU.Build.0 = Release|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x64.ActiveCfg = Release|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x64.Build.0 = Release|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x86.ActiveCfg = Release|Any CPU + {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x86.Build.0 = Release|Any CPU {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x64.Build.0 = Debug|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x86.Build.0 = Debug|Any CPU {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|Any CPU.Build.0 = Release|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x64.ActiveCfg = Release|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x64.Build.0 = Release|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x86.ActiveCfg = Release|Any CPU + {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x86.Build.0 = Release|Any CPU {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x64.ActiveCfg = Debug|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x64.Build.0 = Debug|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x86.ActiveCfg = Debug|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x86.Build.0 = Debug|Any CPU {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|Any CPU.ActiveCfg = Release|Any CPU {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|Any CPU.Build.0 = Release|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x64.ActiveCfg = Release|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x64.Build.0 = Release|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x86.ActiveCfg = Release|Any CPU + {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x86.Build.0 = Release|Any CPU {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x64.Build.0 = Debug|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x86.Build.0 = Debug|Any CPU {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|Any CPU.Build.0 = Release|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x64.ActiveCfg = Release|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x64.Build.0 = Release|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x86.ActiveCfg = Release|Any CPU + {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x86.Build.0 = Release|Any CPU {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x64.Build.0 = Debug|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x86.Build.0 = Debug|Any CPU {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|Any CPU.Build.0 = Release|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x64.ActiveCfg = Release|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x64.Build.0 = Release|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x86.ActiveCfg = Release|Any CPU + {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x86.Build.0 = Release|Any CPU {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x64.ActiveCfg = Debug|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x64.Build.0 = Debug|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x86.ActiveCfg = Debug|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x86.Build.0 = Debug|Any CPU {96458513-CAA8-498B-B4EE-3BF994140741}.Release|Any CPU.ActiveCfg = Release|Any CPU {96458513-CAA8-498B-B4EE-3BF994140741}.Release|Any CPU.Build.0 = Release|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x64.ActiveCfg = Release|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x64.Build.0 = Release|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x86.ActiveCfg = Release|Any CPU + {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x86.Build.0 = Release|Any CPU {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x64.ActiveCfg = Debug|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x64.Build.0 = Debug|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x86.ActiveCfg = Debug|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x86.Build.0 = Debug|Any CPU {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|Any CPU.ActiveCfg = Release|Any CPU {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|Any CPU.Build.0 = Release|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x64.ActiveCfg = Release|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x64.Build.0 = Release|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x86.ActiveCfg = Release|Any CPU + {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x86.Build.0 = Release|Any CPU {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x64.ActiveCfg = Debug|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x64.Build.0 = Debug|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x86.ActiveCfg = Debug|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x86.Build.0 = Debug|Any CPU {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|Any CPU.Build.0 = Release|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x64.ActiveCfg = Release|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x64.Build.0 = Release|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x86.ActiveCfg = Release|Any CPU + {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x86.Build.0 = Release|Any CPU {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x64.ActiveCfg = Debug|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x64.Build.0 = Debug|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x86.ActiveCfg = Debug|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x86.Build.0 = Debug|Any CPU {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|Any CPU.ActiveCfg = Release|Any CPU {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|Any CPU.Build.0 = Release|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x64.ActiveCfg = Release|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x64.Build.0 = Release|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x86.ActiveCfg = Release|Any CPU + {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x86.Build.0 = Release|Any CPU {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x64.ActiveCfg = Debug|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x64.Build.0 = Debug|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x86.ActiveCfg = Debug|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x86.Build.0 = Debug|Any CPU {A461FE7E-2458-428C-B794-6CC388031F16}.Release|Any CPU.ActiveCfg = Release|Any CPU {A461FE7E-2458-428C-B794-6CC388031F16}.Release|Any CPU.Build.0 = Release|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x64.ActiveCfg = Release|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x64.Build.0 = Release|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x86.ActiveCfg = Release|Any CPU + {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x86.Build.0 = Release|Any CPU {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x64.ActiveCfg = Debug|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x64.Build.0 = Debug|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x86.ActiveCfg = Debug|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x86.Build.0 = Debug|Any CPU {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|Any CPU.Build.0 = Release|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x64.ActiveCfg = Release|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x64.Build.0 = Release|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x86.ActiveCfg = Release|Any CPU + {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x86.Build.0 = Release|Any CPU {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x64.ActiveCfg = Debug|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x64.Build.0 = Debug|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x86.ActiveCfg = Debug|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x86.Build.0 = Debug|Any CPU {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|Any CPU.ActiveCfg = Release|Any CPU {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|Any CPU.Build.0 = Release|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x64.ActiveCfg = Release|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x64.Build.0 = Release|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x86.ActiveCfg = Release|Any CPU + {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x86.Build.0 = Release|Any CPU {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x64.Build.0 = Debug|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x86.Build.0 = Debug|Any CPU {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|Any CPU.Build.0 = Release|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x64.ActiveCfg = Release|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x64.Build.0 = Release|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x86.ActiveCfg = Release|Any CPU + {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x86.Build.0 = Release|Any CPU {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x64.Build.0 = Debug|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x86.Build.0 = Debug|Any CPU {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|Any CPU.ActiveCfg = Release|Any CPU {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|Any CPU.Build.0 = Release|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x64.ActiveCfg = Release|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x64.Build.0 = Release|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x86.ActiveCfg = Release|Any CPU + {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x86.Build.0 = Release|Any CPU {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x64.Build.0 = Debug|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x86.Build.0 = Debug|Any CPU {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|Any CPU.Build.0 = Release|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x64.ActiveCfg = Release|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x64.Build.0 = Release|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x86.ActiveCfg = Release|Any CPU + {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x86.Build.0 = Release|Any CPU {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x64.ActiveCfg = Debug|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x64.Build.0 = Debug|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x86.ActiveCfg = Debug|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x86.Build.0 = Debug|Any CPU {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|Any CPU.ActiveCfg = Release|Any CPU {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|Any CPU.Build.0 = Release|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x64.ActiveCfg = Release|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x64.Build.0 = Release|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x86.ActiveCfg = Release|Any CPU + {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x86.Build.0 = Release|Any CPU {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x64.ActiveCfg = Debug|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x64.Build.0 = Debug|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x86.ActiveCfg = Debug|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x86.Build.0 = Debug|Any CPU {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|Any CPU.ActiveCfg = Release|Any CPU {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|Any CPU.Build.0 = Release|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x64.ActiveCfg = Release|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x64.Build.0 = Release|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x86.ActiveCfg = Release|Any CPU + {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x86.Build.0 = Release|Any CPU {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x64.ActiveCfg = Debug|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x64.Build.0 = Debug|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x86.Build.0 = Debug|Any CPU {8C463360-0156-461C-A065-CC30FE3B0595}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C463360-0156-461C-A065-CC30FE3B0595}.Release|Any CPU.Build.0 = Release|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x64.ActiveCfg = Release|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x64.Build.0 = Release|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x86.ActiveCfg = Release|Any CPU + {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x86.Build.0 = Release|Any CPU {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x64.Build.0 = Debug|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x86.Build.0 = Debug|Any CPU {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|Any CPU.Build.0 = Release|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x64.ActiveCfg = Release|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x64.Build.0 = Release|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x86.ActiveCfg = Release|Any CPU + {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x86.Build.0 = Release|Any CPU {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x64.ActiveCfg = Debug|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x64.Build.0 = Debug|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x86.ActiveCfg = Debug|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x86.Build.0 = Debug|Any CPU {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|Any CPU.ActiveCfg = Release|Any CPU {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|Any CPU.Build.0 = Release|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x64.ActiveCfg = Release|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x64.Build.0 = Release|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x86.ActiveCfg = Release|Any CPU + {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x86.Build.0 = Release|Any CPU {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x64.Build.0 = Debug|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x86.Build.0 = Debug|Any CPU {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|Any CPU.Build.0 = Release|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x64.ActiveCfg = Release|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x64.Build.0 = Release|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x86.ActiveCfg = Release|Any CPU + {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x86.Build.0 = Release|Any CPU {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x64.Build.0 = Debug|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x86.Build.0 = Debug|Any CPU {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|Any CPU.Build.0 = Release|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x64.ActiveCfg = Release|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x64.Build.0 = Release|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x86.ActiveCfg = Release|Any CPU + {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x86.Build.0 = Release|Any CPU {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x64.ActiveCfg = Debug|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x64.Build.0 = Debug|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x86.ActiveCfg = Debug|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x86.Build.0 = Debug|Any CPU {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|Any CPU.ActiveCfg = Release|Any CPU {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|Any CPU.Build.0 = Release|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x64.ActiveCfg = Release|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x64.Build.0 = Release|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x86.ActiveCfg = Release|Any CPU + {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x86.Build.0 = Release|Any CPU {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x64.ActiveCfg = Debug|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x64.Build.0 = Debug|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x86.ActiveCfg = Debug|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x86.Build.0 = Debug|Any CPU {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|Any CPU.ActiveCfg = Release|Any CPU {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|Any CPU.Build.0 = Release|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x64.ActiveCfg = Release|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x64.Build.0 = Release|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x86.ActiveCfg = Release|Any CPU + {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x86.Build.0 = Release|Any CPU {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x64.Build.0 = Debug|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x86.ActiveCfg = Debug|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x86.Build.0 = Debug|Any CPU {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|Any CPU.Build.0 = Release|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x64.ActiveCfg = Release|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x64.Build.0 = Release|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x86.ActiveCfg = Release|Any CPU + {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x86.Build.0 = Release|Any CPU {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x64.Build.0 = Debug|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x86.Build.0 = Debug|Any CPU {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|Any CPU.Build.0 = Release|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x64.ActiveCfg = Release|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x64.Build.0 = Release|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x86.ActiveCfg = Release|Any CPU + {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x86.Build.0 = Release|Any CPU {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x64.ActiveCfg = Debug|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x64.Build.0 = Debug|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x86.ActiveCfg = Debug|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x86.Build.0 = Debug|Any CPU {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|Any CPU.ActiveCfg = Release|Any CPU {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|Any CPU.Build.0 = Release|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x64.ActiveCfg = Release|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x64.Build.0 = Release|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x86.ActiveCfg = Release|Any CPU + {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x86.Build.0 = Release|Any CPU {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x64.Build.0 = Debug|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x86.Build.0 = Debug|Any CPU {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|Any CPU.Build.0 = Release|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x64.ActiveCfg = Release|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x64.Build.0 = Release|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x86.ActiveCfg = Release|Any CPU + {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x86.Build.0 = Release|Any CPU {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|Any CPU.Build.0 = Debug|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x64.ActiveCfg = Debug|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x64.Build.0 = Debug|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x86.ActiveCfg = Debug|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x86.Build.0 = Debug|Any CPU {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|Any CPU.ActiveCfg = Release|Any CPU {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|Any CPU.Build.0 = Release|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x64.ActiveCfg = Release|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x64.Build.0 = Release|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x86.ActiveCfg = Release|Any CPU + {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x86.Build.0 = Release|Any CPU {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x64.Build.0 = Debug|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x86.Build.0 = Debug|Any CPU {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|Any CPU.Build.0 = Release|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x64.ActiveCfg = Release|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x64.Build.0 = Release|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x86.ActiveCfg = Release|Any CPU + {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x86.Build.0 = Release|Any CPU {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x64.ActiveCfg = Debug|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x64.Build.0 = Debug|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x86.ActiveCfg = Debug|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x86.Build.0 = Debug|Any CPU {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|Any CPU.Build.0 = Release|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x64.ActiveCfg = Release|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x64.Build.0 = Release|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x86.ActiveCfg = Release|Any CPU + {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x86.Build.0 = Release|Any CPU {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x64.ActiveCfg = Debug|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x64.Build.0 = Debug|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x86.ActiveCfg = Debug|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x86.Build.0 = Debug|Any CPU {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|Any CPU.Build.0 = Release|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x64.ActiveCfg = Release|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x64.Build.0 = Release|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x86.ActiveCfg = Release|Any CPU + {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x86.Build.0 = Release|Any CPU {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x64.ActiveCfg = Debug|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x64.Build.0 = Debug|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x86.ActiveCfg = Debug|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x86.Build.0 = Debug|Any CPU {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|Any CPU.ActiveCfg = Release|Any CPU {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|Any CPU.Build.0 = Release|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x64.ActiveCfg = Release|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x64.Build.0 = Release|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x86.ActiveCfg = Release|Any CPU + {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x86.Build.0 = Release|Any CPU {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x64.ActiveCfg = Debug|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x64.Build.0 = Debug|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x86.ActiveCfg = Debug|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x86.Build.0 = Debug|Any CPU {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|Any CPU.ActiveCfg = Release|Any CPU {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|Any CPU.Build.0 = Release|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x64.ActiveCfg = Release|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x64.Build.0 = Release|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x86.ActiveCfg = Release|Any CPU + {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x86.Build.0 = Release|Any CPU {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|Any CPU.Build.0 = Debug|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x64.ActiveCfg = Debug|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x64.Build.0 = Debug|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x86.ActiveCfg = Debug|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x86.Build.0 = Debug|Any CPU {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|Any CPU.ActiveCfg = Release|Any CPU {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|Any CPU.Build.0 = Release|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x64.ActiveCfg = Release|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x64.Build.0 = Release|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x86.ActiveCfg = Release|Any CPU + {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x86.Build.0 = Release|Any CPU {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x64.ActiveCfg = Debug|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x64.Build.0 = Debug|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x86.ActiveCfg = Debug|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x86.Build.0 = Debug|Any CPU {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|Any CPU.ActiveCfg = Release|Any CPU {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|Any CPU.Build.0 = Release|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x64.ActiveCfg = Release|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x64.Build.0 = Release|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x86.ActiveCfg = Release|Any CPU + {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x86.Build.0 = Release|Any CPU {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x64.ActiveCfg = Debug|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x64.Build.0 = Debug|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x86.ActiveCfg = Debug|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x86.Build.0 = Debug|Any CPU {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|Any CPU.ActiveCfg = Release|Any CPU {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|Any CPU.Build.0 = Release|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x64.ActiveCfg = Release|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x64.Build.0 = Release|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x86.ActiveCfg = Release|Any CPU + {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x86.Build.0 = Release|Any CPU {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x64.ActiveCfg = Debug|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x64.Build.0 = Debug|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x86.ActiveCfg = Debug|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x86.Build.0 = Debug|Any CPU {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|Any CPU.ActiveCfg = Release|Any CPU {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|Any CPU.Build.0 = Release|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x64.ActiveCfg = Release|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x64.Build.0 = Release|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x86.ActiveCfg = Release|Any CPU + {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x86.Build.0 = Release|Any CPU {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x64.ActiveCfg = Debug|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x64.Build.0 = Debug|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x86.ActiveCfg = Debug|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x86.Build.0 = Debug|Any CPU {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|Any CPU.Build.0 = Release|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x64.ActiveCfg = Release|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x64.Build.0 = Release|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x86.ActiveCfg = Release|Any CPU + {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x86.Build.0 = Release|Any CPU {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x64.ActiveCfg = Debug|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x64.Build.0 = Debug|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x86.Build.0 = Debug|Any CPU {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|Any CPU.ActiveCfg = Release|Any CPU {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|Any CPU.Build.0 = Release|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x64.ActiveCfg = Release|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x64.Build.0 = Release|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x86.ActiveCfg = Release|Any CPU + {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x86.Build.0 = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x64.Build.0 = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x86.Build.0 = Debug|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|Any CPU.Build.0 = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x64.ActiveCfg = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x64.Build.0 = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x86.ActiveCfg = Release|Any CPU + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x86.Build.0 = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x64.ActiveCfg = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x64.Build.0 = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x86.ActiveCfg = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x86.Build.0 = Debug|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|Any CPU.Build.0 = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x64.ActiveCfg = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x64.Build.0 = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x86.ActiveCfg = Release|Any CPU + {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x86.Build.0 = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x64.ActiveCfg = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x64.Build.0 = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x86.Build.0 = Debug|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|Any CPU.Build.0 = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x64.ActiveCfg = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x64.Build.0 = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x86.ActiveCfg = Release|Any CPU + {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1166,6 +2414,10 @@ Global {15BBCE34-82A2-489C-A65B-5BAEA299F07E} = {612ECA40-80B7-4365-9A6A-C35A6BE30FED} {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A} = {612ECA40-80B7-4365-9A6A-C35A6BE30FED} {CCFE3593-49A7-4F03-A329-687490CD0143} = {899F0713-7FC6-4750-BAFC-AC650B35B453} + {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} + {0CE3C255-7FF4-EA80-717A-A208DB412F1A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} + {DF023DD5-1158-4E2D-B542-21AF2E387428} = {0CE3C255-7FF4-EA80-717A-A208DB412F1A} + {F43484E3-6D87-476D-AD21-AB880C65B6C2} = {0CE3C255-7FF4-EA80-717A-A208DB412F1A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {08B1D4B8-D2C5-4A64-BB8B-E1A2B29525F0} diff --git a/Directory.Packages.props b/Directory.Packages.props index 3fddd790..3ce3afdc 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,7 +7,7 @@ - + @@ -16,6 +16,8 @@ + + @@ -53,11 +55,9 @@ - - @@ -82,7 +82,6 @@ - @@ -98,8 +97,7 @@ - - + \ No newline at end of file diff --git a/docs/diagnostics.md b/docs/diagnostics.md index d8977b04..4bb3e098 100644 --- a/docs/diagnostics.md +++ b/docs/diagnostics.md @@ -13,3 +13,7 @@ Once a release of .NET Aspire with that API is available, the API in the .NET As ## CTASPIRE002 Support for loading extensions into SQLite requires either a NuGet package or folder path to the library to be provided, and as a result there is some custom logic to load the extension based on the path or NuGet package. This logic will require some experimenting to figure out edge cases, so the feature for extension loading will be kept as experimental until it is proven to be stable. + +## CTASPIRE003 + +The underlying type used here may change to a different resource type in the future. Avoid taking a direct dependency on the Aspire type, instead rely on the CommunityToolkit resource type returned or the `Resource` type from Aspire. diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj new file mode 100644 index 00000000..a84a875d --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj @@ -0,0 +1,22 @@ + + + + + + Exe + enable + enable + true + 985811f2-fd0c-480a-885b-bc6cc0574b62 + + + + + + + + + + + + diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Program.cs b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Program.cs new file mode 100644 index 00000000..e0338dfd --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Program.cs @@ -0,0 +1,9 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var server = builder.AddProject("mcp-server"); + +builder.AddMcpInspector("mcp-inspector") + .WithMcpServer(server) + ; + +builder.Build().Run(); diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Properties/launchSettings.json b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..b15af080 --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17118;http://localhost:15207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21173", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22290" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19133", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20023" + } + } + } +} diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/appsettings.json b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/appsettings.json new file mode 100644 index 00000000..31c092aa --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj new file mode 100644 index 00000000..7e5b50d4 --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj @@ -0,0 +1,6 @@ + + + + + + diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs new file mode 100644 index 00000000..3b01927f --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs @@ -0,0 +1,21 @@ +using ModelContextProtocol.Server; +using System.ComponentModel; + +var builder = WebApplication.CreateBuilder(args); + +builder.Services + .AddMcpServer() + .WithTools(); + +var app = builder.Build(); + +app.MapMcp(); + +app.Run(); + +[McpServerToolType] +class McpServerTools +{ + [McpServerTool, Description("An echo tool")] + public static string Echo(string message) => $"Echo: {message}"; +} \ No newline at end of file diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Properties/launchSettings.json b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Properties/launchSettings.json new file mode 100644 index 00000000..db8bb522 --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5230", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7295;http://localhost:5230", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/appsettings.json b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/appsettings.json new file mode 100644 index 00000000..10f68b8c --- /dev/null +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj b/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj new file mode 100644 index 00000000..de12cbf0 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj @@ -0,0 +1,11 @@ + + + An Aspire to run the MCP Inspector against a MCP server. + ai mcp debugging hosting + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs new file mode 100644 index 00000000..ed7f2d27 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs @@ -0,0 +1,15 @@ +using System.Diagnostics.CodeAnalysis; + +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Resource for the MCP Inspector server. +/// +/// The name of the resource. +/// +/// This resource will run as a Node.js process using the npx command. +/// +/// In future, it is likely to become a container resource, once is resolved. +/// +[Experimental("CTASPIRE003")] +public class McpInspectorResource(string name) : ExecutableResource(name, "npx", ""); diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs new file mode 100644 index 00000000..5ecaa91c --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs @@ -0,0 +1,49 @@ +using Aspire.Hosting.ApplicationModel; +#pragma warning disable CTASPIRE003 + +namespace Aspire.Hosting; + +/// +/// Provides extension methods for adding the MCP Inspector to an . +/// +public static class McpInspectorResourceBuilderExtensions +{ + /// + /// Adds a MCP Inspector container resource to the . + /// + /// The to which the MCP Inspector resource will be added. + /// The name of the MCP Inspector container resource. + public static IResourceBuilder AddMcpInspector(this IDistributedApplicationBuilder builder, [ResourceName] string name) + { + var resource = builder.AddResource(new McpInspectorResource(name)) + .WithArgs(["-y", "@modelcontextprotocol/inspector"]) + .ExcludeFromManifest() + .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(3000, 4000), env: "CLIENT_PORT", name: "client") + .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: "server-proxy"); + + return resource + .WithEnvironment(ctx => + { + ctx.EnvironmentVariables["MCP_PROXY_FULL_ADDRESS"] = resource.GetEndpoint("server-proxy").Url; + }); + } + + /// + /// Configures the MCP Inspector resource to use a specified MCP server resource that uses SSE as the transport type. + /// + /// The type of the MCP server resource. + /// The used to configure the MCP Inspector resource. + /// The for the MCP server resource. + /// The route that the SSE connection will use. + /// A reference to the for further configuration. + public static IResourceBuilder WithMcpServer(this IResourceBuilder builder, IResourceBuilder mcpServer, string route = "/sse") + where TResource : IResourceWithEndpoints + { + return builder.WithArgs(ctx => + { + var httpEndpoint = mcpServer.Resource.GetEndpoint("http"); + + ctx.Args.Add($"{httpEndpoint.Url}{route}"); + }); + } +} \ No newline at end of file From 363abd781044fab65dc33e2e20d929ccaa5f10a2 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 8 Apr 2025 19:10:35 +1000 Subject: [PATCH 2/9] Apply suggestions from code review Co-authored-by: David Fowler --- .../McpInspectorResourceBuilderExtensions.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs index 5ecaa91c..85bf0971 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs @@ -24,7 +24,7 @@ public static IResourceBuilder AddMcpInspector(this IDistr return resource .WithEnvironment(ctx => { - ctx.EnvironmentVariables["MCP_PROXY_FULL_ADDRESS"] = resource.GetEndpoint("server-proxy").Url; + ctx.EnvironmentVariables["MCP_PROXY_FULL_ADDRESS"] = resource.GetEndpoint("server-proxy"); }); } @@ -43,7 +43,8 @@ public static IResourceBuilder WithMcpServer(th { var httpEndpoint = mcpServer.Resource.GetEndpoint("http"); - ctx.Args.Add($"{httpEndpoint.Url}{route}"); + var url = ReferenceExpression.Create($"{httpEndpoint}{route}"); + ctx.Args.Add(url); }); } } \ No newline at end of file From 9632548b084e14b8bd79a7073eca469d2a700248 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Wed, 2 Jul 2025 05:56:08 +0000 Subject: [PATCH 3/9] merge main --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- ...New Aspire Hosting integration.chatmode.md | 259 ++ .github/copilot-instructions.md | 2 + .github/dependabot.yml | 4 + .github/prompts/my-issues.prompt.md | 8 + .github/prompts/my-pull-requests.prompt.md | 14 + .github/workflows/code-coverage.yml | 2 +- .github/workflows/dotnet-ci.yml | 2 + .github/workflows/generate-api-diffs.yml | 1 + .github/workflows/tests.yaml | 15 +- CODEOWNERS | 12 +- CommunityToolkit.Aspire.sln | 2425 ------------ CommunityToolkit.Aspire.slnx | 234 ++ Directory.Build.props | 10 +- Directory.Packages.props | 37 +- README.md | 91 +- docs/diagnostics.md | 7 +- ...lkit.Aspire.Hosting.Adminer.AppHost.csproj | 22 + .../Program.cs | 33 + .../Properties/launchSettings.json | 12 +- .../appsettings.json | 0 ...olkit.Aspire.Hosting.DbGate.AppHost.csproj | 1 + .../Program.cs | 10 + ...kit.Aspire.Hosting.Minio.ApiService.csproj | 13 + .../Program.cs | 77 + .../Properties/launchSettings.json | 23 + .../appsettings.json | 0 ...oolkit.Aspire.Hosting.Minio.AppHost.csproj | 21 + .../Program.cs | 15 + .../Properties/launchSettings.json | 29 + .../appsettings.json | 9 + ...pire.Hosting.Minio.ServiceDefaults.csproj} | 2 +- .../Extensions.cs | 1 - ...re.Hosting.MySql.Extensions.AppHost.csproj | 20 + .../Program.cs | 14 + .../Properties/launchSettings.json | 29 + .../appsettings.json | 9 + .../Program.cs | 9 +- .../nodejs-ext/pnpm-demo/package-lock.json | 86 +- examples/nodejs-ext/pnpm-demo/package.json | 6 +- examples/nodejs-ext/pnpm-demo/pnpm-lock.yaml | 422 ++- .../nodejs-ext/vite-demo/package-lock.json | 86 +- examples/nodejs-ext/vite-demo/package.json | 7 +- .../nodejs-ext/yarn-demo/package-lock.json | 3216 ---------------- examples/nodejs-ext/yarn-demo/package.json | 7 +- examples/nodejs-ext/yarn-demo/yarn.lock | 280 +- .../Components/Pages/Home.razor | 4 +- .../Program.cs | 4 +- .../Program.cs | 6 +- ...tyToolkit.Aspire.PowerShell.AppHost.csproj | 24 + .../Program.cs | 48 + .../Properties/launchSettings.json | 29 + .../Scripts/script.ps1 | 3 + .../appsettings.json | 9 + examples/rust/actix_api/Cargo.lock | 6 +- .../Program.cs | 4 + .../SdkProject/Database.publish.xml | 10 + .../Program.cs | 6 +- ...Toolkit.Aspire.StaticWebApps.ApiApp.csproj | 12 - .../Program.cs | 25 - .../Properties/launchSettings.json | 38 - ...oolkit.Aspire.StaticWebApps.AppHost.csproj | 20 - .../Program.cs | 16 - .../.gitignore | 24 - .../README.md | 50 - .../eslint.config.js | 28 - .../index.html | 13 - .../package-lock.json | 3313 ----------------- .../package.json | 33 - .../src/App.css | 31 - .../src/App.tsx | 49 - .../src/bootstrap.css | 7 - .../src/main.tsx | 27 - .../src/vite-env.d.ts | 1 - .../tsconfig.app.json | 24 - .../tsconfig.json | 7 - .../tsconfig.node.json | 22 - .../vite.config.ts | 10 - .../AdminerBuilderExtensions.cs | 80 + .../AdminerContainerImageTags.cs | 11 + .../AdminerContainerResource.cs | 17 + ...unityToolkit.Aspire.Hosting.Adminer.csproj | 19 + .../README.md | 1 + ...CommunityToolkit.Aspire.Hosting.Adminer.cs | 27 + .../login-servers.php | 53 + ....Aspire.Hosting.Azure.StaticWebApps.csproj | 11 - .../README.md | 46 - .../SwaApiEndpointAnnotation.cs | 13 - .../SwaAppEndpointAnnotation.cs | 16 - .../SwaAppHostingExtension.cs | 76 - .../SwaResource.cs | 13 - .../SwaResourceOptions.cs | 19 - ...lkit.Aspire.Hosting.Azure.StaticWebApps.cs | 50 - .../DbGateBuilderExtensions.cs | 1 + .../DbGateContainerImageTags.cs | 6 +- .../GolangAppHostingExtension.cs | 22 +- .../JavaAppHostingExtension.Executable.cs | 20 +- ...mmunityToolkit.Aspire.Hosting.Minio.csproj | 15 + .../MinioBuilderExtensions.cs | 174 + .../MinioContainerImageTags.cs | 11 + .../MinioContainerResource.cs | 73 + .../README.md | 37 + .../MongoDBBuilderExtensions.cs | 3 +- ...kit.Aspire.Hosting.MySql.Extensions.csproj | 21 + .../MySqlBuilderExtensions.cs | 177 + .../README.md | 33 + ...Toolkit.Aspire.Hosting.MySql.Extensions.cs | 17 + .../NodeJSHostingExtensions.cs | 87 +- .../NodePackageInstaller.cs | 22 +- .../NpmInstallerResource.cs | 9 + .../NpmPackageInstallerLifecycleHook.cs | 1 + .../PnpmInstallerResource.cs | 9 + .../PnpmPackageInstallerLifecycleHook.cs | 1 + .../README.md | 21 + .../REFACTORING_NOTES.md | 107 + .../YarnInstallerResource.cs | 11 + .../YarnPackageInstallerLifecycleHook.cs | 1 + ...oolkit.Aspire.Hosting.NodeJS.Extensions.cs | 6 +- .../OllamaContainerImageTags.cs | 4 +- .../OllamaResourceBuilderExtensions.Model.cs | 24 +- .../OllamaResourceBuilderExtensions.cs | 17 +- ...spire.Hosting.PostgreSQL.Extensions.csproj | 5 + .../PostgresBuilderExtensions.cs | 87 +- .../README.md | 5 +- ...it.Aspire.Hosting.PostgreSQL.Extensions.cs | 2 + ...tyToolkit.Aspire.Hosting.PowerShell.csproj | 16 + ...DistributedApplicationBuilderExtensions.cs | 85 + .../PowerShellRunspacePoolResource.cs | 139 + ...llRunspacePoolResourceBuilderExtensions.cs | 122 + .../PowerShellScriptResource.cs | 259 ++ ...werShellScriptResourceBuilderExtensions.cs | 29 + .../README.md | 54 + .../RedisBuilderExtensions.cs | 9 +- .../DacDeployOptionsAnnotation.cs | 9 + .../SqlPackageResource.cs | 13 + .../SqlProjectBuilderExtensions.cs | 84 +- .../SqlProjectResource.cs | 15 +- ...Aspire.Hosting.SqlServer.Extensions.csproj | 6 + .../README.md | 5 +- .../SqlServerBuilderExtensions.cs | 85 +- ...kit.Aspire.Hosting.SqlServer.Extensions.cs | 2 + ...munityToolkit.Aspire.Hosting.Sqlite.csproj | 4 - .../SqliteResource.cs | 17 +- .../SqliteResourceBuilderExtensions.cs | 53 +- .../CommunityToolkit.Aspire.Hosting.Sqlite.cs | 15 - .../api/CommunityToolkit.Aspire.Hosting.k6.cs | 29 + .../AspireSqliteExtensions.cs | 189 +- ...oolkit.Aspire.Microsoft.Data.Sqlite.csproj | 3 - .../SqliteConnectionSettings.cs | 5 - ...ityToolkit.Aspire.Microsoft.Data.Sqlite.cs | 6 - .../AspireEFSqliteExtensions.cs | 9 +- ...ommunityToolkit.Aspire.Minio.Client.csproj | 17 + .../MinioClientBuilderExtensionMethods.cs | 100 + .../MinioClientSettings.cs | 108 + .../README.md | 119 + .../AspireOllamaApiClientBuilder.cs | 4 +- .../AspireOllamaChatClientExtensions.cs | 19 +- ...spireOllamaEmbeddingGeneratorExtensions.cs | 18 +- .../AspireOllamaSharpExtensions.cs | 44 +- ...CommunityToolkit.Aspire.OllamaSharp.csproj | 1 - src/Shared/Adminer/AdminerLoginServer.cs | 16 + ...utedApplicationBuilderExtensions.shared.cs | 2 +- ...edApplicationComponentBuilderExtensions.cs | 2 +- src/Shared/Sqlite/SqliteExtensionMetadata.cs | 10 - tests-app-hosts/Directory.Build.props | 5 - .../AddAdminerTests.cs | 312 ++ .../AdminerPublicApiTests.cs | 43 + .../AppHostTests.cs | 20 + ...oolkit.Aspire.Hosting.Adminer.Tests.csproj | 12 + .../ResourceCreationTests.cs | 191 +- ...e.Hosting.Azure.StaticWebApps.Tests.csproj | 9 - .../ResourceCreationTests.cs | 266 -- .../SwaHostingComponentTests.cs | 36 - .../AddBunAppTests.cs | 3 +- .../WithDaprSidecarTests.cs | 2 +- .../AddDbGateTests.cs | 117 +- .../EventStoreFunctionalTests.cs | 2 - .../ResourceCreationTests.cs | 37 + .../AppHostTests.cs | 69 + ...yToolkit.Aspire.Hosting.Minio.Tests.csproj | 10 + .../MinioFunctionalTests.cs | 243 ++ .../MinioPublicApiTests.cs | 111 + .../ResourceCreationTests.cs | 47 + .../AppHostTests.cs | 20 + ...pire.Hosting.MySql.Extensions.Tests.csproj | 10 + .../ResourceCreationTests.cs | 371 ++ .../AddNgrokTests.cs | 9 +- .../AppHostTests.cs | 3 +- .../IntegrationTests.cs | 94 + .../PackageInstallationTests.cs | 172 + .../ResourceCreationTests.cs | 188 +- .../AddOllamaTests.cs | 83 +- ...Hosting.PostgreSQL.Extensions.Tests.csproj | 3 + .../ResourceCreationTests.cs | 156 + .../AppHostTests.cs | 45 + ...kit.Aspire.Hosting.PowerShell.Tests.csproj | 9 + .../ResourceCreationTests.cs | 20 +- .../AddSqlPackageTests.cs | 25 + .../AddSqlProjectTests.cs | 70 + ...e.Hosting.SqlDatabaseProjects.Tests.csproj | 6 + .../Database.publish.xml | 9 + ....Hosting.SqlServer.Extensions.Tests.csproj | 3 + .../ResourceCreationTests.cs | 157 + .../AddSqliteTests.cs | 39 +- .../ResourceWithExtensionTests.cs | 52 - .../ConfigurationTests.cs | 4 - .../SqliteConnectionTests.cs | 38 +- .../SqliteConnectionTests.cs | 6 +- ...tyToolkit.Aspire.Minio.Client.Tests.csproj | 17 + .../ConfigurationTests.cs | 15 + .../ConformanceTests.cs | 90 + .../MinioClientPublicApiTests.cs | 35 + .../MinioContainerFeature.cs | 49 + .../OllamaApiClientTests.cs | 90 +- .../OllamaSharpIChatClientTests.cs | 73 +- .../OllamaSharpIEmbeddingGeneratorTests.cs | 25 +- .../ConformanceTests.cs | 1 + tests/dapr-shared/AddDaprPubSubTests.cs | 2 +- tests/dapr-shared/AddDaprStateStoreTests.cs | 2 +- 219 files changed, 7160 insertions(+), 11056 deletions(-) create mode 100644 .github/chatmodes/New Aspire Hosting integration.chatmode.md create mode 100644 .github/prompts/my-issues.prompt.md create mode 100644 .github/prompts/my-pull-requests.prompt.md delete mode 100644 CommunityToolkit.Aspire.sln create mode 100644 CommunityToolkit.Aspire.slnx create mode 100644 examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj create mode 100644 examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Program.cs rename examples/{swa/CommunityToolkit.Aspire.StaticWebApps.AppHost => adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost}/Properties/launchSettings.json (84%) rename examples/{swa/CommunityToolkit.Aspire.StaticWebApps.AppHost => adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost}/appsettings.json (100%) create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/CommunityToolkit.Aspire.Hosting.Minio.ApiService.csproj create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Program.cs create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Properties/launchSettings.json rename examples/{swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp => minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService}/appsettings.json (100%) create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Program.cs create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Properties/launchSettings.json create mode 100644 examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/appsettings.json rename examples/{swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults.csproj => minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults.csproj} (95%) rename examples/{swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults => minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults}/Extensions.cs (99%) create mode 100644 examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj create mode 100644 examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Program.cs create mode 100644 examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Properties/launchSettings.json create mode 100644 examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/appsettings.json delete mode 100644 examples/nodejs-ext/yarn-demo/package-lock.json create mode 100644 examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj create mode 100644 examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Program.cs create mode 100644 examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Properties/launchSettings.json create mode 100644 examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Scripts/script.ps1 create mode 100644 examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/appsettings.json create mode 100644 examples/sql-database-projects/SdkProject/Database.publish.xml delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/CommunityToolkit.Aspire.StaticWebApps.ApiApp.csproj delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Program.cs delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Properties/launchSettings.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/CommunityToolkit.Aspire.StaticWebApps.AppHost.csproj delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Program.cs delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/.gitignore delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/README.md delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/eslint.config.js delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/index.html delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package-lock.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.css delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.tsx delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/bootstrap.css delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/main.tsx delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/vite-env.d.ts delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.app.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.node.json delete mode 100644 examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/vite.config.ts create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerImageTags.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/CommunityToolkit.Aspire.Hosting.Adminer.csproj create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/README.md create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/api/CommunityToolkit.Aspire.Hosting.Adminer.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Adminer/login-servers.php delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.csproj delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/README.md delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaApiEndpointAnnotation.cs delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppEndpointAnnotation.cs delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppHostingExtension.cs delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResource.cs delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResourceOptions.cs delete mode 100644 src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/api/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Minio/CommunityToolkit.Aspire.Hosting.Minio.csproj create mode 100644 src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerImageTags.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.Minio/README.md create mode 100644 src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/CommunityToolkit.Aspire.Hosting.MySql.Extensions.csproj create mode 100644 src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md create mode 100644 src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/api/CommunityToolkit.Aspire.Hosting.MySql.Extensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmInstallerResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmInstallerResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md create mode 100644 src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnInstallerResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/CommunityToolkit.Aspire.Hosting.PowerShell.csproj create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/DistributedApplicationBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResourceBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResource.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResourceBuilderExtensions.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md create mode 100644 src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/DacDeployOptionsAnnotation.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.k6/api/CommunityToolkit.Aspire.Hosting.k6.cs create mode 100644 src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj create mode 100644 src/CommunityToolkit.Aspire.Minio.Client/MinioClientBuilderExtensionMethods.cs create mode 100644 src/CommunityToolkit.Aspire.Minio.Client/MinioClientSettings.cs create mode 100644 src/CommunityToolkit.Aspire.Minio.Client/README.md create mode 100644 src/Shared/Adminer/AdminerLoginServer.cs delete mode 100644 src/Shared/Sqlite/SqliteExtensionMetadata.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj delete mode 100644 tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests.csproj delete mode 100644 tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/ResourceCreationTests.cs delete mode 100644 tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/SwaHostingComponentTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/AppHostTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/CommunityToolkit.Aspire.Hosting.Minio.Tests.csproj create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/ResourceCreationTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/AppHostTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests.csproj create mode 100644 tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/IntegrationTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/PackageInstallationTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/AppHostTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests.csproj create mode 100644 tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/Database.publish.xml delete mode 100644 tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/ResourceWithExtensionTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Minio.Client.Tests/CommunityToolkit.Aspire.Minio.Client.Tests.csproj create mode 100644 tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConfigurationTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConformanceTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioClientPublicApiTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioContainerFeature.cs diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index fdbb4f30..1c16161d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -61,7 +61,7 @@ body: label: IDE and version description: Check one or more of the following options options: - - VS 2019 + - VS Code - VS 2022 - VS 2022 Preview - Rider diff --git a/.github/chatmodes/New Aspire Hosting integration.chatmode.md b/.github/chatmodes/New Aspire Hosting integration.chatmode.md new file mode 100644 index 00000000..a56a5a09 --- /dev/null +++ b/.github/chatmodes/New Aspire Hosting integration.chatmode.md @@ -0,0 +1,259 @@ +--- +description: "This chat mode is to create a new .NET Aspire hosting integration, using the design in the Community Toolkit repo." +tools: [ + "changes", + "codebase", + "editFiles", + "fetch", + "new", + "problems", + "runCommands", + "runTasks", + "search", + "searchResults", + "usages", + ] +--- + +# New Aspire Hosting Integration + +You are going to develop a new .NET Aspire hosting integration. The following in the process in which you need to go through to complete the task. + +## 1. Collect Requirements + +You are going to need to know: + +- The name of the hosting integration. +- The description of the hosting integration. + +This will be important to ensure that the hosting integration is created correctly. + +Ideally, the user should provide a URL for the docs on how to run the tool that the hosting integration is for, using the `fetch` tool, so that you can use it to understand how the tool works and how to implement the hosting integration. + +## 2. Scaffold the C# project + +Start by creating a new C# class library project in the `src` folder. The project should be named `CommunityToolkit.Aspire.Hosting.`, where `` is the name of the hosting integration you are creating. + +It can be created using the following command: + +```bash +dotnet new classlib -n CommunityToolkit.Aspire.Hosting. -o src/CommunityToolkit.Aspire.Hosting. +``` + +Once created the `csproj` file can be stripped back to just the following minimal starting point: + +```xml + + + + hosting $HostingIntegrationName + $HostingIntegrationDescription. + + + +``` + +Also create an empty `README.md` file in the root of the project with the following content: + +```markdown +# CommunityToolkit.Aspire.Hosting. + +TODO: Add a description of the hosting integration. +``` + +Ensure that the project is added to the solution file, which is in the repo root, and can be done using: + +```bash +dotnet sln add src/CommunityToolkit.Aspire.Hosting. +``` + +## 3. Implement the Hosting Integration + +An integration consists of two main parts, a `Resource` implementation, and extension methods for adding it to the `IDistributedApplicationBuilder`. + +### 3.1 Create the Resource + +There are multiple choices for the `Resource` implementation. Using the knowledge of the thing to be hosted, you can choose the most appropriate from the list: + +- `ExecutableResource` - For running a local executable (e.g. Node.js, Python, Rust, etc.) +- `ContainerResource` - For running a container image using Docker. +- `Resource` - For running a generic resource that does not fit into the above categories. + +Here is an example of how to implement a `ContainerResource`: + +```csharp +namespace Aspire.Hosting.ApplicationModel; + +/// +/// A resource that represents an Ollama container. +/// +/// +/// Constructs an . +/// +/// The name for the resource. +public class OllamaResource(string name) : ContainerResource(name), IResourceWithConnectionString +{ + internal const string OllamaEndpointName = "http"; + + private readonly List _models = []; + + private EndpointReference? _primaryEndpointReference; + + /// + /// Adds a model to the list of models to download on initial startup. + /// + public IReadOnlyList Models => _models; + + /// + /// Gets the endpoint for the Ollama server. + /// + public EndpointReference PrimaryEndpoint => _primaryEndpointReference ??= new(this, OllamaEndpointName); + + /// + /// Gets the connection string expression for the Ollama server. + /// + public ReferenceExpression ConnectionStringExpression => + ReferenceExpression.Create( + $"Endpoint={PrimaryEndpoint.Property(EndpointProperty.Scheme)}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}" + ); + + /// + /// Adds a model to the list of models to download on initial startup. + /// + /// The name of the model + public void AddModel(string modelName) + { + ArgumentException.ThrowIfNullOrEmpty(modelName, nameof(modelName)); + if (!_models.Contains(modelName)) + { + _models.Add(modelName); + } + } +} +``` + +Resources can also have endpoints, which are used to connect to the resource, they can also expose a connection string expression, which is used to connect to the resource in a more generic way. + +The following requirements **must** be met when implementing a resource: + +- Namespace: `Aspire.Hosting.ApplicationModel`. +- Class name: `Resource`. +- Inherits from `Resource`, `ContainerResource`, or `ExecutableResource`. +- Public constructor that takes a `string name` parameter. +- If the resource has a connection string, it must implement `IResourceWithConnectionString`. +- If the resource has endpoints, it must implement `IResourceWithEndpoints`. +- Public methods, properties, and events should be documented with XML comments. + +### 3.2 Create the Extension Methods + +Next, you need to create extension methods for the `IDistributedApplicationBuilder` to add the resource to the application. This is done by creating a static class with a method that takes an `IDistributedApplicationBuilder` and returns an `IResourceBuilder`. + +Here is an example of how to implement the extension method for the `OllamaResource`: + +```csharp +namespace Aspire.Hosting; + +/// +/// Extension methods for adding a Bun app to a . +/// +public static class BunAppExtensions +{ + /// + /// Adds a Bun app to the builder. + /// + /// The to add the resource to. + /// The name of the resource. + /// The working directory. + /// The entry point, either a file or package.json script name. + /// Whether to watch for changes. + /// A reference to the . + public static IResourceBuilder AddBunApp( + this IDistributedApplicationBuilder builder, + [ResourceName] string name, + string? workingDirectory = null, + string entryPoint = "index.ts", + bool watch = false) + { + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + ArgumentException.ThrowIfNullOrEmpty(name, nameof(name)); + ArgumentException.ThrowIfNullOrEmpty(entryPoint, nameof(entryPoint)); + + workingDirectory ??= Path.Combine("..", name); + + var resource = new BunAppResource(name, PathNormalizer.NormalizePathForCurrentPlatform(Path.Combine(builder.AppHostDirectory, workingDirectory))); + + string[] args = watch ? ["--watch", "run", entryPoint] : ["run", entryPoint]; + + return builder.AddResource(resource) + .WithBunDefaults() + .WithArgs(args); + } +} +``` + +The extension method should meet the following requirements: + +- Namespace: `Aspire.Hosting`. +- Class name: `Extensions`. +- Static class with a static method. +- Method name: `Add`. +- Method parameters: + - `IDistributedApplicationBuilder builder` - The builder to add the resource to. + - `string name` - The name of the resource, decorated with `[ResourceName]`. + - Additional parameters as required by the resource. +- Returns an `IResourceBuilder` where `T` is the resource type. +- The method should call `builder.AddResource(resource)` to add the resource to the builder. +- Perform `ArgumentNullException.ThrowIfNull` and `ArgumentException.ThrowIfNullOrEmpty` checks on the parameters. + +## 4. Sample Usage + +You need to create a sample usage of the hosting integration in the `examples` folder. This should be a minimal example that demonstrates how to use the hosting integration in a .NET Aspire application. + +Start by scaffolding a new .NET Aspire App Host project in the `examples` folder. This can be done using the following command: + +```bash +dotnet new aspire-apphost -n CommunityToolkit.Aspire.Hosting..AppHost -o examples/CommunityToolkit.Aspire.Hosting..AppHost +``` + +Make sure to add the project to the solution with `dotnet sln add examples/CommunityToolkit.Aspire.Hosting..AppHost`. + +Once created, refer to existing AppHost `csproj` files to ensure that the right packages are referenced, such as `CommunityToolkit.Aspire.Hosting.`. For the `Sdk`, ensure the version is `$(AspireAppHostSdkVersion)`, since we use a MSBuild variable to ensure that a consistent version is used across all App Host projects. Any `PackageReference` elements should **not** have a version specified. + +Next, edit the `AppHost.cs` file that the template created to use the hosting integration. + +Here is an example of how to use the `BunResource` in the `AppHost.cs` file: + +```csharp +var builder = DistributedApplication.CreateBuilder(args); + +var api = builder.AddBunApp("api") + .WithBunPackageInstallation() + .WithHttpEndpoint(env: "PORT") + .WithHttpHealthCheck("/"); + +builder.Build().Run(); +``` + +Ensure that the example is a minimal working example that can be run using the `dotnet run` command. + +## 5. Tests + +You need to create tests for the hosting integration. This should include unit tests for the resource implementation and integration tests for the extension methods. + +The tests should be placed in a new test project in the `tests` folder. The project should be named `CommunityToolkit.Aspire.Hosting..Tests`, and can be created using the following command: + +```bash +dotnet new xunit -n CommunityToolkit.Aspire.Hosting..Tests -o tests/CommunityToolkit.Aspire.Hosting..Tests +``` + +Make sure to add the project to the solution with `dotnet sln add examples/CommunityToolkit.Aspire.Hosting..AppHost`. + +Ensure that the test project references the hosting integration project and any necessary Aspire packages. Refer to other test projects in the `tests` folder for guidance on how to set up the project file. + +Once the project is created, you can start writing tests for the resource implementation and extension methods. Ensure that the tests cover all public methods and properties of the resource, as well as the extension methods. + +## 6. Documentation + +Once the integration is implemented, you need to update the `README.md` file in the hosting integration project to include a description of the hosting integration, how to use it, and any other relevant information. + +Also, update the root `README.md` file of the repo to include a link to the new hosting integration in the table that exists. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 8a923b8c..92228904 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -7,6 +7,8 @@ - Use file-scoped namespaces. - All public members require doc comments. - Prefer type declarations over `var` when the type isn't obvious. +- Use the C# Collection Initializer syntax, `List items = []` (where `List` could be any collection type), rather than `new()`. +- Use `is not null` or `is null` over `!= null` and `== null`. ## Sample hosting integration diff --git a/.github/dependabot.yml b/.github/dependabot.yml index f14ebfc3..ad76c52d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,10 @@ updates: directory: "/" # Location of package manifests schedule: interval: "weekly" + ignore: + # Ignore Aspire.Hosting and Aspire.Hosting.* . We have a separate process for updating them + - dependency-name: "Aspire.Hosting" + - dependency-name: "Aspire.Hosting.*" - package-ecosystem: "github-actions" # See documentation for possible values directory: "/" # Location of package manifests schedule: diff --git a/.github/prompts/my-issues.prompt.md b/.github/prompts/my-issues.prompt.md new file mode 100644 index 00000000..e024ad19 --- /dev/null +++ b/.github/prompts/my-issues.prompt.md @@ -0,0 +1,8 @@ +--- +mode: agent +tools: ['githubRepo', 'github', 'get_issue', 'get_issue_comments', 'get_me', 'list_issues'] +--- + +Search the current repo (using #githubRepo for the repo info) and list any issues you find (using #list_issues) that are assigned to me. + +Suggest issues that I might want to focus on based on their age, the amount of comments, and their status (open/closed). diff --git a/.github/prompts/my-pull-requests.prompt.md b/.github/prompts/my-pull-requests.prompt.md new file mode 100644 index 00000000..6f1d4028 --- /dev/null +++ b/.github/prompts/my-pull-requests.prompt.md @@ -0,0 +1,14 @@ +--- +mode: agent +tools: ['githubRepo', 'github', 'get_me', 'get_pull_request', 'get_pull_request_comments', 'get_pull_request_diff', 'get_pull_request_files', 'get_pull_request_reviews', 'get_pull_request_status', 'list_pull_requests', 'request_copilot_review'] +--- + +Search the current repo (using #githubRepo for the repo info) and list any pull requests you find (using #list_pull_requests) that are assigned to me. + +Describe the purpose and details of each pull request. + +If a PR is waiting for someone to review, highlight that in the response. + +If there were any check failures on the PR, describe them and suggest possible fixes. + +If there was no review done by Copilot, offer to request one using #request_copilot_review. \ No newline at end of file diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index ab466715..947f88bd 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -15,7 +15,7 @@ jobs: pattern: testresults-* - name: Combine coverage reports - uses: danielpalme/ReportGenerator-GitHub-Action@5.4.5 + uses: danielpalme/ReportGenerator-GitHub-Action@5.4.8 with: reports: "**/*.cobertura.xml" targetdir: "${{ github.workspace }}/report" diff --git a/.github/workflows/dotnet-ci.yml b/.github/workflows/dotnet-ci.yml index e7e4f8a9..9b232915 100644 --- a/.github/workflows/dotnet-ci.yml +++ b/.github/workflows/dotnet-ci.yml @@ -7,11 +7,13 @@ on: - "src/**" - "examples/**" - "tests/**" + - "tests-app-hosts/**" - Directory.Build.props - Directory.Build.targets - Directory.Packages.props - ".github/workflows/**" - ".github/actions/**" + - "CommunityToolkit.Aspire.slnx" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/generate-api-diffs.yml b/.github/workflows/generate-api-diffs.yml index ad5d1abe..99bb9893 100644 --- a/.github/workflows/generate-api-diffs.yml +++ b/.github/workflows/generate-api-diffs.yml @@ -12,6 +12,7 @@ permissions: jobs: generate-and-pr: runs-on: ubuntu-latest + if: github.repository == 'CommunityToolkit/Aspire' steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7396bde3..1a97bfec 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -20,11 +20,11 @@ jobs: name: [ # Hosting integration tests Hosting.ActiveMQ.Tests, + Hosting.Adminer.Tests, + Hosting.Azure.Dapr.Redis.Tests, + Hosting.Azure.Dapr.Tests, Hosting.Azure.DataApiBuilder.Tests, - Hosting.Azure.StaticWebApps.Tests, Hosting.Bun.Tests, - Hosting.Azure.Dapr.Tests, - Hosting.Azure.Dapr.Redis.Tests, Hosting.Dapr.Tests, Hosting.DbGate.Tests, Hosting.Deno.Tests, @@ -32,23 +32,26 @@ jobs: Hosting.GoFeatureFlag.Tests, Hosting.Golang.Tests, Hosting.Java.Tests, - Hosting.k6.Tests, Hosting.LavinMQ.Tests, Hosting.MailPit.Tests, Hosting.Meilisearch.Tests, Hosting.MongoDB.Extensions.Tests, + Hosting.MySql.Extensions.Tests, Hosting.Ngrok.Tests, Hosting.NodeJS.Extensions.Tests, Hosting.Ollama.Tests, Hosting.PapercutSmtp.Tests, Hosting.PostgreSQL.Extensions.Tests, + Hosting.PowerShell.Tests, Hosting.Python.Extensions.Tests, Hosting.RavenDB.Tests, Hosting.Redis.Extensions.Tests, Hosting.Rust.Tests, Hosting.SqlDatabaseProjects.Tests, - Hosting.Sqlite.Tests, Hosting.SqlServer.Extensions.Tests, + Hosting.Sqlite.Tests, + Hosting.k6.Tests, + Hosting.Minio.Tests, # Client integration tests EventStore.Tests, @@ -59,6 +62,7 @@ jobs: Microsoft.EntityFrameworkCore.Sqlite.Tests, OllamaSharp.Tests, RavenDB.Client.Tests, + Minio.Client.Tests, ] steps: @@ -120,3 +124,4 @@ jobs: with: name: testresults-${{ matrix.name }}-${{ matrix.os }} path: testresults/** + diff --git a/CODEOWNERS b/CODEOWNERS index c6f3c761..b67fb7f0 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -102,4 +102,14 @@ # CommunityToolkit.Aspire.Hosting.SqlServer.Extensions /src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/ @Alirexaa /tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ @Alirexaa -/examples/sqlserver-ext/ @Alirexaa \ No newline at end of file +/examples/sqlserver-ext/ @Alirexaa + +# CommunityToolkit.Aspire.Minio.Client +# CommunityToolkit.Aspire.Hosting.Minio + +/examples/minio/ @Harold-Morgan +/src/CommunityToolkit.Aspire.Hosting.Minio/ @Harold-Morgan +/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/ @Harold-Morgan + +/src/CommunityToolkit.Aspire.Minio.Client/ @Harold-Morgan +/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ @Harold-Morgan \ No newline at end of file diff --git a/CommunityToolkit.Aspire.sln b/CommunityToolkit.Aspire.sln deleted file mode 100644 index f14fb2d9..00000000 --- a/CommunityToolkit.Aspire.sln +++ /dev/null @@ -1,2425 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.12.35101.237 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{414151D4-7009-4E78-A5C6-D99EBD1E67D1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java", "src\CommunityToolkit.Aspire.Hosting.Java\CommunityToolkit.Aspire.Hosting.Java.csproj", "{DAA67050-44B3-458F-9818-5877D606866A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps", "src\CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps\CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.csproj", "{125DFA83-328D-4F8B-91EC-3057FFF410BE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{8519CC01-1370-47C8-AD94-B0F326B1563F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "java", "java", "{F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.WebApp", "examples\java\CommunityToolkit.Aspire.Hosting.Java.WebApp\CommunityToolkit.Aspire.Hosting.Java.WebApp.csproj", "{3D767C8C-7E04-4264-B4E9-13600650D2B1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.ApiApp", "examples\java\CommunityToolkit.Aspire.Hosting.Java.ApiApp\CommunityToolkit.Aspire.Hosting.Java.ApiApp.csproj", "{34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.AppHost", "examples\java\CommunityToolkit.Aspire.Hosting.Java.AppHost\CommunityToolkit.Aspire.Hosting.Java.AppHost.csproj", "{55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.ServiceDefaults", "examples\java\CommunityToolkit.Aspire.Hosting.Java.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Java.ServiceDefaults.csproj", "{BBAFA814-1026-4A39-AA28-BCAE3951A224}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{899F0713-7FC6-4750-BAFC-AC650B35B453}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Java.Tests", "tests\CommunityToolkit.Aspire.Hosting.Java.Tests\CommunityToolkit.Aspire.Hosting.Java.Tests.csproj", "{E2905A71-E25D-46FC-A128-D6A366D4D751}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests", "tests\CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests\CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests.csproj", "{1B55E682-B518-4E59-8972-07C82ED5A677}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Testing", "tests\CommunityToolkit.Aspire.Testing\CommunityToolkit.Aspire.Testing.csproj", "{4C1D5422-4C52-4603-A01A-E1E6304633EC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "swa", "swa", "{564FA6A0-EC54-41C6-A35F-89890E1D06E3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.StaticWebApps.AppHost", "examples\swa\CommunityToolkit.Aspire.StaticWebApps.AppHost\CommunityToolkit.Aspire.StaticWebApps.AppHost.csproj", "{C083A377-13CA-47C1-8B17-1FE353EA76F0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.StaticWebApps.ApiApp", "examples\swa\CommunityToolkit.Aspire.StaticWebApps.ApiApp\CommunityToolkit.Aspire.StaticWebApps.ApiApp.csproj", "{BAEA0F6F-39E9-4893-8787-C4D292D3B169}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults", "examples\swa\CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults\CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults.csproj", "{83FF8083-7EE2-4196-86A8-239F921B443C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.NodeJS.Extensions", "src\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.csproj", "{1F299343-30DF-4599-A95D-BCFB1754DA48}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nodejs-ext", "nodejs-ext", "{261AC321-8982-4C3A-8DBF-DAFC95F97697}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost", "examples\nodejs-ext\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost.csproj", "{D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests\CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests.csproj", "{E8F93376-1367-4A7B-A729-116199804356}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Ollama", "src\CommunityToolkit.Aspire.Hosting.Ollama\CommunityToolkit.Aspire.Hosting.Ollama.csproj", "{6C6696CB-8DCC-4E93-A667-A313D70E0220}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Ollama.Tests", "tests\CommunityToolkit.Aspire.Hosting.Ollama.Tests\CommunityToolkit.Aspire.Hosting.Ollama.Tests.csproj", "{1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ollama", "ollama", "{14BD8AE7-C8DF-4C7C-8244-7F74C101569D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Ollama.AppHost", "examples\ollama\CommunityToolkit.Aspire.Hosting.Ollama.AppHost\CommunityToolkit.Aspire.Hosting.Ollama.AppHost.csproj", "{F4602DC8-3C17-4834-B640-9A3B27FE278A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Ollama.ServiceDefaults", "examples\ollama\CommunityToolkit.Aspire.Hosting.Ollama.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Ollama.ServiceDefaults.csproj", "{2F037600-2002-4A13-9359-98FB0D2416BE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Ollama.Web", "examples\ollama\CommunityToolkit.Aspire.Hosting.Ollama.Web\CommunityToolkit.Aspire.Hosting.Ollama.Web.csproj", "{0A17021E-5F10-429B-88C8-E4073EADACB6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Meilisearch", "src\CommunityToolkit.Aspire.Hosting.Meilisearch\CommunityToolkit.Aspire.Hosting.Meilisearch.csproj", "{7BE7C12A-AE0A-4D0B-A076-325AD6E02475}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Meilisearch", "src\CommunityToolkit.Aspire.Meilisearch\CommunityToolkit.Aspire.Meilisearch.csproj", "{93031B72-2045-48C6-9585-DC7FA0BA967B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Golang", "src\CommunityToolkit.Aspire.Hosting.Golang\CommunityToolkit.Aspire.Hosting.Golang.csproj", "{93789F1B-0539-49B5-A585-9F6EF9E88264}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "golang", "golang", "{03950661-2B1F-48F4-91D2-1E6395B710C2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Golang.AppHost", "examples\golang\CommunityToolkit.Aspire.Hosting.Golang.AppHost\CommunityToolkit.Aspire.Hosting.Golang.AppHost.csproj", "{3A03552A-252D-4E86-A8D7-135579AAEB85}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Golang.ServiceDefaults", "examples\golang\CommunityToolkit.Aspire.Hosting.Golang.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Golang.ServiceDefaults.csproj", "{C60BCC90-BAEE-4678-ACC9-11553AA64249}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Golang.Tests", "tests\CommunityToolkit.Aspire.Hosting.Golang.Tests\CommunityToolkit.Aspire.Hosting.Golang.Tests.csproj", "{0294714B-A1CC-4F8E-8935-315B3499638F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.OllamaSharp", "src\CommunityToolkit.Aspire.OllamaSharp\CommunityToolkit.Aspire.OllamaSharp.csproj", "{22D81BC2-2659-483A-B7AC-8FCA086A99A7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.OllamaSharp.Tests", "tests\CommunityToolkit.Aspire.OllamaSharp.Tests\CommunityToolkit.Aspire.OllamaSharp.Tests.csproj", "{B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Meilisearch.Tests", "tests\CommunityToolkit.Aspire.Hosting.Meilisearch.Tests\CommunityToolkit.Aspire.Hosting.Meilisearch.Tests.csproj", "{C715669D-FBDE-4BFF-B9A3-75615D3C179A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Meilisearch.Tests", "tests\CommunityToolkit.Aspire.Meilisearch.Tests\CommunityToolkit.Aspire.Meilisearch.Tests.csproj", "{0AACC135-9624-423D-8988-69701C0FE428}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meilisearch", "meilisearch", "{561CEB82-3D97-49D0-932E-664E6779FC61}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost", "examples\meilisearch\CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost\CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj", "{6B9357F7-014F-4725-AF3E-0B8EA17B62C5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults", "examples\meilisearch\CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults.csproj", "{E4E93A24-0A97-419F-836C-EAA23D0FFF81}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService", "examples\meilisearch\CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService\CommunityToolkit.Aspire.Hosting.Meilisearch.ApiService.csproj", "{F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder", "src\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.csproj", "{BAF22B80-2937-4695-A613-F170D8FB9020}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data-api-builder", "data-api-builder", "{2B60C5B7-7502-448E-8881-3DD29C1DE999}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.Tests", "tests\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.Tests\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.Tests.csproj", "{9D79154C-E503-4D6C-BCED-EEC82E314FBE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost", "examples\data-api-builder\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.AppHost.csproj", "{A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.ServiceDefaults", "examples\data-api-builder\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.ServiceDefaults.csproj", "{0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.BlazorApp", "examples\data-api-builder\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.BlazorApp\CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.BlazorApp.csproj", "{B42EFEB5-6196-4D8C-A46C-671D339B3C15}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deno", "deno", "{B63EBC68-9A38-41C0-826E-95CD14B067A4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Deno.Tests", "tests\CommunityToolkit.Aspire.Hosting.Deno.Tests\CommunityToolkit.Aspire.Hosting.Deno.Tests.csproj", "{A92E70F9-8028-4E0C-B167-884E1E56854F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Deno", "src\CommunityToolkit.Aspire.Hosting.Deno\CommunityToolkit.Aspire.Hosting.Deno.csproj", "{259D0D48-C856-47C8-8014-66CE9A7C353F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.Deno.AppHost", "examples\deno\CommunityToolkit.Aspire.Hosting.Deno.AppHost\CommunityToolkit.Aspire.Hosting.Deno.AppHost.csproj", "{6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects", "src\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.csproj", "{AADE70FC-9F6D-47EC-8141-A30F6EFF8095}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sql-database-projects", "sql-database-projects", "{4AE83D68-EA10-473D-BD26-19C5928A8620}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost", "examples\sql-database-projects\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost.csproj", "{79EF8E85-1DFC-42B5-BDE3-72639F25848C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests", "tests\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests\CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests.csproj", "{C7D057AF-E2A5-4E26-846E-A328A0F14A3C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Rust", "src\CommunityToolkit.Aspire.Hosting.Rust\CommunityToolkit.Aspire.Hosting.Rust.csproj", "{6BC98146-279F-4DE5-9B6E-0F0C07507421}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rust", "rust", "{662514C8-EAED-4EAB-91CE-893D4DE2469A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Rust.AppHost", "examples\rust\CommunityToolkit.Aspire.Hosting.Rust.AppHost\CommunityToolkit.Aspire.Hosting.Rust.AppHost.csproj", "{1E753568-E34B-4E93-93F8-43764171725D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Rust.ServiceDefaults", "examples\rust\CommunityToolkit.Aspire.Hosting.Rust.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Rust.ServiceDefaults.csproj", "{FB9B8F61-5125-452B-8332-938DCFA27366}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Rust.Tests", "tests\CommunityToolkit.Aspire.Hosting.Rust.Tests\CommunityToolkit.Aspire.Hosting.Rust.Tests.csproj", "{373472DA-BAEB-44B6-915D-1EF3DA845797}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests-app-hosts", "tests-app-hosts", "{79CBF217-CED1-4BB2-9A72-37D2429F83B8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ollama.AppHost", "tests-app-hosts\Ollama.AppHost\Ollama.AppHost.csproj", "{2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Python.Extensions", "src\CommunityToolkit.Aspire.Hosting.Python.Extensions\CommunityToolkit.Aspire.Hosting.Python.Extensions.csproj", "{4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "python", "python", "{DDDAABA3-D8F0-47C6-98E0-AB57F28404CF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost", "examples\python\CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.Python.Extensions.AppHost.csproj", "{C686CEA0-8B89-470B-84A2-0264040DCDC8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Python.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.Python.Extensions.Tests\CommunityToolkit.Aspire.Hosting.Python.Extensions.Tests.csproj", "{5B825CF9-E8B8-4960-9330-648ED0323FE0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Bun", "src\CommunityToolkit.Aspire.Hosting.Bun\CommunityToolkit.Aspire.Hosting.Bun.csproj", "{6095E8B8-7F99-4A12-B7E2-376F7EDD7435}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bun", "bun", "{A7614F2B-E810-412E-91E7-8B6272DD5DBB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Bun.AppHost", "examples\bun\CommunityToolkit.Aspire.Hosting.Bun.AppHost\CommunityToolkit.Aspire.Hosting.Bun.AppHost.csproj", "{36FC2579-582A-4DAF-9B20-AB33331624C6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Bun.Tests", "tests\CommunityToolkit.Aspire.Hosting.Bun.Tests\CommunityToolkit.Aspire.Hosting.Bun.Tests.csproj", "{DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.MassTransit.RabbitMQ", "src\CommunityToolkit.Aspire.MassTransit.RabbitMQ\CommunityToolkit.Aspire.MassTransit.RabbitMQ.csproj", "{887F91FF-C41D-4286-AD0F-DE56516E4E73}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "masstransit-rabbitmq", "masstransit-rabbitmq", "{5FB20992-C7C3-4A4C-8117-FD26D156554A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.MassTransit.RabbitMQ.ApiService", "examples\masstransit-rabbitmq\CommunityToolkit.Aspire.MassTransit.RabbitMQ.ApiService\CommunityToolkit.Aspire.MassTransit.RabbitMQ.ApiService.csproj", "{23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost", "examples\masstransit-rabbitmq\CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost\CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.AppHost.csproj", "{8D3EED95-8EE5-421D-9161-F2AFA8D22543}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.ServiceDefaults", "examples\masstransit-rabbitmq\CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.ServiceDefaults\CommunityToolkit.Aspire.Hosting.MassTransit.RabbitMQ.ServiceDefaults.csproj", "{F9279F45-8A1F-41C0-B027-0EF6FFE3B706}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.MassTransit.RabbitMQ.MessageTypes", "examples\masstransit-rabbitmq\CommunityToolkit.Aspire.MassTransit.RabbitMQ.MessageTypes\CommunityToolkit.Aspire.MassTransit.RabbitMQ.MessageTypes.csproj", "{A855190A-DE7A-4B98-835D-7C23E1B600D2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.MassTransit.RabbitMQ.Publisher", "examples\masstransit-rabbitmq\CommunityToolkit.Aspire.MassTransit.RabbitMQ.Publisher\CommunityToolkit.Aspire.MassTransit.RabbitMQ.Publisher.csproj", "{2A405CF6-72CA-488D-A159-2D5F72C7E2DF}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "eventstore", "eventstore", "{114DDF07-489A-419B-BE76-E5A289F12791}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.EventStore", "src\CommunityToolkit.Aspire.Hosting.EventStore\CommunityToolkit.Aspire.Hosting.EventStore.csproj", "{B209275E-1CFF-4AF0-A65A-2895DD679775}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.EventStore", "src\CommunityToolkit.Aspire.EventStore\CommunityToolkit.Aspire.EventStore.csproj", "{AD230A69-F6AE-4A9B-B500-90516BA2E1C6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.EventStore.Tests", "tests\CommunityToolkit.Aspire.Hosting.EventStore.Tests\CommunityToolkit.Aspire.Hosting.EventStore.Tests.csproj", "{FA34A40C-62C9-4A73-A39D-53A01243657C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.EventStore.AppHost", "examples\eventstore\CommunityToolkit.Aspire.Hosting.EventStore.AppHost\CommunityToolkit.Aspire.Hosting.EventStore.AppHost.csproj", "{ED3E5B89-091C-4A0E-9A2B-946CA1A11557}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.EventStore.ServiceDefaults", "examples\eventstore\CommunityToolkit.Aspire.Hosting.EventStore.ServiceDefaults\CommunityToolkit.Aspire.Hosting.EventStore.ServiceDefaults.csproj", "{0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.EventStore.ApiService", "examples\eventstore\CommunityToolkit.Aspire.Hosting.EventStore.ApiService\CommunityToolkit.Aspire.Hosting.EventStore.ApiService.csproj", "{019D6506-9D68-41AD-A7A1-A27B2FFE1253}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.EventStore.Tests", "tests\CommunityToolkit.Aspire.EventStore.Tests\CommunityToolkit.Aspire.EventStore.Tests.csproj", "{C696480B-C2E0-4ACA-BD5E-A62BF8558024}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "activemq", "activemq", "{BF4C4E57-DAAF-4EE5-B330-1923106BAE69}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost", "examples\activemq\CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost\CommunityToolkit.Aspire.Hosting.ActiveMQ.AppHost.csproj", "{CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.ActiveMQ.ServiceDefaults", "examples\activemq\CommunityToolkit.Aspire.Hosting.ActiveMQ.ServiceDefaults\CommunityToolkit.Aspire.Hosting.ActiveMQ.ServiceDefaults.csproj", "{978EED2A-43BB-4DE6-8563-3A9972869661}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit", "examples\activemq\CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit\CommunityToolkit.Aspire.Hosting.ActiveMQ.MassTransit.csproj", "{A87F7800-BD24-4577-8F15-50D33C8DACF1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests", "tests\CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests\CommunityToolkit.Aspire.Hosting.ActiveMQ.Tests.csproj", "{1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.MassTransit.RabbitMQ.Tests", "tests\CommunityToolkit.Aspire.MassTransit.RabbitMQ.Tests\CommunityToolkit.Aspire.MassTransit.RabbitMQ.Tests.csproj", "{DE596B1A-B923-4D19-89B6-A361FA4EB5BF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.ActiveMQ", "src\CommunityToolkit.Aspire.Hosting.ActiveMQ\CommunityToolkit.Aspire.Hosting.ActiveMQ.csproj", "{0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Ngrok", "src\CommunityToolkit.Aspire.Hosting.Ngrok\CommunityToolkit.Aspire.Hosting.Ngrok.csproj", "{84DCC422-2F8D-4309-A324-07E2C8C2EE8E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ngrok", "ngrok", "{7431DE02-23CA-4024-B22D-FCF008AFE3CB}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Ngrok.AppHost", "examples\ngrok\CommunityToolkit.Aspire.Hosting.Ngrok.AppHost\CommunityToolkit.Aspire.Hosting.Ngrok.AppHost.csproj", "{FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Ngrok.ApiService", "examples\ngrok\CommunityToolkit.Aspire.Hosting.Ngrok.ApiService\CommunityToolkit.Aspire.Hosting.Ngrok.ApiService.csproj", "{1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Ngrok.ServiceDefauls", "examples\ngrok\CommunityToolkit.Aspire.Hosting.Ngrok.ServiceDefauls\CommunityToolkit.Aspire.Hosting.Ngrok.ServiceDefauls.csproj", "{59101126-7BD2-4E03-9C4D-D0D01AD14674}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Ngrok.Tests", "tests\CommunityToolkit.Aspire.Hosting.Ngrok.Tests\CommunityToolkit.Aspire.Hosting.Ngrok.Tests.csproj", "{31D2ECC1-15EA-4850-88E9-A5F967D742C9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Sqlite", "src\CommunityToolkit.Aspire.Hosting.Sqlite\CommunityToolkit.Aspire.Hosting.Sqlite.csproj", "{BEA41234-DFF9-49AE-AD6C-42A9D54202E7}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sqlite", "sqlite", "{6782F1C1-5146-549F-82A8-60C82F1C7F16}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Sqlite.AppHost", "examples\sqlite\CommunityToolkit.Aspire.Sqlite.AppHost\CommunityToolkit.Aspire.Sqlite.AppHost.csproj", "{97E455C1-C914-4C51-87A9-2C213CE2ED5B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Microsoft.Data.Sqlite", "src\CommunityToolkit.Aspire.Microsoft.Data.Sqlite\CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj", "{5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Sqlite.Api", "examples\sqlite\CommunityToolkit.Aspire.Sqlite.Api\CommunityToolkit.Aspire.Sqlite.Api.csproj", "{E48F6DDD-D62D-4723-810D-0F178C35E8B8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Sqlite.ServiceDefaults", "examples\sqlite\CommunityToolkit.Aspire.Sqlite.ServiceDefaults\CommunityToolkit.Aspire.Sqlite.ServiceDefaults.csproj", "{DD7042A1-8E44-40A8-B338-DC2F7B755702}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite", "src\CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite\CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj", "{E54E9DCA-1420-4306-83B6-D45D6EC49DBF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Sqlite.Tests", "tests\CommunityToolkit.Aspire.Hosting.Sqlite.Tests\CommunityToolkit.Aspire.Hosting.Sqlite.Tests.csproj", "{0E6EBCFB-DEF5-496C-95AF-00884826CFC8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests", "tests\CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests\CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests.csproj", "{861FE61C-90EE-49B0-BCC8-8417C293CC21}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests", "tests\CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests\CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj", "{52846E18-99D1-4040-AF5F-17FC69198BCE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions", "src\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj", "{D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost", "examples\postgres-ext\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost.csproj", "{C46D82D9-327E-43CE-9FEB-B0A233E1C094}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PapercutSmtp", "src\CommunityToolkit.Aspire.Hosting.PapercutSmtp\CommunityToolkit.Aspire.Hosting.PapercutSmtp.csproj", "{E267907F-4467-4504-9947-2A5A6940DE9B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "papercut", "papercut", "{2B0503E5-4FD5-4ED5-8AFA-8FC9609FCEC1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost", "examples\papercut\CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost\CommunityToolkit.Aspire.Hosting.PapercutSmtp.AppHost.csproj", "{9772004D-0905-421A-98C6-DAE1C35080B3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PapercutSmtp.ServiceDefaults", "examples\papercut\CommunityToolkit.Aspire.Hosting.PapercutSmtp.ServiceDefaults\CommunityToolkit.Aspire.Hosting.PapercutSmtp.ServiceDefaults.csproj", "{449B3661-A6F2-46D3-8EC9-B515362A72C1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PapercutSmtp.SendMailApi", "examples\papercut\CommunityToolkit.Aspire.Hosting.PapercutSmtp.SendMailApi\CommunityToolkit.Aspire.Hosting.PapercutSmtp.SendMailApi.csproj", "{70A77931-7D25-4CBF-AE55-F5A3B932E9F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PapercutSmtp.Tests", "tests\CommunityToolkit.Aspire.Hosting.PapercutSmtp.Tests\CommunityToolkit.Aspire.Hosting.PapercutSmtp.Tests.csproj", "{80CCC017-3821-4F7D-902C-BB71DE875F58}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dapr", "dapr", "{E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.AppHost", "examples\dapr\CommunityToolkit.Aspire.Hosting.Dapr.AppHost\CommunityToolkit.Aspire.Hosting.Dapr.AppHost.csproj", "{B81CEEE6-991E-418C-96D3-F831540C6DE1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.ServiceA", "examples\dapr\CommunityToolkit.Aspire.Hosting.Dapr.ServiceA\CommunityToolkit.Aspire.Hosting.Dapr.ServiceA.csproj", "{B9BEA97B-D722-4390-A34D-228AE7947E7C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.ServiceB", "examples\dapr\CommunityToolkit.Aspire.Hosting.Dapr.ServiceB\CommunityToolkit.Aspire.Hosting.Dapr.ServiceB.csproj", "{D2DDEA96-4A7E-496B-AFBE-69A133156C5F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.ServiceC", "examples\dapr\CommunityToolkit.Aspire.Hosting.Dapr.ServiceC\CommunityToolkit.Aspire.Hosting.Dapr.ServiceC.csproj", "{5ADBE907-7E0B-4AD7-9073-C032C4183914}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.ServiceDefaults", "examples\dapr\CommunityToolkit.Aspire.Hosting.Dapr.ServiceDefaults\CommunityToolkit.Aspire.Hosting.Dapr.ServiceDefaults.csproj", "{99441705-4BFA-499F-9897-371238665E38}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.RavenDB.Client", "src\CommunityToolkit.Aspire.RavenDB.Client\CommunityToolkit.Aspire.RavenDB.Client.csproj", "{11768120-E86C-4464-A68A-6F9BD0999BB9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.RavenDB.Client.Tests", "tests\CommunityToolkit.Aspire.RavenDB.Client.Tests\CommunityToolkit.Aspire.RavenDB.Client.Tests.csproj", "{BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.RavenDB", "src\CommunityToolkit.Aspire.Hosting.RavenDB\CommunityToolkit.Aspire.Hosting.RavenDB.csproj", "{A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommunityToolkit.Aspire.Hosting.RavenDB.Tests", "tests\CommunityToolkit.Aspire.Hosting.RavenDB.Tests\CommunityToolkit.Aspire.Hosting.RavenDB.Tests.csproj", "{35B51242-F576-4CCE-BA29-712A80749CB1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ravendb", "ravendb", "{1C65F967-D5F1-424B-82E9-B8585B6F0BD6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.RavenDB.AppHost", "examples\ravendb\RavenDB.AppHost\CommunityToolkit.Aspire.Hosting.RavenDB.AppHost.csproj", "{28FCB1E2-7460-4FDD-AA63-03162C9F2154}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.RavenDB.ServiceDefaults", "examples\ravendb\CommunityToolkit.Aspire.Hosting.RavenDB.ServiceDefaults\CommunityToolkit.Aspire.Hosting.RavenDB.ServiceDefaults.csproj", "{3D076CFF-6482-4126-9F29-C7617E7D2F5B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.RavenDB.ApiService", "examples\ravendb\CommunityToolkit.Aspire.Hosting.RavenDB.ApiService\CommunityToolkit.Aspire.Hosting.RavenDB.ApiService.csproj", "{D214CBF5-D5E4-4641-868D-66B0C5337DD5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.DbGate.Tests", "tests\CommunityToolkit.Aspire.Hosting.DbGate.Tests\CommunityToolkit.Aspire.Hosting.DbGate.Tests.csproj", "{BDAF7D27-C600-4419-9782-CF15BA5272E9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "postgres-ext", "postgres-ext", "{204BB8D8-04E3-4FE5-BB08-E793BF532F2F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests\CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj", "{356853EE-2C47-429C-B6CF-F3F76B6FFD91}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.GoFeatureFlag", "src\CommunityToolkit.Aspire.Hosting.GoFeatureFlag\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.csproj", "{F926FB8A-77C6-4D39-AE44-9A7C11A3202D}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "goff", "goff", "{002E2F54-BB99-41F2-98D5-D6CC3B6A2845}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost", "examples\goff\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.AppHost.csproj", "{FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ServiceDefaults", "examples\goff\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ServiceDefaults\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ServiceDefaults.csproj", "{C4C113D8-7E40-4962-BBD8-735B478933D6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ApiService", "examples\goff\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ApiService\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.ApiService.csproj", "{3CC919A7-3550-4046-99CF-BC164F817E63}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.GoFeatureFlag", "src\CommunityToolkit.Aspire.GoFeatureFlag\CommunityToolkit.Aspire.GoFeatureFlag.csproj", "{C40D5274-DACF-4962-A58A-F08BDA80D0E2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.GoFeatureFlag.Tests", "tests\CommunityToolkit.Aspire.GoFeatureFlag.Tests\CommunityToolkit.Aspire.GoFeatureFlag.Tests.csproj", "{F4891827-BE07-4547-AF89-2734FB8DE6D5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.GoFeatureFlag.Tests", "tests\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.Tests\CommunityToolkit.Aspire.Hosting.GoFeatureFlag.Tests.csproj", "{96458513-CAA8-498B-B4EE-3BF994140741}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MongoDB.Extensions", "src\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.csproj", "{511D321E-277E-465A-AD62-B9971A6DD17E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.DbGate", "src\CommunityToolkit.Aspire.Hosting.DbGate\CommunityToolkit.Aspire.Hosting.DbGate.csproj", "{72054ADC-94AC-48D4-9718-72B70E830CD2}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests.csproj", "{57EF72E3-24DA-41B3-A3A1-B69E26421F68}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mongodb-ext", "mongodb-ext", "{8406E585-3329-48C5-B268-8C2140B720B6}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost", "examples\mongodb-ext\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj", "{A461FE7E-2458-428C-B794-6CC388031F16}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dbgate", "dbgate", "{50FBAF3E-E0BB-44FF-884F-660357C1CC54}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.DbGate.AppHost", "examples\dbgate\CommunityToolkit.Aspire.Hosting.DbGate.AppHost\CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj", "{AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Redis.Extensions", "src\CommunityToolkit.Aspire.Hosting.Redis.Extensions\CommunityToolkit.Aspire.Hosting.Redis.Extensions.csproj", "{50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost", "examples\redis-ext\CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.Redis.Extensions.AppHost.csproj", "{CB491C52-A3D5-4F36-97C4-75C482F90A30}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "redis-ext", "redis-ext", "{734EF69D-EE4D-4E9B-96BD-A44E53C5D1EC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests\CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests.csproj", "{958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.LavinMQ", "src\CommunityToolkit.Aspire.Hosting.LavinMQ\CommunityToolkit.Aspire.Hosting.LavinMQ.csproj", "{F218A6C1-3D4F-4351-9580-C99DBC3774FF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.LavinMQ.Tests", "tests\CommunityToolkit.Aspire.Hosting.LavinMQ.Tests\CommunityToolkit.Aspire.Hosting.LavinMQ.Tests.csproj", "{E0B23172-E795-4AC5-B9E2-6922E4F167BB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lavinmq", "lavinmq", "{35E5A4C8-219B-44AC-AB93-B07A67BCC810}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost", "examples\lavinmq\CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost\CommunityToolkit.Aspire.Hosting.LavinMQ.AppHost.csproj", "{7068DDA8-71B9-428E-BCC3-89658670B830}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit", "examples\lavinmq\CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit\CommunityToolkit.Aspire.Hosting.LavinMQ.MassTransit.csproj", "{8C463360-0156-461C-A065-CC30FE3B0595}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.LavinMQ.ServiceDefaults", "examples\lavinmq\CommunityToolkit.Aspire.Hosting.LavinMQ.ServiceDefaults\CommunityToolkit.Aspire.Hosting.LavinMQ.ServiceDefaults.csproj", "{A5C87DA6-6793-4824-88E5-4F8310FE55B8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mailpit", "mailpit", "{734EF69D-EE4D-4E9B-96BD-A44E53C5D2EC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MailPit", "src\CommunityToolkit.Aspire.Hosting.MailPit\CommunityToolkit.Aspire.Hosting.MailPit.csproj", "{73E7BC19-A626-4C55-990B-A878BF84D4CA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MailPit.Tests", "tests\CommunityToolkit.Aspire.Hosting.MailPit.Tests\CommunityToolkit.Aspire.Hosting.MailPit.Tests.csproj", "{9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MailPit.ServiceDefaults", "examples\mailpit\CommunityToolkit.Aspire.Hosting.MailPit.ServiceDefaults\CommunityToolkit.Aspire.Hosting.MailPit.ServiceDefaults.csproj", "{08EDD2B6-FFC1-42F9-AE62-479178A381FF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MailPit.SendMailApi", "examples\mailpit\CommunityToolkit.Aspire.Hosting.MailPit.SendMailApi\CommunityToolkit.Aspire.Hosting.MailPit.SendMailApi.csproj", "{547ED5DB-CD15-42B8-99C7-30274C5D843E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.MailPit.AppHost", "examples\mailpit\CommunityToolkit.Aspire.Hosting.MailPit.AppHost\CommunityToolkit.Aspire.Hosting.MailPit.AppHost.csproj", "{69343427-D50D-4600-ADC0-C1B1910C0287}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.SqlServer.Extensions", "src\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj", "{E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sqlserver-ext", "sqlserver-ext", "{A4E81DCC-B13D-4513-8933-E7E405439AE9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost", "examples\sqlserver-ext\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost.csproj", "{C38B5A72-F717-4C7F-AB4C-54039A439D4D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests", "tests\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests\CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests.csproj", "{B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SdkProject", "examples\sql-database-projects\SdkProject\SdkProject.csproj", "{00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dapr", "Dapr", "{41ACF613-EE5A-5900-F4D1-9FB713A32BE8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dapr", "Dapr", "{89078B53-6207-6E04-F939-AF96EA0F1B4B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests", "tests\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests.csproj", "{583674A0-3FC4-4AC1-9583-45A67CAF6198}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests", "tests\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Tests.csproj", "{C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr.Tests", "tests\CommunityToolkit.Aspire.Hosting.Dapr.Tests\CommunityToolkit.Aspire.Hosting.Dapr.Tests.csproj", "{FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Azure.Dapr", "src\CommunityToolkit.Aspire.Hosting.Azure.Dapr\CommunityToolkit.Aspire.Hosting.Azure.Dapr.csproj", "{72652F7E-CFC0-4E3D-AD96-74C206A110BA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis", "src\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis\CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.csproj", "{92D490BC-B953-45DC-8F9D-A992B2AEF96A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Dapr", "src\CommunityToolkit.Aspire.Hosting.Dapr\CommunityToolkit.Aspire.Hosting.Dapr.csproj", "{27144ED2-9F74-4A86-AABA-38CD061D8984}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost", "examples\dapr\CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost\CommunityToolkit.Aspire.Hosting.Azure.Dapr.AppHost.csproj", "{39A6C03B-52AB-45F4-8D01-C3A1E5095765}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6", "src\CommunityToolkit.Aspire.Hosting.k6\CommunityToolkit.Aspire.Hosting.k6.csproj", "{C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k6", "k6", "{612ECA40-80B7-4365-9A6A-C35A6BE30FED}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6.AppHost", "examples\k6\CommunityToolkit.Aspire.Hosting.k6.AppHost\CommunityToolkit.Aspire.Hosting.k6.AppHost.csproj", "{744F01AD-B28E-4B25-B6BA-42821157CA72}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6.ServiceDefaults", "examples\k6\CommunityToolkit.Aspire.Hosting.k6.ServiceDefaults\CommunityToolkit.Aspire.Hosting.k6.ServiceDefaults.csproj", "{15BBCE34-82A2-489C-A65B-5BAEA299F07E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6.ApiService", "examples\k6\CommunityToolkit.Aspire.Hosting.k6.ApiService\CommunityToolkit.Aspire.Hosting.k6.ApiService.csproj", "{9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.k6.Tests", "tests\CommunityToolkit.Aspire.Hosting.k6.Tests\CommunityToolkit.Aspire.Hosting.k6.Tests.csproj", "{CCFE3593-49A7-4F03-A329-687490CD0143}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector", "src\CommunityToolkit.Aspire.Hosting.McpInspector\CommunityToolkit.Aspire.Hosting.McpInspector.csproj", "{A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "mcp-inspector", "mcp-inspector", "{0CE3C255-7FF4-EA80-717A-A208DB412F1A}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector.AppHost", "examples\mcp-inspector\CommunityToolkit.Aspire.Hosting.McpInspector.AppHost\CommunityToolkit.Aspire.Hosting.McpInspector.AppHost.csproj", "{DF023DD5-1158-4E2D-B542-21AF2E387428}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommunityToolkit.Aspire.Hosting.McpInspector.McpServer", "examples\mcp-inspector\CommunityToolkit.Aspire.Hosting.McpInspector.McpServer\CommunityToolkit.Aspire.Hosting.McpInspector.McpServer.csproj", "{F43484E3-6D87-476D-AD21-AB880C65B6C2}" -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 - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x64.Build.0 = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Debug|x86.Build.0 = Debug|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|Any CPU.Build.0 = Release|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|x64.ActiveCfg = Release|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|x64.Build.0 = Release|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|x86.ActiveCfg = Release|Any CPU - {DAA67050-44B3-458F-9818-5877D606866A}.Release|x86.Build.0 = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x64.ActiveCfg = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x64.Build.0 = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x86.ActiveCfg = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Debug|x86.Build.0 = Debug|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|Any CPU.Build.0 = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x64.ActiveCfg = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x64.Build.0 = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x86.ActiveCfg = Release|Any CPU - {125DFA83-328D-4F8B-91EC-3057FFF410BE}.Release|x86.Build.0 = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x64.ActiveCfg = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x64.Build.0 = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x86.ActiveCfg = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Debug|x86.Build.0 = Debug|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|Any CPU.Build.0 = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x64.ActiveCfg = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x64.Build.0 = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x86.ActiveCfg = Release|Any CPU - {3D767C8C-7E04-4264-B4E9-13600650D2B1}.Release|x86.Build.0 = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x64.ActiveCfg = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x64.Build.0 = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x86.ActiveCfg = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Debug|x86.Build.0 = Debug|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|Any CPU.Build.0 = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x64.ActiveCfg = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x64.Build.0 = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x86.ActiveCfg = Release|Any CPU - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D}.Release|x86.Build.0 = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x64.ActiveCfg = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x64.Build.0 = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x86.ActiveCfg = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Debug|x86.Build.0 = Debug|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|Any CPU.Build.0 = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x64.ActiveCfg = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x64.Build.0 = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x86.ActiveCfg = Release|Any CPU - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF}.Release|x86.Build.0 = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x64.ActiveCfg = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x64.Build.0 = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x86.ActiveCfg = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Debug|x86.Build.0 = Debug|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|Any CPU.Build.0 = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x64.ActiveCfg = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x64.Build.0 = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x86.ActiveCfg = Release|Any CPU - {BBAFA814-1026-4A39-AA28-BCAE3951A224}.Release|x86.Build.0 = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x64.ActiveCfg = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x64.Build.0 = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x86.ActiveCfg = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Debug|x86.Build.0 = Debug|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|Any CPU.Build.0 = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x64.ActiveCfg = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x64.Build.0 = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x86.ActiveCfg = Release|Any CPU - {E2905A71-E25D-46FC-A128-D6A366D4D751}.Release|x86.Build.0 = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x64.ActiveCfg = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x64.Build.0 = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x86.ActiveCfg = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Debug|x86.Build.0 = Debug|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|Any CPU.Build.0 = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x64.ActiveCfg = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x64.Build.0 = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x86.ActiveCfg = Release|Any CPU - {1B55E682-B518-4E59-8972-07C82ED5A677}.Release|x86.Build.0 = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x64.ActiveCfg = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x64.Build.0 = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x86.ActiveCfg = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Debug|x86.Build.0 = Debug|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|Any CPU.Build.0 = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x64.ActiveCfg = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x64.Build.0 = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x86.ActiveCfg = Release|Any CPU - {4C1D5422-4C52-4603-A01A-E1E6304633EC}.Release|x86.Build.0 = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x64.ActiveCfg = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x64.Build.0 = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x86.ActiveCfg = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Debug|x86.Build.0 = Debug|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|Any CPU.Build.0 = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x64.ActiveCfg = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x64.Build.0 = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x86.ActiveCfg = Release|Any CPU - {C083A377-13CA-47C1-8B17-1FE353EA76F0}.Release|x86.Build.0 = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x64.ActiveCfg = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x64.Build.0 = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x86.ActiveCfg = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Debug|x86.Build.0 = Debug|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|Any CPU.Build.0 = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x64.ActiveCfg = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x64.Build.0 = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x86.ActiveCfg = Release|Any CPU - {BAEA0F6F-39E9-4893-8787-C4D292D3B169}.Release|x86.Build.0 = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x64.ActiveCfg = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x64.Build.0 = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x86.ActiveCfg = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Debug|x86.Build.0 = Debug|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|Any CPU.Build.0 = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x64.ActiveCfg = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x64.Build.0 = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x86.ActiveCfg = Release|Any CPU - {83FF8083-7EE2-4196-86A8-239F921B443C}.Release|x86.Build.0 = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x64.ActiveCfg = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x64.Build.0 = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x86.ActiveCfg = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Debug|x86.Build.0 = Debug|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|Any CPU.Build.0 = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x64.ActiveCfg = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x64.Build.0 = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x86.ActiveCfg = Release|Any CPU - {1F299343-30DF-4599-A95D-BCFB1754DA48}.Release|x86.Build.0 = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x64.ActiveCfg = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x64.Build.0 = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x86.ActiveCfg = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Debug|x86.Build.0 = Debug|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|Any CPU.Build.0 = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x64.ActiveCfg = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x64.Build.0 = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x86.ActiveCfg = Release|Any CPU - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1}.Release|x86.Build.0 = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|x64.ActiveCfg = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|x64.Build.0 = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|x86.ActiveCfg = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Debug|x86.Build.0 = Debug|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|Any CPU.Build.0 = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|x64.ActiveCfg = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|x64.Build.0 = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|x86.ActiveCfg = Release|Any CPU - {E8F93376-1367-4A7B-A729-116199804356}.Release|x86.Build.0 = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x64.ActiveCfg = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x64.Build.0 = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x86.ActiveCfg = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Debug|x86.Build.0 = Debug|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|Any CPU.Build.0 = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x64.ActiveCfg = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x64.Build.0 = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x86.ActiveCfg = Release|Any CPU - {6C6696CB-8DCC-4E93-A667-A313D70E0220}.Release|x86.Build.0 = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x64.ActiveCfg = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x64.Build.0 = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x86.ActiveCfg = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Debug|x86.Build.0 = Debug|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|Any CPU.Build.0 = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x64.ActiveCfg = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x64.Build.0 = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x86.ActiveCfg = Release|Any CPU - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1}.Release|x86.Build.0 = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x64.ActiveCfg = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x64.Build.0 = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x86.ActiveCfg = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Debug|x86.Build.0 = Debug|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|Any CPU.Build.0 = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x64.ActiveCfg = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x64.Build.0 = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x86.ActiveCfg = Release|Any CPU - {F4602DC8-3C17-4834-B640-9A3B27FE278A}.Release|x86.Build.0 = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x64.ActiveCfg = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x64.Build.0 = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x86.ActiveCfg = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Debug|x86.Build.0 = Debug|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|Any CPU.Build.0 = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x64.ActiveCfg = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x64.Build.0 = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x86.ActiveCfg = Release|Any CPU - {2F037600-2002-4A13-9359-98FB0D2416BE}.Release|x86.Build.0 = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x64.ActiveCfg = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x64.Build.0 = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x86.ActiveCfg = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Debug|x86.Build.0 = Debug|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|Any CPU.Build.0 = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x64.ActiveCfg = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x64.Build.0 = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x86.ActiveCfg = Release|Any CPU - {0A17021E-5F10-429B-88C8-E4073EADACB6}.Release|x86.Build.0 = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x64.ActiveCfg = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x64.Build.0 = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x86.ActiveCfg = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Debug|x86.Build.0 = Debug|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|Any CPU.Build.0 = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x64.ActiveCfg = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x64.Build.0 = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x86.ActiveCfg = Release|Any CPU - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475}.Release|x86.Build.0 = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x64.ActiveCfg = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x64.Build.0 = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x86.ActiveCfg = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Debug|x86.Build.0 = Debug|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|Any CPU.Build.0 = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x64.ActiveCfg = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x64.Build.0 = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x86.ActiveCfg = Release|Any CPU - {93031B72-2045-48C6-9585-DC7FA0BA967B}.Release|x86.Build.0 = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|Any CPU.Build.0 = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x64.ActiveCfg = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x64.Build.0 = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x86.ActiveCfg = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Debug|x86.Build.0 = Debug|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|Any CPU.ActiveCfg = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|Any CPU.Build.0 = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x64.ActiveCfg = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x64.Build.0 = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x86.ActiveCfg = Release|Any CPU - {93789F1B-0539-49B5-A585-9F6EF9E88264}.Release|x86.Build.0 = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x64.ActiveCfg = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x64.Build.0 = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x86.ActiveCfg = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Debug|x86.Build.0 = Debug|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|Any CPU.Build.0 = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x64.ActiveCfg = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x64.Build.0 = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x86.ActiveCfg = Release|Any CPU - {3A03552A-252D-4E86-A8D7-135579AAEB85}.Release|x86.Build.0 = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x64.ActiveCfg = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x64.Build.0 = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x86.ActiveCfg = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Debug|x86.Build.0 = Debug|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|Any CPU.Build.0 = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x64.ActiveCfg = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x64.Build.0 = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x86.ActiveCfg = Release|Any CPU - {C60BCC90-BAEE-4678-ACC9-11553AA64249}.Release|x86.Build.0 = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x64.ActiveCfg = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x64.Build.0 = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x86.ActiveCfg = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Debug|x86.Build.0 = Debug|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|Any CPU.Build.0 = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x64.ActiveCfg = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x64.Build.0 = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x86.ActiveCfg = Release|Any CPU - {0294714B-A1CC-4F8E-8935-315B3499638F}.Release|x86.Build.0 = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x64.ActiveCfg = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x64.Build.0 = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x86.ActiveCfg = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Debug|x86.Build.0 = Debug|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|Any CPU.Build.0 = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x64.ActiveCfg = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x64.Build.0 = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x86.ActiveCfg = Release|Any CPU - {22D81BC2-2659-483A-B7AC-8FCA086A99A7}.Release|x86.Build.0 = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x64.ActiveCfg = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x64.Build.0 = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x86.ActiveCfg = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Debug|x86.Build.0 = Debug|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|Any CPU.Build.0 = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x64.ActiveCfg = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x64.Build.0 = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x86.ActiveCfg = Release|Any CPU - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E}.Release|x86.Build.0 = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x64.ActiveCfg = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x64.Build.0 = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x86.ActiveCfg = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Debug|x86.Build.0 = Debug|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|Any CPU.Build.0 = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x64.ActiveCfg = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x64.Build.0 = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x86.ActiveCfg = Release|Any CPU - {C715669D-FBDE-4BFF-B9A3-75615D3C179A}.Release|x86.Build.0 = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x64.ActiveCfg = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x64.Build.0 = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x86.ActiveCfg = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Debug|x86.Build.0 = Debug|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|Any CPU.Build.0 = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|x64.ActiveCfg = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|x64.Build.0 = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|x86.ActiveCfg = Release|Any CPU - {0AACC135-9624-423D-8988-69701C0FE428}.Release|x86.Build.0 = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x64.ActiveCfg = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x64.Build.0 = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x86.ActiveCfg = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Debug|x86.Build.0 = Debug|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|Any CPU.Build.0 = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x64.ActiveCfg = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x64.Build.0 = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x86.ActiveCfg = Release|Any CPU - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5}.Release|x86.Build.0 = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x64.ActiveCfg = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x64.Build.0 = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x86.ActiveCfg = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Debug|x86.Build.0 = Debug|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|Any CPU.Build.0 = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x64.ActiveCfg = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x64.Build.0 = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x86.ActiveCfg = Release|Any CPU - {E4E93A24-0A97-419F-836C-EAA23D0FFF81}.Release|x86.Build.0 = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x64.ActiveCfg = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x64.Build.0 = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x86.ActiveCfg = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Debug|x86.Build.0 = Debug|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|Any CPU.Build.0 = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x64.ActiveCfg = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x64.Build.0 = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x86.ActiveCfg = Release|Any CPU - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E}.Release|x86.Build.0 = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x64.ActiveCfg = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x64.Build.0 = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x86.ActiveCfg = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Debug|x86.Build.0 = Debug|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|Any CPU.Build.0 = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x64.ActiveCfg = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x64.Build.0 = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x86.ActiveCfg = Release|Any CPU - {BAF22B80-2937-4695-A613-F170D8FB9020}.Release|x86.Build.0 = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x64.ActiveCfg = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x64.Build.0 = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x86.ActiveCfg = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Debug|x86.Build.0 = Debug|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|Any CPU.Build.0 = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x64.ActiveCfg = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x64.Build.0 = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x86.ActiveCfg = Release|Any CPU - {9D79154C-E503-4D6C-BCED-EEC82E314FBE}.Release|x86.Build.0 = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x64.ActiveCfg = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x64.Build.0 = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x86.ActiveCfg = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Debug|x86.Build.0 = Debug|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|Any CPU.Build.0 = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x64.ActiveCfg = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x64.Build.0 = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x86.ActiveCfg = Release|Any CPU - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1}.Release|x86.Build.0 = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x64.ActiveCfg = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x64.Build.0 = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x86.ActiveCfg = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Debug|x86.Build.0 = Debug|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|Any CPU.Build.0 = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x64.ActiveCfg = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x64.Build.0 = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x86.ActiveCfg = Release|Any CPU - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63}.Release|x86.Build.0 = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x64.ActiveCfg = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x64.Build.0 = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x86.ActiveCfg = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Debug|x86.Build.0 = Debug|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|Any CPU.Build.0 = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x64.ActiveCfg = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x64.Build.0 = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x86.ActiveCfg = Release|Any CPU - {B42EFEB5-6196-4D8C-A46C-671D339B3C15}.Release|x86.Build.0 = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x64.ActiveCfg = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x64.Build.0 = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x86.ActiveCfg = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Debug|x86.Build.0 = Debug|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|Any CPU.Build.0 = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x64.ActiveCfg = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x64.Build.0 = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x86.ActiveCfg = Release|Any CPU - {A92E70F9-8028-4E0C-B167-884E1E56854F}.Release|x86.Build.0 = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x64.ActiveCfg = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x64.Build.0 = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x86.ActiveCfg = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Debug|x86.Build.0 = Debug|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|Any CPU.Build.0 = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x64.ActiveCfg = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x64.Build.0 = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x86.ActiveCfg = Release|Any CPU - {259D0D48-C856-47C8-8014-66CE9A7C353F}.Release|x86.Build.0 = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x64.ActiveCfg = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x64.Build.0 = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x86.ActiveCfg = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Debug|x86.Build.0 = Debug|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|Any CPU.Build.0 = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x64.ActiveCfg = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x64.Build.0 = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x86.ActiveCfg = Release|Any CPU - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC}.Release|x86.Build.0 = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x64.ActiveCfg = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x64.Build.0 = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x86.ActiveCfg = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Debug|x86.Build.0 = Debug|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|Any CPU.Build.0 = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x64.ActiveCfg = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x64.Build.0 = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x86.ActiveCfg = Release|Any CPU - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095}.Release|x86.Build.0 = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x64.ActiveCfg = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x64.Build.0 = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x86.ActiveCfg = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Debug|x86.Build.0 = Debug|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|Any CPU.Build.0 = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x64.ActiveCfg = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x64.Build.0 = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x86.ActiveCfg = Release|Any CPU - {79EF8E85-1DFC-42B5-BDE3-72639F25848C}.Release|x86.Build.0 = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x64.ActiveCfg = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x64.Build.0 = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x86.ActiveCfg = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Debug|x86.Build.0 = Debug|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|Any CPU.Build.0 = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x64.ActiveCfg = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x64.Build.0 = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x86.ActiveCfg = Release|Any CPU - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C}.Release|x86.Build.0 = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x64.ActiveCfg = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x64.Build.0 = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x86.ActiveCfg = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Debug|x86.Build.0 = Debug|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|Any CPU.Build.0 = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x64.ActiveCfg = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x64.Build.0 = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x86.ActiveCfg = Release|Any CPU - {6BC98146-279F-4DE5-9B6E-0F0C07507421}.Release|x86.Build.0 = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x64.Build.0 = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Debug|x86.Build.0 = Debug|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|Any CPU.Build.0 = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|x64.ActiveCfg = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|x64.Build.0 = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|x86.ActiveCfg = Release|Any CPU - {1E753568-E34B-4E93-93F8-43764171725D}.Release|x86.Build.0 = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x64.ActiveCfg = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x64.Build.0 = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x86.ActiveCfg = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Debug|x86.Build.0 = Debug|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|Any CPU.Build.0 = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x64.ActiveCfg = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x64.Build.0 = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x86.ActiveCfg = Release|Any CPU - {FB9B8F61-5125-452B-8332-938DCFA27366}.Release|x86.Build.0 = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|Any CPU.Build.0 = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x64.ActiveCfg = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x64.Build.0 = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x86.ActiveCfg = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Debug|x86.Build.0 = Debug|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|Any CPU.ActiveCfg = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|Any CPU.Build.0 = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x64.ActiveCfg = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x64.Build.0 = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x86.ActiveCfg = Release|Any CPU - {373472DA-BAEB-44B6-915D-1EF3DA845797}.Release|x86.Build.0 = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x64.ActiveCfg = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x64.Build.0 = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x86.ActiveCfg = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Debug|x86.Build.0 = Debug|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|Any CPU.Build.0 = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x64.ActiveCfg = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x64.Build.0 = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x86.ActiveCfg = Release|Any CPU - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92}.Release|x86.Build.0 = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x64.ActiveCfg = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x64.Build.0 = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x86.ActiveCfg = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Debug|x86.Build.0 = Debug|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|Any CPU.Build.0 = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x64.ActiveCfg = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x64.Build.0 = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x86.ActiveCfg = Release|Any CPU - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3}.Release|x86.Build.0 = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x64.ActiveCfg = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x64.Build.0 = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x86.ActiveCfg = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Debug|x86.Build.0 = Debug|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|Any CPU.Build.0 = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x64.ActiveCfg = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x64.Build.0 = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x86.ActiveCfg = Release|Any CPU - {C686CEA0-8B89-470B-84A2-0264040DCDC8}.Release|x86.Build.0 = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x64.ActiveCfg = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x64.Build.0 = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x86.ActiveCfg = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Debug|x86.Build.0 = Debug|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|Any CPU.Build.0 = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x64.ActiveCfg = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x64.Build.0 = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x86.ActiveCfg = Release|Any CPU - {5B825CF9-E8B8-4960-9330-648ED0323FE0}.Release|x86.Build.0 = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x64.ActiveCfg = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x64.Build.0 = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x86.ActiveCfg = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Debug|x86.Build.0 = Debug|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|Any CPU.Build.0 = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x64.ActiveCfg = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x64.Build.0 = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x86.ActiveCfg = Release|Any CPU - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435}.Release|x86.Build.0 = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x64.ActiveCfg = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x64.Build.0 = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x86.ActiveCfg = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Debug|x86.Build.0 = Debug|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|Any CPU.Build.0 = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x64.ActiveCfg = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x64.Build.0 = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x86.ActiveCfg = Release|Any CPU - {36FC2579-582A-4DAF-9B20-AB33331624C6}.Release|x86.Build.0 = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x64.ActiveCfg = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x64.Build.0 = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x86.ActiveCfg = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Debug|x86.Build.0 = Debug|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|Any CPU.Build.0 = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x64.ActiveCfg = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x64.Build.0 = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x86.ActiveCfg = Release|Any CPU - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A}.Release|x86.Build.0 = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|Any CPU.Build.0 = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x64.ActiveCfg = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x64.Build.0 = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x86.ActiveCfg = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Debug|x86.Build.0 = Debug|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|Any CPU.ActiveCfg = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|Any CPU.Build.0 = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x64.ActiveCfg = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x64.Build.0 = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x86.ActiveCfg = Release|Any CPU - {887F91FF-C41D-4286-AD0F-DE56516E4E73}.Release|x86.Build.0 = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x64.ActiveCfg = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x64.Build.0 = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x86.ActiveCfg = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Debug|x86.Build.0 = Debug|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|Any CPU.Build.0 = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x64.ActiveCfg = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x64.Build.0 = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x86.ActiveCfg = Release|Any CPU - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC}.Release|x86.Build.0 = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x64.ActiveCfg = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x64.Build.0 = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x86.ActiveCfg = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Debug|x86.Build.0 = Debug|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|Any CPU.Build.0 = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x64.ActiveCfg = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x64.Build.0 = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x86.ActiveCfg = Release|Any CPU - {8D3EED95-8EE5-421D-9161-F2AFA8D22543}.Release|x86.Build.0 = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x64.ActiveCfg = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x64.Build.0 = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x86.ActiveCfg = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Debug|x86.Build.0 = Debug|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|Any CPU.Build.0 = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x64.ActiveCfg = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x64.Build.0 = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x86.ActiveCfg = Release|Any CPU - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706}.Release|x86.Build.0 = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x64.ActiveCfg = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x64.Build.0 = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x86.ActiveCfg = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Debug|x86.Build.0 = Debug|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|Any CPU.Build.0 = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x64.ActiveCfg = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x64.Build.0 = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x86.ActiveCfg = Release|Any CPU - {A855190A-DE7A-4B98-835D-7C23E1B600D2}.Release|x86.Build.0 = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x64.ActiveCfg = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x64.Build.0 = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x86.ActiveCfg = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Debug|x86.Build.0 = Debug|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|Any CPU.Build.0 = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x64.ActiveCfg = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x64.Build.0 = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x86.ActiveCfg = Release|Any CPU - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF}.Release|x86.Build.0 = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x64.ActiveCfg = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x64.Build.0 = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x86.ActiveCfg = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Debug|x86.Build.0 = Debug|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|Any CPU.Build.0 = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x64.ActiveCfg = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x64.Build.0 = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x86.ActiveCfg = Release|Any CPU - {B209275E-1CFF-4AF0-A65A-2895DD679775}.Release|x86.Build.0 = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x64.ActiveCfg = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x64.Build.0 = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x86.ActiveCfg = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Debug|x86.Build.0 = Debug|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|Any CPU.Build.0 = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x64.ActiveCfg = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x64.Build.0 = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x86.ActiveCfg = Release|Any CPU - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6}.Release|x86.Build.0 = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x64.ActiveCfg = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x64.Build.0 = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x86.ActiveCfg = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Debug|x86.Build.0 = Debug|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|Any CPU.Build.0 = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x64.ActiveCfg = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x64.Build.0 = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x86.ActiveCfg = Release|Any CPU - {FA34A40C-62C9-4A73-A39D-53A01243657C}.Release|x86.Build.0 = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x64.ActiveCfg = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x64.Build.0 = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x86.ActiveCfg = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Debug|x86.Build.0 = Debug|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|Any CPU.Build.0 = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x64.ActiveCfg = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x64.Build.0 = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x86.ActiveCfg = Release|Any CPU - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557}.Release|x86.Build.0 = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x64.Build.0 = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Debug|x86.Build.0 = Debug|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|Any CPU.Build.0 = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x64.ActiveCfg = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x64.Build.0 = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x86.ActiveCfg = Release|Any CPU - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7}.Release|x86.Build.0 = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|Any CPU.Build.0 = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x64.ActiveCfg = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x64.Build.0 = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x86.ActiveCfg = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Debug|x86.Build.0 = Debug|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|Any CPU.ActiveCfg = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|Any CPU.Build.0 = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x64.ActiveCfg = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x64.Build.0 = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x86.ActiveCfg = Release|Any CPU - {019D6506-9D68-41AD-A7A1-A27B2FFE1253}.Release|x86.Build.0 = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x64.ActiveCfg = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x64.Build.0 = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x86.ActiveCfg = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Debug|x86.Build.0 = Debug|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|Any CPU.Build.0 = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x64.ActiveCfg = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x64.Build.0 = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x86.ActiveCfg = Release|Any CPU - {C696480B-C2E0-4ACA-BD5E-A62BF8558024}.Release|x86.Build.0 = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x64.ActiveCfg = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x64.Build.0 = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x86.ActiveCfg = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Debug|x86.Build.0 = Debug|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|Any CPU.Build.0 = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x64.ActiveCfg = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x64.Build.0 = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x86.ActiveCfg = Release|Any CPU - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12}.Release|x86.Build.0 = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|Any CPU.Build.0 = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x64.ActiveCfg = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x64.Build.0 = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x86.ActiveCfg = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Debug|x86.Build.0 = Debug|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|Any CPU.ActiveCfg = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|Any CPU.Build.0 = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x64.ActiveCfg = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x64.Build.0 = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x86.ActiveCfg = Release|Any CPU - {978EED2A-43BB-4DE6-8563-3A9972869661}.Release|x86.Build.0 = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x64.ActiveCfg = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x64.Build.0 = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x86.ActiveCfg = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Debug|x86.Build.0 = Debug|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|Any CPU.Build.0 = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x64.ActiveCfg = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x64.Build.0 = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x86.ActiveCfg = Release|Any CPU - {A87F7800-BD24-4577-8F15-50D33C8DACF1}.Release|x86.Build.0 = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x64.ActiveCfg = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x64.Build.0 = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x86.ActiveCfg = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Debug|x86.Build.0 = Debug|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|Any CPU.Build.0 = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x64.ActiveCfg = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x64.Build.0 = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x86.ActiveCfg = Release|Any CPU - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5}.Release|x86.Build.0 = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x64.ActiveCfg = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x64.Build.0 = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x86.ActiveCfg = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Debug|x86.Build.0 = Debug|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|Any CPU.Build.0 = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x64.ActiveCfg = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x64.Build.0 = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x86.ActiveCfg = Release|Any CPU - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF}.Release|x86.Build.0 = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x64.ActiveCfg = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x64.Build.0 = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x86.ActiveCfg = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Debug|x86.Build.0 = Debug|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|Any CPU.Build.0 = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x64.ActiveCfg = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x64.Build.0 = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x86.ActiveCfg = Release|Any CPU - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0}.Release|x86.Build.0 = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x64.ActiveCfg = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x64.Build.0 = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x86.ActiveCfg = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Debug|x86.Build.0 = Debug|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|Any CPU.Build.0 = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x64.ActiveCfg = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x64.Build.0 = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x86.ActiveCfg = Release|Any CPU - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E}.Release|x86.Build.0 = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x64.ActiveCfg = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x64.Build.0 = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x86.ActiveCfg = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Debug|x86.Build.0 = Debug|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|Any CPU.Build.0 = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x64.ActiveCfg = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x64.Build.0 = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x86.ActiveCfg = Release|Any CPU - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444}.Release|x86.Build.0 = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x64.ActiveCfg = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x64.Build.0 = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x86.ActiveCfg = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Debug|x86.Build.0 = Debug|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|Any CPU.Build.0 = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x64.ActiveCfg = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x64.Build.0 = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x86.ActiveCfg = Release|Any CPU - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C}.Release|x86.Build.0 = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x64.ActiveCfg = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x64.Build.0 = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x86.ActiveCfg = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Debug|x86.Build.0 = Debug|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|Any CPU.Build.0 = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x64.ActiveCfg = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x64.Build.0 = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x86.ActiveCfg = Release|Any CPU - {59101126-7BD2-4E03-9C4D-D0D01AD14674}.Release|x86.Build.0 = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x64.ActiveCfg = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x64.Build.0 = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x86.ActiveCfg = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Debug|x86.Build.0 = Debug|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|Any CPU.Build.0 = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x64.ActiveCfg = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x64.Build.0 = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x86.ActiveCfg = Release|Any CPU - {31D2ECC1-15EA-4850-88E9-A5F967D742C9}.Release|x86.Build.0 = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x64.ActiveCfg = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x64.Build.0 = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x86.ActiveCfg = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Debug|x86.Build.0 = Debug|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|Any CPU.Build.0 = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x64.ActiveCfg = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x64.Build.0 = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x86.ActiveCfg = Release|Any CPU - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7}.Release|x86.Build.0 = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x64.ActiveCfg = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x64.Build.0 = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x86.ActiveCfg = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Debug|x86.Build.0 = Debug|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|Any CPU.Build.0 = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x64.ActiveCfg = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x64.Build.0 = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x86.ActiveCfg = Release|Any CPU - {97E455C1-C914-4C51-87A9-2C213CE2ED5B}.Release|x86.Build.0 = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x64.ActiveCfg = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x64.Build.0 = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x86.ActiveCfg = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Debug|x86.Build.0 = Debug|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|Any CPU.Build.0 = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x64.ActiveCfg = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x64.Build.0 = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x86.ActiveCfg = Release|Any CPU - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88}.Release|x86.Build.0 = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x64.ActiveCfg = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x64.Build.0 = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x86.ActiveCfg = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Debug|x86.Build.0 = Debug|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|Any CPU.Build.0 = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x64.ActiveCfg = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x64.Build.0 = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x86.ActiveCfg = Release|Any CPU - {E48F6DDD-D62D-4723-810D-0F178C35E8B8}.Release|x86.Build.0 = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x64.ActiveCfg = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x64.Build.0 = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Debug|x86.Build.0 = Debug|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|Any CPU.Build.0 = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x64.ActiveCfg = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x64.Build.0 = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x86.ActiveCfg = Release|Any CPU - {DD7042A1-8E44-40A8-B338-DC2F7B755702}.Release|x86.Build.0 = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x64.ActiveCfg = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x64.Build.0 = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x86.ActiveCfg = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Debug|x86.Build.0 = Debug|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|Any CPU.Build.0 = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x64.ActiveCfg = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x64.Build.0 = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x86.ActiveCfg = Release|Any CPU - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF}.Release|x86.Build.0 = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x64.ActiveCfg = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x64.Build.0 = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x86.ActiveCfg = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Debug|x86.Build.0 = Debug|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|Any CPU.Build.0 = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x64.ActiveCfg = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x64.Build.0 = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x86.ActiveCfg = Release|Any CPU - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8}.Release|x86.Build.0 = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x64.ActiveCfg = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x64.Build.0 = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x86.ActiveCfg = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Debug|x86.Build.0 = Debug|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|Any CPU.Build.0 = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x64.ActiveCfg = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x64.Build.0 = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x86.ActiveCfg = Release|Any CPU - {861FE61C-90EE-49B0-BCC8-8417C293CC21}.Release|x86.Build.0 = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x64.ActiveCfg = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x64.Build.0 = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x86.ActiveCfg = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Debug|x86.Build.0 = Debug|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|Any CPU.Build.0 = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x64.ActiveCfg = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x64.Build.0 = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x86.ActiveCfg = Release|Any CPU - {52846E18-99D1-4040-AF5F-17FC69198BCE}.Release|x86.Build.0 = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x64.ActiveCfg = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x64.Build.0 = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Debug|x86.Build.0 = Debug|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|Any CPU.Build.0 = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x64.ActiveCfg = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x64.Build.0 = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x86.ActiveCfg = Release|Any CPU - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2}.Release|x86.Build.0 = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x64.ActiveCfg = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x64.Build.0 = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x86.ActiveCfg = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Debug|x86.Build.0 = Debug|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|Any CPU.Build.0 = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x64.ActiveCfg = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x64.Build.0 = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x86.ActiveCfg = Release|Any CPU - {C46D82D9-327E-43CE-9FEB-B0A233E1C094}.Release|x86.Build.0 = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x64.ActiveCfg = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x64.Build.0 = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x86.ActiveCfg = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Debug|x86.Build.0 = Debug|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|Any CPU.Build.0 = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x64.ActiveCfg = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x64.Build.0 = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x86.ActiveCfg = Release|Any CPU - {E267907F-4467-4504-9947-2A5A6940DE9B}.Release|x86.Build.0 = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x64.ActiveCfg = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x64.Build.0 = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x86.ActiveCfg = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Debug|x86.Build.0 = Debug|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|Any CPU.Build.0 = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x64.ActiveCfg = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x64.Build.0 = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x86.ActiveCfg = Release|Any CPU - {9772004D-0905-421A-98C6-DAE1C35080B3}.Release|x86.Build.0 = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x64.ActiveCfg = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x64.Build.0 = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x86.ActiveCfg = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Debug|x86.Build.0 = Debug|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|Any CPU.Build.0 = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x64.ActiveCfg = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x64.Build.0 = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x86.ActiveCfg = Release|Any CPU - {449B3661-A6F2-46D3-8EC9-B515362A72C1}.Release|x86.Build.0 = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x64.ActiveCfg = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x64.Build.0 = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x86.ActiveCfg = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Debug|x86.Build.0 = Debug|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|Any CPU.Build.0 = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x64.ActiveCfg = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x64.Build.0 = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x86.ActiveCfg = Release|Any CPU - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8}.Release|x86.Build.0 = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x64.ActiveCfg = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x64.Build.0 = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x86.ActiveCfg = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Debug|x86.Build.0 = Debug|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|Any CPU.Build.0 = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x64.ActiveCfg = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x64.Build.0 = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x86.ActiveCfg = Release|Any CPU - {80CCC017-3821-4F7D-902C-BB71DE875F58}.Release|x86.Build.0 = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x64.ActiveCfg = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x64.Build.0 = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x86.ActiveCfg = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Debug|x86.Build.0 = Debug|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|Any CPU.Build.0 = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x64.ActiveCfg = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x64.Build.0 = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x86.ActiveCfg = Release|Any CPU - {B81CEEE6-991E-418C-96D3-F831540C6DE1}.Release|x86.Build.0 = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x64.ActiveCfg = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x64.Build.0 = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x86.ActiveCfg = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Debug|x86.Build.0 = Debug|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|Any CPU.Build.0 = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x64.ActiveCfg = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x64.Build.0 = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x86.ActiveCfg = Release|Any CPU - {B9BEA97B-D722-4390-A34D-228AE7947E7C}.Release|x86.Build.0 = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x64.ActiveCfg = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x64.Build.0 = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x86.ActiveCfg = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Debug|x86.Build.0 = Debug|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|Any CPU.Build.0 = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x64.ActiveCfg = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x64.Build.0 = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x86.ActiveCfg = Release|Any CPU - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F}.Release|x86.Build.0 = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x64.ActiveCfg = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x64.Build.0 = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x86.ActiveCfg = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Debug|x86.Build.0 = Debug|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|Any CPU.Build.0 = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x64.ActiveCfg = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x64.Build.0 = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x86.ActiveCfg = Release|Any CPU - {5ADBE907-7E0B-4AD7-9073-C032C4183914}.Release|x86.Build.0 = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|Any CPU.Build.0 = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|x64.ActiveCfg = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|x64.Build.0 = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|x86.ActiveCfg = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Debug|x86.Build.0 = Debug|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|Any CPU.ActiveCfg = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|Any CPU.Build.0 = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|x64.ActiveCfg = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|x64.Build.0 = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|x86.ActiveCfg = Release|Any CPU - {99441705-4BFA-499F-9897-371238665E38}.Release|x86.Build.0 = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x64.ActiveCfg = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x64.Build.0 = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x86.ActiveCfg = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Debug|x86.Build.0 = Debug|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|Any CPU.Build.0 = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x64.ActiveCfg = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x64.Build.0 = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x86.ActiveCfg = Release|Any CPU - {11768120-E86C-4464-A68A-6F9BD0999BB9}.Release|x86.Build.0 = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x64.ActiveCfg = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x64.Build.0 = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x86.ActiveCfg = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Debug|x86.Build.0 = Debug|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|Any CPU.Build.0 = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x64.ActiveCfg = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x64.Build.0 = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x86.ActiveCfg = Release|Any CPU - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9}.Release|x86.Build.0 = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x64.ActiveCfg = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x64.Build.0 = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x86.ActiveCfg = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Debug|x86.Build.0 = Debug|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|Any CPU.Build.0 = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x64.ActiveCfg = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x64.Build.0 = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x86.ActiveCfg = Release|Any CPU - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A}.Release|x86.Build.0 = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x64.ActiveCfg = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x64.Build.0 = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x86.ActiveCfg = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Debug|x86.Build.0 = Debug|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|Any CPU.Build.0 = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x64.ActiveCfg = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x64.Build.0 = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x86.ActiveCfg = Release|Any CPU - {35B51242-F576-4CCE-BA29-712A80749CB1}.Release|x86.Build.0 = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x64.ActiveCfg = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x64.Build.0 = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x86.ActiveCfg = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Debug|x86.Build.0 = Debug|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|Any CPU.ActiveCfg = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|Any CPU.Build.0 = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x64.ActiveCfg = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x64.Build.0 = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x86.ActiveCfg = Release|Any CPU - {28FCB1E2-7460-4FDD-AA63-03162C9F2154}.Release|x86.Build.0 = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x64.ActiveCfg = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x64.Build.0 = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x86.ActiveCfg = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Debug|x86.Build.0 = Debug|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|Any CPU.Build.0 = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x64.ActiveCfg = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x64.Build.0 = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x86.ActiveCfg = Release|Any CPU - {3D076CFF-6482-4126-9F29-C7617E7D2F5B}.Release|x86.Build.0 = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x64.ActiveCfg = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x64.Build.0 = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x86.ActiveCfg = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Debug|x86.Build.0 = Debug|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|Any CPU.Build.0 = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x64.ActiveCfg = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x64.Build.0 = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x86.ActiveCfg = Release|Any CPU - {D214CBF5-D5E4-4641-868D-66B0C5337DD5}.Release|x86.Build.0 = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x64.ActiveCfg = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x64.Build.0 = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x86.ActiveCfg = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Debug|x86.Build.0 = Debug|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|Any CPU.Build.0 = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x64.ActiveCfg = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x64.Build.0 = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x86.ActiveCfg = Release|Any CPU - {BDAF7D27-C600-4419-9782-CF15BA5272E9}.Release|x86.Build.0 = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x64.ActiveCfg = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x64.Build.0 = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x86.ActiveCfg = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Debug|x86.Build.0 = Debug|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|Any CPU.Build.0 = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x64.ActiveCfg = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x64.Build.0 = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x86.ActiveCfg = Release|Any CPU - {356853EE-2C47-429C-B6CF-F3F76B6FFD91}.Release|x86.Build.0 = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x64.ActiveCfg = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x64.Build.0 = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x86.ActiveCfg = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Debug|x86.Build.0 = Debug|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|Any CPU.Build.0 = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x64.ActiveCfg = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x64.Build.0 = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x86.ActiveCfg = Release|Any CPU - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D}.Release|x86.Build.0 = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x64.ActiveCfg = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x64.Build.0 = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x86.ActiveCfg = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Debug|x86.Build.0 = Debug|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|Any CPU.Build.0 = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x64.ActiveCfg = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x64.Build.0 = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x86.ActiveCfg = Release|Any CPU - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5}.Release|x86.Build.0 = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x64.ActiveCfg = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x64.Build.0 = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x86.ActiveCfg = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Debug|x86.Build.0 = Debug|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|Any CPU.Build.0 = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x64.ActiveCfg = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x64.Build.0 = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x86.ActiveCfg = Release|Any CPU - {C4C113D8-7E40-4962-BBD8-735B478933D6}.Release|x86.Build.0 = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x64.ActiveCfg = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x64.Build.0 = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x86.ActiveCfg = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Debug|x86.Build.0 = Debug|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|Any CPU.Build.0 = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x64.ActiveCfg = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x64.Build.0 = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x86.ActiveCfg = Release|Any CPU - {3CC919A7-3550-4046-99CF-BC164F817E63}.Release|x86.Build.0 = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x64.ActiveCfg = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x64.Build.0 = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Debug|x86.Build.0 = Debug|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|Any CPU.Build.0 = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x64.ActiveCfg = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x64.Build.0 = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x86.ActiveCfg = Release|Any CPU - {C40D5274-DACF-4962-A58A-F08BDA80D0E2}.Release|x86.Build.0 = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x64.ActiveCfg = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x64.Build.0 = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x86.ActiveCfg = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Debug|x86.Build.0 = Debug|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|Any CPU.Build.0 = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x64.ActiveCfg = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x64.Build.0 = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x86.ActiveCfg = Release|Any CPU - {F4891827-BE07-4547-AF89-2734FB8DE6D5}.Release|x86.Build.0 = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|Any CPU.Build.0 = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x64.ActiveCfg = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x64.Build.0 = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x86.ActiveCfg = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Debug|x86.Build.0 = Debug|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|Any CPU.ActiveCfg = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|Any CPU.Build.0 = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x64.ActiveCfg = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x64.Build.0 = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x86.ActiveCfg = Release|Any CPU - {96458513-CAA8-498B-B4EE-3BF994140741}.Release|x86.Build.0 = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x64.ActiveCfg = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x64.Build.0 = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x86.ActiveCfg = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Debug|x86.Build.0 = Debug|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|Any CPU.Build.0 = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x64.ActiveCfg = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x64.Build.0 = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x86.ActiveCfg = Release|Any CPU - {511D321E-277E-465A-AD62-B9971A6DD17E}.Release|x86.Build.0 = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x64.ActiveCfg = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x64.Build.0 = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x86.ActiveCfg = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Debug|x86.Build.0 = Debug|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|Any CPU.Build.0 = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x64.ActiveCfg = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x64.Build.0 = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x86.ActiveCfg = Release|Any CPU - {72054ADC-94AC-48D4-9718-72B70E830CD2}.Release|x86.Build.0 = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|Any CPU.Build.0 = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x64.ActiveCfg = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x64.Build.0 = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x86.ActiveCfg = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Debug|x86.Build.0 = Debug|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|Any CPU.ActiveCfg = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|Any CPU.Build.0 = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x64.ActiveCfg = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x64.Build.0 = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x86.ActiveCfg = Release|Any CPU - {57EF72E3-24DA-41B3-A3A1-B69E26421F68}.Release|x86.Build.0 = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x64.ActiveCfg = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x64.Build.0 = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x86.ActiveCfg = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Debug|x86.Build.0 = Debug|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|Any CPU.Build.0 = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x64.ActiveCfg = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x64.Build.0 = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x86.ActiveCfg = Release|Any CPU - {A461FE7E-2458-428C-B794-6CC388031F16}.Release|x86.Build.0 = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x64.ActiveCfg = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x64.Build.0 = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x86.ActiveCfg = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Debug|x86.Build.0 = Debug|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|Any CPU.Build.0 = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x64.ActiveCfg = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x64.Build.0 = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x86.ActiveCfg = Release|Any CPU - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E}.Release|x86.Build.0 = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x64.ActiveCfg = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x64.Build.0 = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x86.ActiveCfg = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Debug|x86.Build.0 = Debug|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|Any CPU.Build.0 = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x64.ActiveCfg = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x64.Build.0 = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x86.ActiveCfg = Release|Any CPU - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA}.Release|x86.Build.0 = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x64.ActiveCfg = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x64.Build.0 = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x86.ActiveCfg = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Debug|x86.Build.0 = Debug|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|Any CPU.Build.0 = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x64.ActiveCfg = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x64.Build.0 = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x86.ActiveCfg = Release|Any CPU - {CB491C52-A3D5-4F36-97C4-75C482F90A30}.Release|x86.Build.0 = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x64.ActiveCfg = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x64.Build.0 = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x86.ActiveCfg = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Debug|x86.Build.0 = Debug|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|Any CPU.Build.0 = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x64.ActiveCfg = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x64.Build.0 = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x86.ActiveCfg = Release|Any CPU - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A}.Release|x86.Build.0 = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x64.ActiveCfg = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x64.Build.0 = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x86.ActiveCfg = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Debug|x86.Build.0 = Debug|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|Any CPU.Build.0 = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x64.ActiveCfg = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x64.Build.0 = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x86.ActiveCfg = Release|Any CPU - {F218A6C1-3D4F-4351-9580-C99DBC3774FF}.Release|x86.Build.0 = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x64.ActiveCfg = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x64.Build.0 = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x86.ActiveCfg = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Debug|x86.Build.0 = Debug|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|Any CPU.Build.0 = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x64.ActiveCfg = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x64.Build.0 = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x86.ActiveCfg = Release|Any CPU - {E0B23172-E795-4AC5-B9E2-6922E4F167BB}.Release|x86.Build.0 = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x64.ActiveCfg = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x64.Build.0 = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x86.ActiveCfg = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Debug|x86.Build.0 = Debug|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|Any CPU.Build.0 = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x64.ActiveCfg = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x64.Build.0 = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x86.ActiveCfg = Release|Any CPU - {7068DDA8-71B9-428E-BCC3-89658670B830}.Release|x86.Build.0 = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x64.ActiveCfg = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x64.Build.0 = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x86.ActiveCfg = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Debug|x86.Build.0 = Debug|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|Any CPU.Build.0 = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x64.ActiveCfg = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x64.Build.0 = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x86.ActiveCfg = Release|Any CPU - {8C463360-0156-461C-A065-CC30FE3B0595}.Release|x86.Build.0 = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x64.ActiveCfg = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x64.Build.0 = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x86.ActiveCfg = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Debug|x86.Build.0 = Debug|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|Any CPU.Build.0 = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x64.ActiveCfg = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x64.Build.0 = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x86.ActiveCfg = Release|Any CPU - {A5C87DA6-6793-4824-88E5-4F8310FE55B8}.Release|x86.Build.0 = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x64.ActiveCfg = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x64.Build.0 = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x86.ActiveCfg = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Debug|x86.Build.0 = Debug|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|Any CPU.Build.0 = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x64.ActiveCfg = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x64.Build.0 = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x86.ActiveCfg = Release|Any CPU - {73E7BC19-A626-4C55-990B-A878BF84D4CA}.Release|x86.Build.0 = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x64.ActiveCfg = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x64.Build.0 = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x86.ActiveCfg = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Debug|x86.Build.0 = Debug|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|Any CPU.Build.0 = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x64.ActiveCfg = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x64.Build.0 = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x86.ActiveCfg = Release|Any CPU - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94}.Release|x86.Build.0 = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x64.ActiveCfg = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x64.Build.0 = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x86.ActiveCfg = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Debug|x86.Build.0 = Debug|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|Any CPU.Build.0 = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x64.ActiveCfg = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x64.Build.0 = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x86.ActiveCfg = Release|Any CPU - {08EDD2B6-FFC1-42F9-AE62-479178A381FF}.Release|x86.Build.0 = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x64.ActiveCfg = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x64.Build.0 = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x86.ActiveCfg = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Debug|x86.Build.0 = Debug|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|Any CPU.Build.0 = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x64.ActiveCfg = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x64.Build.0 = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x86.ActiveCfg = Release|Any CPU - {547ED5DB-CD15-42B8-99C7-30274C5D843E}.Release|x86.Build.0 = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|Any CPU.Build.0 = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x64.ActiveCfg = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x64.Build.0 = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x86.ActiveCfg = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Debug|x86.Build.0 = Debug|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|Any CPU.ActiveCfg = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|Any CPU.Build.0 = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x64.ActiveCfg = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x64.Build.0 = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x86.ActiveCfg = Release|Any CPU - {69343427-D50D-4600-ADC0-C1B1910C0287}.Release|x86.Build.0 = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x64.ActiveCfg = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x64.Build.0 = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x86.ActiveCfg = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Debug|x86.Build.0 = Debug|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|Any CPU.Build.0 = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x64.ActiveCfg = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x64.Build.0 = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x86.ActiveCfg = Release|Any CPU - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0}.Release|x86.Build.0 = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x64.ActiveCfg = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x64.Build.0 = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x86.ActiveCfg = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Debug|x86.Build.0 = Debug|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|Any CPU.Build.0 = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x64.ActiveCfg = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x64.Build.0 = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x86.ActiveCfg = Release|Any CPU - {C38B5A72-F717-4C7F-AB4C-54039A439D4D}.Release|x86.Build.0 = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x64.ActiveCfg = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x64.Build.0 = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x86.ActiveCfg = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Debug|x86.Build.0 = Debug|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|Any CPU.Build.0 = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x64.ActiveCfg = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x64.Build.0 = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x86.ActiveCfg = Release|Any CPU - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B}.Release|x86.Build.0 = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x64.ActiveCfg = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x64.Build.0 = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x86.ActiveCfg = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Debug|x86.Build.0 = Debug|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|Any CPU.Build.0 = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x64.ActiveCfg = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x64.Build.0 = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x86.ActiveCfg = Release|Any CPU - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE}.Release|x86.Build.0 = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|Any CPU.Build.0 = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x64.ActiveCfg = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x64.Build.0 = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x86.ActiveCfg = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Debug|x86.Build.0 = Debug|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|Any CPU.ActiveCfg = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|Any CPU.Build.0 = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x64.ActiveCfg = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x64.Build.0 = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x86.ActiveCfg = Release|Any CPU - {583674A0-3FC4-4AC1-9583-45A67CAF6198}.Release|x86.Build.0 = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x64.ActiveCfg = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x64.Build.0 = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x86.ActiveCfg = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Debug|x86.Build.0 = Debug|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|Any CPU.Build.0 = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x64.ActiveCfg = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x64.Build.0 = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x86.ActiveCfg = Release|Any CPU - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD}.Release|x86.Build.0 = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x64.ActiveCfg = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x64.Build.0 = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x86.ActiveCfg = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Debug|x86.Build.0 = Debug|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|Any CPU.Build.0 = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x64.ActiveCfg = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x64.Build.0 = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x86.ActiveCfg = Release|Any CPU - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F}.Release|x86.Build.0 = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x64.ActiveCfg = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x64.Build.0 = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x86.ActiveCfg = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Debug|x86.Build.0 = Debug|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|Any CPU.Build.0 = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x64.ActiveCfg = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x64.Build.0 = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x86.ActiveCfg = Release|Any CPU - {72652F7E-CFC0-4E3D-AD96-74C206A110BA}.Release|x86.Build.0 = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x64.ActiveCfg = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x64.Build.0 = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x86.ActiveCfg = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Debug|x86.Build.0 = Debug|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|Any CPU.Build.0 = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x64.ActiveCfg = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x64.Build.0 = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x86.ActiveCfg = Release|Any CPU - {92D490BC-B953-45DC-8F9D-A992B2AEF96A}.Release|x86.Build.0 = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|Any CPU.Build.0 = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x64.ActiveCfg = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x64.Build.0 = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x86.ActiveCfg = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Debug|x86.Build.0 = Debug|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|Any CPU.ActiveCfg = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|Any CPU.Build.0 = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x64.ActiveCfg = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x64.Build.0 = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x86.ActiveCfg = Release|Any CPU - {27144ED2-9F74-4A86-AABA-38CD061D8984}.Release|x86.Build.0 = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x64.ActiveCfg = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x64.Build.0 = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x86.ActiveCfg = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Debug|x86.Build.0 = Debug|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|Any CPU.Build.0 = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x64.ActiveCfg = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x64.Build.0 = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x86.ActiveCfg = Release|Any CPU - {39A6C03B-52AB-45F4-8D01-C3A1E5095765}.Release|x86.Build.0 = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x64.ActiveCfg = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x64.Build.0 = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x86.ActiveCfg = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Debug|x86.Build.0 = Debug|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|Any CPU.Build.0 = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x64.ActiveCfg = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x64.Build.0 = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x86.ActiveCfg = Release|Any CPU - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531}.Release|x86.Build.0 = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|Any CPU.Build.0 = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x64.ActiveCfg = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x64.Build.0 = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x86.ActiveCfg = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Debug|x86.Build.0 = Debug|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|Any CPU.ActiveCfg = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|Any CPU.Build.0 = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x64.ActiveCfg = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x64.Build.0 = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x86.ActiveCfg = Release|Any CPU - {744F01AD-B28E-4B25-B6BA-42821157CA72}.Release|x86.Build.0 = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x64.ActiveCfg = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x64.Build.0 = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x86.ActiveCfg = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Debug|x86.Build.0 = Debug|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|Any CPU.Build.0 = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x64.ActiveCfg = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x64.Build.0 = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x86.ActiveCfg = Release|Any CPU - {15BBCE34-82A2-489C-A65B-5BAEA299F07E}.Release|x86.Build.0 = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x64.ActiveCfg = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x64.Build.0 = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x86.ActiveCfg = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Debug|x86.Build.0 = Debug|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|Any CPU.Build.0 = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x64.ActiveCfg = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x64.Build.0 = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x86.ActiveCfg = Release|Any CPU - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A}.Release|x86.Build.0 = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x64.ActiveCfg = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x64.Build.0 = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x86.ActiveCfg = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Debug|x86.Build.0 = Debug|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|Any CPU.Build.0 = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x64.ActiveCfg = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x64.Build.0 = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x86.ActiveCfg = Release|Any CPU - {CCFE3593-49A7-4F03-A329-687490CD0143}.Release|x86.Build.0 = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x64.ActiveCfg = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x64.Build.0 = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x86.ActiveCfg = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Debug|x86.Build.0 = Debug|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|Any CPU.Build.0 = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x64.ActiveCfg = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x64.Build.0 = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x86.ActiveCfg = Release|Any CPU - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1}.Release|x86.Build.0 = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x64.ActiveCfg = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x64.Build.0 = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x86.ActiveCfg = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Debug|x86.Build.0 = Debug|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|Any CPU.Build.0 = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x64.ActiveCfg = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x64.Build.0 = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x86.ActiveCfg = Release|Any CPU - {DF023DD5-1158-4E2D-B542-21AF2E387428}.Release|x86.Build.0 = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x64.ActiveCfg = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x64.Build.0 = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x86.ActiveCfg = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Debug|x86.Build.0 = Debug|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|Any CPU.Build.0 = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x64.ActiveCfg = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x64.Build.0 = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x86.ActiveCfg = Release|Any CPU - {F43484E3-6D87-476D-AD21-AB880C65B6C2}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {DAA67050-44B3-458F-9818-5877D606866A} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {125DFA83-328D-4F8B-91EC-3057FFF410BE} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {3D767C8C-7E04-4264-B4E9-13600650D2B1} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} - {34602A2D-24B2-47C0-9678-F1F7CD6C8C6D} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} - {55AC8E7E-DA0A-489D-8059-4E7190C9EEBF} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} - {BBAFA814-1026-4A39-AA28-BCAE3951A224} = {F120E99A-FB2A-4C3B-B588-9B7ED1CD4E8A} - {E2905A71-E25D-46FC-A128-D6A366D4D751} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {1B55E682-B518-4E59-8972-07C82ED5A677} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {4C1D5422-4C52-4603-A01A-E1E6304633EC} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {564FA6A0-EC54-41C6-A35F-89890E1D06E3} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {C083A377-13CA-47C1-8B17-1FE353EA76F0} = {564FA6A0-EC54-41C6-A35F-89890E1D06E3} - {BAEA0F6F-39E9-4893-8787-C4D292D3B169} = {564FA6A0-EC54-41C6-A35F-89890E1D06E3} - {83FF8083-7EE2-4196-86A8-239F921B443C} = {564FA6A0-EC54-41C6-A35F-89890E1D06E3} - {1F299343-30DF-4599-A95D-BCFB1754DA48} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {261AC321-8982-4C3A-8DBF-DAFC95F97697} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {D3F5EF2B-CE37-4339-A8BD-50E6C5B2AFA1} = {261AC321-8982-4C3A-8DBF-DAFC95F97697} - {E8F93376-1367-4A7B-A729-116199804356} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {6C6696CB-8DCC-4E93-A667-A313D70E0220} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {1DB27FA0-E7E4-42C1-B062-4DE0128D4FA1} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {14BD8AE7-C8DF-4C7C-8244-7F74C101569D} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {F4602DC8-3C17-4834-B640-9A3B27FE278A} = {14BD8AE7-C8DF-4C7C-8244-7F74C101569D} - {2F037600-2002-4A13-9359-98FB0D2416BE} = {14BD8AE7-C8DF-4C7C-8244-7F74C101569D} - {0A17021E-5F10-429B-88C8-E4073EADACB6} = {14BD8AE7-C8DF-4C7C-8244-7F74C101569D} - {7BE7C12A-AE0A-4D0B-A076-325AD6E02475} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {93031B72-2045-48C6-9585-DC7FA0BA967B} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {93789F1B-0539-49B5-A585-9F6EF9E88264} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {03950661-2B1F-48F4-91D2-1E6395B710C2} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {3A03552A-252D-4E86-A8D7-135579AAEB85} = {03950661-2B1F-48F4-91D2-1E6395B710C2} - {C60BCC90-BAEE-4678-ACC9-11553AA64249} = {03950661-2B1F-48F4-91D2-1E6395B710C2} - {0294714B-A1CC-4F8E-8935-315B3499638F} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {22D81BC2-2659-483A-B7AC-8FCA086A99A7} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {B170B19B-3FFA-4F71-AF12-A1E3955A0F8E} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {C715669D-FBDE-4BFF-B9A3-75615D3C179A} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {0AACC135-9624-423D-8988-69701C0FE428} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {561CEB82-3D97-49D0-932E-664E6779FC61} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {6B9357F7-014F-4725-AF3E-0B8EA17B62C5} = {561CEB82-3D97-49D0-932E-664E6779FC61} - {E4E93A24-0A97-419F-836C-EAA23D0FFF81} = {561CEB82-3D97-49D0-932E-664E6779FC61} - {F6A9CC5C-91A2-4AAB-AEC9-8007A62A081E} = {561CEB82-3D97-49D0-932E-664E6779FC61} - {BAF22B80-2937-4695-A613-F170D8FB9020} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {2B60C5B7-7502-448E-8881-3DD29C1DE999} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {9D79154C-E503-4D6C-BCED-EEC82E314FBE} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {A2419B54-5E7C-4FA0-B82A-7E15E4D29AD1} = {2B60C5B7-7502-448E-8881-3DD29C1DE999} - {0A667FDF-DD10-4CA5-8C71-DBA5AEED1D63} = {2B60C5B7-7502-448E-8881-3DD29C1DE999} - {B42EFEB5-6196-4D8C-A46C-671D339B3C15} = {2B60C5B7-7502-448E-8881-3DD29C1DE999} - {B63EBC68-9A38-41C0-826E-95CD14B067A4} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {A92E70F9-8028-4E0C-B167-884E1E56854F} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {259D0D48-C856-47C8-8014-66CE9A7C353F} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {6DFA84B9-71DB-4EDC-AA71-C0542D6ECCCC} = {B63EBC68-9A38-41C0-826E-95CD14B067A4} - {AADE70FC-9F6D-47EC-8141-A30F6EFF8095} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {4AE83D68-EA10-473D-BD26-19C5928A8620} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {79EF8E85-1DFC-42B5-BDE3-72639F25848C} = {4AE83D68-EA10-473D-BD26-19C5928A8620} - {C7D057AF-E2A5-4E26-846E-A328A0F14A3C} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {6BC98146-279F-4DE5-9B6E-0F0C07507421} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {662514C8-EAED-4EAB-91CE-893D4DE2469A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {1E753568-E34B-4E93-93F8-43764171725D} = {662514C8-EAED-4EAB-91CE-893D4DE2469A} - {FB9B8F61-5125-452B-8332-938DCFA27366} = {662514C8-EAED-4EAB-91CE-893D4DE2469A} - {373472DA-BAEB-44B6-915D-1EF3DA845797} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {79CBF217-CED1-4BB2-9A72-37D2429F83B8} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {2CC61B84-CF97-4CE7-A08F-2EECF4AEAD92} = {79CBF217-CED1-4BB2-9A72-37D2429F83B8} - {4DCF987E-9071-4899-8B5F-5FDAF2BC77D3} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {DDDAABA3-D8F0-47C6-98E0-AB57F28404CF} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {C686CEA0-8B89-470B-84A2-0264040DCDC8} = {DDDAABA3-D8F0-47C6-98E0-AB57F28404CF} - {5B825CF9-E8B8-4960-9330-648ED0323FE0} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {6095E8B8-7F99-4A12-B7E2-376F7EDD7435} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {A7614F2B-E810-412E-91E7-8B6272DD5DBB} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {36FC2579-582A-4DAF-9B20-AB33331624C6} = {A7614F2B-E810-412E-91E7-8B6272DD5DBB} - {DA5DD2CB-51D9-429F-91F5-BF3D1A13A21A} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {887F91FF-C41D-4286-AD0F-DE56516E4E73} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {5FB20992-C7C3-4A4C-8117-FD26D156554A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {23FEAA8C-0C5B-41BD-A025-BABFA6091DCC} = {5FB20992-C7C3-4A4C-8117-FD26D156554A} - {8D3EED95-8EE5-421D-9161-F2AFA8D22543} = {5FB20992-C7C3-4A4C-8117-FD26D156554A} - {F9279F45-8A1F-41C0-B027-0EF6FFE3B706} = {5FB20992-C7C3-4A4C-8117-FD26D156554A} - {A855190A-DE7A-4B98-835D-7C23E1B600D2} = {5FB20992-C7C3-4A4C-8117-FD26D156554A} - {2A405CF6-72CA-488D-A159-2D5F72C7E2DF} = {5FB20992-C7C3-4A4C-8117-FD26D156554A} - {114DDF07-489A-419B-BE76-E5A289F12791} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {B209275E-1CFF-4AF0-A65A-2895DD679775} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {AD230A69-F6AE-4A9B-B500-90516BA2E1C6} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {FA34A40C-62C9-4A73-A39D-53A01243657C} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {ED3E5B89-091C-4A0E-9A2B-946CA1A11557} = {114DDF07-489A-419B-BE76-E5A289F12791} - {0A4E5B43-155A-4FDA-A50F-0B86CF1705E7} = {114DDF07-489A-419B-BE76-E5A289F12791} - {019D6506-9D68-41AD-A7A1-A27B2FFE1253} = {114DDF07-489A-419B-BE76-E5A289F12791} - {C696480B-C2E0-4ACA-BD5E-A62BF8558024} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {BF4C4E57-DAAF-4EE5-B330-1923106BAE69} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {CF6CF1C3-EBE1-41CE-9B34-0C2F931AEA12} = {BF4C4E57-DAAF-4EE5-B330-1923106BAE69} - {978EED2A-43BB-4DE6-8563-3A9972869661} = {BF4C4E57-DAAF-4EE5-B330-1923106BAE69} - {A87F7800-BD24-4577-8F15-50D33C8DACF1} = {BF4C4E57-DAAF-4EE5-B330-1923106BAE69} - {1200FB2E-F476-4151-BDFD-1DAEE3E99FF5} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {DE596B1A-B923-4D19-89B6-A361FA4EB5BF} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {0761C6CF-28E8-FC0F-6AF3-213E4B312DD0} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {84DCC422-2F8D-4309-A324-07E2C8C2EE8E} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {7431DE02-23CA-4024-B22D-FCF008AFE3CB} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {FF2CE5E5-41C7-4BED-92EA-9F9FD8A7A444} = {7431DE02-23CA-4024-B22D-FCF008AFE3CB} - {1E18FE0B-C6DF-4935-AD43-4FEE73ED810C} = {7431DE02-23CA-4024-B22D-FCF008AFE3CB} - {59101126-7BD2-4E03-9C4D-D0D01AD14674} = {7431DE02-23CA-4024-B22D-FCF008AFE3CB} - {31D2ECC1-15EA-4850-88E9-A5F967D742C9} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {BEA41234-DFF9-49AE-AD6C-42A9D54202E7} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {6782F1C1-5146-549F-82A8-60C82F1C7F16} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {97E455C1-C914-4C51-87A9-2C213CE2ED5B} = {6782F1C1-5146-549F-82A8-60C82F1C7F16} - {5DF8F833-F6F8-4C9C-ABEC-80EC0C734A88} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {E48F6DDD-D62D-4723-810D-0F178C35E8B8} = {6782F1C1-5146-549F-82A8-60C82F1C7F16} - {DD7042A1-8E44-40A8-B338-DC2F7B755702} = {6782F1C1-5146-549F-82A8-60C82F1C7F16} - {E54E9DCA-1420-4306-83B6-D45D6EC49DBF} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {0E6EBCFB-DEF5-496C-95AF-00884826CFC8} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {861FE61C-90EE-49B0-BCC8-8417C293CC21} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {52846E18-99D1-4040-AF5F-17FC69198BCE} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {D098AD9B-4D9C-45E1-9D7D-17FCC0EE95E2} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {C46D82D9-327E-43CE-9FEB-B0A233E1C094} = {204BB8D8-04E3-4FE5-BB08-E793BF532F2F} - {E267907F-4467-4504-9947-2A5A6940DE9B} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {2B0503E5-4FD5-4ED5-8AFA-8FC9609FCEC1} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {9772004D-0905-421A-98C6-DAE1C35080B3} = {2B0503E5-4FD5-4ED5-8AFA-8FC9609FCEC1} - {449B3661-A6F2-46D3-8EC9-B515362A72C1} = {2B0503E5-4FD5-4ED5-8AFA-8FC9609FCEC1} - {70A77931-7D25-4CBF-AE55-F5A3B932E9F8} = {2B0503E5-4FD5-4ED5-8AFA-8FC9609FCEC1} - {80CCC017-3821-4F7D-902C-BB71DE875F58} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {B81CEEE6-991E-418C-96D3-F831540C6DE1} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {B9BEA97B-D722-4390-A34D-228AE7947E7C} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {D2DDEA96-4A7E-496B-AFBE-69A133156C5F} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {5ADBE907-7E0B-4AD7-9073-C032C4183914} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {99441705-4BFA-499F-9897-371238665E38} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {11768120-E86C-4464-A68A-6F9BD0999BB9} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {BA416CE7-0C29-4FBA-B31A-327A7ECB56C9} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {A7852D8B-BE38-4D95-A8D6-3B6F96F94A5A} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {35B51242-F576-4CCE-BA29-712A80749CB1} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {1C65F967-D5F1-424B-82E9-B8585B6F0BD6} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {28FCB1E2-7460-4FDD-AA63-03162C9F2154} = {1C65F967-D5F1-424B-82E9-B8585B6F0BD6} - {3D076CFF-6482-4126-9F29-C7617E7D2F5B} = {1C65F967-D5F1-424B-82E9-B8585B6F0BD6} - {D214CBF5-D5E4-4641-868D-66B0C5337DD5} = {1C65F967-D5F1-424B-82E9-B8585B6F0BD6} - {BDAF7D27-C600-4419-9782-CF15BA5272E9} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {204BB8D8-04E3-4FE5-BB08-E793BF532F2F} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {356853EE-2C47-429C-B6CF-F3F76B6FFD91} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {F926FB8A-77C6-4D39-AE44-9A7C11A3202D} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {002E2F54-BB99-41F2-98D5-D6CC3B6A2845} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {FE9F4F1A-1115-4F18-96D8-C8A4AD50CDA5} = {002E2F54-BB99-41F2-98D5-D6CC3B6A2845} - {C4C113D8-7E40-4962-BBD8-735B478933D6} = {002E2F54-BB99-41F2-98D5-D6CC3B6A2845} - {3CC919A7-3550-4046-99CF-BC164F817E63} = {002E2F54-BB99-41F2-98D5-D6CC3B6A2845} - {C40D5274-DACF-4962-A58A-F08BDA80D0E2} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {F4891827-BE07-4547-AF89-2734FB8DE6D5} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {96458513-CAA8-498B-B4EE-3BF994140741} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {511D321E-277E-465A-AD62-B9971A6DD17E} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {72054ADC-94AC-48D4-9718-72B70E830CD2} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {57EF72E3-24DA-41B3-A3A1-B69E26421F68} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {8406E585-3329-48C5-B268-8C2140B720B6} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {A461FE7E-2458-428C-B794-6CC388031F16} = {8406E585-3329-48C5-B268-8C2140B720B6} - {50FBAF3E-E0BB-44FF-884F-660357C1CC54} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {AFEAF08C-4959-4CF2-8806-4E75F8F73B2E} = {50FBAF3E-E0BB-44FF-884F-660357C1CC54} - {50D628FD-9E2B-4ECB-B219-FBC008A5EBDA} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {CB491C52-A3D5-4F36-97C4-75C482F90A30} = {734EF69D-EE4D-4E9B-96BD-A44E53C5D1EC} - {734EF69D-EE4D-4E9B-96BD-A44E53C5D1EC} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {958A251E-9D2A-4D67-9D1C-47D6A9E36B3A} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {F218A6C1-3D4F-4351-9580-C99DBC3774FF} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {E0B23172-E795-4AC5-B9E2-6922E4F167BB} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {35E5A4C8-219B-44AC-AB93-B07A67BCC810} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {7068DDA8-71B9-428E-BCC3-89658670B830} = {35E5A4C8-219B-44AC-AB93-B07A67BCC810} - {8C463360-0156-461C-A065-CC30FE3B0595} = {35E5A4C8-219B-44AC-AB93-B07A67BCC810} - {A5C87DA6-6793-4824-88E5-4F8310FE55B8} = {35E5A4C8-219B-44AC-AB93-B07A67BCC810} - {734EF69D-EE4D-4E9B-96BD-A44E53C5D2EC} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {73E7BC19-A626-4C55-990B-A878BF84D4CA} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {9C66ECFF-8077-4D5A-9CEB-6E9AB6CCBE94} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {08EDD2B6-FFC1-42F9-AE62-479178A381FF} = {734EF69D-EE4D-4E9B-96BD-A44E53C5D2EC} - {547ED5DB-CD15-42B8-99C7-30274C5D843E} = {734EF69D-EE4D-4E9B-96BD-A44E53C5D2EC} - {69343427-D50D-4600-ADC0-C1B1910C0287} = {734EF69D-EE4D-4E9B-96BD-A44E53C5D2EC} - {E83D626B-D2DC-488D-B2BE-CA4C6049F1E0} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {A4E81DCC-B13D-4513-8933-E7E405439AE9} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {C38B5A72-F717-4C7F-AB4C-54039A439D4D} = {A4E81DCC-B13D-4513-8933-E7E405439AE9} - {B98C88E3-2AEE-4B9F-8736-4A7E746AE28B} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {00D019B1-445D-F7A5-70C9-7BAD0D81E4DE} = {4AE83D68-EA10-473D-BD26-19C5928A8620} - {41ACF613-EE5A-5900-F4D1-9FB713A32BE8} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {89078B53-6207-6E04-F939-AF96EA0F1B4B} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {583674A0-3FC4-4AC1-9583-45A67CAF6198} = {89078B53-6207-6E04-F939-AF96EA0F1B4B} - {C6A25DC4-8B30-4B46-BC68-0D4BC93423FD} = {89078B53-6207-6E04-F939-AF96EA0F1B4B} - {FD66E0B7-9737-4D6F-AFEB-70E83EC8A56F} = {89078B53-6207-6E04-F939-AF96EA0F1B4B} - {72652F7E-CFC0-4E3D-AD96-74C206A110BA} = {41ACF613-EE5A-5900-F4D1-9FB713A32BE8} - {92D490BC-B953-45DC-8F9D-A992B2AEF96A} = {41ACF613-EE5A-5900-F4D1-9FB713A32BE8} - {27144ED2-9F74-4A86-AABA-38CD061D8984} = {41ACF613-EE5A-5900-F4D1-9FB713A32BE8} - {39A6C03B-52AB-45F4-8D01-C3A1E5095765} = {E3C2B4B7-B3B0-4E7F-A975-A6C7FD926792} - {C72E4CF1-EDEF-4AA8-A116-DAD99A86B531} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {612ECA40-80B7-4365-9A6A-C35A6BE30FED} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {744F01AD-B28E-4B25-B6BA-42821157CA72} = {612ECA40-80B7-4365-9A6A-C35A6BE30FED} - {15BBCE34-82A2-489C-A65B-5BAEA299F07E} = {612ECA40-80B7-4365-9A6A-C35A6BE30FED} - {9DB0C7B2-31D3-481C-9C0C-EEAEC9B2AA6A} = {612ECA40-80B7-4365-9A6A-C35A6BE30FED} - {CCFE3593-49A7-4F03-A329-687490CD0143} = {899F0713-7FC6-4750-BAFC-AC650B35B453} - {A1E57E26-B650-42D6-84E2-5C2A5C1A11D1} = {414151D4-7009-4E78-A5C6-D99EBD1E67D1} - {0CE3C255-7FF4-EA80-717A-A208DB412F1A} = {8519CC01-1370-47C8-AD94-B0F326B1563F} - {DF023DD5-1158-4E2D-B542-21AF2E387428} = {0CE3C255-7FF4-EA80-717A-A208DB412F1A} - {F43484E3-6D87-476D-AD21-AB880C65B6C2} = {0CE3C255-7FF4-EA80-717A-A208DB412F1A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {08B1D4B8-D2C5-4A64-BB8B-E1A2B29525F0} - EndGlobalSection -EndGlobal diff --git a/CommunityToolkit.Aspire.slnx b/CommunityToolkit.Aspire.slnx new file mode 100644 index 00000000..54d2ed1c --- /dev/null +++ b/CommunityToolkit.Aspire.slnx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Directory.Build.props b/Directory.Build.props index 55bbaaf0..b1a9dcce 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,13 +12,13 @@ enable 9 - $(AspireMajorVersion).1.0 + $(AspireMajorVersion).3.0 $(AspireVersion) 9.0.0 - 9.0.3 + 9.0.4 1.11.1 - 4.3.0 - 9.3.0-preview.1.25161.3 + 4.4.0 + 9.5.0 false $(MSBuildThisFileDirectory) @@ -37,7 +37,7 @@ - 3 + 5 1 preview.1 diff --git a/Directory.Packages.props b/Directory.Packages.props index 3ce3afdc..d756ebe6 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,6 +6,7 @@ + @@ -15,9 +16,8 @@ - - - + + @@ -26,12 +26,12 @@ - - + + - + - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -40,9 +40,9 @@ - + - + @@ -56,19 +56,20 @@ - + - - - + + + + - + - + @@ -81,6 +82,9 @@ + + + @@ -98,6 +102,7 @@ - + + \ No newline at end of file diff --git a/README.md b/README.md index 1fafb6a6..eab986af 100644 --- a/README.md +++ b/README.md @@ -12,41 +12,43 @@ All features are contributed by you, our amazing .NET community, and maintained This repository contains the source code for the .NET Aspire Community Toolkit, a collection of community created Integrations and extensions for [.NET Aspire](https://aka.ms/dotnet/aspire). -| Package | Description | -|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| - **Learn More**: [`Hosting.Azure.StaticWebApps`][swa-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps][swa-shields]][swa-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps][swa-shields-preview]][swa-nuget-preview] | A hosting integration for the [Azure Static Web Apps emulator](https://learn.microsoft.com/azure/static-web-apps/static-web-apps-cli-overview) (Note: this does not support deployment of a project to Azure Static Web Apps). | -| - **Learn More**: [`Hosting.Golang`][golang-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields]][golang-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields-preview]][golang-nuget-preview] | A hosting integration Golang apps. | -| - **Learn More**: [`Hosting.Java`][java-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields]][java-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields-preview]][java-nuget-preview] | An integration for running Java code in .NET Aspire either using the local JDK or using a container. | -| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.NodeJS.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications | -| - **Learn More**: [`Hosting.Ollama`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields]][ollama-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields-preview]][ollama-nuget-preview] | An Aspire hosting integration leveraging the [Ollama](https://ollama.com) container with support for downloading a model on startup. | -| - **Learn More**: [`OllamaSharp`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields]][ollamasharp-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields-preview]][ollamasharp-nuget-preview] | An Aspire client integration for the [OllamaSharp](https://github.com/awaescher/OllamaSharp) package. | -| - **Learn More**: [`Hosting.Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields]][meilisearch-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields-preview]][meilisearch-nuget-preview] | An Aspire hosting integration leveraging the [Meilisearch](https://meilisearch.com) container. | -| - **Learn More**: [`Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields]][meilisearch-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields-preview]][meilisearch-client-nuget-preview] | An Aspire client integration for the [Meilisearch](https://github.com/meilisearch/meilisearch-dotnet) package. | -| - **Learn More**: [`Hosting.Azure.DataApiBuilder`][dab-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields]][dab-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields-preview]][dab-nuget-preview] | A hosting integration for the [Azure Data API builder](https://learn.microsoft.com/en-us/azure/data-api-builder/overview). | -| - **Learn More**: [`Hosting.Deno`][deno-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields]][deno-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields-preview]][deno-nuget-preview] | A hosting integration for the Deno apps. | -| - **Learn More**: [`Hosting.SqlDatabaseProjects`][sql-database-projects-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields]][sql-database-projects-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields-preview]][sql-database-projects-nuget-preview] | A hosting integration for the SQL Databases Projects. | -| - **Learn More**: [`Hosting.Rust`][rust-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields]][rust-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields-preview]][rust-nuget-preview] | A hosting integration for the Rust apps. | -| - **Learn More**: [`Hosting.Bun`][bun-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields]][bun-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields-preview]][bun-nuget-preview] | A hosting integration for the Bun apps. | -| - **Learn More**: [`Hosting.Python.Extensions`][python-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Python.Extensions][python-ext-shields]][python-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions][python-ext-shields-preview]][python-ext-nuget-preview] | An integration that contains some additional extensions for running python applications | -| - **Learn More**: [`Hosting.EventStore`][eventstore-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.EventStore][eventstore-shields]][eventstore-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.EventStore][eventstore-shields-preview]][eventstore-nuget-preview] | An Aspire hosting integration leveraging the [EventStore](https://eventstore.com) container. | -| - **Learn More**: [`EventStore`][eventstore-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.EventStore][eventstore-client-shields]][eventstore-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.EventStore][eventstore-client-shields-preview]][eventstore-client-nuget-preview] | An Aspire client integration for the [EventStore](https://github.com/EventStore/EventStore-Client-Dotnet) package. | -| - **Learn More**: [`Hosting.ActiveMQ`][activemq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields]][activemq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields-preview]][activemq-nuget-preview] | An Aspire hosting integration leveraging the [ActiveMq](https://activemq.apache.org) container. | -| - **Learn More**: [`Hosting.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields]][sqlite-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields-preview]][sqlite-hosting-nuget-preview] | An Aspire hosting integration to setup a SQLite database with optional SQLite Web as a dev UI. | -| - **Learn More**: [`Microsoft.Data.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields]][sqlite-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields-preview]][sqlite-nuget-preview] | An Aspire client integration for the Microsoft.Data.Sqlite NuGet package. | -| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`][sqlite-ef-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields]][sqlite-ef-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields-preview]][sqlite-ef-nuget-preview] | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite NuGet package. | -| - **Learn More**: [`Hosting.Dapr`][dapr-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields]][dapr-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields-preview]][dapr-nuget-preview] | An Aspire hosting integration for Dapr. | -| - **Learn More**: [`Hosting.Azure.Dapr.Redis`][dapr-azureredis-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields]][dapr-azureredis-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields-preview]][dapr-azureredis-nuget-preview] | An extension for the Dapr hosting integration for using Dapr with Azure Redis cache. | -| - **Learn More**: [`Hosting.RavenDB`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields]][ravendb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields-preview]][ravendb-nuget-preview] | An Aspire integration leveraging the [RavenDB](https://ravendb.net/) container. | -| - **Learn More**: [`RavenDB.Client`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields]][ravendb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields-preview]][ravendb-client-nuget-preview] | An Aspire client integration for the [RavenDB.Client](https://www.nuget.org/packages/RavenDB.client) package. | -| - **Learn More**: [`Hosting.GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields]][go-feature-flag-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields-preview]][go-feature-flag-nuget-preview] | An Aspire hosting integration leveraging the [GoFeatureFlag](https://gofeatureflag.org/) container. | -| - **Learn More**: [`GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields]][go-feature-flag-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields-preview]][go-feature-flag-client-nuget-preview] | An Aspire client integration for the [GoFeatureFlag](https://github.com/open-feature/dotnet-sdk-contrib/tree/main/src/OpenFeature.Contrib.Providers.GOFeatureFlag) package. | -| - **Learn More**: [`Hosting.MongoDB.Extensions`][mongodb-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MongoDB.Extensions][mongodb-ext-shields]][mongodb-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions][mongodb-ext-shields-preview]][mongodb-ext-nuget-preview] | An integration that contains some additional extensions for hosting MongoDB container. | -| - **Learn More**: [`Hosting.PostgreSQL.Extensions`][postgres-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.PostgreSQL.Extensions][postgres-ext-shields]][postgres-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions][postgres-ext-shields-preview]][postgres-ext-nuget-preview] | An integration that contains some additional extensions for hosting PostgreSQL container. | -| - **Learn More**: [`Hosting.Redis.Extensions`][redis-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Redis.Extensions][redis-ext-shields]][redis-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions][redis-ext-shields-preview]][redis-ext-nuget-preview] | An integration that contains some additional extensions for hosting Redis container. | -| - **Learn More**: [`Hosting.SqlServer.Extensions`][sqlserver-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SqlServer.Extensions][sqlserver-ext-shields]][sqlserver-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions][sqlserver-ext-shields-preview]][sqlserver-ext-nuget-preview] | An integration that contains some additional extensions for hosting SqlServer container. | -| - **Learn More**: [`Hosting.LavinMQ`][lavinmq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields]][lavinmq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields-preview]][lavinmq-nuget-preview] | An Aspire hosting integration for [LavinMQ](https://www.lavinmq.com). | -| - **Learn More**: [`Hosting.MailPit`][mailpit-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields]][mailpit-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields-preview]][mailpit-ext-nuget-preview] | An Aspire integration leveraging the [MailPit](https://mailpit.axllent.org/) container. | -| - **Learn More**: [`Hosting.k6`][k6-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields]][k6-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields-preview]][k6-nuget-preview] | An Aspire integration leveraging the [Grafana k6](https://k6.io/) container. | +| Package | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| - **Learn More**: [`Hosting.Golang`][golang-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields]][golang-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields-preview]][golang-nuget-preview] | A hosting integration Golang apps. | +| - **Learn More**: [`Hosting.Java`][java-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields]][java-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields-preview]][java-nuget-preview] | An integration for running Java code in .NET Aspire either using the local JDK or using a container. | +| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.NodeJS.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications | +| - **Learn More**: [`Hosting.Ollama`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields]][ollama-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields-preview]][ollama-nuget-preview] | An Aspire hosting integration leveraging the [Ollama](https://ollama.com) container with support for downloading a model on startup. | +| - **Learn More**: [`OllamaSharp`][ollama-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields]][ollamasharp-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields-preview]][ollamasharp-nuget-preview] | An Aspire client integration for the [OllamaSharp](https://github.com/awaescher/OllamaSharp) package. | +| - **Learn More**: [`Hosting.Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields]][meilisearch-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields-preview]][meilisearch-nuget-preview] | An Aspire hosting integration leveraging the [Meilisearch](https://meilisearch.com) container. | +| - **Learn More**: [`Meilisearch`][meilisearch-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields]][meilisearch-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Meilisearch][meilisearch-client-shields-preview]][meilisearch-client-nuget-preview] | An Aspire client integration for the [Meilisearch](https://github.com/meilisearch/meilisearch-dotnet) package. | +| - **Learn More**: [`Hosting.Azure.DataApiBuilder`][dab-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields]][dab-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder][dab-shields-preview]][dab-nuget-preview] | A hosting integration for the [Azure Data API builder](https://learn.microsoft.com/en-us/azure/data-api-builder/overview). | +| - **Learn More**: [`Hosting.Deno`][deno-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields]][deno-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Deno][deno-shields-preview]][deno-nuget-preview] | A hosting integration for the Deno apps. | +| - **Learn More**: [`Hosting.SqlDatabaseProjects`][sql-database-projects-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields]][sql-database-projects-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects][sql-database-projects-shields-preview]][sql-database-projects-nuget-preview] | A hosting integration for the SQL Databases Projects. | +| - **Learn More**: [`Hosting.Rust`][rust-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields]][rust-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields-preview]][rust-nuget-preview] | A hosting integration for the Rust apps. | +| - **Learn More**: [`Hosting.Bun`][bun-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields]][bun-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields-preview]][bun-nuget-preview] | A hosting integration for the Bun apps. | +| - **Learn More**: [`Hosting.Python.Extensions`][python-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Python.Extensions][python-ext-shields]][python-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions][python-ext-shields-preview]][python-ext-nuget-preview] | An integration that contains some additional extensions for running python applications | +| - **Learn More**: [`Hosting.EventStore`][eventstore-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.EventStore][eventstore-shields]][eventstore-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.EventStore][eventstore-shields-preview]][eventstore-nuget-preview] | An Aspire hosting integration leveraging the [EventStore](https://eventstore.com) container. | +| - **Learn More**: [`EventStore`][eventstore-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.EventStore][eventstore-client-shields]][eventstore-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.EventStore][eventstore-client-shields-preview]][eventstore-client-nuget-preview] | An Aspire client integration for the [EventStore](https://github.com/EventStore/EventStore-Client-Dotnet) package. | +| - **Learn More**: [`Hosting.ActiveMQ`][activemq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields]][activemq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields-preview]][activemq-nuget-preview] | An Aspire hosting integration leveraging the [ActiveMq](https://activemq.apache.org) container. | +| - **Learn More**: [`Hosting.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields]][sqlite-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields-preview]][sqlite-hosting-nuget-preview] | An Aspire hosting integration to setup a SQLite database with optional SQLite Web as a dev UI. | +| - **Learn More**: [`Microsoft.Data.Sqlite`][sqlite-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields]][sqlite-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.Data.Sqlite][sqlite-shields-preview]][sqlite-nuget-preview] | An Aspire client integration for the Microsoft.Data.Sqlite NuGet package. | +| - **Learn More**: [`Microsoft.EntityFrameworkCore.Sqlite`][sqlite-ef-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields]][sqlite-ef-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite][sqlite-ef-shields-preview]][sqlite-ef-nuget-preview] | An Aspire client integration for the Microsoft.EntityFrameworkCore.Sqlite NuGet package. | +| - **Learn More**: [`Hosting.Dapr`][dapr-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields]][dapr-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Dapr][dapr-shields-preview]][dapr-nuget-preview] | An Aspire hosting integration for Dapr. | +| - **Learn More**: [`Hosting.Azure.Dapr.Redis`][dapr-azureredis-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields]][dapr-azureredis-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis][dapr-azureredis-shields-preview]][dapr-azureredis-nuget-preview] | An extension for the Dapr hosting integration for using Dapr with Azure Redis cache. | +| - **Learn More**: [`Hosting.RavenDB`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields]][ravendb-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.RavenDB][ravendb-shields-preview]][ravendb-nuget-preview] | An Aspire integration leveraging the [RavenDB](https://ravendb.net/) container. | +| - **Learn More**: [`RavenDB.Client`][ravendb-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields]][ravendb-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.RavenDB.Client][ravendb-client-shields-preview]][ravendb-client-nuget-preview] | An Aspire client integration for the [RavenDB.Client](https://www.nuget.org/packages/RavenDB.client) package. | +| - **Learn More**: [`Hosting.GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields]][go-feature-flag-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.GoFeatureFlag][go-feature-flag-shields-preview]][go-feature-flag-nuget-preview] | An Aspire hosting integration leveraging the [GoFeatureFlag](https://gofeatureflag.org/) container. | +| - **Learn More**: [`GoFeatureFlag`][go-feature-flag-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields]][go-feature-flag-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.GoFeatureFlag][go-feature-flag-client-shields-preview]][go-feature-flag-client-nuget-preview] | An Aspire client integration for the [GoFeatureFlag](https://github.com/open-feature/dotnet-sdk-contrib/tree/main/src/OpenFeature.Contrib.Providers.GOFeatureFlag) package. | +| - **Learn More**: [`Hosting.MongoDB.Extensions`][mongodb-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MongoDB.Extensions][mongodb-ext-shields]][mongodb-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MongoDB.Extensions][mongodb-ext-shields-preview]][mongodb-ext-nuget-preview] | An integration that contains some additional extensions for hosting MongoDB container. | +| - **Learn More**: [`Hosting.PostgreSQL.Extensions`][postgres-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.PostgreSQL.Extensions][postgres-ext-shields]][postgres-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions][postgres-ext-shields-preview]][postgres-ext-nuget-preview] | An integration that contains some additional extensions for hosting PostgreSQL container. | +| - **Learn More**: [`Hosting.Redis.Extensions`][redis-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Redis.Extensions][redis-ext-shields]][redis-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Redis.Extensions][redis-ext-shields-preview]][redis-ext-nuget-preview] | An integration that contains some additional extensions for hosting Redis container. | +| - **Learn More**: [`Hosting.SqlServer.Extensions`][sqlserver-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.SqlServer.Extensions][sqlserver-ext-shields]][sqlserver-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.SqlServer.Extensions][sqlserver-ext-shields-preview]][sqlserver-ext-nuget-preview] | An integration that contains some additional extensions for hosting SqlServer container. | +| - **Learn More**: [`Hosting.LavinMQ`][lavinmq-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields]][lavinmq-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.LavinMQ][lavinmq-shields-preview]][lavinmq-nuget-preview] | An Aspire hosting integration for [LavinMQ](https://www.lavinmq.com). | +| - **Learn More**: [`Hosting.MailPit`][mailpit-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields]][mailpit-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MailPit][mailpit-ext-shields-preview]][mailpit-ext-nuget-preview] | An Aspire integration leveraging the [MailPit](https://mailpit.axllent.org/) container. | +| - **Learn More**: [`Hosting.k6`][k6-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields]][k6-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.k6][k6-shields-preview]][k6-nuget-preview] | An Aspire integration leveraging the [Grafana k6](https://k6.io/) container. | +| - **Learn More**: [`Hosting.MySql.Extensions`][mysql-ext-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.MySql.Extensions][mysql-ext-shields]][mysql-ext-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions][mysql-ext-shields-preview]][mysql-ext-nuget-preview] | An integration that contains some additional extensions for hosting MySql container. | +| - **Learn More**: [`Hosting.MinIO`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields]][minio-hosting-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields-preview]][minio-hosting-nuget-preview] | An Aspire hosting integration to setup a [MinIO S3](https://min.io/) storage. | +| - **Learn More**: [`MinIO.Client`][minio-integration-docs]
- Stable 📦: [![CommunityToolkit.Aspire.Minio.Client][minio-client-shields]][minio-client-nuget]
- Preview 📦: [![CommunityToolkit.Aspire.Client.Minio][minio-client-shields-preview]][minio-client-nuget-preview] | An Aspire client integration for the [MinIO](https://github.com/minio/minio-dotnet) package. | ## 🙌 Getting Started @@ -87,11 +89,6 @@ As a part of the .NET Foundation, we have adopted the [.NET Foundation Code of C This project is supported by the [.NET Foundation](https://dotnetfoundation.org). -[swa-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-azure-static-web-apps -[swa-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps -[swa-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/ -[swa-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps?label=nuget%20(preview) -[swa-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/absoluteLatest [golang-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-golang [golang-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Golang [golang-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Golang/ @@ -246,3 +243,17 @@ This project is supported by the [.NET Foundation](https://dotnetfoundation.org) [k6-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/ [k6-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.k6?label=nuget%20(preview) [k6-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.k6/absoluteLatest +[mysql-ext-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-mysql-extensions +[mysql-ext-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.MySql.Extensions +[mysql-ext-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/ +[mysql-ext-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.MySql.Extensions?label=nuget%20(preview) +[mysql-ext-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.MySql.Extensions/absoluteLatest +[minio-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-minio +[minio-hosting-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Minio +[minio-hosting-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/ +[minio-hosting-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Minio?label=nuget%20(preview) +[minio-hosting-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Minio/absoluteLatest +[minio-client-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Minio.Client +[minio-client-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/ +[minio-client-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Minio.Client?label=nuget%20(preview) +[minio-client-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Minio.Client/absoluteLatest diff --git a/docs/diagnostics.md b/docs/diagnostics.md index 4bb3e098..44baa371 100644 --- a/docs/diagnostics.md +++ b/docs/diagnostics.md @@ -10,10 +10,7 @@ In these cases, refer to the `` docs section of the API for more inform Once a release of .NET Aspire with that API is available, the API in the .NET Aspire Community Toolkit will be marked as obsolete and will be removed in a future release. -## CTASPIRE002 - -Support for loading extensions into SQLite requires either a NuGet package or folder path to the library to be provided, and as a result there is some custom logic to load the extension based on the path or NuGet package. This logic will require some experimenting to figure out edge cases, so the feature for extension loading will be kept as experimental until it is proven to be stable. - ## CTASPIRE003 -The underlying type used here may change to a different resource type in the future. Avoid taking a direct dependency on the Aspire type, instead rely on the CommunityToolkit resource type returned or the `Resource` type from Aspire. +The API is marked for deprecation and will be removed in a future release. + diff --git a/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj new file mode 100644 index 00000000..3bfd8baf --- /dev/null +++ b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/CommunityToolkit.Aspire.Hosting.Adminer.AppHost.csproj @@ -0,0 +1,22 @@ + + + + + Exe + enable + enable + true + + + + + + + + + + + + + + diff --git a/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Program.cs b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Program.cs new file mode 100644 index 00000000..357cbcfb --- /dev/null +++ b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Program.cs @@ -0,0 +1,33 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var postgres1 = builder.AddPostgres("postgres1") + .WithAdminer(); +postgres1.AddDatabase("db1"); +postgres1.AddDatabase("db2"); + +var postgres2 = builder.AddPostgres("postgres2") + .WithAdminer(); +postgres2.AddDatabase("db3"); +postgres2.AddDatabase("db4"); + +var sqlserver1 = builder.AddSqlServer("sqlserver1") + .WithAdminer(); +sqlserver1.AddDatabase("db5"); +sqlserver1.AddDatabase("db6"); + +var sqlserver2 = builder.AddSqlServer("sqlserver2") + .WithAdminer(); +sqlserver2.AddDatabase("db7"); +sqlserver2.AddDatabase("db8"); + +var mysql1 = builder.AddMySql("mysql1") + .WithAdminer(); +mysql1.AddDatabase("db9"); +mysql1.AddDatabase("db10"); + +var mysql2 = builder.AddMySql("mysql2") + .WithAdminer(); +mysql2.AddDatabase("db11"); +mysql2.AddDatabase("db12"); + +builder.Build().Run(); \ No newline at end of file diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Properties/launchSettings.json b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Properties/launchSettings.json similarity index 84% rename from examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Properties/launchSettings.json rename to examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Properties/launchSettings.json index 9a36a2c8..00e91269 100644 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Properties/launchSettings.json +++ b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/Properties/launchSettings.json @@ -5,24 +5,24 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "https://localhost:17178;http://localhost:15062", + "applicationUrl": "https://localhost:17202;http://localhost:15211", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "DOTNET_ENVIRONMENT": "Development", - "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21053", - "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22295" + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21182", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22097" } }, "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "http://localhost:15062", + "applicationUrl": "http://localhost:15211", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "DOTNET_ENVIRONMENT": "Development", - "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19191", - "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20099" + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19298", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20141" } } } diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/appsettings.json b/examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/appsettings.json similarity index 100% rename from examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/appsettings.json rename to examples/adminer/CommunityToolkit.Aspire.Hosting.Adminer.AppHost/appsettings.json diff --git a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj index a6b99132..e32acfbb 100644 --- a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj +++ b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/CommunityToolkit.Aspire.Hosting.DbGate.AppHost.csproj @@ -18,6 +18,7 @@ + diff --git a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/Program.cs b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/Program.cs index 5ce0b109..cb536582 100644 --- a/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/Program.cs +++ b/examples/dbgate/CommunityToolkit.Aspire.Hosting.DbGate.AppHost/Program.cs @@ -32,4 +32,14 @@ sqlserver2.AddDatabase("db12"); +var mysql1 = builder.AddMySql("mysql1") + .WithDbGate(c => c.WithHostPort(8068)); +mysql1.AddDatabase("db13"); +mysql1.AddDatabase("db14"); + +var mysql2 = builder.AddMySql("mysql2") + .WithDbGate(); +mysql2.AddDatabase("db15"); +mysql2.AddDatabase("db16"); + builder.Build().Run(); \ No newline at end of file diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/CommunityToolkit.Aspire.Hosting.Minio.ApiService.csproj b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/CommunityToolkit.Aspire.Hosting.Minio.ApiService.csproj new file mode 100644 index 00000000..50718ea7 --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/CommunityToolkit.Aspire.Hosting.Minio.ApiService.csproj @@ -0,0 +1,13 @@ + + + + enable + enable + + + + + + + + diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Program.cs b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Program.cs new file mode 100644 index 00000000..2b9c0373 --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Program.cs @@ -0,0 +1,77 @@ +using Microsoft.AspNetCore.Mvc; +using Minio; +using Minio.DataModel.Args; + +var builder = WebApplication.CreateBuilder(args); + +builder.AddServiceDefaults(); + +builder.AddMinioClient("minio"); + +var app = builder.Build(); + +app.MapDefaultEndpoints(); + +app.MapGet("/", () => "Hello World!"); + +app.MapPut("/buckets/{bucketName}", async (string bucketName, [FromServices] IMinioClient minioClient) => +{ + var mbArgs = new MakeBucketArgs() + .WithBucket(bucketName); + await minioClient.MakeBucketAsync(mbArgs); + + return Results.Ok(); +}); + +app.MapGet("/buckets/{bucketName}", async (string bucketName, [FromServices] IMinioClient minioClient) => +{ + var exists = await minioClient.BucketExistsAsync(new BucketExistsArgs().WithBucket(bucketName)); + + if(exists) + return Results.Ok(); + return Results.NotFound(); +}); + +app.MapPost("/buckets/{bucketName}/{fileName}/upload", + async ([FromRoute] string bucketName, + [FromRoute] string fileName, + HttpRequest request, + [FromServices] IMinioClient minioClient) => + { + var memstream = new MemoryStream(); + + await request.Body.CopyToAsync(memstream); + + var length = memstream.Length; + memstream.Seek(0, SeekOrigin.Begin); + + var putObjectArgs = new PutObjectArgs() + .WithObject(fileName) + .WithBucket(bucketName) + .WithStreamData(memstream) + .WithObjectSize(length); + + await minioClient.PutObjectAsync(putObjectArgs); + + return Results.Ok(); + }).DisableAntiforgery(); + +app.MapGet("/buckets/{bucketName}/{fileName}/download", + async (string bucketName, string fileName, [FromServices] IMinioClient minioClient) => + { + var memStream = new MemoryStream(); + + var getObjectArgs = new GetObjectArgs() + .WithBucket(bucketName) + .WithObject(fileName) + .WithCallbackStream(stream => + { + stream.CopyToAsync(memStream); + }); + + await minioClient.GetObjectAsync(getObjectArgs); + + return Results.File(memStream.ToArray(), "application/octet-stream", fileName); + }); + +app.Run(); \ No newline at end of file diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Properties/launchSettings.json b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Properties/launchSettings.json new file mode 100644 index 00000000..34090099 --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:52323", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7042;http://localhost:52323", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/appsettings.json b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/appsettings.json similarity index 100% rename from examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/appsettings.json rename to examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/appsettings.json diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj new file mode 100644 index 00000000..18cd3dcd --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj @@ -0,0 +1,21 @@ + + + + + Exe + enable + enable + true + bfe6b134-1a06-4449-a146-ba3cdb0d02a5 + + + + + + + + + + + + diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Program.cs b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Program.cs new file mode 100644 index 00000000..6e7a526f --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Program.cs @@ -0,0 +1,15 @@ +using Projects; + +var builder = DistributedApplication.CreateBuilder(args); + +var username = builder.AddParameter("user", "minioadmin"); +var password = builder.AddParameter("password", "minioadmin", secret: true); + +var minio = builder.AddMinioContainer("minio", username, password); + +builder.AddProject("apiservice") + .WithReference(minio) + .WaitFor(minio) + .WithHttpHealthCheck("/health"); + +builder.Build().Run(); \ No newline at end of file diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Properties/launchSettings.json b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..b2cfe754 --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:18120;http://localhost:12038", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:32476", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:12800" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15173", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19187", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:21252" + } + } + } +} diff --git a/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/appsettings.json b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/appsettings.json new file mode 100644 index 00000000..31c092aa --- /dev/null +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults.csproj b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults.csproj similarity index 95% rename from examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults.csproj rename to examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults.csproj index caa6344d..c9a4399a 100644 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults.csproj +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults.csproj @@ -1,4 +1,4 @@ - + enable diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/Extensions.cs b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/Extensions.cs similarity index 99% rename from examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/Extensions.cs rename to examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/Extensions.cs index 2a3f4e07..b34d7625 100644 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ServiceDefaults/Extensions.cs +++ b/examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/Extensions.cs @@ -9,7 +9,6 @@ using OpenTelemetry.Trace; namespace Microsoft.Extensions.Hosting; - // Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry. // This project should be referenced by each service project in your solution. // To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults diff --git a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj new file mode 100644 index 00000000..c2d40df9 --- /dev/null +++ b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost.csproj @@ -0,0 +1,20 @@ + + + + + Exe + enable + enable + true + + + + + + + + + + + + diff --git a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Program.cs b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Program.cs new file mode 100644 index 00000000..34bbcb38 --- /dev/null +++ b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Program.cs @@ -0,0 +1,14 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var mysql1 = builder.AddMySql("mysql1") + .WithAdminer(c => c.WithHostPort(8989)) + .WithDbGate(c => c.WithHostPort(9999)); +mysql1.AddDatabase("db1"); +mysql1.AddDatabase("db2"); + +var mysql2 = builder.AddMySql("mysql2") + .WithAdminer(c => c.WithHostPort(8989)); +mysql2.AddDatabase("db3"); +mysql2.AddDatabase("db4"); + +builder.Build().Run(); diff --git a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Properties/launchSettings.json b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..91be6c4a --- /dev/null +++ b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17113;http://localhost:15271", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21203", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22089" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15271", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19015", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20243" + } + } + } +} diff --git a/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/appsettings.json b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/appsettings.json new file mode 100644 index 00000000..31c092aa --- /dev/null +++ b/examples/mysql-ext/CommunityToolkit.Aspire.Hosting.MySql.Extensions.AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs b/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs index d63f79fb..6170fd87 100644 --- a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs +++ b/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs @@ -1,12 +1,15 @@ var builder = DistributedApplication.CreateBuilder(args); builder.AddViteApp("vite-demo") - .WithNpmPackageInstallation(); + .WithNpmPackageInstallation() + .WithHttpHealthCheck(); builder.AddViteApp("yarn-demo", packageManager: "yarn") - .WithYarnPackageInstallation(); + .WithYarnPackageInstallation() + .WithHttpHealthCheck(); builder.AddViteApp("pnpm-demo", packageManager: "pnpm") - .WithPnpmPackageInstallation(); + .WithPnpmPackageInstallation() + .WithHttpHealthCheck(); builder.Build().Run(); diff --git a/examples/nodejs-ext/pnpm-demo/package-lock.json b/examples/nodejs-ext/pnpm-demo/package-lock.json index fbbed54d..ddebe422 100644 --- a/examples/nodejs-ext/pnpm-demo/package-lock.json +++ b/examples/nodejs-ext/pnpm-demo/package-lock.json @@ -23,7 +23,7 @@ "run-script-os": "^1.1.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" + "vite": "^6.3.4" } }, "node_modules/@ampproject/remapping": { @@ -2978,6 +2978,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3096,15 +3141,18 @@ } }, "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", + "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -3167,6 +3215,34 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/examples/nodejs-ext/pnpm-demo/package.json b/examples/nodejs-ext/pnpm-demo/package.json index 53045029..32a80887 100644 --- a/examples/nodejs-ext/pnpm-demo/package.json +++ b/examples/nodejs-ext/pnpm-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" @@ -27,7 +25,7 @@ "run-script-os": "^1.1.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" + "vite": "^6.3.4" } } diff --git a/examples/nodejs-ext/pnpm-demo/pnpm-lock.yaml b/examples/nodejs-ext/pnpm-demo/pnpm-lock.yaml index e6ad220a..ffb110f6 100644 --- a/examples/nodejs-ext/pnpm-demo/pnpm-lock.yaml +++ b/examples/nodejs-ext/pnpm-demo/pnpm-lock.yaml @@ -26,7 +26,7 @@ importers: version: 18.3.0 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.5) + version: 4.3.4(vite@6.3.4) eslint: specifier: ^9.15.0 version: 9.15.0 @@ -49,8 +49,8 @@ importers: specifier: ^8.0.1 version: 8.5.0(eslint@9.15.0)(typescript@5.6.2) vite: - specifier: ^6.2.5 - version: 6.2.5 + specifier: ^6.3.4 + version: 6.3.4 packages: @@ -137,152 +137,152 @@ packages: resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.25.2': - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.2': - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.2': - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.2': - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.2': - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.2': - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.2': - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.2': - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.2': - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.2': - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.2': - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.2': - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.2': - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.2': - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.2': - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.2': - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.2': - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.2': - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.2': - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.2': - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.2': - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.2': - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.2': - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.2': - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.2': - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -371,103 +371,103 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@rollup/rollup-android-arm-eabi@4.39.0': - resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + '@rollup/rollup-android-arm-eabi@4.40.1': + resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.39.0': - resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + '@rollup/rollup-android-arm64@4.40.1': + resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.39.0': - resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + '@rollup/rollup-darwin-arm64@4.40.1': + resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.39.0': - resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + '@rollup/rollup-darwin-x64@4.40.1': + resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.39.0': - resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + '@rollup/rollup-freebsd-arm64@4.40.1': + resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.39.0': - resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + '@rollup/rollup-freebsd-x64@4.40.1': + resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': - resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.39.0': - resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.39.0': - resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + '@rollup/rollup-linux-arm64-gnu@4.40.1': + resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.39.0': - resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + '@rollup/rollup-linux-arm64-musl@4.40.1': + resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': - resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': - resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.39.0': - resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.39.0': - resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + '@rollup/rollup-linux-riscv64-musl@4.40.1': + resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.39.0': - resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + '@rollup/rollup-linux-s390x-gnu@4.40.1': + resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.39.0': - resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + '@rollup/rollup-linux-x64-gnu@4.40.1': + resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.39.0': - resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + '@rollup/rollup-linux-x64-musl@4.40.1': + resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.39.0': - resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.1': + resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.39.0': - resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + '@rollup/rollup-win32-ia32-msvc@4.40.1': + resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.39.0': - resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + '@rollup/rollup-win32-x64-msvc@4.40.1': + resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} cpu: [x64] os: [win32] @@ -657,8 +657,8 @@ packages: electron-to-chromium@1.5.115: resolution: {integrity: sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==} - esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} engines: {node: '>=18'} hasBin: true @@ -739,6 +739,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -928,6 +936,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + postcss@8.5.3: resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} @@ -964,8 +976,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.39.0: - resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} + rollup@4.40.1: + resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1008,6 +1020,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1045,8 +1061,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite@6.2.5: - resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==} + vite@6.3.4: + resolution: {integrity: sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1218,79 +1234,79 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@esbuild/aix-ppc64@0.25.2': + '@esbuild/aix-ppc64@0.25.3': optional: true - '@esbuild/android-arm64@0.25.2': + '@esbuild/android-arm64@0.25.3': optional: true - '@esbuild/android-arm@0.25.2': + '@esbuild/android-arm@0.25.3': optional: true - '@esbuild/android-x64@0.25.2': + '@esbuild/android-x64@0.25.3': optional: true - '@esbuild/darwin-arm64@0.25.2': + '@esbuild/darwin-arm64@0.25.3': optional: true - '@esbuild/darwin-x64@0.25.2': + '@esbuild/darwin-x64@0.25.3': optional: true - '@esbuild/freebsd-arm64@0.25.2': + '@esbuild/freebsd-arm64@0.25.3': optional: true - '@esbuild/freebsd-x64@0.25.2': + '@esbuild/freebsd-x64@0.25.3': optional: true - '@esbuild/linux-arm64@0.25.2': + '@esbuild/linux-arm64@0.25.3': optional: true - '@esbuild/linux-arm@0.25.2': + '@esbuild/linux-arm@0.25.3': optional: true - '@esbuild/linux-ia32@0.25.2': + '@esbuild/linux-ia32@0.25.3': optional: true - '@esbuild/linux-loong64@0.25.2': + '@esbuild/linux-loong64@0.25.3': optional: true - '@esbuild/linux-mips64el@0.25.2': + '@esbuild/linux-mips64el@0.25.3': optional: true - '@esbuild/linux-ppc64@0.25.2': + '@esbuild/linux-ppc64@0.25.3': optional: true - '@esbuild/linux-riscv64@0.25.2': + '@esbuild/linux-riscv64@0.25.3': optional: true - '@esbuild/linux-s390x@0.25.2': + '@esbuild/linux-s390x@0.25.3': optional: true - '@esbuild/linux-x64@0.25.2': + '@esbuild/linux-x64@0.25.3': optional: true - '@esbuild/netbsd-arm64@0.25.2': + '@esbuild/netbsd-arm64@0.25.3': optional: true - '@esbuild/netbsd-x64@0.25.2': + '@esbuild/netbsd-x64@0.25.3': optional: true - '@esbuild/openbsd-arm64@0.25.2': + '@esbuild/openbsd-arm64@0.25.3': optional: true - '@esbuild/openbsd-x64@0.25.2': + '@esbuild/openbsd-x64@0.25.3': optional: true - '@esbuild/sunos-x64@0.25.2': + '@esbuild/sunos-x64@0.25.3': optional: true - '@esbuild/win32-arm64@0.25.2': + '@esbuild/win32-arm64@0.25.3': optional: true - '@esbuild/win32-ia32@0.25.2': + '@esbuild/win32-ia32@0.25.3': optional: true - '@esbuild/win32-x64@0.25.2': + '@esbuild/win32-x64@0.25.3': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0)': @@ -1374,64 +1390,64 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@rollup/rollup-android-arm-eabi@4.39.0': + '@rollup/rollup-android-arm-eabi@4.40.1': optional: true - '@rollup/rollup-android-arm64@4.39.0': + '@rollup/rollup-android-arm64@4.40.1': optional: true - '@rollup/rollup-darwin-arm64@4.39.0': + '@rollup/rollup-darwin-arm64@4.40.1': optional: true - '@rollup/rollup-darwin-x64@4.39.0': + '@rollup/rollup-darwin-x64@4.40.1': optional: true - '@rollup/rollup-freebsd-arm64@4.39.0': + '@rollup/rollup-freebsd-arm64@4.40.1': optional: true - '@rollup/rollup-freebsd-x64@4.39.0': + '@rollup/rollup-freebsd-x64@4.40.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.39.0': + '@rollup/rollup-linux-arm-musleabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.39.0': + '@rollup/rollup-linux-arm64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.39.0': + '@rollup/rollup-linux-arm64-musl@4.40.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.39.0': + '@rollup/rollup-linux-riscv64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.39.0': + '@rollup/rollup-linux-riscv64-musl@4.40.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.39.0': + '@rollup/rollup-linux-s390x-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.39.0': + '@rollup/rollup-linux-x64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-musl@4.39.0': + '@rollup/rollup-linux-x64-musl@4.40.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.39.0': + '@rollup/rollup-win32-arm64-msvc@4.40.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.39.0': + '@rollup/rollup-win32-ia32-msvc@4.40.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.39.0': + '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true '@types/babel__core@7.20.5': @@ -1553,14 +1569,14 @@ snapshots: '@typescript-eslint/types': 8.5.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-react@4.3.4(vite@6.2.5)': + '@vitejs/plugin-react@4.3.4(vite@6.3.4)': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.5 + vite: 6.3.4 transitivePeerDependencies: - supports-color @@ -1644,33 +1660,33 @@ snapshots: electron-to-chromium@1.5.115: {} - esbuild@0.25.2: + esbuild@0.25.3: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 escalade@3.2.0: {} @@ -1768,6 +1784,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -1921,6 +1941,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + postcss@8.5.3: dependencies: nanoid: 3.3.11 @@ -1949,30 +1971,30 @@ snapshots: reusify@1.0.4: {} - rollup@4.39.0: + rollup@4.40.1: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.39.0 - '@rollup/rollup-android-arm64': 4.39.0 - '@rollup/rollup-darwin-arm64': 4.39.0 - '@rollup/rollup-darwin-x64': 4.39.0 - '@rollup/rollup-freebsd-arm64': 4.39.0 - '@rollup/rollup-freebsd-x64': 4.39.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 - '@rollup/rollup-linux-arm-musleabihf': 4.39.0 - '@rollup/rollup-linux-arm64-gnu': 4.39.0 - '@rollup/rollup-linux-arm64-musl': 4.39.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-musl': 4.39.0 - '@rollup/rollup-linux-s390x-gnu': 4.39.0 - '@rollup/rollup-linux-x64-gnu': 4.39.0 - '@rollup/rollup-linux-x64-musl': 4.39.0 - '@rollup/rollup-win32-arm64-msvc': 4.39.0 - '@rollup/rollup-win32-ia32-msvc': 4.39.0 - '@rollup/rollup-win32-x64-msvc': 4.39.0 + '@rollup/rollup-android-arm-eabi': 4.40.1 + '@rollup/rollup-android-arm64': 4.40.1 + '@rollup/rollup-darwin-arm64': 4.40.1 + '@rollup/rollup-darwin-x64': 4.40.1 + '@rollup/rollup-freebsd-arm64': 4.40.1 + '@rollup/rollup-freebsd-x64': 4.40.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 + '@rollup/rollup-linux-arm-musleabihf': 4.40.1 + '@rollup/rollup-linux-arm64-gnu': 4.40.1 + '@rollup/rollup-linux-arm64-musl': 4.40.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-musl': 4.40.1 + '@rollup/rollup-linux-s390x-gnu': 4.40.1 + '@rollup/rollup-linux-x64-gnu': 4.40.1 + '@rollup/rollup-linux-x64-musl': 4.40.1 + '@rollup/rollup-win32-arm64-msvc': 4.40.1 + '@rollup/rollup-win32-ia32-msvc': 4.40.1 + '@rollup/rollup-win32-x64-msvc': 4.40.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -2003,6 +2025,11 @@ snapshots: dependencies: has-flag: 4.0.0 + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2038,11 +2065,14 @@ snapshots: dependencies: punycode: 2.3.1 - vite@6.2.5: + vite@6.3.4: dependencies: - esbuild: 0.25.2 + esbuild: 0.25.3 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.39.0 + rollup: 4.40.1 + tinyglobby: 0.2.13 optionalDependencies: fsevents: 2.3.3 diff --git a/examples/nodejs-ext/vite-demo/package-lock.json b/examples/nodejs-ext/vite-demo/package-lock.json index 9279ceba..a126e9d5 100644 --- a/examples/nodejs-ext/vite-demo/package-lock.json +++ b/examples/nodejs-ext/vite-demo/package-lock.json @@ -23,7 +23,7 @@ "run-script-os": "^1.1.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" + "vite": "^6.3.4" } }, "node_modules/@ampproject/remapping": { @@ -3005,6 +3005,51 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3124,15 +3169,18 @@ } }, "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", + "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -3195,6 +3243,34 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/examples/nodejs-ext/vite-demo/package.json b/examples/nodejs-ext/vite-demo/package.json index 9faccebc..001ececb 100644 --- a/examples/nodejs-ext/vite-demo/package.json +++ b/examples/nodejs-ext/vite-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" @@ -27,6 +25,7 @@ "run-script-os": "^1.1.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" + "vite": "^6.3.4" } } + diff --git a/examples/nodejs-ext/yarn-demo/package-lock.json b/examples/nodejs-ext/yarn-demo/package-lock.json deleted file mode 100644 index 4aa52749..00000000 --- a/examples/nodejs-ext/yarn-demo/package-lock.json +++ /dev/null @@ -1,3216 +0,0 @@ -{ - "name": "yarn-demo", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "yarn-demo", - "version": "0.0.0", - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@eslint/js": "^9.9.0", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.15.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "run-script-os": "^1.1.6", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.10" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", - "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", - "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", - "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", - "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", - "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", - "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.115", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz", - "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==", - "dev": true, - "license": "ISC" - }, - "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint": { - "version": "9.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", - "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.15.0", - "@eslint/plugin-kit": "^0.2.3", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0-rc-fb9a90fa48-20240614", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", - "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.11.tgz", - "integrity": "sha512-wrAKxMbVr8qhXTtIKfXqAn5SAtRZt0aXxe5P23Fh4pUAdC6XEsybGLB8P0PI4j1yYqOgUEUlzKAGDfo7rJOjcw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", - "dev": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-script-os": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", - "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", - "dev": true, - "bin": { - "run-os": "index.js", - "run-script-os": "index.js" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/examples/nodejs-ext/yarn-demo/package.json b/examples/nodejs-ext/yarn-demo/package.json index 5da4bbb1..b0fb42e6 100644 --- a/examples/nodejs-ext/yarn-demo/package.json +++ b/examples/nodejs-ext/yarn-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" @@ -27,6 +25,7 @@ "run-script-os": "^1.1.6", "typescript": "^5.5.3", "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" + "vite": "^6.3.4" } } + diff --git a/examples/nodejs-ext/yarn-demo/yarn.lock b/examples/nodejs-ext/yarn-demo/yarn.lock index b1a334d0..9151a338 100644 --- a/examples/nodejs-ext/yarn-demo/yarn.lock +++ b/examples/nodejs-ext/yarn-demo/yarn.lock @@ -453,100 +453,105 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@rollup/rollup-android-arm-eabi@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz#e1d7700735f7e8de561ef7d1fa0362082a180c43" - integrity sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ== - -"@rollup/rollup-android-arm64@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz#fa6cdfb1fc9e2c8e227a7f35d524d8f7f90cf4db" - integrity sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA== - -"@rollup/rollup-darwin-arm64@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz#6da5a1ddc4f11d4a7ae85ab443824cb6bf614e30" - integrity sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q== - -"@rollup/rollup-darwin-x64@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz#25b74ce2d8d3f9ea8e119b01384d44a1c0a0d3ae" - integrity sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q== - -"@rollup/rollup-freebsd-arm64@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz#be3d39e3441df5d6e187c83d158c60656c82e203" - integrity sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ== - -"@rollup/rollup-freebsd-x64@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz#cd932d3ec679711efd65ca25821fb318e25b7ce4" - integrity sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw== - -"@rollup/rollup-linux-arm-gnueabihf@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz#d300b74c6f805474225632f185daaeae760ac2bb" - integrity sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg== - -"@rollup/rollup-linux-arm-musleabihf@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz#2caac622380f314c41934ed1e68ceaf6cc380cc3" - integrity sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A== - -"@rollup/rollup-linux-arm64-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz#1ec841650b038cc15c194c26326483fd7ebff3e3" - integrity sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A== - -"@rollup/rollup-linux-arm64-musl@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz#2fc70a446d986e27f6101ea74e81746987f69150" - integrity sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg== - -"@rollup/rollup-linux-loongarch64-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz#561bd045cd9ce9e08c95f42e7a8688af8c93d764" - integrity sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g== - -"@rollup/rollup-linux-powerpc64le-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz#45d849a0b33813f33fe5eba9f99e0ff15ab5caad" - integrity sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA== - -"@rollup/rollup-linux-riscv64-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz#78dde3e6fcf5b5733a97d0a67482d768aa1e83a5" - integrity sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g== - -"@rollup/rollup-linux-s390x-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz#2e34835020f9e03dfb411473a5c2a0e8a9c5037b" - integrity sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw== - -"@rollup/rollup-linux-x64-gnu@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz#4f9774beddc6f4274df57ac99862eb23040de461" - integrity sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA== - -"@rollup/rollup-linux-x64-musl@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz#dfcff2c1aed518b3d23ccffb49afb349d74fb608" - integrity sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg== - -"@rollup/rollup-win32-arm64-msvc@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz#b0b37e2d77041e3aa772f519291309abf4c03a84" - integrity sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg== - -"@rollup/rollup-win32-ia32-msvc@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz#5b5a40e44a743ddc0e06b8e1b3982f856dc9ce0a" - integrity sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw== - -"@rollup/rollup-win32-x64-msvc@4.35.0": - version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz#05f25dbc9981bee1ae6e713daab10397044a46ca" - integrity sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw== +"@rollup/rollup-android-arm-eabi@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz#e1562d360bca73c7bef6feef86098de3a2f1d442" + integrity sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw== + +"@rollup/rollup-android-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz#37ba63940211673e15dcc5f469a78e34276dbca7" + integrity sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw== + +"@rollup/rollup-darwin-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz#58b1eb86d997d71dabc5b78903233a3c27438ca0" + integrity sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA== + +"@rollup/rollup-darwin-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz#5e22dab3232b1e575d930ce891abb18fe19c58c9" + integrity sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw== + +"@rollup/rollup-freebsd-arm64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz#04c892d9ff864d66e31419634726ab0bebb33707" + integrity sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw== + +"@rollup/rollup-freebsd-x64@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz#f4b1e091f7cf5afc9e3a029d70128ad56409ecfb" + integrity sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q== + +"@rollup/rollup-linux-arm-gnueabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz#c8814bb5ce047a81b1fe4a33628dfd4ac52bd864" + integrity sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg== + +"@rollup/rollup-linux-arm-musleabihf@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz#5b4e7bd83cbebbf5ffe958802dcfd4ee34bf73a3" + integrity sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg== + +"@rollup/rollup-linux-arm64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz#141c848e53cee011e82a11777b8a51f1b3e8d77c" + integrity sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg== + +"@rollup/rollup-linux-arm64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz#22ebeaf2fa301aa4aa6c84b760e6cd1d1ac7eb1e" + integrity sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ== + +"@rollup/rollup-linux-loongarch64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz#20b77dc78e622f5814ff8e90c14c938ceb8043bc" + integrity sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ== + +"@rollup/rollup-linux-powerpc64le-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz#2c90f99c987ef1198d4f8d15d754c286e1f07b13" + integrity sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg== + +"@rollup/rollup-linux-riscv64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz#9336fd5e47d7f4760d02aa85f76976176eef53ca" + integrity sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ== + +"@rollup/rollup-linux-riscv64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz#d75b4d54d46439bb5c6c13762788f57e798f5670" + integrity sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA== + +"@rollup/rollup-linux-s390x-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz#e9f09b802f1291839247399028beaef9ce034c81" + integrity sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg== + +"@rollup/rollup-linux-x64-gnu@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz#0413169dc00470667dea8575c1129d4e7a73eb29" + integrity sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ== + +"@rollup/rollup-linux-x64-musl@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz#c76fd593323c60ea219439a00da6c6d33ffd0ea6" + integrity sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ== + +"@rollup/rollup-win32-arm64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz#c7724c386eed0bda5ae7143e4081c1910cab349b" + integrity sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg== + +"@rollup/rollup-win32-ia32-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz#7749e1b65cb64fe6d41ad1ad9e970a0ccc8ac350" + integrity sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA== + +"@rollup/rollup-win32-x64-msvc@4.40.1": + version "4.40.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz#8078b71fe0d5825dcbf83d52a7dc858b39da165c" + integrity sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA== "@types/babel__core@^7.20.5": version "7.20.5" @@ -581,7 +586,12 @@ dependencies: "@babel/types" "^7.20.7" -"@types/estree@1.0.6", "@types/estree@^1.0.6": +"@types/estree@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -1018,6 +1028,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== + file-entry-cache@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" @@ -1325,6 +1340,11 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + postcss@^8.5.3: version "8.5.3" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" @@ -1379,32 +1399,33 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rollup@^4.30.1: - version "4.35.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.35.0.tgz#76c95dba17a579df4c00c3955aed32aa5d4dc66d" - integrity sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg== +rollup@^4.34.9: + version "4.40.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.40.1.tgz#03d6c53ebb6a9c2c060ae686a61e72a2472b366f" + integrity sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw== dependencies: - "@types/estree" "1.0.6" + "@types/estree" "1.0.7" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.35.0" - "@rollup/rollup-android-arm64" "4.35.0" - "@rollup/rollup-darwin-arm64" "4.35.0" - "@rollup/rollup-darwin-x64" "4.35.0" - "@rollup/rollup-freebsd-arm64" "4.35.0" - "@rollup/rollup-freebsd-x64" "4.35.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.35.0" - "@rollup/rollup-linux-arm-musleabihf" "4.35.0" - "@rollup/rollup-linux-arm64-gnu" "4.35.0" - "@rollup/rollup-linux-arm64-musl" "4.35.0" - "@rollup/rollup-linux-loongarch64-gnu" "4.35.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.35.0" - "@rollup/rollup-linux-riscv64-gnu" "4.35.0" - "@rollup/rollup-linux-s390x-gnu" "4.35.0" - "@rollup/rollup-linux-x64-gnu" "4.35.0" - "@rollup/rollup-linux-x64-musl" "4.35.0" - "@rollup/rollup-win32-arm64-msvc" "4.35.0" - "@rollup/rollup-win32-ia32-msvc" "4.35.0" - "@rollup/rollup-win32-x64-msvc" "4.35.0" + "@rollup/rollup-android-arm-eabi" "4.40.1" + "@rollup/rollup-android-arm64" "4.40.1" + "@rollup/rollup-darwin-arm64" "4.40.1" + "@rollup/rollup-darwin-x64" "4.40.1" + "@rollup/rollup-freebsd-arm64" "4.40.1" + "@rollup/rollup-freebsd-x64" "4.40.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.40.1" + "@rollup/rollup-linux-arm-musleabihf" "4.40.1" + "@rollup/rollup-linux-arm64-gnu" "4.40.1" + "@rollup/rollup-linux-arm64-musl" "4.40.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.40.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-gnu" "4.40.1" + "@rollup/rollup-linux-riscv64-musl" "4.40.1" + "@rollup/rollup-linux-s390x-gnu" "4.40.1" + "@rollup/rollup-linux-x64-gnu" "4.40.1" + "@rollup/rollup-linux-x64-musl" "4.40.1" + "@rollup/rollup-win32-arm64-msvc" "4.40.1" + "@rollup/rollup-win32-ia32-msvc" "4.40.1" + "@rollup/rollup-win32-x64-msvc" "4.40.1" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -1465,6 +1486,14 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tinyglobby@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -1518,14 +1547,17 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -vite@^6.2.5: - version "6.2.5" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.5.tgz#d093b5fe8eb96e594761584a966ab13f24457820" - integrity sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA== +vite@^6.3.4: + version "6.3.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.3.4.tgz#d441a72c7cd9a93b719bb851250a4e6c119c9cff" + integrity sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw== dependencies: esbuild "^0.25.0" + fdir "^6.4.4" + picomatch "^4.0.2" postcss "^8.5.3" - rollup "^4.30.1" + rollup "^4.34.9" + tinyglobby "^0.2.13" optionalDependencies: fsevents "~2.3.3" diff --git a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Components/Pages/Home.razor b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Components/Pages/Home.razor index 8df34379..3abe4b3f 100644 --- a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Components/Pages/Home.razor +++ b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Components/Pages/Home.razor @@ -14,13 +14,13 @@
diff --git a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Program.cs b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Program.cs index 33e3f3d4..1f56018a 100644 --- a/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Program.cs +++ b/examples/ollama/CommunityToolkit.Aspire.Hosting.Ollama.Web/Program.cs @@ -12,8 +12,8 @@ builder.Services.AddOutputCache(); -builder.AddOllamaApiClient(ServiceKeys.Phi3).AddChatClient(); -builder.AddOllamaApiClient(ServiceKeys.Llama).AddChatClient(); +builder.AddKeyedOllamaApiClient(ServiceKeys.Phi3).AddKeyedChatClient(); +builder.AddKeyedOllamaApiClient(ServiceKeys.Llama).AddKeyedChatClient(); var app = builder.Build(); diff --git a/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/Program.cs b/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/Program.cs index ffe82f81..b52737b2 100644 --- a/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/Program.cs +++ b/examples/postgres-ext/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.AppHost/Program.cs @@ -1,12 +1,14 @@ var builder = DistributedApplication.CreateBuilder(args); var postgres1 = builder.AddPostgres("postgres1") - .WithDbGate(c => c.WithHostPort(8068)); + .WithDbGate(c => c.WithHostPort(8068)) + .WithAdminer(c => c.WithHostPort(8069)); postgres1.AddDatabase("db1"); postgres1.AddDatabase("db2"); var postgres2 = builder.AddPostgres("postgres2") - .WithDbGate(c => c.WithHostPort(8068)); + .WithDbGate(c => c.WithHostPort(8068)) + .WithAdminer(c => c.WithHostPort(8069)); postgres2.AddDatabase("db3"); postgres2.AddDatabase("db4"); diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj new file mode 100644 index 00000000..63aed919 --- /dev/null +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/CommunityToolkit.Aspire.PowerShell.AppHost.csproj @@ -0,0 +1,24 @@ + + + + + + Exe + net8.0 + enable + enable + true + bc193f31-c9f7-4e3d-b70a-0dc39ec3047f + + + + + + + + + + + + + diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Program.cs b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Program.cs new file mode 100644 index 00000000..57f4bb34 --- /dev/null +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Program.cs @@ -0,0 +1,48 @@ +using CommunityToolkit.Aspire.Hosting.PowerShell; + +var builder = DistributedApplication.CreateBuilder(args); + +var storage = builder.AddAzureStorage("storage").RunAsEmulator(); +var blob = storage.AddBlobs("myblob"); + +var ps = builder.AddPowerShell("ps") + .WithReference(blob) + .WaitFor(storage); + +// uploads the script in scripts/ +var script1 = ps.AddScript("script1", """ + param($name) + + write-information "Hello, $name" + + # uncommenting this will hang the script if you don't attach the pwsh debugger + # wait-debugger + + write-information "`$myblob is $myblob" + + # only run this if Azure CLI is installed + if ((gcm az -ErrorAction SilentlyContinue) -ne $null) { + + az storage container create --connection-string $myblob -n demo + az storage blob upload --connection-string $myblob -c demo --file ./scripts/script.ps1 + write-information "Blob uploaded" + + } else { + + write-warning "Azure CLI not found, skipping blob upload" + + } + write-information $pwd + + +""").WithArgs("world"); + +// outputs "the sum of 2 and 3 is 5" +var script2 = ps.AddScript("script2", """ + & ./scripts/script.ps1 @args + """) + .WithArgs(2, 3) + .WaitForCompletion(script1); + +builder.Build().Run(); + diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Properties/launchSettings.json b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..80e6457e --- /dev/null +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17118;http://localhost:15215", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21165", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22038" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15215", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19175", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20201" + } + } + } +} diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Scripts/script.ps1 b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Scripts/script.ps1 new file mode 100644 index 00000000..4749399b --- /dev/null +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/Scripts/script.ps1 @@ -0,0 +1,3 @@ +param($a, $b) + +Write-Information "The sum of $a and $b is: $($a + $b)" \ No newline at end of file diff --git a/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/appsettings.json b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/appsettings.json new file mode 100644 index 00000000..31c092aa --- /dev/null +++ b/examples/powershell/CommunityToolkit.Aspire.PowerShell.AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/examples/rust/actix_api/Cargo.lock b/examples/rust/actix_api/Cargo.lock index d59543f7..9eddb52a 100644 --- a/examples/rust/actix_api/Cargo.lock +++ b/examples/rust/actix_api/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix-codec" @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.1" +version = "1.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "68722da18b0fc4a05fdc1120b302b82051265792a1e1b399086e9b204b10ad3d" dependencies = [ "backtrace", "bytes", diff --git a/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/Program.cs b/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/Program.cs index 754f4403..68d637bf 100644 --- a/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/Program.cs +++ b/examples/sql-database-projects/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.AppHost/Program.cs @@ -21,4 +21,8 @@ builder.AddSqlProject("existing-db") .WithReference(connection); +var delayedProject = builder.AddSqlProject("sdk-project-delayed") + .WithReference(database) + .WithExplicitStart(); + builder.Build().Run(); diff --git a/examples/sql-database-projects/SdkProject/Database.publish.xml b/examples/sql-database-projects/SdkProject/Database.publish.xml new file mode 100644 index 00000000..ae6f0f18 --- /dev/null +++ b/examples/sql-database-projects/SdkProject/Database.publish.xml @@ -0,0 +1,10 @@ + + + + False + Database + Database.sql + True + 1 + + \ No newline at end of file diff --git a/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/Program.cs b/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/Program.cs index c2f41067..eb697ec1 100644 --- a/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/Program.cs +++ b/examples/sqlserver-ext/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.AppHost/Program.cs @@ -1,12 +1,14 @@ var builder = DistributedApplication.CreateBuilder(args); var sqlserver1 = builder.AddSqlServer("sqlserver1") - .WithDbGate(c => c.WithHostPort(8068)); + .WithDbGate(c => c.WithHostPort(8068)) + .WithAdminer(c => c.WithHostPort(8069)); sqlserver1.AddDatabase("db1"); sqlserver1.AddDatabase("db2"); var sqlserver2 = builder.AddSqlServer("sqlserver2") - .WithDbGate(); + .WithDbGate() + .WithAdminer(); sqlserver2.AddDatabase("db3"); sqlserver2.AddDatabase("db4"); diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/CommunityToolkit.Aspire.StaticWebApps.ApiApp.csproj b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/CommunityToolkit.Aspire.StaticWebApps.ApiApp.csproj deleted file mode 100644 index 8af59439..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/CommunityToolkit.Aspire.StaticWebApps.ApiApp.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - enable - enable - - - diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Program.cs b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Program.cs deleted file mode 100644 index fca4a44e..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -var builder = WebApplication.CreateBuilder(args); - -builder.AddServiceDefaults(); - -var app = builder.Build(); - -string[] summaries = -[ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -]; - -app.MapGet("/api/weather", () => Enumerable.Range(0, 6).Select(index => new WeatherForecast( - DateTime.Now.AddDays(index), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] -))); - -app.MapDefaultEndpoints(); - -app.Run(); - -record WeatherForecast(DateTime Date, int TemperatureC, string Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Properties/launchSettings.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Properties/launchSettings.json deleted file mode 100644 index 012b2e22..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.ApiApp/Properties/launchSettings.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:28727", - "sslPort": 44394 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5297", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7019;http://localhost:5297", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/CommunityToolkit.Aspire.StaticWebApps.AppHost.csproj b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/CommunityToolkit.Aspire.StaticWebApps.AppHost.csproj deleted file mode 100644 index 497c9a64..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/CommunityToolkit.Aspire.StaticWebApps.AppHost.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Exe - true - 217620e8-b99b-48de-a85a-cb33d49baa25 - - - - - - - - - - - - - diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Program.cs b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Program.cs deleted file mode 100644 index 592bf4df..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.AppHost/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -var builder = DistributedApplication.CreateBuilder(args); - -var api = builder.AddProject("api") - .WithHttpHealthCheck("/health"); - -var web = builder - .AddNpmApp("web", Path.Combine(builder.AppHostDirectory, "..", "CommunityToolkit.Aspire.StaticWebApps.WebApp"), "dev") - .WithHttpEndpoint(env: "PORT") - .WithHttpHealthCheck("/"); - -_ = builder - .AddSwaEmulator("swa") - .WithAppResource(web) - .WithApiResource(api); - -builder.Build().Run(); diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/.gitignore b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/README.md b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/README.md deleted file mode 100644 index 74872fd4..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: - -- Configure the top-level `parserOptions` property like this: - -```js -export default tseslint.config({ - languageOptions: { - // other options... - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - }, -}) -``` - -- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` -- Optionally add `...tseslint.configs.stylisticTypeChecked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: - -```js -// eslint.config.js -import react from 'eslint-plugin-react' - -export default tseslint.config({ - // Set the react version - settings: { react: { version: '18.3' } }, - plugins: { - // Add the react plugin - react, - }, - rules: { - // other rules... - // Enable its recommended rules - ...react.configs.recommended.rules, - ...react.configs['jsx-runtime'].rules, - }, -}) -``` diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/eslint.config.js b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/eslint.config.js deleted file mode 100644 index 092408a9..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/eslint.config.js +++ /dev/null @@ -1,28 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' - -export default tseslint.config( - { ignores: ['dist'] }, - { - extends: [js.configs.recommended, ...tseslint.configs.recommended], - files: ['**/*.{ts,tsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...reactHooks.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -) diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/index.html b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/index.html deleted file mode 100644 index e4b78eae..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package-lock.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package-lock.json deleted file mode 100644 index 7409ebfd..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package-lock.json +++ /dev/null @@ -1,3313 +0,0 @@ -{ - "name": "communitytoolkit-aspire-staticwebapps-webapp", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "communitytoolkit-aspire-staticwebapps-webapp", - "version": "0.0.0", - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1", - "run-script-os": "^1.1.6" - }, - "devDependencies": { - "@eslint/js": "^9.9.0", - "@types/node": "^22.4.1", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", - "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.26.10", - "@babel/types": "^7.26.10", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", - "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", - "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.26.10" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", - "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.10", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", - "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", - "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", - "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", - "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", - "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", - "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", - "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", - "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", - "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", - "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", - "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", - "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", - "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", - "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", - "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", - "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", - "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", - "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", - "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", - "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", - "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.4.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", - "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.2.0.tgz", - "integrity": "sha512-02tJIs655em7fvt9gps/+4k4OsKULYGtLBPJfOsmOq1+3cdClYiF0+d6mHu6qDnTcg88wJBkcPLpQhq7FyDz0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/type-utils": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.2.0.tgz", - "integrity": "sha512-j3Di+o0lHgPrb7FxL3fdEy6LJ/j2NE8u+AP/5cQ9SKb+JLH6V6UHDqJ+e0hXBkHP1wn1YDFjYCS9LBQsZDlDEg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.2.0.tgz", - "integrity": "sha512-OFn80B38yD6WwpoHU2Tz/fTz7CgFqInllBoC3WP+/jLbTb4gGPTy9HBSTsbDWkMdN55XlVU0mMDYAtgvlUspGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.2.0.tgz", - "integrity": "sha512-g1CfXGFMQdT5S+0PSO0fvGXUaiSkl73U1n9LTK5aRAFnPlJ8dLKkXr4AaLFvPedW8lVDoMgLLE3JN98ZZfsj0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.2.0.tgz", - "integrity": "sha512-6a9QSK396YqmiBKPkJtxsgZZZVjYQ6wQ/TlI0C65z7vInaETuC6HAHD98AGLC8DyIPqHytvNuS8bBVvNLKyqvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.2.0.tgz", - "integrity": "sha512-kiG4EDUT4dImplOsbh47B1QnNmXSoUqOjWDvCJw/o8LgfD0yr7k2uy54D5Wm0j4t71Ge1NkynGhpWdS0dEIAUA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.2.0.tgz", - "integrity": "sha512-O46eaYKDlV3TvAVDNcoDzd5N550ckSe8G4phko++OCSC1dYIb9LTc3HDGYdWqWIAT5qDUKphO6sd9RrpIJJPfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.2.0.tgz", - "integrity": "sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.2.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", - "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.115", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz", - "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==", - "dev": true, - "license": "ISC" - }, - "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", - "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0-rc-fb9a90fa48-20240614", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", - "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.9.tgz", - "integrity": "sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", - "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.35.0", - "@rollup/rollup-android-arm64": "4.35.0", - "@rollup/rollup-darwin-arm64": "4.35.0", - "@rollup/rollup-darwin-x64": "4.35.0", - "@rollup/rollup-freebsd-arm64": "4.35.0", - "@rollup/rollup-freebsd-x64": "4.35.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", - "@rollup/rollup-linux-arm-musleabihf": "4.35.0", - "@rollup/rollup-linux-arm64-gnu": "4.35.0", - "@rollup/rollup-linux-arm64-musl": "4.35.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", - "@rollup/rollup-linux-riscv64-gnu": "4.35.0", - "@rollup/rollup-linux-s390x-gnu": "4.35.0", - "@rollup/rollup-linux-x64-gnu": "4.35.0", - "@rollup/rollup-linux-x64-musl": "4.35.0", - "@rollup/rollup-win32-arm64-msvc": "4.35.0", - "@rollup/rollup-win32-ia32-msvc": "4.35.0", - "@rollup/rollup-win32-x64-msvc": "4.35.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-script-os": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", - "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", - "license": "MIT", - "bin": { - "run-os": "index.js", - "run-script-os": "index.js" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.2.0.tgz", - "integrity": "sha512-DmnqaPcML0xYwUzgNbM1XaKXpEb7BShYf2P1tkUmmcl8hyeG7Pj08Er7R9bNy6AufabywzJcOybQAtnD/c9DGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.2.0", - "@typescript-eslint/parser": "8.2.0", - "@typescript-eslint/utils": "8.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package.json deleted file mode 100644 index 1d154854..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "communitytoolkit-aspire-staticwebapps-webapp", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", - "build": "tsc -b && vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1", - "run-script-os": "^1.1.6" - }, - "devDependencies": { - "@eslint/js": "^9.9.0", - "@types/node": "^22.4.1", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.4", - "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^6.2.5" - } -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.css b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.css deleted file mode 100644 index 2c137d60..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.css +++ /dev/null @@ -1,31 +0,0 @@ -html, -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -a, -.btn-link { - color: #006bb7; -} - -.btn-primary { - color: #fff; - background-color: #1b6ec2; - border-color: #1861ac; -} - -.btn:focus, -.btn:active:focus, -.btn-link.nav-link:focus, -.form-control:focus, -.form-check-input:focus { - box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; -} - -.content { - padding-top: 1.1rem; -} - -h1:focus { - outline: none; -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.tsx b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.tsx deleted file mode 100644 index e7081ff0..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/App.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { useState, useEffect } from "react"; -import "./App.css"; - -type Forecast = { - date: string; - temperatureC: number; - temperatureF: number; - summary: string; -}; - -function App() { - const [forecasts, setForecasts] = useState([]); - - useEffect(() => { - fetch("/api/weather") - .then((response) => response.json()) - .then((data) => setForecasts(data)); - }, []); - - return ( - <> - {forecasts.length === 0 &&
Loading...
} - {forecasts.length > 0 && ( - - - - - - - - - - - {forecasts.map((f) => ( - - - - - - - ))} - -
DateTemp. (C)Temp. (F)Summary
{f.date}{f.temperatureC}{f.temperatureF}{f.summary}
- )} - - ); -} - -export default App; diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/bootstrap.css b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/bootstrap.css deleted file mode 100644 index 02ae65b5..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/bootstrap.css +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v5.1.0 (https://getbootstrap.com/) - * Copyright 2011-2021 The Bootstrap Authors - * Copyright 2011-2021 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-rgb:33,37,41;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x) * -.5);margin-left:calc(var(--bs-gutter-x) * -.5)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/main.tsx b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/main.tsx deleted file mode 100644 index f1bd6ce9..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/main.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; -import App from "./App.tsx"; -import "./bootstrap.css"; - -createRoot(document.getElementById("root")!).render( - -
-
- -
- - -
- -
-
-
-
-); diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/vite-env.d.ts b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.app.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.app.json deleted file mode 100644 index f0a23505..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.app.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.json deleted file mode 100644 index 1ffef600..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.node.json b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.node.json deleted file mode 100644 index 0d3d7144..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/tsconfig.node.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2023"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/vite.config.ts b/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/vite.config.ts deleted file mode 100644 index 9cda1e46..00000000 --- a/examples/swa/CommunityToolkit.Aspire.StaticWebApps.WebApp/vite.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - define: { - "process.env": process.env, - }, -}); diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerBuilderExtensions.cs new file mode 100644 index 00000000..0ce1636a --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerBuilderExtensions.cs @@ -0,0 +1,80 @@ +using Aspire.Hosting.ApplicationModel; +using System.Reflection; + +namespace Aspire.Hosting; + +/// +/// Provides extension methods for Adminer resources to an . +/// +public static class AdminerBuilderExtensions +{ + /// + /// Configures the host port that the Adminer resource is exposed on instead of using randomly assigned port. + /// + /// The resource builder for Adminer. + /// The port to bind on the host. If is used random port will be assigned. + /// The resource builder for Adminer. + public static IResourceBuilder WithHostPort(this IResourceBuilder builder, int? port) + { + ArgumentNullException.ThrowIfNull(builder); + + return builder.WithEndpoint(AdminerContainerResource.PrimaryEndpointName, endpoint => + { + endpoint.Port = port; + }); + } + + /// + /// Adds a Adminer container resource to the application. + /// + /// The resource builder. + /// The name of the resource. This name will be used as the connection string name when referenced in a dependency. + /// The host port to bind the underlying container to. + /// + /// Multiple calls will return the same resource builder instance. + /// + /// A reference to the . + public static IResourceBuilder AddAdminer(this IDistributedApplicationBuilder builder, [ResourceName] string name, int? port = null) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(name); + + if (builder.Resources.OfType().SingleOrDefault() is { } existingAdminerResource) + { + var builderForExistingResource = builder.CreateResourceBuilder(existingAdminerResource); + return builderForExistingResource; + } + else + { + var adminerContainer = new AdminerContainerResource(name); + var adminerContainerBuilder = builder.AddResource(adminerContainer) + .WithImage(AdminerContainerImageTags.Image, AdminerContainerImageTags.Tag) + .WithImageRegistry(AdminerContainerImageTags.Registry) + .WithHttpEndpoint(targetPort: 8080, port: port, name: AdminerContainerResource.PrimaryEndpointName) + .WithUrlForEndpoint(AdminerContainerResource.PrimaryEndpointName, e => e.DisplayText = "Adminer Dashboard") + .ExcludeFromManifest(); + + adminerContainerBuilder.WithContainerFiles( + destinationPath: "/var/www/html/plugins-enabled", + callback: async (context, ct) => + { + var assembly = Assembly.GetExecutingAssembly(); + using var stream = assembly.GetManifestResourceStream("CommunityToolkit.Aspire.Hosting.Adminer.login-servers.php") ?? throw new InvalidOperationException("Unable to load embedded resource 'login-servers.php'."); + + using var reader = new StreamReader(stream); + var contents = await reader.ReadToEndAsync(ct); + + return [ + new ContainerFile + { + Contents = contents, + Name = "login-servers.php", + } + ]; + } + ); + + return adminerContainerBuilder; + } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerImageTags.cs b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerImageTags.cs new file mode 100644 index 00000000..4bd37000 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerImageTags.cs @@ -0,0 +1,11 @@ + +internal static class AdminerContainerImageTags +{ + /// docker.io + public const string Registry = "docker.io"; + /// library/adminer + public const string Image = "library/adminer"; + /// 5.1.0 + public const string Tag = "5.1.0"; +} + diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerResource.cs b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerResource.cs new file mode 100644 index 00000000..ea6f0e6b --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/AdminerContainerResource.cs @@ -0,0 +1,17 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Represents a container resource for Adminer. +/// +/// The name of the container resource. +public sealed class AdminerContainerResource(string name) : ContainerResource(name) +{ + internal const string PrimaryEndpointName = "http"; + + private EndpointReference? _primaryEndpoint; + + /// + /// Gets the primary endpoint for the Adminer. + /// + public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, PrimaryEndpointName); +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/CommunityToolkit.Aspire.Hosting.Adminer.csproj b/src/CommunityToolkit.Aspire.Hosting.Adminer/CommunityToolkit.Aspire.Hosting.Adminer.csproj new file mode 100644 index 00000000..39de4f7f --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/CommunityToolkit.Aspire.Hosting.Adminer.csproj @@ -0,0 +1,19 @@ + + + + hosting adminer + A .NET Aspire integration for adminer hosting. + + + + + + + + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/README.md b/src/CommunityToolkit.Aspire.Hosting.Adminer/README.md new file mode 100644 index 00000000..7b5d65ce --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/README.md @@ -0,0 +1 @@ +This package is designed to be used internally by the community toolkit and is not intended to be used directly in the application code. diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/api/CommunityToolkit.Aspire.Hosting.Adminer.cs b/src/CommunityToolkit.Aspire.Hosting.Adminer/api/CommunityToolkit.Aspire.Hosting.Adminer.cs new file mode 100644 index 00000000..a39ffd52 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/api/CommunityToolkit.Aspire.Hosting.Adminer.cs @@ -0,0 +1,27 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace Aspire.Hosting +{ + public static partial class AdminerBuilderExtensions + { + public static ApplicationModel.IResourceBuilder AddAdminer(this IDistributedApplicationBuilder builder, string name, int? port = null) { throw null; } + + public static ApplicationModel.IResourceBuilder WithHostPort(this ApplicationModel.IResourceBuilder builder, int? port) { throw null; } + } +} + +namespace Aspire.Hosting.ApplicationModel +{ + public sealed partial class AdminerContainerResource : ContainerResource + { + public AdminerContainerResource(string name) : base(default!, default) { } + + public EndpointReference PrimaryEndpoint { get { throw null; } } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Adminer/login-servers.php b/src/CommunityToolkit.Aspire.Hosting.Adminer/login-servers.php new file mode 100644 index 00000000..08ef2535 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Adminer/login-servers.php @@ -0,0 +1,53 @@ +servers = array(); + if ($_ENV['ADMINER_SERVERS']) { + $this->servers = json_decode($_ENV['ADMINER_SERVERS'], true); + } + + if ($_POST["auth"]["custom_server"]) { + $key = $_POST["auth"]["custom_server"]; + $_POST["auth"]["driver"] = $this->servers[$key]["driver"]; + $_POST["auth"]["server"] = $this->servers[$key]["server"]; + $_POST["auth"]["username"] = $this->servers[$key]["username"]; + $_POST["auth"]["password"] = $this->servers[$key]["password"]; + $_POST["auth"]["db"] = $this->servers[$key]["db"]; + } + } + + function loginFormField($name, $heading, $value) { + if ($name == 'driver') { + return 'Driver' . $value; + } elseif ($name == 'server') { + return 'Host' . $value; + } elseif ($name == 'db' && $_ENV['ADMINER_SERVERS'] != '') { + $out = $heading . $value; + $out .= 'or'; + $out .= 'Server'; + return $out; + } + } +} + +return new AdminerLoginServers(); diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.csproj b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.csproj deleted file mode 100644 index b4605aa5..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - azure staticwebapps hosting - A hosting package that wraps endpoints with the Azure Static Web Apps emulator. - - - - - - - diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/README.md b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/README.md deleted file mode 100644 index cde33545..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps library - -Provides extensions methods and resource definitions for the .NET Aspire AppHost to support running Azure Static Web Apps locally using the emulator using the [Azure Static Web App CLI](https://learn.microsoft.com/azure/static-web-apps/local-development). - -## Getting Started - -### Install the package - -In your AppHost project, install the package using the following command: - -```dotnetcli -dotnet add package CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps -``` - -### Example usage - -Then, in the _Program.cs_ file of `AppHost`, define a frontend and backend resource (optional), then call `AddSwaEmulator`: - -```csharp -var builder = DistributedApplication.CreateBuilder(args); - -// Define the API resource -var api = builder.AddProject("api"); - -// Define the frontend resource -var web = builder - .AddNpmApp("web", Path.Combine("..", "CommunityToolkit.Aspire.StaticWebApps.WebApp"), "dev") - .WithHttpEndpoint(env: "PORT") - .WithExternalHttpEndpoints(); - -// Create a SWA emulator with the frontend and API resources -_ = builder - .AddSwaEmulator("swa") - .WithAppResource(web) - .WithApiResource(api); - -builder.Build().Run(); -``` - -## Additional Information - -https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-azure-static-web-apps - -## Feedback & contributing - -https://github.com/CommunityToolkit/Aspire diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaApiEndpointAnnotation.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaApiEndpointAnnotation.cs deleted file mode 100644 index 9b282d45..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaApiEndpointAnnotation.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Aspire.Hosting.ApplicationModel; - -/// -/// Represents an annotation for an API endpoint in a Static Web App. -/// -/// The resource builder for resources with endpoints. -public class SwaApiEndpointAnnotation(IResourceBuilder resource) : IResourceAnnotation -{ - /// - /// Gets the endpoint URL for the resource. - /// - public string Endpoint => resource.Resource.GetEndpoint("http").Url; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppEndpointAnnotation.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppEndpointAnnotation.cs deleted file mode 100644 index 43401305..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppEndpointAnnotation.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Aspire.Hosting.ApplicationModel; - -/// -/// Represents an annotation for an endpoint in a Static Web App. -/// -/// -/// Initializes a new instance of the class. -/// -/// The resource builder for the endpoint. -public class SwaAppEndpointAnnotation(IResourceBuilder resource) : IResourceAnnotation -{ - /// - /// Gets the HTTP endpoint URL. - /// - public string Endpoint => resource.Resource.GetEndpoint("http").Url; -} diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppHostingExtension.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppHostingExtension.cs deleted file mode 100644 index f0524739..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaAppHostingExtension.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Aspire.Hosting.ApplicationModel; - -namespace Aspire.Hosting; - -/// -/// Provides extension methods for adding and configuring Static Web Apps emulator. -/// -public static class SwaAppHostingExtension -{ - /// - /// Adds a Static Web Apps emulator to the application. - /// - /// The to add the resource to. - /// The name of the resource. - /// A reference to the . - /// This resource will not be included in the published manifest. - public static IResourceBuilder AddSwaEmulator(this IDistributedApplicationBuilder builder, [ResourceName] string name) => - builder.AddSwaEmulator(name, new SwaResourceOptions()); - - /// - /// Adds a Static Web Apps emulator to the application. - /// - /// The to add the resource to. - /// The name of the resource. - /// The to configure the SWA CLI." - /// A reference to the . - /// This resource will not be included in the published manifest. - public static IResourceBuilder AddSwaEmulator(this IDistributedApplicationBuilder builder, [ResourceName] string name, SwaResourceOptions options) - { - var resource = new SwaResource(name, Environment.CurrentDirectory); - return builder.AddResource(resource) - .WithHttpEndpoint(isProxied: false, port: options.Port) - .WithArgs(ctx => - { - ctx.Args.Add("start"); - - if (resource.TryGetAnnotationsOfType(out var appResource)) - { - ctx.Args.Add("--app-devserver-url"); - ctx.Args.Add(appResource.First().Endpoint); - } - - if (resource.TryGetAnnotationsOfType(out var apiResource)) - { - ctx.Args.Add("--api-devserver-url"); - ctx.Args.Add(apiResource.First().Endpoint); - } - - ctx.Args.Add("--port"); - ctx.Args.Add(options.Port.ToString()); - - ctx.Args.Add("--devserver-timeout"); - ctx.Args.Add(options.DevServerTimeout.ToString()); - }) - .WithHttpHealthCheck("/.auth/me") - .ExcludeFromManifest(); - } - - /// - /// Registers the application resource with the Static Web Apps emulator. - /// - /// The to add the resource to. - /// The existing to use as the --app-devserver-url argument. - /// A reference to the . - public static IResourceBuilder WithAppResource(this IResourceBuilder builder, IResourceBuilder appResource) => - builder.WithAnnotation(new(appResource), ResourceAnnotationMutationBehavior.Replace).WaitFor(appResource); - - /// - /// Registers the API resource with the Static Web Apps emulator. - /// - /// The to add the resource to. - /// The existing to use as the --api-devserver-url argument. - /// A reference to the . - public static IResourceBuilder WithApiResource(this IResourceBuilder builder, IResourceBuilder apiResource) => - builder.WithAnnotation(new(apiResource), ResourceAnnotationMutationBehavior.Replace).WaitFor(apiResource); -} diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResource.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResource.cs deleted file mode 100644 index ff0cb189..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResource.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Aspire.Hosting.ApplicationModel; - -/// -/// Represents a Static Web Apps resource. -/// -/// -/// Initializes a new instance of the class. -/// -/// The name of the resource. -/// The working directory for the resource. -public class SwaResource(string name, string workingDirectory) : ExecutableResource(name, "swa", workingDirectory) -{ -} diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResourceOptions.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResourceOptions.cs deleted file mode 100644 index e859e0bb..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/SwaResourceOptions.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Aspire.Hosting; - -/// -/// Represents the configuration options for a Static Web App resource. -/// -public class SwaResourceOptions -{ - /// - /// Gets or sets the port number on which the Static Web App will run. - /// Default value is 4280. - /// - public int Port { get; set; } = 4280; - - /// - /// Gets or sets the timeout duration (in seconds) for the development server. - /// Default value is 60 seconds. - /// - public int DevServerTimeout { get; set; } = 60; -} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/api/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.cs b/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/api/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.cs deleted file mode 100644 index 33f13782..00000000 --- a/src/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps/api/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.cs +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ -namespace Aspire.Hosting -{ - public static partial class SwaAppHostingExtension - { - public static ApplicationModel.IResourceBuilder AddSwaEmulator(this IDistributedApplicationBuilder builder, string name, SwaResourceOptions options) { throw null; } - - public static ApplicationModel.IResourceBuilder AddSwaEmulator(this IDistributedApplicationBuilder builder, string name) { throw null; } - - public static ApplicationModel.IResourceBuilder WithApiResource(this ApplicationModel.IResourceBuilder builder, ApplicationModel.IResourceBuilder apiResource) { throw null; } - - public static ApplicationModel.IResourceBuilder WithAppResource(this ApplicationModel.IResourceBuilder builder, ApplicationModel.IResourceBuilder appResource) { throw null; } - } - - public partial class SwaResourceOptions - { - public int DevServerTimeout { get { throw null; } set { } } - - public int Port { get { throw null; } set { } } - } -} - -namespace Aspire.Hosting.ApplicationModel -{ - public partial class SwaApiEndpointAnnotation : IResourceAnnotation - { - public SwaApiEndpointAnnotation(IResourceBuilder resource) { } - - public string Endpoint { get { throw null; } } - } - - public partial class SwaAppEndpointAnnotation : IResourceAnnotation - { - public SwaAppEndpointAnnotation(IResourceBuilder resource) { } - - public string Endpoint { get { throw null; } } - } - - public partial class SwaResource : ExecutableResource - { - public SwaResource(string name, string workingDirectory) : base(default!, default!, default!) { } - } -} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs index 0d330834..e2a997cc 100644 --- a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateBuilderExtensions.cs @@ -80,6 +80,7 @@ public static IResourceBuilder AddDbGate(this IDistribu .WithImage(DbGateContainerImageTags.Image, DbGateContainerImageTags.Tag) .WithImageRegistry(DbGateContainerImageTags.Registry) .WithHttpEndpoint(targetPort: 3000, port: port, name: DbGateContainerResource.PrimaryEndpointName) + .WithUrlForEndpoint(DbGateContainerResource.PrimaryEndpointName, e => e.DisplayText = "DbGate Dashboard") .ExcludeFromManifest(); return dbGateContainerBuilder; diff --git a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateContainerImageTags.cs b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateContainerImageTags.cs index e8d1e960..ab338331 100644 --- a/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateContainerImageTags.cs +++ b/src/CommunityToolkit.Aspire.Hosting.DbGate/DbGateContainerImageTags.cs @@ -1,11 +1,11 @@ internal static class DbGateContainerImageTags { - /// docker.io + /// docker.io public const string Registry = "docker.io"; - /// dbgate/dbgate + /// dbgate/dbgate public const string Image = "dbgate/dbgate"; - /// 6.1.4 + /// 6.1.4 public const string Tag = "6.1.4"; } diff --git a/src/CommunityToolkit.Aspire.Hosting.Golang/GolangAppHostingExtension.cs b/src/CommunityToolkit.Aspire.Hosting.Golang/GolangAppHostingExtension.cs index 4541f9f0..23f3b453 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Golang/GolangAppHostingExtension.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Golang/GolangAppHostingExtension.cs @@ -15,23 +15,35 @@ public static class GolangAppHostingExtension /// The name of the resource. /// The working directory to use for the command. If null, the working directory of the current process is used. /// The optinal arguments to be passed to the executable when it is started. + /// The optional build tags to be used when building the Golang application. /// A reference to the . - public static IResourceBuilder AddGolangApp(this IDistributedApplicationBuilder builder, [ResourceName] string name, string workingDirectory, string[]? args = null) + public static IResourceBuilder AddGolangApp(this IDistributedApplicationBuilder builder, [ResourceName] string name, string workingDirectory, string[]? args = null, string[]? buildTags = null) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name)); ArgumentException.ThrowIfNullOrWhiteSpace(workingDirectory, nameof(workingDirectory)); - string[] allArgs = args is { Length: > 0 } - ? ["run", ".", .. args] - : ["run", ".",]; + var allArgs = new List { "run" }; + + if (buildTags is { Length: > 0 }) + { + allArgs.Add("-tags"); + allArgs.Add(string.Join(",", buildTags)); + } + + allArgs.Add("."); + + if (args is { Length: > 0 }) + { + allArgs.AddRange(args); + } workingDirectory = Path.Combine(builder.AppHostDirectory, workingDirectory).NormalizePathForCurrentPlatform(); var resource = new GolangAppExecutableResource(name, workingDirectory); return builder.AddResource(resource) .WithGolangDefaults() - .WithArgs(allArgs); + .WithArgs(allArgs.ToArray()); } private static IResourceBuilder WithGolangDefaults( diff --git a/src/CommunityToolkit.Aspire.Hosting.Java/JavaAppHostingExtension.Executable.cs b/src/CommunityToolkit.Aspire.Hosting.Java/JavaAppHostingExtension.Executable.cs index c0e97d31..3e2c3468 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Java/JavaAppHostingExtension.Executable.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Java/JavaAppHostingExtension.Executable.cs @@ -107,16 +107,18 @@ public static IResourceBuilder WithMavenBuild( await BuildWithMaven(builder.Resource, context.ServiceProvider, context.CancellationToken, false).ConfigureAwait(false) ? new ExecuteCommandResult { Success = true } : new ExecuteCommandResult { Success = false, ErrorMessage = "Failed to build with Maven" }, - (context) => context.ResourceSnapshot.State switch + new CommandOptions() { - { Text: "Stopped" } or - { Text: "Exited" } or - { Text: "Finished" } or - { Text: "FailedToStart" } => ResourceCommandState.Enabled, - _ => ResourceCommandState.Disabled - }, - iconName: "build" - ); + IconName = "build", + UpdateState = (context) => context.ResourceSnapshot.State switch + { + { Text: "Stopped" } or + { Text: "Exited" } or + { Text: "Finished" } or + { Text: "FailedToStart" } => ResourceCommandState.Enabled, + _ => ResourceCommandState.Disabled + }, + }); return builder; diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/CommunityToolkit.Aspire.Hosting.Minio.csproj b/src/CommunityToolkit.Aspire.Hosting.Minio/CommunityToolkit.Aspire.Hosting.Minio.csproj new file mode 100644 index 00000000..a6a3109e --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/CommunityToolkit.Aspire.Hosting.Minio.csproj @@ -0,0 +1,15 @@ + + + + minio hosting cloud storage + A .NET Aspire hosting integration for MinIO + enable + enable + + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs new file mode 100644 index 00000000..0b97e8e3 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioBuilderExtensions.cs @@ -0,0 +1,174 @@ +using Aspire.Hosting.ApplicationModel; +using CommunityToolkit.Aspire.Hosting.Minio; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Aspire.Hosting; + +/// +/// Provides extension methods for adding MinIO resources to an . +/// +public static class MinioBuilderExtensions +{ + private const string RootUserEnvVarName = "MINIO_ROOT_USER"; + private const string RootPasswordEnvVarName = "MINIO_ROOT_PASSWORD"; + + /// + /// Adds a MinIO container to the application model. The default image is "minio/minio" and the tag is "latest". + /// + /// The . + /// The name of the resource. This name will be used as the connection string name when referenced in a dependency. + /// The host port for MinIO. + /// The parameter used to provide the root user name for the MinIO resource. If a default value will be used. + /// The parameter used to provide the administrator password for the MinIO resource. If a random password will be generated. + /// A reference to the . + public static IResourceBuilder AddMinioContainer( + this IDistributedApplicationBuilder builder, + [ResourceName] string name, + IResourceBuilder? rootUser = null, + IResourceBuilder? rootPassword = null, + int? port = null) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentException.ThrowIfNullOrEmpty(name); + + var rootPasswordParameter = rootPassword?.Resource ?? + ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder, $"{name}-rootPassword"); + + var rootUserParameter = rootUser?.Resource ?? new ParameterResource("user", _ => MinioContainerResource.DefaultUserName); + + var resource = new MinioContainerResource(name, rootUserParameter, rootPasswordParameter); + + const int consoleTargetPort = 9001; + var builderWithResource = builder + .AddResource(resource) + .WithImage(MinioContainerImageTags.Image, MinioContainerImageTags.Tag) + .WithImageRegistry(MinioContainerImageTags.Registry) + .WithHttpEndpoint(targetPort: 9000, port: port, name: MinioContainerResource.PrimaryEndpointName) + .WithHttpEndpoint(targetPort: consoleTargetPort, name: MinioContainerResource.ConsoleEndpointName) + .WithEnvironment(RootUserEnvVarName, resource.RootUser.Value) + .WithEnvironment(RootPasswordEnvVarName, resource.PasswordParameter.Value) + .WithArgs("server", "/data", "--console-address", $":{consoleTargetPort}"); + + var endpoint = builderWithResource.Resource.GetEndpoint(MinioContainerResource.PrimaryEndpointName); + var healthCheckKey = $"{name}_check"; + + builder.Services.AddHealthChecks() + .AddUrlGroup(options => + { + var uri = new Uri(endpoint.Url); + options.AddUri(new Uri(uri,"/minio/health/live"), setup => setup.ExpectHttpCode(200)); + options.AddUri(new Uri(uri, "/minio/health/cluster"), setup => setup.ExpectHttpCode(200)); + options.AddUri(new Uri(uri, "/minio/health/cluster/read"), setup => setup.ExpectHttpCode(200)); + }, healthCheckKey); + + builderWithResource.WithHealthCheck(healthCheckKey); + + return builderWithResource; + } + + + /// + /// Configures the user name that the MinIO resource uses. + /// + /// The resource builder. + /// The parameter used to provide the user name for the MinIO resource. + /// The . + public static IResourceBuilder WithUserName(this IResourceBuilder builder, IResourceBuilder userName) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(userName); + + builder.Resource.RootUser = userName.Resource; + return builder; + } + + /// + /// Configures the password that the MinIO resource is used. + /// + /// The resource builder. + /// The parameter used to provide the password for the MinIO resource. If , no password will be configured. + /// The . + public static IResourceBuilder WithPassword(this IResourceBuilder builder, IResourceBuilder password) + { + ArgumentNullException.ThrowIfNull(builder); + + builder.Resource.SetPassword(password.Resource); + return builder; + } + + /// + /// Configures the host port that the MinIO resource is exposed on instead of using randomly assigned port. + /// + /// The resource builder for MinIO. + /// The port to bind on the host. If is used, a random port will be assigned. + /// The resource builder for MinIO. + public static IResourceBuilder WithHostPort(this IResourceBuilder builder, int? port) + { + ArgumentNullException.ThrowIfNull(builder); + + return builder.WithEndpoint("http", endpoint => + { + endpoint.Port = port; + }); + } + + /// + /// Adds a named volume for the data folder to a MinIO container resource. + /// + /// The resource builder. + /// The name of the volume. Defaults to an auto-generated name based on the application and resource names. + /// The . + /// + /// + /// Add an MinIO container to the application model and reference it in a .NET project. Additionally, in this + /// example a data volume is added to the container to allow data to be persisted across container restarts. + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var minio = builder.AddMinio("minio") + /// .WithDataVolume(); + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(minio); + /// + /// builder.Build().Run(); + /// + /// + /// + public static IResourceBuilder WithDataVolume(this IResourceBuilder builder, string? name = null) + { + ArgumentNullException.ThrowIfNull(builder); + + return builder.WithVolume(name ?? VolumeNameGenerator.Generate(builder, "data"), "/data"); + } + + /// + /// Adds a bind mount for the data folder to a MinIO container resource. + /// + /// The resource builder. + /// The source directory on the host to mount into the container. + /// The . + /// + /// + /// Add an MinIO container to the application model and reference it in a .NET project. Additionally, in this + /// example a bind mount is added to the container to allow data to be persisted across container restarts. + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var minio = builder.AddMinio("minio") + /// .WithDataBindMount("./data/minio/data"); + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(minio); + /// + /// builder.Build().Run(); + /// + /// + /// + public static IResourceBuilder WithDataBindMount(this IResourceBuilder builder, string source) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(source); + + return builder.WithBindMount(source, "/data"); + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerImageTags.cs b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerImageTags.cs new file mode 100644 index 00000000..49801018 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerImageTags.cs @@ -0,0 +1,11 @@ +namespace CommunityToolkit.Aspire.Hosting.Minio; + +internal static class MinioContainerImageTags +{ + /// docker.io + public const string Registry = "docker.io"; + /// minio/minio + public const string Image = "minio/minio"; + /// RELEASE.2025-04-22T22-12-26Z + public const string Tag = "RELEASE.2025-04-22T22-12-26Z"; +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerResource.cs b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerResource.cs new file mode 100644 index 00000000..4a964d91 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/MinioContainerResource.cs @@ -0,0 +1,73 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// A resource that represents a MinIO storage +/// +/// The name of the resource. +/// A parameter that contains the MinIO server root username. +/// A parameter that contains the MinIO server root password. +public sealed class MinioContainerResource(string name, ParameterResource rootUser, ParameterResource passwordParameter) : ContainerResource(name), + IResourceWithConnectionString +{ + internal const string PrimaryEndpointName = "http"; + internal const string ConsoleEndpointName = "console"; + internal const string DefaultUserName = "minioadmin"; + + /// + /// The MinIO root user. + /// + public ParameterResource RootUser { get; set; } = rootUser; + + /// + /// The MinIO root password. + /// + public ParameterResource PasswordParameter { get; private set; } = passwordParameter; + + private EndpointReference? _primaryEndpoint; + + /// + /// Gets the primary endpoint for the MinIO. This endpoint is used for all API calls over HTTP. + /// + public EndpointReference PrimaryEndpoint => _primaryEndpoint ??= new(this, PrimaryEndpointName); + + /// + /// Gets the connection string expression for the Minio + /// + public ReferenceExpression ConnectionStringExpression => GetConnectionString(); + + /// + /// Gets the connection string for the MinIO server. + /// + /// A to observe while waiting for the task to complete. + /// A connection string for the MinIO server in the form "Host=host;Port=port;Username=postgres;Password=password". + public ValueTask GetConnectionStringAsync(CancellationToken cancellationToken = default) + { + if (this.TryGetLastAnnotation(out var connectionStringAnnotation)) + { + return connectionStringAnnotation.Resource.GetConnectionStringAsync(cancellationToken); + } + + return ConnectionStringExpression.GetValueAsync(cancellationToken); + } + + /// + /// Gets the connection string for the MinIO server. + /// + private ReferenceExpression GetConnectionString() + { + var builder = new ReferenceExpressionBuilder(); + + builder.Append( + $"Endpoint=http://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}"); + + builder.Append($";AccessKey={RootUser}"); + builder.Append($";SecretKey={PasswordParameter}"); + + return builder.Build(); + } + + internal void SetPassword(ParameterResource password) + { + PasswordParameter = password; + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Minio/README.md b/src/CommunityToolkit.Aspire.Hosting.Minio/README.md new file mode 100644 index 00000000..4b8f07e6 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.Minio/README.md @@ -0,0 +1,37 @@ +# CommunityToolkit.Aspire.Hosting.MinIO library + +Provides extension methods and resource definitions for the .NET Aspire AppHost to support running [MinIO](https://min.io/) containers. + +## Getting Started + +### Install the package + +In your AppHost project, install the package using the following command: + +```dotnetcli +dotnet add package CommunityToolkit.Aspire.Hosting.Minio +``` + +### Example usage + +Then, in the _Program.cs_ file of `AppHost`, add a MinIO resource and consume the connection using the following methods: + +```csharp +var builder = DistributedApplication.CreateBuilder(args); + +var minio = builder.AddMinio("minio"); + +var myService = builder.AddProject() + .WithReference(minio); + +builder.Build().Run(); +``` + +## Additional Information + +https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-minio + +## Feedback & contributing + +https://github.com/CommunityToolkit/Aspire + diff --git a/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs index 43088201..30bd7777 100644 --- a/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/MongoDBBuilderExtensions.cs @@ -42,8 +42,7 @@ public static IResourceBuilder WithDbGate(this IResourceB var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)) - .WaitFor(builder); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); configureContainer?.Invoke(dbGateBuilder); diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/CommunityToolkit.Aspire.Hosting.MySql.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/CommunityToolkit.Aspire.Hosting.MySql.Extensions.csproj new file mode 100644 index 00000000..8eebc9bc --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/CommunityToolkit.Aspire.Hosting.MySql.Extensions.csproj @@ -0,0 +1,21 @@ + + + + hosting mysql dbgate + A .NET Aspire integration for extending mysql hosting. + + + + + + + + + + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs new file mode 100644 index 00000000..f8c052cd --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/MySqlBuilderExtensions.cs @@ -0,0 +1,177 @@ +using Aspire.Hosting.ApplicationModel; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Aspire.Hosting; + +/// +/// Provides extension methods for adding MySql resources to an . +/// +public static class MySqlBuilderExtensions +{ + /// + /// Adds an administration and development platform for MySql to the application model using Adminer. + /// + /// + /// This version of the package defaults to the tag of the container image. + /// The MySql server resource builder. + /// Configuration callback for Adminer container resource. + /// The name of the container (Optional). + /// + /// Use in application host with a MySql resource + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var mysql = builder.AddMySql("mysql") + /// .WithAdminer(); + /// var db = mysql.AddDatabase("db"); + /// + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(db); + /// + /// builder.Build().Run(); + /// + /// + /// + /// A reference to the . + public static IResourceBuilder WithAdminer(this IResourceBuilder builder, Action>? configureContainer = null, string? containerName = null) + { + ArgumentNullException.ThrowIfNull(builder); + + containerName ??= $"{builder.Resource.Name}-adminer"; + var adminerBuilder = AdminerBuilderExtensions.AddAdminer(builder.ApplicationBuilder, containerName); + + adminerBuilder + .WithEnvironment(context => ConfigureAdminerContainer(context, builder.ApplicationBuilder)); + + configureContainer?.Invoke(adminerBuilder); + + return builder; + } + + /// + /// Adds an administration and development platform for MySql to the application model using DbGate. + /// + /// + /// This version of the package defaults to the tag of the container image. + /// The MySql server resource builder. + /// Configuration callback for DbGate container resource. + /// The name of the container (Optional). + /// + /// Use in application host with a MySql resource + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var mysql = builder.AddMySql("mysql") + /// .WithDbGate(); + /// var db = mysql.AddDatabase("db"); + /// + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(db); + /// + /// builder.Build().Run(); + /// + /// + /// + /// A reference to the . + public static IResourceBuilder WithDbGate(this IResourceBuilder builder, Action>? configureContainer = null, string? containerName = null) + { + ArgumentNullException.ThrowIfNull(builder); + + containerName ??= $"{builder.Resource.Name}-dbgate"; + + var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); + + dbGateBuilder + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); + + configureContainer?.Invoke(dbGateBuilder); + + return builder; + } + + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + { + var mysqlInstances = applicationBuilder.Resources.OfType(); + + var counter = 1; + + // Multiple WithDbGate calls will be ignored + if (context.EnvironmentVariables.ContainsKey($"LABEL_mysql{counter}")) + { + return; + } + + foreach (var mySqlServerResource in mysqlInstances) + { + // DbGate assumes MySql is being accessed over a default Aspire container network and hardcodes the resource address + context.EnvironmentVariables.Add($"LABEL_mysql{counter}", mySqlServerResource.Name); + context.EnvironmentVariables.Add($"SERVER_mysql{counter}", mySqlServerResource.Name); + context.EnvironmentVariables.Add($"USER_mysql{counter}", "root"); + context.EnvironmentVariables.Add($"PASSWORD_mysql{counter}", mySqlServerResource.PasswordParameter.Value); + context.EnvironmentVariables.Add($"PORT_mysql{counter}", mySqlServerResource.PrimaryEndpoint.TargetPort!.ToString()!); + context.EnvironmentVariables.Add($"ENGINE_mysql{counter}", "mysql@dbgate-plugin-mysql"); + + counter++; + } + + var instancesCount = mysqlInstances.Count(); + if (instancesCount > 0) + { + var strBuilder = new StringBuilder(); + strBuilder.AppendJoin(',', Enumerable.Range(1, instancesCount).Select(i => $"mysql{i}")); + var connections = strBuilder.ToString(); + + string CONNECTIONS = context.EnvironmentVariables.GetValueOrDefault("CONNECTIONS")?.ToString() ?? string.Empty; + if (string.IsNullOrEmpty(CONNECTIONS)) + { + context.EnvironmentVariables["CONNECTIONS"] = connections; + } + else + { + context.EnvironmentVariables["CONNECTIONS"] += $",{connections}"; + } + } + } + + internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + { + var mysqlInstances = applicationBuilder.Resources.OfType(); + + string ADMINER_SERVERS = context.EnvironmentVariables.GetValueOrDefault("ADMINER_SERVERS")?.ToString() ?? string.Empty; + + var new_servers = mysqlInstances.ToDictionary( + mysqlServer => mysqlServer.Name, + mysqlServer => + { + return new AdminerLoginServer + { + Server = mysqlServer.Name, + UserName = "root", + Password = mysqlServer.PasswordParameter.Value, + Driver = "server" // driver for MySQL is called 'server' + }; + }); + + if (string.IsNullOrEmpty(ADMINER_SERVERS)) + { + string servers_json = JsonSerializer.Serialize(new_servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + else + { + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) + { + if (!servers.ContainsKey(server.Key)) + { + servers!.Add(server.Key, server.Value); + } + } + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md new file mode 100644 index 00000000..ca7386eb --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/README.md @@ -0,0 +1,33 @@ +# CommunityToolkit.Aspire.Hosting.MySql.Extensions library + +This integration contains extensions for the [MySql hosting package](https://nuget.org/packages/Aspire.Hosting.MySql) for .NET Aspire. + +The integration provides support for running [Adminer](https://github.com/vrana/adminer) and [DbGate](https://github.com/dbgate/dbgate) to interact with the MySql database. + +## Getting Started + +### Install the package + +In your AppHost project, install the package using the following command: + +```dotnetcli +dotnet add package CommunityToolkit.Aspire.Hosting.MySql.Extensions +``` + +### Example usage + +Then, in the _Program.cs_ file of `AppHost`, define an MySql resource, then call `AddMySql`: + +```csharp +var mysql = builder.AddMySql("mysql") + .WithDbGate() + .WithAdminer(); +``` + +## Additional Information + +https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-mysql-extensions + +## Feedback & contributing + +https://github.com/CommunityToolkit/Aspire \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/api/CommunityToolkit.Aspire.Hosting.MySql.Extensions.cs b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/api/CommunityToolkit.Aspire.Hosting.MySql.Extensions.cs new file mode 100644 index 00000000..2f69e71c --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/api/CommunityToolkit.Aspire.Hosting.MySql.Extensions.cs @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace Aspire.Hosting +{ + public static partial class MySqlBuilderExtensions + { + public static ApplicationModel.IResourceBuilder WithAdminer(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } + + public static ApplicationModel.IResourceBuilder WithDbGate(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 2363a05f..9e315c7d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -1,9 +1,6 @@ using Aspire.Hosting.ApplicationModel; -using Aspire.Hosting.Lifecycle; -using CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.DependencyInjection; using CommunityToolkit.Aspire.Utils; +using Microsoft.Extensions.Hosting; namespace Aspire.Hosting; @@ -37,9 +34,21 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; - return useHttps - ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() - : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); + _ = useHttps + ? resource.WithHttpsEndpoint(env: "PORT") + : resource.WithHttpEndpoint(env: "PORT"); + + return resource.WithArgs(ctx => + { + if (packageManager == "npm") + { + ctx.Args.Add("--"); + } + + var targetEndpoint = resource.Resource.GetEndpoint(useHttps ? "https" : "http"); + ctx.Args.Add("--port"); + ctx.Args.Add(targetEndpoint.Property(EndpointProperty.TargetPort)); + }); } /// @@ -101,11 +110,27 @@ public static IResourceBuilder AddPnpmApp(this IDistributedAppl /// /// The Node.js app resource. /// When true use npm ci otherwise use npm install when installing packages. + /// Configure the npm installer resource. /// A reference to the . - public static IResourceBuilder WithNpmPackageInstallation(this IResourceBuilder resource, bool useCI = false) + public static IResourceBuilder WithNpmPackageInstallation(this IResourceBuilder resource, bool useCI = false, Action>? configureInstaller = null) { - resource.ApplicationBuilder.Services.TryAddLifecycleHook(sp => - new(useCI, sp.GetRequiredService(), sp.GetRequiredService(), sp.GetRequiredService())); + // Only install packages during development, not in publish mode + if (!resource.ApplicationBuilder.ExecutionContext.IsPublishMode) + { + var installerName = $"{resource.Resource.Name}-npm-install"; + var installer = new NpmInstallerResource(installerName, resource.Resource.WorkingDirectory); + + var installerBuilder = resource.ApplicationBuilder.AddResource(installer) + .WithArgs([useCI ? "ci" : "install"]) + .WithParentRelationship(resource.Resource) + .ExcludeFromManifest(); + + configureInstaller?.Invoke(installerBuilder); + + // Make the parent resource wait for the installer to complete + resource.WaitForCompletion(installerBuilder); + } + return resource; } @@ -113,10 +138,27 @@ public static IResourceBuilder WithNpmPackageInstallation(this /// Ensures the Node.js packages are installed before the application starts using yarn as the package manager. /// /// The Node.js app resource. + /// Configure the yarn installer resource. /// A reference to the . - public static IResourceBuilder WithYarnPackageInstallation(this IResourceBuilder resource) + public static IResourceBuilder WithYarnPackageInstallation(this IResourceBuilder resource, Action>? configureInstaller = null) { - resource.ApplicationBuilder.Services.TryAddLifecycleHook(); + // Only install packages during development, not in publish mode + if (!resource.ApplicationBuilder.ExecutionContext.IsPublishMode) + { + var installerName = $"{resource.Resource.Name}-yarn-install"; + var installer = new YarnInstallerResource(installerName, resource.Resource.WorkingDirectory); + + var installerBuilder = resource.ApplicationBuilder.AddResource(installer) + .WithArgs("install") + .WithParentRelationship(resource.Resource) + .ExcludeFromManifest(); + + configureInstaller?.Invoke(installerBuilder); + + // Make the parent resource wait for the installer to complete + resource.WaitForCompletion(installerBuilder); + } + return resource; } @@ -124,10 +166,27 @@ public static IResourceBuilder WithYarnPackageInstallation(this /// Ensures the Node.js packages are installed before the application starts using pnpm as the package manager. /// /// The Node.js app resource. + /// Configure the pnpm installer resource. /// A reference to the . - public static IResourceBuilder WithPnpmPackageInstallation(this IResourceBuilder resource) + public static IResourceBuilder WithPnpmPackageInstallation(this IResourceBuilder resource, Action>? configureInstaller = null) { - resource.ApplicationBuilder.Services.TryAddLifecycleHook(); + // Only install packages during development, not in publish mode + if (!resource.ApplicationBuilder.ExecutionContext.IsPublishMode) + { + var installerName = $"{resource.Resource.Name}-pnpm-install"; + var installer = new PnpmInstallerResource(installerName, resource.Resource.WorkingDirectory); + + var installerBuilder = resource.ApplicationBuilder.AddResource(installer) + .WithArgs("install") + .WithParentRelationship(resource.Resource) + .ExcludeFromManifest(); + + configureInstaller?.Invoke(installerBuilder); + + // Make the parent resource wait for the installer to complete + resource.WaitForCompletion(installerBuilder); + } + return resource; } diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodePackageInstaller.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodePackageInstaller.cs index b2ee2711..64dcc646 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodePackageInstaller.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodePackageInstaller.cs @@ -14,6 +14,7 @@ namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; /// The name of the lockfile to use. /// The logger service to use. /// The notification service to use. +[Obsolete("This class is used by deprecated lifecycle hooks. Package installation is now handled by installer resources.")] internal class NodePackageInstaller(string packageManager, string installCommand, string lockfile, ResourceLoggerService loggerService, ResourceNotificationService notificationService) { private readonly bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); @@ -46,16 +47,29 @@ private async Task PerformInstall(NodeAppResource resource, CancellationToken ca { var logger = loggerService.GetLogger(resource); - var packageJsonPath = Path.Combine(resource.WorkingDirectory, lockfile); + // For 'ci' command, we need the lockfile. For 'install' command, package.json is sufficient + string requiredFile; + string requiredFilePath; + + if (installCommand == "ci") + { + requiredFile = lockfile; + requiredFilePath = Path.Combine(resource.WorkingDirectory, lockfile); + } + else + { + requiredFile = "package.json"; + requiredFilePath = Path.Combine(resource.WorkingDirectory, "package.json"); + } - if (!File.Exists(packageJsonPath)) + if (!File.Exists(requiredFilePath)) { await notificationService.PublishUpdateAsync(resource, state => state with { - State = new($"No {lockfile} file found in {resource.WorkingDirectory}", KnownResourceStates.FailedToStart) + State = new($"No {requiredFile} file found in {resource.WorkingDirectory}", KnownResourceStates.FailedToStart) }).ConfigureAwait(false); - throw new InvalidOperationException($"No {lockfile} file found in {resource.WorkingDirectory}"); + throw new InvalidOperationException($"No {requiredFile} file found in {resource.WorkingDirectory}"); } await notificationService.PublishUpdateAsync(resource, state => state with diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmInstallerResource.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmInstallerResource.cs new file mode 100644 index 00000000..192ffa88 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmInstallerResource.cs @@ -0,0 +1,9 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// A resource that represents an npm package installer. +/// +/// The name of the resource. +/// The working directory to use for the command. +public class NpmInstallerResource(string name, string workingDirectory) + : ExecutableResource(name, "npm", workingDirectory); \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmPackageInstallerLifecycleHook.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmPackageInstallerLifecycleHook.cs index c3504dd4..18624b75 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmPackageInstallerLifecycleHook.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NpmPackageInstallerLifecycleHook.cs @@ -14,6 +14,7 @@ namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; /// The logger service used for logging. /// The notification service used for sending notifications. /// The execution context of the distributed application. +[Obsolete("Use WithNpmPackageInstallation which now creates installer resources instead of lifecycle hooks. This class will be removed in a future version.")] internal class NpmPackageInstallerLifecycleHook( bool useCI, ResourceLoggerService loggerService, diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmInstallerResource.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmInstallerResource.cs new file mode 100644 index 00000000..cb918e48 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmInstallerResource.cs @@ -0,0 +1,9 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// A resource that represents a pnpm package installer. +/// +/// The name of the resource. +/// The working directory to use for the command. +public class PnpmInstallerResource(string name, string workingDirectory) + : ExecutableResource(name, "pnpm", workingDirectory); \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmPackageInstallerLifecycleHook.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmPackageInstallerLifecycleHook.cs index 9ee27c66..7d11f242 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmPackageInstallerLifecycleHook.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/PnpmPackageInstallerLifecycleHook.cs @@ -10,6 +10,7 @@ namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; /// The to use for logging. /// The to use for notifications to Aspire on install progress. /// The to use for determining if the application is in publish mode. +[Obsolete("Use WithPnpmPackageInstallation which now creates installer resources instead of lifecycle hooks. This class will be removed in a future version.")] internal class PnpmPackageInstallerLifecycleHook( ResourceLoggerService loggerService, ResourceNotificationService notificationService, diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md index 8f5b18cb..270b3c2b 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md @@ -24,6 +24,27 @@ builder.AddPnpmApp("pnpm-demo") .WithExternalHttpEndpoints(); ``` +### Package installation with custom flags + +You can pass additional flags to package managers during installation: + +```csharp +// npm with legacy peer deps support +builder.AddNpmApp("npm-app", "./path/to/app") + .WithNpmPackageInstallation(useCI: false, args: ["--legacy-peer-deps"]) + .WithExternalHttpEndpoints(); + +// yarn with frozen lockfile +builder.AddYarnApp("yarn-app", "./path/to/app") + .WithYarnPackageInstallation(args: ["--frozen-lockfile", "--verbose"]) + .WithExternalHttpEndpoints(); + +// pnpm with frozen lockfile +builder.AddPnpmApp("pnpm-app", "./path/to/app") + .WithPnpmPackageInstallation(args: ["--frozen-lockfile"]) + .WithExternalHttpEndpoints(); +``` + ## Additional Information https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-nodejs-extensions diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md new file mode 100644 index 00000000..9c4080a6 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md @@ -0,0 +1,107 @@ +# Node.js Package Installer Refactoring + +This refactoring transforms the Node.js package installers from lifecycle hooks to ExecutableResource-based resources, addressing issue #732. + +## What Changed + +### Before (Lifecycle Hook Approach) +- Package installation was handled by lifecycle hooks during `BeforeStartAsync` +- No visibility into installation progress in the dashboard +- Limited logging capabilities +- Process management handled manually via `Process.Start` + +### After (Resource-Based Approach) +- Package installers are now proper `ExecutableResource` instances +- They appear as separate resources in the Aspire dashboard +- Full console output visibility and logging +- DCP (Distributed Application Control Plane) handles process management +- Parent-child relationships ensure proper startup ordering + +## New Resource Classes + +### NpmInstallerResource +```csharp +var installer = new NpmInstallerResource("npm-installer", "/path/to/project", useCI: true); +// Supports both 'npm install' and 'npm ci' commands +``` + +### YarnInstallerResource +```csharp +var installer = new YarnInstallerResource("yarn-installer", "/path/to/project"); +// Executes 'yarn install' command +``` + +### PnpmInstallerResource +```csharp +var installer = new PnpmInstallerResource("pnpm-installer", "/path/to/project"); +// Executes 'pnpm install' command +``` + +## Usage Examples + +### Basic Usage (No API Changes) +```csharp +var builder = DistributedApplication.CreateBuilder(); + +// API remains the same - behavior is now resource-based +var viteApp = builder.AddViteApp("frontend", "./frontend") + .WithNpmPackageInstallation(useCI: true); + +var backendApp = builder.AddYarnApp("backend", "./backend") + .WithYarnPackageInstallation(); +``` + +### What Happens Under the Hood +```csharp +// This now creates: +// 1. NodeAppResource named "frontend" +// 2. NpmInstallerResource named "frontend-npm-install" (child of frontend) +// 3. WaitAnnotation on frontend to wait for installer completion +// 4. ResourceRelationshipAnnotation linking installer to parent +``` + +## Benefits + +### Dashboard Visibility +- Installer resources appear as separate items in the Aspire dashboard +- Real-time console output from package installation +- Clear status indication (starting, running, completed, failed) +- Ability to re-run installations if needed + +### Better Resource Management +- DCP handles process lifecycle instead of manual `Process.Start` +- Proper resource cleanup and error handling +- Integration with Aspire's logging and monitoring systems + +### Improved Startup Ordering +- Parent resources automatically wait for installer completion +- Failed installations prevent app startup (fail-fast behavior) +- Clear dependency visualization in the dashboard + +### Development vs Production +- Installers only run during development (excluded from publish mode) +- No overhead in production deployments +- Maintains backward compatibility + +## Migration Guide + +### For Users +No changes required! The existing APIs (`WithNpmPackageInstallation`, `WithYarnPackageInstallation`, `WithPnpmPackageInstallation`) work exactly the same. + +### For Contributors +The lifecycle hook classes are marked as `[Obsolete]` but remain functional for backward compatibility: +- `NpmPackageInstallerLifecycleHook` +- `YarnPackageInstallerLifecycleHook` +- `PnpmPackageInstallerLifecycleHook` +- `NodePackageInstaller` + +These will be removed in a future version once all usage has migrated to the resource-based approach. + +## Testing + +Comprehensive test coverage includes: +- Unit tests for installer resource properties and command generation +- Integration tests for parent-child relationships +- Cross-platform compatibility (Windows vs Unix commands) +- Publish mode exclusion verification +- Wait annotation and resource relationship validation \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnInstallerResource.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnInstallerResource.cs new file mode 100644 index 00000000..1258368c --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnInstallerResource.cs @@ -0,0 +1,11 @@ +using System.Runtime.InteropServices; + +namespace Aspire.Hosting.ApplicationModel; + +/// +/// A resource that represents a yarn package installer. +/// +/// The name of the resource. +/// The working directory to use for the command. +public class YarnInstallerResource(string name, string workingDirectory) + : ExecutableResource(name, "yarn", workingDirectory); \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnPackageInstallerLifecycleHook.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnPackageInstallerLifecycleHook.cs index 3b0d3c78..c5ba80dd 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnPackageInstallerLifecycleHook.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/YarnPackageInstallerLifecycleHook.cs @@ -10,6 +10,7 @@ namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; /// The to use for logging. /// The to use for notifications to Aspire on install progress. /// The to use for determining if the application is in publish mode. +[Obsolete("Use WithYarnPackageInstallation which now creates installer resources instead of lifecycle hooks. This class will be removed in a future version.")] internal class YarnPackageInstallerLifecycleHook( ResourceLoggerService loggerService, ResourceNotificationService notificationService, diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs index 758c1ada..73ee2eb0 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs @@ -16,10 +16,10 @@ public static partial class NodeJSHostingExtensions public static ApplicationModel.IResourceBuilder AddYarnApp(this IDistributedApplicationBuilder builder, string name, string workingDirectory, string scriptName = "start", string[]? args = null) { throw null; } - public static ApplicationModel.IResourceBuilder WithNpmPackageInstallation(this ApplicationModel.IResourceBuilder resource, bool useCI = false) { throw null; } + public static ApplicationModel.IResourceBuilder WithNpmPackageInstallation(this ApplicationModel.IResourceBuilder resource, bool useCI = false, string[]? args = null) { throw null; } - public static ApplicationModel.IResourceBuilder WithPnpmPackageInstallation(this ApplicationModel.IResourceBuilder resource) { throw null; } + public static ApplicationModel.IResourceBuilder WithPnpmPackageInstallation(this ApplicationModel.IResourceBuilder resource, string[]? args = null) { throw null; } - public static ApplicationModel.IResourceBuilder WithYarnPackageInstallation(this ApplicationModel.IResourceBuilder resource) { throw null; } + public static ApplicationModel.IResourceBuilder WithYarnPackageInstallation(this ApplicationModel.IResourceBuilder resource, string[]? args = null) { throw null; } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaContainerImageTags.cs b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaContainerImageTags.cs index ee618cbc..19b2ea17 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaContainerImageTags.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaContainerImageTags.cs @@ -4,9 +4,9 @@ internal static class OllamaContainerImageTags { public const string Registry = "docker.io"; public const string Image = "ollama/ollama"; - public const string Tag = "0.6.0"; + public const string Tag = "0.7.1"; public const string OpenWebUIRegistry = "ghcr.io"; public const string OpenWebUIImage = "open-webui/open-webui"; - public const string OpenWebUITag = "0.5.20"; + public const string OpenWebUITag = "0.6.10"; } diff --git a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.Model.cs b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.Model.cs index 83c7492e..0b726150 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.Model.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.Model.cs @@ -145,10 +145,6 @@ private static IResourceBuilder AddModelResourceCommand( builder.WithCommand( name: name, displayName: displayName, - updateState: context => - context.ResourceSnapshot.State?.Text == KnownResourceStates.Running ? - ResourceCommandState.Enabled : - ResourceCommandState.Disabled, executeCommand: async context => { var modelResource = builder.Resource; @@ -165,13 +161,19 @@ private static IResourceBuilder AddModelResourceCommand( return await executeCommand(modelResource, ollamaClient, logger, notificationService, context.CancellationToken); }, - displayDescription: displayDescription, - parameter: parameter, - confirmationMessage: confirmationMessage, - iconName: iconName, - iconVariant: iconVariant, - isHighlighted: isHighlighted - ); + commandOptions: new() + { + Description = displayDescription, + Parameter = parameter, + ConfirmationMessage = confirmationMessage, + IconName = iconName, + IconVariant = iconVariant, + IsHighlighted = isHighlighted, + UpdateState = context => + context.ResourceSnapshot.State?.Text == KnownResourceStates.Running ? + ResourceCommandState.Enabled : + ResourceCommandState.Disabled, + }); private static IResourceBuilder WithModelDownload(this IResourceBuilder builder) { diff --git a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.cs index 0e2f2e5c..64ca03b1 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Ollama/OllamaResourceBuilderExtensions.cs @@ -68,8 +68,7 @@ public static IResourceBuilder AddOllama(this IDistributedApplic return builder.AddResource(resource) .WithAnnotation(new ContainerImageAnnotation { Image = OllamaContainerImageTags.Image, Tag = OllamaContainerImageTags.Tag, Registry = OllamaContainerImageTags.Registry }) .WithHttpEndpoint(port: port, targetPort: 11434, name: OllamaResource.OllamaEndpointName) - .WithHttpHealthCheck("/") - .ExcludeFromManifest(); + .WithHttpHealthCheck("/"); } /// @@ -103,11 +102,23 @@ public static IResourceBuilder WithGPUSupport(this IResourceBuil return vendor switch { OllamaGpuVendor.Nvidia => builder.WithContainerRuntimeArgs("--gpus", "all"), - OllamaGpuVendor.AMD => builder.WithContainerRuntimeArgs("--device", "/dev/kfd"), + OllamaGpuVendor.AMD => builder.WithAMDGPUSupport(), _ => throw new ArgumentException("Invalid GPU vendor", nameof(vendor)) }; } + private static IResourceBuilder WithAMDGPUSupport(this IResourceBuilder builder) + { + if (builder.Resource.TryGetLastAnnotation(out var containerAnnotation)) + { + if (containerAnnotation.Tag?.EndsWith("rocm") == false) + { + containerAnnotation.Tag += "-rocm"; + } + } + return builder.WithContainerRuntimeArgs("--device", "/dev/kfd", "--device", "/dev/dri"); + } + private static OllamaResource AddServerResourceCommand( this OllamaResource ollamaResource, string name, diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj index dcd84100..6654fe6d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.csproj @@ -11,7 +11,12 @@ + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs index 0c990e17..7aaea327 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/PostgresBuilderExtensions.cs @@ -1,5 +1,7 @@ using Aspire.Hosting.ApplicationModel; using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; namespace Aspire.Hosting; @@ -42,14 +44,53 @@ public static IResourceBuilder WithDbGate(this IResource var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)) - .WaitFor(builder); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); configureContainer?.Invoke(dbGateBuilder); return builder; } + /// + /// Adds an administration and development platform for PostgreSQL to the application model using Adminer. + /// + /// + /// This version of the package defaults to the tag of the container image. + /// The Postgres server resource builder. + /// Configuration callback for Adminer container resource. + /// The name of the container (Optional). + /// + /// Use in application host with a Postgres resource + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var postgres = builder.AddPostgres("postgres") + /// .WithAdminer(); + /// var db = postgres.AddDatabase("db"); + /// + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(db); + /// + /// builder.Build().Run(); + /// + /// + /// + /// A reference to the . + public static IResourceBuilder WithAdminer(this IResourceBuilder builder, Action>? configureContainer = null, string? containerName = null) + { + ArgumentNullException.ThrowIfNull(builder); + + containerName ??= $"{builder.Resource.Name}-adminer"; + var adminerBuilder = AdminerBuilderExtensions.AddAdminer(builder.ApplicationBuilder, containerName); + + adminerBuilder + .WithEnvironment(context => ConfigureAdminerContainer(context, builder.ApplicationBuilder)); + + configureContainer?.Invoke(adminerBuilder); + + return builder; + } + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) { var postgresInstances = applicationBuilder.Resources.OfType(); @@ -96,4 +137,46 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, } } } + + + internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + { + var postgresInstances = applicationBuilder.Resources.OfType(); + + string ADMINER_SERVERS = context.EnvironmentVariables.GetValueOrDefault("ADMINER_SERVERS")?.ToString() ?? string.Empty; + + var new_servers = postgresInstances.ToDictionary( + postgresServer => postgresServer.Name, + postgresServer => + { + var user = postgresServer.UserNameParameter?.Value ?? "postgres"; + return new AdminerLoginServer + { + Server = postgresServer.Name, + UserName = user, + Password = postgresServer.PasswordParameter.Value, + Driver = "pgsql" + }; + }); + + if (string.IsNullOrEmpty(ADMINER_SERVERS)) + { + string servers_json = JsonSerializer.Serialize(new_servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + else + { + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) + { + if (!servers.ContainsKey(server.Key)) + { + servers!.Add(server.Key, server.Value); + } + } + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + + } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md index d8f59eee..a6261397 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/README.md @@ -2,7 +2,7 @@ This integration contains extensions for the [PostgreSQL hosting package](https://nuget.org/packages/Aspire.Hosting.PostgreSQL) for .NET Aspire. -The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) to interact with the PostgreSQL database. +The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) and [Adminer](https://github.com/vrana/adminer) to interact with the PostgreSQL database. ## Getting Started @@ -20,7 +20,8 @@ Then, in the _Program.cs_ file of `AppHost`, define an Postgres resource, then c ```csharp var postgres = builder.AddPostgres("postgres") - .WithDbGate(); + .WithDbGate() + .WithAdminer(); ``` ## Additional Information diff --git a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/api/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.cs b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/api/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.cs index 8f798e91..4a8b804c 100644 --- a/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/api/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions/api/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.cs @@ -10,6 +10,8 @@ namespace Aspire.Hosting { public static partial class PostgresBuilderExtensions { + public static ApplicationModel.IResourceBuilder WithAdminer(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } + public static ApplicationModel.IResourceBuilder WithDbGate(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/CommunityToolkit.Aspire.Hosting.PowerShell.csproj b/src/CommunityToolkit.Aspire.Hosting.PowerShell/CommunityToolkit.Aspire.Hosting.PowerShell.csproj new file mode 100644 index 00000000..9513fc8e --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/CommunityToolkit.Aspire.Hosting.PowerShell.csproj @@ -0,0 +1,16 @@ + + + + powershell; pwsh; scripting; script; hosting + Run powershell scripts in-process with your Aspire AppHost, injecting aspire resources and/or object instances as variables, using the command lines tools of your choice like azure cli, azd, or any other terminal tools. + + + + + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/DistributedApplicationBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PowerShell/DistributedApplicationBuilderExtensions.cs new file mode 100644 index 00000000..baf5ce2b --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/DistributedApplicationBuilderExtensions.cs @@ -0,0 +1,85 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.DependencyInjection; +using System.Diagnostics; +using System.Management.Automation; +using System.Management.Automation.Runspaces; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell; + +/// +/// Extensions for the to add PowerShell runspace pool resources. +/// +public static class DistributedApplicationBuilderExtensions +{ + /// + /// Adds a PowerShell runspace pool resource to the distributed application. + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static IResourceBuilder AddPowerShell( + this IDistributedApplicationBuilder builder, + [ResourceName] string name, + PSLanguageMode languageMode = PSLanguageMode.ConstrainedLanguage, + int minRunspaces = 1, + int maxRunspaces = 5) + { + ArgumentException.ThrowIfNullOrWhiteSpace(name); + + var pool = new PowerShellRunspacePoolResource(name, languageMode, minRunspaces, maxRunspaces); + + + builder.Eventing.Subscribe(pool, async (e, ct) => + { + var poolResource = e.Resource as PowerShellRunspacePoolResource; + + Debug.Assert(poolResource is not null); + + var loggerService = e.Services.GetRequiredService(); + var notificationService = e.Services.GetRequiredService(); + + var sessionState = InitialSessionState.CreateDefault(); + + // This will block until explicit and implied WaitFor calls are completed + await builder.Eventing.PublishAsync( + new BeforeResourceStartedEvent(poolResource, e.Services), ct); + + foreach (var annotation in poolResource.Annotations.OfType>()) + { + if (annotation is { } reference) + { + var connectionString = await reference.Value.Resource.GetConnectionStringAsync(ct); + sessionState.Variables.Add( + new SessionStateVariableEntry(reference.Name, connectionString, + $"ConnectionString for {reference.Value.Resource.GetType().Name} '{reference.Name}'", + ScopedItemOptions.ReadOnly | ScopedItemOptions.AllScope)); + } + } + + var poolName = poolResource.Name; + var poolLogger = loggerService.GetLogger(poolName); + + _ = poolResource.StartAsync(sessionState, notificationService, poolLogger, ct); + }); + + return builder.AddResource(pool) + .WithInitialState(new() + { + ResourceType = "PowerShellRunspacePool", + State = KnownResourceStates.NotStarted, + Properties = [ + + new ("LanguageMode", pool.LanguageMode.ToString()), + new ("MinRunspaces", pool.MinRunspaces.ToString()), + new ("MaxRunspaces", pool.MaxRunspaces.ToString()) + ] + }) + .ExcludeFromManifest(); + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResource.cs b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResource.cs new file mode 100644 index 00000000..a0a90156 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResource.cs @@ -0,0 +1,139 @@ +using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.Logging; +using System.Globalization; +using System.Management.Automation; +using System.Management.Automation.Host; +using System.Management.Automation.Runspaces; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell; + +/// +/// Represents a PowerShell runspace pool resource. +/// +public class PowerShellRunspacePoolResource( + [ResourceName] string name, + PSLanguageMode languageMode = PSLanguageMode.ConstrainedLanguage, + int minRunspaces = 1, + int maxRunspaces = 5) + : Resource(name), IDisposable, IResourceWithWaitSupport +{ + /// + /// Specifies the language mode for the PowerShell runspace pool. + /// + public PSLanguageMode LanguageMode { get; } = languageMode; + + /// + /// Specifies the minimum number of runspaces in the pool. + /// + public int MinRunspaces { get; } = minRunspaces; + + /// + /// Specifies the maximum number of runspaces in the pool. + /// + public int MaxRunspaces { get; } = maxRunspaces; + + /// + /// A reference to the runspace pool created by this resource. + /// + public RunspacePool? Pool { get; private set; } + + internal Task StartAsync(InitialSessionState sessionState, ResourceNotificationService notificationService, ILogger logger, CancellationToken token = default) + { + logger.LogInformation( + "Starting PowerShell runspace pool '{PoolName}' with {MinRunspaces} to {MaxRunspaces} runspaces", + Name, MinRunspaces, MaxRunspaces); + + sessionState.LanguageMode = this.LanguageMode; + sessionState.AuthorizationManager = new AuthorizationManager("Aspire"); + Pool = RunspaceFactory.CreateRunspacePool(MinRunspaces, MaxRunspaces, sessionState, new AspirePSHost(logger)); + + ConfigureStateChangeNotifications(notificationService, logger); + + return Task.Factory.FromAsync(Pool.BeginOpen, Pool.EndOpen, null); + } + + private void ConfigureStateChangeNotifications(ResourceNotificationService notificationService, ILogger logger) + { + Pool!.StateChanged += async (_, args) => + { + var poolState = args.RunspacePoolStateInfo.State; + var reason = args.RunspacePoolStateInfo.Reason; + + logger.LogInformation( + "Runspace pool '{PoolName}' state changed to '{RunspacePoolState}'", Name, poolState); + + // map args.RunspacePoolStateInfo.State to a KnownResourceState + // and publish the update + + var knownState = poolState switch + { + RunspacePoolState.BeforeOpen => KnownResourceStates.NotStarted, + RunspacePoolState.Opening => KnownResourceStates.Starting, + RunspacePoolState.Opened => KnownResourceStates.Running, + RunspacePoolState.Closing => KnownResourceStates.Stopping, + RunspacePoolState.Closed => KnownResourceStates.Exited, + RunspacePoolState.Broken => KnownResourceStates.FailedToStart, + _ => throw new ArgumentOutOfRangeException( + nameof(poolState), poolState, $"Unexpected runspace pool state {poolState}") + }; + + logger.LogDebug( + "Runspace pool '{PoolName}' state mapped to known state '{KnownState}'", Name, knownState); + + await notificationService.PublishUpdateAsync(this, + state => state with + { + State = knownState, + Properties = [ + .. state.Properties, + new("RunspacePoolState", poolState.ToString()), + new("Reason", reason?.ToString() ?? string.Empty) + ], + StartTimeStamp = knownState == KnownResourceStates.Running ? DateTime.Now : state.StartTimeStamp, + StopTimeStamp = KnownResourceStates.TerminalStates.Contains(knownState) ? DateTime.Now : state.StopTimeStamp, + }); + }; + } + + // minimal PSHost implementation (aspire does not support interaction with the host, yet) + private class AspirePSHost(ILogger logger) : PSHost + { + public override void SetShouldExit(int exitCode) + { + logger.LogInformation("AspirePSHost: SetShouldExit({ExitCode})", exitCode); + } + + public override void EnterNestedPrompt() + { + throw new NotSupportedException(); + } + + public override void ExitNestedPrompt() + { + throw new NotSupportedException(); + } + + public override void NotifyBeginApplication() + { + logger.LogInformation("AspirePSHost: NotifyBeginApplication"); + } + + public override void NotifyEndApplication() + { + logger.LogInformation("AspirePSHost: NotifyEndApplication"); + } + + public override string Name { get; } = "AspirePSHost"; + public override Version Version { get; } = new (0, 1); + public override Guid InstanceId { get; } = Guid.NewGuid(); + public override PSHostUserInterface UI => null!; // interaction not supported + public override CultureInfo CurrentCulture { get; } = CultureInfo.CurrentCulture; + public override CultureInfo CurrentUICulture { get; } = CultureInfo.CurrentUICulture; + } + + void IDisposable.Dispose() + { + Pool?.Close(); + Pool?.Dispose(); + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResourceBuilderExtensions.cs new file mode 100644 index 00000000..5ab6437b --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellRunspacePoolResourceBuilderExtensions.cs @@ -0,0 +1,122 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System.Diagnostics.CodeAnalysis; +using System.Management.Automation; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell; + +/// +/// Extensions for the PowerShellRunspacePoolResourceBuilder. +/// +public static class PowerShellRunspacePoolResourceBuilderExtensions +{ + /// + /// Adds a PowerShell script resource to the distributed application. + /// + /// + /// + /// + /// + public static IResourceBuilder AddScript( + this IResourceBuilder builder, + [ResourceName] string name, + [StringSyntax("PowerShell")] string script) + { + ArgumentException.ThrowIfNullOrWhiteSpace(name); + ArgumentException.ThrowIfNullOrWhiteSpace(script); + + // parse to force an early exception if the script is invalid + var scriptBlock = ScriptBlock.Create(script); + + var scriptResource = new PowerShellScriptResource(name, scriptBlock, builder.Resource); + + builder.ApplicationBuilder.Eventing.Subscribe(scriptResource, async (e, ct) => + { + var loggerService = e.Services.GetRequiredService(); + var notificationService = e.Services.GetRequiredService(); + + var scriptName = scriptResource.Name; + var scriptLogger = loggerService.GetLogger(scriptName); + + try + { + // this will block until the runspace pool is started, which is implied by the WaitFor call + await builder.ApplicationBuilder.Eventing.PublishAsync( + new BeforeResourceStartedEvent(scriptResource, e.Services), ct); + + scriptLogger.LogInformation("Starting script '{ScriptName}'", scriptName); + + _ = scriptResource.StartAsync(scriptLogger, notificationService, ct); + } + catch (Exception ex) + { + scriptLogger.LogError(ex, "Failed to start script '{ScriptName}'", scriptName); + } + }); + + return builder.ApplicationBuilder + .AddResource(scriptResource) + .WithParentRelationship(builder.Resource) + .WaitFor(builder) + .WithInitialState(new() + { + ResourceType = "PowerShellScript", + State = KnownResourceStates.NotStarted, + Properties = [ + new ("Script", script), + new("RunspacePool", builder.Resource.Name) + ] + }) + .ExcludeFromManifest() + .WithCommand("break", "Stop script execution", + async _ => + { + await scriptResource.BreakAsync(); + return CommandResults.Success(); + }, + new CommandOptions + { + ConfirmationMessage = "Are you sure you want to stop the script?", + Description = "Stop script execution", + IconName = "Stop", + IsHighlighted = true, + IconVariant = IconVariant.Filled, + UpdateState = updateContext => + updateContext.ResourceSnapshot.State?.Text != KnownResourceStates.Running ? + ResourceCommandState.Disabled : + ResourceCommandState.Enabled + }); + } + + /// + /// Adds a reference to an Aspire resource that implements IResourceWithConnectionString. + /// The resource will be exposed as a PowerShell variable in the runspace that is named after the resource name. + /// + /// + /// + /// + /// + /// + public static IResourceBuilder WithReference(this IResourceBuilder builder, IResourceBuilder source, string? connectionName = null, bool optional = false) + { + ArgumentNullException.ThrowIfNull(builder); + ArgumentNullException.ThrowIfNull(source); + + var resource = source.Resource; + + builder.WithReferenceRelationship(resource); + + return builder.WithAnnotation(new PowerShellVariableReferenceAnnotation( + resource.Name, new ConnectionStringReference(resource, optional))); + } +} + +/// +/// Represents a PowerShell variable reference annotation. +/// +/// +/// +/// +public record PowerShellVariableReferenceAnnotation(string Name, T Value) : IResourceAnnotation; \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResource.cs b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResource.cs new file mode 100644 index 00000000..7e2236d3 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResource.cs @@ -0,0 +1,259 @@ +using Aspire.Hosting.ApplicationModel; +using Microsoft.Extensions.Logging; +using System.Diagnostics; +using System.Management.Automation; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell +{ + /// + /// Represents a PowerShell script resource. + /// + public class PowerShellScriptResource : Resource, IDisposable, + IResourceWithEnvironment, + IResourceWithWaitSupport, + IResourceWithArgs + { + private readonly System.Management.Automation.PowerShell _ps; + private readonly CancellationTokenSource _cts; + private readonly PSDataCollection _output; + private readonly PSDataCollection _emptyInput; + private ILogger? _scriptLogger; + private bool _isDisposed; + + /// + /// Initializes a new instance of the class, representing a resource for + /// executing PowerShell scripts. + /// + /// This class is designed to manage the execution of PowerShell scripts within a + /// specified runspace pool. The script execution is tied to a cancellation token, allowing the script to be + /// stopped when requested. + /// The name of the resource. This must be a valid resource name. + /// The ScriptBlock to be executed. + /// The parent that provides the runspace pool for script + /// execution. Cannot be null. + public PowerShellScriptResource([ResourceName] string name, + ScriptBlock script, + PowerShellRunspacePoolResource parent) : base(name) + { + Parent = parent; + _cts = new CancellationTokenSource(); + _ps = System.Management.Automation.PowerShell.Create(); + + // stop the powershell instance when _cts is cancelled + _cts.Token.Register(() => + { + _scriptLogger?.LogInformation("Stopping PowerShell script execution"); + _ps.Stop(); + }); + + _output = new PSDataCollection(); + _emptyInput = new PSDataCollection(); + _emptyInput.Complete(); + + _ps.AddScript(script.ToString()); + } + + /// + /// Initializes a new instance of the class, representing a resource for + /// executing PowerShell scripts. + /// + /// This class is designed to manage the execution of PowerShell scripts within a + /// specified runspace pool. The script execution is tied to a cancellation token, allowing the script to be + /// stopped when requested. + /// The name of the resource. This must be a valid resource name. + /// The file containing the PowerShell script to be executed. Must be a valid file path and not null. + /// The parent that provides the runspace pool for script + /// execution. Cannot be null. + public PowerShellScriptResource([ResourceName] string name, + FileInfo scriptFile, + PowerShellRunspacePoolResource parent) : base(name) + { + Parent = parent; + _cts = new CancellationTokenSource(); + _ps = System.Management.Automation.PowerShell.Create(); + + // stop the powershell instance when _cts is cancelled + _cts.Token.Register(() => + { + _scriptLogger?.LogInformation("Stopping PowerShell script execution"); + _ps.Stop(); + }); + + _output = new PSDataCollection(); + _emptyInput = new PSDataCollection(); + _emptyInput.Complete(); + + // add scriptFile to the PowerShell instance to be executed + _ps.AddCommand(scriptFile.FullName); + } + + /// + /// Parent PowerShell runspace pool resource that provides the runspace pool for script execution. + /// + public PowerShellRunspacePoolResource Parent { get; } + + /// + /// Breaks the PowerShell script execution. + /// + /// + public async Task BreakAsync() + { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(PowerShellScriptResource)); + } + + if (_ps.InvocationStateInfo.State != PSInvocationState.Running) + { + return false; + } + + await _cts.CancelAsync(); + + return true; + } + + /// + /// Starts the PowerShell script execution. + /// + /// + /// + /// + /// + /// + public async Task StartAsync(ILogger scriptLogger, + ResourceNotificationService notificationService, + CancellationToken cancellationToken = default) + { + scriptLogger.LogInformation("Starting PowerShell script '{ScriptName}'", Name); + + Debug.Assert(scriptLogger is not null); + _scriptLogger = scriptLogger; + + Debug.Assert(Parent.Pool is not null); + _ps.RunspacePool = Parent.Pool; + + ConfigurePSDataStreams(scriptLogger, notificationService); + + _ps.InvocationStateChanged += async (_, args) => + { + var knownState = args.InvocationStateInfo.State switch + { + PSInvocationState.NotStarted => KnownResourceStates.NotStarted, + PSInvocationState.Running => KnownResourceStates.Running, + PSInvocationState.Completed => KnownResourceStates.Finished, + PSInvocationState.Stopped => KnownResourceStates.Exited, + PSInvocationState.Failed => KnownResourceStates.FailedToStart, + PSInvocationState.Stopping => KnownResourceStates.Stopping, + _ => throw new ArgumentOutOfRangeException( // probably should be assertion + nameof(args.InvocationStateInfo.State), + args.InvocationStateInfo.State, + "Unknown PowerShell invocation state") + }; + + scriptLogger.LogDebug("Publishing script {ScriptName} state as known state: {ScriptState}", Name, knownState); + + await notificationService.PublishUpdateAsync(this, + state => state with + { + State = knownState, + Properties = [ + .. state.Properties, + new( "PSInvocationState", args.InvocationStateInfo.State.ToString() ), + new( "Reason", args.InvocationStateInfo.Reason?.Message ?? string.Empty ), + ], + StartTimeStamp = knownState == KnownResourceStates.Running ? DateTime.Now : state.StartTimeStamp, + StopTimeStamp = KnownResourceStates.TerminalStates.Contains(knownState) ? DateTime.Now : state.StopTimeStamp, + }); + }; + + if (this.TryGetLastAnnotation(out var scriptArgsAnnotation)) + { + foreach (var scriptArg in scriptArgsAnnotation.Args) + { + if (scriptArg is IValueProvider valueProvider) + { + var value = await valueProvider.GetValueAsync(cancellationToken); + _ps.AddArgument(value); + } + else + { + _ps.AddArgument(scriptArg); + } + } + } + + try + { + _ = await _ps.InvokeAsync(_emptyInput, _output); + } + catch (PipelineStoppedException) + { + // This is expected when the pipeline is stopped (i.e. via BreakAsync), so we can ignore it. + // The pipeline will be stopped when the PowerShell instance is disposed. + } + catch (Exception ex) + { + scriptLogger.LogError(ex, "Error invoking PowerShell script: {Message}", ex.Message); + throw; + } + } + + private void ConfigurePSDataStreams(ILogger logger, ResourceNotificationService notifications) + { + _output.DataAdded += (_, args) => + { + var psObject = _output[args.Index]; + logger.LogInformation("Output: {Output}", psObject.ToString()); + }; + _output.Completed += async (_, _) => + { + await notifications.PublishUpdateAsync(this, state => state with + { + State = KnownResourceStates.Finished, + StopTimeStamp = DateTime.Now, + ExitCode = _ps.HadErrors ? 1 : 0, + }); + + logger.LogInformation("Output completed"); + }; + _ps.Streams.Error.DataAdded += (_, args) => + { + var error = _ps.Streams.Error[args.Index]; + logger.LogError(error.Exception, "Error: {Error}", error.ToString()); + }; + _ps.Streams.Warning.DataAdded += (_, args) => + { + var warning = _ps.Streams.Warning[args.Index]; + logger.LogWarning("Warning: {Warning}", warning); + }; + _ps.Streams.Information.DataAdded += (_, args) => + { + var info = _ps.Streams.Information[args.Index]; + logger.LogInformation("Information: {Info}", info); + }; + _ps.Streams.Verbose.DataAdded += (_, args) => + { + var verbose = _ps.Streams.Verbose[args.Index]; + logger.LogInformation("Verbose: {Verbose}", verbose); + }; + _ps.Streams.Debug.DataAdded += (_, args) => + { + var debug = _ps.Streams.Debug[args.Index]; + logger.LogInformation("Debug: {Debug}", debug); + }; + } + + void IDisposable.Dispose() + { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(PowerShellScriptResource)); + } + _isDisposed = true; + _ps.Stop(); + _ps.Dispose(); + _cts?.Dispose(); + } + } +} diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResourceBuilderExtensions.cs new file mode 100644 index 00000000..41861d47 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/PowerShellScriptResourceBuilderExtensions.cs @@ -0,0 +1,29 @@ +using Aspire.Hosting.ApplicationModel; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell; + + +/// +/// PowerShell script resource builder extensions. +/// +public static class PowerShellScriptResourceBuilderExtensions +{ + /// + /// Provide arguments to the PowerShell script. + /// + /// + /// + /// + public static IResourceBuilder WithArgs( + this IResourceBuilder builder, params object[] args) + { + return builder.WithAnnotation(new PowerShellScriptArgsAnnotation(args)); + } +} + +/// +/// Represents the arguments for a PowerShell script resource. +/// +/// +public record PowerShellScriptArgsAnnotation(object[] Args) : IResourceAnnotation; + diff --git a/src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md b/src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md new file mode 100644 index 00000000..1d2b1aaf --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.PowerShell/README.md @@ -0,0 +1,54 @@ +# CommunityToolkit Aspire PowerShell Scripting + +## About + +Script your resources, use the pwsh (powershell core) engine and reference connectionstring expressions, live resources, dotnet instances or whatever else is in scope for your AppHost. + + +```csharp +using CommunityToolkit.Aspire.Hosting.PowerShell; + +var builder = DistributedApplication.CreateBuilder(args); + +var storage = builder.AddAzureStorage("storage").RunAsEmulator(); +var blob = storage.AddBlobs("myblob"); + +var ps = builder.AddPowerShell("ps") + .WithReference(blob) + .WaitFor(storage); + +// uploads the script in scripts/ +var script1 = ps.AddScript("script1", """ + param($name) + + write-information "Hello, $name" + + # uncommenting this will hang the script if you don't attach the pwsh debugger + # wait-debugger + + write-information "`$myblob is $myblob" + + az storage container create --connection-string $myblob -n demo + az storage blob upload --connection-string $myblob -c demo --file ./scripts/script.ps1 + + write-information $pwd + + write-information "Blob uploaded" +""").WithArgs("world"); + +// outputs "the sum of 2 and 3 is 5" +var script2 = ps.AddScript("script2", """ + & ./scripts/script.ps1 @args + """) + .WithArgs(2, 3) + .WaitForCompletion(script1); + +builder.Build().Run(); + +``` + +## Debugging + +While your Apphost is running a script that is waiting via `Wait-Debugger`, open a terminal with powershell (pwsh) 7.4 or later (win, osx, linux) and use `Get-PSHostProcessInfo`, `Enter-PSHostProcess`, `Get-Runspace` and `Debug-Runspace` to connect the debugger. + +See https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/enter-pshostprocess?view=powershell-7.5 for more information. diff --git a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs index 6cac35f9..51902f82 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Redis.Extensions/RedisBuilderExtensions.cs @@ -41,8 +41,7 @@ public static IResourceBuilder WithDbGate(this IResourceBuilder ConfigureDbGateContainer(context, builder.ApplicationBuilder)) - .WaitFor(builder); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); configureContainer?.Invoke(dbGateBuilder); @@ -65,9 +64,11 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, { // DbGate assumes Redis is being accessed over a default Aspire container network and hardcodes the resource address - // This will need to be refactored once updated service discovery APIs are available + var redisUrl = redisResource.PasswordParameter is not null ? + $"redis://:{redisResource.PasswordParameter.Value}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; + context.EnvironmentVariables.Add($"LABEL_redis{counter}", redisResource.Name); - context.EnvironmentVariables.Add($"URL_redis{counter}", redisResource.ConnectionStringExpression); + context.EnvironmentVariables.Add($"URL_redis{counter}", redisUrl); context.EnvironmentVariables.Add($"ENGINE_redis{counter}", "redis@dbgate-plugin-redis"); counter++; diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/DacDeployOptionsAnnotation.cs b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/DacDeployOptionsAnnotation.cs new file mode 100644 index 00000000..20970aac --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/DacDeployOptionsAnnotation.cs @@ -0,0 +1,9 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Represents a metadata annotation that specifies dacpac deployment options. +/// +/// path to deployment options xml file +public record DacDeployOptionsAnnotation(string OptionsPath) : IResourceAnnotation +{ +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlPackageResource.cs b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlPackageResource.cs index 7a1c6ad2..d7869cff 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlPackageResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlPackageResource.cs @@ -37,6 +37,19 @@ DacDeployOptions IResourceWithDacpac.GetDacpacDeployOptions() { var options = new DacDeployOptions(); + if (this.TryGetLastAnnotation(out var optionsAnnotation)) + { + var profile = DacProfile.Load(optionsAnnotation.OptionsPath); + + if (profile == null) + { + throw new InvalidOperationException($"Unable to load DacProfile from path {optionsAnnotation.OptionsPath} for resource {Name}."); + } + + options = profile.DeployOptions; + return options; + } + if (this.TryGetLastAnnotation(out var configureAnnotation)) { configureAnnotation.ConfigureDeploymentOptions(options); diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectBuilderExtensions.cs index 1182aff1..7d36bff2 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectBuilderExtensions.cs @@ -142,6 +142,34 @@ internal static IResourceBuilder InternalWithConfigureDacDeployOption .WithAnnotation(new ConfigureDacDeployOptionsAnnotation(configureDeploymentOptions)); } + /// + /// Adds a path to a publish profile for configuring dacpac deployment options to the . + /// + /// An representing the SQL Server Database project. + /// Path to the publish profile xml file + /// An that can be used to further customize the resource. + public static IResourceBuilder WithDacDeployOptions(this IResourceBuilder builder, string optionsPath) + => InternalWithDacDeployOptions(builder, optionsPath); + + /// + /// Adds a path to a publish profile for configuring dacpac deployment options to the . + /// + /// An representing the SQL Server Database project. + /// Path to the publish profile xml file + /// An that can be used to further customize the resource. + public static IResourceBuilder> WithDacDeployOptions(this IResourceBuilder> builder, string optionsPath) + where TPackage : IPackageMetadata => InternalWithDacDeployOptions(builder, optionsPath); + + internal static IResourceBuilder InternalWithDacDeployOptions(this IResourceBuilder builder, string optionsPath) + where TResource : IResourceWithDacpac + { + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + ArgumentNullException.ThrowIfNull(optionsPath); + + return builder + .WithAnnotation(new DacDeployOptionsAnnotation(optionsPath)); + } + /// /// Publishes the SQL Server Database project to the target . /// @@ -198,32 +226,68 @@ internal static IResourceBuilder InternalWithReference(thi { builder.ApplicationBuilder.Eventing.Subscribe(target.Resource, async (resourceReady, ct) => { - await RunPublish(builder, target, targetDatabaseName, resourceReady.Services, ct); + await PublishOrMark(builder, target, targetDatabaseName, resourceReady.Services, ct); }); } - else + else { - builder.ApplicationBuilder.Eventing.Subscribe(async (@event, ct) => { - await RunPublish(builder, target, targetDatabaseName, @event.Services, ct); + builder.ApplicationBuilder.Eventing.Subscribe(async (@event, ct) => + { + await PublishOrMark(builder, target, targetDatabaseName, @event.Services, ct); }); } builder.WaitFor(target); - builder.WithCommand("redeploy", "Redeploy", async (context) => + var commandOptions = new CommandOptions + { + IconName = "ArrowReset", + IconVariant = IconVariant.Filled, + IsHighlighted = true, + Description = "Deploy the SQL Server Database Project to the target database.", + UpdateState = (context) => + { + if (context.ResourceSnapshot?.State?.Text is string stateText && (stateText == KnownResourceStates.Finished || stateText == KnownResourceStates.NotStarted)) + { + return ResourceCommandState.Enabled; + } + else + { + return ResourceCommandState.Disabled; + } + }, + }; + + builder.WithCommand("deploy", "Deploy", async (context) => { var service = context.ServiceProvider.GetRequiredService(); await service.PublishSqlProject(builder.Resource, target.Resource, targetDatabaseName, context.CancellationToken); return new ExecuteCommandResult { Success = true }; - }, updateState: (context) => context.ResourceSnapshot?.State?.Text == KnownResourceStates.Finished ? ResourceCommandState.Enabled : ResourceCommandState.Disabled, - displayDescription: "Redeploys the SQL Server Database Project to the target database.", - iconName: "ArrowReset", - iconVariant: IconVariant.Filled, - isHighlighted: true); + }, commandOptions); return builder; } + private static async Task PublishOrMark(IResourceBuilder builder, IResourceBuilder target, string? targetDatabaseName, IServiceProvider services, CancellationToken ct) where TResource : IResourceWithDacpac + { + if (builder.Resource.HasAnnotationOfType()) + { + await MarkNotStarted(builder, services); + } + else + { + await RunPublish(builder, target, targetDatabaseName, services, ct); + } + } + + private static async Task MarkNotStarted(IResourceBuilder builder, IServiceProvider serviceProvider) + where TResource : IResourceWithDacpac + { + var resourceNotificationService = serviceProvider.GetRequiredService(); + await resourceNotificationService.PublishUpdateAsync(builder.Resource, + state => state with { State = new ResourceStateSnapshot(KnownResourceStates.NotStarted, KnownResourceStateStyles.Info) }); + } + private static async Task RunPublish(IResourceBuilder builder, IResourceBuilder target, string? targetDatabaseName, IServiceProvider serviceProvider, CancellationToken ct) where TResource : IResourceWithDacpac { diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectResource.cs b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectResource.cs index 61d80a63..05e54ce0 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects/SqlProjectResource.cs @@ -23,7 +23,7 @@ string IResourceWithDacpac.GetDacpacPath() var project = projectCollection.LoadProject(projectPath); - // .sqlprojx has a SqlTargetPath property, so try that first + // Microsoft.Build.Sql .sqlproj has a SqlTargetPath property, so try that first var targetPath = project.GetPropertyValue("SqlTargetPath"); if (string.IsNullOrWhiteSpace(targetPath)) { @@ -45,6 +45,19 @@ DacDeployOptions IResourceWithDacpac.GetDacpacDeployOptions() { var options = new DacDeployOptions(); + if (this.TryGetLastAnnotation(out var optionsAnnotation)) + { + var profile = DacProfile.Load(optionsAnnotation.OptionsPath); + + if (profile == null) + { + throw new InvalidOperationException($"Unable to load DacProfile from path {optionsAnnotation.OptionsPath} for resource {Name}."); + } + + options = profile.DeployOptions; + return options; + } + if (this.TryGetLastAnnotation(out var configureAnnotation)) { configureAnnotation.ConfigureDeploymentOptions(options); diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj index da87dcf2..4d6914c8 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj @@ -11,12 +11,18 @@ + + + + + + diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md index d20d1e8b..73f1ac76 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/README.md @@ -2,7 +2,7 @@ This integration contains extensions for the [SqlServer hosting package](https://nuget.org/packages/Aspire.Hosting.SqlServer) for .NET Aspire. -The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) to interact with the SqlServer database. +The integration provides support for running [DbGate](https://github.com/dbgate/dbgate) and [Adminer](https://github.com/vrana/adminer) to interact with the SqlServer database. ## Getting Started @@ -20,7 +20,8 @@ Then, in the _Program.cs_ file of `AppHost`, define an SqlServer resource, then ```csharp var sqlserver = builder.AddSqlServer("sqlserver") - .WithDbGate(); + .WithDbGate() + .WithAdminer(); ``` ## Additional Information diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs index a8e43701..56fd49ad 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/SqlServerBuilderExtensions.cs @@ -1,5 +1,6 @@ using Aspire.Hosting.ApplicationModel; using System.Text; +using System.Text.Json; namespace Aspire.Hosting; @@ -42,14 +43,53 @@ public static IResourceBuilder WithDbGate(this IResourc var dbGateBuilder = DbGateBuilderExtensions.AddDbGate(builder.ApplicationBuilder, containerName); dbGateBuilder - .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)) - .WaitFor(builder); + .WithEnvironment(context => ConfigureDbGateContainer(context, builder.ApplicationBuilder)); configureContainer?.Invoke(dbGateBuilder); return builder; } + /// + /// Adds an administration and development platform for SqlServer to the application model using Adminer. + /// + /// + /// This version of the package defaults to the tag of the container image. + /// The SqlServer server resource builder. + /// Configuration callback for Adminer container resource. + /// The name of the container (Optional). + /// + /// Use in application host with a SqlServer resource + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// + /// var sqlserver = builder.AddSqlServer("sqlserver") + /// .WithAdminer(); + /// var db = sqlserver.AddDatabase("db"); + /// + /// var api = builder.AddProject<Projects.Api>("api") + /// .WithReference(db); + /// + /// builder.Build().Run(); + /// + /// + /// + /// A reference to the . + public static IResourceBuilder WithAdminer(this IResourceBuilder builder, Action>? configureContainer = null, string? containerName = null) + { + ArgumentNullException.ThrowIfNull(builder); + + containerName ??= $"{builder.Resource.Name}-adminer"; + var adminerBuilder = AdminerBuilderExtensions.AddAdminer(builder.ApplicationBuilder, containerName); + + adminerBuilder + .WithEnvironment(context => ConfigureAdminerContainer(context, builder.ApplicationBuilder)); + + configureContainer?.Invoke(adminerBuilder); + + return builder; + } + private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) { var sqlServerInstances = applicationBuilder.Resources.OfType(); @@ -94,4 +134,45 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context, } } } + + private static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder) + { + var sqlServerInstances = applicationBuilder.Resources.OfType(); + + string ADMINER_SERVERS = context.EnvironmentVariables.GetValueOrDefault("ADMINER_SERVERS")?.ToString() ?? string.Empty; + + var new_servers = sqlServerInstances.ToDictionary( + sqlServerServerResource => sqlServerServerResource.Name, + sqlServerServerResource => + { + return new AdminerLoginServer + { + Server = sqlServerServerResource.Name, + UserName = "sa", + Password = sqlServerServerResource.PasswordParameter.Value, + Driver = "mssql" + }; + }); + + if (string.IsNullOrEmpty(ADMINER_SERVERS)) + { + string servers_json = JsonSerializer.Serialize(new_servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + else + { + var servers = JsonSerializer.Deserialize>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen."); + foreach (var server in new_servers) + { + if (!servers.ContainsKey(server.Key)) + { + servers!.Add(server.Key, server.Value); + } + } + string servers_json = JsonSerializer.Serialize(servers); + context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json; + } + + } + } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/api/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.cs b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/api/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.cs index 3df0da38..0e9698cf 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/api/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/api/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.cs @@ -10,6 +10,8 @@ namespace Aspire.Hosting { public static partial class SqlServerBuilderExtensions { + public static ApplicationModel.IResourceBuilder WithAdminer(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } + public static ApplicationModel.IResourceBuilder WithDbGate(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.Sqlite/CommunityToolkit.Aspire.Hosting.Sqlite.csproj b/src/CommunityToolkit.Aspire.Hosting.Sqlite/CommunityToolkit.Aspire.Hosting.Sqlite.csproj index f7207c2b..f5f5de33 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Sqlite/CommunityToolkit.Aspire.Hosting.Sqlite.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.Sqlite/CommunityToolkit.Aspire.Hosting.Sqlite.csproj @@ -11,8 +11,4 @@ - - - - diff --git a/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResource.cs b/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResource.cs index de555164..5da7586d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResource.cs @@ -1,6 +1,3 @@ -using Microsoft.Extensions.Hosting; -using System.Text.Json; - namespace Aspire.Hosting.ApplicationModel; /// @@ -18,18 +15,6 @@ public class SqliteResource(string name, string databasePath, string databaseFil internal string DatabaseFilePath => Path.Combine(DatabasePath, DatabaseFileName); /// - public ReferenceExpression ConnectionStringExpression => ReferenceExpression.Create($"Data Source={DatabaseFilePath};Cache=Shared;Mode=ReadWriteCreate;Extensions={JsonSerializer.Serialize(Extensions)}"); - - private readonly List extensions = []; - - /// - /// Gets the extensions to be loaded into the database. - /// - /// - /// Extensions are not loaded by the hosting integration, the information is provided for the client to load the extensions. - /// - public IReadOnlyCollection Extensions => extensions; - - internal void AddExtension(SqliteExtensionMetadata extension) => extensions.Add(extension); + public ReferenceExpression ConnectionStringExpression => ReferenceExpression.Create($"Data Source={DatabaseFilePath};Cache=Shared;Mode=ReadWriteCreate"); } diff --git a/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResourceBuilderExtensions.cs index 291cf02f..8b86be72 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Sqlite/SqliteResourceBuilderExtensions.cs @@ -1,5 +1,4 @@ using Aspire.Hosting.ApplicationModel; -using System.Diagnostics.CodeAnalysis; namespace Aspire.Hosting; @@ -16,7 +15,6 @@ public static class SqliteResourceBuilderExtensions /// The optional path to the database file. If no path is provided the database is stored in a temporary location. /// The filename of the database file. Must include extension. If no file name is provided, a randomly generated file name is used. /// A resource builder for the Sqlite resource. - /// The Sqlite resource is excluded from the manifest. public static IResourceBuilder AddSqlite(this IDistributedApplicationBuilder builder, [ResourceName] string name, string? databasePath = null, string? databaseFileName = null) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); @@ -56,8 +54,7 @@ public static IResourceBuilder AddSqlite(this IDistributedApplic ] }; return builder.AddResource(resource) - .WithInitialState(state) - .ExcludeFromManifest(); + .WithInitialState(state); } /// @@ -83,58 +80,12 @@ public static IResourceBuilder WithSqliteWeb(this IResourceBuild .WithBindMount(builder.Resource.DatabasePath, "/data") .WaitFor(builder) .WithHttpHealthCheck("/") - .WithParentRelationship(builder.Resource) - .ExcludeFromManifest(); + .WithParentRelationship(builder.Resource); configureContainer?.Invoke(resourceBuilder); return builder; } - /// - /// Adds an extension to the Sqlite resource that will be loaded from a NuGet package. - /// - /// The resource builder. - /// The name of the extension file with to add, eg: vec0, without file extension. - /// The name of the NuGet package. If this is set to null, the value of is used. - /// The resource builder. - /// - /// Extensions are not loaded by the hosting integration, the information is provided for the client to load the extensions. - /// - /// This extension is experimental while the final design of extension loading is decided. - /// - [Experimental("CTASPIRE002", UrlFormat = "https://aka.ms/communitytoolkit/aspire/diagnostics#{0}")] - public static IResourceBuilder WithNuGetExtension(this IResourceBuilder builder, string extension, string? packageName = null) - { - ArgumentNullException.ThrowIfNull(builder, nameof(builder)); - ArgumentException.ThrowIfNullOrEmpty(extension, nameof(extension)); - - builder.Resource.AddExtension(new(extension, packageName ?? extension, IsNuGetPackage: true, ExtensionFolder: null)); - - return builder; - } - /// - /// Adds an extension to the Sqlite resource that will be loaded from a local path. - /// - /// The resource builder. - /// The name of the extension file with to add, eg: vec0, without file extension. - /// The path to the extension file. - /// The resource builder. - /// - /// Extensions are not loaded by the hosting integration, the information is provided for the client to load the extensions. - /// - /// This extension is experimental while the final design of extension loading is decided. - /// - [Experimental("CTASPIRE002", UrlFormat = "https://aka.ms/communitytoolkit/aspire/diagnostics#{0}")] - public static IResourceBuilder WithLocalExtension(this IResourceBuilder builder, string extension, string extensionPath) - { - ArgumentNullException.ThrowIfNull(builder, nameof(builder)); - ArgumentException.ThrowIfNullOrEmpty(extension, nameof(extension)); - ArgumentException.ThrowIfNullOrEmpty(extensionPath, nameof(extensionPath)); - - builder.Resource.AddExtension(new(extension, PackageName: null, IsNuGetPackage: false, extensionPath)); - - return builder; - } } diff --git a/src/CommunityToolkit.Aspire.Hosting.Sqlite/api/CommunityToolkit.Aspire.Hosting.Sqlite.cs b/src/CommunityToolkit.Aspire.Hosting.Sqlite/api/CommunityToolkit.Aspire.Hosting.Sqlite.cs index b16b1f21..61d0c037 100644 --- a/src/CommunityToolkit.Aspire.Hosting.Sqlite/api/CommunityToolkit.Aspire.Hosting.Sqlite.cs +++ b/src/CommunityToolkit.Aspire.Hosting.Sqlite/api/CommunityToolkit.Aspire.Hosting.Sqlite.cs @@ -12,12 +12,6 @@ public static partial class SqliteResourceBuilderExtensions { public static ApplicationModel.IResourceBuilder AddSqlite(this IDistributedApplicationBuilder builder, string name, string? databasePath = null, string? databaseFileName = null) { throw null; } - [System.Diagnostics.CodeAnalysis.Experimental("CTASPIRE002", UrlFormat = "https://aka.ms/communitytoolkit/aspire/diagnostics#{0}")] - public static ApplicationModel.IResourceBuilder WithLocalExtension(this ApplicationModel.IResourceBuilder builder, string extension, string extensionPath) { throw null; } - - [System.Diagnostics.CodeAnalysis.Experimental("CTASPIRE002", UrlFormat = "https://aka.ms/communitytoolkit/aspire/diagnostics#{0}")] - public static ApplicationModel.IResourceBuilder WithNuGetExtension(this ApplicationModel.IResourceBuilder builder, string extension, string? packageName = null) { throw null; } - public static ApplicationModel.IResourceBuilder WithSqliteWeb(this ApplicationModel.IResourceBuilder builder, System.Action>? configureContainer = null, string? containerName = null) { throw null; } } } @@ -29,8 +23,6 @@ public partial class SqliteResource : Resource, IResourceWithConnectionString, I public SqliteResource(string name, string databasePath, string databaseFileName) : base(default!) { } public ReferenceExpression ConnectionStringExpression { get { throw null; } } - - public System.Collections.Generic.IReadOnlyCollection Extensions { get { throw null; } } } public partial class SqliteWebResource : ContainerResource, IResourceWithConnectionString, IResource, IManifestExpressionProvider, IValueProvider, IValueWithReferences @@ -41,11 +33,4 @@ public SqliteWebResource(string name) : base(default!, default) { } public EndpointReference PrimaryEndpoint { get { throw null; } } } -} - -namespace Microsoft.Extensions.Hosting -{ - public partial record SqliteExtensionMetadata(string Extension, string? PackageName, bool IsNuGetPackage, string? ExtensionFolder) - { - } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.k6/api/CommunityToolkit.Aspire.Hosting.k6.cs b/src/CommunityToolkit.Aspire.Hosting.k6/api/CommunityToolkit.Aspire.Hosting.k6.cs new file mode 100644 index 00000000..cd1d8707 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.k6/api/CommunityToolkit.Aspire.Hosting.k6.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace Aspire.Hosting +{ + public static partial class K6BuilderExtensions + { + public static ApplicationModel.IResourceBuilder AddK6(this IDistributedApplicationBuilder builder, string name, bool enableBrowserExtensions = false, int? port = null) { throw null; } + + public static ApplicationModel.IResourceBuilder WithK6OtlpEnvironment(this ApplicationModel.IResourceBuilder builder) { throw null; } + + public static ApplicationModel.IResourceBuilder WithScript(this ApplicationModel.IResourceBuilder builder, string scriptPath, int virtualUsers = 10, string duration = "30s") { throw null; } + } +} + +namespace Aspire.Hosting.ApplicationModel +{ + public partial class K6Resource : ContainerResource + { + public K6Resource(string name) : base(default!, default) { } + + public EndpointReference PrimaryEndpoint { get { throw null; } } + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/AspireSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/AspireSqliteExtensions.cs index 7ad5be49..4b098258 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/AspireSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/AspireSqliteExtensions.cs @@ -3,13 +3,8 @@ using Microsoft.Data.Sqlite; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.Diagnostics.HealthChecks; -using Microsoft.Extensions.Logging; using System.Data.Common; -using System.Runtime.InteropServices; -using System.Text.Json; -using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment; namespace Microsoft.Extensions.Hosting; @@ -67,15 +62,6 @@ private static void AddSqliteClient( settings.ConnectionString = connectionString; } - if (!string.IsNullOrEmpty(settings.ConnectionString)) - { - var cbs = new DbConnectionStringBuilder { ConnectionString = settings.ConnectionString }; - if (cbs.TryGetValue("Extensions", out var extensions)) - { - settings.Extensions = JsonSerializer.Deserialize>((string)extensions) ?? []; - } - } - configureSettings?.Invoke(settings); builder.RegisterSqliteServices(settings, connectionName, serviceKey); @@ -115,181 +101,8 @@ private static void RegisterSqliteServices( SqliteConnection CreateConnection(IServiceProvider sp, object? key) { - var logger = sp.GetRequiredService>(); ConnectionStringValidation.ValidateConnectionString(settings.ConnectionString, connectionName, DefaultConfigSectionName); - var csb = new DbConnectionStringBuilder { ConnectionString = settings.ConnectionString }; - if (csb.ContainsKey("Extensions")) - { - csb.Remove("Extensions"); - } - var connection = new SqliteConnection(csb.ConnectionString); - - foreach (var extension in settings.Extensions) - { - if (extension.IsNuGetPackage) - { - if (string.IsNullOrEmpty(extension.PackageName)) - { - throw new InvalidOperationException("PackageName is required when loading an extension from a NuGet package."); - } - - EnsureLoadableFromNuGet(extension.Extension, extension.PackageName, logger); - } - else - { - if (string.IsNullOrEmpty(extension.ExtensionFolder)) - { - throw new InvalidOperationException("ExtensionFolder is required when loading an extension from a folder."); - } - - EnsureLoadableFromLocalPath(extension.Extension, extension.ExtensionFolder); - } - connection.LoadExtension(extension.Extension); - } - - return connection; - } - } - - // Adapted from https://github.com/dotnet/docs/blob/dbbeda13bf016a6ff76b0baab1488c927a64ff24/samples/snippets/standard/data/sqlite/ExtensionsSample/Program.cs#L40 - internal static void EnsureLoadableFromNuGet(string package, string library, ILogger logger) - { - var runtimeLibrary = DependencyContext.Default?.RuntimeLibraries.FirstOrDefault(l => l.Name == package); - if (runtimeLibrary is null) - { - logger.LogInformation("Could not find the runtime library for package {Package}", package); - return; - } - - string sharedLibraryExtension; - string pathVariableName = "PATH"; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - sharedLibraryExtension = ".dll"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - sharedLibraryExtension = ".so"; - pathVariableName = "LD_LIBRARY_PATH"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - sharedLibraryExtension = ".dylib"; - pathVariableName = "DYLD_LIBRARY_PATH"; - } - else - { - throw new NotSupportedException("Unsupported OS platform"); - } - - var candidateAssets = new Dictionary<(string? Package, string Asset), int>(); - var rid = RuntimeEnvironment.GetRuntimeIdentifier(); - var rids = DependencyContext.Default?.RuntimeGraph.First(g => g.Runtime == rid).Fallbacks.ToList() ?? []; - rids.Insert(0, rid); - - logger.LogInformation("Looking for {Library} in {Package} runtime assets", library, package); - logger.LogInformation("Possible runtime identifiers: {Rids}", string.Join(", ", rids)); - - foreach (var group in runtimeLibrary.NativeLibraryGroups) - { - foreach (var file in group.RuntimeFiles) - { - if (string.Equals( - Path.GetFileName(file.Path), - library + sharedLibraryExtension, - StringComparison.OrdinalIgnoreCase)) - { - var fallbacks = rids.IndexOf(group.Runtime); - if (fallbacks != -1) - { - logger.LogInformation("Found {Library} in {Package} runtime assets at {Path}", library, package, file.Path); - candidateAssets.Add((runtimeLibrary.Path, file.Path), fallbacks); - } - } - } - } - - var assetPath = candidateAssets - .OrderBy(p => p.Value) - .Select(p => p.Key) - .FirstOrDefault(); - if (assetPath != default) - { - string? assetDirectory = null; - if (File.Exists(Path.Combine(AppContext.BaseDirectory, assetPath.Asset))) - { - // NB: Framework-dependent deployments copy assets to the application base directory - assetDirectory = Path.Combine( - AppContext.BaseDirectory, - Path.GetDirectoryName(assetPath.Asset.Replace('/', Path.DirectorySeparatorChar))!); - - logger.LogInformation("Found {Library} in {Package} runtime assets at {Path}", library, package, assetPath.Asset); - } - else - { - string? assetFullPath = null; - var probingDirectories = ((string?)AppDomain.CurrentDomain.GetData("PROBING_DIRECTORIES"))? - .Split(Path.PathSeparator) ?? []; - foreach (var directory in probingDirectories) - { - var candidateFullPath = Path.Combine( - directory, - assetPath.Package ?? "", - assetPath.Asset); - if (File.Exists(candidateFullPath)) - { - assetFullPath = candidateFullPath; - } - } - - assetDirectory = Path.GetDirectoryName(assetFullPath); - logger.LogInformation("Found {Library} in {Package} runtime assets at {Path} (using PROBING_DIRECTORIES: {ProbingDirectories})", library, package, assetFullPath, string.Join(",", probingDirectories)); - } - - var path = new HashSet(Environment.GetEnvironmentVariable(pathVariableName)!.Split(Path.PathSeparator)); - - if (assetDirectory is not null && path.Add(assetDirectory)) - { - logger.LogInformation("Adding {AssetDirectory} to {PathVariableName}", assetDirectory, pathVariableName); - Environment.SetEnvironmentVariable(pathVariableName, string.Join(Path.PathSeparator, path)); - logger.LogInformation("Set {PathVariableName} to: {PathVariableValue}", pathVariableName, Environment.GetEnvironmentVariable(pathVariableName)); - } - } - else - { - logger.LogInformation("Could not find {Library} in {Package} runtime assets", library, package); - } - } - - internal static void EnsureLoadableFromLocalPath(string library, string assetDirectory) - { - string sharedLibraryExtension; - string pathVariableName = "PATH"; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - sharedLibraryExtension = ".dll"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - sharedLibraryExtension = ".so"; - pathVariableName = "LD_LIBRARY_PATH"; - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - sharedLibraryExtension = ".dylib"; - pathVariableName = "DYLD_LIBRARY_PATH"; - } - else - { - throw new NotSupportedException("Unsupported OS platform"); - } - - if (File.Exists(Path.Combine(assetDirectory, library + sharedLibraryExtension))) - { - var path = new HashSet(Environment.GetEnvironmentVariable(pathVariableName)!.Split(Path.PathSeparator)); - - if (assetDirectory is not null && path.Add(assetDirectory)) - Environment.SetEnvironmentVariable(pathVariableName, string.Join(Path.PathSeparator, path)); + return new SqliteConnection(settings.ConnectionString); } } } diff --git a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj index d28599b0..89c1f298 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj +++ b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj @@ -8,8 +8,6 @@ - - @@ -18,7 +16,6 @@ - diff --git a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/SqliteConnectionSettings.cs b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/SqliteConnectionSettings.cs index 8be5716c..b58fccda 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/SqliteConnectionSettings.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/SqliteConnectionSettings.cs @@ -17,9 +17,4 @@ public sealed class SqliteConnectionSettings /// The default value is . /// public bool DisableHealthChecks { get; set; } - - /// - /// Extensions to be loaded into the database. - /// - public IEnumerable Extensions { get; set; } = []; } diff --git a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/api/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.cs b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/api/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.cs index b51f4dfa..6a6e2018 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/api/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/api/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.cs @@ -20,11 +20,5 @@ public sealed partial class SqliteConnectionSettings public string? ConnectionString { get { throw null; } set { } } public bool DisableHealthChecks { get { throw null; } set { } } - - public System.Collections.Generic.IEnumerable Extensions { get { throw null; } set { } } - } - - public partial record SqliteExtensionMetadata(string Extension, string? PackageName, bool IsNuGetPackage, string? ExtensionFolder) - { } } \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs index 47e7719e..126d476a 100644 --- a/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs +++ b/src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/AspireEFSqliteExtensions.cs @@ -3,7 +3,6 @@ using Microsoft.EntityFrameworkCore.Diagnostics.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using System.Data.Common; using System.Diagnostics.CodeAnalysis; namespace Microsoft.Extensions.Hosting; @@ -69,13 +68,7 @@ void ConfigureDbContext(DbContextOptionsBuilder dbContextOptionsBuilder) // delay validating the ConnectionString until the DbContext is requested. This ensures an exception doesn't happen until a Logger is established. ConnectionStringValidation.ValidateConnectionString(settings.ConnectionString, name, DefaultConfigSectionName, $"{DefaultConfigSectionName}:{typeof(TContext).Name}", isEfDesignTime: EF.IsDesignTime); - var csb = new DbConnectionStringBuilder { ConnectionString = settings.ConnectionString }; - if (csb.ContainsKey("Extensions")) - { - csb.Remove("Extensions"); - } - - dbContextOptionsBuilder.UseSqlite(csb.ConnectionString); + dbContextOptionsBuilder.UseSqlite(settings.ConnectionString); configureDbContextOptions?.Invoke(dbContextOptionsBuilder); } } diff --git a/src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj b/src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj new file mode 100644 index 00000000..fead166e --- /dev/null +++ b/src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj @@ -0,0 +1,17 @@ + + + + minio hosting cloud storage + A .NET Aspire client integration for MinIO + enable + enable + + + + + + + + + + diff --git a/src/CommunityToolkit.Aspire.Minio.Client/MinioClientBuilderExtensionMethods.cs b/src/CommunityToolkit.Aspire.Minio.Client/MinioClientBuilderExtensionMethods.cs new file mode 100644 index 00000000..464e210b --- /dev/null +++ b/src/CommunityToolkit.Aspire.Minio.Client/MinioClientBuilderExtensionMethods.cs @@ -0,0 +1,100 @@ +using CommunityToolkit.Aspire.Minio.Client; +using Minio; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; + +namespace Microsoft.Extensions.Hosting; + +/// +/// Provides extension methods for registering MinIO-related services in an . +/// +public static class MinioClientBuilderExtensionMethods +{ + private const string DefaultConfigSectionName = "Aspire:Minio:Client"; + + /// + /// Adds MinIO Client to ASPNet host + /// + /// The used to add services. + /// Name of the configuration settings section + /// The connection name to use to find a connection string. + /// An optional delegate that can be used for customizing options. It is invoked after the settings are read from the configuration. + public static void AddMinioClient( + this IHostApplicationBuilder builder, + string? connectionName = null, + string? configurationSectionName = DefaultConfigSectionName, + Action? configureSettings = null) + { + ArgumentNullException.ThrowIfNull(builder); + + var settings = GetMinioClientSettings(builder, connectionName, configurationSectionName, configureSettings); + + builder.AddMinioInternal(settings); + } + + private static void AddMinioInternal(this IHostApplicationBuilder builder, MinioClientSettings settings) + { + ArgumentNullException.ThrowIfNull(settings); + + // Add the MinIO client to the service collection. + void ConfigureClient(IMinioClient configureClient) + { + var client = configureClient.WithEndpoint(settings.Endpoint) + .WithSSL(settings.UseSsl); + + if (settings.Credentials is not null) client.WithCredentials(settings.Credentials.AccessKey, settings.Credentials.SecretKey); + + if (settings.UserAgentHeaderInfo is not null) client.SetAppInfo(settings.UserAgentHeaderInfo.AppName, settings.UserAgentHeaderInfo.AppVersion); + + if (settings.SetTraceOn) + client.SetTraceOn(); + else + client.SetTraceOff(); + } + + var minioClientFactory = new MinioClientFactory(ConfigureClient); + builder.Services.TryAddSingleton(minioClientFactory); + + IMinioClient GetClient() + { + if (settings.Endpoint is null) + throw new InvalidOperationException("The MinIO endpoint must be provided either in configuration section, or as a part of connection string or settings delegate"); + + return minioClientFactory.CreateClient(); + } + + switch (settings.ServiceLifetime) + { + case ServiceLifetime.Singleton: + builder.Services.TryAddSingleton(_ => GetClient()); + break; + case ServiceLifetime.Scoped: + builder.Services.TryAddScoped(_ => GetClient()); + break; + case ServiceLifetime.Transient: + builder.Services.TryAddTransient(_ => GetClient()); + break; + } + } + + private static MinioClientSettings GetMinioClientSettings(IHostApplicationBuilder builder, + string? connectionName, + string? configurationSectionName, + Action? configureSettings) + { + var settings = new MinioClientSettings(); + + builder.Configuration.Bind(configurationSectionName ?? DefaultConfigSectionName, settings); + + if (!string.IsNullOrEmpty(connectionName) && + builder.Configuration.GetConnectionString(connectionName) is string connectionString) + { + settings.ParseConnectionString(connectionString); + } + + configureSettings?.Invoke(settings); + + return settings; + } +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Minio.Client/MinioClientSettings.cs b/src/CommunityToolkit.Aspire.Minio.Client/MinioClientSettings.cs new file mode 100644 index 00000000..442a4726 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Minio.Client/MinioClientSettings.cs @@ -0,0 +1,108 @@ +using Microsoft.Extensions.DependencyInjection; +using Minio; +using System.Data.Common; + +namespace CommunityToolkit.Aspire.Minio.Client; + +/// +/// MinIO client configuration +/// +public sealed class MinioClientSettings +{ + private const string ConnectionStringEndpoint = "Endpoint"; + private const string AccessKey = "AccessKey"; + private const string SecretKey = "SecretKey"; + + /// + /// Endpoint URL + /// + public Uri? Endpoint { get; set; } + + /// + public MinioCredentials? Credentials { get; set; } + + /// + /// Use ssl connection + /// + public bool UseSsl { get; set; } = false; + + /// + public HeaderAppInformation? UserAgentHeaderInfo { get; set; } + + /// + /// MinIO client service lifetime + /// + public ServiceLifetime ServiceLifetime = ServiceLifetime.Singleton; + + /// + /// Turn on tracing. + /// Isn't aspire tracing compatible yet. + /// + public bool SetTraceOn { get; set; } = false; + + internal void ParseConnectionString(string? connectionString) + { + if (Uri.TryCreate(connectionString, UriKind.Absolute, out var uri)) + { + Endpoint = uri; + } + else + { + var connectionBuilder = new DbConnectionStringBuilder + { + ConnectionString = connectionString + }; + + if (connectionBuilder.TryGetValue(ConnectionStringEndpoint, out var endpoint) + && + Uri.TryCreate(endpoint.ToString(), UriKind.Absolute, out var serviceUri)) + { + Endpoint = serviceUri; + } + + if (connectionBuilder.TryGetValue(AccessKey, out var accessKey) + && + connectionBuilder.TryGetValue(SecretKey, out var secretKey) + && + !string.IsNullOrEmpty(accessKey.ToString()) && !string.IsNullOrEmpty(secretKey.ToString())) + { + Credentials = new MinioCredentials + { + AccessKey = accessKey.ToString()!, SecretKey = secretKey.ToString()! + }; + } + } + } +} + +/// +/// Sets app version and name. Used for constructing User-Agent header in all HTTP requests +/// +public class HeaderAppInformation +{ + /// + /// Set app name for MinioClient + /// + public string AppName { get; set; } = "CommunityToolkit.Aspire.Minio.Client"; + + /// + /// SetAppVersion for MinioClient + /// + public string AppVersion { get; set; } = "1.0"; +} + +/// +/// MinIO credentials (access and secret keys) +/// +public class MinioCredentials +{ + /// + /// MinIO Access Key + /// + public string AccessKey { get; set; } = string.Empty; + + /// + /// MinIO Secret Key + /// + public string SecretKey { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Minio.Client/README.md b/src/CommunityToolkit.Aspire.Minio.Client/README.md new file mode 100644 index 00000000..0e5bd765 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Minio.Client/README.md @@ -0,0 +1,119 @@ +# CommunityToolkit.Aspire.Minio.Client + +Registers a [MinIOClient](https://github.com/minio/minio-dotnet) in the DI container for connecting to MinIO. + +## Getting started + +### Prerequisites + +- MinIO or other S3-compatible storage. + +### Install the package + +Install the .NET Aspire MinIO Client library with [NuGet](https://www.nuget.org): + +```dotnetcli +dotnet add package CommunityToolkit.Aspire.Minio.Client +``` + +## Usage example + +In the _Program.cs_ file of your project, call the `AddMinioClient` extension method to register a `MinioClient` for use via the dependency injection container. The method takes a connection name parameter. + +```csharp +builder.AddMinioClient("minio"); +``` + +## Configuration + +The .NET Aspire MinIO Client integration provides multiple options to configure the server connection based on the requirements and conventions of your project. + +### Use a connection string + +When using a connection string from the `ConnectionStrings` configuration section, you can provide the name of the connection string when calling `builder.AddMinioClient()`: + +```csharp +builder.AddMinioClient("minio"); +``` + +And then the connection string will be retrieved from the `ConnectionStrings` configuration section: + +```json +{ + "ConnectionStrings": { + "minio": "Endpoint=http://localhost:9001/;AccessKey=minioAdmin;SecretKey=minioAdmin" + } +} +``` + +### Use configuration providers + +The .NET Aspire MinIO Client integration supports [Microsoft.Extensions.Configuration](https://learn.microsoft.com/dotnet/api/microsoft.extensions.configuration). +It loads the `MinioClientSettings` from configuration by using the `Aspire:Minio:Client` key. +This key can be overriden by using the `configurationSectionName` method parameter. +Example `appsettings.json` that configures some of the options: + +```json +{ + "Aspire": { + "Minio": { + "Client": { + "Endpoint": "http://localhost:9001/", + "AccessKey": "minioAdmin", + "SecretKey": "minioAdmin" + } + } + } +} +``` + +### Use inline delegates + +Also you can pass the `Action configureSettings` delegate to set up some or all the options inline, for example to set the API key from code: + +```csharp +builder.AddMinioClient("minio", configureSettings: settings => settings.SecretKey = "minioAdmin"); +``` + +## AppHost extensions + +In your AppHost project, install the `CommunityToolkit.Aspire.Hosting.Minio` library with [NuGet](https://www.nuget.org): + +```dotnetcli +dotnet add package CommunityToolkit.Aspire.Hosting.Minio +``` + +Then, in the _Program.cs_ file of `AppHost`, register a MinIO host and consume the connection using the following methods: + +```csharp +var minio = builder.AddMinioContainer("minio"); + +var myService = builder.AddProject() + .WithReference(minio); +``` + +The `WithReference` method configures a connection in the `MyService` project named `minio`. +In the _Program.cs_ file of `MyService`, the MinIO connection can be consumed using: + +```csharp +builder.AddMinioClient("minio"); +``` + +Then, in your service, inject `IMinioClient` and use it to interact with the MinIO or other S3 compatible API: + +```csharp +public class MyService(IMinioClient minioClient) +{ + // ... +} +``` + +## Additional documentation + +- https://github.com/minio/minio-dotnet +- https://min.io/docs/minio/linux/developers/dotnet/minio-dotnet.html + +## Feedback & contributing + +https://github.com/CommunityToolkit/Aspire + diff --git a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaApiClientBuilder.cs b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaApiClientBuilder.cs index fa6609e7..8d0f6e82 100644 --- a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaApiClientBuilder.cs +++ b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaApiClientBuilder.cs @@ -8,7 +8,7 @@ namespace Microsoft.Extensions.Hosting; /// The with which services are being registered. /// The service key used to register the service, if any. /// A flag to indicate whether tracing should be disabled. -public class AspireOllamaApiClientBuilder(IHostApplicationBuilder hostBuilder, string serviceKey, bool disableTracing) +public class AspireOllamaApiClientBuilder(IHostApplicationBuilder hostBuilder, object serviceKey, bool disableTracing) { /// /// The host application builder used to configure the application. @@ -18,7 +18,7 @@ public class AspireOllamaApiClientBuilder(IHostApplicationBuilder hostBuilder, s /// /// Gets the service key used to register the service, if any. /// - public string ServiceKey { get; } = serviceKey; + public object ServiceKey { get; } = serviceKey; /// /// Gets a flag indicating whether tracing should be disabled. diff --git a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaChatClientExtensions.cs b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaChatClientExtensions.cs index ea7a8b53..adccd168 100644 --- a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaChatClientExtensions.cs +++ b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaChatClientExtensions.cs @@ -32,10 +32,25 @@ public static ChatClientBuilder AddKeyedChatClient( this AspireOllamaApiClientBuilder builder) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); - ArgumentException.ThrowIfNullOrEmpty(builder.ServiceKey, nameof(builder.ServiceKey)); + + return builder.AddKeyedChatClient(builder.ServiceKey); + } + + /// + /// Registers a keyed singleton in the services provided by the using the specified service key. + /// + /// An . + /// The service key to use for registering the . + /// A that can be used to build a pipeline around the inner . + public static ChatClientBuilder AddKeyedChatClient( + this AspireOllamaApiClientBuilder builder, + object serviceKey) + { + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + ArgumentNullException.ThrowIfNull(serviceKey, nameof(serviceKey)); return builder.HostBuilder.Services.AddKeyedChatClient( - builder.ServiceKey, + serviceKey, services => CreateInnerChatClient(services, builder)); } diff --git a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaEmbeddingGeneratorExtensions.cs b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaEmbeddingGeneratorExtensions.cs index d7b11ee7..b68bf33e 100644 --- a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaEmbeddingGeneratorExtensions.cs +++ b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaEmbeddingGeneratorExtensions.cs @@ -31,10 +31,24 @@ public static EmbeddingGeneratorBuilder> AddKeyedEmbedd this AspireOllamaApiClientBuilder builder) { ArgumentNullException.ThrowIfNull(builder, nameof(builder)); - ArgumentException.ThrowIfNullOrEmpty(builder.ServiceKey, nameof(builder.ServiceKey)); + return builder.AddKeyedEmbeddingGenerator(builder.ServiceKey); + } + + /// + /// Registers a keyed singleton in the services provided by the using the specified service key. + /// + /// An . + /// The service key to use for registering the . + /// A that can be used to build a pipeline around the inner . + public static EmbeddingGeneratorBuilder> AddKeyedEmbeddingGenerator( + this AspireOllamaApiClientBuilder builder, + object serviceKey) + { + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + ArgumentNullException.ThrowIfNull(serviceKey, nameof(serviceKey)); return builder.HostBuilder.Services.AddKeyedEmbeddingGenerator( - builder.ServiceKey, + serviceKey, services => CreateInnerEmbeddingGenerator(services, builder)); } diff --git a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaSharpExtensions.cs b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaSharpExtensions.cs index 88da797c..6287f94c 100644 --- a/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaSharpExtensions.cs +++ b/src/CommunityToolkit.Aspire.OllamaSharp/AspireOllamaSharpExtensions.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.AI; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using OllamaSharp; using System.Data.Common; @@ -43,6 +42,37 @@ public static AspireOllamaApiClientBuilder AddKeyedOllamaApiClient(this IHostApp return AddOllamaClientInternal(builder, $"{DefaultConfigSectionName}:{connectionName}", connectionName, serviceKey: connectionName, configureSettings: configureSettings); } + /// + /// Adds services to the container using the specified . + /// + /// The to read config from and add services to. + /// A unique key that identifies this instance of the Ollama client service. + /// A name used to retrieve the connection string from the ConnectionStrings configuration section. + /// An optional delegate that can be used for customizing options. It's invoked after the settings are read from the configuration. + /// Thrown when no Ollama endpoint is provided. + public static AspireOllamaApiClientBuilder AddKeyedOllamaApiClient(this IHostApplicationBuilder builder, object serviceKey, string connectionName, Action? configureSettings = null) + { + ArgumentNullException.ThrowIfNull(serviceKey, nameof(serviceKey)); + ArgumentException.ThrowIfNullOrWhiteSpace(connectionName, nameof(connectionName)); + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + return AddOllamaClientInternal(builder, $"{DefaultConfigSectionName}:{connectionName}", connectionName, serviceKey: serviceKey, configureSettings: configureSettings); + } + + /// + /// Adds services to the container using the specified . + /// + /// The to read config from and add services to. + /// A unique key that identifies this instance of the Ollama client service. + /// The settings required to configure the . + /// Thrown when no Ollama endpoint is provided. + public static AspireOllamaApiClientBuilder AddKeyedOllamaApiClient(this IHostApplicationBuilder builder, object serviceKey, OllamaSharpSettings settings) + { + ArgumentNullException.ThrowIfNull(serviceKey, nameof(serviceKey)); + ArgumentNullException.ThrowIfNull(builder, nameof(builder)); + ArgumentNullException.ThrowIfNull(settings, nameof(settings)); + return AddOllamaClientInternal(builder, DefaultConfigSectionName, serviceKey.ToString() ?? "default", serviceKey: serviceKey, configureSettings: null, settings: settings); + } + /// /// Adds and services to the container. /// @@ -105,11 +135,15 @@ private static AspireOllamaApiClientBuilder AddOllamaClientInternal( IHostApplicationBuilder builder, string configurationSectionName, string connectionName, - string? serviceKey = null, - Action? configureSettings = null) + object? serviceKey = null, + Action? configureSettings = null, + OllamaSharpSettings? settings = null) { - OllamaSharpSettings settings = new(); - builder.Configuration.GetSection(configurationSectionName).Bind(settings); + settings ??= new(); + if (string.IsNullOrEmpty(settings.Endpoint?.ToString())) + { + builder.Configuration.GetSection(configurationSectionName).Bind(settings); + } if (builder.Configuration.GetConnectionString(connectionName) is string connectionString) { diff --git a/src/CommunityToolkit.Aspire.OllamaSharp/CommunityToolkit.Aspire.OllamaSharp.csproj b/src/CommunityToolkit.Aspire.OllamaSharp/CommunityToolkit.Aspire.OllamaSharp.csproj index e298ec83..2170bccb 100644 --- a/src/CommunityToolkit.Aspire.OllamaSharp/CommunityToolkit.Aspire.OllamaSharp.csproj +++ b/src/CommunityToolkit.Aspire.OllamaSharp/CommunityToolkit.Aspire.OllamaSharp.csproj @@ -3,7 +3,6 @@ A .NET Aspire client integration for the OllamaSharp library. ollama ai ollamasharp client - true diff --git a/src/Shared/Adminer/AdminerLoginServer.cs b/src/Shared/Adminer/AdminerLoginServer.cs new file mode 100644 index 00000000..83d3eda9 --- /dev/null +++ b/src/Shared/Adminer/AdminerLoginServer.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; + +internal class AdminerLoginServer +{ + [JsonPropertyName("server")] + public string? Server { get; set; } + + [JsonPropertyName("username")] + public string? UserName { get; set; } + + [JsonPropertyName("password")] + public string? Password { get; set; } + + [JsonPropertyName("driver")] + public string? Driver { get; set; } +} \ No newline at end of file diff --git a/src/Shared/Dapr/Core/IDistributedApplicationBuilderExtensions.shared.cs b/src/Shared/Dapr/Core/IDistributedApplicationBuilderExtensions.shared.cs index 1e288de3..1c0922ad 100644 --- a/src/Shared/Dapr/Core/IDistributedApplicationBuilderExtensions.shared.cs +++ b/src/Shared/Dapr/Core/IDistributedApplicationBuilderExtensions.shared.cs @@ -33,7 +33,7 @@ public static IResourceBuilder AddDaprComponent(this IDi { Properties = [], ResourceType = "DaprComponent", - State = KnownResourceStates.Hidden + IsHidden = true, }) .WithAnnotation(new ManifestPublishingCallbackAnnotation(context => WriteDaprComponentResourceToManifest(context, resource))); } diff --git a/src/Shared/Dapr/Core/IDistributedApplicationComponentBuilderExtensions.cs b/src/Shared/Dapr/Core/IDistributedApplicationComponentBuilderExtensions.cs index bd4929d2..19848eb1 100644 --- a/src/Shared/Dapr/Core/IDistributedApplicationComponentBuilderExtensions.cs +++ b/src/Shared/Dapr/Core/IDistributedApplicationComponentBuilderExtensions.cs @@ -59,7 +59,7 @@ public static IResourceBuilder WithDaprSidecar(this IResourceBuilder bu { Properties = [], ResourceType = "DaprSidecar", - State = KnownResourceStates.Hidden + IsHidden = true, }); configureSidecar(sidecarBuilder); diff --git a/src/Shared/Sqlite/SqliteExtensionMetadata.cs b/src/Shared/Sqlite/SqliteExtensionMetadata.cs deleted file mode 100644 index 5e7d579e..00000000 --- a/src/Shared/Sqlite/SqliteExtensionMetadata.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.Extensions.Hosting; - -/// -/// Represents metadata for an extension to be loaded into a database. -/// -/// The name of the extension binary, eg: vec0 -/// The name of the NuGet package. Only required if is . -/// Indicates if the extension will be loaded from a NuGet package. -/// The folder for the extension. Only required if is . -public record SqliteExtensionMetadata(string Extension, string? PackageName, bool IsNuGetPackage, string? ExtensionFolder); \ No newline at end of file diff --git a/tests-app-hosts/Directory.Build.props b/tests-app-hosts/Directory.Build.props index 803b4f14..3a0fbcde 100644 --- a/tests-app-hosts/Directory.Build.props +++ b/tests-app-hosts/Directory.Build.props @@ -1,8 +1,3 @@ - - - false - - \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs new file mode 100644 index 00000000..dbf2bd90 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AddAdminerTests.cs @@ -0,0 +1,312 @@ +using System.Net.Sockets; +using System.Text.Json; +using Aspire.Components.Common.Tests; +using Aspire.Hosting; +using Aspire.Hosting.Utils; + +namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; +public class AddAdminerTests +{ + [Fact] + public void AddAdminerContainerWithDefaultsAddsAnnotationMetadata() + { + var appBuilder = DistributedApplication.CreateBuilder(); + + var adminer = appBuilder.AddAdminer("adminer"); + + using var app = appBuilder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var containerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("adminer", containerResource.Name); + + var endpoints = containerResource.Annotations.OfType(); + Assert.Single(endpoints); + + var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http"); + Assert.Equal(8080, primaryEndpoint.TargetPort); + Assert.False(primaryEndpoint.IsExternal); + Assert.Equal("http", primaryEndpoint.Name); + Assert.Null(primaryEndpoint.Port); + Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol); + Assert.Equal("http", primaryEndpoint.Transport); + Assert.Equal("http", primaryEndpoint.UriScheme); + + var containerAnnotation = Assert.Single(containerResource.Annotations.OfType()); + Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag); + Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image); + Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry); + + var annotations = adminer.Resource.Annotations; + + Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations); + } + + [Fact] + public void AddAdminerContainerWithPort() + { + var appBuilder = DistributedApplication.CreateBuilder(); + + var adminer = appBuilder.AddAdminer("adminer", 9090); + + using var app = appBuilder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var containerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("adminer", containerResource.Name); + + var endpoints = containerResource.Annotations.OfType(); + Assert.Single(endpoints); + + var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http"); + Assert.Equal(8080, primaryEndpoint.TargetPort); + Assert.False(primaryEndpoint.IsExternal); + Assert.Equal("http", primaryEndpoint.Name); + Assert.Equal(9090, primaryEndpoint.Port); + Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol); + Assert.Equal("http", primaryEndpoint.Transport); + Assert.Equal("http", primaryEndpoint.UriScheme); + + var containerAnnotation = Assert.Single(containerResource.Annotations.OfType()); + Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag); + Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image); + Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry); + + var annotations = adminer.Resource.Annotations; + + Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations); + } + + [Fact] + public void MultipleAddAdminerCallsShouldAddOneAdminerResource() + { + var appBuilder = DistributedApplication.CreateBuilder(); + + appBuilder.AddAdminer("adminer1"); + appBuilder.AddAdminer("adminer2"); + + using var app = appBuilder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var containerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("adminer1", containerResource.Name); + } + + [Fact] + public void VerifyWithHostPort() + { + var appBuilder = DistributedApplication.CreateBuilder(); + + var adminer = appBuilder.AddAdminer("adminer").WithHostPort(9090); + + using var app = appBuilder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var containerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("adminer", containerResource.Name); + + var endpoints = containerResource.Annotations.OfType(); + Assert.Single(endpoints); + + var primaryEndpoint = Assert.Single(endpoints, e => e.Name == "http"); + Assert.Equal(8080, primaryEndpoint.TargetPort); + Assert.False(primaryEndpoint.IsExternal); + Assert.Equal("http", primaryEndpoint.Name); + Assert.Equal(9090, primaryEndpoint.Port); + Assert.Equal(ProtocolType.Tcp, primaryEndpoint.Protocol); + Assert.Equal("http", primaryEndpoint.Transport); + Assert.Equal("http", primaryEndpoint.UriScheme); + + var containerAnnotation = Assert.Single(containerResource.Annotations.OfType()); + Assert.Equal(AdminerContainerImageTags.Tag, containerAnnotation.Tag); + Assert.Equal(AdminerContainerImageTags.Image, containerAnnotation.Image); + Assert.Equal(AdminerContainerImageTags.Registry, containerAnnotation.Registry); + + var annotations = adminer.Resource.Annotations; + + Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations); + } + + [Fact] + public async Task WithAdminerShouldAddAnnotationsForMultipleDatabaseTypes() + { + var builder = DistributedApplication.CreateBuilder(); + + var postgresResourceBuilder1 = builder.AddPostgres("postgres1") + .WithAdminer(); + + var postgresResource1 = postgresResourceBuilder1.Resource; + + var postgresResourceBuilder2 = builder.AddPostgres("postgres2") + .WithAdminer(); + + var postgresResource2 = postgresResourceBuilder2.Resource; + + var sqlserverResourceBuilder1 = builder.AddSqlServer("sqlserver1") + .WithAdminer(); + + var sqlserverResource1 = sqlserverResourceBuilder1.Resource; + + var sqlserverResourceBuilder2 = builder.AddSqlServer("sqlserver2") + .WithAdminer(); + + var sqlserverResource2 = sqlserverResourceBuilder2.Resource; + + + var mysqlResourceBuilder1 = builder.AddMySql("mysql1") + .WithAdminer(); + + var mysqlResource1 = mysqlResourceBuilder1.Resource; + + var mysqlResourceBuilder2 = builder.AddMySql("mysql2") + .WithAdminer(); + + var mysqlResource2 = mysqlResourceBuilder2.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainerResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerContainerResource); + + Assert.Equal("postgres1-adminer", adminerContainerResource.Name); + + var envs = await adminerContainerResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "postgres1", + new AdminerLoginServer + { + Driver = "pgsql", + Server = postgresResource1.Name, + Password = postgresResource1.PasswordParameter.Value, + UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + } + }, + { + "postgres2", + new AdminerLoginServer + { + Driver = "pgsql", + Server = postgresResource2.Name, + Password = postgresResource2.PasswordParameter.Value, + UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + } + }, + { + "sqlserver1", + new AdminerLoginServer + { + Driver = "mssql", + Server = sqlserverResource1.Name, + Password = sqlserverResource1.PasswordParameter.Value, + UserName = "sa" + } + }, + { + "sqlserver2", + new AdminerLoginServer + { + Driver = "mssql", + Server = sqlserverResource2.Name, + Password = sqlserverResource2.PasswordParameter.Value, + UserName = "sa" + } + }, + { + "mysql1", + new AdminerLoginServer + { + Driver = "server", + Server = mysqlResource1.Name, + Password = mysqlResource1.PasswordParameter.Value, + UserName = "root" + } + }, + { + "mysql2", + new AdminerLoginServer + { + Driver = "server", + Server = mysqlResource2.Name, + Password = mysqlResource2.PasswordParameter.Value, + UserName = "root" + } + } + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + + [Fact] + public void WithAdminerShouldShouldAddOneAdminerResourceForMultipleDatabaseTypes() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddPostgres("postgres1") + .WithAdminer(); + + builder.AddPostgres("postgres2") + .WithAdminer(); + + builder.AddSqlServer("sqlserver1") + .WithAdminer(); + + builder.AddSqlServer("sqlserver2") + .WithAdminer(); + + builder.AddMySql("mysql1") + .WithAdminer(); + + builder.AddMySql("mysql2") + .WithAdminer(); + + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerResource = appModel.Resources.OfType().SingleOrDefault(); + + var containerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("postgres1-adminer", containerResource.Name); + } + + [Fact] + [RequiresDocker] + public async Task AddAdminerWithDefaultsAddsUrlAnnotations() + { + using var builder = TestDistributedApplicationBuilder.Create(); + + var adminer = builder.AddAdminer("adminer"); + + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + builder.Eventing.Subscribe((e, ct) => + { + tcs.SetResult(); + return Task.CompletedTask; + }); + + var app = await builder.BuildAsync(); + await app.StartAsync(); + await tcs.Task; + + var urls = adminer.Resource.Annotations.OfType(); + Assert.Single(urls, u => u.DisplayText == "Adminer Dashboard"); + + await app.StopAsync(); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs new file mode 100644 index 00000000..56acbd04 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AdminerPublicApiTests.cs @@ -0,0 +1,43 @@ +using Aspire.Hosting; + +namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; + +public class AdminerPublicApiTests +{ + [Fact] + public void AddAdminerContainerShouldThrowWhenBuilderIsNull() + { + IDistributedApplicationBuilder builder = null!; + const string name = "adminer"; + + var action = () => builder.AddAdminer(name); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } + + [Fact] + public void AddAdminerContainerShouldThrowWhenNameIsNull() + { + IDistributedApplicationBuilder builder = new DistributedApplicationBuilder([]); + string name = null!; + + var action = () => builder.AddAdminer(name); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(name), exception.ParamName); + } + + [Fact] + public void WithHostPortShouldThrowWhenBuilderIsNull() + { + IResourceBuilder builder = null!; + + Func>? action = null; + + action = () => builder.WithHostPort(9090); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs new file mode 100644 index 00000000..556bddaf --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/AppHostTests.cs @@ -0,0 +1,20 @@ +using CommunityToolkit.Aspire.Testing; +using Aspire.Components.Common.Tests; + +namespace CommunityToolkit.Aspire.Hosting.Adminer.Tests; + +[RequiresDocker] +public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> +{ + [Fact] + public async Task ResourceStartsAndRespondsOk() + { + var resourceName = "postgres1-adminer"; + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5)); + var httpClient = fixture.CreateHttpClient(resourceName); + + var response = await httpClient.GetAsync("/"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj new file mode 100644 index 00000000..e113bc4d --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests/CommunityToolkit.Aspire.Hosting.Adminer.Tests.csproj @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs index 1f16e91a..f6b76d04 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests/ResourceCreationTests.cs @@ -8,27 +8,27 @@ namespace CommunityToolkit.Aspire.Hosting.Azure.Dapr.Redis.Tests; public class ResourceCreationTests { - [Fact] - public void WithReference_WhenAADDisabled_UsesPasswordSecret() - { - using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); + [Fact] + public void WithReference_WhenAADDisabled_UsesPasswordSecret() + { + using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); - var redisState = builder.AddAzureRedis("redisState") - .WithAccessKeyAuthentication() - .RunAsContainer(); + var redisState = builder.AddAzureRedis("redisState") + .WithAccessKeyAuthentication() + .RunAsContainer(); - var daprState = builder.AddDaprStateStore("statestore") - .WithReference(redisState); + var daprState = builder.AddDaprStateStore("statestore") + .WithReference(redisState); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var redisCache = Assert.Single(appModel.Resources.OfType()); + var redisCache = Assert.Single(appModel.Resources.OfType()); - string redisBicep = redisCache.GetBicepTemplateString(); + string redisBicep = redisCache.GetBicepTemplateString(); - string expectedRedisBicep = $$""" + string expectedRedisBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -56,7 +56,7 @@ param keyVaultName string } resource connectionString 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = { - name: 'connectionString' + name: 'connectionstrings--redisState' properties: { value: '${redisState.properties.hostName},ssl=true,password=${redisState.listKeys().primaryKey}' } @@ -71,19 +71,21 @@ param keyVaultName string parent: keyVault } + output name string = redisState.name + output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.sslPort}' output redisKeyVaultName string = keyVaultName """; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); - var componentResources = appModel.Resources.OfType(); - var daprResource = Assert.Single(componentResources, _ => _.Name == "redisDaprComponent"); + var componentResources = appModel.Resources.OfType(); + var daprResource = Assert.Single(componentResources, _ => _.Name == "redisDaprComponent"); - string daprBicep = daprResource.GetBicepTemplateString(); + string daprBicep = daprResource.GetBicepTemplateString(); - string expectedDaprBicep = $$""" + string expectedDaprBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -125,36 +127,33 @@ param secretStoreComponent string parent: containerAppEnvironment } """; - Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); + Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); - } + } - [Fact] - public void WithReference_WhenAADEnabled_SkipsPasswordSecret() - { - using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); + [Fact] + public void WithReference_WhenAADEnabled_SkipsPasswordSecret() + { + using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); - var redisState = builder.AddAzureRedis("redisState").RunAsContainer(); + var redisState = builder.AddAzureRedis("redisState") + .RunAsContainer(); - var daprState = builder.AddDaprStateStore("statestore") - .WithReference(redisState); + var daprState = builder.AddDaprStateStore("statestore") + .WithReference(redisState); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var redisCache = Assert.Single(appModel.Resources.OfType()); + var redisCache = Assert.Single(appModel.Resources.OfType()); - string redisBicep = redisCache.GetBicepTemplateString(); + string redisBicep = redisCache.GetBicepTemplateString(); - string expectedRedisBicep = $$""" + string expectedRedisBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location - param principalId string - - param principalName string - resource redisState 'Microsoft.Cache/redis@2024-03-01' = { name: take('redisState-${uniqueString(resourceGroup().id)}', 63) location: location @@ -176,30 +175,22 @@ param principalName string } } - resource redisState_contributor 'Microsoft.Cache/redis/accessPolicyAssignments@2024-03-01' = { - name: take('redisstatecontributor${uniqueString(resourceGroup().id)}', 24) - properties: { - accessPolicyName: 'Data Contributor' - objectId: principalId - objectIdAlias: principalName - } - parent: redisState - } - output connectionString string = '${redisState.properties.hostName},ssl=true' + output name string = redisState.name + output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.sslPort}' """; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); - var componentResources = appModel.Resources.OfType(); - var daprResource = Assert.Single(componentResources, _ => _.Name == "redisDaprComponent"); + var componentResources = appModel.Resources.OfType(); + var daprResource = Assert.Single(componentResources, _ => _.Name == "redisDaprComponent"); - string daprBicep = daprResource.GetBicepTemplateString(); + string daprBicep = daprResource.GetBicepTemplateString(); - string expectedDaprBicep = $$""" + string expectedDaprBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location @@ -246,43 +237,39 @@ param principalId string """; - Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); + Assert.Equal(NormalizeLineEndings(expectedDaprBicep), NormalizeLineEndings(daprBicep)); - } + } - [Fact] - public void WithReference_WhenTLSDisabled_UsesNonSslPort() - { - using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); + [Fact] + public void WithReference_WhenTLSDisabled_UsesNonSslPort() + { + using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); - var redisState = builder.AddAzureRedis("redisState") - .ConfigureInfrastructure(infr => - { - var redis = infr.GetProvisionableResources().OfType().Single(); - redis.EnableNonSslPort = true; - }) - .RunAsContainer(); + var redisState = builder.AddAzureRedis("redisState") + .ConfigureInfrastructure(infr => + { + var redis = infr.GetProvisionableResources().OfType().Single(); + redis.EnableNonSslPort = true; + }) + .RunAsContainer(); - var daprState = builder.AddDaprStateStore("statestore") - .WithReference(redisState); + var daprState = builder.AddDaprStateStore("statestore") + .WithReference(redisState); - using var app = builder.Build(); + using var app = builder.Build(); - var appModel = app.Services.GetRequiredService(); + var appModel = app.Services.GetRequiredService(); - var redisCache = Assert.Single(appModel.Resources.OfType()); + var redisCache = Assert.Single(appModel.Resources.OfType()); - string redisBicep = redisCache.GetBicepTemplateString(); + string redisBicep = redisCache.GetBicepTemplateString(); - string expectedRedisBicep = $$""" + string expectedRedisBicep = $$""" @description('The location for the resource(s) to be deployed.') param location string = resourceGroup().location - param principalId string - - param principalName string - resource redisState 'Microsoft.Cache/redis@2024-03-01' = { name: take('redisState-${uniqueString(resourceGroup().id)}', 63) location: location @@ -304,42 +291,34 @@ param principalName string } } - resource redisState_contributor 'Microsoft.Cache/redis/accessPolicyAssignments@2024-03-01' = { - name: take('redisstatecontributor${uniqueString(resourceGroup().id)}', 24) - properties: { - accessPolicyName: 'Data Contributor' - objectId: principalId - objectIdAlias: principalName - } - parent: redisState - } - output connectionString string = '${redisState.properties.hostName},ssl=true' + output name string = redisState.name + output daprConnectionString string = '${redisState.properties.hostName}:${redisState.properties.port}' """; - Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); - } + Assert.Equal(NormalizeLineEndings(expectedRedisBicep), NormalizeLineEndings(redisBicep)); + } - [Fact] - public void WithReference_WhenNonStateType_ThrowsException() - { - using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); - - var redisState = builder.AddAzureRedis("redisState").RunAsContainer(); - var ex = Assert.Throws(() => + [Fact] + public void WithReference_WhenNonStateType_ThrowsException() + { + using var builder = TestDistributedApplicationBuilder.Create(DistributedApplicationOperation.Publish); + + var redisState = builder.AddAzureRedis("redisState").RunAsContainer(); + var ex = Assert.Throws(() => + { + var daprPubSub = builder.AddDaprPubSub("statestore") + .WithReference(redisState); + }); + + Assert.Contains("Unsupported Dapr component type: pubsub", ex.Message); + } + public static string NormalizeLineEndings(string input) { - var daprPubSub = builder.AddDaprPubSub("statestore") - .WithReference(redisState); - }); - - Assert.Contains("Unsupported Dapr component type: pubsub", ex.Message); - } - public static string NormalizeLineEndings(string input) - { - return input.Replace("\r\n", "\n"); - } + return input.Replace("\r\n", "\n"); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests.csproj deleted file mode 100644 index b22b2f3f..00000000 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/ResourceCreationTests.cs deleted file mode 100644 index 84ff467a..00000000 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/ResourceCreationTests.cs +++ /dev/null @@ -1,266 +0,0 @@ -using Aspire.Hosting; - -namespace CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests; - -public class ResourceCreationTests -{ - [Fact] - public void TargetPort_Defaults_to_4280() - { - var builder = DistributedApplication.CreateBuilder(); - - builder.AddSwaEmulator("swa"); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var httpEndpoint = resource.GetEndpoint("http"); - Assert.Equal(4280, httpEndpoint.TargetPort); - } - - [Fact] - public void TargetPort_Can_Be_Overridden() - { - var builder = DistributedApplication.CreateBuilder(); - - SwaResourceOptions options = new() { Port = 1234 }; - builder.AddSwaEmulator("swa", options); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var httpEndpoint = resource.GetEndpoint("http"); - Assert.Equal(options.Port, httpEndpoint.TargetPort); - } - - [Fact] - public void AppResource_Can_Be_Set() - { - var builder = DistributedApplication.CreateBuilder(); - - var appResource = builder - .AddContainer("app", "test/container") // container image doesn't need to be valid as we aren't actually running it - .WithHttpEndpoint(); - - builder.AddSwaEmulator("swa") - .WithAppResource(appResource); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var appResources); - - Assert.True(result); - Assert.NotNull(appResources); - Assert.Single(appResources); - } - - [Fact] - public void ApiResource_Can_Be_Set() - { - var builder = DistributedApplication.CreateBuilder(); - - var apiResource = builder - .AddContainer("api", "test/container") // container image doesn't need to be valid as we aren't actually running it - .WithHttpEndpoint(); - - builder.AddSwaEmulator("swa") - .WithApiResource(apiResource); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var apiResources); - - Assert.True(result); - Assert.NotNull(apiResources); - - Assert.Single(apiResources); - } - - [Fact] - public void Start_Will_Be_An_Arg() - { - var builder = DistributedApplication.CreateBuilder(); - - builder.AddSwaEmulator("swa"); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var annotations); - - Assert.True(result); - Assert.NotNull(annotations); - - Assert.Single(annotations); - - var annotation = annotations.Single(); - - List args = []; - var ctx = new CommandLineArgsCallbackContext(args); - - annotation.Callback(ctx); - - Assert.Contains("start", args); - } - - [Fact] - public void Port_Will_Be_An_Arg() - { - var builder = DistributedApplication.CreateBuilder(); - - builder.AddSwaEmulator("swa"); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var annotations); - - Assert.True(result); - Assert.NotNull(annotations); - - Assert.Single(annotations); - - var annotation = annotations.Single(); - - List args = []; - var ctx = new CommandLineArgsCallbackContext(args); - - annotation.Callback(ctx); - - Assert.Contains("--port", args); - Assert.Contains("4280", args); - } - - [Fact] - public void SwaResourceHasHealthCheck() - { - var builder = DistributedApplication.CreateBuilder(); - - builder.AddSwaEmulator("swa"); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var annotations); - - Assert.True(result); - Assert.NotNull(annotations); - - Assert.Single(annotations); - } - - [Fact] - public void AppResourceWillBeWaitedFor() - { - var builder = DistributedApplication.CreateBuilder(); - - var appResource = builder - .AddContainer("app", "test/container") // container image doesn't need to be valid as we aren't actually running it - .WithHttpEndpoint(); - - builder.AddSwaEmulator("swa") - .WithAppResource(appResource); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var waitAnnotations); - - Assert.True(result); - Assert.NotNull(waitAnnotations); - Assert.Single(waitAnnotations); - - var waitAnnotation = waitAnnotations.Single(); - Assert.Equal(appResource.Resource, waitAnnotation.Resource); - } - - [Fact] - public void ApiResourceWillBeWaitedFor() - { - var builder = DistributedApplication.CreateBuilder(); - - var apiResource = builder - .AddContainer("api", "test/container") // container image doesn't need to be valid as we aren't actually running it - .WithHttpEndpoint(); - - builder.AddSwaEmulator("swa") - .WithApiResource(apiResource); - - using var app = builder.Build(); - - var appModel = app.Services.GetRequiredService(); - - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - Assert.Equal("swa", resource.Name); - - var result = resource.TryGetAnnotationsOfType(out var waitAnnotations); - - Assert.True(result); - Assert.NotNull(waitAnnotations); - Assert.Single(waitAnnotations); - - var waitAnnotation = waitAnnotations.Single(); - Assert.Equal(apiResource.Resource, waitAnnotation.Resource); - } -} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/SwaHostingComponentTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/SwaHostingComponentTests.cs deleted file mode 100644 index 2d89e209..00000000 --- a/tests/CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests/SwaHostingComponentTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -using CommunityToolkit.Aspire.Testing; -using System.Net.Http.Json; - -namespace CommunityToolkit.Aspire.Hosting.Azure.StaticWebApps.Tests; - -public class SwaHostingComponentTests(AspireIntegrationTestFixture fixture) : IClassFixture> -{ - [Fact] - public async Task CanAccessFrontendSuccessfully() - { - var httpClient = fixture.CreateHttpClient("swa"); - - await fixture.ResourceNotificationService.WaitForResourceHealthyAsync("swa").WaitAsync(TimeSpan.FromMinutes(5)); - - var response = await httpClient.GetAsync("/"); - - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } - - [Fact] - public async Task CanAccessApiSuccessfully() - { - var httpClient = fixture.CreateHttpClient("swa"); - - await fixture.ResourceNotificationService.WaitForResourceHealthyAsync("swa").WaitAsync(TimeSpan.FromMinutes(5)); - - var response = await httpClient.GetAsync("/api/weather"); - - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - var forecasts = await response.Content.ReadFromJsonAsync(); - Assert.NotNull(forecasts); - Assert.Equal(6, forecasts.Length); - } - - record WeatherForecast(DateTime Date, int TemperatureC, string Summary); -} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Bun.Tests/AddBunAppTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Bun.Tests/AddBunAppTests.cs index b8ee0380..8f48ea03 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Bun.Tests/AddBunAppTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Bun.Tests/AddBunAppTests.cs @@ -120,8 +120,9 @@ public void AddBunNullNameThrows() public void AddBunEmptyNameThrows() { var builder = DistributedApplication.CreateBuilder(); + var name = ""; - Assert.Throws(() => builder.AddBunApp("")); + Assert.Throws(() => builder.AddBunApp(name)); } [Fact] diff --git a/tests/CommunityToolkit.Aspire.Hosting.Dapr.Tests/WithDaprSidecarTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Dapr.Tests/WithDaprSidecarTests.cs index cbe7df0b..ce9ce838 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Dapr.Tests/WithDaprSidecarTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Dapr.Tests/WithDaprSidecarTests.cs @@ -30,7 +30,7 @@ public void ResourceAddedWithHiddenInitialState() Assert.True(resource.TryGetAnnotationsOfType(out var annotations)); var annotation = Assert.Single(annotations); - Assert.Equal(KnownResourceStates.Hidden, annotation.InitialSnapshot.State?.Text); + Assert.True(annotation.InitialSnapshot.IsHidden); } [Fact] diff --git a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs index 168794cc..ea6c7490 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.DbGate.Tests/AddDbGateTests.cs @@ -1,5 +1,7 @@ using System.Net.Sockets; +using Aspire.Components.Common.Tests; using Aspire.Hosting; +using Aspire.Hosting.Utils; namespace CommunityToolkit.Aspire.Hosting.DbGate.Tests; public class AddDbGateTests @@ -219,6 +221,16 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() var sqlserverResource2 = sqlserverResourceBuilder2.Resource; + var mysqlResourceBuilder1 = builder.AddMySql("mysql1") + .WithDbGate(); + + var mysqlResource1 = mysqlResourceBuilder1.Resource; + + var mysqlResourceBuilder2 =builder.AddMySql("mysql2") + .WithDbGate(); + + var mysqlResource2 = mysqlResourceBuilder2.Resource; + using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -266,7 +278,7 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() item => { Assert.Equal("CONNECTIONS", item.Key); - Assert.Equal("mongodb1,mongodb2,postgres1,postgres2,redis1,redis2,sqlserver1,sqlserver2", item.Value); + Assert.Equal("mongodb1,mongodb2,postgres1,postgres2,redis1,redis2,sqlserver1,sqlserver2,mysql1,mysql2", item.Value); }, item => { @@ -333,10 +345,12 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("LABEL_redis1", item.Key); Assert.Equal(redisResource1.Name, item.Value); }, - async item => + item => { + var redisUrl = redisResource1.PasswordParameter is not null ? + $"redis://:{redisResource1.PasswordParameter.Value}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); - Assert.Equal(await redisResource1.ConnectionStringExpression.GetValueAsync(default), item.Value); + Assert.Equal(redisUrl, item.Value); }, item => { @@ -348,10 +362,12 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() Assert.Equal("LABEL_redis2", item.Key); Assert.Equal(redisResource2.Name, item.Value); }, - async item => + item => { + var redisUrl = redisResource2.PasswordParameter is not null ? + $"redis://:{redisResource2.PasswordParameter.Value}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis2", item.Key); - Assert.Equal(await redisResource2.ConnectionStringExpression.GetValueAsync(default), item.Value); + Assert.Equal(redisUrl, item.Value); }, item => { @@ -417,6 +433,66 @@ public async Task WithDbGateShouldAddAnnotationsForMultipleDatabaseTypes() { Assert.Equal("ENGINE_sqlserver2", item.Key); Assert.Equal("mssql@dbgate-plugin-mssql", item.Value); + }, + item => + { + Assert.Equal("LABEL_mysql1", item.Key); + Assert.Equal(mysqlResource1.Name, item.Value); + }, + item => + { + Assert.Equal("SERVER_mysql1", item.Key); + Assert.Equal(mysqlResource1.Name, item.Value); + }, + item => + { + Assert.Equal("USER_mysql1", item.Key); + Assert.Equal("root", item.Value); + }, + item => + { + Assert.Equal("PASSWORD_mysql1", item.Key); + Assert.Equal(mysqlResource1.PasswordParameter.Value, item.Value); + }, + item => + { + Assert.Equal("PORT_mysql1", item.Key); + Assert.Equal(mysqlResource1.PrimaryEndpoint.TargetPort.ToString(), item.Value); + }, + item => + { + Assert.Equal("ENGINE_mysql1", item.Key); + Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); + }, + item => + { + Assert.Equal("LABEL_mysql2", item.Key); + Assert.Equal(mysqlResource2.Name, item.Value); + }, + item => + { + Assert.Equal("SERVER_mysql2", item.Key); + Assert.Equal(mysqlResource2.Name, item.Value); + }, + item => + { + Assert.Equal("USER_mysql2", item.Key); + Assert.Equal("root", item.Value); + }, + item => + { + Assert.Equal("PASSWORD_mysql2", item.Key); + Assert.Equal(mysqlResource2.PasswordParameter.Value, item.Value); + }, + item => + { + Assert.Equal("PORT_mysql2", item.Key); + Assert.Equal(mysqlResource2.PrimaryEndpoint.TargetPort.ToString(), item.Value); + }, + item => + { + Assert.Equal("ENGINE_mysql2", item.Key); + Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); }); } @@ -449,6 +525,12 @@ public void WithDbGateShouldShouldAddOneDbGateResourceForMultipleDatabaseTypes() builder.AddSqlServer("sqlserver2") .WithDbGate(); + builder.AddMySql("mysql1") + .WithDbGate(); + + builder.AddMySql("mysql2") + .WithDbGate(); + using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -458,4 +540,29 @@ public void WithDbGateShouldShouldAddOneDbGateResourceForMultipleDatabaseTypes() var containerResource = Assert.Single(appModel.Resources.OfType()); Assert.Equal("mongodb1-dbgate", containerResource.Name); } + + [Fact] + [RequiresDocker] + public async Task AddDbGateWithDefaultsAddsUrlAnnotations() + { + using var builder = TestDistributedApplicationBuilder.Create(); + + var dbgate = builder.AddDbGate("dbgate"); + + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + builder.Eventing.Subscribe((e, ct) => + { + tcs.SetResult(); + return Task.CompletedTask; + }); + + var app = await builder.BuildAsync(); + await app.StartAsync(); + await tcs.Task; + + var urls = dbgate.Resource.Annotations.OfType(); + Assert.Single(urls, u => u.DisplayText == "DbGate Dashboard"); + + await app.StopAsync(); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.EventStore.Tests/EventStoreFunctionalTests.cs b/tests/CommunityToolkit.Aspire.Hosting.EventStore.Tests/EventStoreFunctionalTests.cs index 309110b7..f8a1bbea 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.EventStore.Tests/EventStoreFunctionalTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.EventStore.Tests/EventStoreFunctionalTests.cs @@ -129,8 +129,6 @@ public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) } else { - //EventStore shutdown can be slightly delayed, so second instance might fail to start when using the same bind mount before shutdown. - await Task.Delay(TimeSpan.FromSeconds(5)); eventstore2.WithDataBindMount(bindMountPath!); } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Golang.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Golang.Tests/ResourceCreationTests.cs index c6e0ec1a..b0a0aff3 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Golang.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Golang.Tests/ResourceCreationTests.cs @@ -21,4 +21,41 @@ public void DefaultGolangApp() Assert.Equal("go", resource.Command); } + + [Fact] + public async Task GolangAppWithBuildTagsAsync() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddGolangApp("golang", "../../examples/golang/gin-api", buildTags: ["dev"]); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(resource); + + var args = await resource.GetArgumentValuesAsync(); + Assert.Collection( + args, + arg => + { + Assert.Equal("run", arg); + }, + arg => + { + Assert.Equal("-tags", arg); + }, + arg => + { + Assert.Equal("dev", arg); + }, + arg => + { + Assert.Equal(".", arg); + } + ); + } } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/AppHostTests.cs new file mode 100644 index 00000000..acd88ce3 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/AppHostTests.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Aspire.Components.Common.Tests; +using CommunityToolkit.Aspire.Testing; +using System.Text; + +namespace CommunityToolkit.Aspire.Hosting.Minio.Tests; + +[RequiresDocker] +public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> +{ + [Fact] + public async Task ResourceStartsAndRespondsOk() + { + var resourceName = "apiservice"; + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5)); + var httpClient = fixture.CreateHttpClient(resourceName); + + var response = await httpClient.GetAsync("/"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task ResourceStartsAndUiRespondsOk() + { + var resourceName = "minio"; + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5)); + var httpClient = fixture.CreateHttpClient(resourceName, "console"); + + var response = await httpClient.GetAsync("/"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task ApiServiceCreateData() + { + const string resourceName = "apiservice"; + + var cts = new CancellationTokenSource(TimeSpan.FromMinutes(2)); + + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync("minio", cts.Token).WaitAsync(cts.Token); + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName, cts.Token).WaitAsync(cts.Token); + var httpClient = fixture.CreateHttpClient(resourceName); + + var bucketName = "somebucket"; + var createBucketResponse = await httpClient.PutAsync($"/buckets/{bucketName}", null).WaitAsync(cts.Token); + Assert.Equal(HttpStatusCode.OK, createBucketResponse.StatusCode); + + var getBucketResponse = await httpClient.GetAsync($"/buckets/{bucketName}"); + Assert.Equal(HttpStatusCode.OK, getBucketResponse.StatusCode); + + var uploadedString = "Hello World"; + var bytes = Encoding.UTF8.GetBytes(uploadedString); + using var content = new ByteArrayContent(bytes); + content.Headers.ContentType = new("plain/text"); + + var uploadFileResponse = await httpClient.PostAsync($"/buckets/{bucketName}/fileName/upload", content); + Assert.Equal(HttpStatusCode.OK, uploadFileResponse.StatusCode); + + var downloadFileResponse = await httpClient.GetAsync($"/buckets/{bucketName}/fileName/download"); + Assert.Equal(HttpStatusCode.OK, downloadFileResponse.StatusCode); + + var downloadedString = await downloadFileResponse.Content.ReadAsStringAsync(); + Assert.Equal(uploadedString, downloadedString); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/CommunityToolkit.Aspire.Hosting.Minio.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/CommunityToolkit.Aspire.Hosting.Minio.Tests.csproj new file mode 100644 index 00000000..4da9a012 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/CommunityToolkit.Aspire.Hosting.Minio.Tests.csproj @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs new file mode 100644 index 00000000..26d0ddcf --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioFunctionalTests.cs @@ -0,0 +1,243 @@ +using Aspire.Components.Common.Tests; +using Aspire.Hosting; +using Aspire.Hosting.Utils; +using Microsoft.Extensions.Hosting; +using Minio; +using Minio.DataModel.Args; +using Xunit.Abstractions; + +namespace CommunityToolkit.Aspire.Hosting.Minio.Tests; + +[RequiresDocker] +public class MinioFunctionalTests(ITestOutputHelper testOutputHelper) +{ + [Fact] + public async Task StorageGetsCreatedAndUsable() + { + using var distributedApplicationBuilder = TestDistributedApplicationBuilder.Create(testOutputHelper); + var rootUser = "minioadmin"; + + var passwordParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(distributedApplicationBuilder, + $"rootPassword"); + distributedApplicationBuilder.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + var rootPasswordParameter = distributedApplicationBuilder.AddParameter(passwordParameter.Name); + + var minio = distributedApplicationBuilder + .AddMinioContainer("minio", + distributedApplicationBuilder.AddParameter("username", rootUser), + rootPasswordParameter); + + var minioEndpoint = minio.GetEndpoint("http"); + + await using var app = await distributedApplicationBuilder.BuildAsync(); + + await app.StartAsync(); + + var rns = app.Services.GetRequiredService(); + + await rns.WaitForResourceHealthyAsync(minio.Resource.Name); + + var webApplicationBuilder = Host.CreateApplicationBuilder(); + + webApplicationBuilder.Services.AddMinio(configureClient => configureClient + .WithEndpoint("localhost", minioEndpoint.Port) + .WithCredentials(rootUser, passwordParameter.Value) + .WithSSL(false) + .Build()); + + using var host = webApplicationBuilder.Build(); + + await host.StartAsync(); + + var minioClient = host.Services.GetRequiredService(); + + await TestApi(minioClient); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task WithDataShouldPersistStateBetweenUsages(bool useVolume) + { + string? volumeName = null; + string? bindMountPath = null; + + try + { + using var builder1 = TestDistributedApplicationBuilder.Create(testOutputHelper); + + var rootUser = "minioadmin"; + + var passwordParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder1, + $"rootPassword"); + builder1.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + var rootPasswordParameter = builder1.AddParameter(passwordParameter.Name); + + var minio1 = builder1.AddMinioContainer("minio", + builder1.AddParameter("username", rootUser), + rootPasswordParameter); + + var minio1Endpoint = minio1.GetEndpoint("http"); + + if (useVolume) + { + // Use a deterministic volume name to prevent them from exhausting the machines if deletion fails + volumeName = VolumeNameGenerator.Generate(minio1, nameof(WithDataShouldPersistStateBetweenUsages)); + + // if the volume already exists (because of a crashing previous run), delete it + DockerUtils.AttemptDeleteDockerVolume(volumeName, throwOnFailure: true); + minio1.WithDataVolume(volumeName); + } + else + { + bindMountPath = Directory.CreateTempSubdirectory().FullName; + minio1.WithDataBindMount(bindMountPath); + } + + using (var app = builder1.Build()) + { + await app.StartAsync(); + + var rns = app.Services.GetRequiredService(); + + await rns.WaitForResourceHealthyAsync(minio1.Resource.Name); + + try + { + var webApplicationBuilder = Host.CreateApplicationBuilder(); + + webApplicationBuilder.Services.AddMinio(configureClient => configureClient + .WithEndpoint("localhost", minio1Endpoint.Port) + .WithCredentials(rootUser, passwordParameter.Value) + .WithSSL(false) + .Build()); + + using var host = webApplicationBuilder.Build(); + + await host.StartAsync(); + + var minioClient = host.Services.GetRequiredService(); + await TestApi(minioClient); + } + finally + { + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } + } + + using var builder2 = TestDistributedApplicationBuilder.Create(testOutputHelper); + builder2.Configuration["Parameters:rootPassword"] = passwordParameter.Value; + var rootPasswordParameter2 = builder2.AddParameter(passwordParameter.Name); + + + var minio2 = builder2.AddMinioContainer("minio", + builder2.AddParameter("username", rootUser), + rootPasswordParameter2); + + var minio2Endpoint = minio2.GetEndpoint("http"); + + if (useVolume) + { + minio2.WithDataVolume(volumeName); + } + else + { + minio2.WithDataBindMount(bindMountPath!); + } + + using (var app = builder2.Build()) + { + await app.StartAsync(); + + var rns = app.Services.GetRequiredService(); + + await rns.WaitForResourceHealthyAsync(minio1.Resource.Name); + + + try + { + var webApplicationBuilder = Host.CreateApplicationBuilder(); + + webApplicationBuilder.Services.AddMinio(configureClient => configureClient + .WithEndpoint("localhost", minio2Endpoint.Port) + .WithCredentials(rootUser, passwordParameter.Value) + .WithSSL(false) + .Build()); + + using var host = webApplicationBuilder.Build(); + + await host.StartAsync(); + + var minioClient = host.Services.GetRequiredService(); + await TestApi(minioClient, isDataPreGenerated: false); + } + finally + { + // Stops the container, or the Volume would still be in use + await app.StopAsync(); + } + } + + } + finally + { + if (volumeName is not null) + { + DockerUtils.AttemptDeleteDockerVolume(volumeName); + } + + if (bindMountPath is not null) + { + try + { + Directory.Delete(bindMountPath, recursive: true); + } + catch + { + // Don't fail test if we can't clean the temporary folder + } + } + } + } + + private static async Task TestApi(IMinioClient minioClient, bool isDataPreGenerated = true) + { + const string bucketName = "somebucket"; + + const string objectName = "someobj"; + const string contentType = "text/plain"; + + if (isDataPreGenerated) + { + var mbArgs = new MakeBucketArgs() + .WithBucket(bucketName); + await minioClient.MakeBucketAsync(mbArgs); + + var res = await minioClient.ListBucketsAsync(); + + Assert.NotEmpty(res.Buckets); + + var bytearr = "Hey, I'm using minio client! It's awesome!"u8.ToArray(); + var stream = new MemoryStream(bytearr); + + var putObjectArgs = new PutObjectArgs() + .WithBucket(bucketName) + .WithObject(objectName) + .WithStreamData(stream) + .WithObjectSize(stream.Length) + .WithContentType(contentType); + + await minioClient.PutObjectAsync(putObjectArgs); + } + + var statObject = new StatObjectArgs() + .WithBucket(bucketName) + .WithObject(objectName); + + var meta = await minioClient.StatObjectAsync(statObject); + + Assert.NotNull(meta); + Assert.Equal(contentType, meta.ContentType); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs new file mode 100644 index 00000000..fa0ccda4 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/MinioPublicApiTests.cs @@ -0,0 +1,111 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Aspire.Hosting; + +namespace CommunityToolkit.Aspire.Hosting.Minio.Tests; + +public class MinioPublicApiTests +{ + [Fact] + public void AddMinioContainerShouldThrowWhenBuilderIsNull() + { + IDistributedApplicationBuilder builder = null!; + const string name = "Minio"; + + var action = () => builder.AddMinioContainer(name); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } + + [Fact] + public void AddMinioContainerShouldThrowWhenNameIsNull() + { + IDistributedApplicationBuilder builder = new DistributedApplicationBuilder([]); + string name = null!; + + var action = () => builder.AddMinioContainer(name); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(name), exception.ParamName); + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void WithDataShouldThrowWhenBuilderIsNull(bool useVolume) + { + IResourceBuilder builder = null!; + + Func>? action = null; + + if (useVolume) + { + action = () => builder.WithDataVolume(); + } + else + { + const string source = "/data"; + + action = () => builder.WithDataBindMount(source); + } + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } + + [Fact] + public void WithDataBindMountShouldThrowWhenSourceIsNull() + { + var builder = new DistributedApplicationBuilder([]); + var resourceBuilder = builder.AddMinioContainer("minio"); + + string source = null!; + + var action = () => resourceBuilder.WithDataBindMount(source); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(source), exception.ParamName); + } + + [Fact] + public void VerifyMinioContainerResourceWithHostPort() + { + var builder = DistributedApplication.CreateBuilder(); + builder.AddMinioContainer("minio") + .WithHostPort(1000); + + var resource = Assert.Single(builder.Resources.OfType()); + var endpoint = Assert.Single(resource.Annotations.OfType(), x => x.Name == "http"); + Assert.Equal(1000, endpoint.Port); + } + + [Fact] + public async Task VerifyMinioContainerResourceWithPassword() + { + var builder = DistributedApplication.CreateBuilder(); + var password = "p@ssw0rd1"; + var pass = builder.AddParameter("pass", password); + var minio = builder.AddMinioContainer("minio") + .WithPassword(pass) + .WithEndpoint("http", e => e.AllocatedEndpoint = new AllocatedEndpoint(e, "localhost", 2000)); + + var connectionString = await minio.Resource.GetConnectionStringAsync(); + Assert.Equal("Endpoint=http://localhost:2000;AccessKey=minioadmin;SecretKey=p@ssw0rd1", connectionString); + } + + [Fact] + public async Task VerifyMinioContainerResourceWithUserName() + { + var builder = DistributedApplication.CreateBuilder(); + var user = "user1"; + var pass = builder.AddParameter("user", user); + var postgres = builder.AddMinioContainer("minio") + .WithUserName(pass) + .WithEndpoint("http", e => e.AllocatedEndpoint = new AllocatedEndpoint(e, "localhost", 2000)); + + var connectionString = await postgres.Resource.GetConnectionStringAsync(); + Assert.Equal($"Endpoint=http://localhost:2000;AccessKey=user1;SecretKey={postgres.Resource.PasswordParameter.Value}", connectionString); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/ResourceCreationTests.cs new file mode 100644 index 00000000..87201daf --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/ResourceCreationTests.cs @@ -0,0 +1,47 @@ +using Aspire.Hosting; + +namespace CommunityToolkit.Aspire.Hosting.Minio.Tests; + +public class ResourceCreationTests +{ + [Fact] + public void MinioResourceGetsAdded() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddMinioContainer("minio"); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + Assert.Equal("minio", resource.Name); + } + + [Fact] + public void MinioResourceHasHealthCheck() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddMinioContainer("minio"); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(resource); + + Assert.Equal("minio", resource.Name); + + var result = resource.TryGetAnnotationsOfType(out var annotations); + + Assert.True(result); + Assert.NotNull(annotations); + + Assert.Single(annotations); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/AppHostTests.cs new file mode 100644 index 00000000..5dac4844 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/AppHostTests.cs @@ -0,0 +1,20 @@ +using CommunityToolkit.Aspire.Testing; +using Aspire.Components.Common.Tests; + +namespace CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests; + +[RequiresDocker] +public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> +{ + [Fact] + public async Task ResourceStartsAndRespondsOk() + { + var resourceName = "mysql1-adminer"; + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5)); + var httpClient = fixture.CreateHttpClient(resourceName); + + var response = await httpClient.GetAsync("/"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests.csproj new file mode 100644 index 00000000..da547aae --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests.csproj @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs new file mode 100644 index 00000000..de7b08fd --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/ResourceCreationTests.cs @@ -0,0 +1,371 @@ +using Aspire.Hosting; +using System.Text.Json; + +namespace CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests; + +public class ResourceCreationTests +{ + [Fact] + public async Task WithAdminerAddsAnnotations() + { + var builder = DistributedApplication.CreateBuilder(); + + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithAdminer(); + + var mysqlResource = mysqlResourceBuilder.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerResource); + + Assert.Equal("mysql-adminer", adminerResource.Name); + + var envs = await adminerResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "mysql", + new AdminerLoginServer + { + Driver = "server", + Server = mysqlResource.Name, + Password = mysqlResource.PasswordParameter.Value, + UserName = "root" + } + }, + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + + [Fact] + public void MultipleWithAdminerCallsAddsOneAdminerResource() + { + var builder = DistributedApplication.CreateBuilder(); + builder.AddMySql("mysql1").WithAdminer(); + builder.AddMySql("mysql2").WithAdminer(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + Assert.Equal("mysql1-adminer", adminerContainer.Name); + } + + [Fact] + public void WithAdminerShouldChangeAdminerHostPort() + { + var builder = DistributedApplication.CreateBuilder(); + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithAdminer(c => c.WithHostPort(8068)); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var primaryEndpoint = adminerContainer.Annotations.OfType().Single(); + Assert.Equal(8068, primaryEndpoint.Port); + } + + [Fact] + public void WithAdminerShouldChangeAdminerContainerImageTag() + { + var builder = DistributedApplication.CreateBuilder(); + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithAdminer(c => c.WithImageTag("manualTag")); + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var containerImageAnnotation = adminerContainer.Annotations.OfType().Single(); + Assert.Equal("manualTag", containerImageAnnotation.Tag); + } + + [Fact] + public async Task WithAdminerAddsAnnotationsForMultipleMySqlResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var mysqlResourceBuilder1 = builder.AddMySql("mysql1") + .WithAdminer(); + + var mysqlResource1 = mysqlResourceBuilder1.Resource; + + var mysqlResourceBuilder2 = builder.AddMySql("mysql2") + .WithAdminer(); + + var mysqlResource2 = mysqlResourceBuilder2.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerContainer); + + Assert.Equal("mysql1-adminer", adminerContainer.Name); + + var envs = await adminerContainer.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "mysql1", + new AdminerLoginServer + { + Driver = "server", + Server = mysqlResource1.Name, + Password = mysqlResource1.PasswordParameter.Value, + UserName = "root" + } + }, + { + "mysql2", + new AdminerLoginServer + { + Driver = "server", + Server = mysqlResource2.Name, + Password = mysqlResource2.PasswordParameter.Value, + UserName = "root" + } + } + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + + [Fact] + public async Task WithDbGateAddsAnnotations() + { + var builder = DistributedApplication.CreateBuilder(); + + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithDbGate(); + + var mysqlResource = mysqlResourceBuilder.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(dbGateResource); + + Assert.Equal("mysql-dbgate", dbGateResource.Name); + + var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + Assert.Collection(envs, + item => + { + Assert.Equal("LABEL_mysql1", item.Key); + Assert.Equal(mysqlResource.Name, item.Value); + }, + item => + { + Assert.Equal("SERVER_mysql1", item.Key); + Assert.Equal(mysqlResource.Name, item.Value); + }, + item => + { + Assert.Equal("USER_mysql1", item.Key); + Assert.Equal("root", item.Value); + }, + item => + { + Assert.Equal("PASSWORD_mysql1", item.Key); + Assert.Equal(mysqlResource.PasswordParameter.Value, item.Value); + }, + item => + { + Assert.Equal("PORT_mysql1", item.Key); + Assert.Equal(mysqlResource.PrimaryEndpoint.TargetPort.ToString(), item.Value); + }, + item => + { + Assert.Equal("ENGINE_mysql1", item.Key); + Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); + }, + item => + { + Assert.Equal("CONNECTIONS", item.Key); + Assert.Equal("mysql1", item.Value); + }); + } + + [Fact] + public void MultipleWithDbGateCallsAddsOneDbGateResource() + { + var builder = DistributedApplication.CreateBuilder(); + builder.AddMySql("mysql1").WithDbGate(); + builder.AddMySql("mysql2").WithDbGate(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(dbGateResource); + + Assert.Equal("mysql1-dbgate", dbGateResource.Name); + } + + [Fact] + public void WithDbGateShouldChangeDbGateHostPort() + { + var builder = DistributedApplication.CreateBuilder(); + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithDbGate(c => c.WithHostPort(8068)); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(dbGateResource); + + var primaryEndpoint = dbGateResource.Annotations.OfType().Single(); + Assert.Equal(8068, primaryEndpoint.Port); + } + + [Fact] + public void WithDbGateShouldChangeDbGateContainerImageTag() + { + var builder = DistributedApplication.CreateBuilder(); + var mysqlResourceBuilder = builder.AddMySql("mysql") + .WithDbGate(c => c.WithImageTag("manualTag")); + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(dbGateResource); + + var containerImageAnnotation = dbGateResource.Annotations.OfType().Single(); + Assert.Equal("manualTag", containerImageAnnotation.Tag); + } + + [Fact] + public async Task WithDbGateAddsAnnotationsForMultipleMySqlResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var mysqlResourceBuilder1 = builder.AddMySql("mysql1") + .WithDbGate(); + + var mysqlResource1 = mysqlResourceBuilder1.Resource; + + var mysqlResourceBuilder2 = builder.AddMySql("mysql2") + .WithDbGate(); + + var mysqlResource2 = mysqlResourceBuilder2.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var dbGateResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(dbGateResource); + + Assert.Equal("mysql1-dbgate", dbGateResource.Name); + + var envs = await dbGateResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + Assert.Collection(envs, + item => + { + Assert.Equal("LABEL_mysql1", item.Key); + Assert.Equal(mysqlResource1.Name, item.Value); + }, + item => + { + Assert.Equal("SERVER_mysql1", item.Key); + Assert.Equal(mysqlResource1.Name, item.Value); + }, + item => + { + Assert.Equal("USER_mysql1", item.Key); + Assert.Equal("root", item.Value); + }, + item => + { + Assert.Equal("PASSWORD_mysql1", item.Key); + Assert.Equal(mysqlResource1.PasswordParameter.Value, item.Value); + }, + item => + { + Assert.Equal("PORT_mysql1", item.Key); + Assert.Equal(mysqlResource1.PrimaryEndpoint.TargetPort.ToString(), item.Value); + }, + item => + { + Assert.Equal("ENGINE_mysql1", item.Key); + Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); + }, + item => + { + Assert.Equal("LABEL_mysql2", item.Key); + Assert.Equal(mysqlResource2.Name, item.Value); + }, + item => + { + Assert.Equal("SERVER_mysql2", item.Key); + Assert.Equal(mysqlResource2.Name, item.Value); + }, + item => + { + Assert.Equal("USER_mysql2", item.Key); + Assert.Equal("root", item.Value); + }, + item => + { + Assert.Equal("PASSWORD_mysql2", item.Key); + Assert.Equal(mysqlResource2.PasswordParameter.Value, item.Value); + }, + item => + { + Assert.Equal("PORT_mysql2", item.Key); + Assert.Equal(mysqlResource2.PrimaryEndpoint.TargetPort.ToString(), item.Value); + }, + item => + { + Assert.Equal("ENGINE_mysql2", item.Key); + Assert.Equal("mysql@dbgate-plugin-mysql", item.Value); + }, + item => + { + Assert.Equal("CONNECTIONS", item.Key); + Assert.Equal("mysql1,mysql2", item.Value); + }); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/AddNgrokTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/AddNgrokTests.cs index 0a4aea59..e01d7c13 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/AddNgrokTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/AddNgrokTests.cs @@ -41,7 +41,8 @@ public void AddNgrokEmptyNameThrows() { var builder = DistributedApplication.CreateBuilder(); - Assert.Throws(() => builder.AddNgrok("")); + var name = ""; + Assert.Throws(() => builder.AddNgrok(name)); } [Fact] @@ -64,16 +65,18 @@ public void AddNgrokWhitespaceConfigurationFolderThrows() public void AddNgrokEmptyEndpointNameFolderThrows() { var builder = DistributedApplication.CreateBuilder(); + var endpointName = ""; - Assert.Throws(() => builder.AddNgrok("ngrok", endpointName: "")); + Assert.Throws(() => builder.AddNgrok("ngrok", endpointName)); } [Fact] public void AddNgrokWhitespaceEndpointNameFolderThrows() { var builder = DistributedApplication.CreateBuilder(); + var endpointName = " "; - Assert.Throws(() => builder.AddNgrok("ngrok", endpointName: " ")); + Assert.Throws(() => builder.AddNgrok("ngrok", endpointName)); } [Fact] diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs index 939e8219..bc07605b 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs @@ -2,7 +2,6 @@ namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; -#pragma warning disable CTASPIRE001 public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> { [Theory] @@ -13,7 +12,7 @@ public async Task ResourceStartsAndRespondsOk(string appName) { var httpClient = fixture.CreateHttpClient(appName); - await fixture.App.WaitForTextAsync("VITE", appName).WaitAsync(TimeSpan.FromSeconds(30)); + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(appName).WaitAsync(TimeSpan.FromMinutes(1)); var response = await httpClient.GetAsync("/"); diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/IntegrationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/IntegrationTests.cs new file mode 100644 index 00000000..cdaaa80f --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/IntegrationTests.cs @@ -0,0 +1,94 @@ +using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; + +namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; + +/// +/// Integration test that demonstrates the new resource-based package installer architecture. +/// This shows how installer resources appear as separate resources in the application model. +/// +public class IntegrationTests +{ + [Fact] + public void ResourceBasedPackageInstallersAppearInApplicationModel() + { + var builder = DistributedApplication.CreateBuilder(); + + // Add multiple Node.js apps with different package managers + var viteApp = builder.AddViteApp("vite-app", "./frontend") + .WithNpmPackageInstallation(useCI: true); + + var yarnApp = builder.AddYarnApp("yarn-app", "./backend") + .WithYarnPackageInstallation(); + + var pnpmApp = builder.AddPnpmApp("pnpm-app", "./admin") + .WithPnpmPackageInstallation(); + + using var app = builder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Verify all Node.js app resources are present + var nodeResources = appModel.Resources.OfType().ToList(); + Assert.Equal(3, nodeResources.Count); + + // Verify all installer resources are present as separate resources + var npmInstallers = appModel.Resources.OfType().ToList(); + var yarnInstallers = appModel.Resources.OfType().ToList(); + var pnpmInstallers = appModel.Resources.OfType().ToList(); + + Assert.Single(npmInstallers); + Assert.Single(yarnInstallers); + Assert.Single(pnpmInstallers); + + // Verify installer resources have expected names (would appear on dashboard) + Assert.Equal("vite-app-npm-install", npmInstallers[0].Name); + Assert.Equal("yarn-app-yarn-install", yarnInstallers[0].Name); + Assert.Equal("pnpm-app-pnpm-install", pnpmInstallers[0].Name); + + // Verify parent-child relationships + foreach (var installer in npmInstallers.Cast() + .Concat(yarnInstallers.Cast()) + .Concat(pnpmInstallers.Cast())) + { + Assert.True(installer.TryGetAnnotationsOfType(out var relationships)); + Assert.Single(relationships); + Assert.Equal("Parent", relationships.First().Type); + } + + // Verify all Node.js apps wait for their installers + foreach (var nodeApp in nodeResources) + { + Assert.True(nodeApp.TryGetAnnotationsOfType(out var waitAnnotations)); + Assert.Single(waitAnnotations); + + var waitedResource = waitAnnotations.First().Resource; + Assert.True(waitedResource is NpmInstallerResource || + waitedResource is YarnInstallerResource || + waitedResource is PnpmInstallerResource); + } + } + + [Fact] + public void InstallerResourcesHaveCorrectExecutableConfiguration() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddNpmApp("test-app", "./test") + .WithNpmPackageInstallation(useCI: true); + + using var app = builder.Build(); + var appModel = app.Services.GetRequiredService(); + + var installer = Assert.Single(appModel.Resources.OfType()); + + // Verify it's configured as an ExecutableResource + Assert.IsAssignableFrom(installer); + + // Verify working directory matches parent + var parentApp = Assert.Single(appModel.Resources.OfType()); + Assert.Equal(parentApp.WorkingDirectory, installer.WorkingDirectory); + + // Verify command arguments are configured + Assert.True(installer.TryGetAnnotationsOfType(out var argsAnnotations)); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/PackageInstallationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/PackageInstallationTests.cs new file mode 100644 index 00000000..6c5ab326 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/PackageInstallationTests.cs @@ -0,0 +1,172 @@ +using Aspire.Hosting; + +namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; + +public class PackageInstallationTests +{ + /// + /// This test validates that the WithNpmPackageInstallation method creates + /// installer resources with proper arguments and relationships. + /// + [Fact] + public async Task WithNpmPackageInstallation_CanBeConfiguredWithInstallAndCIOptions() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddNpmApp("test-app", "./test-app"); + var nodeApp2 = builder.AddNpmApp("test-app-ci", "./test-app-ci"); + + // Test that both configurations can be set up without errors + nodeApp.WithNpmPackageInstallation(useCI: false); // Uses npm install + nodeApp2.WithNpmPackageInstallation(useCI: true); // Uses npm ci + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + var nodeResources = appModel.Resources.OfType().ToList(); + var installerResources = appModel.Resources.OfType().ToList(); + + Assert.Equal(2, nodeResources.Count); + Assert.Equal(2, installerResources.Count); + Assert.All(nodeResources, resource => Assert.Equal("npm", resource.Command)); + + // Verify install vs ci commands + var installResource = installerResources.Single(r => r.Name == "test-app-npm-install"); + var ciResource = installerResources.Single(r => r.Name == "test-app-ci-npm-install"); + + Assert.Equal("npm", installResource.Command); + var args = await installResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("install", args[0]); + + Assert.Equal("npm", ciResource.Command); + args = await ciResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("ci", args[0]); + } + + [Fact] + public void WithNpmPackageInstallation_ExcludedFromPublishMode() + { + var builder = DistributedApplication.CreateBuilder(["Publishing:Publisher=manifest", "Publishing:OutputPath=./publish"]); + + var nodeApp = builder.AddNpmApp("test-app", "./test-app"); + nodeApp.WithNpmPackageInstallation(useCI: false); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + // Verify the NodeApp resource exists + var nodeResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("npm", nodeResource.Command); + + // Verify NO installer resource was created in publish mode + var installerResources = appModel.Resources.OfType().ToList(); + Assert.Empty(installerResources); + + // Verify no wait annotations were added + Assert.False(nodeResource.TryGetAnnotationsOfType(out _)); + } + + [Fact] + public async Task WithNpmPackageInstallation_CanAcceptAdditionalArgs() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddNpmApp("test-app", "./test-app"); + var nodeAppWithArgs = builder.AddNpmApp("test-app-args", "./test-app-args"); + + // Test npm install with additional args + nodeApp.WithNpmPackageInstallation(useCI: false, configureInstaller: installerBuilder => + { + installerBuilder.WithArgs("--legacy-peer-deps"); + }); + nodeAppWithArgs.WithNpmPackageInstallation(useCI: true, configureInstaller: installerBuilder => + { + installerBuilder.WithArgs("--verbose", "--no-optional"); + }); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + var installerResources = appModel.Resources.OfType().ToList(); + + Assert.Equal(2, installerResources.Count); + + var installResource = installerResources.Single(r => r.Name == "test-app-npm-install"); + var ciResource = installerResources.Single(r => r.Name == "test-app-args-npm-install"); + + // Verify install command with additional args + var installArgs = await installResource.GetArgumentValuesAsync(); + Assert.Collection( + installArgs, + arg => Assert.Equal("install", arg), + arg => Assert.Equal("--legacy-peer-deps", arg) + ); + + // Verify ci command with additional args + var ciArgs = await ciResource.GetArgumentValuesAsync(); + Assert.Collection( + ciArgs, + arg => Assert.Equal("ci", arg), + arg => Assert.Equal("--verbose", arg), + arg => Assert.Equal("--no-optional", arg) + ); + } + + [Fact] + public async Task WithYarnPackageInstallation_CanAcceptAdditionalArgs() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddYarnApp("test-yarn-app", "./test-yarn-app"); + nodeApp.WithYarnPackageInstallation(configureInstaller: installerBuilder => + { + installerBuilder.WithArgs("--frozen-lockfile", "--verbose"); + }); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + var installerResources = appModel.Resources.OfType().ToList(); + + var installerResource = Assert.Single(installerResources); + Assert.Equal("test-yarn-app-yarn-install", installerResource.Name); + + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Collection( + args, + arg => Assert.Equal("install", arg), + arg => Assert.Equal("--frozen-lockfile", arg), + arg => Assert.Equal("--verbose", arg) + ); + } + + [Fact] + public async Task WithPnpmPackageInstallation_CanAcceptAdditionalArgs() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddPnpmApp("test-pnpm-app", "./test-pnpm-app"); + nodeApp.WithPnpmPackageInstallation(configureInstaller: installerBuilder => + { + installerBuilder.WithArgs("--frozen-lockfile"); + }); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + var installerResources = appModel.Resources.OfType().ToList(); + + var installerResource = Assert.Single(installerResources); + Assert.Equal("test-pnpm-app-pnpm-install", installerResource.Name); + + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Collection( + args, + arg => Assert.Equal("install", arg), + arg => Assert.Equal("--frozen-lockfile", arg) + ); + } +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index e291145f..9e9377de 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -1,6 +1,6 @@ using Aspire.Hosting; -using Microsoft.AspNetCore.Http; -using System.Diagnostics; +using Aspire.Hosting.ApplicationModel; +using System.Runtime.InteropServices; namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; @@ -141,7 +141,7 @@ public void ViteAppHasExposedHttpsEndpoints() [Fact] - public void ViteAppHasExposedExternalHttpEndpoints() + public void ViteAppDoesNotExposeExternalHttpEndpointsByDefault() { var builder = DistributedApplication.CreateBuilder(); @@ -157,6 +157,186 @@ public void ViteAppHasExposedExternalHttpEndpoints() Assert.True(resource.TryGetAnnotationsOfType(out var endpoints)); - Assert.Contains(endpoints, e => e.IsExternal); + Assert.DoesNotContain(endpoints, e => e.IsExternal); + } + + [Fact] + public async Task WithNpmPackageInstallationDefaultsToInstallCommand() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddNpmApp("test-app", "./test-app"); + + // Add package installation with default settings (should use npm install, not ci) + nodeApp.WithNpmPackageInstallation(useCI: false); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + // Verify the NodeApp resource exists + var nodeResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("npm", nodeResource.Command); + + // Verify the installer resource was created + var installerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("test-app-npm-install", installerResource.Name); + Assert.Equal("npm", installerResource.Command); + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("install", args[0]); + + // Verify the parent-child relationship + Assert.True(installerResource.TryGetAnnotationsOfType(out var relationships)); + var relationship = Assert.Single(relationships); + Assert.Same(nodeResource, relationship.Resource); + Assert.Equal("Parent", relationship.Type); + + // Verify the wait annotation on the parent + Assert.True(nodeResource.TryGetAnnotationsOfType(out var waitAnnotations)); + var waitAnnotation = Assert.Single(waitAnnotations); + Assert.Same(installerResource, waitAnnotation.Resource); + } + + [Fact] + public async Task WithNpmPackageInstallationCanUseCICommand() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddNpmApp("test-app", "./test-app"); + + // Add package installation with CI enabled + nodeApp.WithNpmPackageInstallation(useCI: true); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + // Verify the NodeApp resource exists + var nodeResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("npm", nodeResource.Command); + + // Verify the installer resource was created with CI enabled + var installerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("test-app-npm-install", installerResource.Name); + Assert.Equal("npm", installerResource.Command); + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("ci", args[0]); + + // Verify the parent-child relationship + Assert.True(installerResource.TryGetAnnotationsOfType(out var relationships)); + var relationship = Assert.Single(relationships); + Assert.Same(nodeResource, relationship.Resource); + Assert.Equal("Parent", relationship.Type); + + // Verify the wait annotation on the parent + Assert.True(nodeResource.TryGetAnnotationsOfType(out var waitAnnotations)); + var waitAnnotation = Assert.Single(waitAnnotations); + Assert.Same(installerResource, waitAnnotation.Resource); + } + + [Fact] + public void ViteAppConfiguresPortFromEnvironment() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddViteApp("vite"); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + // Verify that command line arguments callback is configured + Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbackAnnotations)); + List args = []; + var ctx = new CommandLineArgsCallbackContext(args); + + foreach (var annotation in argsCallbackAnnotations) + { + annotation.Callback(ctx); + } + + Assert.Collection(args, + arg => Assert.Equal("run", arg), + arg => Assert.Equal("dev", arg), + arg => Assert.Equal("--", arg), + arg => Assert.Equal("--port", arg), + arg => Assert.IsType(arg) + ); + } + + [Fact] + public async Task WithYarnPackageInstallationCreatesInstallerResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddYarnApp("test-app", "./test-app"); + nodeApp.WithYarnPackageInstallation(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + // Verify the NodeApp resource exists + var nodeResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("yarn", nodeResource.Command); + + // Verify the installer resource was created + var installerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("test-app-yarn-install", installerResource.Name); + Assert.Equal("yarn", installerResource.Command); + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("install", args[0]); + + // Verify the parent-child relationship + Assert.True(installerResource.TryGetAnnotationsOfType(out var relationships)); + var relationship = Assert.Single(relationships); + Assert.Same(nodeResource, relationship.Resource); + Assert.Equal("Parent", relationship.Type); + + // Verify the wait annotation on the parent + Assert.True(nodeResource.TryGetAnnotationsOfType(out var waitAnnotations)); + var waitAnnotation = Assert.Single(waitAnnotations); + Assert.Same(installerResource, waitAnnotation.Resource); + } + + [Fact] + public async Task WithPnpmPackageInstallationCreatesInstallerResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var nodeApp = builder.AddPnpmApp("test-app", "./test-app"); + nodeApp.WithPnpmPackageInstallation(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + // Verify the NodeApp resource exists + var nodeResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("pnpm", nodeResource.Command); + + // Verify the installer resource was created + var installerResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("test-app-pnpm-install", installerResource.Name); + Assert.Equal("pnpm", installerResource.Command); + var args = await installerResource.GetArgumentValuesAsync(); + Assert.Single(args); + Assert.Equal("install", args[0]); + + // Verify the parent-child relationship + Assert.True(installerResource.TryGetAnnotationsOfType(out var relationships)); + var relationship = Assert.Single(relationships); + Assert.Same(nodeResource, relationship.Resource); + Assert.Equal("Parent", relationship.Type); + + // Verify the wait annotation on the parent + Assert.True(nodeResource.TryGetAnnotationsOfType(out var waitAnnotations)); + var waitAnnotation = Assert.Single(waitAnnotations); + Assert.Same(installerResource, waitAnnotation.Resource); } } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.Ollama.Tests/AddOllamaTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Ollama.Tests/AddOllamaTests.cs index 236876fe..cf7d2b7c 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Ollama.Tests/AddOllamaTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Ollama.Tests/AddOllamaTests.cs @@ -166,6 +166,21 @@ public void OpenWebUIConfigured() Assert.Single(resource.OllamaResources); } + [Fact] + public void OpenWebUIResourceExcludedFromManifestByDefault() + { + var builder = DistributedApplication.CreateBuilder(); + _ = builder.AddOllama("ollama", port: null).WithOpenWebUI(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + Assert.True(resource.TryGetAnnotationsOfType(out var annotations)); + } + [Fact] public void OpenWebUIConfiguredWithMultipleOllamaServers() { @@ -383,6 +398,21 @@ public void OllamaRegistersHttpHealthCheck() Assert.Contains(resource.Name, annotation.Key); } + [Fact] + public void ResourceIncludedInManifestByDefault() + { + var builder = DistributedApplication.CreateBuilder(); + _ = builder.AddOllama("ollama"); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + Assert.False(resource.TryGetAnnotationsOfType(out var annotations)); + } + [Fact] public void OllamaRegistrationContainsResourceCommandAnnotations() { @@ -581,13 +611,40 @@ public void OllamaResourceCommandsUpdateState(string commandType) Assert.Equal(ResourceCommandState.Enabled, state); } - [Theory] - [InlineData(OllamaGpuVendor.Nvidia, "--gpus", "all")] - [InlineData(OllamaGpuVendor.AMD, "--device", "/dev/kfd")] - public async Task WithGPUSupport(OllamaGpuVendor vendor, string expectedArg, string expectedValue) + [Fact] + public async Task WithNvidiaGPUSupport() + { + var builder = DistributedApplication.CreateBuilder(); + _ = builder.AddOllama("ollama").WithGPUSupport(OllamaGpuVendor.Nvidia); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + Assert.True(resource.TryGetLastAnnotation(out ContainerRuntimeArgsCallbackAnnotation? argsAnnotations)); + ContainerRuntimeArgsCallbackContext context = new([]); + await argsAnnotations.Callback(context); + + Assert.Collection( + context.Args, + arg => + { + Assert.Equal("--gpus", arg); + }, + arg => + { + Assert.Equal("all", arg); + } + ); + } + + [Fact] + public async Task WithAMDGPUSupport() { var builder = DistributedApplication.CreateBuilder(); - _ = builder.AddOllama("ollama").WithGPUSupport(vendor); + _ = builder.AddOllama("ollama").WithGPUSupport(OllamaGpuVendor.AMD); using var app = builder.Build(); @@ -603,12 +660,24 @@ public async Task WithGPUSupport(OllamaGpuVendor vendor, string expectedArg, str context.Args, arg => { - Assert.Equal(expectedArg, arg); + Assert.Equal("--device", arg); }, arg => { - Assert.Equal(expectedValue, arg); + Assert.Equal("/dev/kfd", arg); + }, + arg => + { + Assert.Equal("--device", arg); + }, + arg => + { + Assert.Equal("/dev/dri", arg); } ); + + Assert.True(resource.TryGetLastAnnotation(out var imageAnnotation)); + Assert.NotNull(imageAnnotation); + Assert.EndsWith("-rocm", imageAnnotation.Tag, StringComparison.OrdinalIgnoreCase); } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj index 326f2c0e..fcac4a6f 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests.csproj @@ -4,4 +4,7 @@ + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs index 7492a1a2..6c442c49 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.PostgreSQL.Extensions.Tests; @@ -278,4 +279,159 @@ public async Task WithDbGateAddsAnnotationsForProvidedUsernamePassword() Assert.Equal("postgres1", item.Value); }); } + + [Fact] + public async Task WithAdminerAddsAnnotations() + { + var builder = DistributedApplication.CreateBuilder(); + + var postgresResourceBuilder = builder.AddPostgres("postgres") + .WithAdminer(); + + var postgresResource = postgresResourceBuilder.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerResource); + + Assert.Equal("postgres-adminer", adminerResource.Name); + + var envs = await adminerResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "postgres", + new AdminerLoginServer + { + Driver = "pgsql", + Server = postgresResource.Name, + Password = postgresResource.PasswordParameter.Value, + UserName = postgresResource.UserNameParameter?.Value ?? "postgres" + } + }, + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + + [Fact] + public void MultipleWithAdminerCallsAddsOneDbGateResource() + { + var builder = DistributedApplication.CreateBuilder(); + builder.AddPostgres("postgres1").WithAdminer(); + builder.AddPostgres("postgres2").WithAdminer(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + Assert.Equal("postgres1-adminer", adminerContainer.Name); + } + + [Fact] + public void WithAdminerShouldChangeAdminerHostPort() + { + var builder = DistributedApplication.CreateBuilder(); + var postgresResourceBuilder = builder.AddPostgres("postgres") + .WithAdminer(c => c.WithHostPort(8068)); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var primaryEndpoint = adminerContainer.Annotations.OfType().Single(); + Assert.Equal(8068, primaryEndpoint.Port); + } + + [Fact] + public void WithAdminerShouldChangeAdminerContainerImageTag() + { + var builder = DistributedApplication.CreateBuilder(); + var postgresResourceBuilder = builder.AddPostgres("postgres") + .WithAdminer(c => c.WithImageTag("manualTag")); + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var containerImageAnnotation = adminerContainer.Annotations.OfType().Single(); + Assert.Equal("manualTag", containerImageAnnotation.Tag); + } + + [Fact] + public async Task WithAdminerAddsAnnotationsForMultiplePostgresResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var postgresResourceBuilder1 = builder.AddPostgres("postgres1") + .WithAdminer(); + + var postgresResource1 = postgresResourceBuilder1.Resource; + + var postgresResourceBuilder2 = builder.AddPostgres("postgres2") + .WithDbGate(); + + var postgresResource2 = postgresResourceBuilder2.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerContainer); + + Assert.Equal("postgres1-adminer", adminerContainer.Name); + + var envs = await adminerContainer.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "postgres1", + new AdminerLoginServer + { + Driver = "pgsql", + Server = postgresResource1.Name, + Password = postgresResource1.PasswordParameter.Value, + UserName = postgresResource1.UserNameParameter?.Value ?? "postgres" + } + }, + { + "postgres2", + new AdminerLoginServer + { + Driver = "pgsql", + Server = postgresResource2.Name, + Password = postgresResource2.PasswordParameter.Value, + UserName = postgresResource2.UserNameParameter?.Value ?? "postgres" + } + } + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/AppHostTests.cs new file mode 100644 index 00000000..284d5c7b --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/AppHostTests.cs @@ -0,0 +1,45 @@ +using Aspire.Components.Common.Tests; +using CommunityToolkit.Aspire.Testing; + +namespace CommunityToolkit.Aspire.Hosting.PowerShell.Tests; + +[RequiresDocker] +public class AppHostTests(AspireIntegrationTestFixture fixture) : + IClassFixture> +{ + [Fact] + public async Task PowerShellResourceStarts() + { + var resourceName = "ps"; + await fixture.ResourceNotificationService + .WaitForResourceAsync(resourceName, KnownResourceStates.Running) + .WaitAsync(TimeSpan.FromSeconds(60)); + + Assert.True(true); + } + + [Fact] + public async Task ScriptsExecuteSuccessfully() + { + var model = fixture.App.Services.GetRequiredService(); + + var script1 = model.Resources + .OfType() + .Single(r => r.Name == "script1"); + + var ready1 = fixture.ResourceNotificationService + .WaitForResourceAsync(script1.Name, KnownResourceStates.Finished) + .WaitAsync(TimeSpan.FromSeconds(90)); + + var script2 = model.Resources + .OfType() + .Single(r => r.Name == "script2"); + + var ready2 = fixture.ResourceNotificationService + .WaitForResourceAsync(script2.Name, KnownResourceStates.Finished) + .WaitAsync(TimeSpan.FromSeconds(90)); + + await Task.WhenAll([ready1, ready2]); + } +} + diff --git a/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests.csproj new file mode 100644 index 00000000..1080a2c1 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests/CommunityToolkit.Aspire.Hosting.PowerShell.Tests.csproj @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs index 8d522f8e..6b2caf91 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Redis.Extensions.Tests/ResourceCreationTests.cs @@ -34,10 +34,12 @@ public async Task WithDbGateAddsAnnotations() Assert.Equal("LABEL_redis1", item.Key); Assert.Equal(redisResource.Name, item.Value); }, - async item => + item => { + var redisUrl = redisResource.PasswordParameter is not null ? + $"redis://:{redisResource.PasswordParameter.Value}@{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource.Name}:{redisResource.PrimaryEndpoint.TargetPort}"; Assert.Equal("URL_redis1", item.Key); - Assert.Equal(await redisResource.ConnectionStringExpression.GetValueAsync(default), item.Value); + Assert.Equal(redisUrl, item.Value); }, item => { @@ -139,10 +141,13 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() Assert.Equal("LABEL_redis1", item.Key); Assert.Equal(redisResource1.Name, item.Value); }, - async item => + item => { + var redisUrl = redisResource1.PasswordParameter is not null ? + $"redis://:{redisResource1.PasswordParameter.Value}@{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource1.Name}:{redisResource1.PrimaryEndpoint.TargetPort}"; + Assert.Equal("URL_redis1", item.Key); - Assert.Equal(await redisResource1.ConnectionStringExpression.GetValueAsync(default), item.Value); + Assert.Equal(redisUrl, item.Value); }, item => { @@ -154,10 +159,13 @@ public async Task WithDbGateAddsAnnotationsForMultipleRedisResource() Assert.Equal("LABEL_redis2", item.Key); Assert.Equal(redisResource2.Name, item.Value); }, - async item => + item => { + var redisUrl = redisResource2.PasswordParameter is not null ? + $"redis://:{redisResource2.PasswordParameter.Value}@{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}" : $"redis://{redisResource2.Name}:{redisResource2.PrimaryEndpoint.TargetPort}"; + Assert.Equal("URL_redis2", item.Key); - Assert.Equal(await redisResource2.ConnectionStringExpression.GetValueAsync(default), item.Value); + Assert.Equal(redisUrl, item.Value); }, item => { diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlPackageTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlPackageTests.cs index 62faf703..6d12ab02 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlPackageTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlPackageTests.cs @@ -91,4 +91,29 @@ public void AddSqlPackage_WithDeploymentOptions() var options = ((IResourceWithDacpac)sqlProjectResource).GetDacpacDeployOptions(); Assert.True(options.IncludeCompositeObjects); } + + [Fact] + public void AddSqlPackage_WithDeploymentOptions_FromFile() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + var optionsPath = "Database.publish.xml"; + + appBuilder.AddSqlPackage("chinook").WithDacDeployOptions(optionsPath); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType>()); + Assert.Equal("chinook", sqlProjectResource.Name); + + Assert.True(sqlProjectResource.TryGetLastAnnotation(out DacDeployOptionsAnnotation? dacDeployOptionsAnnotation)); + Assert.Equal(optionsPath, dacDeployOptionsAnnotation.OptionsPath); + + var options = ((IResourceWithDacpac)sqlProjectResource).GetDacpacDeployOptions(); + Assert.False(options.BlockOnPossibleDataLoss); + } } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlProjectTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlProjectTests.cs index 1d9af980..4cb10544 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlProjectTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/AddSqlProjectTests.cs @@ -94,6 +94,55 @@ public void AddSqlProject_WithDeploymentOptions() Assert.True(options.IncludeCompositeObjects); } + [Fact] + public void AddSqlProject_WithDeploymentOptions_FromFile_NonExisting() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + var optionsPath = "/folder/project.publish.xml"; + + appBuilder.AddSqlProject("MySqlProject").WithDacDeployOptions(optionsPath); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("MySqlProject", sqlProjectResource.Name); + + Assert.True(sqlProjectResource.TryGetLastAnnotation(out DacDeployOptionsAnnotation? dacDeployOptionsAnnotation)); + Assert.Equal(optionsPath, dacDeployOptionsAnnotation.OptionsPath); + + Assert.Throws(() => ((IResourceWithDacpac)sqlProjectResource).GetDacpacDeployOptions()); + } + + [Fact] + public void AddSqlProject_WithDeploymentOptions_FromFile() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + var optionsPath = "Database.publish.xml"; + + appBuilder.AddSqlProject("MySqlProject").WithDacDeployOptions(optionsPath); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("MySqlProject", sqlProjectResource.Name); + + Assert.True(sqlProjectResource.TryGetLastAnnotation(out DacDeployOptionsAnnotation? dacDeployOptionsAnnotation)); + Assert.Equal(optionsPath, dacDeployOptionsAnnotation.OptionsPath); + + var options = ((IResourceWithDacpac)sqlProjectResource).GetDacpacDeployOptions(); + Assert.False(options.BlockOnPossibleDataLoss); + } + [Fact] public void WithReference_AddsRequiredServices() { @@ -110,4 +159,25 @@ public void WithReference_AddsRequiredServices() Assert.Single(app.Services.GetServices()); Assert.Single(app.Services.GetServices()); } + + [Fact] + public void AddSqlProject_WithExplicitStart() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + var targetDatabase = appBuilder.AddSqlServer("sql").AddDatabase("test"); + appBuilder.AddSqlProject("MySqlProject") + .WithReference(targetDatabase) + .WithExplicitStart(); + + // Act + using var app = appBuilder.Build(); + var appModel = app.Services.GetRequiredService(); + + // Assert + var sqlProjectResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("MySqlProject", sqlProjectResource.Name); + + Assert.True(sqlProjectResource.HasAnnotationOfType()); + } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests.csproj index 32fdcb67..02800ae5 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests.csproj +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests.csproj @@ -10,4 +10,10 @@ + + + Always + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/Database.publish.xml b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/Database.publish.xml new file mode 100644 index 00000000..d20ad984 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlDatabaseProjects.Tests/Database.publish.xml @@ -0,0 +1,9 @@ + + + + Database + Database.sql + False + 1 + + \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests.csproj index 287ebec7..a46f31d1 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests.csproj +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests.csproj @@ -4,4 +4,7 @@ + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs index 89b2c336..6ed2589a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using System.Text.Json; namespace CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.Tests; @@ -212,4 +213,160 @@ public async Task WithDbGateAddsAnnotationsForMultipleSqlServerResource() Assert.Equal("sqlserver1,sqlserver2", item.Value); }); } + + [Fact] + public async Task WithAdminerAddsAnnotations() + { + var builder = DistributedApplication.CreateBuilder(); + + var sqlServerResourceBuilder = builder.AddSqlServer("sqlserver") + .WithAdminer(); + + var sqlserverResource = sqlServerResourceBuilder.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerResource = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerResource); + + Assert.Equal("sqlserver-adminer", adminerResource.Name); + + var envs = await adminerResource.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "sqlserver", + new AdminerLoginServer + { + Driver = "mssql", + Server = sqlserverResource.Name, + Password = sqlserverResource.PasswordParameter.Value, + UserName = "sa" + } + }, + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + + [Fact] + public void MultipleWithAdminerCallsAddsOneDbGateResource() + { + var builder = DistributedApplication.CreateBuilder(); + builder.AddSqlServer("sqlserver1").WithAdminer(); + builder.AddSqlServer("sqlserver2").WithAdminer(); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + Assert.Equal("sqlserver1-adminer", adminerContainer.Name); + } + + [Fact] + public void WithAdminerShouldChangeAdminerHostPort() + { + var builder = DistributedApplication.CreateBuilder(); + var sqlserverResourceBuilder = builder.AddSqlServer("sqlserver") + .WithAdminer(c => c.WithHostPort(8068)); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var primaryEndpoint = adminerContainer.Annotations.OfType().Single(); + Assert.Equal(8068, primaryEndpoint.Port); + } + + [Fact] + public void WithAdminerShouldChangeAdminerContainerImageTag() + { + var builder = DistributedApplication.CreateBuilder(); + var sqlserverResourceBuilder = builder.AddSqlServer("sqlserver") + .WithAdminer(c => c.WithImageTag("manualTag")); + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + Assert.NotNull(adminerContainer); + + var containerImageAnnotation = adminerContainer.Annotations.OfType().Single(); + Assert.Equal("manualTag", containerImageAnnotation.Tag); + } + + [Fact] + public async Task WithAdminerAddsAnnotationsForMultipleSqlServerResource() + { + var builder = DistributedApplication.CreateBuilder(); + + var sqlserverResourceBuilder1 = builder.AddSqlServer("sqlserver1") + .WithAdminer(); + + var sqlserverResource1 = sqlserverResourceBuilder1.Resource; + + var sqlserverResourceBuilder2 = builder.AddSqlServer("sqlserver2") + .WithDbGate(); + + var sqlserverResource2 = sqlserverResourceBuilder2.Resource; + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var adminerContainer = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(adminerContainer); + + Assert.Equal("sqlserver1-adminer", adminerContainer.Name); + + var envs = await adminerContainer.GetEnvironmentVariableValuesAsync(); + + Assert.NotEmpty(envs); + + var servers = new Dictionary + { + { + "sqlserver1", + new AdminerLoginServer + { + Driver = "mssql", + Server = sqlserverResource1.Name, + Password = sqlserverResource1.PasswordParameter.Value, + UserName = "sa" + } + }, + { + "sqlserver2", + new AdminerLoginServer + { + Driver = "mssql", + Server = sqlserverResource2.Name, + Password = sqlserverResource2.PasswordParameter.Value, + UserName = "sa" + } + } + }; + + var envValue = JsonSerializer.Serialize(servers); + var item = Assert.Single(envs); + Assert.Equal("ADMINER_SERVERS", item.Key); + Assert.Equal(envValue, item.Value); + } + } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/AddSqliteTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/AddSqliteTests.cs index 4021a07f..c521a4cf 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/AddSqliteTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/AddSqliteTests.cs @@ -1,7 +1,6 @@ using Aspire.Hosting; namespace CommunityToolkit.Aspire.Hosting.Sqlite; -#pragma warning disable CTASPIRE002 public class AddSqliteTests { [Fact] @@ -45,15 +44,12 @@ public void ResourceIsRunningState() } [Fact] - public void ResourceExcludedFromManifestByDefault() + public void ResourceIncludedInManifestByDefault() { var builder = DistributedApplication.CreateBuilder(); var sqlite = builder.AddSqlite("sqlite"); - Assert.True(sqlite.Resource.TryGetAnnotationsOfType(out var annotations)); - var annotation = Assert.Single(annotations); - - Assert.Null(annotation.Callback); + Assert.False(sqlite.Resource.TryGetAnnotationsOfType(out var annotations)); } [Fact] @@ -102,7 +98,7 @@ public async Task ResourceUsesProvidedPathAndFileName(string? path, string? file var connectionString = await sqlite.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None); - Assert.Equal($"Data Source={sqlite.Resource.DatabaseFilePath};Cache=Shared;Mode=ReadWriteCreate;Extensions=[]", connectionString); + Assert.Equal($"Data Source={sqlite.Resource.DatabaseFilePath};Cache=Shared;Mode=ReadWriteCreate", connectionString); } [Fact] @@ -146,36 +142,15 @@ public async Task SqliteWebResourceConfigured() } [Fact] - public void ResourceWithExtensionFromNuGet() + public void SqliteWebResourceIncludedInManifestByDefault() { var builder = DistributedApplication.CreateBuilder(); var sqlite = builder.AddSqlite("sqlite") - .WithNuGetExtension("FTS5"); - - Assert.Single(sqlite.Resource.Extensions, static e => e.Extension == "FTS5" && e.PackageName == "FTS5" && e.IsNuGetPackage && e.ExtensionFolder is null); - } + .WithSqliteWeb(); - [Fact] - public void ResourceWithExtensionFromLocal() - { - var builder = DistributedApplication.CreateBuilder(); - var sqlite = builder.AddSqlite("sqlite") - .WithLocalExtension("FTS5", "/path/to/extension"); + var sqliteWeb = Assert.Single(builder.Resources.OfType()); - Assert.Single(sqlite.Resource.Extensions, static e => e.Extension == "FTS5" && e.PackageName is null && !e.IsNuGetPackage && e.ExtensionFolder == "/path/to/extension"); + Assert.False(sqliteWeb.TryGetAnnotationsOfType(out var annotations)); } - [Fact] - public async Task ConnectionStringContainsExtensions() - { - var builder = DistributedApplication.CreateBuilder(); - var sqlite = builder.AddSqlite("sqlite") - .WithNuGetExtension("FTS5") - .WithNuGetExtension("mod_spatialite"); - - var connectionString = await sqlite.Resource.ConnectionStringExpression.GetValueAsync(CancellationToken.None); - - Assert.Contains("FTS5", connectionString); - Assert.Contains("mod_spatialite", connectionString); - } } diff --git a/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/ResourceWithExtensionTests.cs b/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/ResourceWithExtensionTests.cs deleted file mode 100644 index f5747a45..00000000 --- a/tests/CommunityToolkit.Aspire.Hosting.Sqlite.Tests/ResourceWithExtensionTests.cs +++ /dev/null @@ -1,52 +0,0 @@ -#pragma warning disable CTASPIRE002 -using Aspire.Hosting; -using Aspire.Hosting.Utils; -using CommunityToolkit.Aspire.Testing; -using Microsoft.Data.Sqlite; -using Microsoft.Extensions.Hosting; -using Xunit.Abstractions; - -namespace CommunityToolkit.Aspire.Hosting.Sqlite.Tests; - -public class ResourceWithExtensionTests(ITestOutputHelper testOutputHelper) -{ - [Fact(Skip = "Skipping until there is a viable NuGet package for sqlite-vec we can use.")] - public async Task ResourceCreatedWithExtensionIsAccessible() - { - using var builder = TestDistributedApplicationBuilder.Create(testOutputHelper); - - var sqlite = builder.AddSqlite("sqlite") - .WithNuGetExtension("sqlite-vec"); - - await using var app = builder.Build(); - - await app.StartAsync(); - - var hb = Host.CreateApplicationBuilder(); - - hb.Configuration[$"ConnectionStrings:{sqlite.Resource.Name}"] = await sqlite.Resource.ConnectionStringExpression.GetValueAsync(default); - - hb.AddSqliteConnection(sqlite.Resource.Name); - - using var host = hb.Build(); - - await host.StartAsync(); - - var connection = host.Services.GetRequiredService(); - - var result = await IsExtensionLoadedAsync(connection, "vec_version()"); - - Assert.NotNull(result); - var version = Assert.IsType(result); - Assert.Equal("0.1.16", version); - } - - private static async Task IsExtensionLoadedAsync(SqliteConnection connection, string checkFunction) - { - await connection.OpenAsync(); - string checkQuery = $"SELECT {checkFunction}"; - using var command = connection.CreateCommand(); - command.CommandText = checkQuery; - return await command.ExecuteScalarAsync(); - } -} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/ConfigurationTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/ConfigurationTests.cs index bc583421..f940e2a5 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/ConfigurationTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/ConfigurationTests.cs @@ -11,8 +11,4 @@ public void ConnectionStringIsNullByDefault() => [Fact] public void HealthChecksEnabledByDefault() => Assert.False(new SqliteConnectionSettings().DisableHealthChecks); - - [Fact] - public void ExtensionsIsEmptyByDefault() => - Assert.Empty(new SqliteConnectionSettings().Extensions); } diff --git a/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/SqliteConnectionTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/SqliteConnectionTests.cs index 1675a977..eaa2e440 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/SqliteConnectionTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/SqliteConnectionTests.cs @@ -32,7 +32,7 @@ public void ReadsFromConnectionStringCorrectly(bool useKeyed) host.Services.GetRequiredService(); Assert.NotNull(client.ConnectionString); - Assert.Equal("data source=:memory:", client.ConnectionString); + Assert.Equal("data source=:memory:", client.ConnectionString, ignoreCase: true); } [Theory] @@ -60,7 +60,7 @@ public void CanSetConnectionStringInCode(bool useKeyed) host.Services.GetRequiredService(); Assert.NotNull(client.ConnectionString); - Assert.Equal("data source=:memory:", client.ConnectionString); + Assert.Equal("data source=:memory:", client.ConnectionString, ignoreCase: true); } [Theory] @@ -89,7 +89,7 @@ public void CanSetConnectionStringInCodeWithKey(bool useKeyed) host.Services.GetRequiredService(); Assert.NotNull(client.ConnectionString); - Assert.Equal("data source=:memory:", client.ConnectionString); + Assert.Equal("data source=:memory:", client.ConnectionString, ignoreCase: true); } [Fact] @@ -110,37 +110,9 @@ public void CanSetMultipleKeyedConnections() var client2 = host.Services.GetRequiredKeyedService("sqlite2"); Assert.NotNull(client1.ConnectionString); - Assert.Equal("data source=/tmp/sqlite1.db", client1.ConnectionString); + Assert.Equal("data source=/tmp/sqlite1.db", client1.ConnectionString, ignoreCase: true); Assert.NotNull(client2.ConnectionString); - Assert.Equal("data source=/tmp/sqlite2.db", client2.ConnectionString); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void ExtensionsSetViaConnectionString(bool useKeyed) - { - var builder = Host.CreateEmptyApplicationBuilder(null); - builder.Configuration.AddInMemoryCollection([ - new KeyValuePair("ConnectionStrings:sqlite", "Data Source=:memory:;Extensions=[{\"Extension\":\"mod_spatialite\",\"PackageName\":\"mod_spatialite\",\"IsNuGetPackage\":true,\"ExtensionFolder\":null}]") - ]); - - if (useKeyed) - { - builder.AddKeyedSqliteConnection("sqlite", settings => - { - Assert.NotEmpty(settings.Extensions); - Assert.Single(settings.Extensions, e => e.Extension == "mod_spatialite" && e.PackageName == "mod_spatialite" && e.IsNuGetPackage && e.ExtensionFolder is null); - }); - } - else - { - builder.AddSqliteConnection("sqlite", settings => - { - Assert.NotEmpty(settings.Extensions); - Assert.Single(settings.Extensions, e => e.Extension == "mod_spatialite" && e.PackageName == "mod_spatialite" && e.IsNuGetPackage && e.ExtensionFolder is null); - }); - } + Assert.Equal("data source=/tmp/sqlite2.db", client2.ConnectionString, ignoreCase: true); } } diff --git a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/SqliteConnectionTests.cs b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/SqliteConnectionTests.cs index 1211ee78..6546c69e 100644 --- a/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/SqliteConnectionTests.cs +++ b/tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/SqliteConnectionTests.cs @@ -22,7 +22,7 @@ public void ReadsFromConnectionStringCorrectly() var client = host.Services.GetRequiredService(); Assert.NotNull(client.Database.GetConnectionString()); - Assert.Equal("data source=:memory:", client.Database.GetConnectionString()); + Assert.Equal("data source=:memory:", client.Database.GetConnectionString(), ignoreCase: true); } [Fact] @@ -38,7 +38,7 @@ public void CanSetConnectionStringInCode() var client = host.Services.GetRequiredService(); Assert.NotNull(client.Database.GetConnectionString()); - Assert.Equal("data source=:memory:", client.Database.GetConnectionString()); + Assert.Equal("data source=:memory:", client.Database.GetConnectionString(), ignoreCase: true); } [Fact] @@ -56,6 +56,6 @@ public void CanSetConnectionStringInCodeWithKey() var client = host.Services.GetRequiredService(); Assert.NotNull(client.Database.GetConnectionString()); - Assert.Equal("data source=:memory:", client.Database.GetConnectionString()); + Assert.Equal("data source=:memory:", client.Database.GetConnectionString(), ignoreCase: true); } } \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Minio.Client.Tests/CommunityToolkit.Aspire.Minio.Client.Tests.csproj b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/CommunityToolkit.Aspire.Minio.Client.Tests.csproj new file mode 100644 index 00000000..cc38672d --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/CommunityToolkit.Aspire.Minio.Client.Tests.csproj @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConfigurationTests.cs b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConfigurationTests.cs new file mode 100644 index 00000000..de3e563f --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConfigurationTests.cs @@ -0,0 +1,15 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace CommunityToolkit.Aspire.Minio.Client.Tests; + +public class ConfigurationTests +{ + [Fact] + public void EndpointIsNullByDefault() => + Assert.Null(new MinioClientSettings().Endpoint); + + [Fact] + public void CredentialsIsNullByDefault() => + Assert.Null(new MinioClientSettings().Credentials); +} diff --git a/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConformanceTests.cs b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConformanceTests.cs new file mode 100644 index 00000000..5012126f --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/ConformanceTests.cs @@ -0,0 +1,90 @@ +using Aspire.Components.Common.Tests; +using Aspire.Components.ConformanceTests; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Minio; +using Minio.DataModel.Args; + +namespace CommunityToolkit.Aspire.Minio.Client.Tests; + +public class ConformanceTests(MinioContainerFeature minioContainerFeature) : ConformanceTests, IClassFixture +{ + protected override ServiceLifetime ServiceLifetime => ServiceLifetime.Singleton; + + protected override string ActivitySourceName => string.Empty; + + protected override string[] RequiredLogCategories => []; + + protected override bool CanConnectToServer => RequiresDockerAttribute.IsSupported; + + protected override bool SupportsKeyedRegistrations => false; + + protected override string ConfigurationSectionName => "Aspire:Minio:Client"; + + protected override void PopulateConfiguration(ConfigurationManager configuration, string? key = null) + { + var endpoint = RequiresDockerAttribute.IsSupported ? + $"{minioContainerFeature.GetContainerEndpoint()}" : + "Endpoint=http://localhost:9000"; + + const string accessKey = "minioadmin"; + const string secretKey = "minioadmin"; + + var connString = $"{endpoint};AccessKey={accessKey}; SecretKey={secretKey}"; + + configuration.AddInMemoryCollection( + [ + new KeyValuePair(CreateConfigKey(ConfigurationSectionName, null, suffix: "Endpoint"), endpoint), + new KeyValuePair(CreateConfigKey(ConfigurationSectionName+":Credentials", null, suffix: "AccessKey"), accessKey), + new KeyValuePair(CreateConfigKey(ConfigurationSectionName+":Credentials", null, suffix: "SecretKey"), secretKey), + new KeyValuePair($"ConnectionStrings:{key ?? "minio"}", connString) + ]); + } + + protected override void RegisterComponent(HostApplicationBuilder builder, Action? configure = null, string? key = null) + { + builder.AddMinioClient("minio", configureSettings: configure); + } + + protected override void SetHealthCheck(MinioClientSettings options, bool enabled) + { + throw new NotImplementedException(); + } + + protected override void SetMetrics(MinioClientSettings options, bool enabled) + { + throw new NotImplementedException(); + } + + protected override void SetTracing(MinioClientSettings options, bool enabled) + { + throw new NotImplementedException(); + } + + protected override void TriggerActivity(IMinioClient service) + { + using var source = new CancellationTokenSource(100); + + if (service is MinioClient minioClient) + { + minioClient.ListBucketsAsync(source.Token).Wait(); + } + } + + protected override string ValidJsonConfig => """ + { + "Aspire": { + "Minio": { + "Client": { + "Endpoint": "http://localhost:9001", + "Credentials": { + "AccessKey": "minioadmin", + "SecretKey": "minioadmin", + } + } + } + } + } + """; + +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioClientPublicApiTests.cs b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioClientPublicApiTests.cs new file mode 100644 index 00000000..07a2b9f1 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioClientPublicApiTests.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.Hosting; + +namespace CommunityToolkit.Aspire.Minio.Client.Tests; + +public class MinioClientPublicApiTests +{ + [Fact] + public void AddMinioClientShouldThrowWhenBuilderIsNull() + { + IHostApplicationBuilder builder = null!; + + var configurationSectionName = "minio"; + + var action = () => builder.AddMinioClient(configurationSectionName); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } + + [Fact] + public void AddMinioClientShouldThrowWhenConfigurationSectionNameIsNull() + { + IHostApplicationBuilder builder = null!; + + string? configurationSectionName = null; + + var action = () => builder.AddMinioClient(configurationSectionName: configurationSectionName); + + var exception = Assert.Throws(action); + Assert.Equal(nameof(builder), exception.ParamName); + } +} diff --git a/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioContainerFeature.cs b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioContainerFeature.cs new file mode 100644 index 00000000..3feee2c6 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Minio.Client.Tests/MinioContainerFeature.cs @@ -0,0 +1,49 @@ +using Aspire.Components.Common.Tests; +using CommunityToolkit.Aspire.Hosting.Minio; +using DotNet.Testcontainers.Builders; +using DotNet.Testcontainers.Containers; + +namespace CommunityToolkit.Aspire.Minio.Client.Tests; + +public class MinioContainerFeature : IAsyncLifetime +{ + private const int MinioPort = 9000; + public IContainer? Container { get; private set; } + public string GetContainerEndpoint() + { + if (Container is null) + { + throw new InvalidOperationException("The test container was not initialized."); + } + var endpoint = new UriBuilder("http", Container.Hostname, Container.GetMappedPublicPort(MinioPort)).ToString(); + return endpoint; + } + + public async Task InitializeAsync() + { + if (RequiresDockerAttribute.IsSupported) + { + Container = new ContainerBuilder() + .WithImage($"{MinioContainerImageTags.Registry}/{MinioContainerImageTags.Image}:{MinioContainerImageTags.Tag}") + .WithPortBinding(MinioPort, true) + .WithCommand("server", "/data") + .WithEnvironment("MINIO_ADDRESS", $":{9000.ToString()}") + .WithEnvironment("MINIO_ROOT_USER", "minioadmin") + .WithEnvironment("MINIO_ROOT_PASSWORD", "minioadmin") + .WithWaitStrategy(Wait.ForUnixContainer() + .UntilHttpRequestIsSucceeded(request => request.ForPath("/minio/health/ready") + .ForPort(MinioPort))) + .Build(); + + await Container.StartAsync(); + } + } + + public async Task DisposeAsync() + { + if (Container is not null) + { + await Container.DisposeAsync(); + } + } +} diff --git a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaApiClientTests.cs b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaApiClientTests.cs index 77594566..291de588 100644 --- a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaApiClientTests.cs +++ b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaApiClientTests.cs @@ -124,6 +124,92 @@ public void CanSetMultipleKeyedClients() Assert.NotEqual(client, client3); } + [Fact] + public void CanSetMultipleKeyedClientsWithCustomServiceKeys() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:Ollama", $"Endpoint={Endpoint}"), + new KeyValuePair("ConnectionStrings:Ollama2", "Endpoint=https://localhost:5002/"), + new KeyValuePair("ConnectionStrings:Ollama3", "Endpoint=https://localhost:5003/") + ]); + + // Use custom service keys instead of connection names + builder.AddKeyedOllamaApiClient("ChatModel", "Ollama"); + builder.AddKeyedOllamaApiClient("VisionModel", "Ollama2"); + builder.AddKeyedOllamaApiClient("EmbeddingModel", "Ollama3"); + + using var host = builder.Build(); + var chatClient = host.Services.GetRequiredKeyedService("ChatModel"); + var visionClient = host.Services.GetRequiredKeyedService("VisionModel"); + var embeddingClient = host.Services.GetRequiredKeyedService("EmbeddingModel"); + + Assert.Equal(Endpoint, chatClient.Uri); + Assert.Equal("https://localhost:5002/", visionClient.Uri?.ToString()); + Assert.Equal("https://localhost:5003/", embeddingClient.Uri?.ToString()); + + Assert.NotEqual(chatClient, visionClient); + Assert.NotEqual(chatClient, embeddingClient); + Assert.NotEqual(visionClient, embeddingClient); + } + + [Fact] + public void CanSetKeyedClientWithSettingsOverload() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + + var settings = new OllamaSharpSettings + { + Endpoint = Endpoint, + SelectedModel = "testmodel" + }; + + builder.AddKeyedOllamaApiClient("TestService", settings); + + using var host = builder.Build(); + var client = host.Services.GetRequiredKeyedService("TestService"); + + Assert.Equal(Endpoint, client.Uri); + Assert.Equal("testmodel", client.SelectedModel); + } + + [Fact] + public void CanUseSameConnectionWithDifferentServiceKeys() + { + // This test demonstrates the main use case from the issue: + // Using the same connection but different service keys for different models + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:LocalAI", $"Endpoint={Endpoint}") + ]); + + // Same connection, different service keys and models + builder.AddKeyedOllamaApiClient("ChatModel", "LocalAI", settings => + { + settings.SelectedModel = "llama3.2"; + }); + + builder.AddKeyedOllamaApiClient("VisionModel", "LocalAI", settings => + { + settings.SelectedModel = "llava"; + }); + + using var host = builder.Build(); + var chatClient = host.Services.GetRequiredKeyedService("ChatModel"); + var visionClient = host.Services.GetRequiredKeyedService("VisionModel"); + + // Both use the same endpoint + Assert.Equal(Endpoint, chatClient.Uri); + Assert.Equal(Endpoint, visionClient.Uri); + + // But have different models + Assert.Equal("llama3.2", chatClient.SelectedModel); + Assert.Equal("llava", visionClient.SelectedModel); + + // And are different instances + Assert.NotEqual(chatClient, visionClient); + } + [Fact] public void RegisteringChatClientAndEmbeddingGeneratorReturnsCorrectModelForServices() { @@ -140,8 +226,8 @@ public void RegisteringChatClientAndEmbeddingGeneratorReturnsCorrectModelForServ var chatClient = host.Services.GetRequiredService(); var embeddingGenerator = host.Services.GetRequiredService>>(); - Assert.Equal("Chat", chatClient.GetService()?.ModelId); - Assert.Equal("Embedding", embeddingGenerator.GetService()?.ModelId); + Assert.Equal("Chat", chatClient.GetService()?.DefaultModelId); + Assert.Equal("Embedding", embeddingGenerator.GetService()?.DefaultModelId); } [Fact] diff --git a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIChatClientTests.cs b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIChatClientTests.cs index c2900960..b409e907 100644 --- a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIChatClientTests.cs +++ b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIChatClientTests.cs @@ -142,14 +142,83 @@ public void CanChainUseMethodsCorrectly() using var host = builder.Build(); var client = host.Services.GetRequiredService(); - + var distributedCacheClient = Assert.IsType(client); var functionInvocationClient = Assert.IsType(GetInnerClient(distributedCacheClient)); var otelClient = Assert.IsType(GetInnerClient(functionInvocationClient)); - + Assert.IsType(GetInnerClient(otelClient), exactMatch: false); } + [Fact] + public void CanSetMultipleKeyedChatClientsWithCustomServiceKeys() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:Ollama", $"Endpoint={Endpoint}"), + new KeyValuePair("ConnectionStrings:Ollama2", "Endpoint=https://localhost:5002/") + ]); + + // Use custom service keys for different chat clients + builder.AddKeyedOllamaApiClient("ChatModel", "Ollama").AddKeyedChatClient(); + builder.AddKeyedOllamaApiClient("VisionModel", "Ollama2").AddKeyedChatClient(); + + using var host = builder.Build(); + var chatClient = host.Services.GetRequiredKeyedService("ChatModel"); + var visionClient = host.Services.GetRequiredKeyedService("VisionModel"); + + Assert.Equal(Endpoint, chatClient.GetService()?.ProviderUri); + Assert.Equal("https://localhost:5002/", visionClient.GetService()?.ProviderUri?.ToString()); + + Assert.NotEqual(chatClient, visionClient); + } + + [Fact] + public void CanSetMultipleChatClientsWithDifferentServiceKeys() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:Ollama", $"Endpoint={Endpoint}") + ]); + + // Use one Ollama API client with multiple chat clients using different service keys + var cb = builder.AddKeyedOllamaApiClient("OllamaKey", "Ollama"); + cb.AddKeyedChatClient("ChatKey1"); + cb.AddKeyedChatClient("ChatKey2"); + + using var host = builder.Build(); + var chatClient1 = host.Services.GetRequiredKeyedService("ChatKey1"); + var chatClient2 = host.Services.GetRequiredKeyedService("ChatKey2"); + + Assert.Equal(Endpoint, chatClient1.GetService()?.ProviderUri); + Assert.Equal(Endpoint, chatClient2.GetService()?.ProviderUri); + + Assert.NotEqual(chatClient1, chatClient2); + } + + [Fact] + public void CanMixChatClientsAndEmbeddingGeneratorsWithCustomServiceKeys() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:Ollama", $"Endpoint={Endpoint}") + ]); + + // Use one Ollama API client with both chat clients and embedding generators using different service keys + var cb = builder.AddKeyedOllamaApiClient("OllamaKey", "Ollama"); + cb.AddKeyedChatClient("ChatKey1"); + cb.AddKeyedEmbeddingGenerator("EmbeddingKey1"); + + using var host = builder.Build(); + var chatClient1 = host.Services.GetRequiredKeyedService("ChatKey1"); + var embeddingGenerator = host.Services.GetRequiredKeyedService>>("EmbeddingKey1"); + + Assert.Equal(Endpoint, chatClient1.GetService()?.ProviderUri); + Assert.Equal(Endpoint, embeddingGenerator.GetService()?.ProviderUri); + + Assert.Equal(chatClient1 as IOllamaApiClient, embeddingGenerator as IOllamaApiClient); + } + [UnsafeAccessor(UnsafeAccessorKind.Method, Name = "get_InnerClient")] private static extern IChatClient GetInnerClient(DelegatingChatClient client); } diff --git a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIEmbeddingGeneratorTests.cs b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIEmbeddingGeneratorTests.cs index 97c931ed..43341d0d 100644 --- a/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIEmbeddingGeneratorTests.cs +++ b/tests/CommunityToolkit.Aspire.OllamaSharp.Tests/OllamaSharpIEmbeddingGeneratorTests.cs @@ -149,9 +149,32 @@ public void CanChainUseMethodsCorrectly() Assert.IsType(GetInnerGenerator(otelClient), exactMatch: false); } + [Fact] + public void CanSetMultipleEmbeddingGeneratorsWithDifferentServiceKeys() + { + var builder = Host.CreateEmptyApplicationBuilder(null); + builder.Configuration.AddInMemoryCollection([ + new KeyValuePair("ConnectionStrings:Ollama", $"Endpoint={Endpoint}") + ]); + + // Use one Ollama API client with multiple embedding generators using different service keys + var cb = builder.AddKeyedOllamaApiClient("OllamaKey", "Ollama"); + cb.AddKeyedEmbeddingGenerator("EmbedKey1"); + cb.AddKeyedEmbeddingGenerator("EmbedKey2"); + + using var host = builder.Build(); + var embedGenerator1 = host.Services.GetRequiredKeyedService>>("EmbedKey1"); + var embedGenerator2 = host.Services.GetRequiredKeyedService>>("EmbedKey2"); + + Assert.Equal(Endpoint, embedGenerator1.GetService()?.ProviderUri); + Assert.Equal(Endpoint, embedGenerator2.GetService()?.ProviderUri); + + Assert.NotEqual(embedGenerator1, embedGenerator2); + } + private static IEmbeddingGenerator GetInnerGenerator(DelegatingEmbeddingGenerator generator) where TEmbedding : Embedding => - (IEmbeddingGenerator)(generator.GetType() + (IEmbeddingGenerator)(generator.GetType() .GetProperty("InnerGenerator", BindingFlags.Instance | BindingFlags.NonPublic)? .GetValue(generator, null) ?? throw new InvalidOperationException()); } diff --git a/tests/CommunityToolkit.Aspire.Testing/ConformanceTests.cs b/tests/CommunityToolkit.Aspire.Testing/ConformanceTests.cs index b7abaa64..ec0c5ca6 100644 --- a/tests/CommunityToolkit.Aspire.Testing/ConformanceTests.cs +++ b/tests/CommunityToolkit.Aspire.Testing/ConformanceTests.cs @@ -356,6 +356,7 @@ public void ConfigurationSchemaInvalidJsonConfigTest() public void ConnectionInformationIsDelayValidated(bool useKey) { SetupConnectionInformationIsDelayValidated(); + SkipIfKeyedRegistrationIsNotSupported(useKey); var builder = Host.CreateEmptyApplicationBuilder(null); diff --git a/tests/dapr-shared/AddDaprPubSubTests.cs b/tests/dapr-shared/AddDaprPubSubTests.cs index f2b16b0e..df3ed4aa 100644 --- a/tests/dapr-shared/AddDaprPubSubTests.cs +++ b/tests/dapr-shared/AddDaprPubSubTests.cs @@ -57,7 +57,7 @@ public void ResourceConfiguredWithHiddenIntialState() Assert.True(daprResource.TryGetAnnotationsOfType(out var annotations)); var annotation = Assert.Single(annotations); - Assert.Equal(KnownResourceStates.Hidden, annotation.InitialSnapshot.State?.Text); + Assert.True(annotation.InitialSnapshot.IsHidden); } [Fact] diff --git a/tests/dapr-shared/AddDaprStateStoreTests.cs b/tests/dapr-shared/AddDaprStateStoreTests.cs index a3df00f5..a309f267 100644 --- a/tests/dapr-shared/AddDaprStateStoreTests.cs +++ b/tests/dapr-shared/AddDaprStateStoreTests.cs @@ -57,7 +57,7 @@ public void ResourceConfiguredWithHiddenIntialState() Assert.True(daprResource.TryGetAnnotationsOfType(out var annotations)); var annotation = Assert.Single(annotations); - Assert.Equal(KnownResourceStates.Hidden, annotation.InitialSnapshot.State?.Text); + Assert.True(annotation.InitialSnapshot.IsHidden ); } [Fact] From 5d943f93e670faac318ee72280829c515cb4b40b Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 3 Jul 2025 06:01:03 +0000 Subject: [PATCH 4/9] Initial working integration --- CommunityToolkit.Aspire.slnx | 1 + Directory.Packages.props | 4 +- .../Program.cs | 1 + .../McpInspectorResource.cs | 50 ++++++-- .../McpInspectorResourceBuilderExtensions.cs | 87 +++++++++++-- .../McpServerMetadata.cs | 9 ++ .../McpTransportType.cs | 17 +++ .../AppHostTests.cs | 20 +++ ...t.Aspire.Hosting.McpInspector.Tests.csproj | 7 ++ ...InspectorResourceBuilderExtensionsTests.cs | 117 ++++++++++++++++++ 10 files changed, 291 insertions(+), 22 deletions(-) create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/McpServerMetadata.cs create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/McpTransportType.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs create mode 100644 tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests.csproj create mode 100644 tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/McpInspectorResourceBuilderExtensionsTests.cs diff --git a/CommunityToolkit.Aspire.slnx b/CommunityToolkit.Aspire.slnx index 54d2ed1c..9b415e7e 100644 --- a/CommunityToolkit.Aspire.slnx +++ b/CommunityToolkit.Aspire.slnx @@ -199,6 +199,7 @@ + diff --git a/Directory.Packages.props b/Directory.Packages.props index d756ebe6..673264a9 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -83,8 +83,8 @@ - - + + diff --git a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs index 3b01927f..b69940b6 100644 --- a/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs +++ b/examples/mcp-inspector/CommunityToolkit.Aspire.Hosting.McpInspector.McpServer/Program.cs @@ -5,6 +5,7 @@ builder.Services .AddMcpServer() + .WithHttpTransport() .WithTools(); var app = builder.Build(); diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs index ed7f2d27..f421a4b6 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs @@ -6,10 +6,46 @@ namespace Aspire.Hosting.ApplicationModel; /// Resource for the MCP Inspector server. /// /// The name of the resource. -/// -/// This resource will run as a Node.js process using the npx command. -/// -/// In future, it is likely to become a container resource, once is resolved. -/// -[Experimental("CTASPIRE003")] -public class McpInspectorResource(string name) : ExecutableResource(name, "npx", ""); +public class McpInspectorResource(string name) : ExecutableResource(name, "npx", "") +{ + internal readonly string ConfigPath = Path.GetTempFileName(); + + /// + /// Gets the version of the MCP Inspector. + /// + public const string InspectorVersion = "0.15.0"; + + private readonly List _mcpServers = []; + + private McpServerMetadata? _defaultMcpServer; + + /// + /// List of MCP server resources that this inspector is aware of. + /// + public IReadOnlyList McpServers => _mcpServers; + + /// + /// Gets the default MCP server resource. + /// + public McpServerMetadata? DefaultMcpServer => _defaultMcpServer; + + internal void AddMcpServer(IResourceWithEndpoints mcpServer, bool isDefault, McpTransportType transportType) + { + if (_mcpServers.Any(s => s.Name == mcpServer.Name)) + { + throw new InvalidOperationException($"The MCP server {mcpServer.Name} is already added to the MCP Inspector resource."); + } + + McpServerMetadata item = new( + mcpServer.Name, + mcpServer.GetEndpoint("http") ?? throw new InvalidOperationException($"The MCP server {mcpServer.Name} must have a 'http' endpoint defined."), + transportType); + + _mcpServers.Add(item); + + if (isDefault) + { + _defaultMcpServer = item; + } + } +} diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs index 85bf0971..0d938eef 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs @@ -1,5 +1,4 @@ using Aspire.Hosting.ApplicationModel; -#pragma warning disable CTASPIRE003 namespace Aspire.Hosting; @@ -16,15 +15,74 @@ public static class McpInspectorResourceBuilderExtensions public static IResourceBuilder AddMcpInspector(this IDistributedApplicationBuilder builder, [ResourceName] string name) { var resource = builder.AddResource(new McpInspectorResource(name)) - .WithArgs(["-y", "@modelcontextprotocol/inspector"]) + .WithArgs(["-y", $"@modelcontextprotocol/inspector@{McpInspectorResource.InspectorVersion}"]) .ExcludeFromManifest() .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(3000, 4000), env: "CLIENT_PORT", name: "client") - .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: "server-proxy"); + .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: "server-proxy") + .WithEnvironment("DANGEROUSLY_OMIT_AUTH", "true"); + + builder.Eventing.Subscribe(resource.Resource, async (@event, ct) => + { + if (@event.Resource is not McpInspectorResource inspectorResource) + { + return; + } + + if (inspectorResource.DefaultMcpServer is null && inspectorResource.McpServers.Count > 0) + { + throw new InvalidOperationException("No default MCP server has been configured for the MCP Inspector resource, yet servers have been provided."); + } + + var servers = inspectorResource.McpServers.ToDictionary(s => s.Name, s => new + { + transport = s.TransportType switch + { + McpTransportType.StreamableHttp => "streamable-http", + McpTransportType.Sse => "sse", + _ => throw new NotSupportedException($"The transport type {s.TransportType} is not supported.") + }, + endpoint = s.Endpoint.Url + }); + + var config = new { mcpServers = servers }; + + await File.WriteAllTextAsync(inspectorResource.ConfigPath, System.Text.Json.JsonSerializer.Serialize(config), ct); + }); return resource .WithEnvironment(ctx => { - ctx.EnvironmentVariables["MCP_PROXY_FULL_ADDRESS"] = resource.GetEndpoint("server-proxy"); + var clientEndpoint = resource.GetEndpoint("client"); + var serverProxyEndpoint = resource.GetEndpoint("server-proxy"); + + if (clientEndpoint is null || serverProxyEndpoint is null) + { + throw new InvalidOperationException("The MCP Inspector resource must have both 'client' and 'server-proxy' endpoints defined."); + } + + ctx.EnvironmentVariables["MCP_PROXY_FULL_ADDRESS"] = serverProxyEndpoint.Url; + ctx.EnvironmentVariables["CLIENT_PORT"] = clientEndpoint.TargetPort?.ToString() ?? throw new InvalidOperationException("The MCP Inspector 'client' endpoint must have a target port defined."); + ctx.EnvironmentVariables["SERVER_PORT"] = serverProxyEndpoint.TargetPort?.ToString() ?? throw new InvalidOperationException("The MCP Inspector 'server-proxy' endpoint must have a target port defined."); + }) + .WithArgs(ctx => + { + McpInspectorResource inspectorResource = resource.Resource; + McpServerMetadata? defaultMcpServer = inspectorResource.DefaultMcpServer; + if ((defaultMcpServer is null && inspectorResource.McpServers.Count > 0) || (defaultMcpServer is not null && inspectorResource.McpServers.Count == 0)) + { + throw new InvalidOperationException("No default MCP server has been configured for the MCP Inspector resource, yet servers have been provided."); + } + + + if (defaultMcpServer is null && inspectorResource.McpServers.Count == 0) + { + return; + } + + ctx.Args.Add("--config"); + ctx.Args.Add(inspectorResource.ConfigPath); + ctx.Args.Add("--server"); + ctx.Args.Add(defaultMcpServer?.Name ?? throw new InvalidOperationException("The MCP Inspector resource must have a default MCP server defined.")); }); } @@ -34,17 +92,20 @@ public static IResourceBuilder AddMcpInspector(this IDistr /// The type of the MCP server resource. /// The used to configure the MCP Inspector resource. /// The for the MCP server resource. - /// The route that the SSE connection will use. + /// Indicates whether this MCP server should be considered the default server for the MCP Inspector. + /// The transport type to use for the MCP server. Defaults to . /// A reference to the for further configuration. - public static IResourceBuilder WithMcpServer(this IResourceBuilder builder, IResourceBuilder mcpServer, string route = "/sse") + public static IResourceBuilder WithMcpServer( + this IResourceBuilder builder, + IResourceBuilder mcpServer, + bool isDefault = true, + McpTransportType transportType = McpTransportType.StreamableHttp) where TResource : IResourceWithEndpoints { - return builder.WithArgs(ctx => - { - var httpEndpoint = mcpServer.Resource.GetEndpoint("http"); + ArgumentNullException.ThrowIfNull(mcpServer); + ArgumentNullException.ThrowIfNull(builder); - var url = ReferenceExpression.Create($"{httpEndpoint}{route}"); - ctx.Args.Add(url); - }); + builder.Resource.AddMcpServer(mcpServer.Resource, isDefault, transportType); + return builder; } -} \ No newline at end of file +} diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpServerMetadata.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpServerMetadata.cs new file mode 100644 index 00000000..b7b13866 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpServerMetadata.cs @@ -0,0 +1,9 @@ +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Represents metadata for an MCP server used by the MCP Inspector. +/// +/// The name of the server resource. +/// The endpoint reference for the server resource. +/// The transport type used by the server resource. +public record McpServerMetadata(string Name, EndpointReference Endpoint, McpTransportType TransportType); \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpTransportType.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpTransportType.cs new file mode 100644 index 00000000..9fca07ee --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpTransportType.cs @@ -0,0 +1,17 @@ +namespace Aspire.Hosting; + +/// +/// Represents the type of transport used by the MCP server. +/// +public enum McpTransportType +{ + /// + /// The MCP server uses SSE (Server-Sent Events) as the transport type. + /// + StreamableHttp, + + /// + /// The MCP server uses Server Sent Events (SSE) as the transport type. + /// + Sse +} \ No newline at end of file diff --git a/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs new file mode 100644 index 00000000..de93229d --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs @@ -0,0 +1,20 @@ +using CommunityToolkit.Aspire.Testing; + +namespace CommunityToolkit.Aspire.Hosting.McpInspector.Tests; + +public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> +{ + [Theory] + [InlineData("client", "/")] + [InlineData("server-proxy", "/config")] + public async Task ResourceStartsAndRespondsOk(string endpointName, string route) + { + var resourceName = "mcp-inspector"; + await fixture.ResourceNotificationService.WaitForResourceHealthyAsync(resourceName).WaitAsync(TimeSpan.FromMinutes(5)); + var httpClient = fixture.CreateHttpClient(resourceName, endpointName: endpointName); + + var response = await httpClient.GetAsync(route); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } +} diff --git a/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests.csproj new file mode 100644 index 00000000..cb487e96 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests.csproj @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/McpInspectorResourceBuilderExtensionsTests.cs b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/McpInspectorResourceBuilderExtensionsTests.cs new file mode 100644 index 00000000..8ac3d670 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/McpInspectorResourceBuilderExtensionsTests.cs @@ -0,0 +1,117 @@ +using Aspire.Hosting; + +namespace CommunityToolkit.Aspire.Hosting.McpInspector.Tests; + +public class McpInspectorResourceBuilderExtensionsTests +{ + [Fact] + public void AddMcpInspectorWithDefaultsAddsResource() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + // Act + var inspector = appBuilder.AddMcpInspector("inspector"); + + using var app = appBuilder.Build(); + + // Assert + var appModel = app.Services.GetRequiredService(); + + var inspectorResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("inspector", inspectorResource.Name); + + var endpoints = inspectorResource.Annotations.OfType(); + Assert.Equal(2, endpoints.Count()); + + Assert.Single(endpoints, e => e.Name == "client"); + Assert.Single(endpoints, e => e.Name == "server-proxy"); + + var annotations = inspector.Resource.Annotations; + Assert.Contains(ManifestPublishingCallbackAnnotation.Ignore, annotations); + } + + [Fact] + public void WithMcpServerAddsServerToResource() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + // Create a mock MCP server resource + var mockServer = appBuilder.AddProject("mcpServer"); + + // Act + var inspector = appBuilder.AddMcpInspector("inspector") + .WithMcpServer(mockServer, isDefault: true); + + using var app = appBuilder.Build(); + + // Assert + var appModel = app.Services.GetRequiredService(); + + var inspectorResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("inspector", inspectorResource.Name); + + Assert.Single(inspectorResource.McpServers); + Assert.NotNull(inspectorResource.DefaultMcpServer); + Assert.Equal("mcpServer", inspectorResource.DefaultMcpServer.Name); + Assert.Equal(McpTransportType.StreamableHttp, inspectorResource.DefaultMcpServer.TransportType); + } + + [Theory] + [InlineData(McpTransportType.StreamableHttp)] + [InlineData(McpTransportType.Sse)] + public void WithMcpServerSpecificTransportTypeAddsServerToResource(McpTransportType transportType) + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + // Create a mock MCP server resource + var mockServer = appBuilder.AddProject("mcpServer"); + + // Act + var inspector = appBuilder.AddMcpInspector("inspector") + .WithMcpServer(mockServer, isDefault: true, transportType: transportType); + + using var app = appBuilder.Build(); + + // Assert + var appModel = app.Services.GetRequiredService(); + + var inspectorResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("inspector", inspectorResource.Name); + + Assert.Single(inspectorResource.McpServers); + Assert.NotNull(inspectorResource.DefaultMcpServer); + Assert.Equal("mcpServer", inspectorResource.DefaultMcpServer.Name); + Assert.Equal(transportType, inspectorResource.DefaultMcpServer.TransportType); + } + + [Fact] + public void WithMultipleMcpServersAddsAllServersToResource() + { + // Arrange + var appBuilder = DistributedApplication.CreateBuilder(); + + // Create mock MCP server resources + var mockServer1 = appBuilder.AddProject("mcpServer1"); + var mockServer2 = appBuilder.AddProject("mcpServer2"); + + // Act + var inspector = appBuilder.AddMcpInspector("inspector") + .WithMcpServer(mockServer1, isDefault: true) + .WithMcpServer(mockServer2, isDefault: false); + + using var app = appBuilder.Build(); + + // Assert + var appModel = app.Services.GetRequiredService(); + + var inspectorResource = Assert.Single(appModel.Resources.OfType()); + Assert.Equal("inspector", inspectorResource.Name); + + Assert.Equal(2, inspectorResource.McpServers.Count); + Assert.NotNull(inspectorResource.DefaultMcpServer); + Assert.Equal("mcpServer1", inspectorResource.DefaultMcpServer.Name); + } +} From 722f7137be2299a19e0322d78f0e1216ef06a1f8 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 3 Jul 2025 23:39:17 +0000 Subject: [PATCH 5/9] Adding mcp inspector to test list --- .github/workflows/tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1a97bfec..aa6f2150 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -34,6 +34,7 @@ jobs: Hosting.Java.Tests, Hosting.LavinMQ.Tests, Hosting.MailPit.Tests, + Hosting.McpInspector.Tests Hosting.Meilisearch.Tests, Hosting.MongoDB.Extensions.Tests, Hosting.MySql.Extensions.Tests, From dbaf8776bb997e9f08ccae671ecbed1e556c8c99 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 3 Jul 2025 23:41:14 +0000 Subject: [PATCH 6/9] forgot the comma --- .github/workflows/tests.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index aa6f2150..304d4a25 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -34,7 +34,7 @@ jobs: Hosting.Java.Tests, Hosting.LavinMQ.Tests, Hosting.MailPit.Tests, - Hosting.McpInspector.Tests + Hosting.McpInspector.Tests, Hosting.Meilisearch.Tests, Hosting.MongoDB.Extensions.Tests, Hosting.MySql.Extensions.Tests, @@ -125,4 +125,3 @@ jobs: with: name: testresults-${{ matrix.name }}-${{ matrix.os }} path: testresults/** - From 1bf8189e95fb0a768f77f301532e3d723f0f40f5 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Thu, 3 Jul 2025 23:55:20 +0000 Subject: [PATCH 7/9] Adding health checks on the npm resource --- .../McpInspectorResource.cs | 10 ++++++++++ .../McpInspectorResourceBuilderExtensions.cs | 12 +++++++----- .../AppHostTests.cs | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs index f421a4b6..caacfa96 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs @@ -10,6 +10,16 @@ public class McpInspectorResource(string name) : ExecutableResource(name, "npx", { internal readonly string ConfigPath = Path.GetTempFileName(); + /// + /// The name of the client endpoint. + /// + public const string ClientEndpointName = "client"; + + /// + /// The name of the server proxy endpoint. + /// + public const string ServerProxyEndpointName = "server-proxy"; + /// /// Gets the version of the MCP Inspector. /// diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs index 0d938eef..02d61256 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs @@ -17,9 +17,11 @@ public static IResourceBuilder AddMcpInspector(this IDistr var resource = builder.AddResource(new McpInspectorResource(name)) .WithArgs(["-y", $"@modelcontextprotocol/inspector@{McpInspectorResource.InspectorVersion}"]) .ExcludeFromManifest() - .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(3000, 4000), env: "CLIENT_PORT", name: "client") - .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: "server-proxy") - .WithEnvironment("DANGEROUSLY_OMIT_AUTH", "true"); + .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(3000, 4000), env: "CLIENT_PORT", name: McpInspectorResource.ClientEndpointName) + .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: McpInspectorResource.ServerProxyEndpointName) + .WithEnvironment("DANGEROUSLY_OMIT_AUTH", "true") + .WithHttpHealthCheck("/", endpointName: McpInspectorResource.ClientEndpointName) + .WithHttpHealthCheck("/config", endpointName: McpInspectorResource.ServerProxyEndpointName); builder.Eventing.Subscribe(resource.Resource, async (@event, ct) => { @@ -52,8 +54,8 @@ public static IResourceBuilder AddMcpInspector(this IDistr return resource .WithEnvironment(ctx => { - var clientEndpoint = resource.GetEndpoint("client"); - var serverProxyEndpoint = resource.GetEndpoint("server-proxy"); + var clientEndpoint = resource.GetEndpoint(McpInspectorResource.ClientEndpointName); + var serverProxyEndpoint = resource.GetEndpoint(McpInspectorResource.ServerProxyEndpointName); if (clientEndpoint is null || serverProxyEndpoint is null) { diff --git a/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs index de93229d..6ce1a0b3 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/AppHostTests.cs @@ -5,8 +5,8 @@ namespace CommunityToolkit.Aspire.Hosting.McpInspector.Tests; public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> { [Theory] - [InlineData("client", "/")] - [InlineData("server-proxy", "/config")] + [InlineData(McpInspectorResource.ClientEndpointName, "/")] + [InlineData(McpInspectorResource.ServerProxyEndpointName, "/config")] public async Task ResourceStartsAndRespondsOk(string endpointName, string route) { var resourceName = "mcp-inspector"; From 15488e76b4238d9602f0272e6b73a88be9d0a312 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Fri, 4 Jul 2025 00:08:56 +0000 Subject: [PATCH 8/9] Changing how the API surfaces info --- .../McpInspectorResource.cs | 14 +++++++++++++ .../McpInspectorResourceBuilderExtensions.cs | 20 +++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs index caacfa96..901fa4b3 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs @@ -15,11 +15,25 @@ public class McpInspectorResource(string name) : ExecutableResource(name, "npx", /// public const string ClientEndpointName = "client"; + private EndpointReference? _clientEndpoint; + + /// + /// Gets the client endpoint reference for the MCP Inspector. + /// + public EndpointReference ClientEndpoint => _clientEndpoint ??= new(this, ClientEndpointName); + /// /// The name of the server proxy endpoint. /// public const string ServerProxyEndpointName = "server-proxy"; + private EndpointReference? _serverProxyEndpoint; + + /// + /// Gets the server proxy endpoint reference for the MCP Inspector. + /// + public EndpointReference ServerProxyEndpoint => _serverProxyEndpoint ??= new(this, ServerProxyEndpointName); + /// /// Gets the version of the MCP Inspector. /// diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs index 02d61256..c23b89e4 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResourceBuilderExtensions.cs @@ -12,16 +12,28 @@ public static class McpInspectorResourceBuilderExtensions /// /// The to which the MCP Inspector resource will be added. /// The name of the MCP Inspector container resource. - public static IResourceBuilder AddMcpInspector(this IDistributedApplicationBuilder builder, [ResourceName] string name) + /// The port for the client application. Defaults to 6274. + /// The port for the server proxy application. Defaults to 6277. + public static IResourceBuilder AddMcpInspector(this IDistributedApplicationBuilder builder, [ResourceName] string name, int clientPort = 6274, int serverPort = 6277) { var resource = builder.AddResource(new McpInspectorResource(name)) .WithArgs(["-y", $"@modelcontextprotocol/inspector@{McpInspectorResource.InspectorVersion}"]) .ExcludeFromManifest() - .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(3000, 4000), env: "CLIENT_PORT", name: McpInspectorResource.ClientEndpointName) - .WithHttpEndpoint(isProxied: false, port: Random.Shared.Next(4000, 5000), env: "SERVER_PORT", name: McpInspectorResource.ServerProxyEndpointName) + .WithHttpEndpoint(isProxied: false, port: clientPort, env: "CLIENT_PORT", name: McpInspectorResource.ClientEndpointName) + .WithHttpEndpoint(isProxied: false, port: serverPort, env: "SERVER_PORT", name: McpInspectorResource.ServerProxyEndpointName) .WithEnvironment("DANGEROUSLY_OMIT_AUTH", "true") .WithHttpHealthCheck("/", endpointName: McpInspectorResource.ClientEndpointName) - .WithHttpHealthCheck("/config", endpointName: McpInspectorResource.ServerProxyEndpointName); + .WithHttpHealthCheck("/config", endpointName: McpInspectorResource.ServerProxyEndpointName) + .WithUrlForEndpoint(McpInspectorResource.ClientEndpointName, annotation => + { + annotation.DisplayText = "Client"; + annotation.DisplayOrder = 2; + }) + .WithUrlForEndpoint(McpInspectorResource.ServerProxyEndpointName, annotation => + { + annotation.DisplayText = "Server Proxy"; + annotation.DisplayOrder = 1; + }); builder.Eventing.Subscribe(resource.Resource, async (@event, ct) => { From 468a85943849590c910f5941c721eaeab8ab02b8 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Fri, 4 Jul 2025 00:36:56 +0000 Subject: [PATCH 9/9] Adding README --- .../README.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md b/src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md new file mode 100644 index 00000000..cdc6dc86 --- /dev/null +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/README.md @@ -0,0 +1,34 @@ +# CommunityToolkit.Aspire.Hosting.McpInspector library + +Provides extension methods and resource definitions for the .NET Aspire AppHost to support adding an MCP Inspector resource. The MCP Inspector enables inspection and debugging of MCP (Model Context Protocol) servers, with support for multiple server configurations and transport types. + +## Getting Started + +### Install the package + +In your AppHost project, install the package using the following command: + +```dotnetcli +dotnet add package CommunityToolkit.Aspire.Hosting.McpInspector +``` + +### Example usage + +In your `Program.cs`, add an MCP Inspector resource and configure it with one or more MCP servers: + +```csharp +var mcpServer = builder.AddProject("mcp-server"); + +var inspector = builder.AddMcpInspector("inspector") + .WithMcpServer(mcpServer); +``` + +You can specify the transport type (`StreamableHttp` or `Sse`) and set which server is the default for the inspector. + +## Additional Information + +See the [official documentation](https://learn.microsoft.com/dotnet/aspire/community-toolkit/mcpinspector) for more details. + +## Feedback & contributing + +https://github.com/CommunityToolkit/Aspire