From 3b54e054f05a90f6cfb28c40eb1d9144c9f28733 Mon Sep 17 00:00:00 2001 From: eanzhao Date: Mon, 23 Mar 2026 18:58:17 +0800 Subject: [PATCH 1/5] feat: Add domain models for workflow and role management, including validation and execution contracts --- aevatar.slnx | 14 +- apps/aevatar-console-web/config/proxy.ts | 2 +- ...Aevatar.Authentication.Abstractions.csproj | 8 + .../AevatarAuthenticationOptions.cs | 22 + .../AevatarStandardClaimTypes.cs | 11 + .../IAevatarClaimsTransformer.cs | 18 + .../Aevatar.Authentication.Hosting.csproj | 17 + .../AevatarAuthenticationHostExtensions.cs | 76 + ...atar.Authentication.Providers.NyxId.csproj | 16 + .../NyxIdAuthenticationExtensions.cs | 17 + .../NyxIdClaimsTransformer.cs | 56 + .../WebApplicationBuilderExtensions.cs | 8 + .../Aevatar.Mainnet.Host.Api.csproj | 3 + src/Aevatar.Mainnet.Host.Api/Program.cs | 8 + src/Aevatar.Mainnet.Host.Api/appsettings.json | 9 + .../Aevatar.Studio.Application.csproj | 35 + .../AppApiErrors.cs | 8 +- .../AppScopedScriptService.cs | 7 +- .../AppScopedWorkflowService.cs | 14 +- .../Protos/app_script_protocol.proto | 2 +- .../Contracts}/AppScriptPackagePayloads.cs | 4 +- .../Scripts/Contracts}/AppScriptProtocol.cs | 2 +- .../Abstractions/IAevatarSettingsStore.cs | 2 +- .../IConnectorCatalogImportParser.cs | 2 +- .../Abstractions/IConnectorCatalogStore.cs | 2 +- .../Abstractions/IRoleCatalogImportParser.cs | 2 +- .../Studio}/Abstractions/IRoleCatalogStore.cs | 2 +- ...tudioBackendRequestAuthSnapshotProvider.cs | 2 +- .../Abstractions/IStudioWorkspaceStore.cs | 4 +- .../IWorkflowYamlDocumentService.cs | 4 +- .../Studio}/Contracts/ConnectorContracts.cs | 2 +- .../Studio}/Contracts/EditorContracts.cs | 6 +- .../Studio}/Contracts/ExecutionContracts.cs | 2 +- .../Studio}/Contracts/RoleContracts.cs | 2 +- .../Studio}/Contracts/SettingsContracts.cs | 2 +- .../Studio}/Contracts/WorkspaceContracts.cs | 4 +- .../ServiceCollectionExtensions.cs | 4 +- .../Studio}/Services/ConnectorService.cs | 6 +- .../Studio}/Services/ExecutionService.cs | 6 +- .../Studio}/Services/RoleCatalogService.cs | 6 +- .../Studio}/Services/SettingsService.cs | 6 +- .../Studio}/Services/TextDiffService.cs | 4 +- .../Studio}/Services/WorkflowEditorService.cs | 10 +- .../Studio}/Services/WorkflowGraphMapper.cs | 8 +- .../Studio}/Services/WorkspaceService.cs | 8 +- .../Studio/StudioDocumentIdNormalizer.cs | 41 + .../Aevatar.Studio.Domain.csproj | 8 + .../WorkflowCompatibilityProfile.cs | 2 +- .../Studio}/Graph/WorkflowGraphDocument.cs | 2 +- .../Studio}/Models/RoleModel.cs | 2 +- .../Studio}/Models/StepErrorPolicy.cs | 2 +- .../Studio}/Models/StepModel.cs | 2 +- .../Studio}/Models/StepRetryPolicy.cs | 2 +- .../Studio}/Models/ValidationFinding.cs | 2 +- .../Studio}/Models/ValidationLevel.cs | 2 +- .../Studio}/Models/WorkflowConfiguration.cs | 2 +- .../Studio}/Models/WorkflowDocument.cs | 2 +- .../Studio}/Models/WorkflowLayoutDocument.cs | 2 +- .../Studio}/Models/WorkflowPatch.cs | 2 +- .../Services/WorkflowDocumentNormalizer.cs | 8 +- .../Studio}/Services/WorkflowValidator.cs | 8 +- .../Studio}/Utilities/JsonNodeExtensions.cs | 2 +- .../Aevatar.Studio.Hosting.csproj | 19 + .../Controllers/ConnectorsController.cs | 12 +- .../Controllers/EditorController.cs | 8 +- .../Controllers/ExecutionsController.cs | 8 +- .../Controllers/RolesController.cs | 12 +- .../Controllers/SettingsController.cs | 8 +- .../Controllers/WorkspaceController.cs | 10 +- .../AppAuthoringChatSessionFactory.cs | 3 +- .../ScriptEditorValidationService.cs | 7 +- .../Endpoints}/ScriptGenerateActorService.cs | 5 +- .../Endpoints}/ScriptGenerateGAgent.cs | 3 +- .../Endpoints}/ScriptGenerateOrchestrator.cs | 3 +- .../Endpoints/StudioEndpoints.cs | 37 +- .../WorkflowGenerateActorService.cs | 7 +- .../Endpoints}/WorkflowGenerateGAgent.cs | 3 +- .../WorkflowGenerateOrchestrator.cs | 9 +- .../StudioCapabilityExtensions.cs | 76 + .../Aevatar.Studio.Infrastructure.csproj | 19 + .../ServiceCollectionExtensions.cs | 12 +- .../ScopeResolution}/AppScopeResolver.cs | 3 +- .../YamlWorkflowDocumentService.cs | 10 +- .../Storage/ChronoStorageCatalogBlobClient.cs | 4 +- .../ChronoStorageConnectorCatalogStore.cs | 4 +- .../Storage/ChronoStorageMasterKeyResolver.cs | 2 +- .../Storage/ChronoStorageRoleCatalogStore.cs | 4 +- .../Storage/ConnectorCatalogImportParser.cs | 4 +- .../Storage/ConnectorCatalogJsonSerializer.cs | 4 +- .../Storage/ConnectorCatalogStorageOptions.cs | 2 +- .../Storage/FileAevatarSettingsStore.cs | 4 +- .../Storage/FileStudioWorkspaceStore.cs | 6 +- .../Storage/NyxIdAppAuthOptions.cs | 13 + .../Storage/RoleCatalogImportParser.cs | 4 +- .../Storage/RoleCatalogJsonSerializer.cs | 4 +- .../Storage/StudioStorageOptions.cs | 2 +- test/Aevatar.App.Tests/AppHostFixture.cs | 1 - .../Aevatar.Tools.Cli.csproj | 36 +- .../Bridge/AppBridgeEndpoints.cs | 204 --- .../Commands/App/AppCommand.cs | 58 +- .../Hosting/AppCommandHandler.cs | 262 +--- .../Aevatar.Tools.Cli/Hosting/AppToolHost.cs | 346 ----- .../Hosting/NyxIdAccessTokenHandler.cs | 241 ---- .../Hosting/NyxIdAppAuthentication.cs | 497 ------- ...tudioBackendRequestAuthSnapshotProvider.cs | 42 - tools/Aevatar.Tools.Cli/boot.sh | 242 ++-- .../wwwroot/playground/app.css | 1 - .../wwwroot/playground/app.js | 1268 ----------------- .../wwwroot/playground/codicon.ttf | Bin 121972 -> 0 bytes .../playground/editor.worker-CKy7Pnvo.js | 26 - .../wwwroot/playground/index.html | 17 - 111 files changed, 889 insertions(+), 3227 deletions(-) create mode 100644 src/Aevatar.Authentication.Abstractions/Aevatar.Authentication.Abstractions.csproj create mode 100644 src/Aevatar.Authentication.Abstractions/AevatarAuthenticationOptions.cs create mode 100644 src/Aevatar.Authentication.Abstractions/AevatarStandardClaimTypes.cs create mode 100644 src/Aevatar.Authentication.Abstractions/IAevatarClaimsTransformer.cs create mode 100644 src/Aevatar.Authentication.Hosting/Aevatar.Authentication.Hosting.csproj create mode 100644 src/Aevatar.Authentication.Hosting/AevatarAuthenticationHostExtensions.cs create mode 100644 src/Aevatar.Authentication.Providers.NyxId/Aevatar.Authentication.Providers.NyxId.csproj create mode 100644 src/Aevatar.Authentication.Providers.NyxId/NyxIdAuthenticationExtensions.cs create mode 100644 src/Aevatar.Authentication.Providers.NyxId/NyxIdClaimsTransformer.cs create mode 100644 src/Aevatar.Mainnet.Host.Api/appsettings.json create mode 100644 src/Aevatar.Studio.Application/Aevatar.Studio.Application.csproj rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application}/AppApiErrors.cs (93%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application}/AppScopedScriptService.cs (98%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application}/AppScopedWorkflowService.cs (97%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application}/Protos/app_script_protocol.proto (95%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application/Scripts/Contracts}/AppScriptPackagePayloads.cs (97%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Application/Scripts/Contracts}/AppScriptProtocol.cs (97%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IAevatarSettingsStore.cs (93%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IConnectorCatalogImportParser.cs (76%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IConnectorCatalogStore.cs (93%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IRoleCatalogImportParser.cs (75%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IRoleCatalogStore.cs (93%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs (85%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IStudioWorkspaceStore.cs (97%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Abstractions/IWorkflowYamlDocumentService.cs (71%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/ConnectorContracts.cs (96%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/EditorContracts.cs (90%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/ExecutionContracts.cs (95%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/RoleContracts.cs (94%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/SettingsContracts.cs (96%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Contracts/WorkspaceContracts.cs (92%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/DependencyInjection/ServiceCollectionExtensions.cs (84%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/ConnectorService.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/ExecutionService.cs (99%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/RoleCatalogService.cs (97%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/SettingsService.cs (97%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/TextDiffService.cs (95%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/WorkflowEditorService.cs (92%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/WorkflowGraphMapper.cs (91%) rename {tools/Aevatar.Tools.Cli/Studio/Application => src/Aevatar.Studio.Application/Studio}/Services/WorkspaceService.cs (97%) create mode 100644 src/Aevatar.Studio.Application/Studio/StudioDocumentIdNormalizer.cs create mode 100644 src/Aevatar.Studio.Domain/Aevatar.Studio.Domain.csproj rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Compatibility/WorkflowCompatibilityProfile.cs (99%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Graph/WorkflowGraphDocument.cs (91%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/RoleModel.cs (93%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/StepErrorPolicy.cs (79%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/StepModel.cs (94%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/StepRetryPolicy.cs (79%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/ValidationFinding.cs (91%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/ValidationLevel.cs (56%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/WorkflowConfiguration.cs (65%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/WorkflowDocument.cs (87%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/WorkflowLayoutDocument.cs (91%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Models/WorkflowPatch.cs (80%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Services/WorkflowDocumentNormalizer.cs (96%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Services/WorkflowValidator.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Domain => src/Aevatar.Studio.Domain/Studio}/Utilities/JsonNodeExtensions.cs (97%) create mode 100644 src/Aevatar.Studio.Hosting/Aevatar.Studio.Hosting.csproj rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/ConnectorsController.cs (86%) rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/EditorController.cs (83%) rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/ExecutionsController.cs (88%) rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/RolesController.cs (86%) rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/SettingsController.cs (85%) rename {tools/Aevatar.Tools.Cli/Studio/Host => src/Aevatar.Studio.Hosting}/Controllers/WorkspaceController.cs (95%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/AppAuthoringChatSessionFactory.cs (98%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/ScriptEditorValidationService.cs (98%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/ScriptGenerateActorService.cs (98%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/ScriptGenerateGAgent.cs (95%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/ScriptGenerateOrchestrator.cs (99%) rename tools/Aevatar.Tools.Cli/Hosting/AppStudioEndpoints.cs => src/Aevatar.Studio.Hosting/Endpoints/StudioEndpoints.cs (96%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/WorkflowGenerateActorService.cs (97%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/WorkflowGenerateGAgent.cs (95%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Hosting/Endpoints}/WorkflowGenerateOrchestrator.cs (97%) create mode 100644 src/Aevatar.Studio.Hosting/StudioCapabilityExtensions.cs create mode 100644 src/Aevatar.Studio.Infrastructure/Aevatar.Studio.Infrastructure.csproj rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/DependencyInjection/ServiceCollectionExtensions.cs (81%) rename {tools/Aevatar.Tools.Cli/Hosting => src/Aevatar.Studio.Infrastructure/ScopeResolution}/AppScopeResolver.cs (97%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Serialization/YamlWorkflowDocumentService.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ChronoStorageCatalogBlobClient.cs (99%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ChronoStorageConnectorCatalogStore.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ChronoStorageMasterKeyResolver.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ChronoStorageRoleCatalogStore.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ConnectorCatalogImportParser.cs (74%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ConnectorCatalogJsonSerializer.cs (99%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/ConnectorCatalogStorageOptions.cs (93%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/FileAevatarSettingsStore.cs (99%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/FileStudioWorkspaceStore.cs (99%) create mode 100644 src/Aevatar.Studio.Infrastructure/Storage/NyxIdAppAuthOptions.cs rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/RoleCatalogImportParser.cs (72%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/RoleCatalogJsonSerializer.cs (98%) rename {tools/Aevatar.Tools.Cli/Studio/Infrastructure => src/Aevatar.Studio.Infrastructure}/Storage/StudioStorageOptions.cs (96%) delete mode 100644 tools/Aevatar.Tools.Cli/Bridge/AppBridgeEndpoints.cs delete mode 100644 tools/Aevatar.Tools.Cli/Hosting/AppToolHost.cs delete mode 100644 tools/Aevatar.Tools.Cli/Hosting/NyxIdAccessTokenHandler.cs delete mode 100644 tools/Aevatar.Tools.Cli/Hosting/NyxIdAppAuthentication.cs delete mode 100644 tools/Aevatar.Tools.Cli/Hosting/NyxIdStudioBackendRequestAuthSnapshotProvider.cs delete mode 100644 tools/Aevatar.Tools.Cli/wwwroot/playground/app.css delete mode 100644 tools/Aevatar.Tools.Cli/wwwroot/playground/app.js delete mode 100644 tools/Aevatar.Tools.Cli/wwwroot/playground/codicon.ttf delete mode 100644 tools/Aevatar.Tools.Cli/wwwroot/playground/editor.worker-CKy7Pnvo.js delete mode 100644 tools/Aevatar.Tools.Cli/wwwroot/playground/index.html diff --git a/aevatar.slnx b/aevatar.slnx index a749d81b0..7365304e3 100644 --- a/aevatar.slnx +++ b/aevatar.slnx @@ -67,7 +67,18 @@ - + + + + + + + + + + + + @@ -94,7 +105,6 @@ - diff --git a/apps/aevatar-console-web/config/proxy.ts b/apps/aevatar-console-web/config/proxy.ts index 0a461d0ef..ac086321c 100644 --- a/apps/aevatar-console-web/config/proxy.ts +++ b/apps/aevatar-console-web/config/proxy.ts @@ -13,7 +13,7 @@ const apiTarget = process.env.AEVATAR_API_TARGET || 'http://127.0.0.1:5080'; const configurationApiTarget = process.env.AEVATAR_CONFIGURATION_API_TARGET || 'http://127.0.0.1:6688'; const studioApiTarget = - process.env.AEVATAR_STUDIO_API_TARGET || 'http://127.0.0.1:6690'; + process.env.AEVATAR_STUDIO_API_TARGET || apiTarget; const buildProxyTarget = (target: string) => ({ target, diff --git a/src/Aevatar.Authentication.Abstractions/Aevatar.Authentication.Abstractions.csproj b/src/Aevatar.Authentication.Abstractions/Aevatar.Authentication.Abstractions.csproj new file mode 100644 index 000000000..31c7354fa --- /dev/null +++ b/src/Aevatar.Authentication.Abstractions/Aevatar.Authentication.Abstractions.csproj @@ -0,0 +1,8 @@ + + + net10.0 + enable + enable + Aevatar.Authentication.Abstractions + + diff --git a/src/Aevatar.Authentication.Abstractions/AevatarAuthenticationOptions.cs b/src/Aevatar.Authentication.Abstractions/AevatarAuthenticationOptions.cs new file mode 100644 index 000000000..a29f7d4a1 --- /dev/null +++ b/src/Aevatar.Authentication.Abstractions/AevatarAuthenticationOptions.cs @@ -0,0 +1,22 @@ +namespace Aevatar.Authentication.Abstractions; + +/// +/// Configuration for Aevatar JWT Bearer authentication. +/// Provider-agnostic: Authority points to any OIDC-compliant issuer. +/// +public sealed class AevatarAuthenticationOptions +{ + public const string SectionName = "Aevatar:Authentication"; + + /// Enable JWT Bearer authentication. Default: false. + public bool Enabled { get; set; } + + /// OIDC discovery authority URL (e.g. "https://idp.example.com"). + public string Authority { get; set; } = string.Empty; + + /// Expected JWT audience. Empty means audience validation is skipped. + public string Audience { get; set; } = string.Empty; + + /// Whether to require HTTPS for the authority metadata endpoint. Default: true. + public bool RequireHttpsMetadata { get; set; } = true; +} diff --git a/src/Aevatar.Authentication.Abstractions/AevatarStandardClaimTypes.cs b/src/Aevatar.Authentication.Abstractions/AevatarStandardClaimTypes.cs new file mode 100644 index 000000000..46ca637be --- /dev/null +++ b/src/Aevatar.Authentication.Abstractions/AevatarStandardClaimTypes.cs @@ -0,0 +1,11 @@ +namespace Aevatar.Authentication.Abstractions; + +/// +/// Standard claim types used across all Aevatar authentication providers. +/// Provider-specific claims are mapped to these via . +/// +public static class AevatarStandardClaimTypes +{ + /// Scope identifier for multi-tenant isolation. + public const string ScopeId = "scope_id"; +} diff --git a/src/Aevatar.Authentication.Abstractions/IAevatarClaimsTransformer.cs b/src/Aevatar.Authentication.Abstractions/IAevatarClaimsTransformer.cs new file mode 100644 index 000000000..d30398c84 --- /dev/null +++ b/src/Aevatar.Authentication.Abstractions/IAevatarClaimsTransformer.cs @@ -0,0 +1,18 @@ +using System.Security.Claims; + +namespace Aevatar.Authentication.Abstractions; + +/// +/// Maps provider-specific claims to Aevatar standard claims. +/// Each authentication provider implements this to normalize its token claims +/// into a common format that GAgentService scope gating can consume. +/// +public interface IAevatarClaimsTransformer +{ + /// + /// Returns additional claims to add to the principal. + /// Implementations should map provider-specific claim types + /// (e.g. NyxID's "uid") to . + /// + IEnumerable TransformClaims(ClaimsPrincipal principal); +} diff --git a/src/Aevatar.Authentication.Hosting/Aevatar.Authentication.Hosting.csproj b/src/Aevatar.Authentication.Hosting/Aevatar.Authentication.Hosting.csproj new file mode 100644 index 000000000..80c36cebf --- /dev/null +++ b/src/Aevatar.Authentication.Hosting/Aevatar.Authentication.Hosting.csproj @@ -0,0 +1,17 @@ + + + net10.0 + enable + enable + Aevatar.Authentication.Hosting + + + + + + + + + + + diff --git a/src/Aevatar.Authentication.Hosting/AevatarAuthenticationHostExtensions.cs b/src/Aevatar.Authentication.Hosting/AevatarAuthenticationHostExtensions.cs new file mode 100644 index 000000000..c073b89cc --- /dev/null +++ b/src/Aevatar.Authentication.Hosting/AevatarAuthenticationHostExtensions.cs @@ -0,0 +1,76 @@ +using System.Security.Claims; +using Aevatar.Authentication.Abstractions; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Aevatar.Authentication.Hosting; + +public static class AevatarAuthenticationHostExtensions +{ + /// + /// Registers JWT Bearer authentication if Aevatar:Authentication:Enabled is true. + /// Provider-agnostic: uses OIDC discovery from the configured Authority. + /// Requires an to be registered by the provider package. + /// + public static WebApplicationBuilder AddAevatarAuthentication(this WebApplicationBuilder builder) + { + ArgumentNullException.ThrowIfNull(builder); + + var options = builder.Configuration + .GetSection(AevatarAuthenticationOptions.SectionName) + .Get(); + + if (options?.Enabled != true) + return builder; + + builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) + .AddJwtBearer(jwt => + { + jwt.Authority = options.Authority; + jwt.RequireHttpsMetadata = options.RequireHttpsMetadata; + + jwt.TokenValidationParameters.ValidAudience = options.Audience; + jwt.TokenValidationParameters.ValidateAudience = !string.IsNullOrWhiteSpace(options.Audience); + }); + + builder.Services.AddAuthorization(); + builder.Services.AddTransient(); + + return builder; + } +} + +/// +/// Bridges ASP.NET Core's to +/// implementations registered by auth providers. +/// +internal sealed class AevatarClaimsTransformation : IClaimsTransformation +{ + private readonly IEnumerable _transformers; + + public AevatarClaimsTransformation(IEnumerable transformers) + { + _transformers = transformers; + } + + public Task TransformAsync(ClaimsPrincipal principal) + { + foreach (var transformer in _transformers) + { + var additionalClaims = transformer.TransformClaims(principal); + foreach (var claim in additionalClaims) + { + // Avoid duplicate claims + if (principal.HasClaim(claim.Type, claim.Value)) + continue; + + ((ClaimsIdentity?)principal.Identity)?.AddClaim(claim); + } + } + + return Task.FromResult(principal); + } +} diff --git a/src/Aevatar.Authentication.Providers.NyxId/Aevatar.Authentication.Providers.NyxId.csproj b/src/Aevatar.Authentication.Providers.NyxId/Aevatar.Authentication.Providers.NyxId.csproj new file mode 100644 index 000000000..032f493ea --- /dev/null +++ b/src/Aevatar.Authentication.Providers.NyxId/Aevatar.Authentication.Providers.NyxId.csproj @@ -0,0 +1,16 @@ + + + net10.0 + enable + enable + Aevatar.Authentication.Providers.NyxId + + + + + + + + + + diff --git a/src/Aevatar.Authentication.Providers.NyxId/NyxIdAuthenticationExtensions.cs b/src/Aevatar.Authentication.Providers.NyxId/NyxIdAuthenticationExtensions.cs new file mode 100644 index 000000000..2aede23ed --- /dev/null +++ b/src/Aevatar.Authentication.Providers.NyxId/NyxIdAuthenticationExtensions.cs @@ -0,0 +1,17 @@ +using Aevatar.Authentication.Abstractions; +using Microsoft.Extensions.DependencyInjection; + +namespace Aevatar.Authentication.Providers.NyxId; + +public static class NyxIdAuthenticationExtensions +{ + /// + /// Registers the NyxID claims transformer. + /// Call this in the host composition root to enable NyxID scope claim mapping. + /// + public static IServiceCollection AddNyxIdAuthentication(this IServiceCollection services) + { + services.AddSingleton(); + return services; + } +} diff --git a/src/Aevatar.Authentication.Providers.NyxId/NyxIdClaimsTransformer.cs b/src/Aevatar.Authentication.Providers.NyxId/NyxIdClaimsTransformer.cs new file mode 100644 index 000000000..a71f9ee2f --- /dev/null +++ b/src/Aevatar.Authentication.Providers.NyxId/NyxIdClaimsTransformer.cs @@ -0,0 +1,56 @@ +using System.Security.Claims; +using Aevatar.Authentication.Abstractions; + +namespace Aevatar.Authentication.Providers.NyxId; + +/// +/// Maps NyxID token claims to Aevatar standard claims. +/// Waterfall: scope_id → uid → sub → NameIdentifier → any *_id claim. +/// +public sealed class NyxIdClaimsTransformer : IAevatarClaimsTransformer +{ + private static readonly HashSet IgnoredGenericIdClaimTypes = new(StringComparer.OrdinalIgnoreCase) + { + "client_id", + "session_id", + "sid", + }; + + private static readonly string[] ScopeClaimCandidates = + [ + AevatarStandardClaimTypes.ScopeId, + "uid", + "sub", + ClaimTypes.NameIdentifier, + ]; + + public IEnumerable TransformClaims(ClaimsPrincipal principal) + { + if (principal.Identity is not ClaimsIdentity identity) + yield break; + + // Already has scope_id — no mapping needed + if (identity.FindFirst(AevatarStandardClaimTypes.ScopeId) != null) + yield break; + + // Try known claim types in priority order + foreach (var claimType in ScopeClaimCandidates) + { + var claimValue = identity.FindFirst(claimType)?.Value?.Trim(); + if (string.IsNullOrWhiteSpace(claimValue)) + continue; + + yield return new Claim(AevatarStandardClaimTypes.ScopeId, claimValue); + yield break; + } + + // Fallback: any *_id claim not in the ignore list + var genericIdClaim = identity.Claims.FirstOrDefault(claim => + claim.Type.EndsWith("_id", StringComparison.OrdinalIgnoreCase) && + !IgnoredGenericIdClaimTypes.Contains(claim.Type) && + !string.IsNullOrWhiteSpace(claim.Value)); + + if (genericIdClaim != null) + yield return new Claim(AevatarStandardClaimTypes.ScopeId, genericIdClaim.Value.Trim()); + } +} diff --git a/src/Aevatar.Bootstrap/Hosting/WebApplicationBuilderExtensions.cs b/src/Aevatar.Bootstrap/Hosting/WebApplicationBuilderExtensions.cs index 259ef4681..34dc8233c 100644 --- a/src/Aevatar.Bootstrap/Hosting/WebApplicationBuilderExtensions.cs +++ b/src/Aevatar.Bootstrap/Hosting/WebApplicationBuilderExtensions.cs @@ -79,6 +79,14 @@ public static WebApplication UseAevatarDefaultHost(this WebApplication app) if (options.EnableCors) app.UseCors(options.CorsPolicyName); + // Authentication middleware: auto-activates when an auth scheme is registered. + // This keeps Bootstrap decoupled from any specific auth provider. + if (app.Services.GetService() != null) + { + app.UseAuthentication(); + app.UseAuthorization(); + } + if (options.EnableWebSockets) app.UseWebSockets(); diff --git a/src/Aevatar.Mainnet.Host.Api/Aevatar.Mainnet.Host.Api.csproj b/src/Aevatar.Mainnet.Host.Api/Aevatar.Mainnet.Host.Api.csproj index 6d21bfb5d..253c3e567 100644 --- a/src/Aevatar.Mainnet.Host.Api/Aevatar.Mainnet.Host.Api.csproj +++ b/src/Aevatar.Mainnet.Host.Api/Aevatar.Mainnet.Host.Api.csproj @@ -8,6 +8,9 @@ + + + diff --git a/src/Aevatar.Mainnet.Host.Api/Program.cs b/src/Aevatar.Mainnet.Host.Api/Program.cs index 483a78ea7..cc3646be2 100644 --- a/src/Aevatar.Mainnet.Host.Api/Program.cs +++ b/src/Aevatar.Mainnet.Host.Api/Program.cs @@ -1,6 +1,9 @@ +using Aevatar.Authentication.Hosting; +using Aevatar.Authentication.Providers.NyxId; using Aevatar.Bootstrap.Hosting; using Aevatar.GAgentService.Hosting.Endpoints; using Aevatar.Mainnet.Host.Api.Hosting; +using Aevatar.Studio.Hosting; using Aevatar.Workflow.Extensions.Hosting; var builder = WebApplication.CreateBuilder(args); @@ -17,6 +20,11 @@ options.EnableMakerExtensions = true; }); builder.AddGAgentServiceCapabilityBundle(); +builder.AddStudioCapability(); + +// Authentication: config-driven, provider-agnostic +builder.Services.AddNyxIdAuthentication(); +builder.AddAevatarAuthentication(); var app = builder.Build(); diff --git a/src/Aevatar.Mainnet.Host.Api/appsettings.json b/src/Aevatar.Mainnet.Host.Api/appsettings.json new file mode 100644 index 000000000..a5b6c114b --- /dev/null +++ b/src/Aevatar.Mainnet.Host.Api/appsettings.json @@ -0,0 +1,9 @@ +{ + "Aevatar": { + "Authentication": { + "Enabled": true, + "Authority": "https://nyx-api.chrono-ai.fun", + "RequireHttpsMetadata": true + } + } +} diff --git a/src/Aevatar.Studio.Application/Aevatar.Studio.Application.csproj b/src/Aevatar.Studio.Application/Aevatar.Studio.Application.csproj new file mode 100644 index 000000000..d7d549a66 --- /dev/null +++ b/src/Aevatar.Studio.Application/Aevatar.Studio.Application.csproj @@ -0,0 +1,35 @@ + + + net10.0 + enable + enable + Aevatar.Studio.Application + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppApiErrors.cs b/src/Aevatar.Studio.Application/AppApiErrors.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Hosting/AppApiErrors.cs rename to src/Aevatar.Studio.Application/AppApiErrors.cs index f32fe496b..5de582e43 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppApiErrors.cs +++ b/src/Aevatar.Studio.Application/AppApiErrors.cs @@ -1,13 +1,13 @@ using Microsoft.AspNetCore.Http; -namespace Aevatar.Tools.Cli.Hosting; +namespace Aevatar.Studio.Application; -internal sealed record AppApiErrorResponse( +public sealed record AppApiErrorResponse( string Code, string Message, string? LoginUrl = null); -internal sealed class AppApiException : InvalidOperationException +public sealed class AppApiException : InvalidOperationException { public AppApiException( int statusCode, @@ -29,7 +29,7 @@ public AppApiException( public string? LoginUrl { get; } } -internal static class AppApiErrors +public static class AppApiErrors { public const string AuthRequiredCode = "AUTH_REQUIRED"; public const string BackendAuthRequiredCode = "BACKEND_AUTH_REQUIRED"; diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppScopedScriptService.cs b/src/Aevatar.Studio.Application/AppScopedScriptService.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Hosting/AppScopedScriptService.cs rename to src/Aevatar.Studio.Application/AppScopedScriptService.cs index ad8c5da94..4ec7433a0 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppScopedScriptService.cs +++ b/src/Aevatar.Studio.Application/AppScopedScriptService.cs @@ -13,7 +13,10 @@ using Google.Protobuf; using Google.Protobuf.WellKnownTypes; -namespace Aevatar.Tools.Cli.Hosting; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application.Scripts.Contracts; +using Aevatar.Studio.Application.Studio; +namespace Aevatar.Studio.Application; public sealed class AppScopedScriptService { @@ -223,7 +226,7 @@ public async Task SaveAsync( AppScriptPackagePayloads.ResolvePersistedSource(request.Package, request.SourceText), nameof(request.SourceText)); var scriptId = string.IsNullOrWhiteSpace(request.ScriptId) - ? AppStudioEndpoints.NormalizeStudioDocumentId(request.ScriptId, "script") + ? StudioDocumentIdNormalizer.Normalize(request.ScriptId, "script") : NormalizeRequired(request.ScriptId, nameof(request.ScriptId)); ScopeScriptUpsertResult upsertResult; diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppScopedWorkflowService.cs b/src/Aevatar.Studio.Application/AppScopedWorkflowService.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/AppScopedWorkflowService.cs rename to src/Aevatar.Studio.Application/AppScopedWorkflowService.cs index 0804af650..a70536a53 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppScopedWorkflowService.cs +++ b/src/Aevatar.Studio.Application/AppScopedWorkflowService.cs @@ -1,15 +1,17 @@ using System.Net; +using Microsoft.AspNetCore.Http; using System.Net.Http.Json; using System.Text.Json; using Aevatar.Configuration; using Aevatar.GAgentService.Abstractions; using Aevatar.GAgentService.Abstractions.Ports; using Aevatar.Workflow.Application.Abstractions.Runs; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Studio; +namespace Aevatar.Studio.Application; public sealed class AppScopedWorkflowService { @@ -117,7 +119,7 @@ public async Task SaveAsync( ? parsed.Document.Name.Trim() : NormalizeRequired(request.WorkflowName, nameof(request.WorkflowName)); var workflowId = string.IsNullOrWhiteSpace(request.WorkflowId) - ? AppStudioEndpoints.NormalizeStudioDocumentId(workflowName, "workflow") + ? StudioDocumentIdNormalizer.Normalize(workflowName, "workflow") : NormalizeRequired(request.WorkflowId, nameof(request.WorkflowId)); var displayName = string.IsNullOrWhiteSpace(request.WorkflowName) ? workflowId @@ -391,7 +393,7 @@ private static string BuildLayoutCachePath(string scopeId, string workflowId) => AevatarPaths.Root, "app", "scope-workflow-layouts", - $"{AppStudioEndpoints.NormalizeStudioDocumentId(scopeId, "scope")}--{AppStudioEndpoints.NormalizeStudioDocumentId(workflowId, "workflow")}.json"); + $"{StudioDocumentIdNormalizer.Normalize(scopeId, "scope")}--{StudioDocumentIdNormalizer.Normalize(workflowId, "workflow")}.json"); private static string NormalizeRequired(string value, string fieldName) { diff --git a/tools/Aevatar.Tools.Cli/Hosting/Protos/app_script_protocol.proto b/src/Aevatar.Studio.Application/Protos/app_script_protocol.proto similarity index 95% rename from tools/Aevatar.Tools.Cli/Hosting/Protos/app_script_protocol.proto rename to src/Aevatar.Studio.Application/Protos/app_script_protocol.proto index d435d12c9..f7cb98ff0 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/Protos/app_script_protocol.proto +++ b/src/Aevatar.Studio.Application/Protos/app_script_protocol.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package aevatar.tools.cli.hosting; -option csharp_namespace = "Aevatar.Tools.Cli.Hosting"; +option csharp_namespace = "Aevatar.Studio.Application.Scripts.Contracts"; import "scripting_schema_options.proto"; import "scripting_runtime_options.proto"; diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppScriptPackagePayloads.cs b/src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptPackagePayloads.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/AppScriptPackagePayloads.cs rename to src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptPackagePayloads.cs index 88a593f25..35366ce2a 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppScriptPackagePayloads.cs +++ b/src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptPackagePayloads.cs @@ -3,7 +3,7 @@ using Aevatar.Scripting.Abstractions; using Aevatar.Scripting.Core.Compilation; -namespace Aevatar.Tools.Cli.Hosting; +namespace Aevatar.Studio.Application.Scripts.Contracts; public sealed record AppScriptPackageFile( string? Path, @@ -15,7 +15,7 @@ public sealed record AppScriptPackage( string? EntryBehaviorTypeName, string? EntrySourcePath); -internal static class AppScriptPackagePayloads +public static class AppScriptPackagePayloads { public static bool HasFiles(AppScriptPackage? package) => (package?.CsharpSources?.Count ?? 0) > 0 || diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppScriptProtocol.cs b/src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptProtocol.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/AppScriptProtocol.cs rename to src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptProtocol.cs index a947a91d3..d288b85c9 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppScriptProtocol.cs +++ b/src/Aevatar.Studio.Application/Scripts/Contracts/AppScriptProtocol.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Hosting; +namespace Aevatar.Studio.Application.Scripts.Contracts; public static class AppScriptProtocol { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IAevatarSettingsStore.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IAevatarSettingsStore.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IAevatarSettingsStore.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IAevatarSettingsStore.cs index 5d9d3d569..92ea5faf6 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IAevatarSettingsStore.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IAevatarSettingsStore.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IAevatarSettingsStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogImportParser.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogImportParser.cs similarity index 76% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogImportParser.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogImportParser.cs index 0be00006f..01515b41b 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogImportParser.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogImportParser.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IConnectorCatalogImportParser { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogStore.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogStore.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogStore.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogStore.cs index ea09c3b65..e4728ee03 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IConnectorCatalogStore.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IConnectorCatalogStore.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IConnectorCatalogStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogImportParser.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogImportParser.cs similarity index 75% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogImportParser.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogImportParser.cs index 8dbf9fc8d..9dff2f6e6 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogImportParser.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogImportParser.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IRoleCatalogImportParser { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogStore.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogStore.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogStore.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogStore.cs index eb8ad61c7..cc9094f1d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IRoleCatalogStore.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IRoleCatalogStore.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IRoleCatalogStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs similarity index 85% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs index 0989119b9..a163c9fdf 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IStudioBackendRequestAuthSnapshotProvider.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IStudioBackendRequestAuthSnapshotProvider { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioWorkspaceStore.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IStudioWorkspaceStore.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioWorkspaceStore.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IStudioWorkspaceStore.cs index 2a26e5c6e..6d37bc9e4 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IStudioWorkspaceStore.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IStudioWorkspaceStore.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IStudioWorkspaceStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IWorkflowYamlDocumentService.cs b/src/Aevatar.Studio.Application/Studio/Abstractions/IWorkflowYamlDocumentService.cs similarity index 71% rename from tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IWorkflowYamlDocumentService.cs rename to src/Aevatar.Studio.Application/Studio/Abstractions/IWorkflowYamlDocumentService.cs index df2c0b433..faed62b0b 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Abstractions/IWorkflowYamlDocumentService.cs +++ b/src/Aevatar.Studio.Application/Studio/Abstractions/IWorkflowYamlDocumentService.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Abstractions; +namespace Aevatar.Studio.Application.Studio.Abstractions; public interface IWorkflowYamlDocumentService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ConnectorContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/ConnectorContracts.cs similarity index 96% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ConnectorContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/ConnectorContracts.cs index 17767da77..7a9b142fe 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ConnectorContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/ConnectorContracts.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record ConnectorCatalogResponse( string HomeDirectory, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/EditorContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/EditorContracts.cs similarity index 90% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/EditorContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/EditorContracts.cs index 6fe9d37f1..1b9f15622 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/EditorContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/EditorContracts.cs @@ -1,7 +1,7 @@ -using Aevatar.Tools.Cli.Studio.Domain.Graph; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Domain.Studio.Graph; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record ParseYamlRequest( string Yaml, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ExecutionContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/ExecutionContracts.cs similarity index 95% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ExecutionContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/ExecutionContracts.cs index 3db3b220d..007ffd810 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/ExecutionContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/ExecutionContracts.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record StartExecutionRequest( string WorkflowName, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/RoleContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/RoleContracts.cs similarity index 94% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/RoleContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/RoleContracts.cs index 04206305a..46e2b94de 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/RoleContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/RoleContracts.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record RoleCatalogResponse( string HomeDirectory, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/SettingsContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/SettingsContracts.cs similarity index 96% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/SettingsContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/SettingsContracts.cs index ba363b4b1..01560eb7d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/SettingsContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/SettingsContracts.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record StudioSettingsResponse( string RuntimeBaseUrl, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/WorkspaceContracts.cs b/src/Aevatar.Studio.Application/Studio/Contracts/WorkspaceContracts.cs similarity index 92% rename from tools/Aevatar.Tools.Cli/Studio/Application/Contracts/WorkspaceContracts.cs rename to src/Aevatar.Studio.Application/Studio/Contracts/WorkspaceContracts.cs index 6448b53c9..a1f22e09c 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Contracts/WorkspaceContracts.cs +++ b/src/Aevatar.Studio.Application/Studio/Contracts/WorkspaceContracts.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Contracts; +namespace Aevatar.Studio.Application.Studio.Contracts; public sealed record WorkspaceSettingsResponse( string RuntimeBaseUrl, diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/DependencyInjection/ServiceCollectionExtensions.cs b/src/Aevatar.Studio.Application/Studio/DependencyInjection/ServiceCollectionExtensions.cs similarity index 84% rename from tools/Aevatar.Tools.Cli/Studio/Application/DependencyInjection/ServiceCollectionExtensions.cs rename to src/Aevatar.Studio.Application/Studio/DependencyInjection/ServiceCollectionExtensions.cs index 352358d65..502d5f6f2 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Aevatar.Studio.Application/Studio/DependencyInjection/ServiceCollectionExtensions.cs @@ -1,7 +1,7 @@ -using Aevatar.Tools.Cli.Studio.Application.Services; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.Extensions.DependencyInjection; -namespace Aevatar.Tools.Cli.Studio.Application.DependencyInjection; +namespace Aevatar.Studio.Application.Studio.DependencyInjection; public static class ServiceCollectionExtensions { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/ConnectorService.cs b/src/Aevatar.Studio.Application/Studio/Services/ConnectorService.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/ConnectorService.cs rename to src/Aevatar.Studio.Application/Studio/Services/ConnectorService.cs index 32bbbef1f..3205210f0 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/ConnectorService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/ConnectorService.cs @@ -1,8 +1,8 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; using System.Text.Json; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class ConnectorService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/ExecutionService.cs b/src/Aevatar.Studio.Application/Studio/Services/ExecutionService.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/ExecutionService.cs rename to src/Aevatar.Studio.Application/Studio/Services/ExecutionService.cs index 0020c37ca..fa065306c 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/ExecutionService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/ExecutionService.cs @@ -2,10 +2,10 @@ using System.Net.Http.Json; using System.Net.Http.Headers; using System.Text.Json; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class ExecutionService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/RoleCatalogService.cs b/src/Aevatar.Studio.Application/Studio/Services/RoleCatalogService.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/RoleCatalogService.cs rename to src/Aevatar.Studio.Application/Studio/Services/RoleCatalogService.cs index 461195f28..8e692c278 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/RoleCatalogService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/RoleCatalogService.cs @@ -1,8 +1,8 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; using System.Text.Json; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class RoleCatalogService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/SettingsService.cs b/src/Aevatar.Studio.Application/Studio/Services/SettingsService.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/SettingsService.cs rename to src/Aevatar.Studio.Application/Studio/Services/SettingsService.cs index d78e43147..a239c7dcf 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/SettingsService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/SettingsService.cs @@ -1,7 +1,7 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class SettingsService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/TextDiffService.cs b/src/Aevatar.Studio.Application/Studio/Services/TextDiffService.cs similarity index 95% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/TextDiffService.cs rename to src/Aevatar.Studio.Application/Studio/Services/TextDiffService.cs index 9cd2bcf69..1bdc4e917 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/TextDiffService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/TextDiffService.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; +using Aevatar.Studio.Application.Studio.Contracts; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class TextDiffService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowEditorService.cs b/src/Aevatar.Studio.Application/Studio/Services/WorkflowEditorService.cs similarity index 92% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowEditorService.cs rename to src/Aevatar.Studio.Application/Studio/Services/WorkflowEditorService.cs index 89f21dd77..56eed6dd2 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowEditorService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/WorkflowEditorService.cs @@ -1,9 +1,9 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Domain.Models; -using Aevatar.Tools.Cli.Studio.Domain.Services; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Domain.Studio.Models; +using Aevatar.Studio.Domain.Studio.Services; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class WorkflowEditorService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowGraphMapper.cs b/src/Aevatar.Studio.Application/Studio/Services/WorkflowGraphMapper.cs similarity index 91% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowGraphMapper.cs rename to src/Aevatar.Studio.Application/Studio/Services/WorkflowGraphMapper.cs index fa64a95b5..aad68d156 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkflowGraphMapper.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/WorkflowGraphMapper.cs @@ -1,8 +1,8 @@ -using Aevatar.Tools.Cli.Studio.Domain.Compatibility; -using Aevatar.Tools.Cli.Studio.Domain.Graph; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Domain.Studio.Compatibility; +using Aevatar.Studio.Domain.Studio.Graph; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class WorkflowGraphMapper { diff --git a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkspaceService.cs b/src/Aevatar.Studio.Application/Studio/Services/WorkspaceService.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkspaceService.cs rename to src/Aevatar.Studio.Application/Studio/Services/WorkspaceService.cs index 5db5ada82..e88f6be4a 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Application/Services/WorkspaceService.cs +++ b/src/Aevatar.Studio.Application/Studio/Services/WorkspaceService.cs @@ -1,9 +1,9 @@ using System.Text.RegularExpressions; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Studio.Application.Services; +namespace Aevatar.Studio.Application.Studio.Services; public sealed class WorkspaceService { diff --git a/src/Aevatar.Studio.Application/Studio/StudioDocumentIdNormalizer.cs b/src/Aevatar.Studio.Application/Studio/StudioDocumentIdNormalizer.cs new file mode 100644 index 000000000..c1c91512b --- /dev/null +++ b/src/Aevatar.Studio.Application/Studio/StudioDocumentIdNormalizer.cs @@ -0,0 +1,41 @@ +using System.Text; + +namespace Aevatar.Studio.Application.Studio; + +public static class StudioDocumentIdNormalizer +{ + public static string Normalize(string? rawValue, string fallbackPrefix) + { + var trimmed = string.IsNullOrWhiteSpace(rawValue) + ? string.Empty + : rawValue.Trim().ToLowerInvariant(); + var builder = new StringBuilder(trimmed.Length); + var lastWasDash = false; + foreach (var ch in trimmed) + { + if (char.IsLetterOrDigit(ch)) + { + builder.Append(ch); + lastWasDash = false; + continue; + } + + if (ch is '-' or '_' or ' ' or '.') + { + if (lastWasDash) + continue; + + builder.Append('-'); + lastWasDash = true; + } + } + + var normalized = builder + .ToString() + .Trim('-'); + if (!string.IsNullOrWhiteSpace(normalized)) + return normalized; + + return $"{fallbackPrefix}-{Guid.NewGuid():N}"[..16]; + } +} diff --git a/src/Aevatar.Studio.Domain/Aevatar.Studio.Domain.csproj b/src/Aevatar.Studio.Domain/Aevatar.Studio.Domain.csproj new file mode 100644 index 000000000..882bd0403 --- /dev/null +++ b/src/Aevatar.Studio.Domain/Aevatar.Studio.Domain.csproj @@ -0,0 +1,8 @@ + + + net10.0 + enable + enable + Aevatar.Studio.Domain + + diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Compatibility/WorkflowCompatibilityProfile.cs b/src/Aevatar.Studio.Domain/Studio/Compatibility/WorkflowCompatibilityProfile.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Compatibility/WorkflowCompatibilityProfile.cs rename to src/Aevatar.Studio.Domain/Studio/Compatibility/WorkflowCompatibilityProfile.cs index 3afb49bb7..fda81198b 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Compatibility/WorkflowCompatibilityProfile.cs +++ b/src/Aevatar.Studio.Domain/Studio/Compatibility/WorkflowCompatibilityProfile.cs @@ -1,6 +1,6 @@ using System.Collections.Immutable; -namespace Aevatar.Tools.Cli.Studio.Domain.Compatibility; +namespace Aevatar.Studio.Domain.Studio.Compatibility; public sealed class WorkflowCompatibilityProfile { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Graph/WorkflowGraphDocument.cs b/src/Aevatar.Studio.Domain/Studio/Graph/WorkflowGraphDocument.cs similarity index 91% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Graph/WorkflowGraphDocument.cs rename to src/Aevatar.Studio.Domain/Studio/Graph/WorkflowGraphDocument.cs index 8eb757fd9..afd678d8a 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Graph/WorkflowGraphDocument.cs +++ b/src/Aevatar.Studio.Domain/Studio/Graph/WorkflowGraphDocument.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Graph; +namespace Aevatar.Studio.Domain.Studio.Graph; public sealed record WorkflowGraphDocument { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/RoleModel.cs b/src/Aevatar.Studio.Domain/Studio/Models/RoleModel.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/RoleModel.cs rename to src/Aevatar.Studio.Domain/Studio/Models/RoleModel.cs index e81c12d0f..c6288c1c5 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/RoleModel.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/RoleModel.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record RoleModel { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepErrorPolicy.cs b/src/Aevatar.Studio.Domain/Studio/Models/StepErrorPolicy.cs similarity index 79% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepErrorPolicy.cs rename to src/Aevatar.Studio.Domain/Studio/Models/StepErrorPolicy.cs index 01aa35271..74ce56bae 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepErrorPolicy.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/StepErrorPolicy.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record StepErrorPolicy { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepModel.cs b/src/Aevatar.Studio.Domain/Studio/Models/StepModel.cs similarity index 94% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepModel.cs rename to src/Aevatar.Studio.Domain/Studio/Models/StepModel.cs index 052d43095..ad70e5a4f 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepModel.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/StepModel.cs @@ -1,6 +1,6 @@ using System.Text.Json.Nodes; -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record StepModel { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepRetryPolicy.cs b/src/Aevatar.Studio.Domain/Studio/Models/StepRetryPolicy.cs similarity index 79% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepRetryPolicy.cs rename to src/Aevatar.Studio.Domain/Studio/Models/StepRetryPolicy.cs index 70850a7b4..00c0c6c4b 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/StepRetryPolicy.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/StepRetryPolicy.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record StepRetryPolicy { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationFinding.cs b/src/Aevatar.Studio.Domain/Studio/Models/ValidationFinding.cs similarity index 91% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationFinding.cs rename to src/Aevatar.Studio.Domain/Studio/Models/ValidationFinding.cs index ad53592a0..d7128eb3a 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationFinding.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/ValidationFinding.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record ValidationFinding( ValidationLevel Level, diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationLevel.cs b/src/Aevatar.Studio.Domain/Studio/Models/ValidationLevel.cs similarity index 56% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationLevel.cs rename to src/Aevatar.Studio.Domain/Studio/Models/ValidationLevel.cs index 07696de91..3c159537d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/ValidationLevel.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/ValidationLevel.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public enum ValidationLevel { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowConfiguration.cs b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowConfiguration.cs similarity index 65% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowConfiguration.cs rename to src/Aevatar.Studio.Domain/Studio/Models/WorkflowConfiguration.cs index 95232bdc5..961306583 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowConfiguration.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowConfiguration.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record WorkflowConfiguration { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowDocument.cs b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowDocument.cs similarity index 87% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowDocument.cs rename to src/Aevatar.Studio.Domain/Studio/Models/WorkflowDocument.cs index ea142e8a9..a888a49d4 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowDocument.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowDocument.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record WorkflowDocument { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowLayoutDocument.cs b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowLayoutDocument.cs similarity index 91% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowLayoutDocument.cs rename to src/Aevatar.Studio.Domain/Studio/Models/WorkflowLayoutDocument.cs index 2f909f3b8..06169abc8 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowLayoutDocument.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowLayoutDocument.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record WorkflowLayoutDocument { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowPatch.cs b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowPatch.cs similarity index 80% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowPatch.cs rename to src/Aevatar.Studio.Domain/Studio/Models/WorkflowPatch.cs index 09938b459..1ab6c7e05 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Models/WorkflowPatch.cs +++ b/src/Aevatar.Studio.Domain/Studio/Models/WorkflowPatch.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Domain.Models; +namespace Aevatar.Studio.Domain.Studio.Models; public sealed record WorkflowPatch { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowDocumentNormalizer.cs b/src/Aevatar.Studio.Domain/Studio/Services/WorkflowDocumentNormalizer.cs similarity index 96% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowDocumentNormalizer.cs rename to src/Aevatar.Studio.Domain/Studio/Services/WorkflowDocumentNormalizer.cs index 81f54411e..0d6d3b13d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowDocumentNormalizer.cs +++ b/src/Aevatar.Studio.Domain/Studio/Services/WorkflowDocumentNormalizer.cs @@ -1,10 +1,10 @@ using System.Globalization; using System.Text.Json.Nodes; -using Aevatar.Tools.Cli.Studio.Domain.Compatibility; -using Aevatar.Tools.Cli.Studio.Domain.Models; -using Aevatar.Tools.Cli.Studio.Domain.Utilities; +using Aevatar.Studio.Domain.Studio.Compatibility; +using Aevatar.Studio.Domain.Studio.Models; +using Aevatar.Studio.Domain.Studio.Utilities; -namespace Aevatar.Tools.Cli.Studio.Domain.Services; +namespace Aevatar.Studio.Domain.Studio.Services; public sealed class WorkflowDocumentNormalizer { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowValidator.cs b/src/Aevatar.Studio.Domain/Studio/Services/WorkflowValidator.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowValidator.cs rename to src/Aevatar.Studio.Domain/Studio/Services/WorkflowValidator.cs index 3bf166d10..1b76d671e 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Services/WorkflowValidator.cs +++ b/src/Aevatar.Studio.Domain/Studio/Services/WorkflowValidator.cs @@ -1,8 +1,8 @@ -using Aevatar.Tools.Cli.Studio.Domain.Compatibility; -using Aevatar.Tools.Cli.Studio.Domain.Models; -using Aevatar.Tools.Cli.Studio.Domain.Utilities; +using Aevatar.Studio.Domain.Studio.Compatibility; +using Aevatar.Studio.Domain.Studio.Models; +using Aevatar.Studio.Domain.Studio.Utilities; -namespace Aevatar.Tools.Cli.Studio.Domain.Services; +namespace Aevatar.Studio.Domain.Studio.Services; public sealed record WorkflowValidationOptions { diff --git a/tools/Aevatar.Tools.Cli/Studio/Domain/Utilities/JsonNodeExtensions.cs b/src/Aevatar.Studio.Domain/Studio/Utilities/JsonNodeExtensions.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Studio/Domain/Utilities/JsonNodeExtensions.cs rename to src/Aevatar.Studio.Domain/Studio/Utilities/JsonNodeExtensions.cs index e6e670ae9..bdf7a703d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Domain/Utilities/JsonNodeExtensions.cs +++ b/src/Aevatar.Studio.Domain/Studio/Utilities/JsonNodeExtensions.cs @@ -2,7 +2,7 @@ using System.Text.Json; using System.Text.Json.Nodes; -namespace Aevatar.Tools.Cli.Studio.Domain.Utilities; +namespace Aevatar.Studio.Domain.Studio.Utilities; public static class JsonNodeExtensions { diff --git a/src/Aevatar.Studio.Hosting/Aevatar.Studio.Hosting.csproj b/src/Aevatar.Studio.Hosting/Aevatar.Studio.Hosting.csproj new file mode 100644 index 000000000..39ddea5b0 --- /dev/null +++ b/src/Aevatar.Studio.Hosting/Aevatar.Studio.Hosting.csproj @@ -0,0 +1,19 @@ + + + net10.0 + enable + enable + Aevatar.Studio.Hosting + + + + + + + + + + + + + diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ConnectorsController.cs b/src/Aevatar.Studio.Hosting/Controllers/ConnectorsController.cs similarity index 86% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ConnectorsController.cs rename to src/Aevatar.Studio.Hosting/Controllers/ConnectorsController.cs index aba8b180f..610dfa118 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ConnectorsController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/ConnectorsController.cs @@ -1,8 +1,14 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application.Studio.Contracts; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/connectors")] diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/EditorController.cs b/src/Aevatar.Studio.Hosting/Controllers/EditorController.cs similarity index 83% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/EditorController.cs rename to src/Aevatar.Studio.Hosting/Controllers/EditorController.cs index 7945cf0c7..b9abc8e28 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/EditorController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/EditorController.cs @@ -1,8 +1,10 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; +using Aevatar.Studio.Application; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/editor")] diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ExecutionsController.cs b/src/Aevatar.Studio.Hosting/Controllers/ExecutionsController.cs similarity index 88% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ExecutionsController.cs rename to src/Aevatar.Studio.Hosting/Controllers/ExecutionsController.cs index 96eeaf46b..1cc7c1c98 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/ExecutionsController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/ExecutionsController.cs @@ -1,8 +1,10 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; +using Aevatar.Studio.Application; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/executions")] diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/RolesController.cs b/src/Aevatar.Studio.Hosting/Controllers/RolesController.cs similarity index 86% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/RolesController.cs rename to src/Aevatar.Studio.Hosting/Controllers/RolesController.cs index 612a64fe0..1512a721e 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/RolesController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/RolesController.cs @@ -1,8 +1,14 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application.Studio.Contracts; +using Microsoft.AspNetCore.Http; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/roles")] diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/SettingsController.cs b/src/Aevatar.Studio.Hosting/Controllers/SettingsController.cs similarity index 85% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/SettingsController.cs rename to src/Aevatar.Studio.Hosting/Controllers/SettingsController.cs index 62870e0f4..c81727f3d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/SettingsController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/SettingsController.cs @@ -1,8 +1,10 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; +using Aevatar.Studio.Application; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Application.Studio.Services; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/settings")] diff --git a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/WorkspaceController.cs b/src/Aevatar.Studio.Hosting/Controllers/WorkspaceController.cs similarity index 95% rename from tools/Aevatar.Tools.Cli/Studio/Host/Controllers/WorkspaceController.cs rename to src/Aevatar.Studio.Hosting/Controllers/WorkspaceController.cs index 23528a77d..407cab2c9 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Host/Controllers/WorkspaceController.cs +++ b/src/Aevatar.Studio.Hosting/Controllers/WorkspaceController.cs @@ -1,9 +1,11 @@ -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; -using Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Application.Studio.Services; +using Aevatar.Studio.Hosting; using Microsoft.AspNetCore.Mvc; -namespace Aevatar.Tools.Cli.Studio.Host.Controllers; +namespace Aevatar.Studio.Hosting.Controllers; [ApiController] [Route("api/workspace")] diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppAuthoringChatSessionFactory.cs b/src/Aevatar.Studio.Hosting/Endpoints/AppAuthoringChatSessionFactory.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Hosting/AppAuthoringChatSessionFactory.cs rename to src/Aevatar.Studio.Hosting/Endpoints/AppAuthoringChatSessionFactory.cs index 3b7eae06b..53ecdf6d9 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppAuthoringChatSessionFactory.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/AppAuthoringChatSessionFactory.cs @@ -6,7 +6,8 @@ using Aevatar.AI.Core.Tools; using Aevatar.Foundation.Core.Configurations; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; // App Studio authoring uses an ephemeral chat session per request so it does not // depend on actor runtime shape or concrete in-memory agent instances. diff --git a/tools/Aevatar.Tools.Cli/Hosting/ScriptEditorValidationService.cs b/src/Aevatar.Studio.Hosting/Endpoints/ScriptEditorValidationService.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Hosting/ScriptEditorValidationService.cs rename to src/Aevatar.Studio.Hosting/Endpoints/ScriptEditorValidationService.cs index 80f42dd01..a4cd5153d 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/ScriptEditorValidationService.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/ScriptEditorValidationService.cs @@ -5,7 +5,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed class ScriptEditorValidationService { @@ -32,8 +33,8 @@ public ScriptEditorValidationResult Validate( AppScriptPackage? package, string? source = null) { - var normalizedScriptId = AppStudioEndpoints.NormalizeStudioDocumentId(scriptId, "script"); - var normalizedRevision = AppStudioEndpoints.NormalizeStudioDocumentId(revision, "draft"); + var normalizedScriptId = StudioEndpoints.NormalizeStudioDocumentId(scriptId, "script"); + var normalizedRevision = StudioEndpoints.NormalizeStudioDocumentId(revision, "draft"); try { diff --git a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateActorService.cs b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateActorService.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateActorService.cs rename to src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateActorService.cs index d1386a7ea..e3892a79e 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateActorService.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateActorService.cs @@ -2,7 +2,8 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed class ScriptGenerateActorService { @@ -144,7 +145,7 @@ private string BuildSystemPrompt() using System.Threading.Tasks; using Aevatar.Scripting.Abstractions; using Aevatar.Scripting.Abstractions.Behaviors; - using Aevatar.Tools.Cli.Hosting; + using Aevatar.Studio.Hosting.Endpoints; public sealed class DraftBehavior : ScriptBehavior { diff --git a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateGAgent.cs b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateGAgent.cs similarity index 95% rename from tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateGAgent.cs rename to src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateGAgent.cs index b579b3886..1ee11d4d9 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateGAgent.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateGAgent.cs @@ -5,7 +5,8 @@ using Google.Protobuf.WellKnownTypes; using System.Text; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed class ScriptGenerateGAgent : AIGAgentBase { diff --git a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateOrchestrator.cs b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateOrchestrator.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateOrchestrator.cs rename to src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateOrchestrator.cs index eb366930a..224863cab 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/ScriptGenerateOrchestrator.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/ScriptGenerateOrchestrator.cs @@ -3,7 +3,8 @@ using Aevatar.Scripting.Core.Compilation; using System.Text.Json; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed record ScriptGenerateRequest( string Prompt, diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppStudioEndpoints.cs b/src/Aevatar.Studio.Hosting/Endpoints/StudioEndpoints.cs similarity index 96% rename from tools/Aevatar.Tools.Cli/Hosting/AppStudioEndpoints.cs rename to src/Aevatar.Studio.Hosting/Endpoints/StudioEndpoints.cs index 64eb3fa9b..a3fb78682 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppStudioEndpoints.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/StudioEndpoints.cs @@ -1,3 +1,12 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; +using Aevatar.Studio.Application; +using Aevatar.Studio.Application.Scripts.Contracts; +using Aevatar.Studio.Application.Studio; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Aevatar.Studio.Infrastructure.Storage; using Aevatar.Scripting.Hosting.CapabilityApi; using System.Security.Cryptography; using System.Text; @@ -7,12 +16,14 @@ using Google.Protobuf.WellKnownTypes; using System.Text.Json; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; -internal static class AppStudioEndpoints +internal static class StudioEndpoints { public static void Map(IEndpointRouteBuilder app, bool embeddedWorkflowMode) { + app.MapGet("/api/auth/me", HandleGetAuthMe); app.MapGet("/api/app/context", (HttpContext http, IServiceProvider services) => HandleGetContext(http, services, embeddedWorkflowMode)); app.MapPost("/api/app/workflow-generator", ( @@ -62,7 +73,7 @@ public static void Map(IEndpointRouteBuilder app, bool embeddedWorkflowMode) HandleListAppScriptRuntimesAsync(take, services, ct)); app.MapPost("/api/app/scripts/evolutions/proposals", ( HttpContext http, - Aevatar.Tools.Cli.Hosting.AppScopeScriptEvolutionRequest request, + AppScopeScriptEvolutionRequest request, IServiceProvider services, CancellationToken ct) => HandleProposeScopedScriptEvolutionAsync(http, request, services, ct)); @@ -123,6 +134,24 @@ internal static string NormalizeStudioDocumentId(string? rawValue, string fallba return $"{prefix}-{DateTimeOffset.UtcNow:yyyyMMddHHmmss}"; } + private static IResult HandleGetAuthMe(HttpContext http) + { + var user = http.User; + var isAuthenticated = user?.Identity?.IsAuthenticated == true; + var scopeResolver = http.RequestServices.GetService(); + var scope = scopeResolver?.Resolve(http); + + return Results.Json(new + { + enabled = true, + authenticated = isAuthenticated, + name = user?.Identity?.Name, + email = user?.FindFirst("email")?.Value, + scopeId = scope?.ScopeId, + scopeSource = scope?.Source, + }); + } + private static IResult HandleGetContext(HttpContext http, IServiceProvider services, bool embeddedWorkflowMode) { var publishedWorkflows = !embeddedWorkflowMode || services.GetService() != null; @@ -419,7 +448,7 @@ private static async Task HandleGetScopedScriptCatalogAsync( private static async Task HandleProposeScopedScriptEvolutionAsync( HttpContext http, - Aevatar.Tools.Cli.Hosting.AppScopeScriptEvolutionRequest request, + AppScopeScriptEvolutionRequest request, IServiceProvider services, CancellationToken ct) { diff --git a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateActorService.cs b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateActorService.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateActorService.cs rename to src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateActorService.cs index bf387fd6d..4242a75d5 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateActorService.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateActorService.cs @@ -1,10 +1,15 @@ using System.Text; +using Microsoft.Extensions.Logging; using Aevatar.AI.Core; +using Microsoft.Extensions.Logging; using Aevatar.Configuration; +using Microsoft.Extensions.Logging; using Aevatar.Foundation.Core.Configurations; using Microsoft.Extensions.Hosting; -namespace Aevatar.Tools.Cli.Hosting; +using Microsoft.Extensions.Logging; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed class WorkflowGenerateActorService { diff --git a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateGAgent.cs b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateGAgent.cs similarity index 95% rename from tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateGAgent.cs rename to src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateGAgent.cs index 7f0c780b5..e0846f9c9 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateGAgent.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateGAgent.cs @@ -5,7 +5,8 @@ using Google.Protobuf.WellKnownTypes; using System.Text; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed class WorkflowGenerateGAgent : AIGAgentBase { diff --git a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateOrchestrator.cs b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateOrchestrator.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateOrchestrator.cs rename to src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateOrchestrator.cs index 319d74565..525920da1 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/WorkflowGenerateOrchestrator.cs +++ b/src/Aevatar.Studio.Hosting/Endpoints/WorkflowGenerateOrchestrator.cs @@ -1,10 +1,11 @@ using System.Text; using System.Text.RegularExpressions; -using Aevatar.Tools.Cli.Studio.Application.Contracts; -using Aevatar.Tools.Cli.Studio.Application.Services; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Application.Studio.Contracts; +using Aevatar.Studio.Application.Studio.Services; +using Aevatar.Studio.Domain.Studio.Models; -namespace Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Application.Scripts.Contracts; +namespace Aevatar.Studio.Hosting.Endpoints; internal sealed record WorkflowGenerateRequest( string Prompt, diff --git a/src/Aevatar.Studio.Hosting/StudioCapabilityExtensions.cs b/src/Aevatar.Studio.Hosting/StudioCapabilityExtensions.cs new file mode 100644 index 000000000..baa1f6265 --- /dev/null +++ b/src/Aevatar.Studio.Hosting/StudioCapabilityExtensions.cs @@ -0,0 +1,76 @@ +using Aevatar.GAgentService.Abstractions.Ports; +using Aevatar.Hosting; +using Aevatar.Studio.Application; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Application.Studio.DependencyInjection; +using Aevatar.Studio.Hosting.Controllers; +using Aevatar.Studio.Hosting.Endpoints; +using Aevatar.Studio.Infrastructure.DependencyInjection; +using Aevatar.Studio.Infrastructure.ScopeResolution; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Aevatar.Studio.Hosting; + +public static class StudioCapabilityExtensions +{ + /// + /// Registers the Studio capability: editor, connectors, roles, workspace, settings, executions. + /// All endpoints are mapped under /api/editor, /api/connectors, /api/roles, /api/workspace, + /// /api/settings, /api/executions, /api/app. + /// + public static WebApplicationBuilder AddStudioCapability(this WebApplicationBuilder builder) + { + return builder.AddAevatarCapability( + "studio", + static (services, config) => + { + services.AddControllers() + .AddApplicationPart(typeof(EditorController).Assembly) + .AddJsonOptions(json => + { + json.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; + json.JsonSerializerOptions.DefaultIgnoreCondition = + System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; + }); + services.AddHttpContextAccessor(); + services.AddSingleton(); + services.AddStudioApplication(); + services.AddStudioInfrastructure(config); + + // Scoped services bridging Studio UI to GAgentService ports + services.AddSingleton(sp => new AppScopedWorkflowService( + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetService(), + sp.GetService(), + sp.GetService())); + services.AddSingleton(sp => new AppScopedScriptService( + sp.GetRequiredService(), + sp.GetService(), + sp.GetService(), + sp.GetService(), + sp.GetService(), + sp.GetService(), + sp.GetService(), + sp.GetService(), + sp.GetService())); + + // Generation services + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + }, + static app => + { + app.MapControllers(); + StudioEndpoints.Map(app, embeddedWorkflowMode: true); + }); + } +} diff --git a/src/Aevatar.Studio.Infrastructure/Aevatar.Studio.Infrastructure.csproj b/src/Aevatar.Studio.Infrastructure/Aevatar.Studio.Infrastructure.csproj new file mode 100644 index 000000000..da56f31fe --- /dev/null +++ b/src/Aevatar.Studio.Infrastructure/Aevatar.Studio.Infrastructure.csproj @@ -0,0 +1,19 @@ + + + net10.0 + enable + enable + Aevatar.Studio.Infrastructure + + + + + + + + + + + + + diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs b/src/Aevatar.Studio.Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs similarity index 81% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs rename to src/Aevatar.Studio.Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs index bb41fa573..9ecf57cc8 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Aevatar.Studio.Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs @@ -1,12 +1,12 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Domain.Compatibility; -using Aevatar.Tools.Cli.Studio.Domain.Services; -using Aevatar.Tools.Cli.Studio.Infrastructure.Serialization; -using Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Domain.Studio.Compatibility; +using Aevatar.Studio.Domain.Studio.Services; +using Aevatar.Studio.Infrastructure.Serialization; +using Aevatar.Studio.Infrastructure.Storage; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.DependencyInjection; +namespace Aevatar.Studio.Infrastructure.DependencyInjection; public static class ServiceCollectionExtensions { diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppScopeResolver.cs b/src/Aevatar.Studio.Infrastructure/ScopeResolution/AppScopeResolver.cs similarity index 97% rename from tools/Aevatar.Tools.Cli/Hosting/AppScopeResolver.cs rename to src/Aevatar.Studio.Infrastructure/ScopeResolution/AppScopeResolver.cs index e80aee65a..662251a11 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppScopeResolver.cs +++ b/src/Aevatar.Studio.Infrastructure/ScopeResolution/AppScopeResolver.cs @@ -1,8 +1,9 @@ using System.Security.Claims; +using Aevatar.Studio.Infrastructure.Storage; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; -namespace Aevatar.Tools.Cli.Hosting; +namespace Aevatar.Studio.Infrastructure.ScopeResolution; public sealed record AppScopeContext(string ScopeId, string Source); diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Serialization/YamlWorkflowDocumentService.cs b/src/Aevatar.Studio.Infrastructure/Serialization/YamlWorkflowDocumentService.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Serialization/YamlWorkflowDocumentService.cs rename to src/Aevatar.Studio.Infrastructure/Serialization/YamlWorkflowDocumentService.cs index 7381c687a..fb97d699f 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Serialization/YamlWorkflowDocumentService.cs +++ b/src/Aevatar.Studio.Infrastructure/Serialization/YamlWorkflowDocumentService.cs @@ -1,15 +1,15 @@ using System.Globalization; using System.Text.Json.Nodes; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Domain.Compatibility; -using Aevatar.Tools.Cli.Studio.Domain.Models; -using Aevatar.Tools.Cli.Studio.Domain.Utilities; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Domain.Studio.Compatibility; +using Aevatar.Studio.Domain.Studio.Models; +using Aevatar.Studio.Domain.Studio.Utilities; using YamlDotNet.Core; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.RepresentationModel; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Serialization; +namespace Aevatar.Studio.Infrastructure.Serialization; public sealed class YamlWorkflowDocumentService : IWorkflowYamlDocumentService { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs index 6dfa73691..dbbcfe3f2 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageCatalogBlobClient.cs @@ -5,10 +5,10 @@ using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using Aevatar.Tools.Cli.Hosting; +using Aevatar.Studio.Infrastructure.ScopeResolution; using Microsoft.Extensions.Options; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ChronoStorageCatalogBlobClient { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs index defbc0157..8774d4b68 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageConnectorCatalogStore.cs @@ -1,7 +1,7 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; using Microsoft.Extensions.Options; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ChronoStorageConnectorCatalogStore : IConnectorCatalogStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs index 8f7dd6067..f704fd6c8 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageMasterKeyResolver.cs @@ -2,7 +2,7 @@ using System.Security.Cryptography; using Aevatar.Configuration; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ChronoStorageMasterKeyResolver { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs index 08c14c945..5d930692c 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ChronoStorageRoleCatalogStore.cs @@ -1,7 +1,7 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; using Microsoft.Extensions.Options; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ChronoStorageRoleCatalogStore : IRoleCatalogStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogImportParser.cs b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogImportParser.cs similarity index 74% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogImportParser.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogImportParser.cs index f9fe8faaa..09413ad6f 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogImportParser.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogImportParser.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ConnectorCatalogImportParser : IConnectorCatalogImportParser { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs index 6e61ff792..c45571e77 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogJsonSerializer.cs @@ -1,8 +1,8 @@ using System.Text.Json; using System.Text.Json.Serialization; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal static class ConnectorCatalogJsonSerializer { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogStorageOptions.cs b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogStorageOptions.cs similarity index 93% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogStorageOptions.cs rename to src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogStorageOptions.cs index 8dca00b0b..05648541d 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/ConnectorCatalogStorageOptions.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/ConnectorCatalogStorageOptions.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class ConnectorCatalogStorageOptions { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileAevatarSettingsStore.cs b/src/Aevatar.Studio.Infrastructure/Storage/FileAevatarSettingsStore.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileAevatarSettingsStore.cs rename to src/Aevatar.Studio.Infrastructure/Storage/FileAevatarSettingsStore.cs index f6a56a76f..80e3db9ee 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileAevatarSettingsStore.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/FileAevatarSettingsStore.cs @@ -2,9 +2,9 @@ using System.Security.Cryptography; using System.Text; using System.Text.Json; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; public sealed class FileAevatarSettingsStore : IAevatarSettingsStore { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileStudioWorkspaceStore.cs b/src/Aevatar.Studio.Infrastructure/Storage/FileStudioWorkspaceStore.cs similarity index 99% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileStudioWorkspaceStore.cs rename to src/Aevatar.Studio.Infrastructure/Storage/FileStudioWorkspaceStore.cs index 489b4e7f5..985da4d7e 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/FileStudioWorkspaceStore.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/FileStudioWorkspaceStore.cs @@ -1,11 +1,11 @@ using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Domain.Models; +using Aevatar.Studio.Application.Studio.Abstractions; +using Aevatar.Studio.Domain.Studio.Models; using Microsoft.Extensions.Options; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; public sealed class FileStudioWorkspaceStore : IStudioWorkspaceStore { diff --git a/src/Aevatar.Studio.Infrastructure/Storage/NyxIdAppAuthOptions.cs b/src/Aevatar.Studio.Infrastructure/Storage/NyxIdAppAuthOptions.cs new file mode 100644 index 000000000..7d3376348 --- /dev/null +++ b/src/Aevatar.Studio.Infrastructure/Storage/NyxIdAppAuthOptions.cs @@ -0,0 +1,13 @@ +namespace Aevatar.Studio.Infrastructure.Storage; + +/// +/// Minimal NyxID auth options needed by ChronoStorage client to resolve NyxProxy base URL. +/// +internal sealed class NyxIdAppAuthOptions +{ + public const string SectionName = "Cli:App:NyxId"; + + public bool? Enabled { get; set; } + public string Authority { get; set; } = "https://nyx-api.chrono-ai.fun"; + public bool RequireHttpsMetadata { get; set; } = true; +} diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogImportParser.cs b/src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogImportParser.cs similarity index 72% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogImportParser.cs rename to src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogImportParser.cs index 30f20a91f..7d06ac58f 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogImportParser.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogImportParser.cs @@ -1,6 +1,6 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal sealed class RoleCatalogImportParser : IRoleCatalogImportParser { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogJsonSerializer.cs b/src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogJsonSerializer.cs similarity index 98% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogJsonSerializer.cs rename to src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogJsonSerializer.cs index 62af99e7e..28b1a81d6 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/RoleCatalogJsonSerializer.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/RoleCatalogJsonSerializer.cs @@ -1,8 +1,8 @@ using System.Text.Json; using System.Text.Json.Serialization; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; +using Aevatar.Studio.Application.Studio.Abstractions; -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; internal static class RoleCatalogJsonSerializer { diff --git a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/StudioStorageOptions.cs b/src/Aevatar.Studio.Infrastructure/Storage/StudioStorageOptions.cs similarity index 96% rename from tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/StudioStorageOptions.cs rename to src/Aevatar.Studio.Infrastructure/Storage/StudioStorageOptions.cs index 39425d1d8..adaaa07e0 100644 --- a/tools/Aevatar.Tools.Cli/Studio/Infrastructure/Storage/StudioStorageOptions.cs +++ b/src/Aevatar.Studio.Infrastructure/Storage/StudioStorageOptions.cs @@ -1,4 +1,4 @@ -namespace Aevatar.Tools.Cli.Studio.Infrastructure.Storage; +namespace Aevatar.Studio.Infrastructure.Storage; public sealed class StudioStorageOptions { diff --git a/test/Aevatar.App.Tests/AppHostFixture.cs b/test/Aevatar.App.Tests/AppHostFixture.cs index 0568bb733..23df58ecd 100644 --- a/test/Aevatar.App.Tests/AppHostFixture.cs +++ b/test/Aevatar.App.Tests/AppHostFixture.cs @@ -54,7 +54,6 @@ public async Task InitializeAsync() { Port = port, NoBrowser = true, - ApiBaseUrl = BaseUrl, StartedSignal = startedSignal, }, _shutdownCts.Token)); diff --git a/tools/Aevatar.Tools.Cli/Aevatar.Tools.Cli.csproj b/tools/Aevatar.Tools.Cli/Aevatar.Tools.Cli.csproj index a010fdd37..e0e4cd3b4 100644 --- a/tools/Aevatar.Tools.Cli/Aevatar.Tools.Cli.csproj +++ b/tools/Aevatar.Tools.Cli/Aevatar.Tools.Cli.csproj @@ -7,58 +7,30 @@ true aevatar aevatar - 1.0.3 + 1.0.4 Aevatar - Unified Aevatar CLI with config and app playground commands. - aevatar;cli;workflow;playground;config + Aevatar CLI — config management and app launcher. + aevatar;cli;config README.md true - - - - - - - + - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - PreserveNewest - PreserveNewest - - - - PreserveNewest - PreserveNewest - - diff --git a/tools/Aevatar.Tools.Cli/Bridge/AppBridgeEndpoints.cs b/tools/Aevatar.Tools.Cli/Bridge/AppBridgeEndpoints.cs deleted file mode 100644 index 79e120567..000000000 --- a/tools/Aevatar.Tools.Cli/Bridge/AppBridgeEndpoints.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System.Net; -using System.Net.Http.Headers; -using Aevatar.Tools.Cli.Hosting; - -namespace Aevatar.Tools.Cli.Bridge; - -internal sealed class AppBridgeRouteOptions -{ - public bool MapCapabilityRoutes { get; init; } -} - -internal static class AppBridgeEndpoints -{ - private const string BackendClientName = "AppBridgeBackend"; - - public static void Map(IEndpointRouteBuilder app, AppBridgeRouteOptions? options = null) - { - options ??= new AppBridgeRouteOptions(); - if (!options.MapCapabilityRoutes) - return; - - app.MapPost("/api/chat", HandleBackendProxyAsync); - app.MapPost("/api/workflows/resume", HandleBackendProxyAsync); - app.MapPost("/api/workflows/signal", HandleBackendProxyAsync); - app.MapGet("/api/scopes/{scopeId}/workflows", HandleBackendProxyAsync); - app.MapGet("/api/scopes/{scopeId}/workflows/{workflowId}", HandleBackendProxyAsync); - app.MapPut("/api/scopes/{scopeId}/workflows/{workflowId}", HandleBackendProxyAsync); - app.MapPost("/api/scopes/{scopeId}/workflows/{workflowId}/runs:stream", HandleBackendProxyAsync); - app.MapPost("/api/scopes/{scopeId}/workflow-runs:stream", HandleBackendProxyAsync); - app.MapGet("/api/scopes/{scopeId}/scripts", HandleBackendProxyAsync); - app.MapGet("/api/scopes/{scopeId}/scripts/{scriptId}", HandleBackendProxyAsync); - app.MapPut("/api/scopes/{scopeId}/scripts/{scriptId}", HandleBackendProxyAsync); - app.MapPost("/api/scopes/{scopeId}/scripts/{scriptId}/evolutions/proposals", HandleBackendProxyAsync); - } - - private static async Task HandleBackendProxyAsync( - HttpContext context, - IHttpClientFactory httpClientFactory, - CancellationToken cancellationToken) - { - var client = httpClientFactory.CreateClient(BackendClientName); - using var request = CreateProxyRequest(context, client.BaseAddress); - - try - { - using var response = await client.SendAsync( - request, - HttpCompletionOption.ResponseHeadersRead, - cancellationToken); - - if (TryCreateProxyErrorResult(response, out var errorResult)) - { - await errorResult.ExecuteAsync(context); - return; - } - - context.Response.StatusCode = (int)response.StatusCode; - CopyResponseHeaders(response, context.Response); - - if (response.Content != null) - { - await using var stream = await response.Content.ReadAsStreamAsync(cancellationToken); - await stream.CopyToAsync(context.Response.Body, cancellationToken); - } - } - catch (OperationCanceledException) - { - } - catch (HttpRequestException ex) - { - context.Response.StatusCode = StatusCodes.Status502BadGateway; - await context.Response.WriteAsJsonAsync(new - { - code = "BACKEND_UNAVAILABLE", - message = ex.Message, - }, cancellationToken); - } - } - - internal static bool TryCreateProxyErrorResult( - HttpResponseMessage response, - out IResult result) - { - ArgumentNullException.ThrowIfNull(response); - - var redirectUrl = ResolveRedirectUrl(response); - if (redirectUrl != null && - response.StatusCode is HttpStatusCode.Moved or - HttpStatusCode.Redirect or - HttpStatusCode.RedirectMethod or - HttpStatusCode.TemporaryRedirect or - HttpStatusCode.PermanentRedirect) - { - result = AppApiErrors.ToResult( - StatusCodes.Status401Unauthorized, - AppApiErrors.BackendAuthRequiredCode, - "Backend authentication required.", - redirectUrl); - return true; - } - - var mediaType = response.Content?.Headers.ContentType?.MediaType; - if (IsHtmlContentType(mediaType)) - { - result = AppApiErrors.ToResult( - StatusCodes.Status502BadGateway, - AppApiErrors.BackendInvalidResponseCode, - "Backend returned HTML for an API request.", - loginUrl: null); - return true; - } - - result = Results.Empty; - return false; - } - - private static HttpRequestMessage CreateProxyRequest(HttpContext context, Uri? baseAddress) - { - ArgumentNullException.ThrowIfNull(baseAddress); - - var target = new Uri(baseAddress, $"{context.Request.Path}{context.Request.QueryString}"); - - var request = new HttpRequestMessage(new HttpMethod(context.Request.Method), target); - if (ShouldAttachBody(context.Request.Method)) - request.Content = new StreamContent(context.Request.Body); - - foreach (var header in context.Request.Headers) - { - if (ShouldSkipRequestHeader(header.Key)) - continue; - - if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) && - request.Content != null) - { - request.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); - } - } - - if (request.Content != null && - !string.IsNullOrWhiteSpace(context.Request.ContentType) && - request.Content.Headers.ContentType == null) - { - request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(context.Request.ContentType); - } - - return request; - } - - private static void CopyResponseHeaders(HttpResponseMessage response, HttpResponse target) - { - foreach (var header in response.Headers) - { - if (ShouldSkipResponseHeader(header.Key)) - continue; - - target.Headers[header.Key] = header.Value.ToArray(); - } - - if (response.Content == null) - return; - - foreach (var header in response.Content.Headers) - { - if (ShouldSkipResponseHeader(header.Key)) - continue; - - target.Headers[header.Key] = header.Value.ToArray(); - } - } - - private static string? ResolveRedirectUrl(HttpResponseMessage response) - { - var location = response.Headers.Location; - if (location == null) - return null; - - if (location.IsAbsoluteUri) - return location.ToString(); - - var requestUri = response.RequestMessage?.RequestUri; - return requestUri == null - ? location.ToString() - : new Uri(requestUri, location).ToString(); - } - - private static bool IsHtmlContentType(string? mediaType) => - !string.IsNullOrWhiteSpace(mediaType) && - (mediaType.Contains("text/html", StringComparison.OrdinalIgnoreCase) || - mediaType.Contains("application/xhtml+xml", StringComparison.OrdinalIgnoreCase)); - - private static bool ShouldAttachBody(string method) => - HttpMethods.IsPost(method) || - HttpMethods.IsPut(method) || - HttpMethods.IsPatch(method); - - private static bool ShouldSkipRequestHeader(string headerName) => - string.Equals(headerName, "Host", StringComparison.OrdinalIgnoreCase) || - string.Equals(headerName, "Connection", StringComparison.OrdinalIgnoreCase) || - string.Equals(headerName, "Transfer-Encoding", StringComparison.OrdinalIgnoreCase) || - string.Equals(headerName, "Content-Length", StringComparison.OrdinalIgnoreCase); - - private static bool ShouldSkipResponseHeader(string headerName) => - string.Equals(headerName, "Transfer-Encoding", StringComparison.OrdinalIgnoreCase); -} diff --git a/tools/Aevatar.Tools.Cli/Commands/App/AppCommand.cs b/tools/Aevatar.Tools.Cli/Commands/App/AppCommand.cs index 8a4009f09..aa626e3ea 100644 --- a/tools/Aevatar.Tools.Cli/Commands/App/AppCommand.cs +++ b/tools/Aevatar.Tools.Cli/Commands/App/AppCommand.cs @@ -7,55 +7,23 @@ internal static class AppCommand { public static Command Create() { - var command = new Command("app", "Launch embedded workflow studio app."); - var portOption = CreatePortOption(); - var noBrowserOption = CreateNoBrowserOption(); - var apiBaseOption = CreateApiBaseOption(); - - command.AddOption(portOption); + var command = new Command("app", "Open the aevatar app UI (requires a running Mainnet host)."); + var urlOption = new Option( + "--url", + "Mainnet API base URL. Reads from ~/.aevatar/config.json if not specified."); + var noBrowserOption = new Option( + "--no-browser", + "Do not auto-open browser."); + + command.AddOption(urlOption); command.AddOption(noBrowserOption); - command.AddOption(apiBaseOption); - command.AddCommand(CreateRestartCommand()); command.SetHandler( - (int port, bool noBrowser, string? apiBase) => - AppCommandHandler.RunAsync(port, noBrowser, apiBase, CancellationToken.None), - portOption, - noBrowserOption, - apiBaseOption); + (string? url, bool noBrowser) => + AppCommandHandler.RunAsync(url, noBrowser, CancellationToken.None), + urlOption, + noBrowserOption); return command; } - - private static Command CreateRestartCommand() - { - var command = new Command("restart", "Force restart app by killing process on the target port."); - var portOption = CreatePortOption(); - var noBrowserOption = CreateNoBrowserOption(); - var apiBaseOption = CreateApiBaseOption(); - - command.AddOption(portOption); - command.AddOption(noBrowserOption); - command.AddOption(apiBaseOption); - - command.SetHandler( - (int port, bool noBrowser, string? apiBase) => - AppCommandHandler.RestartAsync(port, noBrowser, apiBase, CancellationToken.None), - portOption, - noBrowserOption, - apiBaseOption); - - return command; - } - - private static Option CreatePortOption() => - new("--port", () => 6688, "Port for playground app."); - - private static Option CreateNoBrowserOption() => - new("--no-browser", "Do not auto-open browser."); - - private static Option CreateApiBaseOption() => - new( - "--api-base", - "Workflow API base URL (defaults: --api-base > chat config url > embedded host URL)."); } diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppCommandHandler.cs b/tools/Aevatar.Tools.Cli/Hosting/AppCommandHandler.cs index 567fe4d56..1f2e13975 100644 --- a/tools/Aevatar.Tools.Cli/Hosting/AppCommandHandler.cs +++ b/tools/Aevatar.Tools.Cli/Hosting/AppCommandHandler.cs @@ -1,273 +1,83 @@ -using System.Diagnostics; using System.Text.Json; namespace Aevatar.Tools.Cli.Hosting; internal static class AppCommandHandler { - private static readonly TimeSpan HealthProbeTimeout = TimeSpan.FromSeconds(2); - private static readonly TimeSpan PortReleaseTimeout = TimeSpan.FromSeconds(8); - private static readonly TimeSpan PortReleasePollInterval = TimeSpan.FromMilliseconds(200); + private static readonly TimeSpan HealthProbeTimeout = TimeSpan.FromSeconds(3); - public static async Task RunAsync(int port, bool noBrowser, string? apiBase, CancellationToken cancellationToken) + public static async Task RunAsync(string? url, bool noBrowser, CancellationToken cancellationToken) { - var normalizedPort = port > 0 ? port : 6688; - var localBaseUrl = $"http://localhost:{normalizedPort}"; + var baseUrl = ResolveBaseUrl(url); - var health = await ProbeAppHealthAsync(localBaseUrl, cancellationToken); - if (health == AppHealthStatus.HealthyAevatar) - { - Console.WriteLine($"aevatar app is already running on port {normalizedPort}."); - OpenAppUi(localBaseUrl, noBrowser); - return; - } + Console.WriteLine($"Checking Mainnet host at {baseUrl} ..."); + var healthy = await ProbeMainnetAsync(baseUrl, cancellationToken); - if (health == AppHealthStatus.ReachableButNotAevatar) + if (!healthy) { - Console.Error.WriteLine( - $"Port {normalizedPort} is occupied by a non-aevatar service. " + - $"Use `aevatar app restart --port {normalizedPort}` to force restart."); + Console.Error.WriteLine(); + Console.Error.WriteLine($" Mainnet host is not reachable at {baseUrl}"); + Console.Error.WriteLine(); + Console.Error.WriteLine(" Start it first:"); + Console.Error.WriteLine(" dotnet run --project src/Aevatar.Mainnet.Host.Api"); + Console.Error.WriteLine(); + Console.Error.WriteLine(" Or specify a different URL:"); + Console.Error.WriteLine(" aevatar app --url https://api.aevatar.ai"); return; } - string apiBaseUrl; - try - { - apiBaseUrl = CliAppConfigStore.ResolveApiBaseUrl(apiBase, localBaseUrl, out var warning); - if (!string.IsNullOrWhiteSpace(warning)) - Console.WriteLine($"[warn] {warning}"); - } - catch (ArgumentException ex) - { - Console.Error.WriteLine(ex.Message); - return; - } + Console.WriteLine($"Mainnet host is running at {baseUrl}"); - await StartHostAsync(normalizedPort, noBrowser, apiBaseUrl, localBaseUrl, cancellationToken); - } - - public static async Task RestartAsync(int port, bool noBrowser, string? apiBase, CancellationToken cancellationToken) - { - var normalizedPort = port > 0 ? port : 6688; - var localBaseUrl = $"http://localhost:{normalizedPort}"; - - string apiBaseUrl; - try - { - apiBaseUrl = CliAppConfigStore.ResolveApiBaseUrl(apiBase, localBaseUrl, out var warning); - if (!string.IsNullOrWhiteSpace(warning)) - Console.WriteLine($"[warn] {warning}"); - } - catch (ArgumentException ex) + if (noBrowser) { - Console.Error.WriteLine(ex.Message); + Console.WriteLine($"API URL: {baseUrl}"); return; } - var pids = ListListeningPids(normalizedPort); - if (pids.Count == 0) - { - Console.WriteLine($"No listening process found on port {normalizedPort}. Starting fresh app..."); - } - else - { - Console.WriteLine($"Force restarting app on port {normalizedPort}. PID(s): {string.Join(", ", pids)}"); - foreach (var pid in pids) - KillProcess(pid); - - var released = await WaitForPortReleaseAsync(normalizedPort, cancellationToken); - if (!released) - { - Console.Error.WriteLine( - $"Failed to release port {normalizedPort}. " + - "Please terminate the process manually and retry."); - return; - } - } - - await StartHostAsync(normalizedPort, noBrowser, apiBaseUrl, localBaseUrl, cancellationToken); + BrowserLauncher.Open(baseUrl); + Console.WriteLine($"Opened browser: {baseUrl}"); } - private static async Task StartHostAsync( - int port, - bool noBrowser, - string apiBaseUrl, - string localBaseUrl, - CancellationToken cancellationToken) + private static string ResolveBaseUrl(string? cliOverride) { - try - { - await AppToolHost.RunAsync(new AppToolHostOptions - { - Port = port, - NoBrowser = noBrowser, - ApiBaseUrl = apiBaseUrl, - }, cancellationToken); - } - catch (Exception ex) when (IsAddressInUseFailure(ex)) - { - var health = await ProbeAppHealthAsync(localBaseUrl, cancellationToken); - if (health == AppHealthStatus.HealthyAevatar) - { - Console.WriteLine($"aevatar app is already running on port {port}."); - OpenAppUi(localBaseUrl, noBrowser); - return; - } + if (!string.IsNullOrWhiteSpace(cliOverride)) + return cliOverride.Trim().TrimEnd('/'); - Console.Error.WriteLine( - $"Port {port} is already in use and is not a healthy aevatar app endpoint."); - } + var configured = CliAppConfigStore.GetApiBaseUrl(out _); + return configured?.TrimEnd('/') ?? "http://localhost:6688"; } - private static void OpenAppUi(string localBaseUrl, bool noBrowser) - { - if (noBrowser) - { - Console.WriteLine($"aevatar app URL: {localBaseUrl}"); - return; - } - - BrowserLauncher.Open(localBaseUrl); - Console.WriteLine($"Opened aevatar app UI: {localBaseUrl}"); - } - - private static async Task ProbeAppHealthAsync( - string localBaseUrl, + private static async Task ProbeMainnetAsync( + string baseUrl, CancellationToken cancellationToken) { try { using var http = new HttpClient { Timeout = HealthProbeTimeout }; - using var response = await http.GetAsync( - $"{localBaseUrl.TrimEnd('/')}/api/app/health", - cancellationToken); - var payload = await response.Content.ReadAsStringAsync(cancellationToken); + using var response = await http.GetAsync(baseUrl, cancellationToken); if (!response.IsSuccessStatusCode) - return AppHealthStatus.ReachableButNotAevatar; + return false; + var payload = await response.Content.ReadAsStringAsync(cancellationToken); if (string.IsNullOrWhiteSpace(payload)) - return AppHealthStatus.ReachableButNotAevatar; + return false; using var doc = JsonDocument.Parse(payload); var root = doc.RootElement; - var ok = root.TryGetProperty("ok", out var okProp) && okProp.ValueKind == JsonValueKind.True; - var service = root.TryGetProperty("service", out var serviceProp) - ? serviceProp.GetString() - : null; - if (ok && string.Equals(service, "aevatar.app", StringComparison.Ordinal)) - return AppHealthStatus.HealthyAevatar; - - return AppHealthStatus.ReachableButNotAevatar; + return root.TryGetProperty("status", out var statusProp) && + string.Equals(statusProp.GetString(), "running", StringComparison.Ordinal); } catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) { - return AppHealthStatus.Unreachable; + return false; } catch (HttpRequestException) { - return AppHealthStatus.Unreachable; - } - } - - private static IReadOnlyList ListListeningPids(int port) - { - try - { - var startInfo = new ProcessStartInfo("lsof") - { - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true, - }; - startInfo.ArgumentList.Add($"-tiTCP:{port}"); - startInfo.ArgumentList.Add("-sTCP:LISTEN"); - - using var process = Process.Start(startInfo); - if (process == null) - return []; - - var output = process.StandardOutput.ReadToEnd(); - _ = process.StandardError.ReadToEnd(); - process.WaitForExit(2000); - - return output - .Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) - .Select(line => int.TryParse(line, out var pid) ? pid : -1) - .Where(pid => pid > 0) - .Distinct() - .OrderBy(pid => pid) - .ToArray(); - } - catch - { - return []; - } - } - - private static void KillProcess(int pid) - { - try - { - using var process = Process.GetProcessById(pid); - if (process.HasExited) - return; - - Console.WriteLine($"Stopping process pid={pid}..."); - process.Kill(entireProcessTree: true); - } - catch (PlatformNotSupportedException) - { - try - { - using var process = Process.GetProcessById(pid); - if (process.HasExited) - return; - process.Kill(); - } - catch - { - } - } - catch - { + return false; } - } - - private static async Task WaitForPortReleaseAsync(int port, CancellationToken cancellationToken) - { - var startedAt = DateTime.UtcNow; - while (DateTime.UtcNow - startedAt < PortReleaseTimeout) + catch (JsonException) { - if (ListListeningPids(port).Count == 0) - return true; - - await Task.Delay(PortReleasePollInterval, cancellationToken); + return false; } - - return ListListeningPids(port).Count == 0; - } - - private static bool IsAddressInUseFailure(Exception ex) - { - for (Exception? current = ex; current != null; current = current.InnerException) - { - var message = current.Message; - if (message.Contains("address already in use", StringComparison.OrdinalIgnoreCase) || - message.Contains("eaddrinuse", StringComparison.OrdinalIgnoreCase) || - message.Contains("only one usage of each socket address", StringComparison.OrdinalIgnoreCase)) - { - return true; - } - } - - return false; - } - - private enum AppHealthStatus - { - HealthyAevatar = 0, - ReachableButNotAevatar = 1, - Unreachable = 2, } } diff --git a/tools/Aevatar.Tools.Cli/Hosting/AppToolHost.cs b/tools/Aevatar.Tools.Cli/Hosting/AppToolHost.cs deleted file mode 100644 index 781abecad..000000000 --- a/tools/Aevatar.Tools.Cli/Hosting/AppToolHost.cs +++ /dev/null @@ -1,346 +0,0 @@ -using Aevatar.Bootstrap.Hosting; -using Aevatar.Bootstrap; -using Aevatar.Bootstrap.Connectors; -using Aevatar.Bootstrap.Extensions.AI; -using Aevatar.Configuration; -using Aevatar.Foundation.Abstractions.Connectors; -using Aevatar.GAgentService.Abstractions.Ports; -using Aevatar.GAgentService.Hosting.Endpoints; -using Aevatar.Tools.Cli.Bridge; -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Aevatar.Tools.Cli.Studio.Application.DependencyInjection; -using Aevatar.Tools.Cli.Studio.Host.Controllers; -using Aevatar.Tools.Cli.Studio.Infrastructure.DependencyInjection; -using Aevatar.Tools.Cli.Studio.Infrastructure.Storage; -using Aevatar.Workflow.Extensions.Bridge; -using Aevatar.Workflow.Extensions.Hosting; -using Aevatar.Workflow.Infrastructure.Workflows; -using Microsoft.AspNetCore.Http.Json; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Aevatar.Tools.Cli.Hosting; - -internal sealed class AppToolHostOptions -{ - public int Port { get; init; } = 6688; - public bool NoBrowser { get; init; } - public string? ApiBaseUrl { get; init; } - public TaskCompletionSource? StartedSignal { get; init; } -} - -internal static class AppToolHost -{ - public static async Task RunAsync(AppToolHostOptions options, CancellationToken cancellationToken) - { - try - { - var port = options.Port <= 0 ? 6688 : options.Port; - var localUrl = $"http://localhost:{port}"; - var sdkBaseUrl = CliAppConfigStore.ResolveApiBaseUrl(options.ApiBaseUrl, localUrl, out var warning); - if (!string.IsNullOrWhiteSpace(warning)) - Console.WriteLine($"[warn] {warning}"); - - var embeddedWorkflowMode = ShouldUseEmbeddedWorkflow(localUrl, sdkBaseUrl); - - var toolDir = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) - ?? Environment.CurrentDirectory; - var webRootCandidates = new[] - { - Path.Combine(Environment.CurrentDirectory, "tools", "Aevatar.Tools.Cli", "wwwroot", "playground"), - Path.Combine(AevatarPaths.RepoRoot, "tools", "Aevatar.Tools.Cli", "wwwroot", "playground"), - Path.Combine(Environment.CurrentDirectory, "demos", "Aevatar.Demos.Workflow.Web", "wwwroot"), - Path.Combine(AevatarPaths.RepoRoot, "demos", "Aevatar.Demos.Workflow.Web", "wwwroot"), - Path.Combine(toolDir, "wwwroot", "playground"), - }; - var webRootPath = webRootCandidates.FirstOrDefault(path => File.Exists(Path.Combine(path, "index.html"))) - ?? webRootCandidates[0]; - - var builder = WebApplication.CreateBuilder(new WebApplicationOptions - { - Args = Array.Empty(), - ContentRootPath = toolDir, - WebRootPath = webRootPath, - }); - - builder.WebHost.UseUrls(localUrl); - builder.Logging.SetMinimumLevel(LogLevel.Warning); - builder.Configuration.AddAevatarConfig(); - var nyxIdAuthEnabled = NyxIdAppAuthentication.ResolveIsEnabled(builder.Configuration, embeddedWorkflowMode); - var nyxIdAuthOptions = NyxIdAppAuthentication.BuildOptions(builder.Configuration); - builder.Services.Configure(json => - { - json.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - json.SerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; - }); - builder.Services - .AddControllers() - .AddApplicationPart(typeof(EditorController).Assembly) - .AddJsonOptions(json => - { - json.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - json.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; - }); - - if (nyxIdAuthEnabled) - { - builder.Services.AddNyxIdAppAuthentication(nyxIdAuthOptions); - builder.Services.AddSingleton(); - } - else - builder.Services.AddHttpContextAccessor(); - - var backendClient = builder.Services - .AddHttpClient("AppBridgeBackend", client => client.BaseAddress = new Uri(sdkBaseUrl)) - .ConfigurePrimaryHttpMessageHandler(static () => new HttpClientHandler - { - AllowAutoRedirect = false, - }); - if (nyxIdAuthEnabled) - { - backendClient.AddHttpMessageHandler(); - } - - var nyxProxyClient = builder.Services.AddHttpClient(ChronoStorageCatalogBlobClient.NyxProxyHttpClientName); - if (nyxIdAuthEnabled) - { - nyxProxyClient.AddHttpMessageHandler(); - } - - builder.Services.AddSingleton(); - builder.Services.AddStudioInfrastructure(builder.Configuration); - builder.Services.AddStudioApplication(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(sp => new AppScopedWorkflowService( - sp.GetRequiredService(), - sp.GetRequiredService(), - sp.GetService(), - sp.GetService(), - sp.GetService())); - builder.Services.AddSingleton(sp => new AppScopedScriptService( - sp.GetRequiredService(), - sp.GetService(), - sp.GetService(), - sp.GetService(), - sp.GetService(), - sp.GetService(), - sp.GetService(), - sp.GetService(), - sp.GetService())); - builder.Services.Configure(storage => - { - storage.DefaultRuntimeBaseUrl = localUrl; - storage.ForceLocalRuntime = embeddedWorkflowMode; - }); - - if (embeddedWorkflowMode) - { - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); - builder.Services.AddSingleton, WorkflowGenerateAgentDefaultsProvider>(); - builder.Services.AddHostedService(); - builder.Services.AddHostedService(); - builder.AddAevatarDefaultHost(options => - { - options.ServiceName = "aevatar.app"; - options.EnableWebSockets = true; - options.EnableConnectorBootstrap = false; - options.MapRootHealthEndpoint = false; - }); - builder.AddAevatarPlatform(options => - { - options.EnableMakerExtensions = true; - options.ConfigureAIFeatures = ai => - { - ai.EnableMEAIToTornadoFailover = true; - ai.EnableReloadableProviderFactory = true; - }; - }); - builder.AddGAgentServiceCapabilityBundle(); - builder.Services.AddWorkflowBridgeExtensions(); - builder.Services.PostConfigure(options => - { - AddWorkflowDirectoryIfMissing(options.WorkflowDirectories, Path.Combine(toolDir, "workflows")); - AddWorkflowDirectoryIfMissing(options.WorkflowDirectories, Path.Combine(AevatarPaths.RepoRoot, "tools", "Aevatar.Tools.Cli", "workflows")); - AddWorkflowDirectoryIfMissing(options.WorkflowDirectories, Path.Combine(Environment.CurrentDirectory, "tools", "Aevatar.Tools.Cli", "workflows")); - }); - } - - var app = builder.Build(); - var loadedConnectors = embeddedWorkflowMode - ? LoadNamedConnectors(app.Services) - : Array.Empty(); - PrintBanner(localUrl, sdkBaseUrl, webRootPath, embeddedWorkflowMode, loadedConnectors); - - app.Lifetime.ApplicationStarted.Register(() => - { - options.StartedSignal?.TrySetResult(true); - if (!options.NoBrowser) - BrowserLauncher.Open(localUrl); - }); - - if (nyxIdAuthEnabled) - app.UseNyxIdAppProtection(); - - app.UseDefaultFiles(); - app.UseStaticFiles(); - app.MapControllers(); - app.MapNyxIdAppEndpoints(nyxIdAuthEnabled); - - if (embeddedWorkflowMode) - app.UseAevatarDefaultHost(); - - app.MapGet( - "/api/app/health", - () => Results.Json(new - { - ok = true, - service = "aevatar.app", - mode = embeddedWorkflowMode ? "embedded" : "proxy", - sdkBaseUrl, - })); - - AppBridgeEndpoints.Map(app, new AppBridgeRouteOptions - { - MapCapabilityRoutes = !embeddedWorkflowMode, - }); - AppStudioEndpoints.Map(app, embeddedWorkflowMode); - - app.MapFallbackToFile("index.html"); - await app.RunAsync(cancellationToken); - } - catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) - { - options.StartedSignal?.TrySetCanceled(cancellationToken); - throw; - } - catch (Exception ex) - { - options.StartedSignal?.TrySetException(ex); - throw; - } - } - - private static bool ShouldUseEmbeddedWorkflow(string localUrl, string sdkBaseUrl) - { - if (!Uri.TryCreate(localUrl, UriKind.Absolute, out var localUri)) - return true; - if (!Uri.TryCreate(sdkBaseUrl, UriKind.Absolute, out var sdkUri)) - return true; - - var compare = Uri.Compare( - localUri, - sdkUri, - UriComponents.SchemeAndServer | UriComponents.Port, - UriFormat.SafeUnescaped, - StringComparison.OrdinalIgnoreCase); - return compare == 0; - } - - private static void PrintBanner( - string localUrl, - string sdkBaseUrl, - string webRootPath, - bool embeddedWorkflowMode, - IReadOnlyList loadedConnectors) - { - var connectorSummary = loadedConnectors.Count == 0 ? "-" : string.Join(", ", loadedConnectors); - if (connectorSummary.Length > 41) - connectorSummary = connectorSummary[..38] + "..."; - - Console.WriteLine(); - Console.WriteLine("╔═══════════════════════════════════════════════════════════╗"); - Console.WriteLine("║ aevatar app ║"); - Console.WriteLine("╠═══════════════════════════════════════════════════════════╣"); - Console.WriteLine($"║ 🌐 Studio: {localUrl,-41} ║"); - Console.WriteLine($"║ 🔌 SDK base: {sdkBaseUrl,-41} ║"); - Console.WriteLine($"║ 🧠 Mode: {(embeddedWorkflowMode ? "embedded" : "proxy"),-41} ║"); - Console.WriteLine($"║ 🔗 Connectors: {connectorSummary,-41} ║"); - Console.WriteLine($"║ 📦 WebRoot: {webRootPath,-41} ║"); - Console.WriteLine("║ Press Ctrl+C to stop ║"); - Console.WriteLine("╚═══════════════════════════════════════════════════════════╝"); - Console.WriteLine(); - } - - private static void AddWorkflowDirectoryIfMissing(ICollection directories, string candidate) - { - if (string.IsNullOrWhiteSpace(candidate)) - return; - - string normalizedCandidate; - try - { - normalizedCandidate = Path.GetFullPath(candidate); - } - catch - { - return; - } - - foreach (var existing in directories) - { - if (string.IsNullOrWhiteSpace(existing)) - continue; - - try - { - if (string.Equals( - Path.GetFullPath(existing), - normalizedCandidate, - StringComparison.OrdinalIgnoreCase)) - { - return; - } - } - catch - { - // Ignore malformed existing paths and continue. - } - } - - directories.Add(candidate); - } - - internal static IReadOnlyList LoadNamedConnectors(IServiceProvider services, string? connectorsJsonPath = null) - { - using var scope = services.CreateScope(); - var scoped = scope.ServiceProvider; - var logger = scoped.GetRequiredService().CreateLogger("Aevatar.App.Connectors"); - var registry = scoped.GetService(); - if (registry == null) - { - logger.LogWarning("IConnectorRegistry is not registered. Skip connector loading."); - return []; - } - - var connectorBuilders = scoped.GetServices().ToList(); - if (connectorBuilders.Count == 0) - { - logger.LogWarning("No IConnectorBuilder registered. Skip connector loading."); - return registry.ListNames(); - } - - var loadedCount = ConnectorRegistration.RegisterConnectors( - registry, - connectorBuilders, - logger, - connectorsJsonPath); - var names = registry.ListNames(); - - if (loadedCount == 0 && names.Count == 0) - { - logger.LogWarning( - "No named connectors were loaded from {ConnectorsPath}.", - connectorsJsonPath ?? AevatarPaths.ConnectorsJson); - } - - return names; - } -} diff --git a/tools/Aevatar.Tools.Cli/Hosting/NyxIdAccessTokenHandler.cs b/tools/Aevatar.Tools.Cli/Hosting/NyxIdAccessTokenHandler.cs deleted file mode 100644 index 74180f2ca..000000000 --- a/tools/Aevatar.Tools.Cli/Hosting/NyxIdAccessTokenHandler.cs +++ /dev/null @@ -1,241 +0,0 @@ -using System.Globalization; -using System.Net.Http.Headers; -using System.Net.Http.Json; -using System.Text.Json.Serialization; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.Cookies; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; - -namespace Aevatar.Tools.Cli.Hosting; - -internal sealed class NyxIdAccessTokenHandler : DelegatingHandler -{ - private readonly IHttpContextAccessor _httpContextAccessor; - private readonly NyxIdInternalRequestCredentials _internalCredentials; - private readonly NyxIdAppTokenService _tokenService; - - public NyxIdAccessTokenHandler( - IHttpContextAccessor httpContextAccessor, - NyxIdInternalRequestCredentials internalCredentials, - NyxIdAppTokenService tokenService) - { - _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); - _internalCredentials = internalCredentials ?? throw new ArgumentNullException(nameof(internalCredentials)); - _tokenService = tokenService ?? throw new ArgumentNullException(nameof(tokenService)); - } - - protected override async Task SendAsync( - HttpRequestMessage request, - CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - - var httpContext = _httpContextAccessor.HttpContext; - if (ShouldAttachInternalAuthHeader(request, httpContext) && - !request.Headers.Contains(NyxIdInternalRequestCredentials.HeaderName)) - { - request.Headers.TryAddWithoutValidation( - NyxIdInternalRequestCredentials.HeaderName, - _internalCredentials.Token); - } - - if (request.Headers.Authorization == null) - { - var accessToken = await _tokenService.GetAccessTokenAsync( - httpContext, - cancellationToken); - if (!string.IsNullOrWhiteSpace(accessToken)) - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); - } - - return await base.SendAsync(request, cancellationToken); - } - - private static bool ShouldAttachInternalAuthHeader(HttpRequestMessage request, HttpContext? httpContext) - { - var requestUri = request.RequestUri; - if (requestUri == null || !requestUri.IsLoopback) - return false; - - var currentPort = httpContext?.Request.Host.Port; - return currentPort.HasValue && currentPort.Value == requestUri.Port; - } -} - -internal sealed class NyxIdAppTokenService -{ - private static readonly TimeSpan RefreshSkew = TimeSpan.FromMinutes(2); - - private readonly IHttpClientFactory _httpClientFactory; - private readonly IOptions _options; - private readonly ILogger _logger; - - public NyxIdAppTokenService( - IHttpClientFactory httpClientFactory, - IOptions options, - ILogger logger) - { - _httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory)); - _options = options ?? throw new ArgumentNullException(nameof(options)); - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public async Task GetAccessTokenAsync(HttpContext? httpContext, CancellationToken cancellationToken) - { - if (httpContext?.User?.Identity?.IsAuthenticated != true) - return null; - - var result = await httpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme); - if (!result.Succeeded || result.Principal == null || result.Properties == null) - return null; - - var accessToken = result.Properties.GetTokenValue("access_token"); - if (string.IsNullOrWhiteSpace(accessToken)) - return null; - - if (!ShouldRefresh(result.Properties)) - return accessToken; - - var refreshToken = result.Properties.GetTokenValue("refresh_token"); - if (string.IsNullOrWhiteSpace(refreshToken)) - return accessToken; - - var refreshed = await RefreshAsync(refreshToken, cancellationToken); - if (refreshed == null) - { - if (IsExpired(result.Properties)) - { - _logger.LogWarning("NyxID access token refresh failed after token expiry; clearing local app session."); - await httpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - return null; - } - - return accessToken; - } - - PersistTokens(result.Properties, refreshed, result.Properties.GetTokenValue("id_token")); - await httpContext.SignInAsync( - CookieAuthenticationDefaults.AuthenticationScheme, - result.Principal, - result.Properties); - - return refreshed.AccessToken; - } - - private async Task RefreshAsync( - string refreshToken, - CancellationToken cancellationToken) - { - try - { - var options = _options.Value; - var tokenEndpoint = string.IsNullOrWhiteSpace(options.TokenEndpoint) - ? $"{options.Authority.TrimEnd('/')}/oauth/token" - : options.TokenEndpoint.Trim(); - using var request = new HttpRequestMessage(HttpMethod.Post, tokenEndpoint) - { - Content = new FormUrlEncodedContent(BuildRefreshForm(refreshToken, options)), - }; - - var httpClient = _httpClientFactory.CreateClient(); - using var response = await httpClient.SendAsync(request, cancellationToken); - if (!response.IsSuccessStatusCode) - { - _logger.LogWarning( - "NyxID refresh token request failed with status code {StatusCode}.", - (int)response.StatusCode); - return null; - } - - var payload = await response.Content.ReadFromJsonAsync(cancellationToken); - if (payload == null || string.IsNullOrWhiteSpace(payload.AccessToken)) - { - _logger.LogWarning("NyxID refresh token response did not contain a usable access token."); - return null; - } - - return payload; - } - catch (Exception ex) when (ex is HttpRequestException or TaskCanceledException or InvalidOperationException) - { - _logger.LogWarning(ex, "NyxID refresh token request failed."); - return null; - } - } - - private static Dictionary BuildRefreshForm(string refreshToken, NyxIdAppAuthOptions options) - { - var form = new Dictionary(StringComparer.Ordinal) - { - ["grant_type"] = "refresh_token", - ["refresh_token"] = refreshToken, - ["client_id"] = options.ClientId, - }; - - if (!string.IsNullOrWhiteSpace(options.ClientSecret)) - form["client_secret"] = options.ClientSecret; - - return form; - } - - private static void PersistTokens( - AuthenticationProperties properties, - NyxIdRefreshTokenResponse refreshed, - string? idToken) - { - var refreshToken = refreshed.RefreshToken; - if (string.IsNullOrWhiteSpace(refreshToken)) - refreshToken = properties.GetTokenValue("refresh_token"); - - var expiresAt = DateTimeOffset.UtcNow - .AddSeconds(refreshed.ExpiresIn <= 0 ? 900 : refreshed.ExpiresIn) - .ToString("o", CultureInfo.InvariantCulture); - - var tokens = new List - { - new() { Name = "access_token", Value = refreshed.AccessToken }, - new() { Name = "refresh_token", Value = refreshToken ?? string.Empty }, - new() { Name = "token_type", Value = refreshed.TokenType ?? "Bearer" }, - new() { Name = "expires_at", Value = expiresAt }, - }; - - if (!string.IsNullOrWhiteSpace(idToken)) - tokens.Add(new AuthenticationToken { Name = "id_token", Value = idToken }); - - properties.StoreTokens(tokens); - } - - private static bool ShouldRefresh(AuthenticationProperties properties) - { - if (!TryGetExpiry(properties, out var expiresAt)) - return false; - - return expiresAt <= DateTimeOffset.UtcNow.Add(RefreshSkew); - } - - private static bool IsExpired(AuthenticationProperties properties) - { - if (!TryGetExpiry(properties, out var expiresAt)) - return false; - - return expiresAt <= DateTimeOffset.UtcNow; - } - - private static bool TryGetExpiry(AuthenticationProperties properties, out DateTimeOffset expiresAt) - { - var raw = properties.GetTokenValue("expires_at"); - return DateTimeOffset.TryParse( - raw, - CultureInfo.InvariantCulture, - DateTimeStyles.RoundtripKind, - out expiresAt); - } - - private sealed record NyxIdRefreshTokenResponse( - [property: JsonPropertyName("access_token")] string AccessToken, - [property: JsonPropertyName("token_type")] string? TokenType, - [property: JsonPropertyName("expires_in")] int ExpiresIn, - [property: JsonPropertyName("refresh_token")] string? RefreshToken); -} diff --git a/tools/Aevatar.Tools.Cli/Hosting/NyxIdAppAuthentication.cs b/tools/Aevatar.Tools.Cli/Hosting/NyxIdAppAuthentication.cs deleted file mode 100644 index 1a9bfa59f..000000000 --- a/tools/Aevatar.Tools.Cli/Hosting/NyxIdAppAuthentication.cs +++ /dev/null @@ -1,497 +0,0 @@ -using System.Security.Cryptography; -using System.Net; -using System.Net.Sockets; -using System.Security.Claims; -using System.Text; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Authentication.Cookies; -using Microsoft.AspNetCore.Authentication.OpenIdConnect; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Microsoft.IdentityModel.Tokens; - -namespace Aevatar.Tools.Cli.Hosting; - -internal sealed class NyxIdAppAuthOptions -{ - public const string SectionName = "Cli:App:NyxId"; - - public bool? Enabled { get; set; } - - public string Authority { get; set; } = "https://nyx-api.chrono-ai.fun"; - - public string ClientId { get; set; } = "37a93189-2734-406e-bca1-7dbdf25c5a53"; - - public string? ClientSecret { get; set; } - - public string Scope { get; set; } = "openid profile email"; - - public string CallbackPath { get; set; } = "/auth/callback"; - - public string? TokenEndpoint { get; set; } - - public string ProviderDisplayName { get; set; } = "Chrono workspace account"; - - public bool RequireHttpsMetadata { get; set; } = true; -} - -internal sealed class NyxIdInternalRequestCredentials -{ - public const string HeaderName = "X-Aevatar-Internal-Auth"; - - public string Token { get; } = Convert.ToHexString(RandomNumberGenerator.GetBytes(32)); -} - -internal static class NyxIdAppAuthentication -{ - private static readonly HashSet IgnoredGenericIdClaimTypes = new(StringComparer.OrdinalIgnoreCase) - { - "client_id", - "session_id", - "sid", - }; - - private static readonly string[] ScopeClaimCandidates = - [ - "scope_id", - "uid", - "sub", - ClaimTypes.NameIdentifier, - ]; - - internal static bool ResolveIsEnabled(IConfiguration configuration, bool embeddedWorkflowMode) - { - ArgumentNullException.ThrowIfNull(configuration); - var options = configuration.GetSection(NyxIdAppAuthOptions.SectionName).Get(); - return options?.Enabled ?? true; - } - - internal static NyxIdAppAuthOptions BuildOptions(IConfiguration configuration) - { - ArgumentNullException.ThrowIfNull(configuration); - return configuration.GetSection(NyxIdAppAuthOptions.SectionName).Get() - ?? new NyxIdAppAuthOptions(); - } - - internal static IServiceCollection AddNyxIdAppAuthentication( - this IServiceCollection services, - NyxIdAppAuthOptions options) - { - ArgumentNullException.ThrowIfNull(services); - ArgumentNullException.ThrowIfNull(options); - - services.AddHttpContextAccessor(); - services.AddSingleton>(Options.Create(options)); - services.AddSingleton(); - services.AddSingleton(); - services.AddTransient(); - - services - .AddAuthentication(authentication => - { - authentication.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; - authentication.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; - }) - .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, cookie => - { - cookie.Cookie.Name = "aevatar.cli.auth"; - cookie.SlidingExpiration = true; - cookie.ExpireTimeSpan = TimeSpan.FromDays(30); - }) - .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, oidc => - { - oidc.Authority = options.Authority.TrimEnd('/'); - oidc.ClientId = options.ClientId; - if (!string.IsNullOrWhiteSpace(options.ClientSecret)) - oidc.ClientSecret = options.ClientSecret; - - oidc.CallbackPath = options.CallbackPath; - oidc.ResponseType = "code"; - oidc.ResponseMode = "query"; - oidc.UsePkce = true; - oidc.RequireHttpsMetadata = options.RequireHttpsMetadata; - oidc.SaveTokens = true; - oidc.GetClaimsFromUserInfoEndpoint = true; - oidc.MapInboundClaims = false; - oidc.NonceCookie.SameSite = SameSiteMode.Lax; - oidc.NonceCookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; - oidc.CorrelationCookie.SameSite = SameSiteMode.Lax; - oidc.CorrelationCookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; - oidc.TokenValidationParameters = new TokenValidationParameters - { - NameClaimType = "name", - RoleClaimType = "roles", - }; - - oidc.Scope.Clear(); - foreach (var scope in ParseScopes(options.Scope)) - oidc.Scope.Add(scope); - - oidc.ClaimActions.MapUniqueJsonKey("sub", "sub"); - oidc.ClaimActions.MapUniqueJsonKey("scope_id", "scope_id"); - oidc.ClaimActions.MapUniqueJsonKey("uid", "uid"); - oidc.ClaimActions.MapUniqueJsonKey("name", "name"); - oidc.ClaimActions.MapUniqueJsonKey("email", "email"); - oidc.ClaimActions.MapUniqueJsonKey("picture", "picture"); - oidc.ClaimActions.MapUniqueJsonKey("roles", "roles"); - oidc.ClaimActions.MapUniqueJsonKey("groups", "groups"); - - oidc.Events = new OpenIdConnectEvents - { - OnTicketReceived = context => - { - EnsureScopeClaim(context.Principal); - return Task.CompletedTask; - }, - OnRemoteFailure = context => - { - var message = Uri.EscapeDataString( - context.Failure?.Message ?? "NyxID authentication failed."); - context.HandleResponse(); - context.Response.Redirect($"/auth/error?message={message}"); - return Task.CompletedTask; - }, - }; - }); - - services.AddAuthorization(); - return services; - } - - internal static void UseNyxIdAppProtection(this WebApplication app) - { - ArgumentNullException.ThrowIfNull(app); - - var internalCredentials = app.Services.GetRequiredService(); - - app.UseAuthentication(); - app.UseAuthorization(); - app.Use(async (context, next) => - { - if (!IsProtectedApiPath(context.Request.Path)) - { - await next(); - return; - } - - if (context.User.Identity?.IsAuthenticated == true) - { - await next(); - return; - } - - if (IsTrustedInternalRequest(context, internalCredentials)) - { - await next(); - return; - } - - context.Response.StatusCode = StatusCodes.Status401Unauthorized; - await context.Response.WriteAsJsonAsync(new - { - code = "AUTH_REQUIRED", - message = "Sign in to use the app APIs.", - loginUrl = BuildLoginUrl("/"), - }); - }); - } - - internal static void MapNyxIdAppEndpoints(this IEndpointRouteBuilder app, bool authEnabled) - { - ArgumentNullException.ThrowIfNull(app); - - app.MapGet("/api/auth/me", async (HttpContext context) => - { - var authOptions = context.RequestServices.GetService>()?.Value; - var tokenService = context.RequestServices.GetService(); - var scopeContext = context.RequestServices.GetService()?.Resolve(context); - if (!authEnabled) - { - return Results.Json(new - { - enabled = false, - authenticated = false, - providerDisplayName = authOptions?.ProviderDisplayName, - scopeId = scopeContext?.ScopeId, - scopeSource = scopeContext?.Source, - }); - } - - var isAuthenticated = context.User.Identity?.IsAuthenticated == true; - var accessToken = isAuthenticated && tokenService != null - ? await tokenService.GetAccessTokenAsync(context, context.RequestAborted) - : null; - if (!isAuthenticated || string.IsNullOrWhiteSpace(accessToken)) - { - if (isAuthenticated) - await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - - return Results.Json(new - { - enabled = true, - authenticated = false, - providerDisplayName = authOptions?.ProviderDisplayName, - loginUrl = BuildLoginUrl("/"), - errorMessage = isAuthenticated - ? "Authentication session is incomplete. Sign in again." - : "Sign in to continue.", - scopeId = scopeContext?.ScopeId, - scopeSource = scopeContext?.Source, - }); - } - - return Results.Json(new - { - enabled = true, - authenticated = true, - sub = context.User.FindFirst("sub")?.Value, - name = context.User.FindFirst("name")?.Value ?? context.User.Identity?.Name, - email = context.User.FindFirst("email")?.Value, - picture = context.User.FindFirst("picture")?.Value, - providerDisplayName = authOptions?.ProviderDisplayName, - scopeId = scopeContext?.ScopeId, - scopeSource = scopeContext?.Source, - expiresAt = await context.GetTokenAsync("expires_at"), - logoutUrl = "/auth/logout", - }); - }); - - app.MapGet("/auth/login", async (HttpContext context, string? returnUrl) => - { - if (!authEnabled) - return Results.Redirect("/"); - - var redirectUri = string.IsNullOrWhiteSpace(returnUrl) ? "/" : returnUrl.Trim(); - var authOptions = context.RequestServices.GetService>()?.Value; - - try - { - await context.ChallengeAsync( - OpenIdConnectDefaults.AuthenticationScheme, - new AuthenticationProperties { RedirectUri = redirectUri }); - return Results.Empty; - } - catch (Exception ex) when (TryBuildNyxIdLoginFailureMessage(ex, authOptions, out var message)) - { - return Results.Content( - RenderHtmlPage( - "NyxID unavailable", - WebUtility.HtmlEncode(message), - "Try again", - BuildLoginUrl(redirectUri)), - "text/html; charset=utf-8"); - } - catch - { - return Results.Content( - RenderHtmlPage( - "Authentication unavailable", - "Aevatar app could not start NyxID sign-in. Check the NyxID authority configuration and try again.", - "Try again", - BuildLoginUrl(redirectUri)), - "text/html; charset=utf-8"); - } - }); - - app.MapGet("/auth/logout", async (HttpContext context) => - { - if (authEnabled) - await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); - - return Results.Redirect("/auth/signed-out"); - }); - - app.MapGet("/auth/signed-out", () => Results.Content( - RenderHtmlPage( - "Signed out", - "Local app session has been cleared.", - "Sign in again", - BuildLoginUrl("/")), - "text/html; charset=utf-8")); - - app.MapGet("/auth/error", (string? message) => Results.Content( - RenderHtmlPage( - "Authentication failed", - WebUtility.HtmlEncode(string.IsNullOrWhiteSpace(message) - ? "NyxID login did not complete." - : message.Trim()), - "Try again", - BuildLoginUrl("/")), - "text/html; charset=utf-8")); - } - - private static bool IsProtectedApiPath(PathString path) => - path.StartsWithSegments("/api", StringComparison.OrdinalIgnoreCase) && - !IsAnonymousApiPath(path); - - private static bool IsAnonymousApiPath(PathString path) => - path.Equals("/api/app/health", StringComparison.OrdinalIgnoreCase) || - path.Equals("/api/auth/me", StringComparison.OrdinalIgnoreCase); - - private static bool IsTrustedInternalRequest(HttpContext context, NyxIdInternalRequestCredentials credentials) - { - if (!context.Request.Headers.TryGetValue(NyxIdInternalRequestCredentials.HeaderName, out var provided)) - return false; - - var token = provided.ToString().Trim(); - if (string.IsNullOrWhiteSpace(token) || string.IsNullOrWhiteSpace(credentials.Token)) - return false; - - var providedBytes = Encoding.UTF8.GetBytes(token); - var expectedBytes = Encoding.UTF8.GetBytes(credentials.Token); - return providedBytes.Length == expectedBytes.Length && - CryptographicOperations.FixedTimeEquals(providedBytes, expectedBytes); - } - - private static IEnumerable ParseScopes(string rawScope) - { - var scopes = (rawScope ?? string.Empty) - .Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); - return scopes.Length == 0 ? ["openid", "profile", "email"] : scopes; - } - - private static string BuildLoginUrl(string? returnUrl) - { - var redirectUri = string.IsNullOrWhiteSpace(returnUrl) ? "/" : returnUrl.Trim(); - return $"/auth/login?returnUrl={Uri.EscapeDataString(redirectUri)}"; - } - - internal static bool TryBuildNyxIdLoginFailureMessage( - Exception exception, - NyxIdAppAuthOptions? options, - out string message) - { - ArgumentNullException.ThrowIfNull(exception); - - var authority = string.IsNullOrWhiteSpace(options?.Authority) - ? "the configured NyxID authority" - : options!.Authority.Trim(); - var authorityHost = TryGetHost(authority); - - if (FindException(exception) != null || - FindException(exception) != null) - { - message = - $"Aevatar app could not reach NyxID at {authority}. " + - $"Check the authority URL, DNS, VPN or proxy settings, and whether {authorityHost ?? authority} is reachable."; - return true; - } - - if (ExceptionChainContains(exception, "IDX20803") || - ExceptionChainContains(exception, "IDX20804") || - ExceptionChainContains(exception, ".well-known/openid-configuration")) - { - message = - $"Aevatar app could not load NyxID OpenID configuration from {authority}. " + - $"Check the authority URL and network connectivity, then try again."; - return true; - } - - message = string.Empty; - return false; - } - - private static void EnsureScopeClaim(ClaimsPrincipal? principal) - { - if (principal?.Identity is not ClaimsIdentity identity) - return; - - if (identity.FindFirst("scope_id") != null) - return; - - foreach (var claimType in ScopeClaimCandidates) - { - var claimValue = identity.FindFirst(claimType)?.Value?.Trim(); - if (string.IsNullOrWhiteSpace(claimValue)) - continue; - - identity.AddClaim(new Claim("scope_id", claimValue)); - return; - } - - var genericIdClaim = identity.Claims.FirstOrDefault(claim => - claim.Type.EndsWith("_id", StringComparison.OrdinalIgnoreCase) && - !IgnoredGenericIdClaimTypes.Contains(claim.Type) && - !string.IsNullOrWhiteSpace(claim.Value)); - if (genericIdClaim == null) - return; - - identity.AddClaim(new Claim("scope_id", genericIdClaim.Value.Trim())); - } - - private static bool ExceptionChainContains(Exception exception, string value) - { - foreach (var current in EnumerateExceptionChain(exception)) - { - if (current.Message.Contains(value, StringComparison.OrdinalIgnoreCase)) - return true; - } - - return false; - } - - private static TException? FindException(Exception exception) - where TException : Exception - { - foreach (var current in EnumerateExceptionChain(exception)) - { - if (current is TException typed) - return typed; - } - - return null; - } - - private static IEnumerable EnumerateExceptionChain(Exception exception) - { - for (var current = exception; current != null; current = current.InnerException!) - yield return current; - } - - private static string? TryGetHost(string authority) - { - if (!Uri.TryCreate(authority, UriKind.Absolute, out var uri)) - return null; - - return uri.Host; - } - - private static string RenderHtmlPage( - string title, - string message, - string actionLabel, - string actionUrl) => - $$""" - - - - - - {{WebUtility.HtmlEncode(title)}} · Aevatar - - - -
-
-
NyxID
-

{{WebUtility.HtmlEncode(title)}}

-

{{message}}

- {{WebUtility.HtmlEncode(actionLabel)}} -
-
- - - """; -} diff --git a/tools/Aevatar.Tools.Cli/Hosting/NyxIdStudioBackendRequestAuthSnapshotProvider.cs b/tools/Aevatar.Tools.Cli/Hosting/NyxIdStudioBackendRequestAuthSnapshotProvider.cs deleted file mode 100644 index d3fb0e209..000000000 --- a/tools/Aevatar.Tools.Cli/Hosting/NyxIdStudioBackendRequestAuthSnapshotProvider.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Aevatar.Tools.Cli.Studio.Application.Abstractions; -using Microsoft.AspNetCore.Http; - -namespace Aevatar.Tools.Cli.Hosting; - -internal sealed class NyxIdStudioBackendRequestAuthSnapshotProvider : IStudioBackendRequestAuthSnapshotProvider -{ - private readonly IHttpContextAccessor _httpContextAccessor; - private readonly NyxIdInternalRequestCredentials _internalCredentials; - private readonly NyxIdAppTokenService _tokenService; - - public NyxIdStudioBackendRequestAuthSnapshotProvider( - IHttpContextAccessor httpContextAccessor, - NyxIdInternalRequestCredentials internalCredentials, - NyxIdAppTokenService tokenService) - { - _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor)); - _internalCredentials = internalCredentials ?? throw new ArgumentNullException(nameof(internalCredentials)); - _tokenService = tokenService ?? throw new ArgumentNullException(nameof(tokenService)); - } - - public async Task CaptureAsync(CancellationToken cancellationToken = default) - { - var httpContext = _httpContextAccessor.HttpContext; - if (httpContext == null) - { - return null; - } - - var localOrigin = httpContext.Request.Host.HasValue - ? $"{httpContext.Request.Scheme}://{httpContext.Request.Host.Value}" - : null; - var isAuthenticated = httpContext.User.Identity?.IsAuthenticated == true; - var bearerToken = await _tokenService.GetAccessTokenAsync(httpContext, cancellationToken); - - return new StudioBackendRequestAuthSnapshot( - localOrigin, - BearerToken: bearerToken, - InternalAuthHeaderName: isAuthenticated ? NyxIdInternalRequestCredentials.HeaderName : null, - InternalAuthToken: isAuthenticated ? _internalCredentials.Token : null); - } -} diff --git a/tools/Aevatar.Tools.Cli/boot.sh b/tools/Aevatar.Tools.Cli/boot.sh index 66a0fa880..9ae2ca46a 100755 --- a/tools/Aevatar.Tools.Cli/boot.sh +++ b/tools/Aevatar.Tools.Cli/boot.sh @@ -1,183 +1,181 @@ #!/usr/bin/env bash +# +# boot.sh — (Re)start Mainnet Host API + aevatar console web frontend. +# +# Usage: +# ./tools/Aevatar.Tools.Cli/boot.sh [--port PORT] [--no-browser] +# +# If any process is already listening on the Mainnet port, it is killed first. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_PATH="${SCRIPT_DIR}/Aevatar.Tools.Cli.csproj" +REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" +MAINNET_PROJECT="${REPO_ROOT}/src/Aevatar.Mainnet.Host.Api/Aevatar.Mainnet.Host.Api.csproj" +FRONTEND_DIR="${REPO_ROOT}/apps/aevatar-console-web" CONFIGURATION="${AEVATAR_APP_CONFIGURATION:-Debug}" +API_PORT="${AEVATAR_APP_PORT:-5080}" +FRONTEND_PORT="${AEVATAR_CONSOLE_FRONTEND_PORT:-5173}" +NO_BROWSER=false + +# ── Parse args ────────────────────────────────────────────────── usage() { cat <<'EOF' Usage: - ./tools/Aevatar.Tools.Cli/boot.sh [port] - ./tools/Aevatar.Tools.Cli/boot.sh [app args...] + ./tools/Aevatar.Tools.Cli/boot.sh [--port PORT] [--no-browser] Description: - Starts `aevatar app` through `dotnet run` without requiring a global tool install. - If the target port is occupied, the process on that port will be killed before - the app starts again. + Kills any existing process on the API port, starts the Mainnet Host API, + starts the aevatar console web frontend, and opens the browser. Examples: ./tools/Aevatar.Tools.Cli/boot.sh - ./tools/Aevatar.Tools.Cli/boot.sh 7788 - ./tools/Aevatar.Tools.Cli/boot.sh --port 7788 --no-browser - ./tools/Aevatar.Tools.Cli/boot.sh --api-base http://localhost:5001 + ./tools/Aevatar.Tools.Cli/boot.sh --port 5080 + ./tools/Aevatar.Tools.Cli/boot.sh --no-browser Environment: - AEVATAR_APP_CONFIGURATION dotnet run build configuration, default Debug + AEVATAR_APP_CONFIGURATION dotnet build configuration (default: Debug) + AEVATAR_APP_PORT Mainnet API port (default: 5080) EOF } -if [[ ! -f "${PROJECT_PATH}" ]]; then - echo "Project file not found: ${PROJECT_PATH}" >&2 - exit 1 -fi - -declare -a app_args=() -PORT="${AEVATAR_APP_PORT:-6688}" - -if [[ $# -gt 0 ]]; then - case "${1}" in - -h|--help) - usage - exit 0 - ;; - ''|*[!0-9]*) - ;; - *) - PORT="${1}" - app_args+=(--port "${1}") - shift - ;; - esac -fi - while [[ $# -gt 0 ]]; do case "${1}" in --port) - if [[ $# -lt 2 ]]; then - echo "Missing value for ${1}" >&2 - exit 1 - fi - PORT="${2}" - app_args+=("${1}" "${2}") - shift 2 - ;; + [[ $# -lt 2 ]] && { echo "Missing value for ${1}" >&2; exit 1; } + API_PORT="${2}"; shift 2 ;; --port=*) - PORT="${1#--port=}" - app_args+=("${1}") - shift - ;; - --configuration|-c) - if [[ $# -lt 2 ]]; then - echo "Missing value for ${1}" >&2 - exit 1 - fi - CONFIGURATION="${2}" - shift 2 - ;; + API_PORT="${1#--port=}"; shift ;; + --no-browser) + NO_BROWSER=true; shift ;; -h|--help) - usage - exit 0 - ;; + usage; exit 0 ;; *) - app_args+=("${1}") - shift - ;; + if [[ "${1}" =~ ^[0-9]+$ ]]; then + API_PORT="${1}"; shift + else + echo "Unknown option: ${1}" >&2; usage; exit 1 + fi ;; esac done +# ── Port management ───────────────────────────────────────────── list_listening_pids() { - local port="$1" - lsof -tiTCP:"${port}" -sTCP:LISTEN 2>/dev/null | sort -u + lsof -tiTCP:"${1}" -sTCP:LISTEN 2>/dev/null | sort -u || true } -port_has_listener() { +kill_port() { local port="$1" local pids pids="$(list_listening_pids "${port}")" - [[ -n "${pids}" ]] -} - -kill_processes_on_port() { - local port="$1" - local pids - local i - local remaining - - pids="$(list_listening_pids "${port}")" - if [[ -z "${pids}" ]]; then - return 1 - fi + [[ -z "${pids}" ]] && return 0 echo "==> Port ${port} is occupied. PID(s): $(echo "${pids}" | tr '\n' ' ')" - echo "==> Stopping process(es) on port ${port}..." + echo "==> Stopping..." while IFS= read -r pid; do [[ -z "${pid}" ]] && continue kill "${pid}" 2>/dev/null || true done <<< "${pids}" - i=0 - while [[ "${i}" -lt 20 ]]; do - if ! port_has_listener "${port}"; then - break - fi + for _ in $(seq 1 20); do + [[ -z "$(list_listening_pids "${port}")" ]] && return 0 sleep 0.25 - i=$((i + 1)) done - if port_has_listener "${port}"; then - remaining="$(list_listening_pids "${port}")" - echo "==> Force killing remaining PID(s): $(echo "${remaining}" | tr '\n' ' ')" + pids="$(list_listening_pids "${port}")" + if [[ -n "${pids}" ]]; then + echo "==> Force killing remaining PID(s)..." while IFS= read -r pid; do [[ -z "${pid}" ]] && continue kill -9 "${pid}" 2>/dev/null || true - done <<< "${remaining}" - - i=0 - while [[ "${i}" -lt 20 ]]; do - if ! port_has_listener "${port}"; then - break - fi - sleep 0.25 - i=$((i + 1)) - done + done <<< "${pids}" + sleep 1 fi - if port_has_listener "${port}"; then - echo "Failed to free port ${port}. Please release it manually and retry." >&2 - exit 1 + if [[ -n "$(list_listening_pids "${port}")" ]]; then + echo "Failed to free port ${port}." >&2; exit 1 fi +} - return 0 +cleanup() { + echo "" + echo "==> Shutting down..." + [[ -n "${MAINNET_PID:-}" ]] && kill "${MAINNET_PID}" 2>/dev/null || true + [[ -n "${FRONTEND_PID:-}" ]] && kill "${FRONTEND_PID}" 2>/dev/null || true + wait 2>/dev/null || true } +trap cleanup EXIT INT TERM -echo "==> Launching aevatar app via dotnet run" -echo "==> Project: ${PROJECT_PATH}" -echo "==> Configuration: ${CONFIGURATION}" -echo "==> Port: ${PORT}" -if [[ ${#app_args[@]} -gt 0 ]]; then - echo "==> App args: ${app_args[*]}" -else - echo "==> App args: " +# ── Validate ──────────────────────────────────────────────────── +if [[ ! -f "${MAINNET_PROJECT}" ]]; then + echo "Mainnet project not found: ${MAINNET_PROJECT}" >&2; exit 1 fi -if kill_processes_on_port "${PORT}"; then - echo "==> Port ${PORT} has been released." +# ── Kill existing processes ───────────────────────────────────── +kill_port "${API_PORT}" +echo "==> Port ${API_PORT} is free." + +# ── Banner ────────────────────────────────────────────────────── +# Use 127.0.0.1 to match NyxID's registered redirect_uri +API_URL="http://127.0.0.1:${API_PORT}" +FRONTEND_URL="http://127.0.0.1:${FRONTEND_PORT}" + +echo "" +echo "╔═══════════════════════════════════════════════════════════╗" +echo "║ aevatar app ║" +echo "╠═══════════════════════════════════════════════════════════╣" +printf "║ %-57s ║\n" "API: ${API_URL}" +printf "║ %-57s ║\n" "Frontend: ${FRONTEND_URL}" +printf "║ %-57s ║\n" "Press Ctrl+C to stop" +echo "╚═══════════════════════════════════════════════════════════╝" +echo "" + +# ── Start Mainnet Host API (background) ───────────────────────── +echo "==> Starting Mainnet Host API..." +dotnet run \ + --project "${MAINNET_PROJECT}" \ + -c "${CONFIGURATION}" \ + --urls "${API_URL}" & +MAINNET_PID=$! + +# ── Start frontend dev server (background) ────────────────────── +if [[ -d "${FRONTEND_DIR}" ]] && [[ -f "${FRONTEND_DIR}/package.json" ]]; then + echo "==> Installing frontend dependencies..." + (cd "${FRONTEND_DIR}" && pnpm install --frozen-lockfile 2>&1 | tail -3) + + echo "==> Starting frontend dev server..." + ( + cd "${FRONTEND_DIR}" + export AEVATAR_API_TARGET="${API_URL}" + export AEVATAR_STUDIO_API_TARGET="${API_URL}" + export AEVATAR_CONSOLE_FRONTEND_PORT="${FRONTEND_PORT}" + pnpm start:dev 2>&1 | sed 's/^/[frontend] /' + ) & + FRONTEND_PID=$! else - echo "==> Port ${PORT} is free." + echo "==> Frontend not found at ${FRONTEND_DIR}, skipping." fi -cmd=( - dotnet run - --project "${PROJECT_PATH}" - -c "${CONFIGURATION}" - -- - app -) - -if [[ ${#app_args[@]} -gt 0 ]]; then - cmd+=("${app_args[@]}") +# ── Open browser (wait for frontend to be ready) ──────────────── +if [[ "${NO_BROWSER}" != "true" ]]; then + ( + echo "==> Waiting for frontend to compile..." + for _ in $(seq 1 120); do + if curl -sf -o /dev/null "${FRONTEND_URL}/"; then + echo "==> Opening browser: ${FRONTEND_URL}" + if [[ "$(uname)" == "Darwin" ]]; then + open "${FRONTEND_URL}" 2>/dev/null + elif command -v xdg-open >/dev/null 2>&1; then + xdg-open "${FRONTEND_URL}" 2>/dev/null + fi + exit 0 + fi + sleep 1 + done + echo "==> Frontend did not start within 120s. Open manually: ${FRONTEND_URL}" + ) & fi -exec "${cmd[@]}" +# ── Wait for either to exit ───────────────────────────────────── +wait "${MAINNET_PID}" diff --git a/tools/Aevatar.Tools.Cli/wwwroot/playground/app.css b/tools/Aevatar.Tools.Cli/wwwroot/playground/app.css deleted file mode 100644 index e897a9bc5..000000000 --- a/tools/Aevatar.Tools.Cli/wwwroot/playground/app.css +++ /dev/null @@ -1 +0,0 @@ -.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}.monaco-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif;--monaco-monospace-font: "SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace}.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{position:absolute!important;top:0;height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%)}.monaco-editor .synthetic-focus,.monaco-diff-editor .synthetic-focus,.monaco-editor [tabindex="0"]:focus,.monaco-diff-editor [tabindex="0"]:focus,.monaco-editor [tabindex="-1"]:focus,.monaco-diff-editor [tabindex="-1"]:focus,.monaco-editor button:focus,.monaco-diff-editor button:focus,.monaco-editor input[type=button]:focus,.monaco-diff-editor input[type=button]:focus,.monaco-editor input[type=checkbox]:focus,.monaco-diff-editor input[type=checkbox]:focus,.monaco-editor input[type=search]:focus,.monaco-diff-editor input[type=search]:focus,.monaco-editor input[type=text]:focus,.monaco-diff-editor input[type=text]:focus,.monaco-editor select:focus,.monaco-diff-editor select:focus,.monaco-editor textarea:focus,.monaco-diff-editor textarea:focus{outline-width:1px;outline-style:solid;outline-offset:-1px;outline-color:var(--vscode-focusBorder);opacity:1}.monaco-aria-container{position:absolute;left:-999em}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{position:relative;overflow:visible;-webkit-text-size-adjust:100%;color:var(--vscode-editor-foreground);background-color:var(--vscode-editor-background);overflow-wrap:initial}.monaco-editor-background{background-color:var(--vscode-editor-background)}.monaco-editor .rangeHighlight{background-color:var(--vscode-editor-rangeHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-rangeHighlightBorder)}.monaco-editor.hc-black .rangeHighlight,.monaco-editor.hc-light .rangeHighlight{border-style:dotted}.monaco-editor .symbolHighlight{background-color:var(--vscode-editor-symbolHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-symbolHighlightBorder)}.monaco-editor.hc-black .symbolHighlight,.monaco-editor.hc-light .symbolHighlight{border-style:dotted}.monaco-editor .editorCanvas{position:absolute;width:100%;height:100%;z-index:0;pointer-events:none}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .view-overlays>div,.monaco-editor .margin-view-overlays>div{position:absolute;width:100%}.monaco-editor .squiggly-error{border-bottom:4px double var(--vscode-editorError-border)}.monaco-editor .squiggly-error:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorError-background)}.monaco-editor .squiggly-warning{border-bottom:4px double var(--vscode-editorWarning-border)}.monaco-editor .squiggly-warning:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorWarning-background)}.monaco-editor .squiggly-info{border-bottom:4px double var(--vscode-editorInfo-border)}.monaco-editor .squiggly-info:before{display:block;content:"";width:100%;height:100%;background:var(--vscode-editorInfo-background)}.monaco-editor .squiggly-hint{border-bottom:2px dotted var(--vscode-editorHint-border)}.monaco-editor.showUnused .squiggly-unnecessary{border-bottom:2px dashed var(--vscode-editorUnnecessaryCode-border)}.monaco-editor.showDeprecated .squiggly-inline-deprecated{text-decoration:line-through;text-decoration-color:var(--vscode-editor-foreground, inherit)}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{position:absolute;display:none}.monaco-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset}.monaco-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset}.monaco-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.monaco-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow) 6px 0 6px -6px inset}.monaco-scrollable-element>.scrollbar{background:var(--vscode-scrollbar-background)}.monaco-scrollable-element>.scrollbar>.slider{background:var(--vscode-scrollbarSlider-background)}.monaco-scrollable-element>.scrollbar>.slider:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-scrollable-element>.scrollbar>.slider.active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-editor .blockDecorations-container{position:absolute;top:0;pointer-events:none}.monaco-editor .blockDecorations-block{position:absolute;box-sizing:border-box}.monaco-editor .view-overlays .current-line,.monaco-editor .margin-view-overlays .current-line{display:block;position:absolute;left:0;top:0;box-sizing:border-box;height:100%}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{position:absolute;height:100%}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .glyph-margin-widgets .cgmr{position:absolute;display:flex;align-items:center;justify-content:center}.monaco-editor .glyph-margin-widgets .cgmr.codicon-modifier-spin:before{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.monaco-editor .lines-content .core-guide{position:absolute;box-sizing:border-box;height:100%}.monaco-editor .margin-view-overlays .line-numbers{bottom:0;font-variant-numeric:tabular-nums;position:absolute;text-align:right;display:inline-block;vertical-align:middle;box-sizing:border-box;cursor:default}.monaco-editor .relative-current-line-number{text-align:left;display:inline-block;width:100%}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-editor .line-numbers{color:var(--vscode-editorLineNumber-foreground)}.monaco-editor .line-numbers.active-line-number{color:var(--vscode-editorLineNumber-activeForeground)}.monaco-mouse-cursor-text{cursor:text}.mtkcontrol{color:#fff!important;background:#960000!important}.mtkoverflow{background-color:var(--vscode-button-background, var(--vscode-editor-background));color:var(--vscode-button-foreground, var(--vscode-editor-foreground));border-width:1px;border-style:solid;border-color:var(--vscode-contrastBorder);border-radius:2px;padding:4px;cursor:pointer}.mtkoverflow:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{-moz-user-select:none;user-select:none;-webkit-user-select:none}.monaco-editor.mac .lines-content:hover,.monaco-editor.mac .view-line:hover,.monaco-editor.mac .view-lines:hover{-moz-user-select:text;user-select:text;-webkit-user-select:text;-ms-user-select:text}.monaco-editor.enable-user-select{-moz-user-select:initial;user-select:initial;-webkit-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{box-sizing:border-box;position:absolute;width:100%}.monaco-editor .lines-content>.view-lines>.view-line>span{top:0;bottom:0;position:absolute}.monaco-editor .mtkw{color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .mtkz{display:inline-block;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .lines-decorations{position:absolute;top:0;background:#fff}.monaco-editor .margin-view-overlays .cldr{position:absolute;height:100%}.monaco-editor .margin{background-color:var(--vscode-editorGutter-background)}.monaco-editor .margin-view-overlays .cmdr{position:absolute;left:0;width:100%;height:100%}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover:hover .minimap-slider,.monaco-editor .minimap.slider-mouseover .minimap-slider.active{opacity:1}.monaco-editor .minimap-slider .minimap-slider-horizontal{background:var(--vscode-minimapSlider-background)}.monaco-editor .minimap-slider:hover .minimap-slider-horizontal{background:var(--vscode-minimapSlider-hoverBackground)}.monaco-editor .minimap-slider.active .minimap-slider-horizontal{background:var(--vscode-minimapSlider-activeBackground)}.monaco-editor .minimap-shadow-visible{box-shadow:var(--vscode-scrollbar-shadow) -6px 0 6px -6px inset}.monaco-editor .minimap-shadow-hidden{position:absolute;width:0}.monaco-editor .minimap-shadow-visible{position:absolute;left:-6px;width:6px;pointer-events:none}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{position:absolute;left:-1px;width:1px}.minimap.minimap-autohide-mouseover,.minimap.minimap-autohide-scroll{opacity:0;transition:opacity .5s}.minimap.minimap-autohide-scroll{pointer-events:none}.minimap.minimap-autohide-mouseover:hover,.minimap.minimap-autohide-scroll.active{opacity:1;pointer-events:auto}.monaco-editor .minimap{z-index:5}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{position:absolute;top:0;box-shadow:1px 0 0 0 var(--vscode-editorRuler-foreground) inset}.monaco-editor .scroll-decoration{position:absolute;top:0;left:0;height:6px;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px inset}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .focused .selected-text{background-color:var(--vscode-editor-selectionBackground)}.monaco-editor .selected-text{background-color:var(--vscode-editor-inactiveSelectionBackground)}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{position:absolute;overflow:hidden;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{background:transparent!important;border-style:solid;border-width:1px}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-width:2px;border-bottom-style:solid;background:transparent!important}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-width:1px;border-bottom-style:solid;background:transparent!important}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate}.cursor-phase{animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate}.cursor-expand>.cursor{animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate}.monaco-editor .mwh{position:absolute;color:var(--vscode-editorWhitespace-foreground)!important}.monaco-editor .monaco-decoration-css-rule-extractor{visibility:hidden;pointer-events:none}.monaco-editor .inputarea{min-width:0;min-height:0;margin:0;padding:0;position:absolute;outline:none!important;resize:none;border:none;overflow:hidden;color:transparent;background-color:transparent;z-index:-10}.monaco-editor .inputarea.ime-input{z-index:10;caret-color:var(--vscode-editorCursor-foreground);color:var(--vscode-editor-foreground)}.monaco-editor .native-edit-context{margin:0;padding:0;position:absolute;overflow-y:scroll;scrollbar-width:none;z-index:-10;white-space:pre-wrap}.monaco-editor .ime-text-area{min-width:0;min-height:0;margin:0;padding:0;position:absolute;outline:none!important;resize:none;border:none;overflow:hidden;color:transparent;background-color:transparent;z-index:-10}.monaco-editor .edit-context-composition-none{background-color:transparent;border-bottom:none}.monaco-editor :not(.hc-black,.hc-light) .edit-context-composition-secondary{border-bottom:1px solid var(--vscode-editor-compositionBorder)}.monaco-editor :not(.hc-black,.hc-light) .edit-context-composition-primary{border-bottom:2px solid var(--vscode-editor-compositionBorder)}.monaco-editor :is(.hc-black,.hc-light) .edit-context-composition-secondary{border:1px solid var(--vscode-editor-compositionBorder)}.monaco-editor :is(.hc-black,.hc-light) .edit-context-composition-primary{border:2px solid var(--vscode-editor-compositionBorder)}.monaco-editor .margin-view-overlays .gpu-mark{position:absolute;top:0;bottom:0;left:0;width:100%;display:inline-block;border-left:solid 2px var(--vscode-editorWarning-foreground);opacity:.2;transition:background-color .1s linear}.monaco-editor .margin-view-overlays .gpu-mark:hover{background-color:var(--vscode-editorWarning-foreground)}.monaco-hover.workbench-hover{position:relative;font-size:13px;line-height:19px;z-index:40;overflow:hidden;max-width:700px;background:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border);border-radius:5px;color:var(--vscode-editorHoverWidget-foreground);box-shadow:0 2px 8px var(--vscode-widget-shadow)}.monaco-hover.workbench-hover .monaco-action-bar .action-item .codicon{width:13px;height:13px}.monaco-hover.workbench-hover hr{border-bottom:none}.monaco-hover.workbench-hover.compact{font-size:12px}.monaco-hover.workbench-hover.compact .monaco-action-bar .action-item .codicon{width:12px;height:12px}.monaco-hover.workbench-hover.compact .hover-contents{padding:2px 8px}.workbench-hover-container.locked .monaco-hover.workbench-hover{outline:1px solid var(--vscode-editorHoverWidget-border)}.workbench-hover-container:focus-within.locked .monaco-hover.workbench-hover{outline-color:var(--vscode-focusBorder)}.workbench-hover-pointer{position:absolute;z-index:41;pointer-events:none}.workbench-hover-pointer:after{content:"";position:absolute;width:5px;height:5px;background-color:var(--vscode-editorHoverWidget-background);border-right:1px solid var(--vscode-editorHoverWidget-border);border-bottom:1px solid var(--vscode-editorHoverWidget-border)}.workbench-hover-container:not(:focus-within).locked .workbench-hover-pointer:after{width:4px;height:4px;border-right-width:2px;border-bottom-width:2px}.workbench-hover-container:focus-within .workbench-hover-pointer:after{border-right:1px solid var(--vscode-focusBorder);border-bottom:1px solid var(--vscode-focusBorder)}.workbench-hover-pointer.left{left:-3px}.workbench-hover-pointer.right{right:3px}.workbench-hover-pointer.top{top:-3px}.workbench-hover-pointer.bottom{bottom:3px}.workbench-hover-pointer.left:after{transform:rotate(135deg)}.workbench-hover-pointer.right:after{transform:rotate(315deg)}.workbench-hover-pointer.top:after{transform:rotate(225deg)}.workbench-hover-pointer.bottom:after{transform:rotate(45deg)}.monaco-hover.workbench-hover a{color:var(--vscode-textLink-foreground)}.monaco-hover.workbench-hover a:focus{outline:1px solid;outline-offset:-1px;text-decoration:underline;outline-color:var(--vscode-focusBorder)}.monaco-hover.workbench-hover a.codicon:focus,.monaco-hover.workbench-hover a.monaco-button:focus{text-decoration:none}.monaco-hover.workbench-hover a:hover,.monaco-hover.workbench-hover a:active{color:var(--vscode-textLink-activeForeground)}.monaco-hover.workbench-hover code{background:var(--vscode-textCodeBlock-background)}.monaco-hover.workbench-hover .hover-row .actions{background:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-hover.workbench-hover.right-aligned{left:1px}.monaco-hover.workbench-hover.right-aligned .hover-row.status-bar .actions{flex-direction:row-reverse}.monaco-hover.workbench-hover.right-aligned .hover-row.status-bar .actions .action-container{margin-right:0;margin-left:16px}.monaco-hover{cursor:default;position:absolute;overflow:hidden;-moz-user-select:text;user-select:text;-webkit-user-select:text;box-sizing:border-box;line-height:1.5em;white-space:var(--vscode-hover-whiteSpace, normal)}.monaco-hover.fade-in{animation:fadein .1s linear}.monaco-hover.hidden{display:none}.monaco-hover a:hover:not(.disabled){cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:var(--vscode-hover-maxWidth, 500px);word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover p,.monaco-hover .code,.monaco-hover ul,.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{margin:8px 0}.monaco-hover h1,.monaco-hover h2,.monaco-hover h3,.monaco-hover h4,.monaco-hover h5,.monaco-hover h6{line-height:1.1}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{box-sizing:border-box;border-left:0px;border-right:0px;margin:4px -8px -4px;height:1px}.monaco-hover p:first-child,.monaco-hover .code:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover p:last-child,.monaco-hover .code:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ul,.monaco-hover ol{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:var(--vscode-hover-sourceWhiteSpace, pre-wrap)}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .info{font-style:italic;padding:0 8px}.monaco-hover .hover-row.status-bar .actions{display:flex;padding:0 8px;width:100%}.monaco-hover .hover-row.status-bar .actions .action-container{margin-right:16px;cursor:pointer;overflow:hidden;text-wrap:nowrap;text-overflow:ellipsis}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px;vertical-align:middle}.monaco-hover .hover-row.status-bar .actions .action-container a{color:var(--vscode-textLink-foreground);-webkit-text-decoration:var(--text-link-decoration);text-decoration:var(--text-link-decoration)}.monaco-hover .hover-row.status-bar .actions .action-container a .icon.codicon{color:var(--vscode-textLink-foreground)}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link:hover,.monaco-hover .hover-contents a.code-link{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:"("}.monaco-hover .hover-contents a.code-link:after{content:")"}.monaco-hover .hover-contents a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under;color:var(--vscode-textLink-foreground)}.monaco-hover .hover-contents a.code-link>span:hover{color:var(--vscode-textLink-activeForeground)}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) p:last-child [style*=background-color]{margin-bottom:4px;display:inline-block}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span.codicon{margin-bottom:2px}.monaco-hover-content .action-container a{-webkit-user-select:none;-moz-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{pointer-events:none;opacity:.4;cursor:default}.monaco-hover .action-container,.monaco-hover .action,.monaco-hover button,.monaco-hover .monaco-button,.monaco-hover .monaco-text-button,.monaco-hover [role=button]{-webkit-user-select:none;-moz-user-select:none;user-select:none}.context-view{position:absolute}.context-view.fixed{all:initial;font-family:inherit;font-size:13px;position:fixed;color:inherit}.monaco-select-box{width:100%;cursor:pointer;border-radius:2px}.monaco-select-box-dropdown-container{font-size:13px;font-weight:400;text-transform:none}.monaco-action-bar .action-item.select-container{cursor:default}.monaco-action-bar .action-item .monaco-select-box{cursor:pointer;min-width:100px;min-height:18px;padding:2px 23px 2px 8px}.mac .monaco-action-bar .action-item .monaco-select-box{font-size:11px;border-radius:3px;min-height:24px}.monaco-list{position:relative;height:100%;width:100%;white-space:nowrap}.monaco-list.mouse-support{-moz-user-select:none;user-select:none;-webkit-user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{position:relative;width:100%;height:100%}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{position:absolute;box-sizing:border-box;overflow:hidden;width:100%}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list .monaco-scrollable-element>.scrollbar.vertical,.monaco-pane-view>.monaco-split-view2.vertical>.monaco-scrollable-element>.scrollbar.vertical{z-index:14}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-single,.monaco-list.selection-multiple{outline:0!important}.monaco-list-type-filter-message{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;padding:40px 1em 1em;text-align:center;white-space:normal;opacity:.7;pointer-events:none}.monaco-list-type-filter-message:empty{display:none}.monaco-drag-image{display:inline-block;padding:1px 7px;border-radius:10px;font-size:12px;position:absolute;z-index:1000;background-color:var(--vscode-list-activeSelectionBackground);color:var(--vscode-list-activeSelectionForeground);outline:1px solid var(--vscode-list-focusOutline);outline-offset:-1px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-select-box-dropdown-padding{--dropdown-padding-top: 1px;--dropdown-padding-bottom: 1px}.hc-black .monaco-select-box-dropdown-padding,.hc-light .monaco-select-box-dropdown-padding{--dropdown-padding-top: 3px;--dropdown-padding-bottom: 4px}.monaco-select-box-dropdown-container{display:none;box-sizing:border-box}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown *{margin:0}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown a:focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-select-box-dropdown-container>.select-box-details-pane>.select-box-description-markdown code{line-height:15px;font-family:var(--monaco-monospace-font)}.monaco-select-box-dropdown-container.visible{display:flex;flex-direction:column;text-align:left;width:1px;overflow:hidden;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container{flex:0 0 auto;align-self:flex-start;padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom);padding-left:1px;padding-right:1px;width:100%;overflow:hidden;box-sizing:border-box}.monaco-select-box-dropdown-container>.select-box-details-pane{padding:5px}.hc-black .monaco-select-box-dropdown-container>.select-box-dropdown-list-container{padding-top:var(--dropdown-padding-top);padding-bottom:var(--dropdown-padding-bottom)}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row{cursor:pointer}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-text{text-overflow:ellipsis;overflow:hidden;padding-left:3.5px;white-space:nowrap;float:left}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-detail{text-overflow:ellipsis;overflow:hidden;padding-left:3.5px;white-space:nowrap;float:left;opacity:.7}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.option-decorator-right{text-overflow:ellipsis;overflow:hidden;padding-right:10px;white-space:nowrap;float:right}.monaco-select-box-dropdown-container>.select-box-dropdown-list-container .monaco-list .monaco-list-row>.visually-hidden{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control{flex:1 1 auto;align-self:flex-start;opacity:0}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div{overflow:hidden;max-height:0px}.monaco-select-box-dropdown-container>.select-box-dropdown-container-width-control>.width-control-div>.option-text-width-control{padding-left:4px;padding-right:8px;white-space:nowrap}.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{display:flex;margin:0 auto;padding:0;height:100%;width:100%;align-items:center}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{display:block;align-items:center;justify-content:center;cursor:pointer;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .icon,.monaco-action-bar .action-item .codicon{display:block}.monaco-action-bar .action-item .codicon{display:flex;align-items:center;width:16px;height:16px}.monaco-action-bar .action-label{display:flex;font-size:11px;padding:3px;border-radius:5px}.monaco-action-bar .action-item.disabled .action-label:not(.icon),.monaco-action-bar .action-item.disabled .action-label:not(.icon):before,.monaco-action-bar .action-item.disabled .action-label:not(.icon):hover{color:var(--vscode-disabledForeground)}.monaco-action-bar .action-item.disabled .action-label.icon,.monaco-action-bar .action-item.disabled .action-label.icon:before,.monaco-action-bar .action-item.disabled .action-label.icon:hover{opacity:.6}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{display:block;border-bottom:1px solid var(--vscode-disabledForeground);padding-top:1px;margin-left:.8em;margin-right:.8em}.monaco-action-bar .action-item .action-label.separator{width:1px;height:16px;margin:5px 4px!important;cursor:default;min-width:1px;padding:0;background-color:var(--vscode-disabledForeground)}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{overflow:hidden;flex:1;max-width:170px;min-width:60px;display:flex;align-items:center;justify-content:center;margin-right:10px}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator{display:flex;align-items:center;cursor:default}.monaco-action-bar .action-item.action-dropdown-item>.action-dropdown-item-separator>div{width:1px}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;height:100%;display:flex;align-items:center;justify-content:center}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:center center;background-repeat:no-repeat}.monaco-action-bar .action-item.menu-entry .action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-action-bar .action-item.menu-entry.text-only .action-label{color:var(--vscode-descriptionForeground);overflow:hidden;border-radius:2px}.monaco-action-bar .action-item.menu-entry.text-only.use-comma:not(:last-of-type) .action-label:after{content:", "}.monaco-action-bar .action-item.menu-entry.text-only+.action-item:not(.text-only)>.monaco-dropdown .action-label{color:var(--vscode-descriptionForeground)}.monaco-dropdown-with-default{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-dropdown-with-default:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:center center;background-repeat:no-repeat}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{background-color:#ddd6;border:solid 1px rgba(204,204,204,.4);border-bottom-color:#bbb6;box-shadow:inset 0 -1px #bbb6;color:#555}.hc-black .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:solid 1px rgb(111,195,223);box-shadow:none;color:#fff}.hc-light .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:solid 1px #0F4A85;box-shadow:none;color:#292929}.vs-dark .monaco-keybinding>.monaco-keybinding-key{background-color:#8080802b;border:solid 1px rgba(51,51,51,.6);border-bottom-color:#4449;box-shadow:inset 0 -1px #4449;color:#ccc}.monaco-custom-toggle{margin-left:2px;float:left;cursor:pointer;overflow:hidden;width:20px;height:20px;border-radius:3px;border:1px solid transparent;padding:1px;box-sizing:border-box;-moz-user-select:none;user-select:none;-webkit-user-select:none}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-light .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{background:none}.monaco-custom-toggle.monaco-checkbox{height:18px;width:18px;border:1px solid transparent;border-radius:3px;margin-right:9px;margin-left:0;padding:0;opacity:1;background-size:16px!important}.monaco-action-bar .checkbox-action-item{display:flex;align-items:center;border-radius:2px;padding-right:2px}.monaco-action-bar .checkbox-action-item:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-action-bar .checkbox-action-item>.monaco-custom-toggle.monaco-checkbox{margin-right:4px}.monaco-action-bar .checkbox-action-item>.checkbox-label{font-size:12px}.quick-input-widget{position:absolute;width:600px;z-index:2550;left:50%;-webkit-app-region:no-drag;border-radius:6px}.quick-input-titlebar{cursor:grab;display:flex;align-items:center;border-top-right-radius:5px;border-top-left-radius:5px}.quick-input-left-action-bar{display:flex;margin-left:4px;flex:1}.quick-input-inline-action-bar>.actions-container>.action-item:first-child{margin-left:5px}.quick-input-inline-action-bar>.actions-container>.action-item{margin-top:2px}.quick-input-title{cursor:grab;padding:3px 0;text-align:center;text-overflow:ellipsis;overflow:hidden}.quick-input-right-action-bar{display:flex;margin-right:4px;flex:1}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-right-action-bar>.actions-container>.action-item{margin-left:4px}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:center;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px 6px 6px 11px}.quick-input-header .quick-input-description{margin:4px 2px;flex:1}.quick-input-header{cursor:grab;display:flex;padding:6px 6px 2px}.quick-input-widget.hidden-input .quick-input-header{padding:0;margin-bottom:0}.quick-input-and-message{display:flex;flex-direction:column;flex-grow:1;min-width:0;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-widget .quick-input-header .monaco-checkbox{margin-top:6px}.quick-input-filter{flex-grow:1;display:flex;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{align-self:center;position:absolute;right:4px;display:flex;align-items:center}.quick-input-count .monaco-count-badge{vertical-align:middle;padding:2px 4px;border-radius:2px;min-height:auto;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{font-size:11px;padding:0 6px;display:flex;height:25px;align-items:center}.quick-input-message{margin-top:-1px;padding:5px;overflow-wrap:break-word}.quick-input-message>.codicon{margin:0 .2em;vertical-align:text-bottom}.quick-input-message a{color:inherit}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-list{line-height:22px}.quick-input-widget.hidden-input .quick-input-list{margin-top:4px;padding-bottom:4px}.quick-input-list .monaco-list{overflow:hidden;max-height:440px;padding-bottom:5px}.quick-input-list .monaco-scrollable-element{padding:0 6px}.quick-input-list .quick-input-list-entry{box-sizing:border-box;overflow:hidden;display:flex;padding:0 6px}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-width:1px;border-top-style:solid}.quick-input-list .monaco-list-row{border-radius:3px}.quick-input-list .monaco-list-row[data-index="0"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{overflow:hidden;display:flex;height:100%;flex:1}.quick-input-widget .monaco-checkbox{margin-right:0}.quick-input-widget .quick-input-list .monaco-checkbox,.quick-input-widget .quick-input-tree .monaco-checkbox{margin-top:4px}.quick-input-list .quick-input-list-icon{background-size:16px;background-position:left center;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;display:flex;align-items:center;justify-content:center}.quick-input-list .quick-input-list-rows{overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;height:100%;flex:1;margin-left:5px}.quick-input-list .quick-input-list-rows>.quick-input-list-row{display:flex;align-items:center}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label>span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;line-height:normal;text-overflow:ellipsis;overflow:hidden}.quick-input-list .monaco-list .monaco-list-row .monaco-highlighted-label .highlight{font-weight:700;background-color:unset;color:var(--vscode-list-highlightForeground)!important}.quick-input-list .monaco-list .monaco-list-row.focused .monaco-highlighted-label .highlight{color:var(--vscode-list-focusHighlightForeground)!important}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:4px}.quick-input-list .quick-input-list-entry-action-bar{display:flex;flex:0;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label,.quick-input-list .quick-input-list-entry.focus-inside .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.passive-focused .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list>.monaco-list:focus .monaco-list-row.focused{outline:1px solid var(--vscode-list-focusOutline)!important;outline-offset:-1px}.quick-input-list>.monaco-list:focus .monaco-list-row.focused .quick-input-list-entry.quick-input-list-separator-border{border-color:transparent}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:none}.quick-input-list .quick-input-list-separator-as-item{padding:4px 6px;font-size:12px}.quick-input-list .quick-input-list-separator-as-item .label-name{font-weight:600}.quick-input-list .quick-input-list-separator-as-item .label-description{opacity:1!important}.quick-input-list .monaco-tree-sticky-row .quick-input-list-entry.quick-input-list-separator-as-item.quick-input-list-separator-border{border-top-style:none}.quick-input-list .monaco-tree-sticky-row{padding:0 5px}.quick-input-list .monaco-tl-twistie{display:none!important}.quick-input-tree .monaco-list{overflow:hidden;max-height:440px;padding-bottom:5px}.quick-input-tree .quick-input-tree-entry{box-sizing:border-box;overflow:hidden;display:flex;padding:0 6px}.quick-input-tree .quick-input-tree-label{overflow:hidden;display:flex;height:100%;flex:1}.quick-input-tree .quick-input-tree-icon{background-size:16px;background-position:left center;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;display:flex;align-items:center;justify-content:center}.quick-input-tree .quick-input-tree-rows{overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;height:100%;flex:1;margin-left:5px}.quick-input-tree .quick-input-tree-rows>.quick-input-tree-row{display:flex;align-items:center}.quick-input-tree .quick-input-tree-rows>.quick-input-tree-row .monaco-icon-label,.quick-input-tree .quick-input-tree-rows>.quick-input-tree-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-tree .quick-input-tree-rows>.quick-input-tree-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-tree .quick-input-tree-rows .monaco-highlighted-label>span{opacity:1}.quick-input-tree .quick-input-tree-entry-action-bar{display:flex;flex:0;overflow:visible}.quick-input-tree .quick-input-tree-entry-action-bar .action-label{display:none}.quick-input-tree .quick-input-tree-entry-action-bar .action-label.codicon{margin-right:4px;padding:2px}.quick-input-tree .quick-input-tree-entry-action-bar{margin-top:1px;margin-right:4px}.quick-input-tree .quick-input-tree-entry .quick-input-tree-entry-action-bar .action-label.always-visible,.quick-input-tree .quick-input-tree-entry:hover .quick-input-tree-entry-action-bar .action-label,.quick-input-tree .quick-input-tree-entry.focus-inside .quick-input-tree-entry-action-bar .action-label,.quick-input-tree .monaco-list-row.focused .quick-input-tree-entry-action-bar .action-label,.quick-input-tree .monaco-list-row.passive-focused .quick-input-tree-entry-action-bar .action-label{display:flex}.quick-input-tree>.monaco-list:focus .monaco-list-row.focused{outline:1px solid var(--vscode-list-focusOutline)!important;outline-offset:-1px}.monaco-text-button{box-sizing:border-box;display:flex;width:100%;padding:4px;border-radius:2px;text-align:center;cursor:pointer;justify-content:center;align-items:center;border:1px solid var(--vscode-button-border, transparent);line-height:18px}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{text-decoration:none!important}.monaco-button.disabled:focus,.monaco-button.disabled{opacity:.4!important;cursor:default}.monaco-text-button .codicon{margin:0 .2em;color:inherit!important}.monaco-text-button.monaco-text-button-with-short-label{flex-direction:row;flex-wrap:wrap;padding:0 4px;overflow:hidden;height:28px}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label{flex-basis:100%}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{flex-grow:1;width:0;overflow:hidden}.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label,.monaco-text-button.monaco-text-button-with-short-label>.monaco-button-label-short{display:flex;justify-content:center;align-items:center;font-weight:400;font-style:inherit;padding:4px 0}.monaco-button-dropdown{display:flex;cursor:pointer}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus,.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{padding:4px 0;cursor:default}.monaco-button-dropdown .monaco-button-dropdown-separator>div{height:100%;width:1px}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border:1px solid var(--vscode-button-border, transparent);border-left-width:0!important;border-radius:0 2px 2px 0;display:flex;align-items:center}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-radius:2px 0 0 2px}.monaco-description-button{display:flex;flex-direction:column;align-items:center;margin:4px 5px}.monaco-description-button .monaco-button-description{font-style:italic;font-size:11px;padding:4px 20px}.monaco-description-button .monaco-button-label,.monaco-description-button .monaco-button-description{display:flex;justify-content:center;align-items:center}.monaco-description-button .monaco-button-label>.codicon,.monaco-description-button .monaco-button-description>.codicon{margin:0 .2em;color:inherit!important}.monaco-button.default-colors,.monaco-button-dropdown.default-colors>.monaco-button{color:var(--vscode-button-foreground);background-color:var(--vscode-button-background)}.monaco-button.default-colors:hover,.monaco-button-dropdown.default-colors>.monaco-button:hover{background-color:var(--vscode-button-hoverBackground)}.monaco-button.default-colors.secondary,.monaco-button-dropdown.default-colors>.monaco-button.secondary{color:var(--vscode-button-secondaryForeground);background-color:var(--vscode-button-secondaryBackground)}.monaco-button.default-colors.secondary:hover,.monaco-button-dropdown.default-colors>.monaco-button.secondary:hover{background-color:var(--vscode-button-secondaryHoverBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator{background-color:var(--vscode-button-background);border-top:1px solid var(--vscode-button-border);border-bottom:1px solid var(--vscode-button-border)}.monaco-button-dropdown.default-colors .monaco-button.secondary+.monaco-button-dropdown-separator{background-color:var(--vscode-button-secondaryBackground)}.monaco-button-dropdown.default-colors .monaco-button-dropdown-separator>div{background-color:var(--vscode-button-separator)}.monaco-count-badge{padding:3px 5px;border-radius:11px;font-size:11px;min-width:18px;min-height:18px;line-height:11px;font-weight:400;text-align:center;display:inline-block;box-sizing:border-box}.monaco-count-badge.long{padding:2px 3px;border-radius:2px;min-height:auto;line-height:normal}.monaco-progress-container{width:100%;height:2px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:2px;position:absolute;left:0;display:none}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{left:0;transition:width .1s linear}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-name:progress;animation-duration:4s;animation-iteration-count:infinite;transform:translateZ(0);animation-timing-function:linear}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100)}@keyframes progress{0%{transform:translate(0) scaleX(1)}50%{transform:translate(2500%) scaleX(3)}to{transform:translate(4900%) scaleX(1)}}.monaco-inputbox{position:relative;display:block;padding:0;box-sizing:border-box;border-radius:2px;font-size:inherit}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px 6px}.monaco-inputbox>.ibwrapper{position:relative;width:100%}.monaco-inputbox>.ibwrapper>.input{display:inline-block;box-sizing:border-box;width:100%;height:100%;line-height:inherit;border:none;font-family:inherit;font-size:inherit;resize:none;color:inherit}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{display:block;scrollbar-width:none;outline:none}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{position:absolute;display:inline-block;width:100%;top:0;left:0;box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{display:inline-block;overflow:hidden;text-align:left;width:100%;box-sizing:border-box;padding:.4em;font-size:12px;line-height:17px;margin-top:-1px;word-wrap:break-word}.monaco-inputbox .monaco-action-bar{position:absolute;right:2px;top:4px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{font-size:13px;width:100%}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.monaco-findInput.highlight-0 .controls,.hc-light .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-0 .1s linear 0s}.monaco-findInput.highlight-1 .controls,.hc-light .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-1 .1s linear 0s}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-dark-0 .1s linear 0s}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-dark-1 .1s linear 0s}@keyframes monaco-findInput-highlight-0{0%{background:#fdff00cc}to{background:transparent}}@keyframes monaco-findInput-highlight-1{0%{background:#fdff00cc}99%{background:transparent}}@keyframes monaco-findInput-highlight-dark-0{0%{background:#ffffff70}to{background:transparent}}@keyframes monaco-findInput-highlight-dark-1{0%{background:#ffffff70}99%{background:transparent}}.monaco-icon-label{display:flex;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label:before{background-size:16px;background-position:left center;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;line-height:inherit!important;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;flex-shrink:0}.monaco-icon-label-iconpath{width:16px;height:22px;margin-right:6px;display:flex}.monaco-icon-label-container.disabled{color:var(--vscode-disabledForeground)}.monaco-icon-label>.monaco-icon-label-container{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{margin:0 2px;opacity:.5}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-suffix-container>.label-suffix{opacity:.7;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;margin-left:.5em;font-size:.9em;white-space:pre}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.bold>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.bold>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-weight:700}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-style:italic}.monaco-icon-label.deprecated{text-decoration:line-through;opacity:.66}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{text-decoration:line-through}.monaco-icon-label:after{opacity:.75;font-size:90%;font-weight:600;margin:auto 16px 0 5px;text-align:center}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-keybinding{display:flex;align-items:center;line-height:10px}.monaco-keybinding>.monaco-keybinding-key{display:inline-block;border-style:solid;border-width:1px;border-radius:3px;vertical-align:middle;font-size:11px;padding:3px 5px;margin:0 2px}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}.monaco-tl-row{display:flex;height:100%;align-items:center;position:relative}.monaco-tl-row.disabled{cursor:default}.monaco-tl-indent{height:100%;position:absolute;top:0;left:16px;pointer-events:none}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{display:inline-block;box-sizing:border-box;height:100%;border-left:1px solid transparent;opacity:0}.monaco-enable-motion .monaco-tl-indent>.indent-guide{transition:opacity .1s linear}.monaco-tl-twistie,.monaco-tl-contents{height:100%}.monaco-tl-twistie{font-size:10px;text-align:right;padding-right:6px;flex-shrink:0;width:16px;display:flex!important;align-items:center;justify-content:center;transform:translate(3px)}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:codicon-spin 1.25s steps(30) infinite}.monaco-tree-type-filter{position:absolute;top:0;right:0;display:flex;padding:3px;max-width:200px;z-index:100;margin:0 10px 0 6px;border:1px solid var(--vscode-widget-border);border-bottom-left-radius:4px;border-bottom-right-radius:4px}.monaco-enable-motion .monaco-tree-type-filter{transition:top .3s}.monaco-tree-type-filter.disabled{top:-40px!important}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container{position:absolute;top:0;left:0;width:100%;height:0;z-index:13;background-color:var(--vscode-sideBar-background)}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row.monaco-list-row{position:absolute;width:100%;opacity:1!important;overflow:hidden;background-color:var(--vscode-sideBar-background)}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row:hover{background-color:var(--vscode-list-hoverBackground)!important;cursor:pointer}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty,.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container.empty .monaco-tree-sticky-container-shadow{display:none}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow{position:absolute;bottom:-3px;left:0;height:0px;width:100%}.monaco-list .monaco-scrollable-element .monaco-tree-sticky-container[tabindex="0"]:focus{outline:none}:root{--vscode-sash-size: 4px;--vscode-sash-hover-size: 4px}.monaco-sash{position:absolute;z-index:35;touch-action:none}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;top:0;width:var(--vscode-sash-size);height:100%}.monaco-sash.horizontal{cursor:ns-resize;left:0;width:100%;height:var(--vscode-sash-size)}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:" ";height:calc(var(--vscode-sash-size) * 2);width:calc(var(--vscode-sash-size) * 2);z-index:100;display:block;cursor:all-scroll;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--vscode-sash-size) * -.5);top:calc(var(--vscode-sash-size) * -1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--vscode-sash-size) * -.5);bottom:calc(var(--vscode-sash-size) * -1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--vscode-sash-size) * -.5);left:calc(var(--vscode-sash-size) * -1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--vscode-sash-size) * -.5);right:calc(var(--vscode-sash-size) * -1)}.monaco-sash:before{content:"";pointer-events:none;position:absolute;width:100%;height:100%;background:transparent}.monaco-enable-motion .monaco-sash:before{transition:background-color .1s ease-out}.monaco-sash.hover:before,.monaco-sash.active:before{background:var(--vscode-sash-hoverBorder)}.monaco-sash.vertical:before{width:var(--vscode-sash-hover-size);left:calc(50% - (var(--vscode-sash-hover-size) / 2))}.monaco-sash.horizontal:before{height:var(--vscode-sash-hover-size);top:calc(50% - (var(--vscode-sash-hover-size) / 2))}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:#0ff}.monaco-sash.debug.disabled{background:#0ff3}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-split-view2{position:relative;width:100%;height:100%}.monaco-split-view2>.sash-container{position:absolute;width:100%;height:100%;pointer-events:none}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:initial}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{width:100%;height:100%;white-space:nowrap;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:initial;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:" ";position:absolute;top:0;left:0;z-index:5;pointer-events:none;background-color:var(--separator-border)}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:100%;width:1px}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:1px;width:100%}.monaco-table{display:flex;flex-direction:column;position:relative;height:100%;width:100%;white-space:nowrap;overflow:hidden}.monaco-table>.monaco-split-view2{border-bottom:1px solid transparent}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{display:flex;height:100%}.monaco-table-th{width:100%;height:100%;font-weight:700;overflow:hidden;text-overflow:ellipsis}.monaco-table-th,.monaco-table-td{box-sizing:border-box;flex-shrink:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:"";position:absolute;left:calc(var(--vscode-sash-size) / 2);width:0;border-left:1px solid transparent}.monaco-enable-motion .monaco-table>.monaco-split-view2,.monaco-enable-motion .monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}.monaco-diff-editor .diff-review{position:absolute}.monaco-component.diff-review{-moz-user-select:none;user-select:none;-webkit-user-select:none;z-index:99}.monaco-component.diff-review .diff-review-line-number{text-align:right;display:inline-block;color:var(--vscode-editorLineNumber-foreground)}.monaco-component.diff-review .diff-review-summary{padding-left:10px}.monaco-component.diff-review .diff-review-shadow{position:absolute;box-shadow:var(--vscode-scrollbar-shadow) 0 -6px 6px -6px inset}.monaco-component.diff-review .diff-review-row{white-space:pre}.monaco-component.diff-review .diff-review-table{display:table;min-width:100%}.monaco-component.diff-review .diff-review-row{display:table-row;width:100%}.monaco-component.diff-review .diff-review-spacer{display:inline-block;width:10px;vertical-align:middle}.monaco-component.diff-review .diff-review-spacer>.codicon{font-size:9px!important}.monaco-component.diff-review .diff-review-actions{display:inline-block;position:absolute;right:10px;top:2px;z-index:100}.monaco-component.diff-review .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-component.diff-review .revertButton{cursor:pointer}.monaco-component.diff-review .action-label{background:var(--vscode-editorActionList-background)}.monaco-toolbar{height:100%}.monaco-toolbar .toolbar-toggle-more{display:inline-block;padding:0}.monaco-toolbar.responsive .monaco-action-bar>.actions-container>.action-item{flex-shrink:1;min-width:20px}.monaco-editor .diff-hidden-lines-widget{width:100%}.monaco-editor .diff-hidden-lines{height:0px;transform:translateY(-10px);font-size:13px;line-height:14px}.monaco-editor .diff-hidden-lines:not(.dragging) .top:hover,.monaco-editor .diff-hidden-lines:not(.dragging) .bottom:hover,.monaco-editor .diff-hidden-lines .top.dragging,.monaco-editor .diff-hidden-lines .bottom.dragging{background-color:var(--vscode-focusBorder)}.monaco-editor .diff-hidden-lines .top,.monaco-editor .diff-hidden-lines .bottom{transition:background-color .1s ease-out;height:4px;background-color:transparent;background-clip:padding-box;border-bottom:2px solid transparent;border-top:4px solid transparent}.monaco-editor.draggingUnchangedRegion.canMoveTop:not(.canMoveBottom) *,.monaco-editor .diff-hidden-lines .top.canMoveTop:not(.canMoveBottom),.monaco-editor .diff-hidden-lines .bottom.canMoveTop:not(.canMoveBottom){cursor:n-resize!important}.monaco-editor.draggingUnchangedRegion:not(.canMoveTop).canMoveBottom *,.monaco-editor .diff-hidden-lines .top:not(.canMoveTop).canMoveBottom,.monaco-editor .diff-hidden-lines .bottom:not(.canMoveTop).canMoveBottom{cursor:s-resize!important}.monaco-editor.draggingUnchangedRegion.canMoveTop.canMoveBottom *,.monaco-editor .diff-hidden-lines .top.canMoveTop.canMoveBottom,.monaco-editor .diff-hidden-lines .bottom.canMoveTop.canMoveBottom{cursor:ns-resize!important}.monaco-editor .diff-hidden-lines .top{transform:translateY(4px)}.monaco-editor .diff-hidden-lines .bottom{transform:translateY(-6px)}.monaco-editor .diff-unchanged-lines{background:var(--vscode-diffEditor-unchangedCodeBackground)}.monaco-editor .noModificationsOverlay{z-index:1;background:var(--vscode-editor-background);display:flex;justify-content:center;align-items:center}.monaco-editor .diff-hidden-lines .center{background:var(--vscode-diffEditor-unchangedRegionBackground);color:var(--vscode-diffEditor-unchangedRegionForeground);overflow:hidden;display:block;text-overflow:ellipsis;white-space:nowrap;height:24px;box-shadow:inset 0 -5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow),inset 0 5px 5px -7px var(--vscode-diffEditor-unchangedRegionShadow)}.monaco-editor .diff-hidden-lines .center span.codicon{vertical-align:middle}.monaco-editor .diff-hidden-lines .center a:hover .codicon{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .diff-hidden-lines div.breadcrumb-item{cursor:pointer}.monaco-editor .diff-hidden-lines div.breadcrumb-item:hover{color:var(--vscode-editorLink-activeForeground)}.monaco-editor .movedOriginal,.monaco-editor .movedModified{border:2px solid var(--vscode-diffEditor-move-border)}.monaco-editor .movedOriginal.currentMove,.monaco-editor .movedModified.currentMove{border:2px solid var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path.currentMove{stroke:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines path{pointer-events:visiblestroke}.monaco-diff-editor .moved-blocks-lines .arrow{fill:var(--vscode-diffEditor-move-border)}.monaco-diff-editor .moved-blocks-lines .arrow.currentMove{fill:var(--vscode-diffEditor-moveActive-border)}.monaco-diff-editor .moved-blocks-lines .arrow-rectangle{fill:var(--vscode-editor-background)}.monaco-diff-editor .moved-blocks-lines{position:absolute;pointer-events:none}.monaco-diff-editor .moved-blocks-lines path{fill:none;stroke:var(--vscode-diffEditor-move-border);stroke-width:2}.monaco-editor .char-delete.diff-range-empty{margin-left:-1px;border-left:solid var(--vscode-diffEditor-removedTextBackground) 3px}.monaco-editor .char-insert.diff-range-empty{border-left:solid var(--vscode-diffEditor-insertedTextBackground) 3px}.monaco-editor .fold-unchanged{cursor:pointer}.monaco-diff-editor .diff-moved-code-block{display:flex;justify-content:flex-end;margin-top:-4px}.monaco-diff-editor .diff-moved-code-block .action-bar .action-label.codicon{width:12px;height:12px;font-size:12px}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:#00000008}.monaco-diff-editor.vs-dark .diffOverview{background:#ffffff03}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar{background:#0000}.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light .scrollbar{background:none}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:#ababab66}.modified-in-monaco-diff-editor.hc-black .slider.active,.modified-in-monaco-diff-editor.hc-light .slider.active{background:none}.monaco-editor .insert-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-diff-editor .delete-sign{font-size:11px!important;opacity:.7!important;display:flex!important;align-items:center}.monaco-editor.hc-black .insert-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .delete-sign,.monaco-editor.hc-light .insert-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .delete-sign{opacity:1}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .inline-added-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{z-index:10;position:absolute}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}.monaco-editor .char-insert,.monaco-diff-editor .char-insert{background-color:var(--vscode-diffEditor-insertedTextBackground)}.monaco-editor .line-insert,.monaco-diff-editor .line-insert{background-color:var(--vscode-diffEditor-insertedLineBackground, var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .line-insert,.monaco-editor .char-insert{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-insertedTextBorder)}.monaco-editor.hc-black .line-insert,.monaco-editor.hc-light .line-insert,.monaco-editor.hc-black .char-insert,.monaco-editor.hc-light .char-insert{border-style:dashed}.monaco-editor .line-delete,.monaco-editor .char-delete{box-sizing:border-box;border:1px solid var(--vscode-diffEditor-removedTextBorder)}.monaco-editor.hc-black .line-delete,.monaco-editor.hc-light .line-delete,.monaco-editor.hc-black .char-delete,.monaco-editor.hc-light .char-delete{border-style:dashed}.monaco-editor .inline-added-margin-view-zone,.monaco-editor .gutter-insert,.monaco-diff-editor .gutter-insert{background-color:var(--vscode-diffEditorGutter-insertedLineBackground, var(--vscode-diffEditor-insertedLineBackground), var(--vscode-diffEditor-insertedTextBackground))}.monaco-editor .char-delete,.monaco-diff-editor .char-delete,.monaco-editor .inline-deleted-text{background-color:var(--vscode-diffEditor-removedTextBackground)}.monaco-editor .inline-deleted-text{text-decoration:line-through}.monaco-editor .line-delete,.monaco-diff-editor .line-delete{background-color:var(--vscode-diffEditor-removedLineBackground, var(--vscode-diffEditor-removedTextBackground))}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .gutter-delete,.monaco-diff-editor .gutter-delete{background-color:var(--vscode-diffEditorGutter-removedLineBackground, var(--vscode-diffEditor-removedLineBackground), var(--vscode-diffEditor-removedTextBackground))}.monaco-diff-editor.side-by-side .editor.modified{box-shadow:-6px 0 5px -5px var(--vscode-scrollbar-shadow);border-left:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor.side-by-side .editor.original{box-shadow:6px 0 5px -5px var(--vscode-scrollbar-shadow);border-right:1px solid var(--vscode-diffEditor-border)}.monaco-diff-editor .diffViewport{background:var(--vscode-scrollbarSlider-background)}.monaco-diff-editor .diffViewport:hover{background:var(--vscode-scrollbarSlider-hoverBackground)}.monaco-diff-editor .diffViewport:active{background:var(--vscode-scrollbarSlider-activeBackground)}.monaco-editor .diagonal-fill{background-image:linear-gradient(-45deg,var(--vscode-diffEditor-diagonalFill) 12.5%,#0000 12.5%,#0000 50%,var(--vscode-diffEditor-diagonalFill) 50%,var(--vscode-diffEditor-diagonalFill) 62.5%,#0000 62.5%,#0000 100%);background-size:8px 8px}.monaco-diff-editor .gutter{position:relative;overflow:hidden;flex-shrink:0;flex-grow:0}.monaco-diff-editor .gutter>div{position:absolute}.monaco-diff-editor .gutter .gutterItem{opacity:0;transition:opacity .7s}.monaco-diff-editor .gutter .gutterItem.showAlways{opacity:1;transition:none}.monaco-diff-editor .gutter .gutterItem.noTransition{transition:none}.monaco-diff-editor .gutter:hover .gutterItem{opacity:1;transition:opacity .1s ease-in-out}.monaco-diff-editor .gutter .gutterItem .background{position:absolute;height:100%;left:50%;width:1px;border-left:2px var(--vscode-menu-separatorBackground) solid}.monaco-diff-editor .gutter .gutterItem .buttons{position:absolute;width:100%;display:flex;justify-content:center;align-items:center}.monaco-diff-editor .gutter .gutterItem .buttons .monaco-toolbar{height:-moz-fit-content;height:fit-content}.monaco-diff-editor .gutter .gutterItem .buttons .monaco-toolbar .monaco-action-bar{line-height:1}.monaco-diff-editor .gutter .gutterItem .buttons .monaco-toolbar .monaco-action-bar .actions-container{width:-moz-fit-content;width:fit-content;border-radius:4px;background:var(--vscode-editorGutter-itemBackground)}.monaco-diff-editor .gutter .gutterItem .buttons .monaco-toolbar .monaco-action-bar .actions-container .action-item:hover{background:var(--vscode-toolbar-hoverBackground)}.monaco-diff-editor .gutter .gutterItem .buttons .monaco-toolbar .monaco-action-bar .actions-container .action-item .action-label{color:var(--vscode-editorGutter-itemGlyphForeground);padding:1px 2px}.monaco-diff-editor .diff-hidden-lines-compact{display:flex;height:11px}.monaco-diff-editor .diff-hidden-lines-compact .line-left,.monaco-diff-editor .diff-hidden-lines-compact .line-right{height:1px;border-top:1px solid;border-color:var(--vscode-editorCodeLens-foreground);opacity:.5;margin:auto;width:100%}.monaco-diff-editor .diff-hidden-lines-compact .line-left{width:20px}.monaco-diff-editor .diff-hidden-lines-compact .text{color:var(--vscode-editorCodeLens-foreground);text-wrap:nowrap;font-size:11px;line-height:11px;margin:0 4px}.monaco-editor .line-delete-selectable{-moz-user-select:text!important;user-select:text!important;-webkit-user-select:text!important;z-index:1!important}.line-delete-selectable .view-line{-moz-user-select:text!important;user-select:text!important;-webkit-user-select:text!important}.monaco-editor .rendered-markdown kbd{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-radius:3px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow);vertical-align:middle;padding:1px 3px}.rendered-markdown li:has(input[type=checkbox]){list-style-type:none}.monaco-component.multiDiffEditor{background:var(--vscode-multiDiffEditor-background);position:relative;height:100%;width:100%;overflow-y:hidden}.monaco-component.multiDiffEditor>div{position:absolute;top:0;left:0;height:100%;width:100%}.monaco-component.multiDiffEditor>div.placeholder{visibility:hidden;display:grid;place-items:center;place-content:center}.monaco-component.multiDiffEditor>div.placeholder.visible{visibility:visible}.monaco-component.multiDiffEditor .active{--vscode-multiDiffEditor-border: var(--vscode-focusBorder)}.monaco-component.multiDiffEditor .multiDiffEntry{display:flex;flex-direction:column;flex:1;overflow:hidden}.monaco-component.multiDiffEditor .multiDiffEntry .collapse-button{margin:0 5px;cursor:pointer}.monaco-component.multiDiffEditor .multiDiffEntry .collapse-button a{display:block}.monaco-component.multiDiffEditor .multiDiffEntry .header{z-index:1000;background:var(--vscode-editor-background)}.monaco-component.multiDiffEditor .multiDiffEntry .header:not(.collapsed) .header-content{border-bottom:1px solid var(--vscode-sideBarSectionHeader-border)}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content{margin:8px 0 0;padding:4px 5px;border-top:1px solid var(--vscode-multiDiffEditor-border);display:flex;align-items:center;color:var(--vscode-foreground);background:var(--vscode-multiDiffEditor-headerBackground)}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content.shadow{box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content .file-path{display:flex;flex:1;min-width:0}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content .file-path .title{font-size:14px;line-height:22px}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content .file-path .title.original{flex:1;min-width:0;text-overflow:ellipsis}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content .file-path .status{font-weight:600;opacity:.75;margin:0 10px;line-height:22px}.monaco-component.multiDiffEditor .multiDiffEntry .header .header-content .actions{padding:0 8px}.monaco-component.multiDiffEditor .multiDiffEntry .editorParent{flex:1;display:flex;flex-direction:column;border-bottom:1px solid var(--vscode-multiDiffEditor-border);overflow:hidden}.monaco-component.multiDiffEditor .multiDiffEntry .editorContainer{flex:1}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{box-sizing:border-box;background-color:var(--vscode-editorBracketMatch-background);border:1px solid var(--vscode-editorBracketMatch-border)}.inline-editor-progress-decoration{display:inline-block;width:1em;height:1em}.inline-progress-widget{display:flex!important;justify-content:center;align-items:center}.inline-progress-widget .icon{font-size:80%!important}.inline-progress-widget:hover .icon{font-size:90%!important;animation:none}.inline-progress-widget:hover .icon:before{content:var(--vscode-icon-x-content);font-family:var(--vscode-icon-x-font-family)}.monaco-editor .monaco-editor-overlaymessage{padding-bottom:8px;z-index:10000}.monaco-editor .monaco-editor-overlaymessage.below{padding-bottom:0;padding-top:8px;z-index:10000}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:fadeIn .15s ease-out}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:fadeOut .1s ease-out}.monaco-editor .monaco-editor-overlaymessage .message{padding:2px 4px;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-inputValidation-infoBorder);border-radius:3px}.monaco-editor .monaco-editor-overlaymessage .message p{margin-block:0px}.monaco-editor .monaco-editor-overlaymessage .message a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-editor-overlaymessage .message a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{width:0!important;height:0!important;border-color:transparent;border-style:solid;z-index:1000;border-width:8px;position:absolute;left:2px}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top,.monaco-editor .monaco-editor-overlaymessage.below .anchor.below{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.action-widget{font-size:13px;min-width:100px;max-width:80vw;z-index:40;display:block;width:100%;border:1px solid var(--vscode-menu-border)!important;border-radius:5px;background-color:var(--vscode-menu-background);color:var(--vscode-menu-foreground);padding:4px;box-shadow:0 2px 8px var(--vscode-widget-shadow)}.context-view-block{position:fixed;cursor:initial;left:0;top:0;width:100%;height:100%;z-index:-1}.context-view-pointerBlock{position:fixed;cursor:initial;left:0;top:0;width:100%;height:100%;z-index:2}.action-widget .monaco-list{-moz-user-select:none;user-select:none;-webkit-user-select:none;border:none!important;border-width:0!important}.action-widget .monaco-list:focus:before{outline:0!important}.action-widget .monaco-list .monaco-scrollable-element{overflow:visible}.action-widget .monaco-list .monaco-list-row{padding:0 4px;white-space:nowrap;cursor:pointer;touch-action:none;width:100%;border-radius:3px}.action-widget .monaco-list .monaco-list-row.action.focused:not(.option-disabled){background-color:var(--vscode-list-activeSelectionBackground)!important;color:var(--vscode-list-activeSelectionForeground);outline:1px solid var(--vscode-menu-selectionBorder, transparent);outline-offset:-1px}.action-widget .monaco-list-row.group-header{color:var(--vscode-descriptionForeground)!important;font-weight:600;font-size:13px}.action-widget .monaco-list-row.group-header:not(:first-of-type){margin-top:2px}.action-widget .monaco-scrollable-element .monaco-list-rows .monaco-list-row.separator{border-top:1px solid var(--vscode-editorHoverWidget-border);color:var(--vscode-descriptionForeground);font-size:12px;padding:0;margin:4px 0 0;cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none;border-radius:0}.action-widget .monaco-scrollable-element .monaco-list-rows .monaco-list-row.separator.focused{outline:0 solid;background-color:transparent;border-radius:0}.action-widget .monaco-list-row.separator:first-of-type{border-top:none;margin-top:0}.action-widget .monaco-list .group-header,.action-widget .monaco-list .option-disabled,.action-widget .monaco-list .option-disabled:before,.action-widget .monaco-list .option-disabled .focused,.action-widget .monaco-list .option-disabled .focused:before{cursor:default!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent!important;outline:0 solid!important}.action-widget .monaco-list-row.action{display:flex;gap:4px;align-items:center}.action-widget .monaco-list-row.action.option-disabled,.action-widget .monaco-list:focus .monaco-list-row.focused.action.option-disabled,.action-widget .monaco-list-row.action.option-disabled .codicon,.action-widget .monaco-list:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused).option-disabled{color:var(--vscode-disabledForeground)}.action-widget .monaco-list-row.action:not(.option-disabled) .codicon{color:inherit}.action-widget .monaco-list-row.action .title{flex:1;overflow:hidden;text-overflow:ellipsis}.action-widget .monaco-list-row.action .monaco-keybinding>.monaco-keybinding-key{background-color:var(--vscode-keybindingLabel-background);color:var(--vscode-keybindingLabel-foreground);border-style:solid;border-width:1px;border-radius:3px;border-color:var(--vscode-keybindingLabel-border);border-bottom-color:var(--vscode-keybindingLabel-bottomBorder);box-shadow:inset 0 -1px 0 var(--vscode-widget-shadow)}.action-widget .action-widget-action-bar{background-color:var(--vscode-menu-background);border-top:1px solid var(--vscode-menu-border);margin-top:2px}.action-widget .action-widget-action-bar:before{display:block;content:"";width:100%}.action-widget .action-widget-action-bar .actions-container{padding:4px 8px 2px 24px}.action-widget-action-bar .action-label{color:var(--vscode-textLink-activeForeground);font-size:13px;line-height:22px;padding:0;pointer-events:all}.action-widget-action-bar .action-item{margin-right:16px;pointer-events:none}.action-widget-action-bar .action-label:hover{background-color:transparent!important}.monaco-action-bar .actions-container.highlight-toggled .action-label.checked{background:var(--vscode-actionBar-toggledBackground)!important}.action-widget .monaco-list .monaco-list-row .description{opacity:.7;margin-left:.5em}.post-edit-widget{box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:1px solid var(--vscode-widget-border, transparent);border-radius:4px;color:var(--vscode-button-foreground);background-color:var(--vscode-button-background);overflow:hidden}.post-edit-widget .monaco-button{padding:2px;border:none;border-radius:0}.post-edit-widget .monaco-button:hover{background-color:var(--vscode-button-hoverBackground)!important}.post-edit-widget .monaco-button .codicon{margin:0}@font-face{font-family:codicon;font-display:block;src:url(/codicon.ttf) format("truetype")}.codicon[class*=codicon-]{font: 16px/1 codicon;display:inline-block;text-decoration:none;text-rendering:auto;text-align:center;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-moz-user-select:none;user-select:none;-webkit-user-select:none}.codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(360deg)}}.codicon-sync.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-gear.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin{animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.monaco-editor .codicon.codicon-symbol-array,.monaco-workbench .codicon.codicon-symbol-array{color:var(--vscode-symbolIcon-arrayForeground)}.monaco-editor .codicon.codicon-symbol-boolean,.monaco-workbench .codicon.codicon-symbol-boolean{color:var(--vscode-symbolIcon-booleanForeground)}.monaco-editor .codicon.codicon-symbol-class,.monaco-workbench .codicon.codicon-symbol-class{color:var(--vscode-symbolIcon-classForeground)}.monaco-editor .codicon.codicon-symbol-method,.monaco-workbench .codicon.codicon-symbol-method{color:var(--vscode-symbolIcon-methodForeground)}.monaco-editor .codicon.codicon-symbol-color,.monaco-workbench .codicon.codicon-symbol-color{color:var(--vscode-symbolIcon-colorForeground)}.monaco-editor .codicon.codicon-symbol-constant,.monaco-workbench .codicon.codicon-symbol-constant{color:var(--vscode-symbolIcon-constantForeground)}.monaco-editor .codicon.codicon-symbol-constructor,.monaco-workbench .codicon.codicon-symbol-constructor{color:var(--vscode-symbolIcon-constructorForeground)}.monaco-editor .codicon.codicon-symbol-value,.monaco-workbench .codicon.codicon-symbol-value,.monaco-editor .codicon.codicon-symbol-enum,.monaco-workbench .codicon.codicon-symbol-enum{color:var(--vscode-symbolIcon-enumeratorForeground)}.monaco-editor .codicon.codicon-symbol-enum-member,.monaco-workbench .codicon.codicon-symbol-enum-member{color:var(--vscode-symbolIcon-enumeratorMemberForeground)}.monaco-editor .codicon.codicon-symbol-event,.monaco-workbench .codicon.codicon-symbol-event{color:var(--vscode-symbolIcon-eventForeground)}.monaco-editor .codicon.codicon-symbol-field,.monaco-workbench .codicon.codicon-symbol-field{color:var(--vscode-symbolIcon-fieldForeground)}.monaco-editor .codicon.codicon-symbol-file,.monaco-workbench .codicon.codicon-symbol-file{color:var(--vscode-symbolIcon-fileForeground)}.monaco-editor .codicon.codicon-symbol-folder,.monaco-workbench .codicon.codicon-symbol-folder{color:var(--vscode-symbolIcon-folderForeground)}.monaco-editor .codicon.codicon-symbol-function,.monaco-workbench .codicon.codicon-symbol-function{color:var(--vscode-symbolIcon-functionForeground)}.monaco-editor .codicon.codicon-symbol-interface,.monaco-workbench .codicon.codicon-symbol-interface{color:var(--vscode-symbolIcon-interfaceForeground)}.monaco-editor .codicon.codicon-symbol-key,.monaco-workbench .codicon.codicon-symbol-key{color:var(--vscode-symbolIcon-keyForeground)}.monaco-editor .codicon.codicon-symbol-keyword,.monaco-workbench .codicon.codicon-symbol-keyword{color:var(--vscode-symbolIcon-keywordForeground)}.monaco-editor .codicon.codicon-symbol-module,.monaco-workbench .codicon.codicon-symbol-module{color:var(--vscode-symbolIcon-moduleForeground)}.monaco-editor .codicon.codicon-symbol-namespace,.monaco-workbench .codicon.codicon-symbol-namespace{color:var(--vscode-symbolIcon-namespaceForeground)}.monaco-editor .codicon.codicon-symbol-null,.monaco-workbench .codicon.codicon-symbol-null{color:var(--vscode-symbolIcon-nullForeground)}.monaco-editor .codicon.codicon-symbol-number,.monaco-workbench .codicon.codicon-symbol-number{color:var(--vscode-symbolIcon-numberForeground)}.monaco-editor .codicon.codicon-symbol-object,.monaco-workbench .codicon.codicon-symbol-object{color:var(--vscode-symbolIcon-objectForeground)}.monaco-editor .codicon.codicon-symbol-operator,.monaco-workbench .codicon.codicon-symbol-operator{color:var(--vscode-symbolIcon-operatorForeground)}.monaco-editor .codicon.codicon-symbol-package,.monaco-workbench .codicon.codicon-symbol-package{color:var(--vscode-symbolIcon-packageForeground)}.monaco-editor .codicon.codicon-symbol-property,.monaco-workbench .codicon.codicon-symbol-property{color:var(--vscode-symbolIcon-propertyForeground)}.monaco-editor .codicon.codicon-symbol-reference,.monaco-workbench .codicon.codicon-symbol-reference{color:var(--vscode-symbolIcon-referenceForeground)}.monaco-editor .codicon.codicon-symbol-snippet,.monaco-workbench .codicon.codicon-symbol-snippet{color:var(--vscode-symbolIcon-snippetForeground)}.monaco-editor .codicon.codicon-symbol-string,.monaco-workbench .codicon.codicon-symbol-string{color:var(--vscode-symbolIcon-stringForeground)}.monaco-editor .codicon.codicon-symbol-struct,.monaco-workbench .codicon.codicon-symbol-struct{color:var(--vscode-symbolIcon-structForeground)}.monaco-editor .codicon.codicon-symbol-text,.monaco-workbench .codicon.codicon-symbol-text{color:var(--vscode-symbolIcon-textForeground)}.monaco-editor .codicon.codicon-symbol-type-parameter,.monaco-workbench .codicon.codicon-symbol-type-parameter{color:var(--vscode-symbolIcon-typeParameterForeground)}.monaco-editor .codicon.codicon-symbol-unit,.monaco-workbench .codicon.codicon-symbol-unit{color:var(--vscode-symbolIcon-unitForeground)}.monaco-editor .codicon.codicon-symbol-variable,.monaco-workbench .codicon.codicon-symbol-variable{color:var(--vscode-symbolIcon-variableForeground)}.monaco-editor .lightBulbWidget{display:flex;align-items:center;justify-content:center}.monaco-editor .lightBulbWidget:hover{cursor:pointer}.monaco-editor .lightBulbWidget.codicon-light-bulb,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .lightBulbWidget.codicon-lightbulb-autofix,.monaco-editor .lightBulbWidget.codicon-lightbulb-sparkle-autofix{color:var(--vscode-editorLightBulbAutoFix-foreground, var(--vscode-editorLightBulb-foreground))}.monaco-editor .lightBulbWidget.codicon-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground, var(--vscode-icon-foreground))}.monaco-editor .lightBulbWidget:before{position:relative;z-index:2}.monaco-editor .lightBulbWidget:after{position:absolute;top:0;left:0;content:"";display:block;width:100%;height:100%;opacity:.3;z-index:1}.monaco-editor .glyph-margin-widgets .cgmr[class*=codicon-gutter-lightbulb]{display:block;cursor:pointer}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle{color:var(--vscode-editorLightBulb-foreground)}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-auto-fix,.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-aifix-auto-fix{color:var(--vscode-editorLightBulbAutoFix-foreground, var(--vscode-editorLightBulb-foreground))}.monaco-editor .glyph-margin-widgets .cgmr.codicon-gutter-lightbulb-sparkle-filled{color:var(--vscode-editorLightBulbAi-foreground, var(--vscode-icon-foreground))}.monaco-editor .codelens-decoration{overflow:hidden;display:inline-flex!important;align-items:center;text-overflow:ellipsis;white-space:nowrap;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize);padding-right:calc(var(--vscode-editorCodeLens-fontSize)*.5);font-feature-settings:var(--vscode-editorCodeLens-fontFeatureSettings);font-family:var(--vscode-editorCodeLens-fontFamily),var(--vscode-editorCodeLens-fontFamilyDefault)}.monaco-editor .codelens-decoration>span,.monaco-editor .codelens-decoration>a{-moz-user-select:none;user-select:none;-webkit-user-select:none;white-space:nowrap;vertical-align:sub;display:inline-flex;align-items:center}.monaco-editor .codelens-decoration>a{text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon[class*=codicon-]{vertical-align:middle;color:currentColor!important;color:var(--vscode-editorCodeLens-foreground);line-height:var(--vscode-editorCodeLens-lineHeight);font-size:var(--vscode-editorCodeLens-fontSize)}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:fadein .1s linear}.monaco-editor .inlineSuggestionsHints{padding:4px}.monaco-editor .inlineSuggestionsHints .warningMessage p{margin:0}.monaco-editor .inlineSuggestionsHints.withBorder{z-index:39;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .inlineSuggestionsHints a,.monaco-editor .inlineSuggestionsHints a:hover{color:var(--vscode-foreground)!important}.monaco-editor .inlineSuggestionsHints .keybinding{display:flex;margin-left:4px;opacity:.6}.monaco-editor .inlineSuggestionsHints .keybinding .monaco-keybinding-key{font-size:8px;padding:2px 3px}.monaco-editor .inlineSuggestionsHints .availableSuggestionCount a{display:flex;min-width:19px;justify-content:center}.monaco-editor .inlineSuggestionStatusBarItemLabel{margin-right:2px}.monaco-editor .find-widget{position:absolute;z-index:35;height:33px;overflow:hidden;line-height:19px;transition:transform .2s linear;padding:0 4px;box-sizing:border-box;transform:translateY(calc(-100% - 10px));box-shadow:0 0 8px 2px var(--vscode-widget-shadow);color:var(--vscode-editorWidget-foreground);border-left:1px solid var(--vscode-widget-border);border-right:1px solid var(--vscode-widget-border);border-bottom:1px solid var(--vscode-widget-border);border-bottom-left-radius:4px;border-bottom-right-radius:4px;background-color:var(--vscode-editorWidget-background)}.monaco-reduce-motion .monaco-editor .find-widget{transition:transform 0ms linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px;outline-color:var(--vscode-focusBorder)}.monaco-editor .find-widget .monaco-inputbox .input{background-color:transparent;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:3px 25px 0 17px;font-size:12px;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions{height:25px;display:flex;align-items:center}.monaco-editor .find-widget>.replace-part .replace-actions{height:25px;display:flex;align-items:center}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;display:flex;flex:1}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{display:flex;flex:initial;margin:0 0 0 3px;padding:2px 0 0 2px;height:25px;vertical-align:middle;box-sizing:border-box;text-align:center;line-height:23px}.monaco-editor .find-widget .button{width:16px;height:16px;padding:3px;border-radius:5px;flex:initial;margin-left:3px;background-position:center center;background-repeat:no-repeat;cursor:pointer;display:flex;align-items:center;justify-content:center}.monaco-editor .find-widget .codicon-find-selection{width:22px;height:22px;padding:3px;border-radius:5px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{position:absolute;top:0;left:3px;width:18px;height:100%;border-radius:0;box-sizing:border-box}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{position:relative;display:flex;vertical-align:middle;flex:auto;flex-grow:0;flex-shrink:0}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .find-widget.no-results .matchesCount{color:var(--vscode-errorForeground)}.monaco-editor .findMatch{animation-duration:0;animation-name:inherit!important;background-color:var(--vscode-editor-findMatchHighlightBackground)}.monaco-editor .currentFindMatch{background-color:var(--vscode-editor-findMatchBackground);border:2px solid var(--vscode-editor-findMatchBorder);padding:1px;box-sizing:border-box}.monaco-editor .findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor .find-widget .monaco-sash{left:0!important;background-color:var(--vscode-editorWidget-resizeBorder, var(--vscode-editorWidget-border))}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-editor .find-widget .button:not(.disabled):hover,.monaco-editor .find-widget .codicon-find-selection:hover{background-color:var(--vscode-toolbar-hoverBackground)!important}.monaco-editor.findMatch{background-color:var(--vscode-editor-findMatchHighlightBackground)}.monaco-editor.currentFindMatch{background-color:var(--vscode-editor-findMatchBackground)}.monaco-editor.findScope{background-color:var(--vscode-editor-findRangeHighlightBackground)}.monaco-editor.findMatch{background-color:var(--vscode-editorWidget-background)}.monaco-editor .find-widget>.button.codicon-widget-close{position:absolute;top:5px;right:4px}.colorpicker-widget{height:190px;-moz-user-select:none;user-select:none;-webkit-user-select:none}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{border:solid .1em #000;box-sizing:border-box;margin:.1em .2em 0;width:.8em;height:.8em;line-height:.8em;display:inline-block;cursor:pointer}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:solid .1em #eee}.colorpicker-header{display:flex;height:24px;position:relative;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-header .picked-color{width:240px;display:flex;align-items:center;justify-content:center;line-height:24px;cursor:pointer;color:#fff;flex:1;white-space:nowrap;overflow:hidden}.colorpicker-header .picked-color .picked-color-presentation{white-space:nowrap;margin-left:5px;margin-right:5px}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.standalone-colorpicker{color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header.standalone-colorpicker{border-bottom:none}.colorpicker-header .close-button{cursor:pointer;background-color:var(--vscode-editorHoverWidget-background);border-left:1px solid var(--vscode-editorHoverWidget-border)}.colorpicker-header .close-button-inner-div{width:100%;height:100%;text-align:center}.colorpicker-header .close-button-inner-div:hover{background-color:var(--vscode-toolbar-hoverBackground)}.colorpicker-header .close-icon{padding:3px}.colorpicker-body{display:flex;padding:8px;position:relative}.colorpicker-body .saturation-wrap{overflow:hidden;height:150px;position:relative;min-width:220px;flex:1}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid rgb(255,255,255);border-radius:100%;box-shadow:0 0 2px #000c;position:absolute}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .standalone-strip{width:25px;height:122px}.colorpicker-body .hue-strip{position:relative;margin-left:8px;cursor:grab;background:linear-gradient(to bottom,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.colorpicker-body .opacity-strip{position:relative;margin-left:8px;cursor:grab;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{position:absolute;top:0;left:-2px;width:calc(100% + 4px);height:4px;box-sizing:border-box;border:1px solid rgba(255,255,255,.71);box-shadow:0 0 1px #000000d9}.colorpicker-body .strip .overlay{height:150px;pointer-events:none}.colorpicker-body .standalone-strip .standalone-overlay{height:122px;pointer-events:none}.standalone-colorpicker-body{display:block;border:1px solid transparent;border-bottom:1px solid var(--vscode-editorHoverWidget-border);overflow:hidden}.colorpicker-body .insert-button{position:absolute;height:20px;width:58px;padding:0;right:8px;bottom:8px;background:var(--vscode-button-background);color:var(--vscode-button-foreground);border-radius:2px;border:none;cursor:pointer}.colorpicker-body .insert-button:hover{background:var(--vscode-button-hoverBackground)}.monaco-editor .peekview-widget .head{box-sizing:border-box;display:flex;justify-content:space-between;flex-wrap:nowrap}.monaco-editor .peekview-widget .head .peekview-title{display:flex;align-items:baseline;font-size:13px;margin-left:20px;min-width:0;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){font-size:.9em;margin-left:.5em}.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.monaco-editor .peekview-widget .head .peekview-title .dirname,.monaco-editor .peekview-widget .head .peekview-title .filename{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:"-";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{flex:1;text-align:right;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{margin-right:4px;align-self:center}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}.monaco-editor .zone-widget{position:absolute;z-index:10}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-bottom-style:solid;border-top-width:0;border-bottom-width:0;position:relative}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{display:inline-block;vertical-align:top}.monaco-editor .reference-zone-widget .messages{height:100%;width:100%;text-align:center;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{line-height:23px;background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground)}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{display:inline-flex;width:100%;height:100%;color:var(--vscode-peekViewResult-fileForeground)}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-right:12px;margin-left:auto}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{color:var(--vscode-peekViewResult-fileForeground)!important;background-color:var(--vscode-peekViewResult-matchHighlightBackground)!important}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder, transparent);box-sizing:border-box}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{display:inline-block;vertical-align:text-top;margin-right:4px}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{display:inline-block;padding-right:5px}.monaco-editor .marker-widget .descriptioncontainer{position:absolute;white-space:pre;-moz-user-select:text;user-select:text;-webkit-user-select:text;padding:8px 12px 0 20px}.monaco-editor .marker-widget .descriptioncontainer .message{display:flex;flex-direction:column}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:"("}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:")"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under;color:var(--vscode-textLink-activeForeground)}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer;color:var(--vscode-textLink-activeForeground)}.monaco-editor .zone-widget .codicon.codicon-error,.markers-panel .marker-icon.error,.markers-panel .marker-icon .codicon.codicon-error,.text-search-provider-messages .providerMessage .codicon.codicon-error,.extensions-viewlet>.extensions .codicon.codicon-error,.extension-editor .codicon.codicon-error,.chat-attached-context-attachment .codicon.codicon-error{color:var(--vscode-problemsErrorIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-warning,.markers-panel .marker-icon.warning,.markers-panel .marker-icon .codicon.codicon-warning,.text-search-provider-messages .providerMessage .codicon.codicon-warning,.extensions-viewlet>.extensions .codicon.codicon-warning,.extension-editor .codicon.codicon-warning,.preferences-editor .codicon.codicon-warning{color:var(--vscode-problemsWarningIcon-foreground)}.monaco-editor .zone-widget .codicon.codicon-info,.markers-panel .marker-icon.info,.markers-panel .marker-icon .codicon.codicon-info,.text-search-provider-messages .providerMessage .codicon.codicon-info,.extensions-viewlet>.extensions .codicon.codicon-info,.extension-editor .codicon.codicon-info{color:var(--vscode-problemsInfoIcon-foreground)}.monaco-editor .hoverHighlight{background-color:var(--vscode-editor-hoverHighlightBackground)}.monaco-editor .monaco-resizable-hover{border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px;box-sizing:content-box}.monaco-editor .monaco-resizable-hover>.monaco-hover{border:none;border-radius:none}.monaco-editor .monaco-hover{border:1px solid var(--vscode-editorHoverWidget-border);border-radius:3px;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background)}.monaco-editor .monaco-hover a{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .monaco-hover .hover-row{display:flex}.monaco-editor .monaco-hover .hover-row.hover-row-with-copy{position:relative;padding-right:20px}.monaco-editor .monaco-hover .hover-row .hover-row-contents{min-width:0;display:flex;flex-direction:column}.monaco-editor .monaco-hover .hover-row .verbosity-actions{border-right:1px solid var(--vscode-editorHoverWidget-border);width:22px;overflow-y:clip}.monaco-editor .monaco-hover .hover-row .verbosity-actions-inner{display:flex;flex-direction:column;padding-left:5px;padding-right:5px;justify-content:flex-end;position:relative}.monaco-editor .monaco-hover .hover-row .verbosity-actions-inner .codicon{cursor:pointer;font-size:11px}.monaco-editor .monaco-hover .hover-row .verbosity-actions-inner .codicon.enabled{color:var(--vscode-textLink-foreground)}.monaco-editor .monaco-hover .hover-row .verbosity-actions-inner .codicon.disabled{opacity:.6}.monaco-editor .monaco-hover .hover-row .actions{background-color:var(--vscode-editorHoverWidget-statusBarBackground)}.monaco-editor .monaco-hover code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .monaco-hover .hover-copy-button{position:absolute;top:4px;right:4px;padding:2px 4px;border-radius:3px;display:flex;align-items:center;justify-content:center;opacity:0}.monaco-editor .monaco-hover .hover-row-with-copy:hover .hover-copy-button,.monaco-editor .monaco-hover .hover-row-with-copy:focus-within .hover-copy-button{opacity:1}.monaco-editor .monaco-hover .hover-copy-button:hover{background-color:var(--vscode-toolbar-hoverBackground);cursor:pointer}.monaco-editor .monaco-hover .hover-copy-button:focus{outline:1px solid var(--vscode-focusBorder);outline-offset:-1px}.monaco-editor .monaco-hover .hover-copy-button .codicon{font-size:16px;color:var(--vscode-foreground)}.monaco-editor.vs .dnd-target,.monaco-editor.hc-light .dnd-target{border-right:2px dotted black;color:#fff}.monaco-editor.vs-dark .dnd-target{border-right:2px dotted #AEAFAD;color:#51504f}.monaco-editor.hc-black .dnd-target{border-right:2px dotted #fff;color:#000}.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines,.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.hc-light.mac.mouse-default .view-lines{cursor:default}.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines,.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.hc-light.mac.mouse-copy .view-lines{cursor:copy}.monaco-editor .findOptionsWidget{background-color:var(--vscode-editorWidget-background);color:var(--vscode-editorWidget-foreground);box-shadow:0 0 8px 2px var(--vscode-widget-shadow);border:2px solid var(--vscode-contrastBorder)}.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-collapsed{cursor:pointer;opacity:0;transition:opacity .5s;display:flex;align-items:center;justify-content:center;font-size:140%;margin-left:2px}.monaco-reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-reduce-motion .monaco-editor .margin-view-overlays .codicon-folding-collapsed{transition:initial}.monaco-editor .margin-view-overlays:hover .codicon,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons{opacity:1}.monaco-editor .inline-folded:after{color:var(--vscode-editor-foldPlaceholderForeground);margin:.1em .2em 0;content:"⋯";display:inline;line-height:1em;cursor:pointer}.monaco-editor .folded-background{background-color:var(--vscode-editor-foldBackground)}.monaco-editor .cldr.codicon.codicon-folding-expanded,.monaco-editor .cldr.codicon.codicon-folding-collapsed,.monaco-editor .cldr.codicon.codicon-folding-manual-expanded,.monaco-editor .cldr.codicon.codicon-folding-manual-collapsed{color:var(--vscode-editorGutter-foldingControlForeground)!important}.monaco-editor .snippet-placeholder{min-width:2px;outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetTabstopHighlightBackground, transparent);outline-color:var(--vscode-editor-snippetTabstopHighlightBorder, transparent)}.monaco-editor .finish-snippet-placeholder{outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground, transparent);outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder, transparent)}.monaco-editor .suggest-widget{width:430px;z-index:40;display:flex;flex-direction:column;border-radius:3px}.monaco-editor .suggest-widget.message{flex-direction:row;align-items:center}.monaco-editor .suggest-widget,.monaco-editor .suggest-details{flex:0 1 auto;width:100%;border-style:solid;border-width:1px;border-color:var(--vscode-editorSuggestWidget-border);background-color:var(--vscode-editorSuggestWidget-background)}.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-light .suggest-widget,.monaco-editor.hc-light .suggest-details{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{box-sizing:border-box;display:none;flex-flow:row nowrap;justify-content:space-between;width:100%;font-size:80%;padding:0 4px;border-top:1px solid var(--vscode-editorSuggestWidget-border);overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:", ";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{height:100%;width:100%}.monaco-editor .suggest-widget .monaco-list{-moz-user-select:none;user-select:none;-webkit-user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{display:flex;-mox-box-sizing:border-box;box-sizing:border-box;padding-right:10px;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;touch-action:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;overflow:hidden;padding-left:2px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{display:flex;overflow:hidden;text-overflow:ellipsis;white-space:pre;justify-content:space-between}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;font-size:14px;cursor:pointer}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{overflow:hidden;text-overflow:ellipsis;opacity:.6}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{margin-left:12px;opacity:.4;font-size:85%;line-height:initial;text-overflow:ellipsis;overflow:hidden;align-self:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{font-size:85%;margin-left:1.1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-shrink:1;flex-grow:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{overflow:hidden;flex-shrink:4;max-width:70%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:inline-block;position:absolute;right:10px;width:18px;height:18px;visibility:hidden}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{display:block;height:16px;width:16px;margin-left:2px;background-repeat:no-repeat;background-size:80%;background-position:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{display:flex;align-items:center;margin-right:4px}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{margin:0 0 0 .3em;border:.1em solid #000;width:.7em;height:.7em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{display:flex;flex-direction:column;cursor:default;color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-details:focus{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;height:100%;width:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{flex:2;overflow:hidden;text-overflow:ellipsis;opacity:.7;white-space:pre;margin:0 24px 0 0;padding:4px 0 4px 5px}.monaco-editor .suggest-details.detail-and-doc>.monaco-scrollable-element>.body>.header>.type{padding-bottom:12px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{margin:0;padding:4px 5px;white-space:pre-wrap}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{padding:0;white-space:initial;min-height:calc(1rem + 8px)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ul,.monaco-editor .suggest-details ol{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:transparent;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{display:inline-block;cursor:pointer;text-decoration:underline;text-underline-position:under}.monaco-editor .ghost-text-hidden{opacity:0;font-size:0}.monaco-editor .ghost-text-decoration,.monaco-editor .suggest-preview-text .ghost-text{font-style:italic}.monaco-editor .suggest-preview-text.clickable .view-line{z-index:1}.monaco-editor .ghost-text-decoration.clickable,.monaco-editor .ghost-text-decoration-preview.clickable,.monaco-editor .suggest-preview-text.clickable .ghost-text{cursor:pointer}.monaco-editor .inline-completion-text-to-replace{text-decoration:underline;text-underline-position:under}.monaco-editor .ghost-text-decoration,.monaco-editor .ghost-text-decoration-preview,.monaco-editor .suggest-preview-text .ghost-text{background-color:var(--vscode-editorGhostText-background);border:1px solid var(--vscode-editorGhostText-border)}.monaco-editor .ghost-text-decoration.syntax-highlighted,.monaco-editor .ghost-text-decoration-preview.syntax-highlighted,.monaco-editor .suggest-preview-text .ghost-text.syntax-highlighted{opacity:.7}.monaco-editor .ghost-text-decoration:not(.syntax-highlighted),.monaco-editor .ghost-text-decoration-preview:not(.syntax-highlighted),.monaco-editor .suggest-preview-text .ghost-text:not(.syntax-highlighted){color:var(--vscode-editorGhostText-foreground)}.monaco-editor .ghost-text-decoration.warning,.monaco-editor .ghost-text-decoration-preview.warning,.monaco-editor .suggest-preview-text .ghost-text.warning{background:var(--monaco-editor-warning-decoration) repeat-x bottom left;border-bottom:4px double var(--vscode-editorWarning-border)}.ghost-text-view-warning-widget-icon .codicon{color:var(--vscode-editorWarning-foreground)!important}.monaco-editor .edits-fadeout-decoration{opacity:var(--animation-opacity, 1);background-color:var(--vscode-inlineEdit-modifiedChangedTextBackground)}.monaco-editor .sticky-widget{overflow:hidden;border-bottom:1px solid var(--vscode-editorStickyScroll-border);width:100%;box-shadow:var(--vscode-editorStickyScroll-shadow) 0 4px 2px -2px;z-index:4;right:initial!important;margin-left:"0px"}.monaco-editor .sticky-widget .sticky-widget-line-numbers{float:left;background-color:var(--vscode-editorStickyScrollGutter-background)}.monaco-editor .sticky-widget.peek .sticky-widget-line-numbers{background-color:var(--vscode-peekViewEditorStickyScrollGutter-background)}.monaco-editor .sticky-widget .sticky-widget-lines-scrollable{display:inline-block;position:absolute;overflow:hidden;width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:var(--vscode-editorStickyScroll-background)}.monaco-editor .sticky-widget.peek .sticky-widget-lines-scrollable{background-color:var(--vscode-peekViewEditorStickyScroll-background)}.monaco-editor .sticky-widget .sticky-widget-lines{position:absolute;background-color:inherit}.monaco-editor .sticky-widget .sticky-line-number,.monaco-editor .sticky-widget .sticky-line-content{color:var(--vscode-editorLineNumber-foreground);white-space:nowrap;display:inline-block;position:absolute;background-color:inherit}.monaco-editor .sticky-widget .sticky-line-number .codicon-folding-expanded,.monaco-editor .sticky-widget .sticky-line-number .codicon-folding-collapsed{float:right;transition:var(--vscode-editorStickyScroll-foldingOpacityTransition);position:absolute;margin-left:2px}.monaco-editor .sticky-widget .sticky-line-content{width:var(--vscode-editorStickyScroll-scrollableWidth);background-color:inherit;white-space:nowrap}.monaco-editor .sticky-widget .sticky-line-number-inner{display:inline-block;text-align:right}.monaco-editor .sticky-widget .sticky-line-content:hover{background-color:var(--vscode-editorStickyScrollHover-background);cursor:pointer}.monaco-editor .inline-edits-view-indicator{display:flex;z-index:34;height:20px;color:var(--vscode-inlineEdit-gutterIndicator-primaryForeground);background-color:var(--vscode-inlineEdit-gutterIndicator-background);border:1px solid var(--vscode-inlineEdit-gutterIndicator-primaryBorder);border-radius:3px;align-items:center;padding:2px 10px 2px 2px;margin:0 4px;opacity:0}.monaco-editor .inline-edits-view-indicator.contained{transition:opacity .2s ease-in-out;transition-delay:.4s}.monaco-editor .inline-edits-view-indicator.visible,.monaco-editor .inline-edits-view-indicator.top{opacity:1}.monaco-editor .inline-edits-view-indicator.top .icon{transform:rotate(90deg)}.monaco-editor .inline-edits-view-indicator.bottom{opacity:1}.monaco-editor .inline-edits-view-indicator.bottom .icon{transform:rotate(-90deg)}.monaco-editor .inline-edits-view-indicator .icon{display:flex;align-items:center;margin:0 2px;transform:none;transition:transform .2s ease-in-out}.monaco-editor .inline-edits-view-indicator .icon .codicon{color:var(--vscode-inlineEdit-gutterIndicator-primaryForeground)}.monaco-editor .inline-edits-view-indicator .label{margin:0 2px;display:flex;justify-content:center;width:100%}.monaco-editor .inline-edits-view .editorContainer .preview .monaco-editor .view-overlays .current-line-exact,.monaco-editor .inline-edits-view .editorContainer .preview .monaco-editor .current-line-margin{border:none}.monaco-editor .inline-edits-view .editorContainer .inline-edits-view-zone.diagonal-fill{opacity:.5}.monaco-editor .strike-through{text-decoration:line-through}.monaco-editor .inlineCompletions-line-insert{background:var(--vscode-inlineEdit-modifiedChangedLineBackground)}.monaco-editor .inlineCompletions-line-delete{background:var(--vscode-inlineEdit-originalChangedLineBackground)}.monaco-editor .inlineCompletions-char-insert{background:var(--vscode-inlineEdit-modifiedChangedTextBackground);cursor:pointer}.monaco-editor .inlineCompletions-char-delete{background:var(--vscode-inlineEdit-originalChangedTextBackground)}.monaco-editor .inlineCompletions-char-delete.diff-range-empty{margin-left:-1px;border-left:solid var(--vscode-inlineEdit-originalChangedTextBackground) 3px}.monaco-editor .inlineCompletions-char-insert.diff-range-empty{border-left:solid var(--vscode-inlineEdit-modifiedChangedTextBackground) 3px}.monaco-editor .inlineCompletions-char-delete.single-line-inline{border:1px solid var(--vscode-editorHoverWidget-border);margin:-2px 0 0 -2px}.monaco-editor .inlineCompletions-char-insert.single-line-inline{border-top:1px solid var(--vscode-inlineEdit-modifiedBorder);border-bottom:1px solid var(--vscode-inlineEdit-modifiedBorder)}.monaco-editor .inlineCompletions-char-insert.single-line-inline.start{border-top-left-radius:4px;border-bottom-left-radius:4px;border-left:1px solid var(--vscode-inlineEdit-modifiedBorder)}.monaco-editor .inlineCompletions-char-insert.single-line-inline.end{border-top-right-radius:4px;border-bottom-right-radius:4px;border-right:1px solid var(--vscode-inlineEdit-modifiedBorder)}.monaco-editor .inlineCompletions-char-delete.single-line-inline.empty,.monaco-editor .inlineCompletions-char-insert.single-line-inline.empty{display:none}.monaco-editor .inlineCompletions.strike-through{text-decoration-thickness:1px}.monaco-editor .inlineCompletions-modified-bubble{background:var(--vscode-inlineEdit-modifiedChangedTextBackground)}.monaco-editor .inlineCompletions-original-bubble{background:var(--vscode-inlineEdit-originalChangedTextBackground)}.monaco-editor .inlineCompletions-modified-bubble,.monaco-editor .inlineCompletions-original-bubble{pointer-events:none;display:inline-block}.monaco-editor .inline-edit.ghost-text,.monaco-editor .inline-edit.ghost-text-decoration,.monaco-editor .inline-edit.ghost-text-decoration-preview,.monaco-editor .inline-edit.suggest-preview-text .ghost-text{font-style:normal!important}.monaco-editor .inline-edit.ghost-text.syntax-highlighted,.monaco-editor .inline-edit.ghost-text-decoration.syntax-highlighted,.monaco-editor .inline-edit.ghost-text-decoration-preview.syntax-highlighted,.monaco-editor .inline-edit.suggest-preview-text .ghost-text.syntax-highlighted{opacity:1!important}.monaco-editor .inline-edit.modified-background.ghost-text,.monaco-editor .inline-edit.modified-background.ghost-text-decoration,.monaco-editor .inline-edit.modified-background.ghost-text-decoration-preview,.monaco-editor .inline-edit.modified-background.suggest-preview-text .ghost-text{background:var(--vscode-inlineEdit-modifiedChangedTextBackground)!important;display:inline-block!important}.monaco-editor .inlineCompletions-original-lines{background:var(--vscode-editor-background)}.monaco-menu-option{color:var(--vscode-editorActionList-foreground);font-size:13px;padding:0 4px;line-height:28px;display:flex;gap:4px;align-items:center;border-radius:3px;cursor:pointer}.monaco-menu-option .monaco-keybinding-key{font-size:13px;opacity:.7}.monaco-menu-option.active{background:var(--vscode-editorActionList-focusBackground);color:var(--vscode-editorActionList-focusForeground);outline:1px solid var(--vscode-menu-selectionBorder, transparent);outline-offset:-1px}.monaco-menu-option.active .monaco-keybinding-key{color:var(--vscode-editorActionList-focusForeground)}.monaco-editor .goto-definition-link{text-decoration:underline;cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor.vs .valueSetReplacement{outline:solid 2px var(--vscode-editorBracketMatch-border)}.monaco-editor .linked-editing-decoration{background-color:var(--vscode-editor-linkedEditingBackground);min-width:1px}.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-decoration:underline;text-underline-position:under}.monaco-editor .detected-link-active{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .scroll-editor-on-middle-click-dot{cursor:all-scroll;position:absolute;z-index:1;background-color:var(--vscode-editor-foreground, white);border:1px solid var(--vscode-editor-background, black);opacity:.5;width:5px;height:5px;border-radius:50%;transform:translate(-50%,-50%)}.monaco-editor .scroll-editor-on-middle-click-dot.hidden{display:none}.monaco-editor.scroll-editor-on-middle-click-editor *{cursor:all-scroll}.monaco-editor .focused .selectionHighlight{background-color:var(--vscode-editor-selectionHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-selectionHighlightBorder)}.monaco-editor.hc-black .focused .selectionHighlight,.monaco-editor.hc-light .focused .selectionHighlight{border-style:dotted}.monaco-editor .wordHighlight{background-color:var(--vscode-editor-wordHighlightBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightBorder)}.monaco-editor.hc-black .wordHighlight,.monaco-editor.hc-light .wordHighlight{border-style:dotted}.monaco-editor .wordHighlightStrong{background-color:var(--vscode-editor-wordHighlightStrongBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightStrongBorder)}.monaco-editor.hc-black .wordHighlightStrong,.monaco-editor.hc-light .wordHighlightStrong{border-style:dotted}.monaco-editor .wordHighlightText{background-color:var(--vscode-editor-wordHighlightTextBackground);box-sizing:border-box;border:1px solid var(--vscode-editor-wordHighlightTextBorder)}.monaco-editor.hc-black .wordHighlightText,.monaco-editor.hc-light .wordHighlightText{border-style:dotted}.monaco-editor .parameter-hints-widget{z-index:39;display:flex;flex-direction:column;line-height:1.5em;cursor:default;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.hc-black .monaco-editor .parameter-hints-widget,.hc-light .monaco-editor .parameter-hints-widget{border-width:2px}.monaco-editor .parameter-hints-widget>.phwrapper{max-width:440px;display:flex;flex-direction:row}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.multiple .body:before{content:"";display:block;height:100%;position:absolute;opacity:.5;border-left:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .monaco-scrollable-element,.monaco-editor .parameter-hints-widget .body{display:flex;flex:1;flex-direction:column;min-height:100%}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px;position:relative}.monaco-editor .parameter-hints-widget .signature.has-docs:after{content:"";display:block;position:absolute;left:0;width:100%;padding-top:4px;opacity:.5;border-bottom:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor .parameter-hints-widget .code{font-family:var(--vscode-parameterHintsWidget-editorFontFamily),var(--vscode-parameterHintsWidget-editorFontFamilyDefault)}.monaco-editor .parameter-hints-widget .docs{padding:0 10px 0 5px;white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs a{color:var(--vscode-textLink-foreground)}.monaco-editor .parameter-hints-widget .docs a:hover{color:var(--vscode-textLink-activeForeground);cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:initial}.monaco-editor .parameter-hints-widget .docs code{font-family:var(--monaco-monospace-font);border-radius:3px;padding:0 .4em;background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source,.monaco-editor .parameter-hints-widget .docs .code{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .controls{display:none;flex-direction:column;align-items:center;min-width:22px;justify-content:flex-end}.monaco-editor .parameter-hints-widget.multiple .controls{display:flex;padding:0 2px}.monaco-editor .parameter-hints-widget.multiple .button{width:16px;height:16px;background-repeat:no-repeat;cursor:pointer}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{color:var(--vscode-editorHoverWidget-highlightForeground);font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{font-weight:700;margin-right:.5em}.monaco-editor .editorPlaceholder{top:0;position:absolute;overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap;pointer-events:none;color:var(--vscode-editor-placeholder-foreground)}.monaco-editor .rename-box{z-index:100;color:inherit;border-radius:4px}.monaco-editor .rename-box.preview{padding:4px 4px 0}.monaco-editor .rename-box .rename-input-with-button{padding:3px;border-radius:2px;width:calc(100% - 8px)}.monaco-editor .rename-box .rename-input{width:calc(100% - 8px);padding:0}.monaco-editor .rename-box .rename-input:focus{outline:none}.monaco-editor .rename-box .rename-suggestions-button{display:flex;align-items:center;padding:3px;background-color:transparent;border:none;border-radius:5px;cursor:pointer}.monaco-editor .rename-box .rename-suggestions-button:hover{background-color:var(--vscode-toolbar-hoverBackground)}.monaco-editor .rename-box .rename-candidate-list-container .monaco-list-row{border-radius:2px}.monaco-editor .rename-box .rename-label{display:none;opacity:.8}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .unicode-highlight{border:1px solid var(--vscode-editorUnicodeHighlight-border);background-color:var(--vscode-editorUnicodeHighlight-background);box-sizing:border-box}.editor-banner{box-sizing:border-box;cursor:default;width:100%;font-size:12px;display:flex;overflow:visible;height:26px;background:var(--vscode-banner-background)}.editor-banner .icon-container{display:flex;flex-shrink:0;align-items:center;padding:0 6px 0 10px}.editor-banner .icon-container.custom-icon{background-repeat:no-repeat;background-position:center center;background-size:16px;width:16px;padding:0;margin:0 6px 0 10px}.editor-banner .message-container{display:flex;align-items:center;line-height:26px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.editor-banner .message-container p{margin-block-start:0;margin-block-end:0}.editor-banner .message-actions-container{flex-grow:1;flex-shrink:0;line-height:26px;margin:0 4px}.editor-banner .message-actions-container a.monaco-button{width:inherit;margin:2px 8px;padding:0 12px}.editor-banner .message-actions-container a{padding:3px;margin-left:12px;text-decoration:underline}.editor-banner .action-container{padding:0 10px 0 6px}.editor-banner{background-color:var(--vscode-banner-background)}.editor-banner,.editor-banner .action-container .codicon,.editor-banner .message-actions-container .monaco-link{color:var(--vscode-banner-foreground)}.editor-banner .icon-container .codicon{color:var(--vscode-banner-iconForeground)}.monaco-link{color:var(--vscode-textLink-foreground)}.monaco-link:hover{color:var(--vscode-textLink-activeForeground)}.floating-menu-overlay-widget{padding:0;color:var(--vscode-button-foreground);background-color:var(--vscode-button-background);border-radius:2px;border:1px solid var(--vscode-contrastBorder);display:flex;align-items:center;z-index:10;box-shadow:0 2px 8px var(--vscode-widget-shadow);overflow:hidden}.floating-menu-overlay-widget .action-item>.action-label{padding:5px;font-size:12px;border-radius:2px}.floating-menu-overlay-widget .action-item>.action-label.codicon{color:var(--vscode-button-foreground)}.floating-menu-overlay-widget .action-item>.action-label.codicon:not(.separator){padding-top:6px;padding-bottom:6px}.floating-menu-overlay-widget .action-item:first-child>.action-label{padding-left:7px}.floating-menu-overlay-widget .action-item:last-child>.action-label{padding-right:7px}.floating-menu-overlay-widget .action-item .action-label.separator{background-color:var(--vscode-menu-separatorBackground)}.monaco-editor .iPadShowKeyboard{width:58px;min-width:0;height:36px;min-height:0;margin:0;padding:0;position:absolute;resize:none;overflow:hidden;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjNDI0MjQyIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) center center no-repeat;border:4px solid #F6F6F6;border-radius:4px}.monaco-editor.vs-dark .iPadShowKeyboard{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIHZpZXdCb3g9IjAgMCA1MyAzNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwKSI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDguMDM2NCA0LjAxMDQySDQuMDA3NzlMNC4wMDc3OSAzMi4wMjg2SDQ4LjAzNjRWNC4wMTA0MlpNNC4wMDc3OSAwLjAwNzgxMjVDMS43OTcyMSAwLjAwNzgxMjUgMC4wMDUxODc5OSAxLjc5OTg0IDAuMDA1MTg3OTkgNC4wMTA0MlYzMi4wMjg2QzAuMDA1MTg3OTkgMzQuMjM5MiAxLjc5NzIxIDM2LjAzMTIgNC4wMDc3OSAzNi4wMzEySDQ4LjAzNjRDNTAuMjQ3IDM2LjAzMTIgNTIuMDM5IDM0LjIzOTIgNTIuMDM5IDMyLjAyODZWNC4wMTA0MkM1Mi4wMzkgMS43OTk4NCA1MC4yNDcgMC4wMDc4MTI1IDQ4LjAzNjQgMC4wMDc4MTI1SDQuMDA3NzlaTTguMDEwNDIgOC4wMTMwMkgxMi4wMTNWMTIuMDE1Nkg4LjAxMDQyVjguMDEzMDJaTTIwLjAxODIgOC4wMTMwMkgxNi4wMTU2VjEyLjAxNTZIMjAuMDE4MlY4LjAxMzAyWk0yNC4wMjA4IDguMDEzMDJIMjguMDIzNFYxMi4wMTU2SDI0LjAyMDhWOC4wMTMwMlpNMzYuMDI4NiA4LjAxMzAySDMyLjAyNlYxMi4wMTU2SDM2LjAyODZWOC4wMTMwMlpNNDAuMDMxMiA4LjAxMzAySDQ0LjAzMzlWMTIuMDE1Nkg0MC4wMzEyVjguMDEzMDJaTTE2LjAxNTYgMTYuMDE4Mkg4LjAxMDQyVjIwLjAyMDhIMTYuMDE1NlYxNi4wMTgyWk0yMC4wMTgyIDE2LjAxODJIMjQuMDIwOFYyMC4wMjA4SDIwLjAxODJWMTYuMDE4MlpNMzIuMDI2IDE2LjAxODJIMjguMDIzNFYyMC4wMjA4SDMyLjAyNlYxNi4wMTgyWk00NC4wMzM5IDE2LjAxODJWMjAuMDIwOEgzNi4wMjg2VjE2LjAxODJINDQuMDMzOVpNMTIuMDEzIDI0LjAyMzRIOC4wMTA0MlYyOC4wMjZIMTIuMDEzVjI0LjAyMzRaTTE2LjAxNTYgMjQuMDIzNEgzNi4wMjg2VjI4LjAyNkgxNi4wMTU2VjI0LjAyMzRaTTQ0LjAzMzkgMjQuMDIzNEg0MC4wMzEyVjI4LjAyNkg0NC4wMzM5VjI0LjAyMzRaIiBmaWxsPSIjQzVDNUM1Ii8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDAiPgo8cmVjdCB3aWR0aD0iNTMiIGhlaWdodD0iMzYiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==) center center no-repeat;border:4px solid #252526}.monaco-editor .tokens-inspect-widget{z-index:50;-moz-user-select:text;user-select:text;-webkit-user-select:text;padding:10px;color:var(--vscode-editorHoverWidget-foreground);background-color:var(--vscode-editorHoverWidget-background);border:1px solid var(--vscode-editorHoverWidget-border)}.monaco-editor.hc-black .tokens-inspect-widget,.monaco-editor.hc-light .tokens-inspect-widget{border-width:2px}.monaco-editor .tokens-inspect-widget .tokens-inspect-separator{height:1px;border:0;background-color:var(--vscode-editorHoverWidget-border)}.monaco-editor .tokens-inspect-widget .tm-token{font-family:var(--monaco-monospace-font)}.monaco-editor .tokens-inspect-widget .tm-token-length{font-weight:400;font-size:60%;float:right}.monaco-editor .tokens-inspect-widget .tm-metadata-table{width:100%}.monaco-editor .tokens-inspect-widget .tm-metadata-value{font-family:var(--monaco-monospace-font);text-align:right}.monaco-editor .tokens-inspect-widget .tm-token-type{font-family:var(--monaco-monospace-font)}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;background:#f7f6f3;color:#1f2328;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}*{box-sizing:border-box}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-5{bottom:1.25rem}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-1{right:.25rem}.right-4{right:1rem}.right-5{right:1.25rem}.right-6{right:1.5rem}.top-1{top:.25rem}.top-20{top:5rem}.top-4{top:1rem}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.\!mt-0{margin-top:0!important}.mb-2{margin-bottom:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[88px\]{height:88px}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[140px\]{max-height:140px}.max-h-\[180px\]{max-height:180px}.max-h-\[220px\]{max-height:220px}.max-h-\[240px\]{max-height:240px}.max-h-\[320px\]{max-height:320px}.max-h-\[420px\]{max-height:420px}.max-h-\[560px\]{max-height:560px}.max-h-\[620px\]{max-height:620px}.max-h-\[calc\(100\%-136px\)\]{max-height:calc(100% - 136px)}.max-h-\[calc\(100\%-180px\)\]{max-height:calc(100% - 180px)}.\!min-h-\[280px\]{min-height:280px!important}.\!min-h-\[34px\]{min-height:34px!important}.\!min-h-\[40px\]{min-height:40px!important}.min-h-0{min-height:0px}.min-h-\[180px\]{min-height:180px}.min-h-\[420px\]{min-height:420px}.min-h-\[calc\(100vh-4rem\)\]{min-height:calc(100vh - 4rem)}.min-h-screen{min-height:100vh}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[268px\]{width:268px}.w-\[360px\]{width:360px}.w-\[380px\]{width:380px}.w-\[420px\]{width:420px}.w-\[56px\]{width:56px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[240px\]{min-width:240px}.min-w-\[260px\]{min-width:260px}.min-w-\[56px\]{min-width:56px}.max-w-\[1040px\]{max-width:1040px}.max-w-\[1080px\]{max-width:1080px}.max-w-\[320px\]{max-width:320px}.max-w-\[360px\]{max-width:360px}.max-w-\[420px\]{max-width:420px}.max-w-\[460px\]{max-width:460px}.max-w-\[520px\]{max-width:520px}.max-w-\[56px\]{max-width:56px}.max-w-\[920px\]{max-width:920px}.max-w-\[960px\]{max-width:960px}.max-w-\[980px\]{max-width:980px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[260px_minmax\(0\,1fr\)\]{grid-template-columns:260px minmax(0,1fr)}.grid-cols-\[320px_minmax\(0\,1fr\)\]{grid-template-columns:320px minmax(0,1fr)}.grid-cols-\[360px_minmax\(0\,1fr\)\]{grid-template-columns:360px minmax(0,1fr)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-1{row-gap:.25rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded-\[18px\]{border-radius:18px!important}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-\[14px\]{border-radius:14px}.rounded-\[16px\]{border-radius:16px}.rounded-\[18px\]{border-radius:18px}.rounded-\[20px\]{border-radius:20px}.rounded-\[22px\]{border-radius:22px}.rounded-\[24px\]{border-radius:24px}.rounded-\[28px\]{border-radius:28px}.rounded-\[32px\]{border-radius:32px}.rounded-\[36px\]{border-radius:36px}.rounded-\[38px\]{border-radius:38px}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.\!border-\[\#E8E1D8\]{--tw-border-opacity: 1 !important;border-color:rgb(232 225 216 / var(--tw-border-opacity, 1))!important}.border-\[\#D9E5CB\]{--tw-border-opacity: 1;border-color:rgb(217 229 203 / var(--tw-border-opacity, 1))}.border-\[\#DCE8C8\]{--tw-border-opacity: 1;border-color:rgb(220 232 200 / var(--tw-border-opacity, 1))}.border-\[\#E5DED3\]{--tw-border-opacity: 1;border-color:rgb(229 222 211 / var(--tw-border-opacity, 1))}.border-\[\#E5E1DA\]{--tw-border-opacity: 1;border-color:rgb(229 225 218 / var(--tw-border-opacity, 1))}.border-\[\#E6E0D6\]{--tw-border-opacity: 1;border-color:rgb(230 224 214 / var(--tw-border-opacity, 1))}.border-\[\#E6E0D7\]{--tw-border-opacity: 1;border-color:rgb(230 224 215 / var(--tw-border-opacity, 1))}.border-\[\#E6E3DE\]{--tw-border-opacity: 1;border-color:rgb(230 227 222 / var(--tw-border-opacity, 1))}.border-\[\#E8E2D9\]{--tw-border-opacity: 1;border-color:rgb(232 226 217 / var(--tw-border-opacity, 1))}.border-\[\#E8E4DD\]{--tw-border-opacity: 1;border-color:rgb(232 228 221 / var(--tw-border-opacity, 1))}.border-\[\#E9D6AE\]{--tw-border-opacity: 1;border-color:rgb(233 214 174 / var(--tw-border-opacity, 1))}.border-\[\#EADBB8\]{--tw-border-opacity: 1;border-color:rgb(234 219 184 / var(--tw-border-opacity, 1))}.border-\[\#EAE4DB\]{--tw-border-opacity: 1;border-color:rgb(234 228 219 / var(--tw-border-opacity, 1))}.border-\[\#ECE7DF\]{--tw-border-opacity: 1;border-color:rgb(236 231 223 / var(--tw-border-opacity, 1))}.border-\[\#EEEAE4\]{--tw-border-opacity: 1;border-color:rgb(238 234 228 / var(--tw-border-opacity, 1))}.border-\[\#F0D7D0\]{--tw-border-opacity: 1;border-color:rgb(240 215 208 / var(--tw-border-opacity, 1))}.border-\[\#F1ECE5\]{--tw-border-opacity: 1;border-color:rgb(241 236 229 / var(--tw-border-opacity, 1))}.border-\[\#F2CCC4\]{--tw-border-opacity: 1;border-color:rgb(242 204 196 / var(--tw-border-opacity, 1))}.border-\[\#F3D3CD\]{--tw-border-opacity: 1;border-color:rgb(243 211 205 / var(--tw-border-opacity, 1))}.border-\[color\:var\(--accent-border\)\]{border-color:var(--accent-border)}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-black\/10{border-color:#0000001a}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.\!bg-\[\#FAF8F4\]{--tw-bg-opacity: 1 !important;background-color:rgb(250 248 244 / var(--tw-bg-opacity, 1))!important}.\!bg-white{--tw-bg-opacity: 1 !important;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))!important}.bg-\[\#18181B\]{--tw-bg-opacity: 1;background-color:rgb(24 24 27 / var(--tw-bg-opacity, 1))}.bg-\[\#1A1A1A\]{--tw-bg-opacity: 1;background-color:rgb(26 26 26 / var(--tw-bg-opacity, 1))}.bg-\[\#ECEAE6\]{--tw-bg-opacity: 1;background-color:rgb(236 234 230 / var(--tw-bg-opacity, 1))}.bg-\[\#EEF3FF\]{--tw-bg-opacity: 1;background-color:rgb(238 243 255 / var(--tw-bg-opacity, 1))}.bg-\[\#F2F1EE\]{--tw-bg-opacity: 1;background-color:rgb(242 241 238 / var(--tw-bg-opacity, 1))}.bg-\[\#F3F0EA\]{--tw-bg-opacity: 1;background-color:rgb(243 240 234 / var(--tw-bg-opacity, 1))}.bg-\[\#F5FBEE\]{--tw-bg-opacity: 1;background-color:rgb(245 251 238 / var(--tw-bg-opacity, 1))}.bg-\[\#F7EDE4\]{--tw-bg-opacity: 1;background-color:rgb(247 237 228 / var(--tw-bg-opacity, 1))}.bg-\[\#F7F2E8\]{--tw-bg-opacity: 1;background-color:rgb(247 242 232 / var(--tw-bg-opacity, 1))}.bg-\[\#FAF8F4\]{--tw-bg-opacity: 1;background-color:rgb(250 248 244 / var(--tw-bg-opacity, 1))}.bg-\[\#FCFBF8\]{--tw-bg-opacity: 1;background-color:rgb(252 251 248 / var(--tw-bg-opacity, 1))}.bg-\[\#FFF4F1\]{--tw-bg-opacity: 1;background-color:rgb(255 244 241 / var(--tw-bg-opacity, 1))}.bg-\[\#FFF5F2\]{--tw-bg-opacity: 1;background-color:rgb(255 245 242 / var(--tw-bg-opacity, 1))}.bg-\[\#FFF7E6\]{--tw-bg-opacity: 1;background-color:rgb(255 247 230 / var(--tw-bg-opacity, 1))}.bg-\[\#FFF8EB\]{--tw-bg-opacity: 1;background-color:rgb(255 248 235 / var(--tw-bg-opacity, 1))}.bg-\[\#FFFCF8\]{--tw-bg-opacity: 1;background-color:rgb(255 252 248 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/70{background-color:#ffffffb3}.bg-white\/80{background-color:#fffc}.p-0\.5{padding:.125rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.\!px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pr-1{padding-right:.25rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[28px\]{font-size:28px}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-tight{line-height:1.25}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.16em\]{letter-spacing:.16em}.tracking-wide{letter-spacing:.025em}.text-\[\#315A84\]{--tw-text-opacity: 1;color:rgb(49 90 132 / var(--tw-text-opacity, 1))}.text-\[\#5C7A2D\]{--tw-text-opacity: 1;color:rgb(92 122 45 / var(--tw-text-opacity, 1))}.text-\[\#8E6A3D\]{--tw-text-opacity: 1;color:rgb(142 106 61 / var(--tw-text-opacity, 1))}.text-\[\#9B4D19\]{--tw-text-opacity: 1;color:rgb(155 77 25 / var(--tw-text-opacity, 1))}.text-\[\#9B6A1C\]{--tw-text-opacity: 1;color:rgb(155 106 28 / var(--tw-text-opacity, 1))}.text-\[\#B15647\]{--tw-text-opacity: 1;color:rgb(177 86 71 / var(--tw-text-opacity, 1))}.text-\[color\:var\(--accent-text\)\]{color:var(--accent-text)}.text-\[var\(--accent\,\#2563eb\)\]{color:var(--accent,#2563eb)}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.\!no-underline{text-decoration-line:none!important}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-\[0_10px_20px_rgba\(17\,24\,39\,0\.05\)\]{--tw-shadow: 0 10px 20px rgba(17,24,39,.05);--tw-shadow-colored: 0 10px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_10px_24px_rgba\(31\,28\,24\,0\.04\)\]{--tw-shadow: 0 10px 24px rgba(31,28,24,.04);--tw-shadow-colored: 0 10px 24px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_12px_30px_rgba\(37\,99\,235\,0\.08\)\]{--tw-shadow: 0 12px 30px rgba(37,99,235,.08);--tw-shadow-colored: 0 12px 30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_18px_36px_rgba\(17\,24\,39\,0\.16\)\]{--tw-shadow: 0 18px 36px rgba(17,24,39,.16);--tw-shadow-colored: 0 18px 36px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_22px_46px_rgba\(17\,24\,39\,0\.16\)\]{--tw-shadow: 0 22px 46px rgba(17,24,39,.16);--tw-shadow-colored: 0 22px 46px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_22px_54px_rgba\(17\,24\,39\,0\.06\)\]{--tw-shadow: 0 22px 54px rgba(17,24,39,.06);--tw-shadow-colored: 0 22px 54px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_24px_56px_rgba\(17\,24\,39\,0\.18\)\]{--tw-shadow: 0 24px 56px rgba(17,24,39,.18);--tw-shadow-colored: 0 24px 56px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_26px_64px_rgba\(17\,24\,39\,0\.08\)\]{--tw-shadow: 0 26px 64px rgba(17,24,39,.08);--tw-shadow-colored: 0 26px 64px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_26px_64px_rgba\(17\,24\,39\,0\.16\)\]{--tw-shadow: 0 26px 64px rgba(17,24,39,.16);--tw-shadow-colored: 0 26px 64px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_28px_70px_rgba\(15\,23\,42\,0\.08\)\]{--tw-shadow: 0 28px 70px rgba(15,23,42,.08);--tw-shadow-colored: 0 28px 70px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_30px_72px_rgba\(15\,23\,42\,0\.08\)\]{--tw-shadow: 0 30px 72px rgba(15,23,42,.08);--tw-shadow-colored: 0 30px 72px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#827a6e38;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#827a6e5c}.studio-rail{width:68px;flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:10px;padding:16px 10px;border-right:1px solid #e8e4dd;background:#fbfaf8}.studio-shell[data-color-mode=dark] .studio-rail{border-right-color:#223047;background:#0d1422}.studio-shell{--accent: #2563eb;--accent-rgb: 37, 99, 235;--accent-strong: #1d4ed8;--accent-text: #2555c7;--accent-gradient-start: #2563eb;--accent-gradient-end: #2563eb;--accent-soft-start: #f2f6ff;--accent-soft-end: #ebf2ff;--accent-icon-surface: #e8f0ff;--accent-border: rgba(var(--accent-rgb), .22);--accent-shadow: rgba(var(--accent-rgb), .08);--accent-shadow-strong: rgba(var(--accent-rgb), .14);--accent-focus: rgba(var(--accent-rgb), .09)}.studio-shell[data-appearance=coral]{--accent: #f0483e;--accent-rgb: 240, 72, 62;--accent-strong: #df3f35;--accent-text: #f0483e;--accent-gradient-start: #f0483e;--accent-gradient-end: #f0483e;--accent-soft-start: #fff8f5;--accent-soft-end: #fff1ec;--accent-icon-surface: #ffebe4;--accent-border: rgba(var(--accent-rgb), .24);--accent-shadow: rgba(var(--accent-rgb), .08);--accent-shadow-strong: rgba(var(--accent-rgb), .14);--accent-focus: rgba(var(--accent-rgb), .08)}.studio-shell[data-appearance=forest]{--accent: #2f8f6a;--accent-rgb: 47, 143, 106;--accent-strong: #227554;--accent-text: #227554;--accent-gradient-start: #2f8f6a;--accent-gradient-end: #2f8f6a;--accent-soft-start: #f4fbf7;--accent-soft-end: #eaf7f0;--accent-icon-surface: #e4f4ea;--accent-border: rgba(var(--accent-rgb), .24);--accent-shadow: rgba(var(--accent-rgb), .08);--accent-shadow-strong: rgba(var(--accent-rgb), .14);--accent-focus: rgba(var(--accent-rgb), .1)}.studio-shell[data-color-mode=dark]{color-scheme:dark;background:#0b1220;--accent-soft-start: rgba(var(--accent-rgb), .16);--accent-soft-end: rgba(var(--accent-rgb), .24);--accent-icon-surface: rgba(var(--accent-rgb), .22);--accent-border: rgba(var(--accent-rgb), .42);--accent-shadow: rgba(var(--accent-rgb), .18);--accent-shadow-strong: rgba(var(--accent-rgb), .3);--accent-focus: rgba(var(--accent-rgb), .18)}.studio-shell[data-color-mode=dark] .bg-\[\#F2F1EE\],.studio-shell[data-color-mode=dark] .bg-\[\#ECEAE6\]{background-color:#0b1220}.studio-shell[data-color-mode=dark] .bg-white,.studio-shell[data-color-mode=dark] .bg-white\/70,.studio-shell[data-color-mode=dark] .bg-white\/80,.studio-shell[data-color-mode=dark] .bg-white\/90,.studio-shell[data-color-mode=dark] .bg-white\/92,.studio-shell[data-color-mode=dark] .bg-white\/94,.studio-shell[data-color-mode=dark] .bg-white\/96{background-color:#0f172af0}.studio-shell[data-color-mode=dark] .bg-\[\#FAF8F4\],.studio-shell[data-color-mode=dark] .bg-\[\#F6F2EC\],.studio-shell[data-color-mode=dark] .bg-\[\#F3F0EA\],.studio-shell[data-color-mode=dark] .bg-\[\#ECE8E2\]{background-color:#111b2d}.studio-shell[data-color-mode=dark] .border-\[\#E6E3DE\],.studio-shell[data-color-mode=dark] .border-\[\#EEEAE4\],.studio-shell[data-color-mode=dark] .border-\[\#E5E1DA\],.studio-shell[data-color-mode=dark] .border-\[\#EAE4DB\],.studio-shell[data-color-mode=dark] .border-\[\#F1ECE5\],.studio-shell[data-color-mode=dark] .border-gray-100{border-color:#223047}.studio-shell[data-color-mode=dark] .text-gray-900,.studio-shell[data-color-mode=dark] .text-gray-800{color:#e5e7eb}.studio-shell[data-color-mode=dark] .text-gray-700,.studio-shell[data-color-mode=dark] .text-gray-600{color:#cbd5e1}.studio-shell[data-color-mode=dark] .text-gray-500,.studio-shell[data-color-mode=dark] .text-gray-400{color:#94a3b8}.studio-shell[data-color-mode=dark] .text-gray-300{color:#64748b}.studio-shell[data-color-mode=dark] .hover\:bg-\[\#FAF8F4\]:hover,.studio-shell[data-color-mode=dark] .hover\:bg-\[\#F6F2EC\]:hover,.studio-shell[data-color-mode=dark] .hover\:bg-white:hover{background-color:#162236}.studio-brand-mark{background:var(--accent);box-shadow:none}.rail-button,.drawer-icon-button,.panel-icon-button{display:inline-flex;align-items:center;justify-content:center;border:1px solid #e7e3dc;background:#fffffff5;color:#5b6470;transition:border-color .18s ease,background .18s ease,color .18s ease}.studio-shell[data-color-mode=dark] .rail-button,.studio-shell[data-color-mode=dark] .drawer-icon-button,.studio-shell[data-color-mode=dark] .panel-icon-button{border-color:#2a3a52;background:#0f172af0;color:#cbd5e1}.rail-button{width:40px;height:40px;border-radius:14px;box-shadow:none}.rail-button:hover,.drawer-icon-button:hover,.panel-icon-button:hover{border-color:#d9d4cc;background:#f7f6f3;color:#1f2328}.studio-shell[data-color-mode=dark] .rail-button:hover,.studio-shell[data-color-mode=dark] .drawer-icon-button:hover,.studio-shell[data-color-mode=dark] .panel-icon-button:hover{border-color:#3a4c68;background:#162236;color:#f8fafc}.rail-button.active,.drawer-icon-button.active{border-color:var(--accent-border);background:linear-gradient(180deg,var(--accent-soft-start) 0%,var(--accent-soft-end) 100%);color:var(--accent);box-shadow:none}.drawer-icon-button{width:38px;height:38px;border-radius:12px;box-shadow:none}.panel-icon-button{width:30px;height:30px;border-radius:10px}.ask-ai-surface{background:#fff;border-color:#e8e4dd;border-radius:20px;box-shadow:0 18px 40px #11182714}.ask-ai-trigger{background:#fff;border-radius:16px;box-shadow:0 12px 28px #11182714!important}.studio-shell[data-color-mode=dark] .ask-ai-surface,.studio-shell[data-color-mode=dark] .ask-ai-trigger{background:#0f172a}.panel-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:18px 18px 16px}.panel-eyebrow{font-size:11px;line-height:1;text-transform:uppercase;letter-spacing:.16em;color:#a39a8f}.studio-shell[data-color-mode=dark] .panel-eyebrow,.studio-shell[data-color-mode=dark] .section-heading,.studio-shell[data-color-mode=dark] .field-label,.studio-shell[data-color-mode=dark] .toolbar-input-label{color:#7f90a8}.panel-title{margin-top:6px;font-size:20px;line-height:1.1;font-weight:700;color:#201f1d}.studio-shell[data-color-mode=dark] .panel-title{color:#f8fafc}.panel-block{padding:16px 18px}.section-heading,.field-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.14em;color:#a39a8f}.search-field{display:flex;align-items:center;gap:10px;min-height:40px;padding:0 12px;border:1px solid #e7e3dc;border-radius:12px;background:#fff}.studio-shell[data-color-mode=dark] .search-field{border-color:#2a3a52;background:#111b2d}.search-input{width:100%;background:transparent;border:0;outline:none;font-size:13px;color:#3c3834}.search-input::-moz-placeholder{color:#aea59a}.search-input::placeholder{color:#aea59a}.studio-shell[data-color-mode=dark] .search-input,.studio-shell[data-color-mode=dark] .studio-title-input{color:#e5e7eb}.studio-shell[data-color-mode=dark] .search-input::-moz-placeholder,.studio-shell[data-color-mode=dark] .studio-title-input::-moz-placeholder{color:#64748b}.studio-shell[data-color-mode=dark] .search-input::placeholder,.studio-shell[data-color-mode=dark] .studio-title-input::placeholder{color:#64748b}.panel-input,.panel-textarea{width:100%;border:1px solid #e7e3dc;border-radius:12px;background:#fff;color:#24211f;outline:none;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}.studio-shell[data-color-mode=dark] .panel-input,.studio-shell[data-color-mode=dark] .panel-textarea{border-color:#2a3a52;background:#0f172a;color:#e5e7eb}.panel-input{min-height:40px;padding:0 12px;font-size:13px}.panel-textarea{min-height:120px;padding:12px;font-size:12px;line-height:1.55;resize:vertical;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.panel-input:focus,.panel-textarea:focus{border-color:rgba(var(--accent-rgb),.32);box-shadow:0 0 0 3px var(--accent-focus);background:#fffdfc}.studio-shell[data-color-mode=dark] .panel-input:focus,.studio-shell[data-color-mode=dark] .panel-textarea:focus{background:#111b2d}.solid-action,.ghost-action{display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:0 14px;border-radius:12px;font-size:12px;font-weight:700;transition:border-color .18s ease,background .18s ease,color .18s ease}.solid-action{border:1px solid rgba(var(--accent-rgb),.16);background:var(--accent);color:#fff;box-shadow:none}.solid-action:hover{background:var(--accent-strong)}.ghost-action{border:1px solid #e7e3dc;background:#fff;color:#4f5562}.studio-shell[data-color-mode=dark] .ghost-action{border-color:#2a3a52;background:#0f172a;color:#dbe4f0}.ghost-action:hover{background:#f7f6f3;border-color:#d9d4cc}.studio-shell[data-color-mode=dark] .ghost-action:hover{background:#162236;border-color:#3a4c68}.studio-editor-header{position:relative;z-index:120;overflow:visible;min-height:0;flex-shrink:0;display:flex;align-items:stretch;flex-wrap:wrap;gap:10px;padding:16px 20px 14px;border-bottom:1px solid #e8e4dd;background:#fbfaf8f5;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.studio-shell[data-color-mode=dark] .studio-editor-header{border-bottom-color:#223047;background:#0d1422f5}.app-auth-anchor{position:fixed;top:12px;right:16px;z-index:320;display:flex;justify-content:flex-end;max-width:min(320px,calc(100vw - 20px));pointer-events:none}.app-auth-anchor>*{pointer-events:auto}.workspace-page-header,.studio-editor-header{padding-right:clamp(220px,25vw,360px)}.studio-editor-toolbar{width:100%;min-width:0;display:flex;align-items:center;gap:10px;flex-wrap:wrap}@media (max-width: 1180px){.workspace-page-header,.studio-editor-header{padding-right:clamp(170px,22vw,250px)}.studio-title-bar{order:3;flex-basis:100%}}.studio-title-bar{min-width:0;flex:1 1 420px;max-width:100%;display:flex;align-items:center;gap:8px;min-height:40px;padding:0 6px 0 12px;border:1px solid #e8e4dd;border-radius:12px;background:#fff;box-shadow:none}.studio-shell[data-color-mode=dark] .studio-title-bar{border-color:#2a3a52;background:#0f172a;box-shadow:none}.studio-title-group{min-width:0;flex:1 1 auto;display:flex;align-items:center;gap:10px}.studio-title-input{min-width:0;width:100%;background:transparent;border:0;outline:none;font-size:15px;font-weight:700;letter-spacing:-.02em;line-height:1.2;color:#1f2937}.studio-title-input::-moz-placeholder{color:#9e958a}.studio-title-input::placeholder{color:#9e958a}.studio-header-actions{display:flex;align-items:center;gap:6px;padding-left:10px;margin-left:6px;border-left:1px solid #ece8e2}.studio-shell[data-color-mode=dark] .studio-header-actions{border-left-color:#223047}.header-toolbar-action{width:30px;height:30px;border-radius:10px;padding:0;flex-shrink:0}.header-save-action,.header-export-action{border-color:transparent;background:transparent;color:#6b7280}.header-save-action{border-color:var(--accent-border);background:rgba(var(--accent-rgb),.06);color:var(--accent-text)}.header-save-action:hover,.header-export-action:hover{background:rgba(var(--accent-rgb),.1);border-color:rgba(var(--accent-rgb),.28)}.header-run-action{border-color:transparent;background:var(--accent);color:#fff}.header-run-action:hover{filter:brightness(.98)}.studio-view-switch{display:inline-flex;align-items:center;padding:4px;border:1px solid #e8e4dd;border-radius:12px;background:#fff}.studio-shell[data-color-mode=dark] .studio-view-switch{border-color:#2a3a52;background:#0f172a}.studio-view-switch-button{min-height:30px;padding:0 12px;border-radius:10px;border:0;background:transparent;font-size:12px;font-weight:700;color:#6b7280;transition:background .18s ease,color .18s ease}.studio-view-switch-button.active{background:#f3f4f6;color:#111827}.studio-shell[data-color-mode=dark] .studio-view-switch-button{color:#94a3b8}.studio-shell[data-color-mode=dark] .studio-view-switch-button.active{background:#162236;color:#f8fafc}.workflow-toolbar-actions{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:10px}.catalog-sidebar-actions{display:flex;align-items:center;flex-wrap:wrap;gap:10px}.catalog-save-action{flex-shrink:0;min-width:88px;justify-content:center}.header-help-button{width:20px;height:20px;border-radius:999px;border:0;background:transparent;color:#9ca3af}.header-help-button:hover{background:#94a3b81a;color:#6b7280}.studio-shell[data-color-mode=dark] .header-help-button,.studio-shell[data-color-mode=dark] .info-popover-button{border-color:transparent;background:transparent;color:#cbd5e1}.header-help-card{width:300px}.run-prompt-textarea{min-height:168px;background:#fbfaf8}.studio-shell[data-color-mode=dark] .run-prompt-textarea{background:#111b2d}.header-auth-chip,.header-auth-guest{display:inline-flex;align-items:center;gap:10px;min-height:48px;max-width:320px;padding:6px 8px 6px 10px;border:1px solid #e8e4dd;border-radius:16px;background:#fffffff5;box-shadow:none}.studio-shell[data-color-mode=dark] .header-auth-chip,.studio-shell[data-color-mode=dark] .header-auth-guest{border-color:#2a3a52;background:#0f172af5;box-shadow:none}.header-auth-avatar,.header-auth-avatar-image{width:32px;height:32px;flex-shrink:0;border-radius:999px}.header-auth-avatar{display:inline-flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#0f172a,#334155);color:#f8fafc;font-size:12px;font-weight:700;letter-spacing:.08em}.header-auth-avatar-image{-o-object-fit:cover;object-fit:cover;border:1px solid rgba(148,163,184,.35)}.header-auth-copy,.header-auth-guest-copy{min-width:0;display:flex;flex-direction:column;gap:2px}.header-auth-label{font-size:13px;font-weight:700;color:#1f2937;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.header-auth-meta{font-size:11px;line-height:1.3;color:#6b7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.studio-shell[data-color-mode=dark] .header-auth-label{color:#e2e8f0}.studio-shell[data-color-mode=dark] .header-auth-meta{color:#94a3b8}.header-auth-link,.header-auth-logout{flex-shrink:0}.chip-button{display:inline-flex;align-items:center;justify-content:center;min-height:32px;padding:0 12px;border-radius:999px;border:1px solid #e3dfd8;background:#fff;color:#6d655d;font-size:11px;font-weight:700;transition:all .16s ease}.studio-shell[data-color-mode=dark] .chip-button{border-color:#2a3a52;background:#0f172a;color:#cbd5e1}.chip-button:hover{background:#fff8f2;color:#3e3a35}.studio-shell[data-color-mode=dark] .chip-button:hover{background:#162236;color:#f8fafc}.chip-button-active{border-color:var(--accent-border);background:var(--accent-soft-end);color:var(--accent-text)}.accent-inline-link{color:var(--accent-text)}.accent-inline-link:hover{color:var(--accent-strong)}.toolbar-input{transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}.toolbar-input:focus{border-color:rgba(var(--accent-rgb),.35);box-shadow:0 0 0 4px var(--accent-focus);background:#fffdfc}.toolbar-input-group{display:flex;flex-direction:column;gap:6px}.toolbar-input-label{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#a39a8f}.info-popover{position:relative;display:inline-flex;z-index:140}.info-popover-button{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;border:1px solid #e7e3dc;background:#fffffff5;color:#8f98a4;transition:all .18s ease}.info-popover-button:hover,.info-popover-button.active{border-color:var(--accent-border);background:var(--accent-soft-end);color:var(--accent-text)}.info-popover-button.header-help-button{width:20px;height:20px;border:0;background:transparent;color:#9ca3af}.info-popover-button.header-help-button:hover,.info-popover-button.header-help-button.active{background:#94a3b81a;color:#6b7280}.info-popover-card{position:absolute;top:calc(100% + 10px);z-index:160;width:320px;border:1px solid #e8e4dd;border-radius:16px;background:#fffffffa;box-shadow:0 18px 40px #11182714;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:14px;font-size:13px;line-height:1.55;letter-spacing:normal;text-transform:none;color:#3c3834}.studio-shell[data-color-mode=dark] .info-popover-card,.studio-shell[data-color-mode=dark] .modal-shell,.studio-shell[data-color-mode=dark] .right-drawer,.studio-shell[data-color-mode=dark] .palette-drawer{border-color:#2a3a52;background:#0a111ef5;box-shadow:0 18px 40px #0206173d;color:#dbe4f0}.studio-shell[data-color-mode=dark] .info-popover-button.header-help-button{color:#94a3b8}.studio-shell[data-color-mode=dark] .info-popover-button.header-help-button:hover,.studio-shell[data-color-mode=dark] .info-popover-button.header-help-button.active{background:#94a3b81f;color:#e5e7eb}.info-popover-title{font-size:13px;font-weight:700;color:#1f2937}.studio-shell[data-color-mode=dark] .info-popover-title{color:#f8fafc}.modal-overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:80;display:flex;align-items:center;justify-content:center;padding:24px;background:#18161352;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.modal-shell{width:min(680px,100%);max-height:min(86vh,880px);display:flex;flex-direction:column;border:1px solid #e6e1d9;border-radius:28px;background:#fffffffa;box-shadow:0 32px 80px #1118272e}.modal-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:20px 22px 16px;border-bottom:1px solid #f1ece5}.studio-shell[data-color-mode=dark] .modal-header,.studio-shell[data-color-mode=dark] .modal-footer,.studio-shell[data-color-mode=dark] .palette-drawer-header,.studio-shell[data-color-mode=dark] .palette-drawer-search,.studio-shell[data-color-mode=dark] .panel-header{border-color:#223047}.modal-body{flex:1;min-height:0;overflow-y:auto;padding:20px 22px}.modal-footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 22px 20px;border-top:1px solid #f1ece5}.settings-sidebar{display:flex;flex-direction:column;min-height:0;padding:28px 20px;border-right:1px solid #ece8e2;background:linear-gradient(180deg,#faf8f4f0,#f5f2edf0)}.studio-shell[data-color-mode=dark] .settings-sidebar{border-right-color:#223047;background:linear-gradient(180deg,#0a111efa,#0c1424fa)}.settings-nav-button{width:100%;display:flex;align-items:center;gap:12px;padding:12px 14px;border-radius:20px;border:1px solid transparent;transition:all .18s ease;text-align:left}.settings-nav-button:hover{background:#ffffffb8;border-color:#e6e0d7}.studio-shell[data-color-mode=dark] .settings-nav-button:hover{background:#162236e6;border-color:#2a3a52}.settings-nav-button.active{border-color:var(--accent-border);background:linear-gradient(180deg,var(--accent-soft-start) 0%,var(--accent-soft-end) 100%);box-shadow:0 16px 34px var(--accent-shadow)}.settings-nav-icon{width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;border-radius:14px;background:#fff;color:var(--accent-text);box-shadow:0 10px 24px #1118270f;flex-shrink:0}.settings-mode-icon{width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border-radius:14px;border:1px solid #e5e1da;background:#fff;color:var(--accent-text)}.studio-shell[data-color-mode=dark] .settings-nav-icon,.studio-shell[data-color-mode=dark] .settings-mode-icon{border-color:#33465f;background:#111b2d;color:#dbeafe}.description-editor{min-height:168px;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;font-size:15px;line-height:1.65}.settings-section-card{border:1px solid #ede8df;border-radius:28px;background:linear-gradient(180deg,#fffffff5,#faf8f4eb);box-shadow:0 20px 44px #1118270f;padding:24px}.studio-shell[data-color-mode=dark] .settings-section-card,.studio-shell[data-color-mode=dark] .appearance-card,.studio-shell[data-color-mode=dark] .empty-card{border-color:#2a3a52;background:linear-gradient(180deg,#0f172af5,#111b2df5);box-shadow:0 18px 38px #0206173d}.settings-status-card{border:1px solid #e6e1d8;border-radius:22px;background:#fff;padding:16px 18px}.studio-shell[data-color-mode=dark] .settings-status-card{border-color:#2a3a52;background:#0f172aeb}.settings-status-card.success{border-color:#22c55e2e;background:#f0fdf4eb}.settings-status-card.error{border-color:#ef44442e;background:#fef2f2eb}.settings-status-card.testing{border-color:rgba(var(--accent-rgb),.18);background:#eff6ffeb}.settings-status-pill{display:inline-flex;align-items:center;justify-content:center;min-height:26px;padding:0 10px;border-radius:999px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.settings-status-pill.success{background:#22c55e1f;color:#15803d}.settings-status-pill.error{background:#ef44441f;color:#dc2626}.settings-status-pill.testing{background:rgba(var(--accent-rgb),.12);color:var(--accent-text)}.appearance-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.appearance-card{text-align:left;border:1px solid #e5e1da;border-radius:18px;background:#fff;padding:12px;transition:all .18s ease}.appearance-card:hover{background:#fffaf6}.studio-shell[data-color-mode=dark] .appearance-card:hover{background:#162236}.appearance-card.active{border-color:var(--accent-border);background:var(--accent-soft-end);box-shadow:0 12px 24px var(--accent-focus)}.appearance-swatches{display:flex;align-items:center;gap:6px;margin-bottom:10px}.appearance-swatch{width:18px;height:18px;border-radius:999px;border:1px solid rgba(17,24,39,.06);box-shadow:inset 0 1px #ffffffb3}.empty-card{border-radius:18px;border:1px dashed #e0dbd2;background:#faf8f4;padding:14px 16px;text-align:center;font-size:12px;color:#aaa196}.studio-shell[data-color-mode=dark] .empty-card{color:#7f90a8}.studio-canvas{background:#f7f6f3}.studio-shell[data-color-mode=dark] .studio-canvas{background:#0b1220}.canvas-overlay-stack{position:absolute;top:16px;left:16px;z-index:20;display:flex;flex-direction:column;gap:8px}.canvas-meta-card{min-width:180px;padding:10px 12px;border:1px solid #e8e4dd;border-radius:14px;background:#ffffffeb;box-shadow:0 10px 26px #1118270a;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.canvas-meta-card-wide{min-width:240px}.canvas-meta-label{font-size:11px;color:#8a8479}.canvas-meta-value{margin-top:2px;font-size:12px;font-weight:700;color:#1f2937}.canvas-meta-select{width:100%;margin-top:4px;border:0;background:transparent;outline:none;font-size:12px;font-weight:700;color:#1f2937}.canvas-overlay-tools{position:absolute;top:16px;right:16px;z-index:20;display:flex;align-items:center;gap:8px}.studio-shell[data-color-mode=dark] .canvas-meta-card{border-color:#2a3a52;background:#0f172ae6;box-shadow:none}.studio-shell[data-color-mode=dark] .canvas-meta-label{color:#94a3b8}.studio-shell[data-color-mode=dark] .canvas-meta-value,.studio-shell[data-color-mode=dark] .canvas-meta-select{color:#e5e7eb}.right-drawer{position:absolute;top:16px;right:16px;bottom:16px;width:380px;display:flex;flex-direction:column;border:1px solid #e8e4dd;border-radius:20px;background:#fffffffa;box-shadow:0 18px 40px #11182714;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transform:translate(calc(100% + 16px));opacity:0;pointer-events:none;transition:transform .22s ease,opacity .22s ease;z-index:28}.right-drawer.open{transform:translate(0);opacity:1;pointer-events:auto}.palette-drawer{background:#fff;border-color:#e8e4dd;border-radius:20px;-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:0 18px 40px #11182714}.studio-shell[data-color-mode=dark] .palette-drawer-header,.studio-shell[data-color-mode=dark] .palette-drawer-search,.studio-shell[data-color-mode=dark] .palette-drawer-body{background:#0f172a}.palette-drawer-header{background:#fff}.palette-drawer-search{background:#fbfaf8}.palette-drawer-body{background:#fff}.execution-logs{height:264px;flex-shrink:0;border-top:1px solid #e8e4dd;background:#fffffffa;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);transition:height .2s ease}.studio-shell[data-color-mode=dark] .execution-logs{border-top-color:#223047;background:#0a111ef5}.execution-logs-popout-shell{background:#f2f1ee;width:100vw;min-width:100vw;max-width:100vw;height:100vh;min-height:100vh}.execution-logs.execution-logs-fullscreen{width:100%;min-width:0;max-width:100%;flex:1 1 auto;height:100vh;min-height:100vh;border-top:0;overflow:hidden}.execution-logs.execution-logs-fullscreen .execution-logs-header{height:64px;padding:0 20px}.execution-logs.execution-logs-fullscreen .execution-logs-header:before{display:none}.execution-logs.execution-logs-fullscreen .execution-logs-body{width:100%;min-width:0;max-width:100%;height:calc(100vh - 64px)}.execution-logs.collapsed{height:56px}.execution-logs-header{position:relative;height:56px;width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:0 16px;border-bottom:1px solid #efe9e1;background:transparent}.execution-logs-header:before{content:"";position:absolute;top:8px;left:50%;transform:translate(-50%);width:64px;height:5px;border-radius:999px;background:#94a3b859}.execution-logs-header-actions{display:flex;align-items:center;gap:10px}.execution-logs-collapse-action{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid #e8e4dd;border-radius:999px;background:#fff;color:#4b5563;display:inline-flex;align-items:center;gap:8px;min-height:38px;padding:0 12px;transition:border-color .16s ease,background .16s ease,color .16s ease}.execution-logs-collapse-action:hover,.execution-logs-copy-action:hover{border-color:rgba(var(--accent-rgb),.28);background:#fff7f3;color:#1f2937}.studio-shell[data-color-mode=dark] .execution-logs-collapse-action{border-color:#2a3a52;background:#0f172a;color:#cbd5e1}.studio-shell[data-color-mode=dark] .execution-logs-collapse-action:hover,.studio-shell[data-color-mode=dark] .execution-logs-copy-action:hover{border-color:rgba(var(--accent-rgb),.4);background:#162236;color:#f8fafc}.execution-logs-collapse-action:focus-visible,.execution-logs-copy-action:focus-visible{outline:none;box-shadow:0 0 0 2px rgba(var(--accent-rgb),.14)}.execution-logs-collapse-icon{transition:transform .16s ease}.execution-logs-collapse-icon.collapsed{transform:rotate(180deg)}.execution-logs-copy-action.active,.execution-logs-window-action.active{border-color:rgba(var(--accent-rgb),.28);background:#fff4f1;color:var(--accent-text)}.studio-shell[data-color-mode=dark] .execution-logs-copy-action.active,.studio-shell[data-color-mode=dark] .execution-logs-window-action.active{border-color:rgba(var(--accent-rgb),.4);background:#172235}.execution-logs-body{display:grid;grid-template-columns:280px minmax(0,1fr);gap:0;width:100%;min-width:0;height:calc(100% - 56px);min-height:0}.execution-runs-list{min-width:0;min-height:0;overflow-y:auto;border-right:1px solid #f1ece5;background:#fbfaf8;padding:14px;display:flex;flex-direction:column;gap:10px}.studio-shell[data-color-mode=dark] .execution-runs-list{border-right-color:#223047;background:#0f172a}.execution-log-stream{width:100%;min-width:0;max-width:100%;min-height:0;padding:14px;display:grid;grid-template-rows:minmax(0,1fr) auto;gap:10px;background:#fff;overflow:hidden}.studio-shell[data-color-mode=dark] .execution-log-stream{background:#111b2d}.execution-log-list{width:100%;min-width:0;min-height:0;overflow-y:auto;overflow-x:auto;display:flex;flex-direction:column;gap:10px}.execution-run-card,.execution-log-card{width:100%;max-width:100%;text-align:left;border:1px solid #e8e4dd;border-radius:14px;background:#fff;padding:12px 14px;transition:all .16s ease}.execution-log-card{cursor:copy}.studio-shell[data-color-mode=dark] .execution-run-card,.studio-shell[data-color-mode=dark] .execution-log-card,.studio-shell[data-color-mode=dark] .workflow-node{border-color:#2a3a52;background:#0f172a;box-shadow:none}.execution-run-card:hover,.execution-log-card:hover{background:#fffaf6}.execution-run-card.active,.execution-log-card.active{border-color:#f0483e3d;background:#fff4f1}.execution-log-card.tone-pending{border-color:#2f6fec38;background:linear-gradient(180deg,#f4f8fff5,#eaf2ffeb)}.studio-shell[data-color-mode=dark] .execution-log-card.tone-pending{border-color:rgba(var(--accent-rgb),.3);background:linear-gradient(180deg,#121f36fa,#101c31fa)}.execution-log-card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.execution-log-card-meta{display:flex;align-items:center;gap:8px;flex-shrink:0}.execution-log-card-copied{display:inline-flex;align-items:center;gap:4px;min-height:22px;padding:0 8px;border-radius:999px;background:rgba(var(--accent-rgb),.12);color:var(--accent-text);font-size:10px;font-weight:700;letter-spacing:.02em}.execution-log-card-preview{margin-top:8px;color:#4b5563;font-size:11px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}.studio-shell[data-color-mode=dark] .execution-log-card-preview{color:#cbd5e1}.execution-action-panel{border:1px solid #e8e4dd;border-radius:16px;background:#fff;box-shadow:none;padding:16px;display:flex;flex-direction:column;gap:14px}.studio-shell[data-color-mode=dark] .execution-action-panel{border-color:#2a3a52;background:#0f172a;box-shadow:none}.execution-action-badge{display:inline-flex;align-items:center;min-height:28px;padding:0 10px;border-radius:999px;border:1px solid rgba(var(--accent-rgb),.18);background:var(--accent-soft-start);color:var(--accent-text);font-size:11px;font-weight:700}.execution-action-intro{display:flex;flex-direction:column;gap:12px}.execution-action-subtitle{margin-top:6px;color:#6b7280;font-size:12px;line-height:1.5}.studio-shell[data-color-mode=dark] .execution-action-subtitle{color:#94a3b8}.execution-action-meta{display:flex;flex-wrap:wrap;gap:8px}.execution-action-chip{display:inline-flex;align-items:center;gap:6px;min-height:28px;padding:0 10px;border-radius:999px;border:1px solid #ece5db;background:#faf7f2;color:#5f5750;font-size:11px;font-weight:600}.studio-shell[data-color-mode=dark] .execution-action-chip{border-color:#2a3a52;background:#111b2d;color:#dbe4f0}.execution-action-block{display:flex;flex-direction:column;gap:8px}.execution-action-block-label{color:#9ca3af;font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase}.execution-action-field-head{display:flex;align-items:center;justify-content:space-between;gap:10px}.execution-action-requirement{display:inline-flex;align-items:center;min-height:24px;padding:0 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.execution-action-requirement.required{background:#f0483e1a;color:#b42318}.execution-action-requirement.optional{background:#3b82f61a;color:#1d4ed8}.studio-shell[data-color-mode=dark] .execution-action-requirement.required{background:#f871712e;color:#fecaca}.studio-shell[data-color-mode=dark] .execution-action-requirement.optional{background:#60a5fa2e;color:#bfdbfe}.execution-action-helper{color:#6b7280;font-size:12px;line-height:1.5}.studio-shell[data-color-mode=dark] .execution-action-helper{color:#94a3b8}.execution-action-prompt{border:1px solid #ece5db;border-radius:18px;background:#ffffffc7;color:#4b5563;font-size:13px;line-height:1.6;padding:12px 14px;white-space:pre-wrap}.studio-shell[data-color-mode=dark] .execution-action-prompt{border-color:#2a3a52;background:#0f172ac2;color:#cbd5e1}.execution-action-textarea{min-height:110px}.execution-action-footer{display:flex;justify-content:flex-end;gap:10px;flex-wrap:wrap}.execution-danger-action{color:#b42318;border-color:#b4231824;background:#fff7f6}.execution-danger-action:hover{background:#ffefed;border-color:#b423183d}.studio-shell[data-color-mode=dark] .execution-danger-action{color:#fca5a5;border-color:#f871712e;background:#450a0a3d}.studio-shell[data-color-mode=dark] .execution-danger-action:hover{background:#450a0a5c;border-color:#f8717147}.react-flow__node{border-radius:10px!important}.react-flow__handle{width:10px;height:10px;border:2px solid #fff;border-radius:999px}.react-flow__handle-left{left:-5px}.react-flow__handle-right{right:-5px}.react-flow__edge-path{stroke-width:2.5px;stroke-linecap:round;stroke-linejoin:round}.react-flow__edge{z-index:4!important}.react-flow__attribution{display:none}.react-flow__controls{background:transparent!important;border:0!important;box-shadow:none!important;display:flex!important;flex-direction:row!important;gap:8px!important;margin:16px!important}.react-flow__controls-button{width:40px!important;height:40px!important;border:1px solid #e7e3dc!important;border-radius:12px!important;background:#fffffff5!important;color:#5b6470!important;fill:currentColor!important;box-shadow:none!important;border-bottom:1px solid #e7e3dc!important}.studio-shell[data-color-mode=dark] .react-flow__controls-button{border-color:#2a3a52!important;border-bottom-color:#2a3a52!important;background:#0f172af5!important;color:#dbe4f0!important;box-shadow:none!important}.react-flow__controls-button:hover{background:#f7f6f3!important;color:#1f2328!important}.studio-shell[data-color-mode=dark] .react-flow__controls-button:hover{background:#162236!important;color:#f8fafc!important}.react-flow__minimap{border:1px solid #e7e3dc!important;border-radius:16px!important;overflow:hidden!important;box-shadow:none!important;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.react-flow__minimap svg{background:transparent!important}.react-flow__minimap-mask{fill:#ffffffb3!important}.studio-shell[data-color-mode=dark] .react-flow__minimap{border-color:#2a3a52!important;box-shadow:none!important}.studio-shell[data-color-mode=dark] .react-flow__minimap-mask{fill:#0b1220b8!important}.workflow-node{background:#fff;border:1px solid #e3dfd8;border-radius:14px;box-shadow:0 8px 22px #1118270a;transition:box-shadow .18s ease,border-color .18s ease,transform .18s ease;overflow:hidden;min-width:200px}.studio-shell[data-color-mode=dark] .workflow-node{background:#0f172a}.workflow-node-icon{width:32px;height:32px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.workflow-node-title{min-width:0;font-size:13px;font-weight:700;line-height:1.2;color:#1f2937;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.studio-shell[data-color-mode=dark] .workflow-node-title{color:#e5e7eb}.workflow-node-subtitle{min-width:0;margin-top:2px;font-size:11px;line-height:1.3;color:#9ca3af;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workflow-node-status-dot{width:9px;height:9px;border-radius:999px;flex-shrink:0;background:#94a3b8;box-shadow:0 0 0 2px #94a3b81f}.workflow-node-status-dot.active{background:#2563eb;box-shadow:0 0 0 2px #3b82f624}.workflow-node-status-dot.waiting{background:#d97706;box-shadow:0 0 0 2px #f59e0b29}.workflow-node-status-dot.completed{background:#16a34a;box-shadow:0 0 0 2px #22c55e24}.workflow-node-status-dot.failed{background:#dc2626;box-shadow:0 0 0 2px #ef444424}.workflow-node.compact{border-radius:14px;box-shadow:0 6px 16px #1118270a}.workflow-node.compact:hover{transform:none;box-shadow:0 8px 18px #1118270f}.workflow-node-compact,.workflow-node-micro{display:flex;align-items:center;gap:10px;min-height:54px;padding:10px 12px}.workflow-node-compact-meta,.workflow-node-micro-meta{min-width:0;flex:1}.workflow-node.micro{border-radius:14px;box-shadow:0 4px 12px #1118270a}.workflow-node.micro:hover{transform:none;box-shadow:0 6px 14px #1118270d}.workflow-node-micro{min-height:42px;padding:8px 10px;gap:8px}.workflow-node-icon-micro{width:24px;height:24px;border-radius:8px}.workflow-node.micro .workflow-node-title{font-size:11px}.workflow-node.micro .react-flow__handle{width:8px;height:8px}.workflow-node.compact .react-flow__handle{width:9px;height:9px}.workflow-node:hover{border-color:#d2cdc4;box-shadow:0 10px 24px #1118270f;transform:none}.workflow-node.selected{border-color:rgba(var(--accent-rgb),.3);box-shadow:0 0 0 3px var(--accent-focus),0 10px 24px #1118270f}.workflow-node.execution-focus{border-color:#4f6ef75c;box-shadow:0 0 0 3px #4f6ef714,0 10px 24px #4f6ef714}.workflow-node.node-status-active{border-color:#3b82f657}.workflow-node.node-status-waiting{border-color:#f59e0b57}.workflow-node.node-status-completed{border-color:#22c55e57}.workflow-node.node-status-failed{border-color:#ef444457}.node-run-pill{display:inline-flex;align-items:center;min-height:22px;padding:0 8px;border-radius:999px;font-size:10px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.node-run-pill.active{background:#3b82f61a;color:#2563eb}.node-run-pill.waiting{background:#f59e0b1f;color:#b45309}.node-run-pill.completed{background:#22c55e1f;color:#15803d}.node-run-pill.failed{background:#ef44441f;color:#dc2626}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[\#F9F6F0\]:hover{--tw-bg-opacity: 1;background-color:rgb(249 246 240 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#FAF8F4\]:hover{--tw-bg-opacity: 1;background-color:rgb(250 248 244 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#FBFAF7\]:hover{--tw-bg-opacity: 1;background-color:rgb(251 250 247 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#FFF0EB\]:hover{--tw-bg-opacity: 1;background-color:rgb(255 240 235 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#FFF4DE\]:hover{--tw-bg-opacity: 1;background-color:rgb(255 244 222 / var(--tw-bg-opacity, 1))}.hover\:bg-\[\#FFF9F4\]:hover{--tw-bg-opacity: 1;background-color:rgb(255 249 244 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:block{display:block}.sm\:p-5{padding:1.25rem}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,1\.1fr\)_320px\]{grid-template-columns:minmax(0,1.1fr) 320px}.md\:p-7{padding:1.75rem}.md\:p-8{padding:2rem}}@media (min-width: 1024px){.lg\:grid-cols-\[minmax\(0\,1fr\)_auto_auto\]{grid-template-columns:minmax(0,1fr) auto auto}.lg\:items-end{align-items:flex-end}}@media (min-width: 1280px){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-\[320px_minmax\(0\,1fr\)\]{grid-template-columns:320px minmax(0,1fr)}} diff --git a/tools/Aevatar.Tools.Cli/wwwroot/playground/app.js b/tools/Aevatar.Tools.Cli/wwwroot/playground/app.js deleted file mode 100644 index 7a4f9d434..000000000 --- a/tools/Aevatar.Tools.Cli/wwwroot/playground/app.js +++ /dev/null @@ -1,1268 +0,0 @@ -var Jye=Object.defineProperty;var eSe=(n,e,t)=>e in n?Jye(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var Vn=(n,e,t)=>eSe(n,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))i(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&i(r)}).observe(document,{childList:!0,subtree:!0});function t(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(s){if(s.ep)return;s.ep=!0;const o=t(s);fetch(s.href,o)}})();function Fce(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Bce={exports:{}},JF={},Wce={exports:{}},yi={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var $N=Symbol.for("react.element"),tSe=Symbol.for("react.portal"),iSe=Symbol.for("react.fragment"),nSe=Symbol.for("react.strict_mode"),sSe=Symbol.for("react.profiler"),oSe=Symbol.for("react.provider"),rSe=Symbol.for("react.context"),aSe=Symbol.for("react.forward_ref"),lSe=Symbol.for("react.suspense"),cSe=Symbol.for("react.memo"),dSe=Symbol.for("react.lazy"),cJ=Symbol.iterator;function hSe(n){return n===null||typeof n!="object"?null:(n=cJ&&n[cJ]||n["@@iterator"],typeof n=="function"?n:null)}var Hce={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Vce=Object.assign,zce={};function jS(n,e,t){this.props=n,this.context=e,this.refs=zce,this.updater=t||Hce}jS.prototype.isReactComponent={};jS.prototype.setState=function(n,e){if(typeof n!="object"&&typeof n!="function"&&n!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,n,e,"setState")};jS.prototype.forceUpdate=function(n){this.updater.enqueueForceUpdate(this,n,"forceUpdate")};function jce(){}jce.prototype=jS.prototype;function aK(n,e,t){this.props=n,this.context=e,this.refs=zce,this.updater=t||Hce}var lK=aK.prototype=new jce;lK.constructor=aK;Vce(lK,jS.prototype);lK.isPureReactComponent=!0;var dJ=Array.isArray,$ce=Object.prototype.hasOwnProperty,cK={current:null},Uce={key:!0,ref:!0,__self:!0,__source:!0};function qce(n,e,t){var i,s={},o=null,r=null;if(e!=null)for(i in e.ref!==void 0&&(r=e.ref),e.key!==void 0&&(o=""+e.key),e)$ce.call(e,i)&&!Uce.hasOwnProperty(i)&&(s[i]=e[i]);var a=arguments.length-2;if(a===1)s.children=t;else if(1>>1,te=z[Y];if(0>>1;Ys(xe,Q))jes(ke,xe)?(z[Y]=ke,z[je]=Q,Y=je):(z[Y]=xe,z[Ce]=Q,Y=Ce);else if(jes(ke,Q))z[Y]=ke,z[je]=Q,Y=je;else break e}}return j}function s(z,j){var Q=z.sortIndex-j.sortIndex;return Q!==0?Q:z.id-j.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;n.unstable_now=function(){return o.now()}}else{var r=Date,a=r.now();n.unstable_now=function(){return r.now()-a}}var l=[],c=[],d=1,h=null,u=3,f=!1,g=!1,p=!1,m=typeof setTimeout=="function"?setTimeout:null,b=typeof clearTimeout=="function"?clearTimeout:null,v=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function w(z){for(var j=t(c);j!==null;){if(j.callback===null)i(c);else if(j.startTime<=z)i(c),j.sortIndex=j.expirationTime,e(l,j);else break;j=t(c)}}function C(z){if(p=!1,w(z),!g)if(t(l)!==null)g=!0,V(S);else{var j=t(c);j!==null&&K(C,j.startTime-z)}}function S(z,j){g=!1,p&&(p=!1,b(E),E=-1),f=!0;var Q=u;try{for(w(j),h=t(l);h!==null&&(!(h.expirationTime>j)||z&&!M());){var Y=h.callback;if(typeof Y=="function"){h.callback=null,u=h.priorityLevel;var te=Y(h.expirationTime<=j);j=n.unstable_now(),typeof te=="function"?h.callback=te:h===t(l)&&i(l),w(j)}else i(l);h=t(l)}if(h!==null)var ce=!0;else{var Ce=t(c);Ce!==null&&K(C,Ce.startTime-j),ce=!1}return ce}finally{h=null,u=Q,f=!1}}var L=!1,x=null,E=-1,I=5,R=-1;function M(){return!(n.unstable_now()-Rz||125Y?(z.sortIndex=Q,e(c,z),t(l)===null&&z===t(c)&&(p?(b(E),E=-1):p=!0,K(C,Q-Y))):(z.sortIndex=te,e(l,z),g||f||(g=!0,V(S))),z},n.unstable_shouldYield=M,n.unstable_wrapCallback=function(z){var j=u;return function(){var Q=u;u=j;try{return z.apply(this,arguments)}finally{u=Q}}}})(Xce);Zce.exports=Xce;var ySe=Zce.exports;/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var SSe=$,ec=ySe;function $e(n){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+n,t=1;t"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),V6=Object.prototype.hasOwnProperty,xSe=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,uJ={},fJ={};function LSe(n){return V6.call(fJ,n)?!0:V6.call(uJ,n)?!1:xSe.test(n)?fJ[n]=!0:(uJ[n]=!0,!1)}function kSe(n,e,t,i){if(t!==null&&t.type===0)return!1;switch(typeof e){case"function":case"symbol":return!0;case"boolean":return i?!1:t!==null?!t.acceptsBooleans:(n=n.toLowerCase().slice(0,5),n!=="data-"&&n!=="aria-");default:return!1}}function ESe(n,e,t,i){if(e===null||typeof e>"u"||kSe(n,e,t,i))return!0;if(i)return!1;if(t!==null)switch(t.type){case 3:return!e;case 4:return e===!1;case 5:return isNaN(e);case 6:return isNaN(e)||1>e}return!1}function Ia(n,e,t,i,s,o,r){this.acceptsBooleans=e===2||e===3||e===4,this.attributeName=i,this.attributeNamespace=s,this.mustUseProperty=t,this.propertyName=n,this.type=e,this.sanitizeURL=o,this.removeEmptyString=r}var pr={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(n){pr[n]=new Ia(n,0,!1,n,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(n){var e=n[0];pr[e]=new Ia(e,1,!1,n[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(n){pr[n]=new Ia(n,2,!1,n.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(n){pr[n]=new Ia(n,2,!1,n,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(n){pr[n]=new Ia(n,3,!1,n.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(n){pr[n]=new Ia(n,3,!0,n,null,!1,!1)});["capture","download"].forEach(function(n){pr[n]=new Ia(n,4,!1,n,null,!1,!1)});["cols","rows","size","span"].forEach(function(n){pr[n]=new Ia(n,6,!1,n,null,!1,!1)});["rowSpan","start"].forEach(function(n){pr[n]=new Ia(n,5,!1,n.toLowerCase(),null,!1,!1)});var hK=/[\-:]([a-z])/g;function uK(n){return n[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(n){var e=n.replace(hK,uK);pr[e]=new Ia(e,1,!1,n,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(n){var e=n.replace(hK,uK);pr[e]=new Ia(e,1,!1,n,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(n){var e=n.replace(hK,uK);pr[e]=new Ia(e,1,!1,n,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(n){pr[n]=new Ia(n,1,!1,n.toLowerCase(),null,!1,!1)});pr.xlinkHref=new Ia("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(n){pr[n]=new Ia(n,1,!1,n.toLowerCase(),null,!0,!0)});function fK(n,e,t,i){var s=pr.hasOwnProperty(e)?pr[e]:null;(s!==null?s.type!==0:i||!(2a||s[r]!==o[a]){var l=` -`+s[r].replace(" at new "," at ");return n.displayName&&l.includes("")&&(l=l.replace("",n.displayName)),l}while(1<=r&&0<=a);break}}}finally{L8=!1,Error.prepareStackTrace=t}return(n=n?n.displayName||n.name:"")?vL(n):""}function ISe(n){switch(n.tag){case 5:return vL(n.type);case 16:return vL("Lazy");case 13:return vL("Suspense");case 19:return vL("SuspenseList");case 0:case 2:case 15:return n=k8(n.type,!1),n;case 11:return n=k8(n.type.render,!1),n;case 1:return n=k8(n.type,!0),n;default:return""}}function U6(n){if(n==null)return null;if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n;switch(n){case UC:return"Fragment";case $C:return"Portal";case z6:return"Profiler";case gK:return"StrictMode";case j6:return"Suspense";case $6:return"SuspenseList"}if(typeof n=="object")switch(n.$$typeof){case ede:return(n.displayName||"Context")+".Consumer";case Jce:return(n._context.displayName||"Context")+".Provider";case pK:var e=n.render;return n=n.displayName,n||(n=e.displayName||e.name||"",n=n!==""?"ForwardRef("+n+")":"ForwardRef"),n;case mK:return e=n.displayName||null,e!==null?e:U6(n.type)||"Memo";case Cp:e=n._payload,n=n._init;try{return U6(n(e))}catch{}}return null}function NSe(n){var e=n.type;switch(n.tag){case 24:return"Cache";case 9:return(e.displayName||"Context")+".Consumer";case 10:return(e._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return n=e.render,n=n.displayName||n.name||"",e.displayName||(n!==""?"ForwardRef("+n+")":"ForwardRef");case 7:return"Fragment";case 5:return e;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U6(e);case 8:return e===gK?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e}return null}function Zm(n){switch(typeof n){case"boolean":case"number":case"string":case"undefined":return n;case"object":return n;default:return""}}function ide(n){var e=n.type;return(n=n.nodeName)&&n.toLowerCase()==="input"&&(e==="checkbox"||e==="radio")}function DSe(n){var e=ide(n)?"checked":"value",t=Object.getOwnPropertyDescriptor(n.constructor.prototype,e),i=""+n[e];if(!n.hasOwnProperty(e)&&typeof t<"u"&&typeof t.get=="function"&&typeof t.set=="function"){var s=t.get,o=t.set;return Object.defineProperty(n,e,{configurable:!0,get:function(){return s.call(this)},set:function(r){i=""+r,o.call(this,r)}}),Object.defineProperty(n,e,{enumerable:t.enumerable}),{getValue:function(){return i},setValue:function(r){i=""+r},stopTracking:function(){n._valueTracker=null,delete n[e]}}}}function iT(n){n._valueTracker||(n._valueTracker=DSe(n))}function nde(n){if(!n)return!1;var e=n._valueTracker;if(!e)return!0;var t=e.getValue(),i="";return n&&(i=ide(n)?n.checked?"true":"false":n.value),n=i,n!==t?(e.setValue(n),!0):!1}function hM(n){if(n=n||(typeof document<"u"?document:void 0),typeof n>"u")return null;try{return n.activeElement||n.body}catch{return n.body}}function q6(n,e){var t=e.checked;return Ss({},e,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:t??n._wrapperState.initialChecked})}function pJ(n,e){var t=e.defaultValue==null?"":e.defaultValue,i=e.checked!=null?e.checked:e.defaultChecked;t=Zm(e.value!=null?e.value:t),n._wrapperState={initialChecked:i,initialValue:t,controlled:e.type==="checkbox"||e.type==="radio"?e.checked!=null:e.value!=null}}function sde(n,e){e=e.checked,e!=null&&fK(n,"checked",e,!1)}function K6(n,e){sde(n,e);var t=Zm(e.value),i=e.type;if(t!=null)i==="number"?(t===0&&n.value===""||n.value!=t)&&(n.value=""+t):n.value!==""+t&&(n.value=""+t);else if(i==="submit"||i==="reset"){n.removeAttribute("value");return}e.hasOwnProperty("value")?G6(n,e.type,t):e.hasOwnProperty("defaultValue")&&G6(n,e.type,Zm(e.defaultValue)),e.checked==null&&e.defaultChecked!=null&&(n.defaultChecked=!!e.defaultChecked)}function mJ(n,e,t){if(e.hasOwnProperty("value")||e.hasOwnProperty("defaultValue")){var i=e.type;if(!(i!=="submit"&&i!=="reset"||e.value!==void 0&&e.value!==null))return;e=""+n._wrapperState.initialValue,t||e===n.value||(n.value=e),n.defaultValue=e}t=n.name,t!==""&&(n.name=""),n.defaultChecked=!!n._wrapperState.initialChecked,t!==""&&(n.name=t)}function G6(n,e,t){(e!=="number"||hM(n.ownerDocument)!==n)&&(t==null?n.defaultValue=""+n._wrapperState.initialValue:n.defaultValue!==""+t&&(n.defaultValue=""+t))}var wL=Array.isArray;function U0(n,e,t,i){if(n=n.options,e){e={};for(var s=0;s"+e.valueOf().toString()+"",e=nT.firstChild;n.firstChild;)n.removeChild(n.firstChild);for(;e.firstChild;)n.appendChild(e.firstChild)}});function xE(n,e){if(e){var t=n.firstChild;if(t&&t===n.lastChild&&t.nodeType===3){t.nodeValue=e;return}}n.textContent=e}var YL={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},TSe=["Webkit","ms","Moz","O"];Object.keys(YL).forEach(function(n){TSe.forEach(function(e){e=e+n.charAt(0).toUpperCase()+n.substring(1),YL[e]=YL[n]})});function lde(n,e,t){return e==null||typeof e=="boolean"||e===""?"":t||typeof e!="number"||e===0||YL.hasOwnProperty(n)&&YL[n]?(""+e).trim():e+"px"}function cde(n,e){n=n.style;for(var t in e)if(e.hasOwnProperty(t)){var i=t.indexOf("--")===0,s=lde(t,e[t],i);t==="float"&&(t="cssFloat"),i?n.setProperty(t,s):n[t]=s}}var RSe=Ss({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function X6(n,e){if(e){if(RSe[n]&&(e.children!=null||e.dangerouslySetInnerHTML!=null))throw Error($e(137,n));if(e.dangerouslySetInnerHTML!=null){if(e.children!=null)throw Error($e(60));if(typeof e.dangerouslySetInnerHTML!="object"||!("__html"in e.dangerouslySetInnerHTML))throw Error($e(61))}if(e.style!=null&&typeof e.style!="object")throw Error($e(62))}}function Q6(n,e){if(n.indexOf("-")===-1)return typeof e.is=="string";switch(n){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var J6=null;function _K(n){return n=n.target||n.srcElement||window,n.correspondingUseElement&&(n=n.correspondingUseElement),n.nodeType===3?n.parentNode:n}var eB=null,q0=null,K0=null;function vJ(n){if(n=KN(n)){if(typeof eB!="function")throw Error($e(280));var e=n.stateNode;e&&(e=s5(e),eB(n.stateNode,n.type,e))}}function dde(n){q0?K0?K0.push(n):K0=[n]:q0=n}function hde(){if(q0){var n=q0,e=K0;if(K0=q0=null,vJ(n),e)for(n=0;n>>=0,n===0?32:31-(jSe(n)/$Se|0)|0}var sT=64,oT=4194304;function CL(n){switch(n&-n){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return n&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return n&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return n}}function pM(n,e){var t=n.pendingLanes;if(t===0)return 0;var i=0,s=n.suspendedLanes,o=n.pingedLanes,r=t&268435455;if(r!==0){var a=r&~s;a!==0?i=CL(a):(o&=r,o!==0&&(i=CL(o)))}else r=t&~s,r!==0?i=CL(r):o!==0&&(i=CL(o));if(i===0)return 0;if(e!==0&&e!==i&&!(e&s)&&(s=i&-i,o=e&-e,s>=o||s===16&&(o&4194240)!==0))return e;if(i&4&&(i|=t&16),e=n.entangledLanes,e!==0)for(n=n.entanglements,e&=i;0t;t++)e.push(n);return e}function UN(n,e,t){n.pendingLanes|=e,e!==536870912&&(n.suspendedLanes=0,n.pingedLanes=0),n=n.eventTimes,e=31-Vd(e),n[e]=t}function GSe(n,e){var t=n.pendingLanes&~e;n.pendingLanes=e,n.suspendedLanes=0,n.pingedLanes=0,n.expiredLanes&=e,n.mutableReadLanes&=e,n.entangledLanes&=e,e=n.entanglements;var i=n.eventTimes;for(n=n.expirationTimes;0=XL),IJ=" ",NJ=!1;function Tde(n,e){switch(n){case"keyup":return yxe.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Rde(n){return n=n.detail,typeof n=="object"&&"data"in n?n.data:null}var qC=!1;function xxe(n,e){switch(n){case"compositionend":return Rde(e);case"keypress":return e.which!==32?null:(NJ=!0,IJ);case"textInput":return n=e.data,n===IJ&&NJ?null:n;default:return null}}function Lxe(n,e){if(qC)return n==="compositionend"||!LK&&Tde(n,e)?(n=Nde(),rR=yK=Up=null,qC=!1,n):null;switch(n){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1=e)return{node:t,offset:e-n};n=i}e:{for(;t;){if(t.nextSibling){t=t.nextSibling;break e}t=t.parentNode}t=void 0}t=MJ(t)}}function Ode(n,e){return n&&e?n===e?!0:n&&n.nodeType===3?!1:e&&e.nodeType===3?Ode(n,e.parentNode):"contains"in n?n.contains(e):n.compareDocumentPosition?!!(n.compareDocumentPosition(e)&16):!1:!1}function Fde(){for(var n=window,e=hM();e instanceof n.HTMLIFrameElement;){try{var t=typeof e.contentWindow.location.href=="string"}catch{t=!1}if(t)n=e.contentWindow;else break;e=hM(n.document)}return e}function kK(n){var e=n&&n.nodeName&&n.nodeName.toLowerCase();return e&&(e==="input"&&(n.type==="text"||n.type==="search"||n.type==="tel"||n.type==="url"||n.type==="password")||e==="textarea"||n.contentEditable==="true")}function Axe(n){var e=Fde(),t=n.focusedElem,i=n.selectionRange;if(e!==t&&t&&t.ownerDocument&&Ode(t.ownerDocument.documentElement,t)){if(i!==null&&kK(t)){if(e=i.start,n=i.end,n===void 0&&(n=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(n,t.value.length);else if(n=(e=t.ownerDocument||document)&&e.defaultView||window,n.getSelection){n=n.getSelection();var s=t.textContent.length,o=Math.min(i.start,s);i=i.end===void 0?o:Math.min(i.end,s),!n.extend&&o>i&&(s=i,i=o,o=s),s=AJ(t,o);var r=AJ(t,i);s&&r&&(n.rangeCount!==1||n.anchorNode!==s.node||n.anchorOffset!==s.offset||n.focusNode!==r.node||n.focusOffset!==r.offset)&&(e=e.createRange(),e.setStart(s.node,s.offset),n.removeAllRanges(),o>i?(n.addRange(e),n.extend(r.node,r.offset)):(e.setEnd(r.node,r.offset),n.addRange(e)))}}for(e=[],n=t;n=n.parentNode;)n.nodeType===1&&e.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,KC=null,rB=null,JL=null,aB=!1;function PJ(n,e,t){var i=t.window===t?t.document:t.nodeType===9?t:t.ownerDocument;aB||KC==null||KC!==hM(i)||(i=KC,"selectionStart"in i&&kK(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),JL&&DE(JL,i)||(JL=i,i=bM(rB,"onSelect"),0ZC||(n.current=fB[ZC],fB[ZC]=null,ZC--)}function $n(n,e){ZC++,fB[ZC]=n.current,n.current=e}var Xm={},zr=m_(Xm),il=m_(!1),B1=Xm;function jy(n,e){var t=n.type.contextTypes;if(!t)return Xm;var i=n.stateNode;if(i&&i.__reactInternalMemoizedUnmaskedChildContext===e)return i.__reactInternalMemoizedMaskedChildContext;var s={},o;for(o in t)s[o]=e[o];return i&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=e,n.__reactInternalMemoizedMaskedChildContext=s),s}function nl(n){return n=n.childContextTypes,n!=null}function wM(){Zn(il),Zn(zr)}function zJ(n,e,t){if(zr.current!==Xm)throw Error($e(168));$n(zr,e),$n(il,t)}function qde(n,e,t){var i=n.stateNode;if(e=e.childContextTypes,typeof i.getChildContext!="function")return t;i=i.getChildContext();for(var s in i)if(!(s in e))throw Error($e(108,NSe(n)||"Unknown",s));return Ss({},t,i)}function CM(n){return n=(n=n.stateNode)&&n.__reactInternalMemoizedMergedChildContext||Xm,B1=zr.current,$n(zr,n),$n(il,il.current),!0}function jJ(n,e,t){var i=n.stateNode;if(!i)throw Error($e(169));t?(n=qde(n,e,B1),i.__reactInternalMemoizedMergedChildContext=n,Zn(il),Zn(zr),$n(zr,n)):Zn(il),$n(il,t)}var Sf=null,o5=!1,H8=!1;function Kde(n){Sf===null?Sf=[n]:Sf.push(n)}function qxe(n){o5=!0,Kde(n)}function __(){if(!H8&&Sf!==null){H8=!0;var n=0,e=bn;try{var t=Sf;for(bn=1;n>=r,s-=r,Of=1<<32-Vd(e)+s|t<E?(I=x,x=null):I=x.sibling;var R=u(b,x,w[E],C);if(R===null){x===null&&(x=I);break}n&&x&&R.alternate===null&&e(b,x),v=o(R,v,E),L===null?S=R:L.sibling=R,L=R,x=I}if(E===w.length)return t(b,x),es&&rb(b,E),S;if(x===null){for(;EE?(I=x,x=null):I=x.sibling;var M=u(b,x,R.value,C);if(M===null){x===null&&(x=I);break}n&&x&&M.alternate===null&&e(b,x),v=o(M,v,E),L===null?S=M:L.sibling=M,L=M,x=I}if(R.done)return t(b,x),es&&rb(b,E),S;if(x===null){for(;!R.done;E++,R=w.next())R=h(b,R.value,C),R!==null&&(v=o(R,v,E),L===null?S=R:L.sibling=R,L=R);return es&&rb(b,E),S}for(x=i(b,x);!R.done;E++,R=w.next())R=f(x,b,E,R.value,C),R!==null&&(n&&R.alternate!==null&&x.delete(R.key===null?E:R.key),v=o(R,v,E),L===null?S=R:L.sibling=R,L=R);return n&&x.forEach(function(A){return e(b,A)}),es&&rb(b,E),S}function m(b,v,w,C){if(typeof w=="object"&&w!==null&&w.type===UC&&w.key===null&&(w=w.props.children),typeof w=="object"&&w!==null){switch(w.$$typeof){case tT:e:{for(var S=w.key,L=v;L!==null;){if(L.key===S){if(S=w.type,S===UC){if(L.tag===7){t(b,L.sibling),v=s(L,w.props.children),v.return=b,b=v;break e}}else if(L.elementType===S||typeof S=="object"&&S!==null&&S.$$typeof===Cp&&qJ(S)===L.type){t(b,L.sibling),v=s(L,w.props),v.ref=Mx(b,L,w),v.return=b,b=v;break e}t(b,L);break}else e(b,L);L=L.sibling}w.type===UC?(v=yv(w.props.children,b.mode,C,w.key),v.return=b,b=v):(C=gR(w.type,w.key,w.props,null,b.mode,C),C.ref=Mx(b,v,w),C.return=b,b=C)}return r(b);case $C:e:{for(L=w.key;v!==null;){if(v.key===L)if(v.tag===4&&v.stateNode.containerInfo===w.containerInfo&&v.stateNode.implementation===w.implementation){t(b,v.sibling),v=s(v,w.children||[]),v.return=b,b=v;break e}else{t(b,v);break}else e(b,v);v=v.sibling}v=G8(w,b.mode,C),v.return=b,b=v}return r(b);case Cp:return L=w._init,m(b,v,L(w._payload),C)}if(wL(w))return g(b,v,w,C);if(Ix(w))return p(b,v,w,C);uT(b,w)}return typeof w=="string"&&w!==""||typeof w=="number"?(w=""+w,v!==null&&v.tag===6?(t(b,v.sibling),v=s(v,w),v.return=b,b=v):(t(b,v),v=K8(w,b.mode,C),v.return=b,b=v),r(b)):t(b,v)}return m}var Uy=Xde(!0),Qde=Xde(!1),xM=m_(null),LM=null,JC=null,DK=null;function TK(){DK=JC=LM=null}function RK(n){var e=xM.current;Zn(xM),n._currentValue=e}function mB(n,e,t){for(;n!==null;){var i=n.alternate;if((n.childLanes&e)!==e?(n.childLanes|=e,i!==null&&(i.childLanes|=e)):i!==null&&(i.childLanes&e)!==e&&(i.childLanes|=e),n===t)break;n=n.return}}function Y0(n,e){LM=n,DK=JC=null,n=n.dependencies,n!==null&&n.firstContext!==null&&(n.lanes&e&&(Xa=!0),n.firstContext=null)}function Uc(n){var e=n._currentValue;if(DK!==n)if(n={context:n,memoizedValue:e,next:null},JC===null){if(LM===null)throw Error($e(308));JC=n,LM.dependencies={lanes:0,firstContext:n}}else JC=JC.next=n;return e}var Jb=null;function MK(n){Jb===null?Jb=[n]:Jb.push(n)}function Jde(n,e,t,i){var s=e.interleaved;return s===null?(t.next=t,MK(e)):(t.next=s.next,s.next=t),e.interleaved=t,pg(n,i)}function pg(n,e){n.lanes|=e;var t=n.alternate;for(t!==null&&(t.lanes|=e),t=n,n=n.return;n!==null;)n.childLanes|=e,t=n.alternate,t!==null&&(t.childLanes|=e),t=n,n=n.return;return t.tag===3?t.stateNode:null}var yp=!1;function AK(n){n.updateQueue={baseState:n.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function ehe(n,e){n=n.updateQueue,e.updateQueue===n&&(e.updateQueue={baseState:n.baseState,firstBaseUpdate:n.firstBaseUpdate,lastBaseUpdate:n.lastBaseUpdate,shared:n.shared,effects:n.effects})}function tg(n,e){return{eventTime:n,lane:e,tag:0,payload:null,callback:null,next:null}}function mm(n,e,t){var i=n.updateQueue;if(i===null)return null;if(i=i.shared,ji&2){var s=i.pending;return s===null?e.next=e:(e.next=s.next,s.next=e),i.pending=e,pg(n,t)}return s=i.interleaved,s===null?(e.next=e,MK(i)):(e.next=s.next,s.next=e),i.interleaved=e,pg(n,t)}function lR(n,e,t){if(e=e.updateQueue,e!==null&&(e=e.shared,(t&4194240)!==0)){var i=e.lanes;i&=n.pendingLanes,t|=i,e.lanes=t,vK(n,t)}}function KJ(n,e){var t=n.updateQueue,i=n.alternate;if(i!==null&&(i=i.updateQueue,t===i)){var s=null,o=null;if(t=t.firstBaseUpdate,t!==null){do{var r={eventTime:t.eventTime,lane:t.lane,tag:t.tag,payload:t.payload,callback:t.callback,next:null};o===null?s=o=r:o=o.next=r,t=t.next}while(t!==null);o===null?s=o=e:o=o.next=e}else s=o=e;t={baseState:i.baseState,firstBaseUpdate:s,lastBaseUpdate:o,shared:i.shared,effects:i.effects},n.updateQueue=t;return}n=t.lastBaseUpdate,n===null?t.firstBaseUpdate=e:n.next=e,t.lastBaseUpdate=e}function kM(n,e,t,i){var s=n.updateQueue;yp=!1;var o=s.firstBaseUpdate,r=s.lastBaseUpdate,a=s.shared.pending;if(a!==null){s.shared.pending=null;var l=a,c=l.next;l.next=null,r===null?o=c:r.next=c,r=l;var d=n.alternate;d!==null&&(d=d.updateQueue,a=d.lastBaseUpdate,a!==r&&(a===null?d.firstBaseUpdate=c:a.next=c,d.lastBaseUpdate=l))}if(o!==null){var h=s.baseState;r=0,d=c=l=null,a=o;do{var u=a.lane,f=a.eventTime;if((i&u)===u){d!==null&&(d=d.next={eventTime:f,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var g=n,p=a;switch(u=e,f=t,p.tag){case 1:if(g=p.payload,typeof g=="function"){h=g.call(f,h,u);break e}h=g;break e;case 3:g.flags=g.flags&-65537|128;case 0:if(g=p.payload,u=typeof g=="function"?g.call(f,h,u):g,u==null)break e;h=Ss({},h,u);break e;case 2:yp=!0}}a.callback!==null&&a.lane!==0&&(n.flags|=64,u=s.effects,u===null?s.effects=[a]:u.push(a))}else f={eventTime:f,lane:u,tag:a.tag,payload:a.payload,callback:a.callback,next:null},d===null?(c=d=f,l=h):d=d.next=f,r|=u;if(a=a.next,a===null){if(a=s.shared.pending,a===null)break;u=a,a=u.next,u.next=null,s.lastBaseUpdate=u,s.shared.pending=null}}while(!0);if(d===null&&(l=h),s.baseState=l,s.firstBaseUpdate=c,s.lastBaseUpdate=d,e=s.shared.interleaved,e!==null){s=e;do r|=s.lane,s=s.next;while(s!==e)}else o===null&&(s.shared.lanes=0);V1|=r,n.lanes=r,n.memoizedState=h}}function GJ(n,e,t){if(n=e.effects,e.effects=null,n!==null)for(e=0;et?t:4,n(!0);var i=z8.transition;z8.transition={};try{n(!1),e()}finally{bn=t,z8.transition=i}}function _he(){return qc().memoizedState}function Zxe(n,e,t){var i=bm(n);if(t={lane:i,action:t,hasEagerState:!1,eagerState:null,next:null},bhe(n))vhe(e,t);else if(t=Jde(n,e,t,i),t!==null){var s=ga();zd(t,n,i,s),whe(t,e,i)}}function Xxe(n,e,t){var i=bm(n),s={lane:i,action:t,hasEagerState:!1,eagerState:null,next:null};if(bhe(n))vhe(e,s);else{var o=n.alternate;if(n.lanes===0&&(o===null||o.lanes===0)&&(o=e.lastRenderedReducer,o!==null))try{var r=e.lastRenderedState,a=o(r,t);if(s.hasEagerState=!0,s.eagerState=a,Gd(a,r)){var l=e.interleaved;l===null?(s.next=s,MK(e)):(s.next=l.next,l.next=s),e.interleaved=s;return}}catch{}finally{}t=Jde(n,e,s,i),t!==null&&(s=ga(),zd(t,n,i,s),whe(t,e,i))}}function bhe(n){var e=n.alternate;return n===vs||e!==null&&e===vs}function vhe(n,e){ek=IM=!0;var t=n.pending;t===null?e.next=e:(e.next=t.next,t.next=e),n.pending=e}function whe(n,e,t){if(t&4194240){var i=e.lanes;i&=n.pendingLanes,t|=i,e.lanes=t,vK(n,t)}}var NM={readContext:Uc,useCallback:Nr,useContext:Nr,useEffect:Nr,useImperativeHandle:Nr,useInsertionEffect:Nr,useLayoutEffect:Nr,useMemo:Nr,useReducer:Nr,useRef:Nr,useState:Nr,useDebugValue:Nr,useDeferredValue:Nr,useTransition:Nr,useMutableSource:Nr,useSyncExternalStore:Nr,useId:Nr,unstable_isNewReconciler:!1},Qxe={readContext:Uc,useCallback:function(n,e){return Th().memoizedState=[n,e===void 0?null:e],n},useContext:Uc,useEffect:ZJ,useImperativeHandle:function(n,e,t){return t=t!=null?t.concat([n]):null,dR(4194308,4,uhe.bind(null,e,n),t)},useLayoutEffect:function(n,e){return dR(4194308,4,n,e)},useInsertionEffect:function(n,e){return dR(4,2,n,e)},useMemo:function(n,e){var t=Th();return e=e===void 0?null:e,n=n(),t.memoizedState=[n,e],n},useReducer:function(n,e,t){var i=Th();return e=t!==void 0?t(e):e,i.memoizedState=i.baseState=e,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:n,lastRenderedState:e},i.queue=n,n=n.dispatch=Zxe.bind(null,vs,n),[i.memoizedState,n]},useRef:function(n){var e=Th();return n={current:n},e.memoizedState=n},useState:YJ,useDebugValue:zK,useDeferredValue:function(n){return Th().memoizedState=n},useTransition:function(){var n=YJ(!1),e=n[0];return n=Yxe.bind(null,n[1]),Th().memoizedState=n,[e,n]},useMutableSource:function(){},useSyncExternalStore:function(n,e,t){var i=vs,s=Th();if(es){if(t===void 0)throw Error($e(407));t=t()}else{if(t=e(),Ko===null)throw Error($e(349));H1&30||she(i,e,t)}s.memoizedState=t;var o={value:t,getSnapshot:e};return s.queue=o,ZJ(rhe.bind(null,i,o,n),[n]),i.flags|=2048,BE(9,ohe.bind(null,i,o,t,e),void 0,null),t},useId:function(){var n=Th(),e=Ko.identifierPrefix;if(es){var t=Ff,i=Of;t=(i&~(1<<32-Vd(i)-1)).toString(32)+t,e=":"+e+"R"+t,t=OE++,0<\/script>",n=n.removeChild(n.firstChild)):typeof i.is=="string"?n=r.createElement(t,{is:i.is}):(n=r.createElement(t),t==="select"&&(r=n,i.multiple?r.multiple=!0:i.size&&(r.size=i.size))):n=r.createElementNS(n,t),n[Yh]=e,n[ME]=i,Dhe(n,e,!1,!1),e.stateNode=n;e:{switch(r=Q6(t,i),t){case"dialog":Gn("cancel",n),Gn("close",n),s=i;break;case"iframe":case"object":case"embed":Gn("load",n),s=i;break;case"video":case"audio":for(s=0;sGy&&(e.flags|=128,i=!0,Ax(o,!1),e.lanes=4194304)}else{if(!i)if(n=EM(r),n!==null){if(e.flags|=128,i=!0,t=n.updateQueue,t!==null&&(e.updateQueue=t,e.flags|=4),Ax(o,!0),o.tail===null&&o.tailMode==="hidden"&&!r.alternate&&!es)return Dr(e),null}else 2*Hs()-o.renderingStartTime>Gy&&t!==1073741824&&(e.flags|=128,i=!0,Ax(o,!1),e.lanes=4194304);o.isBackwards?(r.sibling=e.child,e.child=r):(t=o.last,t!==null?t.sibling=r:e.child=r,o.last=r)}return o.tail!==null?(e=o.tail,o.rendering=e,o.tail=e.sibling,o.renderingStartTime=Hs(),e.sibling=null,t=gs.current,$n(gs,i?t&1|2:t&1),e):(Dr(e),null);case 22:case 23:return GK(),i=e.memoizedState!==null,n!==null&&n.memoizedState!==null!==i&&(e.flags|=8192),i&&e.mode&1?Rl&1073741824&&(Dr(e),e.subtreeFlags&6&&(e.flags|=8192)):Dr(e),null;case 24:return null;case 25:return null}throw Error($e(156,e.tag))}function rLe(n,e){switch(IK(e),e.tag){case 1:return nl(e.type)&&wM(),n=e.flags,n&65536?(e.flags=n&-65537|128,e):null;case 3:return qy(),Zn(il),Zn(zr),FK(),n=e.flags,n&65536&&!(n&128)?(e.flags=n&-65537|128,e):null;case 5:return OK(e),null;case 13:if(Zn(gs),n=e.memoizedState,n!==null&&n.dehydrated!==null){if(e.alternate===null)throw Error($e(340));$y()}return n=e.flags,n&65536?(e.flags=n&-65537|128,e):null;case 19:return Zn(gs),null;case 4:return qy(),null;case 10:return RK(e.type._context),null;case 22:case 23:return GK(),null;case 24:return null;default:return null}}var gT=!1,Or=!1,aLe=typeof WeakSet=="function"?WeakSet:Set,ft=null;function e0(n,e){var t=n.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(i){Ds(n,e,i)}else t.current=null}function LB(n,e,t){try{t()}catch(i){Ds(n,e,i)}}var aee=!1;function lLe(n,e){if(lB=mM,n=Fde(),kK(n)){if("selectionStart"in n)var t={start:n.selectionStart,end:n.selectionEnd};else e:{t=(t=n.ownerDocument)&&t.defaultView||window;var i=t.getSelection&&t.getSelection();if(i&&i.rangeCount!==0){t=i.anchorNode;var s=i.anchorOffset,o=i.focusNode;i=i.focusOffset;try{t.nodeType,o.nodeType}catch{t=null;break e}var r=0,a=-1,l=-1,c=0,d=0,h=n,u=null;t:for(;;){for(var f;h!==t||s!==0&&h.nodeType!==3||(a=r+s),h!==o||i!==0&&h.nodeType!==3||(l=r+i),h.nodeType===3&&(r+=h.nodeValue.length),(f=h.firstChild)!==null;)u=h,h=f;for(;;){if(h===n)break t;if(u===t&&++c===s&&(a=r),u===o&&++d===i&&(l=r),(f=h.nextSibling)!==null)break;h=u,u=h.parentNode}h=f}t=a===-1||l===-1?null:{start:a,end:l}}else t=null}t=t||{start:0,end:0}}else t=null;for(cB={focusedElem:n,selectionRange:t},mM=!1,ft=e;ft!==null;)if(e=ft,n=e.child,(e.subtreeFlags&1028)!==0&&n!==null)n.return=e,ft=n;else for(;ft!==null;){e=ft;try{var g=e.alternate;if(e.flags&1024)switch(e.tag){case 0:case 11:case 15:break;case 1:if(g!==null){var p=g.memoizedProps,m=g.memoizedState,b=e.stateNode,v=b.getSnapshotBeforeUpdate(e.elementType===e.type?p:bd(e.type,p),m);b.__reactInternalSnapshotBeforeUpdate=v}break;case 3:var w=e.stateNode.containerInfo;w.nodeType===1?w.textContent="":w.nodeType===9&&w.documentElement&&w.removeChild(w.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error($e(163))}}catch(C){Ds(e,e.return,C)}if(n=e.sibling,n!==null){n.return=e.return,ft=n;break}ft=e.return}return g=aee,aee=!1,g}function tk(n,e,t){var i=e.updateQueue;if(i=i!==null?i.lastEffect:null,i!==null){var s=i=i.next;do{if((s.tag&n)===n){var o=s.destroy;s.destroy=void 0,o!==void 0&&LB(e,t,o)}s=s.next}while(s!==i)}}function l5(n,e){if(e=e.updateQueue,e=e!==null?e.lastEffect:null,e!==null){var t=e=e.next;do{if((t.tag&n)===n){var i=t.create;t.destroy=i()}t=t.next}while(t!==e)}}function kB(n){var e=n.ref;if(e!==null){var t=n.stateNode;switch(n.tag){case 5:n=t;break;default:n=t}typeof e=="function"?e(n):e.current=n}}function Mhe(n){var e=n.alternate;e!==null&&(n.alternate=null,Mhe(e)),n.child=null,n.deletions=null,n.sibling=null,n.tag===5&&(e=n.stateNode,e!==null&&(delete e[Yh],delete e[ME],delete e[uB],delete e[$xe],delete e[Uxe])),n.stateNode=null,n.return=null,n.dependencies=null,n.memoizedProps=null,n.memoizedState=null,n.pendingProps=null,n.stateNode=null,n.updateQueue=null}function Ahe(n){return n.tag===5||n.tag===3||n.tag===4}function lee(n){e:for(;;){for(;n.sibling===null;){if(n.return===null||Ahe(n.return))return null;n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==5&&n.tag!==6&&n.tag!==18;){if(n.flags&2||n.child===null||n.tag===4)continue e;n.child.return=n,n=n.child}if(!(n.flags&2))return n.stateNode}}function EB(n,e,t){var i=n.tag;if(i===5||i===6)n=n.stateNode,e?t.nodeType===8?t.parentNode.insertBefore(n,e):t.insertBefore(n,e):(t.nodeType===8?(e=t.parentNode,e.insertBefore(n,t)):(e=t,e.appendChild(n)),t=t._reactRootContainer,t!=null||e.onclick!==null||(e.onclick=vM));else if(i!==4&&(n=n.child,n!==null))for(EB(n,e,t),n=n.sibling;n!==null;)EB(n,e,t),n=n.sibling}function IB(n,e,t){var i=n.tag;if(i===5||i===6)n=n.stateNode,e?t.insertBefore(n,e):t.appendChild(n);else if(i!==4&&(n=n.child,n!==null))for(IB(n,e,t),n=n.sibling;n!==null;)IB(n,e,t),n=n.sibling}var sr=null,Cd=!1;function sp(n,e,t){for(t=t.child;t!==null;)Phe(n,e,t),t=t.sibling}function Phe(n,e,t){if(cu&&typeof cu.onCommitFiberUnmount=="function")try{cu.onCommitFiberUnmount(e5,t)}catch{}switch(t.tag){case 5:Or||e0(t,e);case 6:var i=sr,s=Cd;sr=null,sp(n,e,t),sr=i,Cd=s,sr!==null&&(Cd?(n=sr,t=t.stateNode,n.nodeType===8?n.parentNode.removeChild(t):n.removeChild(t)):sr.removeChild(t.stateNode));break;case 18:sr!==null&&(Cd?(n=sr,t=t.stateNode,n.nodeType===8?W8(n.parentNode,t):n.nodeType===1&&W8(n,t),IE(n)):W8(sr,t.stateNode));break;case 4:i=sr,s=Cd,sr=t.stateNode.containerInfo,Cd=!0,sp(n,e,t),sr=i,Cd=s;break;case 0:case 11:case 14:case 15:if(!Or&&(i=t.updateQueue,i!==null&&(i=i.lastEffect,i!==null))){s=i=i.next;do{var o=s,r=o.destroy;o=o.tag,r!==void 0&&(o&2||o&4)&&LB(t,e,r),s=s.next}while(s!==i)}sp(n,e,t);break;case 1:if(!Or&&(e0(t,e),i=t.stateNode,typeof i.componentWillUnmount=="function"))try{i.props=t.memoizedProps,i.state=t.memoizedState,i.componentWillUnmount()}catch(a){Ds(t,e,a)}sp(n,e,t);break;case 21:sp(n,e,t);break;case 22:t.mode&1?(Or=(i=Or)||t.memoizedState!==null,sp(n,e,t),Or=i):sp(n,e,t);break;default:sp(n,e,t)}}function cee(n){var e=n.updateQueue;if(e!==null){n.updateQueue=null;var t=n.stateNode;t===null&&(t=n.stateNode=new aLe),e.forEach(function(i){var s=_Le.bind(null,n,i);t.has(i)||(t.add(i),i.then(s,s))})}}function ld(n,e){var t=e.deletions;if(t!==null)for(var i=0;is&&(s=r),i&=~o}if(i=s,i=Hs()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*dLe(i/1960))-i,10n?16:n,qp===null)var i=!1;else{if(n=qp,qp=null,RM=0,ji&6)throw Error($e(331));var s=ji;for(ji|=4,ft=n.current;ft!==null;){var o=ft,r=o.child;if(ft.flags&16){var a=o.deletions;if(a!==null){for(var l=0;lHs()-qK?Cv(n,0):UK|=t),sl(n,e)}function jhe(n,e){e===0&&(n.mode&1?(e=oT,oT<<=1,!(oT&130023424)&&(oT=4194304)):e=1);var t=ga();n=pg(n,e),n!==null&&(UN(n,e,t),sl(n,t))}function mLe(n){var e=n.memoizedState,t=0;e!==null&&(t=e.retryLane),jhe(n,t)}function _Le(n,e){var t=0;switch(n.tag){case 13:var i=n.stateNode,s=n.memoizedState;s!==null&&(t=s.retryLane);break;case 19:i=n.stateNode;break;default:throw Error($e(314))}i!==null&&i.delete(e),jhe(n,t)}var $he;$he=function(n,e,t){if(n!==null)if(n.memoizedProps!==e.pendingProps||il.current)Xa=!0;else{if(!(n.lanes&t)&&!(e.flags&128))return Xa=!1,sLe(n,e,t);Xa=!!(n.flags&131072)}else Xa=!1,es&&e.flags&1048576&&Gde(e,SM,e.index);switch(e.lanes=0,e.tag){case 2:var i=e.type;hR(n,e),n=e.pendingProps;var s=jy(e,zr.current);Y0(e,t),s=WK(null,e,i,n,s,t);var o=HK();return e.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(e.tag=1,e.memoizedState=null,e.updateQueue=null,nl(i)?(o=!0,CM(e)):o=!1,e.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,AK(e),s.updater=a5,e.stateNode=s,s._reactInternals=e,bB(e,i,n,t),e=CB(null,e,i,!0,o,t)):(e.tag=0,es&&o&&EK(e),oa(null,e,s,t),e=e.child),e;case 16:i=e.elementType;e:{switch(hR(n,e),n=e.pendingProps,s=i._init,i=s(i._payload),e.type=i,s=e.tag=vLe(i),n=bd(i,n),s){case 0:e=wB(null,e,i,n,t);break e;case 1:e=see(null,e,i,n,t);break e;case 11:e=iee(null,e,i,n,t);break e;case 14:e=nee(null,e,i,bd(i.type,n),t);break e}throw Error($e(306,i,""))}return e;case 0:return i=e.type,s=e.pendingProps,s=e.elementType===i?s:bd(i,s),wB(n,e,i,s,t);case 1:return i=e.type,s=e.pendingProps,s=e.elementType===i?s:bd(i,s),see(n,e,i,s,t);case 3:e:{if(Ehe(e),n===null)throw Error($e(387));i=e.pendingProps,o=e.memoizedState,s=o.element,ehe(n,e),kM(e,i,null,t);var r=e.memoizedState;if(i=r.element,o.isDehydrated)if(o={element:i,isDehydrated:!1,cache:r.cache,pendingSuspenseBoundaries:r.pendingSuspenseBoundaries,transitions:r.transitions},e.updateQueue.baseState=o,e.memoizedState=o,e.flags&256){s=Ky(Error($e(423)),e),e=oee(n,e,i,t,s);break e}else if(i!==s){s=Ky(Error($e(424)),e),e=oee(n,e,i,t,s);break e}else for(Kl=pm(e.stateNode.containerInfo.firstChild),Yl=e,es=!0,kd=null,t=Qde(e,null,i,t),e.child=t;t;)t.flags=t.flags&-3|4096,t=t.sibling;else{if($y(),i===s){e=mg(n,e,t);break e}oa(n,e,i,t)}e=e.child}return e;case 5:return the(e),n===null&&pB(e),i=e.type,s=e.pendingProps,o=n!==null?n.memoizedProps:null,r=s.children,dB(i,s)?r=null:o!==null&&dB(i,o)&&(e.flags|=32),khe(n,e),oa(n,e,r,t),e.child;case 6:return n===null&&pB(e),null;case 13:return Ihe(n,e,t);case 4:return PK(e,e.stateNode.containerInfo),i=e.pendingProps,n===null?e.child=Uy(e,null,i,t):oa(n,e,i,t),e.child;case 11:return i=e.type,s=e.pendingProps,s=e.elementType===i?s:bd(i,s),iee(n,e,i,s,t);case 7:return oa(n,e,e.pendingProps,t),e.child;case 8:return oa(n,e,e.pendingProps.children,t),e.child;case 12:return oa(n,e,e.pendingProps.children,t),e.child;case 10:e:{if(i=e.type._context,s=e.pendingProps,o=e.memoizedProps,r=s.value,$n(xM,i._currentValue),i._currentValue=r,o!==null)if(Gd(o.value,r)){if(o.children===s.children&&!il.current){e=mg(n,e,t);break e}}else for(o=e.child,o!==null&&(o.return=e);o!==null;){var a=o.dependencies;if(a!==null){r=o.child;for(var l=a.firstContext;l!==null;){if(l.context===i){if(o.tag===1){l=tg(-1,t&-t),l.tag=2;var c=o.updateQueue;if(c!==null){c=c.shared;var d=c.pending;d===null?l.next=l:(l.next=d.next,d.next=l),c.pending=l}}o.lanes|=t,l=o.alternate,l!==null&&(l.lanes|=t),mB(o.return,t,e),a.lanes|=t;break}l=l.next}}else if(o.tag===10)r=o.type===e.type?null:o.child;else if(o.tag===18){if(r=o.return,r===null)throw Error($e(341));r.lanes|=t,a=r.alternate,a!==null&&(a.lanes|=t),mB(r,t,e),r=o.sibling}else r=o.child;if(r!==null)r.return=o;else for(r=o;r!==null;){if(r===e){r=null;break}if(o=r.sibling,o!==null){o.return=r.return,r=o;break}r=r.return}o=r}oa(n,e,s.children,t),e=e.child}return e;case 9:return s=e.type,i=e.pendingProps.children,Y0(e,t),s=Uc(s),i=i(s),e.flags|=1,oa(n,e,i,t),e.child;case 14:return i=e.type,s=bd(i,e.pendingProps),s=bd(i.type,s),nee(n,e,i,s,t);case 15:return xhe(n,e,e.type,e.pendingProps,t);case 17:return i=e.type,s=e.pendingProps,s=e.elementType===i?s:bd(i,s),hR(n,e),e.tag=1,nl(i)?(n=!0,CM(e)):n=!1,Y0(e,t),Che(e,i,s),bB(e,i,s,t),CB(null,e,i,!0,n,t);case 19:return Nhe(n,e,t);case 22:return Lhe(n,e,t)}throw Error($e(156,e.tag))};function Uhe(n,e){return bde(n,e)}function bLe(n,e,t,i){this.tag=n,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=e,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=i,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Bc(n,e,t,i){return new bLe(n,e,t,i)}function ZK(n){return n=n.prototype,!(!n||!n.isReactComponent)}function vLe(n){if(typeof n=="function")return ZK(n)?1:0;if(n!=null){if(n=n.$$typeof,n===pK)return 11;if(n===mK)return 14}return 2}function vm(n,e){var t=n.alternate;return t===null?(t=Bc(n.tag,e,n.key,n.mode),t.elementType=n.elementType,t.type=n.type,t.stateNode=n.stateNode,t.alternate=n,n.alternate=t):(t.pendingProps=e,t.type=n.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=n.flags&14680064,t.childLanes=n.childLanes,t.lanes=n.lanes,t.child=n.child,t.memoizedProps=n.memoizedProps,t.memoizedState=n.memoizedState,t.updateQueue=n.updateQueue,e=n.dependencies,t.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext},t.sibling=n.sibling,t.index=n.index,t.ref=n.ref,t}function gR(n,e,t,i,s,o){var r=2;if(i=n,typeof n=="function")ZK(n)&&(r=1);else if(typeof n=="string")r=5;else e:switch(n){case UC:return yv(t.children,s,o,e);case gK:r=8,s|=8;break;case z6:return n=Bc(12,t,e,s|2),n.elementType=z6,n.lanes=o,n;case j6:return n=Bc(13,t,e,s),n.elementType=j6,n.lanes=o,n;case $6:return n=Bc(19,t,e,s),n.elementType=$6,n.lanes=o,n;case tde:return d5(t,s,o,e);default:if(typeof n=="object"&&n!==null)switch(n.$$typeof){case Jce:r=10;break e;case ede:r=9;break e;case pK:r=11;break e;case mK:r=14;break e;case Cp:r=16,i=null;break e}throw Error($e(130,n==null?n:typeof n,""))}return e=Bc(r,t,e,s),e.elementType=n,e.type=i,e.lanes=o,e}function yv(n,e,t,i){return n=Bc(7,n,i,e),n.lanes=t,n}function d5(n,e,t,i){return n=Bc(22,n,i,e),n.elementType=tde,n.lanes=t,n.stateNode={isHidden:!1},n}function K8(n,e,t){return n=Bc(6,n,null,e),n.lanes=t,n}function G8(n,e,t){return e=Bc(4,n.children!==null?n.children:[],n.key,e),e.lanes=t,e.stateNode={containerInfo:n.containerInfo,pendingChildren:null,implementation:n.implementation},e}function wLe(n,e,t,i,s){this.tag=e,this.containerInfo=n,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=I8(0),this.expirationTimes=I8(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=I8(0),this.identifierPrefix=i,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function XK(n,e,t,i,s,o,r,a,l){return n=new wLe(n,e,t,a,l),e===1?(e=1,o===!0&&(e|=8)):e=0,o=Bc(3,null,null,e),n.current=o,o.stateNode=n,o.memoizedState={element:i,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},AK(o),n}function CLe(n,e,t){var i=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Yhe)}catch(n){console.error(n)}}Yhe(),Yce.exports=dc;var kLe=Yce.exports,_ee=kLe;H6.createRoot=_ee.createRoot,H6.hydrateRoot=_ee.hydrateRoot;function uo(n){if(typeof n=="string"||typeof n=="number")return""+n;let e="";if(Array.isArray(n))for(let t=0,i;t{}};function p5(){for(var n=0,e=arguments.length,t={},i;n=0&&(i=t.slice(s+1),t=t.slice(0,s)),t&&!e.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:i}})}pR.prototype=p5.prototype={constructor:pR,on:function(n,e){var t=this._,i=ILe(n+"",t),s,o=-1,r=i.length;if(arguments.length<2){for(;++o0)for(var t=new Array(s),i=0,s,o;i=0&&(e=n.slice(0,t))!=="xmlns"&&(n=n.slice(t+1)),vee.hasOwnProperty(e)?{space:vee[e],local:n}:n}function DLe(n){return function(){var e=this.ownerDocument,t=this.namespaceURI;return t===MB&&e.documentElement.namespaceURI===MB?e.createElement(n):e.createElementNS(t,n)}}function TLe(n){return function(){return this.ownerDocument.createElementNS(n.space,n.local)}}function Zhe(n){var e=m5(n);return(e.local?TLe:DLe)(e)}function RLe(){}function tG(n){return n==null?RLe:function(){return this.querySelector(n)}}function MLe(n){typeof n!="function"&&(n=tG(n));for(var e=this._groups,t=e.length,i=new Array(t),s=0;s=w&&(w=v+1);!(S=m[w])&&++w=0;)(r=i[s])&&(o&&r.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(r,o),o=r);return this}function ske(n){n||(n=oke);function e(h,u){return h&&u?n(h.__data__,u.__data__):!h-!u}for(var t=this._groups,i=t.length,s=new Array(i),o=0;oe?1:n>=e?0:NaN}function rke(){var n=arguments[0];return arguments[0]=this,n.apply(null,arguments),this}function ake(){return Array.from(this)}function lke(){for(var n=this._groups,e=0,t=n.length;e1?this.each((e==null?vke:typeof e=="function"?Cke:wke)(n,e,t??"")):Yy(this.node(),n)}function Yy(n,e){return n.style.getPropertyValue(e)||tue(n).getComputedStyle(n,null).getPropertyValue(e)}function Ske(n){return function(){delete this[n]}}function xke(n,e){return function(){this[n]=e}}function Lke(n,e){return function(){var t=e.apply(this,arguments);t==null?delete this[n]:this[n]=t}}function kke(n,e){return arguments.length>1?this.each((e==null?Ske:typeof e=="function"?Lke:xke)(n,e)):this.node()[n]}function iue(n){return n.trim().split(/^|\s+/)}function iG(n){return n.classList||new nue(n)}function nue(n){this._node=n,this._names=iue(n.getAttribute("class")||"")}nue.prototype={add:function(n){var e=this._names.indexOf(n);e<0&&(this._names.push(n),this._node.setAttribute("class",this._names.join(" ")))},remove:function(n){var e=this._names.indexOf(n);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(n){return this._names.indexOf(n)>=0}};function sue(n,e){for(var t=iG(n),i=-1,s=e.length;++i=0&&(t=e.slice(i+1),e=e.slice(0,i)),{type:e,name:t}})}function eEe(n){return function(){var e=this.__on;if(e){for(var t=0,i=-1,s=e.length,o;t()=>n;function AB(n,{sourceEvent:e,subject:t,target:i,identifier:s,active:o,x:r,y:a,dx:l,dy:c,dispatch:d}){Object.defineProperties(this,{type:{value:n,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:t,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:s,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:r,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:l,enumerable:!0,configurable:!0},dy:{value:c,enumerable:!0,configurable:!0},_:{value:d}})}AB.prototype.on=function(){var n=this._.on.apply(this._,arguments);return n===this._?this:n};function dEe(n){return!n.ctrlKey&&!n.button}function hEe(){return this.parentNode}function uEe(n,e){return e??{x:n.x,y:n.y}}function fEe(){return navigator.maxTouchPoints||"ontouchstart"in this}function due(){var n=dEe,e=hEe,t=uEe,i=fEe,s={},o=p5("start","drag","end"),r=0,a,l,c,d,h=0;function u(C){C.on("mousedown.drag",f).filter(i).on("touchstart.drag",m).on("touchmove.drag",b,cEe).on("touchend.drag touchcancel.drag",v).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function f(C,S){if(!(d||!n.call(this,C,S))){var L=w(this,e.call(this,C,S),C,S,"mouse");L&&(Wl(C.view).on("mousemove.drag",g,HE).on("mouseup.drag",p,HE),lue(C.view),Y8(C),c=!1,a=C.clientX,l=C.clientY,L("start",C))}}function g(C){if(X0(C),!c){var S=C.clientX-a,L=C.clientY-l;c=S*S+L*L>h}s.mouse("drag",C)}function p(C){Wl(C.view).on("mousemove.drag mouseup.drag",null),cue(C.view,c),X0(C),s.mouse("end",C)}function m(C,S){if(n.call(this,C,S)){var L=C.changedTouches,x=e.call(this,C,S),E=L.length,I,R;for(I=0;I>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):t===8?bT(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):t===4?bT(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=pEe.exec(n))?new Qa(e[1],e[2],e[3],1):(e=mEe.exec(n))?new Qa(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=_Ee.exec(n))?bT(e[1],e[2],e[3],e[4]):(e=bEe.exec(n))?bT(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=vEe.exec(n))?kee(e[1],e[2]/100,e[3]/100,1):(e=wEe.exec(n))?kee(e[1],e[2]/100,e[3]/100,e[4]):wee.hasOwnProperty(n)?See(wee[n]):n==="transparent"?new Qa(NaN,NaN,NaN,0):null}function See(n){return new Qa(n>>16&255,n>>8&255,n&255,1)}function bT(n,e,t,i){return i<=0&&(n=e=t=NaN),new Qa(n,e,t,i)}function SEe(n){return n instanceof ZN||(n=j1(n)),n?(n=n.rgb(),new Qa(n.r,n.g,n.b,n.opacity)):new Qa}function PB(n,e,t,i){return arguments.length===1?SEe(n):new Qa(n,e,t,i??1)}function Qa(n,e,t,i){this.r=+n,this.g=+e,this.b=+t,this.opacity=+i}nG(Qa,PB,hue(ZN,{brighter(n){return n=n==null?OM:Math.pow(OM,n),new Qa(this.r*n,this.g*n,this.b*n,this.opacity)},darker(n){return n=n==null?VE:Math.pow(VE,n),new Qa(this.r*n,this.g*n,this.b*n,this.opacity)},rgb(){return this},clamp(){return new Qa(Sv(this.r),Sv(this.g),Sv(this.b),FM(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:xee,formatHex:xee,formatHex8:xEe,formatRgb:Lee,toString:Lee}));function xee(){return`#${tv(this.r)}${tv(this.g)}${tv(this.b)}`}function xEe(){return`#${tv(this.r)}${tv(this.g)}${tv(this.b)}${tv((isNaN(this.opacity)?1:this.opacity)*255)}`}function Lee(){const n=FM(this.opacity);return`${n===1?"rgb(":"rgba("}${Sv(this.r)}, ${Sv(this.g)}, ${Sv(this.b)}${n===1?")":`, ${n})`}`}function FM(n){return isNaN(n)?1:Math.max(0,Math.min(1,n))}function Sv(n){return Math.max(0,Math.min(255,Math.round(n)||0))}function tv(n){return n=Sv(n),(n<16?"0":"")+n.toString(16)}function kee(n,e,t,i){return i<=0?n=e=t=NaN:t<=0||t>=1?n=e=NaN:e<=0&&(n=NaN),new Ad(n,e,t,i)}function uue(n){if(n instanceof Ad)return new Ad(n.h,n.s,n.l,n.opacity);if(n instanceof ZN||(n=j1(n)),!n)return new Ad;if(n instanceof Ad)return n;n=n.rgb();var e=n.r/255,t=n.g/255,i=n.b/255,s=Math.min(e,t,i),o=Math.max(e,t,i),r=NaN,a=o-s,l=(o+s)/2;return a?(e===o?r=(t-i)/a+(t0&&l<1?0:r,new Ad(r,a,l,n.opacity)}function LEe(n,e,t,i){return arguments.length===1?uue(n):new Ad(n,e,t,i??1)}function Ad(n,e,t,i){this.h=+n,this.s=+e,this.l=+t,this.opacity=+i}nG(Ad,LEe,hue(ZN,{brighter(n){return n=n==null?OM:Math.pow(OM,n),new Ad(this.h,this.s,this.l*n,this.opacity)},darker(n){return n=n==null?VE:Math.pow(VE,n),new Ad(this.h,this.s,this.l*n,this.opacity)},rgb(){var n=this.h%360+(this.h<0)*360,e=isNaN(n)||isNaN(this.s)?0:this.s,t=this.l,i=t+(t<.5?t:1-t)*e,s=2*t-i;return new Qa(Z8(n>=240?n-240:n+120,s,i),Z8(n,s,i),Z8(n<120?n+240:n-120,s,i),this.opacity)},clamp(){return new Ad(Eee(this.h),vT(this.s),vT(this.l),FM(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const n=FM(this.opacity);return`${n===1?"hsl(":"hsla("}${Eee(this.h)}, ${vT(this.s)*100}%, ${vT(this.l)*100}%${n===1?")":`, ${n})`}`}}));function Eee(n){return n=(n||0)%360,n<0?n+360:n}function vT(n){return Math.max(0,Math.min(1,n||0))}function Z8(n,e,t){return(n<60?e+(t-e)*n/60:n<180?t:n<240?e+(t-e)*(240-n)/60:e)*255}const sG=n=>()=>n;function kEe(n,e){return function(t){return n+t*e}}function EEe(n,e,t){return n=Math.pow(n,t),e=Math.pow(e,t)-n,t=1/t,function(i){return Math.pow(n+i*e,t)}}function IEe(n){return(n=+n)==1?fue:function(e,t){return t-e?EEe(e,t,n):sG(isNaN(e)?t:e)}}function fue(n,e){var t=e-n;return t?kEe(n,t):sG(isNaN(n)?e:n)}const BM=function n(e){var t=IEe(e);function i(s,o){var r=t((s=PB(s)).r,(o=PB(o)).r),a=t(s.g,o.g),l=t(s.b,o.b),c=fue(s.opacity,o.opacity);return function(d){return s.r=r(d),s.g=a(d),s.b=l(d),s.opacity=c(d),s+""}}return i.gamma=n,i}(1);function NEe(n,e){e||(e=[]);var t=n?Math.min(e.length,n.length):0,i=e.slice(),s;return function(o){for(s=0;st&&(o=e.slice(t,o),a[r]?a[r]+=o:a[++r]=o),(i=i[0])===(s=s[0])?a[r]?a[r]+=s:a[++r]=s:(a[++r]=null,l.push({i:r,x:zh(i,s)})),t=X8.lastIndex;return t180?d+=360:d-c>180&&(c+=360),u.push({i:h.push(s(h)+"rotate(",null,i)-2,x:zh(c,d)})):d&&h.push(s(h)+"rotate("+d+i)}function a(c,d,h,u){c!==d?u.push({i:h.push(s(h)+"skewX(",null,i)-2,x:zh(c,d)}):d&&h.push(s(h)+"skewX("+d+i)}function l(c,d,h,u,f,g){if(c!==h||d!==u){var p=f.push(s(f)+"scale(",null,",",null,")");g.push({i:p-4,x:zh(c,h)},{i:p-2,x:zh(d,u)})}else(h!==1||u!==1)&&f.push(s(f)+"scale("+h+","+u+")")}return function(c,d){var h=[],u=[];return c=n(c),d=n(d),o(c.translateX,c.translateY,d.translateX,d.translateY,h,u),r(c.rotate,d.rotate,h,u),a(c.skewX,d.skewX,h,u),l(c.scaleX,c.scaleY,d.scaleX,d.scaleY,h,u),c=d=null,function(f){for(var g=-1,p=u.length,m;++g=0&&n._call.call(void 0,e),n=n._next;--Zy}function Dee(){$1=(HM=jE.now())+_5,Zy=SL=0;try{$Ee()}finally{Zy=0,qEe(),$1=0}}function UEe(){var n=jE.now(),e=n-HM;e>_ue&&(_5-=e,HM=n)}function qEe(){for(var n,e=WM,t,i=1/0;e;)e._call?(i>e._time&&(i=e._time),n=e,e=e._next):(t=e._next,e._next=null,e=n?n._next=t:WM=t);xL=n,BB(i)}function BB(n){if(!Zy){SL&&(SL=clearTimeout(SL));var e=n-$1;e>24?(n<1/0&&(SL=setTimeout(Dee,n-jE.now()-_5)),Ox&&(Ox=clearInterval(Ox))):(Ox||(HM=jE.now(),Ox=setInterval(UEe,_ue)),Zy=1,bue(Dee))}}function Tee(n,e,t){var i=new VM;return e=e==null?0:+e,i.restart(s=>{i.stop(),n(s+e)},e,t),i}var KEe=p5("start","end","cancel","interrupt"),GEe=[],wue=0,Ree=1,WB=2,_R=3,Mee=4,HB=5,bR=6;function b5(n,e,t,i,s,o){var r=n.__transition;if(!r)n.__transition={};else if(t in r)return;YEe(n,t,{name:e,index:i,group:s,on:KEe,tween:GEe,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:wue})}function rG(n,e){var t=oh(n,e);if(t.state>wue)throw new Error("too late; already scheduled");return t}function Nu(n,e){var t=oh(n,e);if(t.state>_R)throw new Error("too late; already running");return t}function oh(n,e){var t=n.__transition;if(!t||!(t=t[e]))throw new Error("transition not found");return t}function YEe(n,e,t){var i=n.__transition,s;i[e]=t,t.timer=vue(o,0,t.time);function o(c){t.state=Ree,t.timer.restart(r,t.delay,t.time),t.delay<=c&&r(c-t.delay)}function r(c){var d,h,u,f;if(t.state!==Ree)return l();for(d in i)if(f=i[d],f.name===t.name){if(f.state===_R)return Tee(r);f.state===Mee?(f.state=bR,f.timer.stop(),f.on.call("interrupt",n,n.__data__,f.index,f.group),delete i[d]):+dWB&&i.state=0&&(e=e.slice(0,t)),!e||e==="start"})}function LIe(n,e,t){var i,s,o=xIe(e)?rG:Nu;return function(){var r=o(this,n),a=r.on;a!==i&&(s=(i=a).copy()).on(e,t),r.on=s}}function kIe(n,e){var t=this._id;return arguments.length<2?oh(this.node(),t).on.on(n):this.each(LIe(t,n,e))}function EIe(n){return function(){var e=this.parentNode;for(var t in this.__transition)if(+t!==n)return;e&&e.removeChild(this)}}function IIe(){return this.on("end.remove",EIe(this._id))}function NIe(n){var e=this._name,t=this._id;typeof n!="function"&&(n=tG(n));for(var i=this._groups,s=i.length,o=new Array(s),r=0;r()=>n;function eNe(n,{sourceEvent:e,target:t,transform:i,dispatch:s}){Object.defineProperties(this,{type:{value:n,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},target:{value:t,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:s}})}function Bf(n,e,t){this.k=n,this.x=e,this.y=t}Bf.prototype={constructor:Bf,scale:function(n){return n===1?this:new Bf(this.k*n,this.x,this.y)},translate:function(n,e){return n===0&e===0?this:new Bf(this.k,this.x+this.k*n,this.y+this.k*e)},apply:function(n){return[n[0]*this.k+this.x,n[1]*this.k+this.y]},applyX:function(n){return n*this.k+this.x},applyY:function(n){return n*this.k+this.y},invert:function(n){return[(n[0]-this.x)/this.k,(n[1]-this.y)/this.k]},invertX:function(n){return(n-this.x)/this.k},invertY:function(n){return(n-this.y)/this.k},rescaleX:function(n){return n.copy().domain(n.range().map(this.invertX,this).map(n.invert,n))},rescaleY:function(n){return n.copy().domain(n.range().map(this.invertY,this).map(n.invert,n))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var v5=new Bf(1,0,0);xue.prototype=Bf.prototype;function xue(n){for(;!n.__zoom;)if(!(n=n.parentNode))return v5;return n.__zoom}function Q8(n){n.stopImmediatePropagation()}function Fx(n){n.preventDefault(),n.stopImmediatePropagation()}function tNe(n){return(!n.ctrlKey||n.type==="wheel")&&!n.button}function iNe(){var n=this;return n instanceof SVGElement?(n=n.ownerSVGElement||n,n.hasAttribute("viewBox")?(n=n.viewBox.baseVal,[[n.x,n.y],[n.x+n.width,n.y+n.height]]):[[0,0],[n.width.baseVal.value,n.height.baseVal.value]]):[[0,0],[n.clientWidth,n.clientHeight]]}function Aee(){return this.__zoom||v5}function nNe(n){return-n.deltaY*(n.deltaMode===1?.05:n.deltaMode?1:.002)*(n.ctrlKey?10:1)}function sNe(){return navigator.maxTouchPoints||"ontouchstart"in this}function oNe(n,e,t){var i=n.invertX(e[0][0])-t[0][0],s=n.invertX(e[1][0])-t[1][0],o=n.invertY(e[0][1])-t[0][1],r=n.invertY(e[1][1])-t[1][1];return n.translate(s>i?(i+s)/2:Math.min(0,i)||Math.max(0,s),r>o?(o+r)/2:Math.min(0,o)||Math.max(0,r))}function Lue(){var n=tNe,e=iNe,t=oNe,i=nNe,s=sNe,o=[0,1/0],r=[[-1/0,-1/0],[1/0,1/0]],a=250,l=mR,c=p5("start","zoom","end"),d,h,u,f=500,g=150,p=0,m=10;function b(P){P.property("__zoom",Aee).on("wheel.zoom",E,{passive:!1}).on("mousedown.zoom",I).on("dblclick.zoom",R).filter(s).on("touchstart.zoom",M).on("touchmove.zoom",A).on("touchend.zoom touchcancel.zoom",W).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}b.transform=function(P,B,V,K){var z=P.selection?P.selection():P;z.property("__zoom",Aee),P!==z?S(P,B,V,K):z.interrupt().each(function(){L(this,arguments).event(K).start().zoom(null,typeof B=="function"?B.apply(this,arguments):B).end()})},b.scaleBy=function(P,B,V,K){b.scaleTo(P,function(){var z=this.__zoom.k,j=typeof B=="function"?B.apply(this,arguments):B;return z*j},V,K)},b.scaleTo=function(P,B,V,K){b.transform(P,function(){var z=e.apply(this,arguments),j=this.__zoom,Q=V==null?C(z):typeof V=="function"?V.apply(this,arguments):V,Y=j.invert(Q),te=typeof B=="function"?B.apply(this,arguments):B;return t(w(v(j,te),Q,Y),z,r)},V,K)},b.translateBy=function(P,B,V,K){b.transform(P,function(){return t(this.__zoom.translate(typeof B=="function"?B.apply(this,arguments):B,typeof V=="function"?V.apply(this,arguments):V),e.apply(this,arguments),r)},null,K)},b.translateTo=function(P,B,V,K,z){b.transform(P,function(){var j=e.apply(this,arguments),Q=this.__zoom,Y=K==null?C(j):typeof K=="function"?K.apply(this,arguments):K;return t(v5.translate(Y[0],Y[1]).scale(Q.k).translate(typeof B=="function"?-B.apply(this,arguments):-B,typeof V=="function"?-V.apply(this,arguments):-V),j,r)},K,z)};function v(P,B){return B=Math.max(o[0],Math.min(o[1],B)),B===P.k?P:new Bf(B,P.x,P.y)}function w(P,B,V){var K=B[0]-V[0]*P.k,z=B[1]-V[1]*P.k;return K===P.x&&z===P.y?P:new Bf(P.k,K,z)}function C(P){return[(+P[0][0]+ +P[1][0])/2,(+P[0][1]+ +P[1][1])/2]}function S(P,B,V,K){P.on("start.zoom",function(){L(this,arguments).event(K).start()}).on("interrupt.zoom end.zoom",function(){L(this,arguments).event(K).end()}).tween("zoom",function(){var z=this,j=arguments,Q=L(z,j).event(K),Y=e.apply(z,j),te=V==null?C(Y):typeof V=="function"?V.apply(z,j):V,ce=Math.max(Y[1][0]-Y[0][0],Y[1][1]-Y[0][1]),Ce=z.__zoom,xe=typeof B=="function"?B.apply(z,j):B,je=l(Ce.invert(te).concat(ce/Ce.k),xe.invert(te).concat(ce/xe.k));return function(ke){if(ke===1)ke=xe;else{var Le=je(ke),Ve=ce/Le[2];ke=new Bf(Ve,te[0]-Le[0]*Ve,te[1]-Le[1]*Ve)}Q.zoom(null,ke)}})}function L(P,B,V){return!V&&P.__zooming||new x(P,B)}function x(P,B){this.that=P,this.args=B,this.active=0,this.sourceEvent=null,this.extent=e.apply(P,B),this.taps=0}x.prototype={event:function(P){return P&&(this.sourceEvent=P),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(P,B){return this.mouse&&P!=="mouse"&&(this.mouse[1]=B.invert(this.mouse[0])),this.touch0&&P!=="touch"&&(this.touch0[1]=B.invert(this.touch0[0])),this.touch1&&P!=="touch"&&(this.touch1[1]=B.invert(this.touch1[0])),this.that.__zoom=B,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(P){var B=Wl(this.that).datum();c.call(P,this.that,new eNe(P,{sourceEvent:this.sourceEvent,target:b,transform:this.that.__zoom,dispatch:c}),B)}};function E(P,...B){if(!n.apply(this,arguments))return;var V=L(this,B).event(P),K=this.__zoom,z=Math.max(o[0],Math.min(o[1],K.k*Math.pow(2,i.apply(this,arguments)))),j=yd(P);if(V.wheel)(V.mouse[0][0]!==j[0]||V.mouse[0][1]!==j[1])&&(V.mouse[1]=K.invert(V.mouse[0]=j)),clearTimeout(V.wheel);else{if(K.k===z)return;V.mouse=[j,K.invert(j)],vR(this),V.start()}Fx(P),V.wheel=setTimeout(Q,g),V.zoom("mouse",t(w(v(K,z),V.mouse[0],V.mouse[1]),V.extent,r));function Q(){V.wheel=null,V.end()}}function I(P,...B){if(u||!n.apply(this,arguments))return;var V=P.currentTarget,K=L(this,B,!0).event(P),z=Wl(P.view).on("mousemove.zoom",te,!0).on("mouseup.zoom",ce,!0),j=yd(P,V),Q=P.clientX,Y=P.clientY;lue(P.view),Q8(P),K.mouse=[j,this.__zoom.invert(j)],vR(this),K.start();function te(Ce){if(Fx(Ce),!K.moved){var xe=Ce.clientX-Q,je=Ce.clientY-Y;K.moved=xe*xe+je*je>p}K.event(Ce).zoom("mouse",t(w(K.that.__zoom,K.mouse[0]=yd(Ce,V),K.mouse[1]),K.extent,r))}function ce(Ce){z.on("mousemove.zoom mouseup.zoom",null),cue(Ce.view,K.moved),Fx(Ce),K.event(Ce).end()}}function R(P,...B){if(n.apply(this,arguments)){var V=this.__zoom,K=yd(P.changedTouches?P.changedTouches[0]:P,this),z=V.invert(K),j=V.k*(P.shiftKey?.5:2),Q=t(w(v(V,j),K,z),e.apply(this,B),r);Fx(P),a>0?Wl(this).transition().duration(a).call(S,Q,K,P):Wl(this).call(b.transform,Q,K,P)}}function M(P,...B){if(n.apply(this,arguments)){var V=P.touches,K=V.length,z=L(this,B,P.changedTouches.length===K).event(P),j,Q,Y,te;for(Q8(P),Q=0;Q"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:n=>`Node type "${n}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:n=>`The old edge with id=${n} does not exist.`,error009:n=>`Marker type "${n}" doesn't exist.`,error008:(n,{id:e,sourceHandle:t,targetHandle:i})=>`Couldn't create edge for ${n} handle id: "${n==="source"?t:i}", edge id: ${e}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:n=>`Edge type "${n}" not found. Using fallback type "default".`,error012:n=>`Node with id "${n}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(n="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${n}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs."},$E=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],kue=["Enter"," ","Escape"],Eue={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:n,x:e,y:t})=>`Moved selected node ${n}. New position, x: ${e}, y: ${t}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var Xy;(function(n){n.Strict="strict",n.Loose="loose"})(Xy||(Xy={}));var xv;(function(n){n.Free="free",n.Vertical="vertical",n.Horizontal="horizontal"})(xv||(xv={}));var UE;(function(n){n.Partial="partial",n.Full="full"})(UE||(UE={}));const Iue={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Nf;(function(n){n.Bezier="default",n.Straight="straight",n.Step="step",n.SmoothStep="smoothstep",n.SimpleBezier="simplebezier"})(Nf||(Nf={}));var U1;(function(n){n.Arrow="arrow",n.ArrowClosed="arrowclosed"})(U1||(U1={}));var It;(function(n){n.Left="left",n.Top="top",n.Right="right",n.Bottom="bottom"})(It||(It={}));const Pee={[It.Left]:It.Right,[It.Right]:It.Left,[It.Top]:It.Bottom,[It.Bottom]:It.Top};function Nue(n){return n===null?null:n?"valid":"invalid"}const Due=n=>"id"in n&&"source"in n&&"target"in n,rNe=n=>"id"in n&&"position"in n&&!("source"in n)&&!("target"in n),lG=n=>"id"in n&&"internals"in n&&!("source"in n)&&!("target"in n),XN=(n,e=[0,0])=>{const{width:t,height:i}=Wg(n),s=n.origin??e,o=t*s[0],r=i*s[1];return{x:n.position.x-o,y:n.position.y-r}},aNe=(n,e={nodeOrigin:[0,0]})=>{if(n.length===0)return{x:0,y:0,width:0,height:0};const t=n.reduce((i,s)=>{const o=typeof s=="string";let r=!e.nodeLookup&&!o?s:void 0;e.nodeLookup&&(r=o?e.nodeLookup.get(s):lG(s)?s:e.nodeLookup.get(s.id));const a=r?zM(r,e.nodeOrigin):{x:0,y:0,x2:0,y2:0};return w5(i,a)},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return C5(t)},QN=(n,e={})=>{let t={x:1/0,y:1/0,x2:-1/0,y2:-1/0},i=!1;return n.forEach(s=>{(e.filter===void 0||e.filter(s))&&(t=w5(t,zM(s)),i=!0)}),i?C5(t):{x:0,y:0,width:0,height:0}},cG=(n,e,[t,i,s]=[0,0,1],o=!1,r=!1)=>{const a={...eD(e,[t,i,s]),width:e.width/s,height:e.height/s},l=[];for(const c of n.values()){const{measured:d,selectable:h=!0,hidden:u=!1}=c;if(r&&!h||u)continue;const f=d.width??c.width??c.initialWidth??null,g=d.height??c.height??c.initialHeight??null,p=qE(a,Jy(c)),m=(f??0)*(g??0),b=o&&p>0;(!c.internals.handleBounds||b||p>=m||c.dragging)&&l.push(c)}return l},lNe=(n,e)=>{const t=new Set;return n.forEach(i=>{t.add(i.id)}),e.filter(i=>t.has(i.source)||t.has(i.target))};function cNe(n,e){const t=new Map,i=e!=null&&e.nodes?new Set(e.nodes.map(s=>s.id)):null;return n.forEach(s=>{s.measured.width&&s.measured.height&&((e==null?void 0:e.includeHiddenNodes)||!s.hidden)&&(!i||i.has(s.id))&&t.set(s.id,s)}),t}async function dNe({nodes:n,width:e,height:t,panZoom:i,minZoom:s,maxZoom:o},r){if(n.size===0)return Promise.resolve(!0);const a=cNe(n,r),l=QN(a),c=dG(l,e,t,(r==null?void 0:r.minZoom)??s,(r==null?void 0:r.maxZoom)??o,(r==null?void 0:r.padding)??.1);return await i.setViewport(c,{duration:r==null?void 0:r.duration,ease:r==null?void 0:r.ease,interpolate:r==null?void 0:r.interpolate}),Promise.resolve(!0)}function Tue({nodeId:n,nextPosition:e,nodeLookup:t,nodeOrigin:i=[0,0],nodeExtent:s,onError:o}){const r=t.get(n),a=r.parentId?t.get(r.parentId):void 0,{x:l,y:c}=a?a.internals.positionAbsolute:{x:0,y:0},d=r.origin??i;let h=r.extent||s;if(r.extent==="parent"&&!r.expandParent)if(!a)o==null||o("005",_u.error005());else{const f=a.measured.width,g=a.measured.height;f&&g&&(h=[[l,c],[l+f,c+g]])}else a&&eS(r.extent)&&(h=[[r.extent[0][0]+l,r.extent[0][1]+c],[r.extent[1][0]+l,r.extent[1][1]+c]]);const u=eS(h)?q1(e,h,r.measured):e;return(r.measured.width===void 0||r.measured.height===void 0)&&(o==null||o("015",_u.error015())),{position:{x:u.x-l+(r.measured.width??0)*d[0],y:u.y-c+(r.measured.height??0)*d[1]},positionAbsolute:u}}async function hNe({nodesToRemove:n=[],edgesToRemove:e=[],nodes:t,edges:i,onBeforeDelete:s}){const o=new Set(n.map(u=>u.id)),r=[];for(const u of t){if(u.deletable===!1)continue;const f=o.has(u.id),g=!f&&u.parentId&&r.find(p=>p.id===u.parentId);(f||g)&&r.push(u)}const a=new Set(e.map(u=>u.id)),l=i.filter(u=>u.deletable!==!1),d=lNe(r,l);for(const u of l)a.has(u.id)&&!d.find(g=>g.id===u.id)&&d.push(u);if(!s)return{edges:d,nodes:r};const h=await s({nodes:r,edges:d});return typeof h=="boolean"?h?{edges:d,nodes:r}:{edges:[],nodes:[]}:h}const Qy=(n,e=0,t=1)=>Math.min(Math.max(n,e),t),q1=(n={x:0,y:0},e,t)=>({x:Qy(n.x,e[0][0],e[1][0]-((t==null?void 0:t.width)??0)),y:Qy(n.y,e[0][1],e[1][1]-((t==null?void 0:t.height)??0))});function Rue(n,e,t){const{width:i,height:s}=Wg(t),{x:o,y:r}=t.internals.positionAbsolute;return q1(n,[[o,r],[o+i,r+s]],e)}const Oee=(n,e,t)=>nt?-Qy(Math.abs(n-t),1,e)/e:0,Mue=(n,e,t=15,i=40)=>{const s=Oee(n.x,i,e.width-i)*t,o=Oee(n.y,i,e.height-i)*t;return[s,o]},w5=(n,e)=>({x:Math.min(n.x,e.x),y:Math.min(n.y,e.y),x2:Math.max(n.x2,e.x2),y2:Math.max(n.y2,e.y2)}),VB=({x:n,y:e,width:t,height:i})=>({x:n,y:e,x2:n+t,y2:e+i}),C5=({x:n,y:e,x2:t,y2:i})=>({x:n,y:e,width:t-n,height:i-e}),Jy=(n,e=[0,0])=>{var s,o;const{x:t,y:i}=lG(n)?n.internals.positionAbsolute:XN(n,e);return{x:t,y:i,width:((s=n.measured)==null?void 0:s.width)??n.width??n.initialWidth??0,height:((o=n.measured)==null?void 0:o.height)??n.height??n.initialHeight??0}},zM=(n,e=[0,0])=>{var s,o;const{x:t,y:i}=lG(n)?n.internals.positionAbsolute:XN(n,e);return{x:t,y:i,x2:t+(((s=n.measured)==null?void 0:s.width)??n.width??n.initialWidth??0),y2:i+(((o=n.measured)==null?void 0:o.height)??n.height??n.initialHeight??0)}},Aue=(n,e)=>C5(w5(VB(n),VB(e))),qE=(n,e)=>{const t=Math.max(0,Math.min(n.x+n.width,e.x+e.width)-Math.max(n.x,e.x)),i=Math.max(0,Math.min(n.y+n.height,e.y+e.height)-Math.max(n.y,e.y));return Math.ceil(t*i)},Fee=n=>Od(n.width)&&Od(n.height)&&Od(n.x)&&Od(n.y),Od=n=>!isNaN(n)&&isFinite(n),uNe=(n,e)=>{},JN=(n,e=[1,1])=>({x:e[0]*Math.round(n.x/e[0]),y:e[1]*Math.round(n.y/e[1])}),eD=({x:n,y:e},[t,i,s],o=!1,r=[1,1])=>{const a={x:(n-t)/s,y:(e-i)/s};return o?JN(a,r):a},jM=({x:n,y:e},[t,i,s])=>({x:n*s+t,y:e*s+i});function lC(n,e){if(typeof n=="number")return Math.floor((e-e/(1+n))*.5);if(typeof n=="string"&&n.endsWith("px")){const t=parseFloat(n);if(!Number.isNaN(t))return Math.floor(t)}if(typeof n=="string"&&n.endsWith("%")){const t=parseFloat(n);if(!Number.isNaN(t))return Math.floor(e*t*.01)}return console.error(`[React Flow] The padding value "${n}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function fNe(n,e,t){if(typeof n=="string"||typeof n=="number"){const i=lC(n,t),s=lC(n,e);return{top:i,right:s,bottom:i,left:s,x:s*2,y:i*2}}if(typeof n=="object"){const i=lC(n.top??n.y??0,t),s=lC(n.bottom??n.y??0,t),o=lC(n.left??n.x??0,e),r=lC(n.right??n.x??0,e);return{top:i,right:r,bottom:s,left:o,x:o+r,y:i+s}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function gNe(n,e,t,i,s,o){const{x:r,y:a}=jM(n,[e,t,i]),{x:l,y:c}=jM({x:n.x+n.width,y:n.y+n.height},[e,t,i]),d=s-l,h=o-c;return{left:Math.floor(r),top:Math.floor(a),right:Math.floor(d),bottom:Math.floor(h)}}const dG=(n,e,t,i,s,o)=>{const r=fNe(o,e,t),a=(e-r.x)/n.width,l=(t-r.y)/n.height,c=Math.min(a,l),d=Qy(c,i,s),h=n.x+n.width/2,u=n.y+n.height/2,f=e/2-h*d,g=t/2-u*d,p=gNe(n,f,g,d,e,t),m={left:Math.min(p.left-r.left,0),top:Math.min(p.top-r.top,0),right:Math.min(p.right-r.right,0),bottom:Math.min(p.bottom-r.bottom,0)};return{x:f-m.left+m.right,y:g-m.top+m.bottom,zoom:d}},KE=()=>{var n;return typeof navigator<"u"&&((n=navigator==null?void 0:navigator.userAgent)==null?void 0:n.indexOf("Mac"))>=0};function eS(n){return n!=null&&n!=="parent"}function Wg(n){var e,t;return{width:((e=n.measured)==null?void 0:e.width)??n.width??n.initialWidth??0,height:((t=n.measured)==null?void 0:t.height)??n.height??n.initialHeight??0}}function Pue(n){var e,t;return(((e=n.measured)==null?void 0:e.width)??n.width??n.initialWidth)!==void 0&&(((t=n.measured)==null?void 0:t.height)??n.height??n.initialHeight)!==void 0}function Oue(n,e={width:0,height:0},t,i,s){const o={...n},r=i.get(t);if(r){const a=r.origin||s;o.x+=r.internals.positionAbsolute.x-(e.width??0)*a[0],o.y+=r.internals.positionAbsolute.y-(e.height??0)*a[1]}return o}function Bee(n,e){if(n.size!==e.size)return!1;for(const t of n)if(!e.has(t))return!1;return!0}function pNe(){let n,e;return{promise:new Promise((i,s)=>{n=i,e=s}),resolve:n,reject:e}}function mNe(n){return{...Eue,...n||{}}}function ok(n,{snapGrid:e=[0,0],snapToGrid:t=!1,transform:i,containerBounds:s}){const{x:o,y:r}=Fd(n),a=eD({x:o-((s==null?void 0:s.left)??0),y:r-((s==null?void 0:s.top)??0)},i),{x:l,y:c}=t?JN(a,e):a;return{xSnapped:l,ySnapped:c,...a}}const hG=n=>({width:n.offsetWidth,height:n.offsetHeight}),Fue=n=>{var e;return((e=n==null?void 0:n.getRootNode)==null?void 0:e.call(n))||(window==null?void 0:window.document)},_Ne=["INPUT","SELECT","TEXTAREA"];function Bue(n){var i,s;const e=((s=(i=n.composedPath)==null?void 0:i.call(n))==null?void 0:s[0])||n.target;return(e==null?void 0:e.nodeType)!==1?!1:_Ne.includes(e.nodeName)||e.hasAttribute("contenteditable")||!!e.closest(".nokey")}const Wue=n=>"clientX"in n,Fd=(n,e)=>{var o,r;const t=Wue(n),i=t?n.clientX:(o=n.touches)==null?void 0:o[0].clientX,s=t?n.clientY:(r=n.touches)==null?void 0:r[0].clientY;return{x:i-((e==null?void 0:e.left)??0),y:s-((e==null?void 0:e.top)??0)}},Wee=(n,e,t,i,s)=>{const o=e.querySelectorAll(`.${n}`);return!o||!o.length?null:Array.from(o).map(r=>{const a=r.getBoundingClientRect();return{id:r.getAttribute("data-handleid"),type:n,nodeId:s,position:r.getAttribute("data-handlepos"),x:(a.left-t.left)/i,y:(a.top-t.top)/i,...hG(r)}})};function Hue({sourceX:n,sourceY:e,targetX:t,targetY:i,sourceControlX:s,sourceControlY:o,targetControlX:r,targetControlY:a}){const l=n*.125+s*.375+r*.375+t*.125,c=e*.125+o*.375+a*.375+i*.125,d=Math.abs(l-n),h=Math.abs(c-e);return[l,c,d,h]}function yT(n,e){return n>=0?.5*n:e*25*Math.sqrt(-n)}function Hee({pos:n,x1:e,y1:t,x2:i,y2:s,c:o}){switch(n){case It.Left:return[e-yT(e-i,o),t];case It.Right:return[e+yT(i-e,o),t];case It.Top:return[e,t-yT(t-s,o)];case It.Bottom:return[e,t+yT(s-t,o)]}}function Vue({sourceX:n,sourceY:e,sourcePosition:t=It.Bottom,targetX:i,targetY:s,targetPosition:o=It.Top,curvature:r=.25}){const[a,l]=Hee({pos:t,x1:n,y1:e,x2:i,y2:s,c:r}),[c,d]=Hee({pos:o,x1:i,y1:s,x2:n,y2:e,c:r}),[h,u,f,g]=Hue({sourceX:n,sourceY:e,targetX:i,targetY:s,sourceControlX:a,sourceControlY:l,targetControlX:c,targetControlY:d});return[`M${n},${e} C${a},${l} ${c},${d} ${i},${s}`,h,u,f,g]}function zue({sourceX:n,sourceY:e,targetX:t,targetY:i}){const s=Math.abs(t-n)/2,o=t0}const wNe=({source:n,sourceHandle:e,target:t,targetHandle:i})=>`xy-edge__${n}${e||""}-${t}${i||""}`,CNe=(n,e)=>e.some(t=>t.source===n.source&&t.target===n.target&&(t.sourceHandle===n.sourceHandle||!t.sourceHandle&&!n.sourceHandle)&&(t.targetHandle===n.targetHandle||!t.targetHandle&&!n.targetHandle)),yNe=(n,e,t={})=>{if(!n.source||!n.target)return e;const i=t.getEdgeId||wNe;let s;return Due(n)?s={...n}:s={...n,id:i(n)},CNe(s,e)?e:(s.sourceHandle===null&&delete s.sourceHandle,s.targetHandle===null&&delete s.targetHandle,e.concat(s))};function jue({sourceX:n,sourceY:e,targetX:t,targetY:i}){const[s,o,r,a]=zue({sourceX:n,sourceY:e,targetX:t,targetY:i});return[`M ${n},${e}L ${t},${i}`,s,o,r,a]}const Vee={[It.Left]:{x:-1,y:0},[It.Right]:{x:1,y:0},[It.Top]:{x:0,y:-1},[It.Bottom]:{x:0,y:1}},SNe=({source:n,sourcePosition:e=It.Bottom,target:t})=>e===It.Left||e===It.Right?n.xMath.sqrt(Math.pow(e.x-n.x,2)+Math.pow(e.y-n.y,2));function xNe({source:n,sourcePosition:e=It.Bottom,target:t,targetPosition:i=It.Top,center:s,offset:o,stepPosition:r}){const a=Vee[e],l=Vee[i],c={x:n.x+a.x*o,y:n.y+a.y*o},d={x:t.x+l.x*o,y:t.y+l.y*o},h=SNe({source:c,sourcePosition:e,target:d}),u=h.x!==0?"x":"y",f=h[u];let g=[],p,m;const b={x:0,y:0},v={x:0,y:0},[,,w,C]=zue({sourceX:n.x,sourceY:n.y,targetX:t.x,targetY:t.y});if(a[u]*l[u]===-1){u==="x"?(p=s.x??c.x+(d.x-c.x)*r,m=s.y??(c.y+d.y)/2):(p=s.x??(c.x+d.x)/2,m=s.y??c.y+(d.y-c.y)*r);const L=[{x:p,y:c.y},{x:p,y:d.y}],x=[{x:c.x,y:m},{x:d.x,y:m}];a[u]===f?g=u==="x"?L:x:g=u==="x"?x:L}else{const L=[{x:c.x,y:d.y}],x=[{x:d.x,y:c.y}];if(u==="x"?g=a.x===f?x:L:g=a.y===f?L:x,e===i){const A=Math.abs(n[u]-t[u]);if(A<=o){const W=Math.min(o-1,o-A);a[u]===f?b[u]=(c[u]>n[u]?-1:1)*W:v[u]=(d[u]>t[u]?-1:1)*W}}if(e!==i){const A=u==="x"?"y":"x",W=a[u]===l[A],P=c[A]>d[A],B=c[A]=M?(p=(E.x+I.x)/2,m=g[0].y):(p=g[0].x,m=(E.y+I.y)/2)}return[[n,{x:c.x+b.x,y:c.y+b.y},...g,{x:d.x+v.x,y:d.y+v.y},t],p,m,w,C]}function LNe(n,e,t,i){const s=Math.min(zee(n,e)/2,zee(e,t)/2,i),{x:o,y:r}=e;if(n.x===o&&o===t.x||n.y===r&&r===t.y)return`L${o} ${r}`;if(n.y===r){const c=n.x{let C="";return w>0&&wt.id===e):n[0])||null}function jB(n,e){return n?typeof n=="string"?n:`${e?`${e}__`:""}${Object.keys(n).sort().map(i=>`${i}=${n[i]}`).join("&")}`:""}function ENe(n,{id:e,defaultColor:t,defaultMarkerStart:i,defaultMarkerEnd:s}){const o=new Set;return n.reduce((r,a)=>([a.markerStart||i,a.markerEnd||s].forEach(l=>{if(l&&typeof l=="object"){const c=jB(l,e);o.has(c)||(r.push({id:c,color:l.color||t,...l}),o.add(c))}}),r),[]).sort((r,a)=>r.id.localeCompare(a.id))}const $ue=1e3,INe=10,uG={nodeOrigin:[0,0],nodeExtent:$E,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},NNe={...uG,checkEquality:!0};function fG(n,e){const t={...n};for(const i in e)e[i]!==void 0&&(t[i]=e[i]);return t}function DNe(n,e,t){const i=fG(uG,t);for(const s of n.values())if(s.parentId)pG(s,n,e,i);else{const o=XN(s,i.nodeOrigin),r=eS(s.extent)?s.extent:i.nodeExtent,a=q1(o,r,Wg(s));s.internals.positionAbsolute=a}}function TNe(n,e){if(!n.handles)return n.measured?e==null?void 0:e.internals.handleBounds:void 0;const t=[],i=[];for(const s of n.handles){const o={id:s.id,width:s.width??1,height:s.height??1,nodeId:n.id,x:s.x,y:s.y,position:s.position,type:s.type};s.type==="source"?t.push(o):s.type==="target"&&i.push(o)}return{source:t,target:i}}function gG(n){return n==="manual"}function $B(n,e,t,i={}){var c,d;const s=fG(NNe,i),o={i:0},r=new Map(e),a=s!=null&&s.elevateNodesOnSelect&&!gG(s.zIndexMode)?$ue:0;let l=n.length>0;e.clear(),t.clear();for(const h of n){let u=r.get(h.id);if(s.checkEquality&&h===(u==null?void 0:u.internals.userNode))e.set(h.id,u);else{const f=XN(h,s.nodeOrigin),g=eS(h.extent)?h.extent:s.nodeExtent,p=q1(f,g,Wg(h));u={...s.defaults,...h,measured:{width:(c=h.measured)==null?void 0:c.width,height:(d=h.measured)==null?void 0:d.height},internals:{positionAbsolute:p,handleBounds:TNe(h,u),z:Uue(h,a,s.zIndexMode),userNode:h}},e.set(h.id,u)}(u.measured===void 0||u.measured.width===void 0||u.measured.height===void 0)&&!u.hidden&&(l=!1),h.parentId&&pG(u,e,t,i,o)}return l}function RNe(n,e){if(!n.parentId)return;const t=e.get(n.parentId);t?t.set(n.id,n):e.set(n.parentId,new Map([[n.id,n]]))}function pG(n,e,t,i,s){const{elevateNodesOnSelect:o,nodeOrigin:r,nodeExtent:a,zIndexMode:l}=fG(uG,i),c=n.parentId,d=e.get(c);if(!d){console.warn(`Parent node ${c} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}RNe(n,t),s&&!d.parentId&&d.internals.rootParentIndex===void 0&&l==="auto"&&(d.internals.rootParentIndex=++s.i,d.internals.z=d.internals.z+s.i*INe),s&&d.internals.rootParentIndex!==void 0&&(s.i=d.internals.rootParentIndex);const h=o&&!gG(l)?$ue:0,{x:u,y:f,z:g}=MNe(n,d,r,a,h,l),{positionAbsolute:p}=n.internals,m=u!==p.x||f!==p.y;(m||g!==n.internals.z)&&e.set(n.id,{...n,internals:{...n.internals,positionAbsolute:m?{x:u,y:f}:p,z:g}})}function Uue(n,e,t){const i=Od(n.zIndex)?n.zIndex:0;return gG(t)?i:i+(n.selected?e:0)}function MNe(n,e,t,i,s,o){const{x:r,y:a}=e.internals.positionAbsolute,l=Wg(n),c=XN(n,t),d=eS(n.extent)?q1(c,n.extent,l):c;let h=q1({x:r+d.x,y:a+d.y},i,l);n.extent==="parent"&&(h=Rue(h,l,e));const u=Uue(n,s,o),f=e.internals.z??0;return{x:h.x,y:h.y,z:f>=u?f+1:u}}function mG(n,e,t,i=[0,0]){var r;const s=[],o=new Map;for(const a of n){const l=e.get(a.parentId);if(!l)continue;const c=((r=o.get(a.parentId))==null?void 0:r.expandedRect)??Jy(l),d=Aue(c,a.rect);o.set(a.parentId,{expandedRect:d,parent:l})}return o.size>0&&o.forEach(({expandedRect:a,parent:l},c)=>{var w;const d=l.internals.positionAbsolute,h=Wg(l),u=l.origin??i,f=a.x0||g>0||b||v)&&(s.push({id:c,type:"position",position:{x:l.position.x-f+b,y:l.position.y-g+v}}),(w=t.get(c))==null||w.forEach(C=>{n.some(S=>S.id===C.id)||s.push({id:C.id,type:"position",position:{x:C.position.x+f,y:C.position.y+g}})})),(h.width0){const f=mG(u,e,t,s);c.push(...f)}return{changes:c,updatedInternals:l}}async function PNe({delta:n,panZoom:e,transform:t,translateExtent:i,width:s,height:o}){if(!e||!n.x&&!n.y)return Promise.resolve(!1);const r=await e.setViewportConstrained({x:t[0]+n.x,y:t[1]+n.y,zoom:t[2]},[[0,0],[s,o]],i),a=!!r&&(r.x!==t[0]||r.y!==t[1]||r.k!==t[2]);return Promise.resolve(a)}function qee(n,e,t,i,s,o){let r=s;const a=i.get(r)||new Map;i.set(r,a.set(t,e)),r=`${s}-${n}`;const l=i.get(r)||new Map;if(i.set(r,l.set(t,e)),o){r=`${s}-${n}-${o}`;const c=i.get(r)||new Map;i.set(r,c.set(t,e))}}function que(n,e,t){n.clear(),e.clear();for(const i of t){const{source:s,target:o,sourceHandle:r=null,targetHandle:a=null}=i,l={edgeId:i.id,source:s,target:o,sourceHandle:r,targetHandle:a},c=`${s}-${r}--${o}-${a}`,d=`${o}-${a}--${s}-${r}`;qee("source",l,d,n,s,r),qee("target",l,c,n,o,a),e.set(i.id,i)}}function Kue(n,e){if(!n.parentId)return!1;const t=e.get(n.parentId);return t?t.selected?!0:Kue(t,e):!1}function Kee(n,e,t){var s;let i=n;do{if((s=i==null?void 0:i.matches)!=null&&s.call(i,e))return!0;if(i===t)return!1;i=i==null?void 0:i.parentElement}while(i);return!1}function ONe(n,e,t,i){const s=new Map;for(const[o,r]of n)if((r.selected||r.id===i)&&(!r.parentId||!Kue(r,n))&&(r.draggable||e&&typeof r.draggable>"u")){const a=n.get(o);a&&s.set(o,{id:o,position:a.position||{x:0,y:0},distance:{x:t.x-a.internals.positionAbsolute.x,y:t.y-a.internals.positionAbsolute.y},extent:a.extent,parentId:a.parentId,origin:a.origin,expandParent:a.expandParent,internals:{positionAbsolute:a.internals.positionAbsolute||{x:0,y:0}},measured:{width:a.measured.width??0,height:a.measured.height??0}})}return s}function J8({nodeId:n,dragItems:e,nodeLookup:t,dragging:i=!0}){var r,a,l;const s=[];for(const[c,d]of e){const h=(r=t.get(c))==null?void 0:r.internals.userNode;h&&s.push({...h,position:d.position,dragging:i})}if(!n)return[s[0],s];const o=(a=t.get(n))==null?void 0:a.internals.userNode;return[o?{...o,position:((l=e.get(n))==null?void 0:l.position)||o.position,dragging:i}:s[0],s]}function FNe({dragItems:n,snapGrid:e,x:t,y:i}){const s=n.values().next().value;if(!s)return null;const o={x:t-s.distance.x,y:i-s.distance.y},r=JN(o,e);return{x:r.x-o.x,y:r.y-o.y}}function BNe({onNodeMouseDown:n,getStoreItems:e,onDragStart:t,onDrag:i,onDragStop:s}){let o={x:null,y:null},r=0,a=new Map,l=!1,c={x:0,y:0},d=null,h=!1,u=null,f=!1,g=!1,p=null;function m({noDragClassName:v,handleSelector:w,domNode:C,isSelectable:S,nodeId:L,nodeClickDistance:x=0}){u=Wl(C);function E({x:A,y:W}){const{nodeLookup:P,nodeExtent:B,snapGrid:V,snapToGrid:K,nodeOrigin:z,onNodeDrag:j,onSelectionDrag:Q,onError:Y,updateNodePositions:te}=e();o={x:A,y:W};let ce=!1;const Ce=a.size>1,xe=Ce&&B?VB(QN(a)):null,je=Ce&&K?FNe({dragItems:a,snapGrid:V,x:A,y:W}):null;for(const[ke,Le]of a){if(!P.has(ke))continue;let Ve={x:A-Le.distance.x,y:W-Le.distance.y};K&&(Ve=je?{x:Math.round(Ve.x+je.x),y:Math.round(Ve.y+je.y)}:JN(Ve,V));let ct=null;if(Ce&&B&&!Le.extent&&xe){const{positionAbsolute:tt}=Le.internals,Tt=tt.x-xe.x+B[0][0],Si=tt.x+Le.measured.width-xe.x2+B[1][0],Vt=tt.y-xe.y+B[0][1],In=tt.y+Le.measured.height-xe.y2+B[1][1];ct=[[Tt,Vt],[Si,In]]}const{position:dt,positionAbsolute:Be}=Tue({nodeId:ke,nextPosition:Ve,nodeLookup:P,nodeExtent:ct||B,nodeOrigin:z,onError:Y});ce=ce||Le.position.x!==dt.x||Le.position.y!==dt.y,Le.position=dt,Le.internals.positionAbsolute=Be}if(g=g||ce,!!ce&&(te(a,!0),p&&(i||j||!L&&Q))){const[ke,Le]=J8({nodeId:L,dragItems:a,nodeLookup:P});i==null||i(p,a,ke,Le),j==null||j(p,ke,Le),L||Q==null||Q(p,Le)}}async function I(){if(!d)return;const{transform:A,panBy:W,autoPanSpeed:P,autoPanOnNodeDrag:B}=e();if(!B){l=!1,cancelAnimationFrame(r);return}const[V,K]=Mue(c,d,P);(V!==0||K!==0)&&(o.x=(o.x??0)-V/A[2],o.y=(o.y??0)-K/A[2],await W({x:V,y:K})&&E(o)),r=requestAnimationFrame(I)}function R(A){var Ce;const{nodeLookup:W,multiSelectionActive:P,nodesDraggable:B,transform:V,snapGrid:K,snapToGrid:z,selectNodesOnDrag:j,onNodeDragStart:Q,onSelectionDragStart:Y,unselectNodesAndEdges:te}=e();h=!0,(!j||!S)&&!P&&L&&((Ce=W.get(L))!=null&&Ce.selected||te()),S&&j&&L&&(n==null||n(L));const ce=ok(A.sourceEvent,{transform:V,snapGrid:K,snapToGrid:z,containerBounds:d});if(o=ce,a=ONe(W,B,ce,L),a.size>0&&(t||Q||!L&&Y)){const[xe,je]=J8({nodeId:L,dragItems:a,nodeLookup:W});t==null||t(A.sourceEvent,a,xe,je),Q==null||Q(A.sourceEvent,xe,je),L||Y==null||Y(A.sourceEvent,je)}}const M=due().clickDistance(x).on("start",A=>{const{domNode:W,nodeDragThreshold:P,transform:B,snapGrid:V,snapToGrid:K}=e();d=(W==null?void 0:W.getBoundingClientRect())||null,f=!1,g=!1,p=A.sourceEvent,P===0&&R(A),o=ok(A.sourceEvent,{transform:B,snapGrid:V,snapToGrid:K,containerBounds:d}),c=Fd(A.sourceEvent,d)}).on("drag",A=>{const{autoPanOnNodeDrag:W,transform:P,snapGrid:B,snapToGrid:V,nodeDragThreshold:K,nodeLookup:z}=e(),j=ok(A.sourceEvent,{transform:P,snapGrid:B,snapToGrid:V,containerBounds:d});if(p=A.sourceEvent,(A.sourceEvent.type==="touchmove"&&A.sourceEvent.touches.length>1||L&&!z.has(L))&&(f=!0),!f){if(!l&&W&&h&&(l=!0,I()),!h){const Q=Fd(A.sourceEvent,d),Y=Q.x-c.x,te=Q.y-c.y;Math.sqrt(Y*Y+te*te)>K&&R(A)}(o.x!==j.xSnapped||o.y!==j.ySnapped)&&a&&h&&(c=Fd(A.sourceEvent,d),E(j))}}).on("end",A=>{if(!(!h||f)&&(l=!1,h=!1,cancelAnimationFrame(r),a.size>0)){const{nodeLookup:W,updateNodePositions:P,onNodeDragStop:B,onSelectionDragStop:V}=e();if(g&&(P(a,!1),g=!1),s||B||!L&&V){const[K,z]=J8({nodeId:L,dragItems:a,nodeLookup:W,dragging:!1});s==null||s(A.sourceEvent,a,K,z),B==null||B(A.sourceEvent,K,z),L||V==null||V(A.sourceEvent,z)}}}).filter(A=>{const W=A.target;return!A.button&&(!v||!Kee(W,`.${v}`,C))&&(!w||Kee(W,w,C))});u.call(M)}function b(){u==null||u.on(".drag",null)}return{update:m,destroy:b}}function WNe(n,e,t){const i=[],s={x:n.x-t,y:n.y-t,width:t*2,height:t*2};for(const o of e.values())qE(s,Jy(o))>0&&i.push(o);return i}const HNe=250;function VNe(n,e,t,i){var a,l;let s=[],o=1/0;const r=WNe(n,t,e+HNe);for(const c of r){const d=[...((a=c.internals.handleBounds)==null?void 0:a.source)??[],...((l=c.internals.handleBounds)==null?void 0:l.target)??[]];for(const h of d){if(i.nodeId===h.nodeId&&i.type===h.type&&i.id===h.id)continue;const{x:u,y:f}=K1(c,h,h.position,!0),g=Math.sqrt(Math.pow(u-n.x,2)+Math.pow(f-n.y,2));g>e||(g1){const c=i.type==="source"?"target":"source";return s.find(d=>d.type===c)??s[0]}return s[0]}function Gue(n,e,t,i,s,o=!1){var c,d,h;const r=i.get(n);if(!r)return null;const a=s==="strict"?(c=r.internals.handleBounds)==null?void 0:c[e]:[...((d=r.internals.handleBounds)==null?void 0:d.source)??[],...((h=r.internals.handleBounds)==null?void 0:h.target)??[]],l=(t?a==null?void 0:a.find(u=>u.id===t):a==null?void 0:a[0])??null;return l&&o?{...l,...K1(r,l,l.position,!0)}:l}function Yue(n,e){return n||(e!=null&&e.classList.contains("target")?"target":e!=null&&e.classList.contains("source")?"source":null)}function zNe(n,e){let t=null;return e?t=!0:n&&!e&&(t=!1),t}const Zue=()=>!0;function jNe(n,{connectionMode:e,connectionRadius:t,handleId:i,nodeId:s,edgeUpdaterType:o,isTarget:r,domNode:a,nodeLookup:l,lib:c,autoPanOnConnect:d,flowId:h,panBy:u,cancelConnection:f,onConnectStart:g,onConnect:p,onConnectEnd:m,isValidConnection:b=Zue,onReconnectEnd:v,updateConnection:w,getTransform:C,getFromHandle:S,autoPanSpeed:L,dragThreshold:x=1,handleDomNode:E}){const I=Fue(n.target);let R=0,M;const{x:A,y:W}=Fd(n),P=Yue(o,E),B=a==null?void 0:a.getBoundingClientRect();let V=!1;if(!B||!P)return;const K=Gue(s,P,i,l,e);if(!K)return;let z=Fd(n,B),j=!1,Q=null,Y=!1,te=null;function ce(){if(!d||!B)return;const[dt,Be]=Mue(z,B,L);u({x:dt,y:Be}),R=requestAnimationFrame(ce)}const Ce={...K,nodeId:s,type:P,position:K.position},xe=l.get(s);let ke={inProgress:!0,isValid:null,from:K1(xe,Ce,It.Left,!0),fromHandle:Ce,fromPosition:Ce.position,fromNode:xe,to:z,toHandle:null,toPosition:Pee[Ce.position],toNode:null,pointer:z};function Le(){V=!0,w(ke),g==null||g(n,{nodeId:s,handleId:i,handleType:P})}x===0&&Le();function Ve(dt){if(!V){const{x:In,y:Nn}=Fd(dt),Os=In-A,Da=Nn-W;if(!(Os*Os+Da*Da>x*x))return;Le()}if(!S()||!Ce){ct(dt);return}const Be=C();z=Fd(dt,B),M=VNe(eD(z,Be,!1,[1,1]),t,l,Ce),j||(ce(),j=!0);const tt=Xue(dt,{handle:M,connectionMode:e,fromNodeId:s,fromHandleId:i,fromType:r?"target":"source",isValidConnection:b,doc:I,lib:c,flowId:h,nodeLookup:l});te=tt.handleDomNode,Q=tt.connection,Y=zNe(!!M,tt.isValid);const Tt=l.get(s),Si=Tt?K1(Tt,Ce,It.Left,!0):ke.from,Vt={...ke,from:Si,isValid:Y,to:tt.toHandle&&Y?jM({x:tt.toHandle.x,y:tt.toHandle.y},Be):z,toHandle:tt.toHandle,toPosition:Y&&tt.toHandle?tt.toHandle.position:Pee[Ce.position],toNode:tt.toHandle?l.get(tt.toHandle.nodeId):null,pointer:z};w(Vt),ke=Vt}function ct(dt){if(!("touches"in dt&&dt.touches.length>0)){if(V){(M||te)&&Q&&Y&&(p==null||p(Q));const{inProgress:Be,...tt}=ke,Tt={...tt,toPosition:ke.toHandle?ke.toPosition:null};m==null||m(dt,Tt),o&&(v==null||v(dt,Tt))}f(),cancelAnimationFrame(R),j=!1,Y=!1,Q=null,te=null,I.removeEventListener("mousemove",Ve),I.removeEventListener("mouseup",ct),I.removeEventListener("touchmove",Ve),I.removeEventListener("touchend",ct)}}I.addEventListener("mousemove",Ve),I.addEventListener("mouseup",ct),I.addEventListener("touchmove",Ve),I.addEventListener("touchend",ct)}function Xue(n,{handle:e,connectionMode:t,fromNodeId:i,fromHandleId:s,fromType:o,doc:r,lib:a,flowId:l,isValidConnection:c=Zue,nodeLookup:d}){const h=o==="target",u=e?r.querySelector(`.${a}-flow__handle[data-id="${l}-${e==null?void 0:e.nodeId}-${e==null?void 0:e.id}-${e==null?void 0:e.type}"]`):null,{x:f,y:g}=Fd(n),p=r.elementFromPoint(f,g),m=p!=null&&p.classList.contains(`${a}-flow__handle`)?p:u,b={handleDomNode:m,isValid:!1,connection:null,toHandle:null};if(m){const v=Yue(void 0,m),w=m.getAttribute("data-nodeid"),C=m.getAttribute("data-handleid"),S=m.classList.contains("connectable"),L=m.classList.contains("connectableend");if(!w||!v)return b;const x={source:h?w:i,sourceHandle:h?C:s,target:h?i:w,targetHandle:h?s:C};b.connection=x;const I=S&&L&&(t===Xy.Strict?h&&v==="source"||!h&&v==="target":w!==i||C!==s);b.isValid=I&&c(x),b.toHandle=Gue(w,v,C,d,t,!0)}return b}const UB={onPointerDown:jNe,isValid:Xue};function $Ne({domNode:n,panZoom:e,getTransform:t,getViewScale:i}){const s=Wl(n);function o({translateExtent:a,width:l,height:c,zoomStep:d=1,pannable:h=!0,zoomable:u=!0,inversePan:f=!1}){const g=w=>{if(w.sourceEvent.type!=="wheel"||!e)return;const C=t(),S=w.sourceEvent.ctrlKey&&KE()?10:1,L=-w.sourceEvent.deltaY*(w.sourceEvent.deltaMode===1?.05:w.sourceEvent.deltaMode?1:.002)*d,x=C[2]*Math.pow(2,L*S);e.scaleTo(x)};let p=[0,0];const m=w=>{(w.sourceEvent.type==="mousedown"||w.sourceEvent.type==="touchstart")&&(p=[w.sourceEvent.clientX??w.sourceEvent.touches[0].clientX,w.sourceEvent.clientY??w.sourceEvent.touches[0].clientY])},b=w=>{const C=t();if(w.sourceEvent.type!=="mousemove"&&w.sourceEvent.type!=="touchmove"||!e)return;const S=[w.sourceEvent.clientX??w.sourceEvent.touches[0].clientX,w.sourceEvent.clientY??w.sourceEvent.touches[0].clientY],L=[S[0]-p[0],S[1]-p[1]];p=S;const x=i()*Math.max(C[2],Math.log(C[2]))*(f?-1:1),E={x:C[0]-L[0]*x,y:C[1]-L[1]*x},I=[[0,0],[l,c]];e.setViewportConstrained({x:E.x,y:E.y,zoom:C[2]},I,a)},v=Lue().on("start",m).on("zoom",h?b:null).on("zoom.wheel",u?g:null);s.call(v,{})}function r(){s.on("zoom",null)}return{update:o,destroy:r,pointer:yd}}const y5=n=>({x:n.x,y:n.y,zoom:n.k}),e7=({x:n,y:e,zoom:t})=>v5.translate(n,e).scale(t),i0=(n,e)=>n.target.closest(`.${e}`),Que=(n,e)=>e===2&&Array.isArray(n)&&n.includes(2),UNe=n=>((n*=2)<=1?n*n*n:(n-=2)*n*n+2)/2,t7=(n,e=0,t=UNe,i=()=>{})=>{const s=typeof e=="number"&&e>0;return s||i(),s?n.transition().duration(e).ease(t).on("end",i):n},Jue=n=>{const e=n.ctrlKey&&KE()?10:1;return-n.deltaY*(n.deltaMode===1?.05:n.deltaMode?1:.002)*e};function qNe({zoomPanValues:n,noWheelClassName:e,d3Selection:t,d3Zoom:i,panOnScrollMode:s,panOnScrollSpeed:o,zoomOnPinch:r,onPanZoomStart:a,onPanZoom:l,onPanZoomEnd:c}){return d=>{if(i0(d,e))return d.ctrlKey&&d.preventDefault(),!1;d.preventDefault(),d.stopImmediatePropagation();const h=t.property("__zoom").k||1;if(d.ctrlKey&&r){const m=yd(d),b=Jue(d),v=h*Math.pow(2,b);i.scaleTo(t,v,m,d);return}const u=d.deltaMode===1?20:1;let f=s===xv.Vertical?0:d.deltaX*u,g=s===xv.Horizontal?0:d.deltaY*u;!KE()&&d.shiftKey&&s!==xv.Vertical&&(f=d.deltaY*u,g=0),i.translateBy(t,-(f/h)*o,-(g/h)*o,{internal:!0});const p=y5(t.property("__zoom"));clearTimeout(n.panScrollTimeout),n.isPanScrolling?(l==null||l(d,p),n.panScrollTimeout=setTimeout(()=>{c==null||c(d,p),n.isPanScrolling=!1},150)):(n.isPanScrolling=!0,a==null||a(d,p))}}function KNe({noWheelClassName:n,preventScrolling:e,d3ZoomHandler:t}){return function(i,s){const o=i.type==="wheel",r=!e&&o&&!i.ctrlKey,a=i0(i,n);if(i.ctrlKey&&o&&a&&i.preventDefault(),r||a)return null;i.preventDefault(),t.call(this,i,s)}}function GNe({zoomPanValues:n,onDraggingChange:e,onPanZoomStart:t}){return i=>{var o,r,a;if((o=i.sourceEvent)!=null&&o.internal)return;const s=y5(i.transform);n.mouseButton=((r=i.sourceEvent)==null?void 0:r.button)||0,n.isZoomingOrPanning=!0,n.prevViewport=s,((a=i.sourceEvent)==null?void 0:a.type)==="mousedown"&&e(!0),t&&(t==null||t(i.sourceEvent,s))}}function YNe({zoomPanValues:n,panOnDrag:e,onPaneContextMenu:t,onTransformChange:i,onPanZoom:s}){return o=>{var r,a;n.usedRightMouseButton=!!(t&&Que(e,n.mouseButton??0)),(r=o.sourceEvent)!=null&&r.sync||i([o.transform.x,o.transform.y,o.transform.k]),s&&!((a=o.sourceEvent)!=null&&a.internal)&&(s==null||s(o.sourceEvent,y5(o.transform)))}}function ZNe({zoomPanValues:n,panOnDrag:e,panOnScroll:t,onDraggingChange:i,onPanZoomEnd:s,onPaneContextMenu:o}){return r=>{var a;if(!((a=r.sourceEvent)!=null&&a.internal)&&(n.isZoomingOrPanning=!1,o&&Que(e,n.mouseButton??0)&&!n.usedRightMouseButton&&r.sourceEvent&&o(r.sourceEvent),n.usedRightMouseButton=!1,i(!1),s)){const l=y5(r.transform);n.prevViewport=l,clearTimeout(n.timerId),n.timerId=setTimeout(()=>{s==null||s(r.sourceEvent,l)},t?150:0)}}}function XNe({zoomActivationKeyPressed:n,zoomOnScroll:e,zoomOnPinch:t,panOnDrag:i,panOnScroll:s,zoomOnDoubleClick:o,userSelectionActive:r,noWheelClassName:a,noPanClassName:l,lib:c,connectionInProgress:d}){return h=>{var m;const u=n||e,f=t&&h.ctrlKey,g=h.type==="wheel";if(h.button===1&&h.type==="mousedown"&&(i0(h,`${c}-flow__node`)||i0(h,`${c}-flow__edge`)))return!0;if(!i&&!u&&!s&&!o&&!t||r||d&&!g||i0(h,a)&&g||i0(h,l)&&(!g||s&&g&&!n)||!t&&h.ctrlKey&&g)return!1;if(!t&&h.type==="touchstart"&&((m=h.touches)==null?void 0:m.length)>1)return h.preventDefault(),!1;if(!u&&!s&&!f&&g||!i&&(h.type==="mousedown"||h.type==="touchstart")||Array.isArray(i)&&!i.includes(h.button)&&h.type==="mousedown")return!1;const p=Array.isArray(i)&&i.includes(h.button)||!h.button||h.button<=1;return(!h.ctrlKey||g)&&p}}function QNe({domNode:n,minZoom:e,maxZoom:t,translateExtent:i,viewport:s,onPanZoom:o,onPanZoomStart:r,onPanZoomEnd:a,onDraggingChange:l}){const c={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},d=n.getBoundingClientRect(),h=Lue().scaleExtent([e,t]).translateExtent(i),u=Wl(n).call(h);v({x:s.x,y:s.y,zoom:Qy(s.zoom,e,t)},[[0,0],[d.width,d.height]],i);const f=u.on("wheel.zoom"),g=u.on("dblclick.zoom");h.wheelDelta(Jue);function p(M,A){return u?new Promise(W=>{h==null||h.interpolate((A==null?void 0:A.interpolate)==="linear"?sk:mR).transform(t7(u,A==null?void 0:A.duration,A==null?void 0:A.ease,()=>W(!0)),M)}):Promise.resolve(!1)}function m({noWheelClassName:M,noPanClassName:A,onPaneContextMenu:W,userSelectionActive:P,panOnScroll:B,panOnDrag:V,panOnScrollMode:K,panOnScrollSpeed:z,preventScrolling:j,zoomOnPinch:Q,zoomOnScroll:Y,zoomOnDoubleClick:te,zoomActivationKeyPressed:ce,lib:Ce,onTransformChange:xe,connectionInProgress:je,paneClickDistance:ke,selectionOnDrag:Le}){P&&!c.isZoomingOrPanning&&b();const Ve=B&&!ce&&!P;h.clickDistance(Le?1/0:!Od(ke)||ke<0?0:ke);const ct=Ve?qNe({zoomPanValues:c,noWheelClassName:M,d3Selection:u,d3Zoom:h,panOnScrollMode:K,panOnScrollSpeed:z,zoomOnPinch:Q,onPanZoomStart:r,onPanZoom:o,onPanZoomEnd:a}):KNe({noWheelClassName:M,preventScrolling:j,d3ZoomHandler:f});if(u.on("wheel.zoom",ct,{passive:!1}),!P){const Be=GNe({zoomPanValues:c,onDraggingChange:l,onPanZoomStart:r});h.on("start",Be);const tt=YNe({zoomPanValues:c,panOnDrag:V,onPaneContextMenu:!!W,onPanZoom:o,onTransformChange:xe});h.on("zoom",tt);const Tt=ZNe({zoomPanValues:c,panOnDrag:V,panOnScroll:B,onPaneContextMenu:W,onPanZoomEnd:a,onDraggingChange:l});h.on("end",Tt)}const dt=XNe({zoomActivationKeyPressed:ce,panOnDrag:V,zoomOnScroll:Y,panOnScroll:B,zoomOnDoubleClick:te,zoomOnPinch:Q,userSelectionActive:P,noPanClassName:A,noWheelClassName:M,lib:Ce,connectionInProgress:je});h.filter(dt),te?u.on("dblclick.zoom",g):u.on("dblclick.zoom",null)}function b(){h.on("zoom",null)}async function v(M,A,W){const P=e7(M),B=h==null?void 0:h.constrain()(P,A,W);return B&&await p(B),new Promise(V=>V(B))}async function w(M,A){const W=e7(M);return await p(W,A),new Promise(P=>P(W))}function C(M){if(u){const A=e7(M),W=u.property("__zoom");(W.k!==M.zoom||W.x!==M.x||W.y!==M.y)&&(h==null||h.transform(u,A,null,{sync:!0}))}}function S(){const M=u?xue(u.node()):{x:0,y:0,k:1};return{x:M.x,y:M.y,zoom:M.k}}function L(M,A){return u?new Promise(W=>{h==null||h.interpolate((A==null?void 0:A.interpolate)==="linear"?sk:mR).scaleTo(t7(u,A==null?void 0:A.duration,A==null?void 0:A.ease,()=>W(!0)),M)}):Promise.resolve(!1)}function x(M,A){return u?new Promise(W=>{h==null||h.interpolate((A==null?void 0:A.interpolate)==="linear"?sk:mR).scaleBy(t7(u,A==null?void 0:A.duration,A==null?void 0:A.ease,()=>W(!0)),M)}):Promise.resolve(!1)}function E(M){h==null||h.scaleExtent(M)}function I(M){h==null||h.translateExtent(M)}function R(M){const A=!Od(M)||M<0?0:M;h==null||h.clickDistance(A)}return{update:m,destroy:b,setViewport:w,setViewportConstrained:v,getViewport:S,scaleTo:L,scaleBy:x,setScaleExtent:E,setTranslateExtent:I,syncViewport:C,setClickDistance:R}}var tS;(function(n){n.Line="line",n.Handle="handle"})(tS||(tS={}));function JNe({width:n,prevWidth:e,height:t,prevHeight:i,affectsX:s,affectsY:o}){const r=n-e,a=t-i,l=[r>0?1:r<0?-1:0,a>0?1:a<0?-1:0];return r&&s&&(l[0]=l[0]*-1),a&&o&&(l[1]=l[1]*-1),l}function Gee(n){const e=n.includes("right")||n.includes("left"),t=n.includes("bottom")||n.includes("top"),i=n.includes("left"),s=n.includes("top");return{isHorizontal:e,isVertical:t,affectsX:i,affectsY:s}}function op(n,e){return Math.max(0,e-n)}function rp(n,e){return Math.max(0,n-e)}function ST(n,e,t){return Math.max(0,e-n,n-t)}function Yee(n,e){return n?!e:e}function eDe(n,e,t,i,s,o,r,a){let{affectsX:l,affectsY:c}=e;const{isHorizontal:d,isVertical:h}=e,u=d&&h,{xSnapped:f,ySnapped:g}=t,{minWidth:p,maxWidth:m,minHeight:b,maxHeight:v}=i,{x:w,y:C,width:S,height:L,aspectRatio:x}=n;let E=Math.floor(d?f-n.pointerX:0),I=Math.floor(h?g-n.pointerY:0);const R=S+(l?-E:E),M=L+(c?-I:I),A=-o[0]*S,W=-o[1]*L;let P=ST(R,p,m),B=ST(M,b,v);if(r){let z=0,j=0;l&&E<0?z=op(w+E+A,r[0][0]):!l&&E>0&&(z=rp(w+R+A,r[1][0])),c&&I<0?j=op(C+I+W,r[0][1]):!c&&I>0&&(j=rp(C+M+W,r[1][1])),P=Math.max(P,z),B=Math.max(B,j)}if(a){let z=0,j=0;l&&E>0?z=rp(w+E,a[0][0]):!l&&E<0&&(z=op(w+R,a[1][0])),c&&I>0?j=rp(C+I,a[0][1]):!c&&I<0&&(j=op(C+M,a[1][1])),P=Math.max(P,z),B=Math.max(B,j)}if(s){if(d){const z=ST(R/x,b,v)*x;if(P=Math.max(P,z),r){let j=0;!l&&!c||l&&!c&&u?j=rp(C+W+R/x,r[1][1])*x:j=op(C+W+(l?E:-E)/x,r[0][1])*x,P=Math.max(P,j)}if(a){let j=0;!l&&!c||l&&!c&&u?j=op(C+R/x,a[1][1])*x:j=rp(C+(l?E:-E)/x,a[0][1])*x,P=Math.max(P,j)}}if(h){const z=ST(M*x,p,m)/x;if(B=Math.max(B,z),r){let j=0;!l&&!c||c&&!l&&u?j=rp(w+M*x+A,r[1][0])/x:j=op(w+(c?I:-I)*x+A,r[0][0])/x,B=Math.max(B,j)}if(a){let j=0;!l&&!c||c&&!l&&u?j=op(w+M*x,a[1][0])/x:j=rp(w+(c?I:-I)*x,a[0][0])/x,B=Math.max(B,j)}}}I=I+(I<0?B:-B),E=E+(E<0?P:-P),s&&(u?R>M*x?I=(Yee(l,c)?-E:E)/x:E=(Yee(l,c)?-I:I)*x:d?(I=E/x,c=l):(E=I*x,l=c));const V=l?w+E:w,K=c?C+I:C;return{width:S+(l?-E:E),height:L+(c?-I:I),x:o[0]*E*(l?-1:1)+V,y:o[1]*I*(c?-1:1)+K}}const efe={width:0,height:0,x:0,y:0},tDe={...efe,pointerX:0,pointerY:0,aspectRatio:1};function iDe(n){return[[0,0],[n.measured.width,n.measured.height]]}function nDe(n,e,t){const i=e.position.x+n.position.x,s=e.position.y+n.position.y,o=n.measured.width??0,r=n.measured.height??0,a=t[0]*o,l=t[1]*r;return[[i-a,s-l],[i+o-a,s+r-l]]}function sDe({domNode:n,nodeId:e,getStoreItems:t,onChange:i,onEnd:s}){const o=Wl(n);let r={controlDirection:Gee("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function a({controlPosition:c,boundaries:d,keepAspectRatio:h,resizeDirection:u,onResizeStart:f,onResize:g,onResizeEnd:p,shouldResize:m}){let b={...efe},v={...tDe};r={boundaries:d,resizeDirection:u,keepAspectRatio:h,controlDirection:Gee(c)};let w,C=null,S=[],L,x,E,I=!1;const R=due().on("start",M=>{const{nodeLookup:A,transform:W,snapGrid:P,snapToGrid:B,nodeOrigin:V,paneDomNode:K}=t();if(w=A.get(e),!w)return;C=(K==null?void 0:K.getBoundingClientRect())??null;const{xSnapped:z,ySnapped:j}=ok(M.sourceEvent,{transform:W,snapGrid:P,snapToGrid:B,containerBounds:C});b={width:w.measured.width??0,height:w.measured.height??0,x:w.position.x??0,y:w.position.y??0},v={...b,pointerX:z,pointerY:j,aspectRatio:b.width/b.height},L=void 0,w.parentId&&(w.extent==="parent"||w.expandParent)&&(L=A.get(w.parentId),x=L&&w.extent==="parent"?iDe(L):void 0),S=[],E=void 0;for(const[Q,Y]of A)if(Y.parentId===e&&(S.push({id:Q,position:{...Y.position},extent:Y.extent}),Y.extent==="parent"||Y.expandParent)){const te=nDe(Y,w,Y.origin??V);E?E=[[Math.min(te[0][0],E[0][0]),Math.min(te[0][1],E[0][1])],[Math.max(te[1][0],E[1][0]),Math.max(te[1][1],E[1][1])]]:E=te}f==null||f(M,{...b})}).on("drag",M=>{const{transform:A,snapGrid:W,snapToGrid:P,nodeOrigin:B}=t(),V=ok(M.sourceEvent,{transform:A,snapGrid:W,snapToGrid:P,containerBounds:C}),K=[];if(!w)return;const{x:z,y:j,width:Q,height:Y}=b,te={},ce=w.origin??B,{width:Ce,height:xe,x:je,y:ke}=eDe(v,r.controlDirection,V,r.boundaries,r.keepAspectRatio,ce,x,E),Le=Ce!==Q,Ve=xe!==Y,ct=je!==z&&Le,dt=ke!==j&&Ve;if(!ct&&!dt&&!Le&&!Ve)return;if((ct||dt||ce[0]===1||ce[1]===1)&&(te.x=ct?je:b.x,te.y=dt?ke:b.y,b.x=te.x,b.y=te.y,S.length>0)){const Si=je-z,Vt=ke-j;for(const In of S)In.position={x:In.position.x-Si+ce[0]*(Ce-Q),y:In.position.y-Vt+ce[1]*(xe-Y)},K.push(In)}if((Le||Ve)&&(te.width=Le&&(!r.resizeDirection||r.resizeDirection==="horizontal")?Ce:b.width,te.height=Ve&&(!r.resizeDirection||r.resizeDirection==="vertical")?xe:b.height,b.width=te.width,b.height=te.height),L&&w.expandParent){const Si=ce[0]*(te.width??0);te.x&&te.x{I&&(p==null||p(M,{...b}),s==null||s({...b}),I=!1)});o.call(R)}function l(){o.on(".drag",null)}return{update:a,destroy:l}}var tfe={exports:{}},ife={},nfe={exports:{}},sfe={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var iS=$;function oDe(n,e){return n===e&&(n!==0||1/n===1/e)||n!==n&&e!==e}var rDe=typeof Object.is=="function"?Object.is:oDe,aDe=iS.useState,lDe=iS.useEffect,cDe=iS.useLayoutEffect,dDe=iS.useDebugValue;function hDe(n,e){var t=e(),i=aDe({inst:{value:t,getSnapshot:e}}),s=i[0].inst,o=i[1];return cDe(function(){s.value=t,s.getSnapshot=e,i7(s)&&o({inst:s})},[n,t,e]),lDe(function(){return i7(s)&&o({inst:s}),n(function(){i7(s)&&o({inst:s})})},[n]),dDe(t),t}function i7(n){var e=n.getSnapshot;n=n.value;try{var t=e();return!rDe(n,t)}catch{return!0}}function uDe(n,e){return e()}var fDe=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?uDe:hDe;sfe.useSyncExternalStore=iS.useSyncExternalStore!==void 0?iS.useSyncExternalStore:fDe;nfe.exports=sfe;var gDe=nfe.exports;/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var S5=$,pDe=gDe;function mDe(n,e){return n===e&&(n!==0||1/n===1/e)||n!==n&&e!==e}var _De=typeof Object.is=="function"?Object.is:mDe,bDe=pDe.useSyncExternalStore,vDe=S5.useRef,wDe=S5.useEffect,CDe=S5.useMemo,yDe=S5.useDebugValue;ife.useSyncExternalStoreWithSelector=function(n,e,t,i,s){var o=vDe(null);if(o.current===null){var r={hasValue:!1,value:null};o.current=r}else r=o.current;o=CDe(function(){function l(f){if(!c){if(c=!0,d=f,f=i(f),s!==void 0&&r.hasValue){var g=r.value;if(s(g,f))return h=g}return h=f}if(g=h,_De(d,f))return g;var p=i(f);return s!==void 0&&s(g,p)?(d=f,g):(d=f,h=p)}var c=!1,d,h,u=t===void 0?null:t;return[function(){return l(e())},u===null?void 0:function(){return l(u())}]},[e,t,i,s]);var a=bDe(n,o[0],o[1]);return wDe(function(){r.hasValue=!0,r.value=a},[a]),yDe(a),a};tfe.exports=ife;var SDe=tfe.exports;const xDe=Fce(SDe),LDe={},Zee=n=>{let e;const t=new Set,i=(d,h)=>{const u=typeof d=="function"?d(e):d;if(!Object.is(u,e)){const f=e;e=h??(typeof u!="object"||u===null)?u:Object.assign({},e,u),t.forEach(g=>g(e,f))}},s=()=>e,l={setState:i,getState:s,getInitialState:()=>c,subscribe:d=>(t.add(d),()=>t.delete(d)),destroy:()=>{(LDe?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),t.clear()}},c=e=n(i,s,l);return l},kDe=n=>n?Zee(n):Zee,{useDebugValue:EDe}=hm,{useSyncExternalStoreWithSelector:IDe}=xDe,NDe=n=>n;function ofe(n,e=NDe,t){const i=IDe(n.subscribe,n.getState,n.getServerState||n.getInitialState,e,t);return EDe(i),i}const Xee=(n,e)=>{const t=kDe(n),i=(s,o=e)=>ofe(t,s,o);return Object.assign(i,t),i},DDe=(n,e)=>n?Xee(n,e):Xee;function as(n,e){if(Object.is(n,e))return!0;if(typeof n!="object"||n===null||typeof e!="object"||e===null)return!1;if(n instanceof Map&&e instanceof Map){if(n.size!==e.size)return!1;for(const[i,s]of n)if(!Object.is(s,e.get(i)))return!1;return!0}if(n instanceof Set&&e instanceof Set){if(n.size!==e.size)return!1;for(const i of n)if(!e.has(i))return!1;return!0}const t=Object.keys(n);if(t.length!==Object.keys(e).length)return!1;for(const i of t)if(!Object.prototype.hasOwnProperty.call(e,i)||!Object.is(n[i],e[i]))return!1;return!0}const x5=$.createContext(null),TDe=x5.Provider,rfe=_u.error001();function Mi(n,e){const t=$.useContext(x5);if(t===null)throw new Error(rfe);return ofe(t,n,e)}function ds(){const n=$.useContext(x5);if(n===null)throw new Error(rfe);return $.useMemo(()=>({getState:n.getState,setState:n.setState,subscribe:n.subscribe}),[n])}const Qee={display:"none"},RDe={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},afe="react-flow__node-desc",lfe="react-flow__edge-desc",MDe="react-flow__aria-live",ADe=n=>n.ariaLiveMessage,PDe=n=>n.ariaLabelConfig;function ODe({rfId:n}){const e=Mi(ADe);return y.jsx("div",{id:`${MDe}-${n}`,"aria-live":"assertive","aria-atomic":"true",style:RDe,children:e})}function FDe({rfId:n,disableKeyboardA11y:e}){const t=Mi(PDe);return y.jsxs(y.Fragment,{children:[y.jsx("div",{id:`${afe}-${n}`,style:Qee,children:e?t["node.a11yDescription.default"]:t["node.a11yDescription.keyboardDisabled"]}),y.jsx("div",{id:`${lfe}-${n}`,style:Qee,children:t["edge.a11yDescription.default"]}),!e&&y.jsx(ODe,{rfId:n})]})}const L5=$.forwardRef(({position:n="top-left",children:e,className:t,style:i,...s},o)=>{const r=`${n}`.split("-");return y.jsx("div",{className:uo(["react-flow__panel",t,...r]),style:i,ref:o,...s,children:e})});L5.displayName="Panel";function BDe({proOptions:n,position:e="bottom-right"}){return n!=null&&n.hideAttribution?null:y.jsx(L5,{position:e,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:y.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const WDe=n=>{const e=[],t=[];for(const[,i]of n.nodeLookup)i.selected&&e.push(i.internals.userNode);for(const[,i]of n.edgeLookup)i.selected&&t.push(i);return{selectedNodes:e,selectedEdges:t}},xT=n=>n.id;function HDe(n,e){return as(n.selectedNodes.map(xT),e.selectedNodes.map(xT))&&as(n.selectedEdges.map(xT),e.selectedEdges.map(xT))}function VDe({onSelectionChange:n}){const e=ds(),{selectedNodes:t,selectedEdges:i}=Mi(WDe,HDe);return $.useEffect(()=>{const s={nodes:t,edges:i};n==null||n(s),e.getState().onSelectionChangeHandlers.forEach(o=>o(s))},[t,i,n]),null}const zDe=n=>!!n.onSelectionChangeHandlers;function jDe({onSelectionChange:n}){const e=Mi(zDe);return n||e?y.jsx(VDe,{onSelectionChange:n}):null}const cfe=[0,0],$De={x:0,y:0,zoom:1},UDe=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Jee=[...UDe,"rfId"],qDe=n=>({setNodes:n.setNodes,setEdges:n.setEdges,setMinZoom:n.setMinZoom,setMaxZoom:n.setMaxZoom,setTranslateExtent:n.setTranslateExtent,setNodeExtent:n.setNodeExtent,reset:n.reset,setDefaultNodesAndEdges:n.setDefaultNodesAndEdges}),ete={translateExtent:$E,nodeOrigin:cfe,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function KDe(n){const{setNodes:e,setEdges:t,setMinZoom:i,setMaxZoom:s,setTranslateExtent:o,setNodeExtent:r,reset:a,setDefaultNodesAndEdges:l}=Mi(qDe,as),c=ds();$.useEffect(()=>(l(n.defaultNodes,n.defaultEdges),()=>{d.current=ete,a()}),[]);const d=$.useRef(ete);return $.useEffect(()=>{for(const h of Jee){const u=n[h],f=d.current[h];u!==f&&(typeof n[h]>"u"||(h==="nodes"?e(u):h==="edges"?t(u):h==="minZoom"?i(u):h==="maxZoom"?s(u):h==="translateExtent"?o(u):h==="nodeExtent"?r(u):h==="ariaLabelConfig"?c.setState({ariaLabelConfig:mNe(u)}):h==="fitView"?c.setState({fitViewQueued:u}):h==="fitViewOptions"?c.setState({fitViewOptions:u}):c.setState({[h]:u})))}d.current=n},Jee.map(h=>n[h])),null}function tte(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function GDe(n){var i;const[e,t]=$.useState(n==="system"?null:n);return $.useEffect(()=>{if(n!=="system"){t(n);return}const s=tte(),o=()=>t(s!=null&&s.matches?"dark":"light");return o(),s==null||s.addEventListener("change",o),()=>{s==null||s.removeEventListener("change",o)}},[n]),e!==null?e:(i=tte())!=null&&i.matches?"dark":"light"}const ite=typeof document<"u"?document:null;function GE(n=null,e={target:ite,actInsideInputWithModifier:!0}){const[t,i]=$.useState(!1),s=$.useRef(!1),o=$.useRef(new Set([])),[r,a]=$.useMemo(()=>{if(n!==null){const c=(Array.isArray(n)?n:[n]).filter(h=>typeof h=="string").map(h=>h.replace("+",` -`).replace(` - -`,` -+`).split(` -`)),d=c.reduce((h,u)=>h.concat(...u),[]);return[c,d]}return[[],[]]},[n]);return $.useEffect(()=>{const l=(e==null?void 0:e.target)??ite,c=(e==null?void 0:e.actInsideInputWithModifier)??!0;if(n!==null){const d=f=>{var m,b;if(s.current=f.ctrlKey||f.metaKey||f.shiftKey||f.altKey,(!s.current||s.current&&!c)&&Bue(f))return!1;const p=ste(f.code,a);if(o.current.add(f[p]),nte(r,o.current,!1)){const v=((b=(m=f.composedPath)==null?void 0:m.call(f))==null?void 0:b[0])||f.target,w=(v==null?void 0:v.nodeName)==="BUTTON"||(v==null?void 0:v.nodeName)==="A";e.preventDefault!==!1&&(s.current||!w)&&f.preventDefault(),i(!0)}},h=f=>{const g=ste(f.code,a);nte(r,o.current,!0)?(i(!1),o.current.clear()):o.current.delete(f[g]),f.key==="Meta"&&o.current.clear(),s.current=!1},u=()=>{o.current.clear(),i(!1)};return l==null||l.addEventListener("keydown",d),l==null||l.addEventListener("keyup",h),window.addEventListener("blur",u),window.addEventListener("contextmenu",u),()=>{l==null||l.removeEventListener("keydown",d),l==null||l.removeEventListener("keyup",h),window.removeEventListener("blur",u),window.removeEventListener("contextmenu",u)}}},[n,i]),t}function nte(n,e,t){return n.filter(i=>t||i.length===e.size).some(i=>i.every(s=>e.has(s)))}function ste(n,e){return e.includes(n)?"code":"key"}const YDe=()=>{const n=ds();return $.useMemo(()=>({zoomIn:e=>{const{panZoom:t}=n.getState();return t?t.scaleBy(1.2,{duration:e==null?void 0:e.duration}):Promise.resolve(!1)},zoomOut:e=>{const{panZoom:t}=n.getState();return t?t.scaleBy(1/1.2,{duration:e==null?void 0:e.duration}):Promise.resolve(!1)},zoomTo:(e,t)=>{const{panZoom:i}=n.getState();return i?i.scaleTo(e,{duration:t==null?void 0:t.duration}):Promise.resolve(!1)},getZoom:()=>n.getState().transform[2],setViewport:async(e,t)=>{const{transform:[i,s,o],panZoom:r}=n.getState();return r?(await r.setViewport({x:e.x??i,y:e.y??s,zoom:e.zoom??o},t),Promise.resolve(!0)):Promise.resolve(!1)},getViewport:()=>{const[e,t,i]=n.getState().transform;return{x:e,y:t,zoom:i}},setCenter:async(e,t,i)=>n.getState().setCenter(e,t,i),fitBounds:async(e,t)=>{const{width:i,height:s,minZoom:o,maxZoom:r,panZoom:a}=n.getState(),l=dG(e,i,s,o,r,(t==null?void 0:t.padding)??.1);return a?(await a.setViewport(l,{duration:t==null?void 0:t.duration,ease:t==null?void 0:t.ease,interpolate:t==null?void 0:t.interpolate}),Promise.resolve(!0)):Promise.resolve(!1)},screenToFlowPosition:(e,t={})=>{const{transform:i,snapGrid:s,snapToGrid:o,domNode:r}=n.getState();if(!r)return e;const{x:a,y:l}=r.getBoundingClientRect(),c={x:e.x-a,y:e.y-l},d=t.snapGrid??s,h=t.snapToGrid??o;return eD(c,i,h,d)},flowToScreenPosition:e=>{const{transform:t,domNode:i}=n.getState();if(!i)return e;const{x:s,y:o}=i.getBoundingClientRect(),r=jM(e,t);return{x:r.x+s,y:r.y+o}}}),[])};function dfe(n,e){const t=[],i=new Map,s=[];for(const o of n)if(o.type==="add"){s.push(o);continue}else if(o.type==="remove"||o.type==="replace")i.set(o.id,[o]);else{const r=i.get(o.id);r?r.push(o):i.set(o.id,[o])}for(const o of e){const r=i.get(o.id);if(!r){t.push(o);continue}if(r[0].type==="remove")continue;if(r[0].type==="replace"){t.push({...r[0].item});continue}const a={...o};for(const l of r)ZDe(l,a);t.push(a)}return s.length&&s.forEach(o=>{o.index!==void 0?t.splice(o.index,0,{...o.item}):t.push({...o.item})}),t}function ZDe(n,e){switch(n.type){case"select":{e.selected=n.selected;break}case"position":{typeof n.position<"u"&&(e.position=n.position),typeof n.dragging<"u"&&(e.dragging=n.dragging);break}case"dimensions":{typeof n.dimensions<"u"&&(e.measured={...n.dimensions},n.setAttributes&&((n.setAttributes===!0||n.setAttributes==="width")&&(e.width=n.dimensions.width),(n.setAttributes===!0||n.setAttributes==="height")&&(e.height=n.dimensions.height))),typeof n.resizing=="boolean"&&(e.resizing=n.resizing);break}}}function hfe(n,e){return dfe(n,e)}function ufe(n,e){return dfe(n,e)}function lb(n,e){return{id:n,type:"select",selected:e}}function n0(n,e=new Set,t=!1){const i=[];for(const[s,o]of n){const r=e.has(s);!(o.selected===void 0&&!r)&&o.selected!==r&&(t&&(o.selected=r),i.push(lb(o.id,r)))}return i}function ote({items:n=[],lookup:e}){var s;const t=[],i=new Map(n.map(o=>[o.id,o]));for(const[o,r]of n.entries()){const a=e.get(r.id),l=((s=a==null?void 0:a.internals)==null?void 0:s.userNode)??a;l!==void 0&&l!==r&&t.push({id:r.id,item:r,type:"replace"}),l===void 0&&t.push({item:r,type:"add",index:o})}for(const[o]of e)i.get(o)===void 0&&t.push({id:o,type:"remove"});return t}function rte(n){return{id:n.id,type:"remove"}}const ate=n=>rNe(n),XDe=n=>Due(n);function ffe(n){return $.forwardRef(n)}const QDe=typeof window<"u"?$.useLayoutEffect:$.useEffect;function lte(n){const[e,t]=$.useState(BigInt(0)),[i]=$.useState(()=>JDe(()=>t(s=>s+BigInt(1))));return QDe(()=>{const s=i.get();s.length&&(n(s),i.reset())},[e]),i}function JDe(n){let e=[];return{get:()=>e,reset:()=>{e=[]},push:t=>{e.push(t),n()}}}const gfe=$.createContext(null);function eTe({children:n}){const e=ds(),t=$.useCallback(a=>{const{nodes:l=[],setNodes:c,hasDefaultNodes:d,onNodesChange:h,nodeLookup:u,fitViewQueued:f,onNodesChangeMiddlewareMap:g}=e.getState();let p=l;for(const b of a)p=typeof b=="function"?b(p):b;let m=ote({items:p,lookup:u});for(const b of g.values())m=b(m);d&&c(p),m.length>0?h==null||h(m):f&&window.requestAnimationFrame(()=>{const{fitViewQueued:b,nodes:v,setNodes:w}=e.getState();b&&w(v)})},[]),i=lte(t),s=$.useCallback(a=>{const{edges:l=[],setEdges:c,hasDefaultEdges:d,onEdgesChange:h,edgeLookup:u}=e.getState();let f=l;for(const g of a)f=typeof g=="function"?g(f):g;d?c(f):h&&h(ote({items:f,lookup:u}))},[]),o=lte(s),r=$.useMemo(()=>({nodeQueue:i,edgeQueue:o}),[]);return y.jsx(gfe.Provider,{value:r,children:n})}function tTe(){const n=$.useContext(gfe);if(!n)throw new Error("useBatchContext must be used within a BatchProvider");return n}const iTe=n=>!!n.panZoom;function _G(){const n=YDe(),e=ds(),t=tTe(),i=Mi(iTe),s=$.useMemo(()=>{const o=h=>e.getState().nodeLookup.get(h),r=h=>{t.nodeQueue.push(h)},a=h=>{t.edgeQueue.push(h)},l=h=>{var b,v;const{nodeLookup:u,nodeOrigin:f}=e.getState(),g=ate(h)?h:u.get(h.id),p=g.parentId?Oue(g.position,g.measured,g.parentId,u,f):g.position,m={...g,position:p,width:((b=g.measured)==null?void 0:b.width)??g.width,height:((v=g.measured)==null?void 0:v.height)??g.height};return Jy(m)},c=(h,u,f={replace:!1})=>{r(g=>g.map(p=>{if(p.id===h){const m=typeof u=="function"?u(p):u;return f.replace&&ate(m)?m:{...p,...m}}return p}))},d=(h,u,f={replace:!1})=>{a(g=>g.map(p=>{if(p.id===h){const m=typeof u=="function"?u(p):u;return f.replace&&XDe(m)?m:{...p,...m}}return p}))};return{getNodes:()=>e.getState().nodes.map(h=>({...h})),getNode:h=>{var u;return(u=o(h))==null?void 0:u.internals.userNode},getInternalNode:o,getEdges:()=>{const{edges:h=[]}=e.getState();return h.map(u=>({...u}))},getEdge:h=>e.getState().edgeLookup.get(h),setNodes:r,setEdges:a,addNodes:h=>{const u=Array.isArray(h)?h:[h];t.nodeQueue.push(f=>[...f,...u])},addEdges:h=>{const u=Array.isArray(h)?h:[h];t.edgeQueue.push(f=>[...f,...u])},toObject:()=>{const{nodes:h=[],edges:u=[],transform:f}=e.getState(),[g,p,m]=f;return{nodes:h.map(b=>({...b})),edges:u.map(b=>({...b})),viewport:{x:g,y:p,zoom:m}}},deleteElements:async({nodes:h=[],edges:u=[]})=>{const{nodes:f,edges:g,onNodesDelete:p,onEdgesDelete:m,triggerNodeChanges:b,triggerEdgeChanges:v,onDelete:w,onBeforeDelete:C}=e.getState(),{nodes:S,edges:L}=await hNe({nodesToRemove:h,edgesToRemove:u,nodes:f,edges:g,onBeforeDelete:C}),x=L.length>0,E=S.length>0;if(x){const I=L.map(rte);m==null||m(L),v(I)}if(E){const I=S.map(rte);p==null||p(S),b(I)}return(E||x)&&(w==null||w({nodes:S,edges:L})),{deletedNodes:S,deletedEdges:L}},getIntersectingNodes:(h,u=!0,f)=>{const g=Fee(h),p=g?h:l(h),m=f!==void 0;return p?(f||e.getState().nodes).filter(b=>{const v=e.getState().nodeLookup.get(b.id);if(v&&!g&&(b.id===h.id||!v.internals.positionAbsolute))return!1;const w=Jy(m?b:v),C=qE(w,p);return u&&C>0||C>=w.width*w.height||C>=p.width*p.height}):[]},isNodeIntersecting:(h,u,f=!0)=>{const p=Fee(h)?h:l(h);if(!p)return!1;const m=qE(p,u);return f&&m>0||m>=u.width*u.height||m>=p.width*p.height},updateNode:c,updateNodeData:(h,u,f={replace:!1})=>{c(h,g=>{const p=typeof u=="function"?u(g):u;return f.replace?{...g,data:p}:{...g,data:{...g.data,...p}}},f)},updateEdge:d,updateEdgeData:(h,u,f={replace:!1})=>{d(h,g=>{const p=typeof u=="function"?u(g):u;return f.replace?{...g,data:p}:{...g,data:{...g.data,...p}}},f)},getNodesBounds:h=>{const{nodeLookup:u,nodeOrigin:f}=e.getState();return aNe(h,{nodeLookup:u,nodeOrigin:f})},getHandleConnections:({type:h,id:u,nodeId:f})=>{var g;return Array.from(((g=e.getState().connectionLookup.get(`${f}-${h}${u?`-${u}`:""}`))==null?void 0:g.values())??[])},getNodeConnections:({type:h,handleId:u,nodeId:f})=>{var g;return Array.from(((g=e.getState().connectionLookup.get(`${f}${h?u?`-${h}-${u}`:`-${h}`:""}`))==null?void 0:g.values())??[])},fitView:async h=>{const u=e.getState().fitViewResolver??pNe();return e.setState({fitViewQueued:!0,fitViewOptions:h,fitViewResolver:u}),t.nodeQueue.push(f=>[...f]),u.promise}}},[]);return $.useMemo(()=>({...s,...n,viewportInitialized:i}),[i])}const cte=n=>n.selected,nTe=typeof window<"u"?window:void 0;function sTe({deleteKeyCode:n,multiSelectionKeyCode:e}){const t=ds(),{deleteElements:i}=_G(),s=GE(n,{actInsideInputWithModifier:!1}),o=GE(e,{target:nTe});$.useEffect(()=>{if(s){const{edges:r,nodes:a}=t.getState();i({nodes:a.filter(cte),edges:r.filter(cte)}),t.setState({nodesSelectionActive:!1})}},[s]),$.useEffect(()=>{t.setState({multiSelectionActive:o})},[o])}function oTe(n){const e=ds();$.useEffect(()=>{const t=()=>{var s,o,r,a;if(!n.current||!(((o=(s=n.current).checkVisibility)==null?void 0:o.call(s))??!0))return!1;const i=hG(n.current);(i.height===0||i.width===0)&&((a=(r=e.getState()).onError)==null||a.call(r,"004",_u.error004())),e.setState({width:i.width||500,height:i.height||500})};if(n.current){t(),window.addEventListener("resize",t);const i=new ResizeObserver(()=>t());return i.observe(n.current),()=>{window.removeEventListener("resize",t),i&&n.current&&i.unobserve(n.current)}}},[])}const k5={position:"absolute",width:"100%",height:"100%",top:0,left:0},rTe=n=>({userSelectionActive:n.userSelectionActive,lib:n.lib,connectionInProgress:n.connection.inProgress});function aTe({onPaneContextMenu:n,zoomOnScroll:e=!0,zoomOnPinch:t=!0,panOnScroll:i=!1,panOnScrollSpeed:s=.5,panOnScrollMode:o=xv.Free,zoomOnDoubleClick:r=!0,panOnDrag:a=!0,defaultViewport:l,translateExtent:c,minZoom:d,maxZoom:h,zoomActivationKeyCode:u,preventScrolling:f=!0,children:g,noWheelClassName:p,noPanClassName:m,onViewportChange:b,isControlledViewport:v,paneClickDistance:w,selectionOnDrag:C}){const S=ds(),L=$.useRef(null),{userSelectionActive:x,lib:E,connectionInProgress:I}=Mi(rTe,as),R=GE(u),M=$.useRef();oTe(L);const A=$.useCallback(W=>{b==null||b({x:W[0],y:W[1],zoom:W[2]}),v||S.setState({transform:W})},[b,v]);return $.useEffect(()=>{if(L.current){M.current=QNe({domNode:L.current,minZoom:d,maxZoom:h,translateExtent:c,viewport:l,onDraggingChange:V=>S.setState(K=>K.paneDragging===V?K:{paneDragging:V}),onPanZoomStart:(V,K)=>{const{onViewportChangeStart:z,onMoveStart:j}=S.getState();j==null||j(V,K),z==null||z(K)},onPanZoom:(V,K)=>{const{onViewportChange:z,onMove:j}=S.getState();j==null||j(V,K),z==null||z(K)},onPanZoomEnd:(V,K)=>{const{onViewportChangeEnd:z,onMoveEnd:j}=S.getState();j==null||j(V,K),z==null||z(K)}});const{x:W,y:P,zoom:B}=M.current.getViewport();return S.setState({panZoom:M.current,transform:[W,P,B],domNode:L.current.closest(".react-flow")}),()=>{var V;(V=M.current)==null||V.destroy()}}},[]),$.useEffect(()=>{var W;(W=M.current)==null||W.update({onPaneContextMenu:n,zoomOnScroll:e,zoomOnPinch:t,panOnScroll:i,panOnScrollSpeed:s,panOnScrollMode:o,zoomOnDoubleClick:r,panOnDrag:a,zoomActivationKeyPressed:R,preventScrolling:f,noPanClassName:m,userSelectionActive:x,noWheelClassName:p,lib:E,onTransformChange:A,connectionInProgress:I,selectionOnDrag:C,paneClickDistance:w})},[n,e,t,i,s,o,r,a,R,f,m,x,p,E,A,I,C,w]),y.jsx("div",{className:"react-flow__renderer",ref:L,style:k5,children:g})}const lTe=n=>({userSelectionActive:n.userSelectionActive,userSelectionRect:n.userSelectionRect});function cTe(){const{userSelectionActive:n,userSelectionRect:e}=Mi(lTe,as);return n&&e?y.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:e.width,height:e.height,transform:`translate(${e.x}px, ${e.y}px)`}}):null}const n7=(n,e)=>t=>{t.target===e.current&&(n==null||n(t))},dTe=n=>({userSelectionActive:n.userSelectionActive,elementsSelectable:n.elementsSelectable,connectionInProgress:n.connection.inProgress,dragging:n.paneDragging});function hTe({isSelecting:n,selectionKeyPressed:e,selectionMode:t=UE.Full,panOnDrag:i,paneClickDistance:s,selectionOnDrag:o,onSelectionStart:r,onSelectionEnd:a,onPaneClick:l,onPaneContextMenu:c,onPaneScroll:d,onPaneMouseEnter:h,onPaneMouseMove:u,onPaneMouseLeave:f,children:g}){const p=ds(),{userSelectionActive:m,elementsSelectable:b,dragging:v,connectionInProgress:w}=Mi(dTe,as),C=b&&(n||m),S=$.useRef(null),L=$.useRef(),x=$.useRef(new Set),E=$.useRef(new Set),I=$.useRef(!1),R=z=>{if(I.current||w){I.current=!1;return}l==null||l(z),p.getState().resetSelectedElements(),p.setState({nodesSelectionActive:!1})},M=z=>{if(Array.isArray(i)&&(i!=null&&i.includes(2))){z.preventDefault();return}c==null||c(z)},A=d?z=>d(z):void 0,W=z=>{I.current&&(z.stopPropagation(),I.current=!1)},P=z=>{var xe,je;const{domNode:j}=p.getState();if(L.current=j==null?void 0:j.getBoundingClientRect(),!L.current)return;const Q=z.target===S.current;if(!Q&&!!z.target.closest(".nokey")||!n||!(o&&Q||e)||z.button!==0||!z.isPrimary)return;(je=(xe=z.target)==null?void 0:xe.setPointerCapture)==null||je.call(xe,z.pointerId),I.current=!1;const{x:ce,y:Ce}=Fd(z.nativeEvent,L.current);p.setState({userSelectionRect:{width:0,height:0,startX:ce,startY:Ce,x:ce,y:Ce}}),Q||(z.stopPropagation(),z.preventDefault())},B=z=>{const{userSelectionRect:j,transform:Q,nodeLookup:Y,edgeLookup:te,connectionLookup:ce,triggerNodeChanges:Ce,triggerEdgeChanges:xe,defaultEdgeOptions:je,resetSelectedElements:ke}=p.getState();if(!L.current||!j)return;const{x:Le,y:Ve}=Fd(z.nativeEvent,L.current),{startX:ct,startY:dt}=j;if(!I.current){const Vt=e?0:s;if(Math.hypot(Le-ct,Ve-dt)<=Vt)return;ke(),r==null||r(z)}I.current=!0;const Be={startX:ct,startY:dt,x:LeVt.id)),E.current=new Set;const Si=(je==null?void 0:je.selectable)??!0;for(const Vt of x.current){const In=ce.get(Vt);if(In)for(const{edgeId:Nn}of In.values()){const Os=te.get(Nn);Os&&(Os.selectable??Si)&&E.current.add(Nn)}}if(!Bee(tt,x.current)){const Vt=n0(Y,x.current,!0);Ce(Vt)}if(!Bee(Tt,E.current)){const Vt=n0(te,E.current);xe(Vt)}p.setState({userSelectionRect:Be,userSelectionActive:!0,nodesSelectionActive:!1})},V=z=>{var j,Q;z.button===0&&((Q=(j=z.target)==null?void 0:j.releasePointerCapture)==null||Q.call(j,z.pointerId),!m&&z.target===S.current&&p.getState().userSelectionRect&&(R==null||R(z)),p.setState({userSelectionActive:!1,userSelectionRect:null}),I.current&&(a==null||a(z),p.setState({nodesSelectionActive:x.current.size>0})))},K=i===!0||Array.isArray(i)&&i.includes(0);return y.jsxs("div",{className:uo(["react-flow__pane",{draggable:K,dragging:v,selection:n}]),onClick:C?void 0:n7(R,S),onContextMenu:n7(M,S),onWheel:n7(A,S),onPointerEnter:C?void 0:h,onPointerMove:C?B:u,onPointerUp:C?V:void 0,onPointerDownCapture:C?P:void 0,onClickCapture:C?W:void 0,onPointerLeave:f,ref:S,style:k5,children:[g,y.jsx(cTe,{})]})}function qB({id:n,store:e,unselect:t=!1,nodeRef:i}){const{addSelectedNodes:s,unselectNodesAndEdges:o,multiSelectionActive:r,nodeLookup:a,onError:l}=e.getState(),c=a.get(n);if(!c){l==null||l("012",_u.error012(n));return}e.setState({nodesSelectionActive:!1}),c.selected?(t||c.selected&&r)&&(o({nodes:[c],edges:[]}),requestAnimationFrame(()=>{var d;return(d=i==null?void 0:i.current)==null?void 0:d.blur()})):s([n])}function pfe({nodeRef:n,disabled:e=!1,noDragClassName:t,handleSelector:i,nodeId:s,isSelectable:o,nodeClickDistance:r}){const a=ds(),[l,c]=$.useState(!1),d=$.useRef();return $.useEffect(()=>{d.current=BNe({getStoreItems:()=>a.getState(),onNodeMouseDown:h=>{qB({id:h,store:a,nodeRef:n})},onDragStart:()=>{c(!0)},onDragStop:()=>{c(!1)}})},[]),$.useEffect(()=>{if(!(e||!n.current||!d.current))return d.current.update({noDragClassName:t,handleSelector:i,domNode:n.current,isSelectable:o,nodeId:s,nodeClickDistance:r}),()=>{var h;(h=d.current)==null||h.destroy()}},[t,i,e,o,n,s,r]),l}const uTe=n=>e=>e.selected&&(e.draggable||n&&typeof e.draggable>"u");function mfe(){const n=ds();return $.useCallback(t=>{const{nodeExtent:i,snapToGrid:s,snapGrid:o,nodesDraggable:r,onError:a,updateNodePositions:l,nodeLookup:c,nodeOrigin:d}=n.getState(),h=new Map,u=uTe(r),f=s?o[0]:5,g=s?o[1]:5,p=t.direction.x*f*t.factor,m=t.direction.y*g*t.factor;for(const[,b]of c){if(!u(b))continue;let v={x:b.internals.positionAbsolute.x+p,y:b.internals.positionAbsolute.y+m};s&&(v=JN(v,o));const{position:w,positionAbsolute:C}=Tue({nodeId:b.id,nextPosition:v,nodeLookup:c,nodeExtent:i,nodeOrigin:d,onError:a});b.position=w,b.internals.positionAbsolute=C,h.set(b.id,b)}l(h)},[])}const bG=$.createContext(null),fTe=bG.Provider;bG.Consumer;const _fe=()=>$.useContext(bG),gTe=n=>({connectOnClick:n.connectOnClick,noPanClassName:n.noPanClassName,rfId:n.rfId}),pTe=(n,e,t)=>i=>{const{connectionClickStartHandle:s,connectionMode:o,connection:r}=i,{fromHandle:a,toHandle:l,isValid:c}=r,d=(l==null?void 0:l.nodeId)===n&&(l==null?void 0:l.id)===e&&(l==null?void 0:l.type)===t;return{connectingFrom:(a==null?void 0:a.nodeId)===n&&(a==null?void 0:a.id)===e&&(a==null?void 0:a.type)===t,connectingTo:d,clickConnecting:(s==null?void 0:s.nodeId)===n&&(s==null?void 0:s.id)===e&&(s==null?void 0:s.type)===t,isPossibleEndHandle:o===Xy.Strict?(a==null?void 0:a.type)!==t:n!==(a==null?void 0:a.nodeId)||e!==(a==null?void 0:a.id),connectionInProcess:!!a,clickConnectionInProcess:!!s,valid:d&&c}};function mTe({type:n="source",position:e=It.Top,isValidConnection:t,isConnectable:i=!0,isConnectableStart:s=!0,isConnectableEnd:o=!0,id:r,onConnect:a,children:l,className:c,onMouseDown:d,onTouchStart:h,...u},f){var B,V;const g=r||null,p=n==="target",m=ds(),b=_fe(),{connectOnClick:v,noPanClassName:w,rfId:C}=Mi(gTe,as),{connectingFrom:S,connectingTo:L,clickConnecting:x,isPossibleEndHandle:E,connectionInProcess:I,clickConnectionInProcess:R,valid:M}=Mi(pTe(b,g,n),as);b||(V=(B=m.getState()).onError)==null||V.call(B,"010",_u.error010());const A=K=>{const{defaultEdgeOptions:z,onConnect:j,hasDefaultEdges:Q}=m.getState(),Y={...z,...K};if(Q){const{edges:te,setEdges:ce}=m.getState();ce(yNe(Y,te))}j==null||j(Y),a==null||a(Y)},W=K=>{if(!b)return;const z=Wue(K.nativeEvent);if(s&&(z&&K.button===0||!z)){const j=m.getState();UB.onPointerDown(K.nativeEvent,{handleDomNode:K.currentTarget,autoPanOnConnect:j.autoPanOnConnect,connectionMode:j.connectionMode,connectionRadius:j.connectionRadius,domNode:j.domNode,nodeLookup:j.nodeLookup,lib:j.lib,isTarget:p,handleId:g,nodeId:b,flowId:j.rfId,panBy:j.panBy,cancelConnection:j.cancelConnection,onConnectStart:j.onConnectStart,onConnectEnd:(...Q)=>{var Y,te;return(te=(Y=m.getState()).onConnectEnd)==null?void 0:te.call(Y,...Q)},updateConnection:j.updateConnection,onConnect:A,isValidConnection:t||((...Q)=>{var Y,te;return((te=(Y=m.getState()).isValidConnection)==null?void 0:te.call(Y,...Q))??!0}),getTransform:()=>m.getState().transform,getFromHandle:()=>m.getState().connection.fromHandle,autoPanSpeed:j.autoPanSpeed,dragThreshold:j.connectionDragThreshold})}z?d==null||d(K):h==null||h(K)},P=K=>{const{onClickConnectStart:z,onClickConnectEnd:j,connectionClickStartHandle:Q,connectionMode:Y,isValidConnection:te,lib:ce,rfId:Ce,nodeLookup:xe,connection:je}=m.getState();if(!b||!Q&&!s)return;if(!Q){z==null||z(K.nativeEvent,{nodeId:b,handleId:g,handleType:n}),m.setState({connectionClickStartHandle:{nodeId:b,type:n,id:g}});return}const ke=Fue(K.target),Le=t||te,{connection:Ve,isValid:ct}=UB.isValid(K.nativeEvent,{handle:{nodeId:b,id:g,type:n},connectionMode:Y,fromNodeId:Q.nodeId,fromHandleId:Q.id||null,fromType:Q.type,isValidConnection:Le,flowId:Ce,doc:ke,lib:ce,nodeLookup:xe});ct&&Ve&&A(Ve);const dt=structuredClone(je);delete dt.inProgress,dt.toPosition=dt.toHandle?dt.toHandle.position:null,j==null||j(K,dt),m.setState({connectionClickStartHandle:null})};return y.jsx("div",{"data-handleid":g,"data-nodeid":b,"data-handlepos":e,"data-id":`${C}-${b}-${g}-${n}`,className:uo(["react-flow__handle",`react-flow__handle-${e}`,"nodrag",w,c,{source:!p,target:p,connectable:i,connectablestart:s,connectableend:o,clickconnecting:x,connectingfrom:S,connectingto:L,valid:M,connectionindicator:i&&(!I||E)&&(I||R?o:s)}]),onMouseDown:W,onTouchStart:W,onClick:v?P:void 0,ref:f,...u,children:l})}const nS=$.memo(ffe(mTe));function _Te({data:n,isConnectable:e,sourcePosition:t=It.Bottom}){return y.jsxs(y.Fragment,{children:[n==null?void 0:n.label,y.jsx(nS,{type:"source",position:t,isConnectable:e})]})}function bTe({data:n,isConnectable:e,targetPosition:t=It.Top,sourcePosition:i=It.Bottom}){return y.jsxs(y.Fragment,{children:[y.jsx(nS,{type:"target",position:t,isConnectable:e}),n==null?void 0:n.label,y.jsx(nS,{type:"source",position:i,isConnectable:e})]})}function vTe(){return null}function wTe({data:n,isConnectable:e,targetPosition:t=It.Top}){return y.jsxs(y.Fragment,{children:[y.jsx(nS,{type:"target",position:t,isConnectable:e}),n==null?void 0:n.label]})}const $M={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},dte={input:_Te,default:bTe,output:wTe,group:vTe};function CTe(n){var e,t,i,s;return n.internals.handleBounds===void 0?{width:n.width??n.initialWidth??((e=n.style)==null?void 0:e.width),height:n.height??n.initialHeight??((t=n.style)==null?void 0:t.height)}:{width:n.width??((i=n.style)==null?void 0:i.width),height:n.height??((s=n.style)==null?void 0:s.height)}}const yTe=n=>{const{width:e,height:t,x:i,y:s}=QN(n.nodeLookup,{filter:o=>!!o.selected});return{width:Od(e)?e:null,height:Od(t)?t:null,userSelectionActive:n.userSelectionActive,transformString:`translate(${n.transform[0]}px,${n.transform[1]}px) scale(${n.transform[2]}) translate(${i}px,${s}px)`}};function STe({onSelectionContextMenu:n,noPanClassName:e,disableKeyboardA11y:t}){const i=ds(),{width:s,height:o,transformString:r,userSelectionActive:a}=Mi(yTe,as),l=mfe(),c=$.useRef(null);$.useEffect(()=>{var f;t||(f=c.current)==null||f.focus({preventScroll:!0})},[t]);const d=!a&&s!==null&&o!==null;if(pfe({nodeRef:c,disabled:!d}),!d)return null;const h=n?f=>{const g=i.getState().nodes.filter(p=>p.selected);n(f,g)}:void 0,u=f=>{Object.prototype.hasOwnProperty.call($M,f.key)&&(f.preventDefault(),l({direction:$M[f.key],factor:f.shiftKey?4:1}))};return y.jsx("div",{className:uo(["react-flow__nodesselection","react-flow__container",e]),style:{transform:r},children:y.jsx("div",{ref:c,className:"react-flow__nodesselection-rect",onContextMenu:h,tabIndex:t?void 0:-1,onKeyDown:t?void 0:u,style:{width:s,height:o}})})}const hte=typeof window<"u"?window:void 0,xTe=n=>({nodesSelectionActive:n.nodesSelectionActive,userSelectionActive:n.userSelectionActive});function bfe({children:n,onPaneClick:e,onPaneMouseEnter:t,onPaneMouseMove:i,onPaneMouseLeave:s,onPaneContextMenu:o,onPaneScroll:r,paneClickDistance:a,deleteKeyCode:l,selectionKeyCode:c,selectionOnDrag:d,selectionMode:h,onSelectionStart:u,onSelectionEnd:f,multiSelectionKeyCode:g,panActivationKeyCode:p,zoomActivationKeyCode:m,elementsSelectable:b,zoomOnScroll:v,zoomOnPinch:w,panOnScroll:C,panOnScrollSpeed:S,panOnScrollMode:L,zoomOnDoubleClick:x,panOnDrag:E,defaultViewport:I,translateExtent:R,minZoom:M,maxZoom:A,preventScrolling:W,onSelectionContextMenu:P,noWheelClassName:B,noPanClassName:V,disableKeyboardA11y:K,onViewportChange:z,isControlledViewport:j}){const{nodesSelectionActive:Q,userSelectionActive:Y}=Mi(xTe,as),te=GE(c,{target:hte}),ce=GE(p,{target:hte}),Ce=ce||E,xe=ce||C,je=d&&Ce!==!0,ke=te||Y||je;return sTe({deleteKeyCode:l,multiSelectionKeyCode:g}),y.jsx(aTe,{onPaneContextMenu:o,elementsSelectable:b,zoomOnScroll:v,zoomOnPinch:w,panOnScroll:xe,panOnScrollSpeed:S,panOnScrollMode:L,zoomOnDoubleClick:x,panOnDrag:!te&&Ce,defaultViewport:I,translateExtent:R,minZoom:M,maxZoom:A,zoomActivationKeyCode:m,preventScrolling:W,noWheelClassName:B,noPanClassName:V,onViewportChange:z,isControlledViewport:j,paneClickDistance:a,selectionOnDrag:je,children:y.jsxs(hTe,{onSelectionStart:u,onSelectionEnd:f,onPaneClick:e,onPaneMouseEnter:t,onPaneMouseMove:i,onPaneMouseLeave:s,onPaneContextMenu:o,onPaneScroll:r,panOnDrag:Ce,isSelecting:!!ke,selectionMode:h,selectionKeyPressed:te,paneClickDistance:a,selectionOnDrag:je,children:[n,Q&&y.jsx(STe,{onSelectionContextMenu:P,noPanClassName:V,disableKeyboardA11y:K})]})})}bfe.displayName="FlowRenderer";const LTe=$.memo(bfe),kTe=n=>e=>n?cG(e.nodeLookup,{x:0,y:0,width:e.width,height:e.height},e.transform,!0).map(t=>t.id):Array.from(e.nodeLookup.keys());function ETe(n){return Mi($.useCallback(kTe(n),[n]),as)}const ITe=n=>n.updateNodeInternals;function NTe(){const n=Mi(ITe),[e]=$.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(t=>{const i=new Map;t.forEach(s=>{const o=s.target.getAttribute("data-id");i.set(o,{id:o,nodeElement:s.target,force:!0})}),n(i)}));return $.useEffect(()=>()=>{e==null||e.disconnect()},[e]),e}function DTe({node:n,nodeType:e,hasDimensions:t,resizeObserver:i}){const s=ds(),o=$.useRef(null),r=$.useRef(null),a=$.useRef(n.sourcePosition),l=$.useRef(n.targetPosition),c=$.useRef(e),d=t&&!!n.internals.handleBounds;return $.useEffect(()=>{o.current&&!n.hidden&&(!d||r.current!==o.current)&&(r.current&&(i==null||i.unobserve(r.current)),i==null||i.observe(o.current),r.current=o.current)},[d,n.hidden]),$.useEffect(()=>()=>{r.current&&(i==null||i.unobserve(r.current),r.current=null)},[]),$.useEffect(()=>{if(o.current){const h=c.current!==e,u=a.current!==n.sourcePosition,f=l.current!==n.targetPosition;(h||u||f)&&(c.current=e,a.current=n.sourcePosition,l.current=n.targetPosition,s.getState().updateNodeInternals(new Map([[n.id,{id:n.id,nodeElement:o.current,force:!0}]])))}},[n.id,e,n.sourcePosition,n.targetPosition]),o}function TTe({id:n,onClick:e,onMouseEnter:t,onMouseMove:i,onMouseLeave:s,onContextMenu:o,onDoubleClick:r,nodesDraggable:a,elementsSelectable:l,nodesConnectable:c,nodesFocusable:d,resizeObserver:h,noDragClassName:u,noPanClassName:f,disableKeyboardA11y:g,rfId:p,nodeTypes:m,nodeClickDistance:b,onError:v}){const{node:w,internals:C,isParent:S}=Mi(Le=>{const Ve=Le.nodeLookup.get(n),ct=Le.parentLookup.has(n);return{node:Ve,internals:Ve.internals,isParent:ct}},as);let L=w.type||"default",x=(m==null?void 0:m[L])||dte[L];x===void 0&&(v==null||v("003",_u.error003(L)),L="default",x=(m==null?void 0:m.default)||dte.default);const E=!!(w.draggable||a&&typeof w.draggable>"u"),I=!!(w.selectable||l&&typeof w.selectable>"u"),R=!!(w.connectable||c&&typeof w.connectable>"u"),M=!!(w.focusable||d&&typeof w.focusable>"u"),A=ds(),W=Pue(w),P=DTe({node:w,nodeType:L,hasDimensions:W,resizeObserver:h}),B=pfe({nodeRef:P,disabled:w.hidden||!E,noDragClassName:u,handleSelector:w.dragHandle,nodeId:n,isSelectable:I,nodeClickDistance:b}),V=mfe();if(w.hidden)return null;const K=Wg(w),z=CTe(w),j=I||E||e||t||i||s,Q=t?Le=>t(Le,{...C.userNode}):void 0,Y=i?Le=>i(Le,{...C.userNode}):void 0,te=s?Le=>s(Le,{...C.userNode}):void 0,ce=o?Le=>o(Le,{...C.userNode}):void 0,Ce=r?Le=>r(Le,{...C.userNode}):void 0,xe=Le=>{const{selectNodesOnDrag:Ve,nodeDragThreshold:ct}=A.getState();I&&(!Ve||!E||ct>0)&&qB({id:n,store:A,nodeRef:P}),e&&e(Le,{...C.userNode})},je=Le=>{if(!(Bue(Le.nativeEvent)||g)){if(kue.includes(Le.key)&&I){const Ve=Le.key==="Escape";qB({id:n,store:A,unselect:Ve,nodeRef:P})}else if(E&&w.selected&&Object.prototype.hasOwnProperty.call($M,Le.key)){Le.preventDefault();const{ariaLabelConfig:Ve}=A.getState();A.setState({ariaLiveMessage:Ve["node.a11yDescription.ariaLiveMessage"]({direction:Le.key.replace("Arrow","").toLowerCase(),x:~~C.positionAbsolute.x,y:~~C.positionAbsolute.y})}),V({direction:$M[Le.key],factor:Le.shiftKey?4:1})}}},ke=()=>{var Tt;if(g||!((Tt=P.current)!=null&&Tt.matches(":focus-visible")))return;const{transform:Le,width:Ve,height:ct,autoPanOnNodeFocus:dt,setCenter:Be}=A.getState();if(!dt)return;cG(new Map([[n,w]]),{x:0,y:0,width:Ve,height:ct},Le,!0).length>0||Be(w.position.x+K.width/2,w.position.y+K.height/2,{zoom:Le[2]})};return y.jsx("div",{className:uo(["react-flow__node",`react-flow__node-${L}`,{[f]:E},w.className,{selected:w.selected,selectable:I,parent:S,draggable:E,dragging:B}]),ref:P,style:{zIndex:C.z,transform:`translate(${C.positionAbsolute.x}px,${C.positionAbsolute.y}px)`,pointerEvents:j?"all":"none",visibility:W?"visible":"hidden",...w.style,...z},"data-id":n,"data-testid":`rf__node-${n}`,onMouseEnter:Q,onMouseMove:Y,onMouseLeave:te,onContextMenu:ce,onClick:xe,onDoubleClick:Ce,onKeyDown:M?je:void 0,tabIndex:M?0:void 0,onFocus:M?ke:void 0,role:w.ariaRole??(M?"group":void 0),"aria-roledescription":"node","aria-describedby":g?void 0:`${afe}-${p}`,"aria-label":w.ariaLabel,...w.domAttributes,children:y.jsx(fTe,{value:n,children:y.jsx(x,{id:n,data:w.data,type:L,positionAbsoluteX:C.positionAbsolute.x,positionAbsoluteY:C.positionAbsolute.y,selected:w.selected??!1,selectable:I,draggable:E,deletable:w.deletable??!0,isConnectable:R,sourcePosition:w.sourcePosition,targetPosition:w.targetPosition,dragging:B,dragHandle:w.dragHandle,zIndex:C.z,parentId:w.parentId,...K})})})}var RTe=$.memo(TTe);const MTe=n=>({nodesDraggable:n.nodesDraggable,nodesConnectable:n.nodesConnectable,nodesFocusable:n.nodesFocusable,elementsSelectable:n.elementsSelectable,onError:n.onError});function vfe(n){const{nodesDraggable:e,nodesConnectable:t,nodesFocusable:i,elementsSelectable:s,onError:o}=Mi(MTe,as),r=ETe(n.onlyRenderVisibleElements),a=NTe();return y.jsx("div",{className:"react-flow__nodes",style:k5,children:r.map(l=>y.jsx(RTe,{id:l,nodeTypes:n.nodeTypes,nodeExtent:n.nodeExtent,onClick:n.onNodeClick,onMouseEnter:n.onNodeMouseEnter,onMouseMove:n.onNodeMouseMove,onMouseLeave:n.onNodeMouseLeave,onContextMenu:n.onNodeContextMenu,onDoubleClick:n.onNodeDoubleClick,noDragClassName:n.noDragClassName,noPanClassName:n.noPanClassName,rfId:n.rfId,disableKeyboardA11y:n.disableKeyboardA11y,resizeObserver:a,nodesDraggable:e,nodesConnectable:t,nodesFocusable:i,elementsSelectable:s,nodeClickDistance:n.nodeClickDistance,onError:o},l))})}vfe.displayName="NodeRenderer";const ATe=$.memo(vfe);function PTe(n){return Mi($.useCallback(t=>{if(!n)return t.edges.map(s=>s.id);const i=[];if(t.width&&t.height)for(const s of t.edges){const o=t.nodeLookup.get(s.source),r=t.nodeLookup.get(s.target);o&&r&&vNe({sourceNode:o,targetNode:r,width:t.width,height:t.height,transform:t.transform})&&i.push(s.id)}return i},[n]),as)}const OTe=({color:n="none",strokeWidth:e=1})=>{const t={strokeWidth:e,...n&&{stroke:n}};return y.jsx("polyline",{className:"arrow",style:t,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},FTe=({color:n="none",strokeWidth:e=1})=>{const t={strokeWidth:e,...n&&{stroke:n,fill:n}};return y.jsx("polyline",{className:"arrowclosed",style:t,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},ute={[U1.Arrow]:OTe,[U1.ArrowClosed]:FTe};function BTe(n){const e=ds();return $.useMemo(()=>{var s,o;return Object.prototype.hasOwnProperty.call(ute,n)?ute[n]:((o=(s=e.getState()).onError)==null||o.call(s,"009",_u.error009(n)),null)},[n])}const WTe=({id:n,type:e,color:t,width:i=12.5,height:s=12.5,markerUnits:o="strokeWidth",strokeWidth:r,orient:a="auto-start-reverse"})=>{const l=BTe(e);return l?y.jsx("marker",{className:"react-flow__arrowhead",id:n,markerWidth:`${i}`,markerHeight:`${s}`,viewBox:"-10 -10 20 20",markerUnits:o,orient:a,refX:"0",refY:"0",children:y.jsx(l,{color:t,strokeWidth:r})}):null},wfe=({defaultColor:n,rfId:e})=>{const t=Mi(o=>o.edges),i=Mi(o=>o.defaultEdgeOptions),s=$.useMemo(()=>ENe(t,{id:e,defaultColor:n,defaultMarkerStart:i==null?void 0:i.markerStart,defaultMarkerEnd:i==null?void 0:i.markerEnd}),[t,i,e,n]);return s.length?y.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:y.jsx("defs",{children:s.map(o=>y.jsx(WTe,{id:o.id,type:o.type,color:o.color,width:o.width,height:o.height,markerUnits:o.markerUnits,strokeWidth:o.strokeWidth,orient:o.orient},o.id))})}):null};wfe.displayName="MarkerDefinitions";var HTe=$.memo(wfe);function Cfe({x:n,y:e,label:t,labelStyle:i,labelShowBg:s=!0,labelBgStyle:o,labelBgPadding:r=[2,4],labelBgBorderRadius:a=2,children:l,className:c,...d}){const[h,u]=$.useState({x:1,y:0,width:0,height:0}),f=uo(["react-flow__edge-textwrapper",c]),g=$.useRef(null);return $.useEffect(()=>{if(g.current){const p=g.current.getBBox();u({x:p.x,y:p.y,width:p.width,height:p.height})}},[t]),t?y.jsxs("g",{transform:`translate(${n-h.width/2} ${e-h.height/2})`,className:f,visibility:h.width?"visible":"hidden",...d,children:[s&&y.jsx("rect",{width:h.width+2*r[0],x:-r[0],y:-r[1],height:h.height+2*r[1],className:"react-flow__edge-textbg",style:o,rx:a,ry:a}),y.jsx("text",{className:"react-flow__edge-text",y:h.height/2,dy:"0.3em",ref:g,style:i,children:t}),l]}):null}Cfe.displayName="EdgeText";const VTe=$.memo(Cfe);function E5({path:n,labelX:e,labelY:t,label:i,labelStyle:s,labelShowBg:o,labelBgStyle:r,labelBgPadding:a,labelBgBorderRadius:l,interactionWidth:c=20,...d}){return y.jsxs(y.Fragment,{children:[y.jsx("path",{...d,d:n,fill:"none",className:uo(["react-flow__edge-path",d.className])}),c?y.jsx("path",{d:n,fill:"none",strokeOpacity:0,strokeWidth:c,className:"react-flow__edge-interaction"}):null,i&&Od(e)&&Od(t)?y.jsx(VTe,{x:e,y:t,label:i,labelStyle:s,labelShowBg:o,labelBgStyle:r,labelBgPadding:a,labelBgBorderRadius:l}):null]})}function fte({pos:n,x1:e,y1:t,x2:i,y2:s}){return n===It.Left||n===It.Right?[.5*(e+i),t]:[e,.5*(t+s)]}function yfe({sourceX:n,sourceY:e,sourcePosition:t=It.Bottom,targetX:i,targetY:s,targetPosition:o=It.Top}){const[r,a]=fte({pos:t,x1:n,y1:e,x2:i,y2:s}),[l,c]=fte({pos:o,x1:i,y1:s,x2:n,y2:e}),[d,h,u,f]=Hue({sourceX:n,sourceY:e,targetX:i,targetY:s,sourceControlX:r,sourceControlY:a,targetControlX:l,targetControlY:c});return[`M${n},${e} C${r},${a} ${l},${c} ${i},${s}`,d,h,u,f]}function Sfe(n){return $.memo(({id:e,sourceX:t,sourceY:i,targetX:s,targetY:o,sourcePosition:r,targetPosition:a,label:l,labelStyle:c,labelShowBg:d,labelBgStyle:h,labelBgPadding:u,labelBgBorderRadius:f,style:g,markerEnd:p,markerStart:m,interactionWidth:b})=>{const[v,w,C]=yfe({sourceX:t,sourceY:i,sourcePosition:r,targetX:s,targetY:o,targetPosition:a}),S=n.isInternal?void 0:e;return y.jsx(E5,{id:S,path:v,labelX:w,labelY:C,label:l,labelStyle:c,labelShowBg:d,labelBgStyle:h,labelBgPadding:u,labelBgBorderRadius:f,style:g,markerEnd:p,markerStart:m,interactionWidth:b})})}const zTe=Sfe({isInternal:!1}),xfe=Sfe({isInternal:!0});zTe.displayName="SimpleBezierEdge";xfe.displayName="SimpleBezierEdgeInternal";function Lfe(n){return $.memo(({id:e,sourceX:t,sourceY:i,targetX:s,targetY:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:h,style:u,sourcePosition:f=It.Bottom,targetPosition:g=It.Top,markerEnd:p,markerStart:m,pathOptions:b,interactionWidth:v})=>{const[w,C,S]=zB({sourceX:t,sourceY:i,sourcePosition:f,targetX:s,targetY:o,targetPosition:g,borderRadius:b==null?void 0:b.borderRadius,offset:b==null?void 0:b.offset,stepPosition:b==null?void 0:b.stepPosition}),L=n.isInternal?void 0:e;return y.jsx(E5,{id:L,path:w,labelX:C,labelY:S,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:h,style:u,markerEnd:p,markerStart:m,interactionWidth:v})})}const kfe=Lfe({isInternal:!1}),Efe=Lfe({isInternal:!0});kfe.displayName="SmoothStepEdge";Efe.displayName="SmoothStepEdgeInternal";function Ife(n){return $.memo(({id:e,...t})=>{var s;const i=n.isInternal?void 0:e;return y.jsx(kfe,{...t,id:i,pathOptions:$.useMemo(()=>{var o;return{borderRadius:0,offset:(o=t.pathOptions)==null?void 0:o.offset}},[(s=t.pathOptions)==null?void 0:s.offset])})})}const jTe=Ife({isInternal:!1}),Nfe=Ife({isInternal:!0});jTe.displayName="StepEdge";Nfe.displayName="StepEdgeInternal";function Dfe(n){return $.memo(({id:e,sourceX:t,sourceY:i,targetX:s,targetY:o,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:h,style:u,markerEnd:f,markerStart:g,interactionWidth:p})=>{const[m,b,v]=jue({sourceX:t,sourceY:i,targetX:s,targetY:o}),w=n.isInternal?void 0:e;return y.jsx(E5,{id:w,path:m,labelX:b,labelY:v,label:r,labelStyle:a,labelShowBg:l,labelBgStyle:c,labelBgPadding:d,labelBgBorderRadius:h,style:u,markerEnd:f,markerStart:g,interactionWidth:p})})}const $Te=Dfe({isInternal:!1}),Tfe=Dfe({isInternal:!0});$Te.displayName="StraightEdge";Tfe.displayName="StraightEdgeInternal";function Rfe(n){return $.memo(({id:e,sourceX:t,sourceY:i,targetX:s,targetY:o,sourcePosition:r=It.Bottom,targetPosition:a=It.Top,label:l,labelStyle:c,labelShowBg:d,labelBgStyle:h,labelBgPadding:u,labelBgBorderRadius:f,style:g,markerEnd:p,markerStart:m,pathOptions:b,interactionWidth:v})=>{const[w,C,S]=Vue({sourceX:t,sourceY:i,sourcePosition:r,targetX:s,targetY:o,targetPosition:a,curvature:b==null?void 0:b.curvature}),L=n.isInternal?void 0:e;return y.jsx(E5,{id:L,path:w,labelX:C,labelY:S,label:l,labelStyle:c,labelShowBg:d,labelBgStyle:h,labelBgPadding:u,labelBgBorderRadius:f,style:g,markerEnd:p,markerStart:m,interactionWidth:v})})}const UTe=Rfe({isInternal:!1}),Mfe=Rfe({isInternal:!0});UTe.displayName="BezierEdge";Mfe.displayName="BezierEdgeInternal";const gte={default:Mfe,straight:Tfe,step:Nfe,smoothstep:Efe,simplebezier:xfe},pte={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null},qTe=(n,e,t)=>t===It.Left?n-e:t===It.Right?n+e:n,KTe=(n,e,t)=>t===It.Top?n-e:t===It.Bottom?n+e:n,mte="react-flow__edgeupdater";function _te({position:n,centerX:e,centerY:t,radius:i=10,onMouseDown:s,onMouseEnter:o,onMouseOut:r,type:a}){return y.jsx("circle",{onMouseDown:s,onMouseEnter:o,onMouseOut:r,className:uo([mte,`${mte}-${a}`]),cx:qTe(e,i,n),cy:KTe(t,i,n),r:i,stroke:"transparent",fill:"transparent"})}function GTe({isReconnectable:n,reconnectRadius:e,edge:t,sourceX:i,sourceY:s,targetX:o,targetY:r,sourcePosition:a,targetPosition:l,onReconnect:c,onReconnectStart:d,onReconnectEnd:h,setReconnecting:u,setUpdateHover:f}){const g=ds(),p=(C,S)=>{if(C.button!==0)return;const{autoPanOnConnect:L,domNode:x,connectionMode:E,connectionRadius:I,lib:R,onConnectStart:M,cancelConnection:A,nodeLookup:W,rfId:P,panBy:B,updateConnection:V}=g.getState(),K=S.type==="target",z=(Y,te)=>{u(!1),h==null||h(Y,t,S.type,te)},j=Y=>c==null?void 0:c(t,Y),Q=(Y,te)=>{u(!0),d==null||d(C,t,S.type),M==null||M(Y,te)};UB.onPointerDown(C.nativeEvent,{autoPanOnConnect:L,connectionMode:E,connectionRadius:I,domNode:x,handleId:S.id,nodeId:S.nodeId,nodeLookup:W,isTarget:K,edgeUpdaterType:S.type,lib:R,flowId:P,cancelConnection:A,panBy:B,isValidConnection:(...Y)=>{var te,ce;return((ce=(te=g.getState()).isValidConnection)==null?void 0:ce.call(te,...Y))??!0},onConnect:j,onConnectStart:Q,onConnectEnd:(...Y)=>{var te,ce;return(ce=(te=g.getState()).onConnectEnd)==null?void 0:ce.call(te,...Y)},onReconnectEnd:z,updateConnection:V,getTransform:()=>g.getState().transform,getFromHandle:()=>g.getState().connection.fromHandle,dragThreshold:g.getState().connectionDragThreshold,handleDomNode:C.currentTarget})},m=C=>p(C,{nodeId:t.target,id:t.targetHandle??null,type:"target"}),b=C=>p(C,{nodeId:t.source,id:t.sourceHandle??null,type:"source"}),v=()=>f(!0),w=()=>f(!1);return y.jsxs(y.Fragment,{children:[(n===!0||n==="source")&&y.jsx(_te,{position:a,centerX:i,centerY:s,radius:e,onMouseDown:m,onMouseEnter:v,onMouseOut:w,type:"source"}),(n===!0||n==="target")&&y.jsx(_te,{position:l,centerX:o,centerY:r,radius:e,onMouseDown:b,onMouseEnter:v,onMouseOut:w,type:"target"})]})}function YTe({id:n,edgesFocusable:e,edgesReconnectable:t,elementsSelectable:i,onClick:s,onDoubleClick:o,onContextMenu:r,onMouseEnter:a,onMouseMove:l,onMouseLeave:c,reconnectRadius:d,onReconnect:h,onReconnectStart:u,onReconnectEnd:f,rfId:g,edgeTypes:p,noPanClassName:m,onError:b,disableKeyboardA11y:v}){let w=Mi(Be=>Be.edgeLookup.get(n));const C=Mi(Be=>Be.defaultEdgeOptions);w=C?{...C,...w}:w;let S=w.type||"default",L=(p==null?void 0:p[S])||gte[S];L===void 0&&(b==null||b("011",_u.error011(S)),S="default",L=(p==null?void 0:p.default)||gte.default);const x=!!(w.focusable||e&&typeof w.focusable>"u"),E=typeof h<"u"&&(w.reconnectable||t&&typeof w.reconnectable>"u"),I=!!(w.selectable||i&&typeof w.selectable>"u"),R=$.useRef(null),[M,A]=$.useState(!1),[W,P]=$.useState(!1),B=ds(),{zIndex:V,sourceX:K,sourceY:z,targetX:j,targetY:Q,sourcePosition:Y,targetPosition:te}=Mi($.useCallback(Be=>{const tt=Be.nodeLookup.get(w.source),Tt=Be.nodeLookup.get(w.target);if(!tt||!Tt)return{zIndex:w.zIndex,...pte};const Si=kNe({id:n,sourceNode:tt,targetNode:Tt,sourceHandle:w.sourceHandle||null,targetHandle:w.targetHandle||null,connectionMode:Be.connectionMode,onError:b});return{zIndex:bNe({selected:w.selected,zIndex:w.zIndex,sourceNode:tt,targetNode:Tt,elevateOnSelect:Be.elevateEdgesOnSelect,zIndexMode:Be.zIndexMode}),...Si||pte}},[w.source,w.target,w.sourceHandle,w.targetHandle,w.selected,w.zIndex]),as),ce=$.useMemo(()=>w.markerStart?`url('#${jB(w.markerStart,g)}')`:void 0,[w.markerStart,g]),Ce=$.useMemo(()=>w.markerEnd?`url('#${jB(w.markerEnd,g)}')`:void 0,[w.markerEnd,g]);if(w.hidden||K===null||z===null||j===null||Q===null)return null;const xe=Be=>{var Vt;const{addSelectedEdges:tt,unselectNodesAndEdges:Tt,multiSelectionActive:Si}=B.getState();I&&(B.setState({nodesSelectionActive:!1}),w.selected&&Si?(Tt({nodes:[],edges:[w]}),(Vt=R.current)==null||Vt.blur()):tt([n])),s&&s(Be,w)},je=o?Be=>{o(Be,{...w})}:void 0,ke=r?Be=>{r(Be,{...w})}:void 0,Le=a?Be=>{a(Be,{...w})}:void 0,Ve=l?Be=>{l(Be,{...w})}:void 0,ct=c?Be=>{c(Be,{...w})}:void 0,dt=Be=>{var tt;if(!v&&kue.includes(Be.key)&&I){const{unselectNodesAndEdges:Tt,addSelectedEdges:Si}=B.getState();Be.key==="Escape"?((tt=R.current)==null||tt.blur(),Tt({edges:[w]})):Si([n])}};return y.jsx("svg",{style:{zIndex:V},children:y.jsxs("g",{className:uo(["react-flow__edge",`react-flow__edge-${S}`,w.className,m,{selected:w.selected,animated:w.animated,inactive:!I&&!s,updating:M,selectable:I}]),onClick:xe,onDoubleClick:je,onContextMenu:ke,onMouseEnter:Le,onMouseMove:Ve,onMouseLeave:ct,onKeyDown:x?dt:void 0,tabIndex:x?0:void 0,role:w.ariaRole??(x?"group":"img"),"aria-roledescription":"edge","data-id":n,"data-testid":`rf__edge-${n}`,"aria-label":w.ariaLabel===null?void 0:w.ariaLabel||`Edge from ${w.source} to ${w.target}`,"aria-describedby":x?`${lfe}-${g}`:void 0,ref:R,...w.domAttributes,children:[!W&&y.jsx(L,{id:n,source:w.source,target:w.target,type:w.type,selected:w.selected,animated:w.animated,selectable:I,deletable:w.deletable??!0,label:w.label,labelStyle:w.labelStyle,labelShowBg:w.labelShowBg,labelBgStyle:w.labelBgStyle,labelBgPadding:w.labelBgPadding,labelBgBorderRadius:w.labelBgBorderRadius,sourceX:K,sourceY:z,targetX:j,targetY:Q,sourcePosition:Y,targetPosition:te,data:w.data,style:w.style,sourceHandleId:w.sourceHandle,targetHandleId:w.targetHandle,markerStart:ce,markerEnd:Ce,pathOptions:"pathOptions"in w?w.pathOptions:void 0,interactionWidth:w.interactionWidth}),E&&y.jsx(GTe,{edge:w,isReconnectable:E,reconnectRadius:d,onReconnect:h,onReconnectStart:u,onReconnectEnd:f,sourceX:K,sourceY:z,targetX:j,targetY:Q,sourcePosition:Y,targetPosition:te,setUpdateHover:A,setReconnecting:P})]})})}var ZTe=$.memo(YTe);const XTe=n=>({edgesFocusable:n.edgesFocusable,edgesReconnectable:n.edgesReconnectable,elementsSelectable:n.elementsSelectable,connectionMode:n.connectionMode,onError:n.onError});function Afe({defaultMarkerColor:n,onlyRenderVisibleElements:e,rfId:t,edgeTypes:i,noPanClassName:s,onReconnect:o,onEdgeContextMenu:r,onEdgeMouseEnter:a,onEdgeMouseMove:l,onEdgeMouseLeave:c,onEdgeClick:d,reconnectRadius:h,onEdgeDoubleClick:u,onReconnectStart:f,onReconnectEnd:g,disableKeyboardA11y:p}){const{edgesFocusable:m,edgesReconnectable:b,elementsSelectable:v,onError:w}=Mi(XTe,as),C=PTe(e);return y.jsxs("div",{className:"react-flow__edges",children:[y.jsx(HTe,{defaultColor:n,rfId:t}),C.map(S=>y.jsx(ZTe,{id:S,edgesFocusable:m,edgesReconnectable:b,elementsSelectable:v,noPanClassName:s,onReconnect:o,onContextMenu:r,onMouseEnter:a,onMouseMove:l,onMouseLeave:c,onClick:d,reconnectRadius:h,onDoubleClick:u,onReconnectStart:f,onReconnectEnd:g,rfId:t,onError:w,edgeTypes:i,disableKeyboardA11y:p},S))]})}Afe.displayName="EdgeRenderer";const QTe=$.memo(Afe),JTe=n=>`translate(${n.transform[0]}px,${n.transform[1]}px) scale(${n.transform[2]})`;function e2e({children:n}){const e=Mi(JTe);return y.jsx("div",{className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:e},children:n})}function t2e(n){const e=_G(),t=$.useRef(!1);$.useEffect(()=>{!t.current&&e.viewportInitialized&&n&&(setTimeout(()=>n(e),1),t.current=!0)},[n,e.viewportInitialized])}const i2e=n=>{var e;return(e=n.panZoom)==null?void 0:e.syncViewport};function n2e(n){const e=Mi(i2e),t=ds();return $.useEffect(()=>{n&&(e==null||e(n),t.setState({transform:[n.x,n.y,n.zoom]}))},[n,e]),null}function s2e(n){return n.connection.inProgress?{...n.connection,to:eD(n.connection.to,n.transform)}:{...n.connection}}function o2e(n){return s2e}function r2e(n){const e=o2e();return Mi(e,as)}const a2e=n=>({nodesConnectable:n.nodesConnectable,isValid:n.connection.isValid,inProgress:n.connection.inProgress,width:n.width,height:n.height});function l2e({containerStyle:n,style:e,type:t,component:i}){const{nodesConnectable:s,width:o,height:r,isValid:a,inProgress:l}=Mi(a2e,as);return!(o&&s&&l)?null:y.jsx("svg",{style:n,width:o,height:r,className:"react-flow__connectionline react-flow__container",children:y.jsx("g",{className:uo(["react-flow__connection",Nue(a)]),children:y.jsx(Pfe,{style:e,type:t,CustomComponent:i,isValid:a})})})}const Pfe=({style:n,type:e=Nf.Bezier,CustomComponent:t,isValid:i})=>{const{inProgress:s,from:o,fromNode:r,fromHandle:a,fromPosition:l,to:c,toNode:d,toHandle:h,toPosition:u,pointer:f}=r2e();if(!s)return;if(t)return y.jsx(t,{connectionLineType:e,connectionLineStyle:n,fromNode:r,fromHandle:a,fromX:o.x,fromY:o.y,toX:c.x,toY:c.y,fromPosition:l,toPosition:u,connectionStatus:Nue(i),toNode:d,toHandle:h,pointer:f});let g="";const p={sourceX:o.x,sourceY:o.y,sourcePosition:l,targetX:c.x,targetY:c.y,targetPosition:u};switch(e){case Nf.Bezier:[g]=Vue(p);break;case Nf.SimpleBezier:[g]=yfe(p);break;case Nf.Step:[g]=zB({...p,borderRadius:0});break;case Nf.SmoothStep:[g]=zB(p);break;default:[g]=jue(p)}return y.jsx("path",{d:g,fill:"none",className:"react-flow__connection-path",style:n})};Pfe.displayName="ConnectionLine";const c2e={};function bte(n=c2e){$.useRef(n),ds(),$.useEffect(()=>{},[n])}function d2e(){ds(),$.useRef(!1),$.useEffect(()=>{},[])}function Ofe({nodeTypes:n,edgeTypes:e,onInit:t,onNodeClick:i,onEdgeClick:s,onNodeDoubleClick:o,onEdgeDoubleClick:r,onNodeMouseEnter:a,onNodeMouseMove:l,onNodeMouseLeave:c,onNodeContextMenu:d,onSelectionContextMenu:h,onSelectionStart:u,onSelectionEnd:f,connectionLineType:g,connectionLineStyle:p,connectionLineComponent:m,connectionLineContainerStyle:b,selectionKeyCode:v,selectionOnDrag:w,selectionMode:C,multiSelectionKeyCode:S,panActivationKeyCode:L,zoomActivationKeyCode:x,deleteKeyCode:E,onlyRenderVisibleElements:I,elementsSelectable:R,defaultViewport:M,translateExtent:A,minZoom:W,maxZoom:P,preventScrolling:B,defaultMarkerColor:V,zoomOnScroll:K,zoomOnPinch:z,panOnScroll:j,panOnScrollSpeed:Q,panOnScrollMode:Y,zoomOnDoubleClick:te,panOnDrag:ce,onPaneClick:Ce,onPaneMouseEnter:xe,onPaneMouseMove:je,onPaneMouseLeave:ke,onPaneScroll:Le,onPaneContextMenu:Ve,paneClickDistance:ct,nodeClickDistance:dt,onEdgeContextMenu:Be,onEdgeMouseEnter:tt,onEdgeMouseMove:Tt,onEdgeMouseLeave:Si,reconnectRadius:Vt,onReconnect:In,onReconnectStart:Nn,onReconnectEnd:Os,noDragClassName:Da,noWheelClassName:Mo,noPanClassName:_l,disableKeyboardA11y:Ta,nodeExtent:xr,rfId:go,viewport:ei,onViewportChange:gn}){return bte(n),bte(e),d2e(),t2e(t),n2e(ei),y.jsx(LTe,{onPaneClick:Ce,onPaneMouseEnter:xe,onPaneMouseMove:je,onPaneMouseLeave:ke,onPaneContextMenu:Ve,onPaneScroll:Le,paneClickDistance:ct,deleteKeyCode:E,selectionKeyCode:v,selectionOnDrag:w,selectionMode:C,onSelectionStart:u,onSelectionEnd:f,multiSelectionKeyCode:S,panActivationKeyCode:L,zoomActivationKeyCode:x,elementsSelectable:R,zoomOnScroll:K,zoomOnPinch:z,zoomOnDoubleClick:te,panOnScroll:j,panOnScrollSpeed:Q,panOnScrollMode:Y,panOnDrag:ce,defaultViewport:M,translateExtent:A,minZoom:W,maxZoom:P,onSelectionContextMenu:h,preventScrolling:B,noDragClassName:Da,noWheelClassName:Mo,noPanClassName:_l,disableKeyboardA11y:Ta,onViewportChange:gn,isControlledViewport:!!ei,children:y.jsxs(e2e,{children:[y.jsx(QTe,{edgeTypes:e,onEdgeClick:s,onEdgeDoubleClick:r,onReconnect:In,onReconnectStart:Nn,onReconnectEnd:Os,onlyRenderVisibleElements:I,onEdgeContextMenu:Be,onEdgeMouseEnter:tt,onEdgeMouseMove:Tt,onEdgeMouseLeave:Si,reconnectRadius:Vt,defaultMarkerColor:V,noPanClassName:_l,disableKeyboardA11y:Ta,rfId:go}),y.jsx(l2e,{style:p,type:g,component:m,containerStyle:b}),y.jsx("div",{className:"react-flow__edgelabel-renderer"}),y.jsx(ATe,{nodeTypes:n,onNodeClick:i,onNodeDoubleClick:o,onNodeMouseEnter:a,onNodeMouseMove:l,onNodeMouseLeave:c,onNodeContextMenu:d,nodeClickDistance:dt,onlyRenderVisibleElements:I,noPanClassName:_l,noDragClassName:Da,disableKeyboardA11y:Ta,nodeExtent:xr,rfId:go}),y.jsx("div",{className:"react-flow__viewport-portal"})]})})}Ofe.displayName="GraphView";const h2e=$.memo(Ofe),vte=({nodes:n,edges:e,defaultNodes:t,defaultEdges:i,width:s,height:o,fitView:r,fitViewOptions:a,minZoom:l=.5,maxZoom:c=2,nodeOrigin:d,nodeExtent:h,zIndexMode:u="basic"}={})=>{const f=new Map,g=new Map,p=new Map,m=new Map,b=i??e??[],v=t??n??[],w=d??[0,0],C=h??$E;que(p,m,b);const S=$B(v,f,g,{nodeOrigin:w,nodeExtent:C,zIndexMode:u});let L=[0,0,1];if(r&&s&&o){const x=QN(f,{filter:M=>!!((M.width||M.initialWidth)&&(M.height||M.initialHeight))}),{x:E,y:I,zoom:R}=dG(x,s,o,l,c,(a==null?void 0:a.padding)??.1);L=[E,I,R]}return{rfId:"1",width:s??0,height:o??0,transform:L,nodes:v,nodesInitialized:S,nodeLookup:f,parentLookup:g,edges:b,edgeLookup:m,connectionLookup:p,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:t!==void 0,hasDefaultEdges:i!==void 0,panZoom:null,minZoom:l,maxZoom:c,translateExtent:$E,nodeExtent:C,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:Xy.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:w,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:r??!1,fitViewOptions:a,fitViewResolver:null,connection:{...Iue},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:uNe,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:Eue,zIndexMode:u,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},u2e=({nodes:n,edges:e,defaultNodes:t,defaultEdges:i,width:s,height:o,fitView:r,fitViewOptions:a,minZoom:l,maxZoom:c,nodeOrigin:d,nodeExtent:h,zIndexMode:u})=>DDe((f,g)=>{async function p(){const{nodeLookup:m,panZoom:b,fitViewOptions:v,fitViewResolver:w,width:C,height:S,minZoom:L,maxZoom:x}=g();b&&(await dNe({nodes:m,width:C,height:S,panZoom:b,minZoom:L,maxZoom:x},v),w==null||w.resolve(!0),f({fitViewResolver:null}))}return{...vte({nodes:n,edges:e,width:s,height:o,fitView:r,fitViewOptions:a,minZoom:l,maxZoom:c,nodeOrigin:d,nodeExtent:h,defaultNodes:t,defaultEdges:i,zIndexMode:u}),setNodes:m=>{const{nodeLookup:b,parentLookup:v,nodeOrigin:w,elevateNodesOnSelect:C,fitViewQueued:S,zIndexMode:L}=g(),x=$B(m,b,v,{nodeOrigin:w,nodeExtent:h,elevateNodesOnSelect:C,checkEquality:!0,zIndexMode:L});S&&x?(p(),f({nodes:m,nodesInitialized:x,fitViewQueued:!1,fitViewOptions:void 0})):f({nodes:m,nodesInitialized:x})},setEdges:m=>{const{connectionLookup:b,edgeLookup:v}=g();que(b,v,m),f({edges:m})},setDefaultNodesAndEdges:(m,b)=>{if(m){const{setNodes:v}=g();v(m),f({hasDefaultNodes:!0})}if(b){const{setEdges:v}=g();v(b),f({hasDefaultEdges:!0})}},updateNodeInternals:m=>{const{triggerNodeChanges:b,nodeLookup:v,parentLookup:w,domNode:C,nodeOrigin:S,nodeExtent:L,debug:x,fitViewQueued:E,zIndexMode:I}=g(),{changes:R,updatedInternals:M}=ANe(m,v,w,C,S,L,I);M&&(DNe(v,w,{nodeOrigin:S,nodeExtent:L,zIndexMode:I}),E?(p(),f({fitViewQueued:!1,fitViewOptions:void 0})):f({}),(R==null?void 0:R.length)>0&&(x&&console.log("React Flow: trigger node changes",R),b==null||b(R)))},updateNodePositions:(m,b=!1)=>{const v=[];let w=[];const{nodeLookup:C,triggerNodeChanges:S,connection:L,updateConnection:x,onNodesChangeMiddlewareMap:E}=g();for(const[I,R]of m){const M=C.get(I),A=!!(M!=null&&M.expandParent&&(M!=null&&M.parentId)&&(R!=null&&R.position)),W={id:I,type:"position",position:A?{x:Math.max(0,R.position.x),y:Math.max(0,R.position.y)}:R.position,dragging:b};if(M&&L.inProgress&&L.fromNode.id===M.id){const P=K1(M,L.fromHandle,It.Left,!0);x({...L,from:P})}A&&M.parentId&&v.push({id:I,parentId:M.parentId,rect:{...R.internals.positionAbsolute,width:R.measured.width??0,height:R.measured.height??0}}),w.push(W)}if(v.length>0){const{parentLookup:I,nodeOrigin:R}=g(),M=mG(v,C,I,R);w.push(...M)}for(const I of E.values())w=I(w);S(w)},triggerNodeChanges:m=>{const{onNodesChange:b,setNodes:v,nodes:w,hasDefaultNodes:C,debug:S}=g();if(m!=null&&m.length){if(C){const L=hfe(m,w);v(L)}S&&console.log("React Flow: trigger node changes",m),b==null||b(m)}},triggerEdgeChanges:m=>{const{onEdgesChange:b,setEdges:v,edges:w,hasDefaultEdges:C,debug:S}=g();if(m!=null&&m.length){if(C){const L=ufe(m,w);v(L)}S&&console.log("React Flow: trigger edge changes",m),b==null||b(m)}},addSelectedNodes:m=>{const{multiSelectionActive:b,edgeLookup:v,nodeLookup:w,triggerNodeChanges:C,triggerEdgeChanges:S}=g();if(b){const L=m.map(x=>lb(x,!0));C(L);return}C(n0(w,new Set([...m]),!0)),S(n0(v))},addSelectedEdges:m=>{const{multiSelectionActive:b,edgeLookup:v,nodeLookup:w,triggerNodeChanges:C,triggerEdgeChanges:S}=g();if(b){const L=m.map(x=>lb(x,!0));S(L);return}S(n0(v,new Set([...m]))),C(n0(w,new Set,!0))},unselectNodesAndEdges:({nodes:m,edges:b}={})=>{const{edges:v,nodes:w,nodeLookup:C,triggerNodeChanges:S,triggerEdgeChanges:L}=g(),x=m||w,E=b||v,I=[];for(const M of x){if(!M.selected)continue;const A=C.get(M.id);A&&(A.selected=!1),I.push(lb(M.id,!1))}const R=[];for(const M of E)M.selected&&R.push(lb(M.id,!1));S(I),L(R)},setMinZoom:m=>{const{panZoom:b,maxZoom:v}=g();b==null||b.setScaleExtent([m,v]),f({minZoom:m})},setMaxZoom:m=>{const{panZoom:b,minZoom:v}=g();b==null||b.setScaleExtent([v,m]),f({maxZoom:m})},setTranslateExtent:m=>{var b;(b=g().panZoom)==null||b.setTranslateExtent(m),f({translateExtent:m})},resetSelectedElements:()=>{const{edges:m,nodes:b,triggerNodeChanges:v,triggerEdgeChanges:w,elementsSelectable:C}=g();if(!C)return;const S=b.reduce((x,E)=>E.selected?[...x,lb(E.id,!1)]:x,[]),L=m.reduce((x,E)=>E.selected?[...x,lb(E.id,!1)]:x,[]);v(S),w(L)},setNodeExtent:m=>{const{nodes:b,nodeLookup:v,parentLookup:w,nodeOrigin:C,elevateNodesOnSelect:S,nodeExtent:L,zIndexMode:x}=g();m[0][0]===L[0][0]&&m[0][1]===L[0][1]&&m[1][0]===L[1][0]&&m[1][1]===L[1][1]||($B(b,v,w,{nodeOrigin:C,nodeExtent:m,elevateNodesOnSelect:S,checkEquality:!1,zIndexMode:x}),f({nodeExtent:m}))},panBy:m=>{const{transform:b,width:v,height:w,panZoom:C,translateExtent:S}=g();return PNe({delta:m,panZoom:C,transform:b,translateExtent:S,width:v,height:w})},setCenter:async(m,b,v)=>{const{width:w,height:C,maxZoom:S,panZoom:L}=g();if(!L)return Promise.resolve(!1);const x=typeof(v==null?void 0:v.zoom)<"u"?v.zoom:S;return await L.setViewport({x:w/2-m*x,y:C/2-b*x,zoom:x},{duration:v==null?void 0:v.duration,ease:v==null?void 0:v.ease,interpolate:v==null?void 0:v.interpolate}),Promise.resolve(!0)},cancelConnection:()=>{f({connection:{...Iue}})},updateConnection:m=>{f({connection:m})},reset:()=>f({...vte()})}},Object.is);function f2e({initialNodes:n,initialEdges:e,defaultNodes:t,defaultEdges:i,initialWidth:s,initialHeight:o,initialMinZoom:r,initialMaxZoom:a,initialFitViewOptions:l,fitView:c,nodeOrigin:d,nodeExtent:h,zIndexMode:u,children:f}){const[g]=$.useState(()=>u2e({nodes:n,edges:e,defaultNodes:t,defaultEdges:i,width:s,height:o,fitView:c,minZoom:r,maxZoom:a,fitViewOptions:l,nodeOrigin:d,nodeExtent:h,zIndexMode:u}));return y.jsx(TDe,{value:g,children:y.jsx(eTe,{children:f})})}function g2e({children:n,nodes:e,edges:t,defaultNodes:i,defaultEdges:s,width:o,height:r,fitView:a,fitViewOptions:l,minZoom:c,maxZoom:d,nodeOrigin:h,nodeExtent:u,zIndexMode:f}){return $.useContext(x5)?y.jsx(y.Fragment,{children:n}):y.jsx(f2e,{initialNodes:e,initialEdges:t,defaultNodes:i,defaultEdges:s,initialWidth:o,initialHeight:r,fitView:a,initialFitViewOptions:l,initialMinZoom:c,initialMaxZoom:d,nodeOrigin:h,nodeExtent:u,zIndexMode:f,children:n})}const p2e={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function m2e({nodes:n,edges:e,defaultNodes:t,defaultEdges:i,className:s,nodeTypes:o,edgeTypes:r,onNodeClick:a,onEdgeClick:l,onInit:c,onMove:d,onMoveStart:h,onMoveEnd:u,onConnect:f,onConnectStart:g,onConnectEnd:p,onClickConnectStart:m,onClickConnectEnd:b,onNodeMouseEnter:v,onNodeMouseMove:w,onNodeMouseLeave:C,onNodeContextMenu:S,onNodeDoubleClick:L,onNodeDragStart:x,onNodeDrag:E,onNodeDragStop:I,onNodesDelete:R,onEdgesDelete:M,onDelete:A,onSelectionChange:W,onSelectionDragStart:P,onSelectionDrag:B,onSelectionDragStop:V,onSelectionContextMenu:K,onSelectionStart:z,onSelectionEnd:j,onBeforeDelete:Q,connectionMode:Y,connectionLineType:te=Nf.Bezier,connectionLineStyle:ce,connectionLineComponent:Ce,connectionLineContainerStyle:xe,deleteKeyCode:je="Backspace",selectionKeyCode:ke="Shift",selectionOnDrag:Le=!1,selectionMode:Ve=UE.Full,panActivationKeyCode:ct="Space",multiSelectionKeyCode:dt=KE()?"Meta":"Control",zoomActivationKeyCode:Be=KE()?"Meta":"Control",snapToGrid:tt,snapGrid:Tt,onlyRenderVisibleElements:Si=!1,selectNodesOnDrag:Vt,nodesDraggable:In,autoPanOnNodeFocus:Nn,nodesConnectable:Os,nodesFocusable:Da,nodeOrigin:Mo=cfe,edgesFocusable:_l,edgesReconnectable:Ta,elementsSelectable:xr=!0,defaultViewport:go=$De,minZoom:ei=.5,maxZoom:gn=2,translateExtent:bl=$E,preventScrolling:Lr=!0,nodeExtent:td,defaultMarkerColor:vl="#b1b1b7",zoomOnScroll:ch=!0,zoomOnPinch:Ks=!0,panOnScroll:hs=!1,panOnScrollSpeed:qn=.5,panOnScrollMode:kr=xv.Free,zoomOnDoubleClick:tn=!0,panOnDrag:us=!0,onPaneClick:Xr,onPaneMouseEnter:Dn,onPaneMouseMove:Yg,onPaneMouseLeave:_c,onPaneScroll:X,onPaneContextMenu:wl,paneClickDistance:Cn=1,nodeClickDistance:Ii=0,children:Qr,onReconnect:Qe,onReconnectStart:dh,onReconnectEnd:fi,onEdgeContextMenu:gi,onEdgeDoubleClick:Ra,onEdgeMouseEnter:Jo,onEdgeMouseMove:po,onEdgeMouseLeave:er,reconnectRadius:id=10,onNodesChange:Tn,onEdgesChange:Er,noDragClassName:mo="nodrag",noWheelClassName:Wu="nowheel",noPanClassName:Hn="nopan",fitView:nd,fitViewOptions:hh,connectOnClick:Zg,attributionPosition:Ct,proOptions:ae,defaultEdgeOptions:Ee,elevateNodesOnSelect:rt=!0,elevateEdgesOnSelect:Et=!1,disableKeyboardA11y:Rn=!1,autoPanOnConnect:li,autoPanOnNodeDrag:Ls,autoPanSpeed:ks,connectionRadius:Ir,isValidConnection:Hu,onError:Qn,style:Vu,id:uh,nodeDragThreshold:I_,connectionDragThreshold:vx,viewport:wx,onViewportChange:Cl,width:Qw,height:Xg,colorMode:fh="light",debug:N_,onScroll:Qg,ariaLabelConfig:zu,zIndexMode:Jw="basic",...eC},D_){const T_=uh||"1",tC=GDe(fh),gh=$.useCallback(sd=>{sd.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),Qg==null||Qg(sd)},[Qg]);return y.jsx("div",{"data-testid":"rf__wrapper",...eC,onScroll:gh,style:{...Vu,...p2e},ref:D_,className:uo(["react-flow",s,tC]),id:uh,role:"application",children:y.jsxs(g2e,{nodes:n,edges:e,width:Qw,height:Xg,fitView:nd,fitViewOptions:hh,minZoom:ei,maxZoom:gn,nodeOrigin:Mo,nodeExtent:td,zIndexMode:Jw,children:[y.jsx(h2e,{onInit:c,onNodeClick:a,onEdgeClick:l,onNodeMouseEnter:v,onNodeMouseMove:w,onNodeMouseLeave:C,onNodeContextMenu:S,onNodeDoubleClick:L,nodeTypes:o,edgeTypes:r,connectionLineType:te,connectionLineStyle:ce,connectionLineComponent:Ce,connectionLineContainerStyle:xe,selectionKeyCode:ke,selectionOnDrag:Le,selectionMode:Ve,deleteKeyCode:je,multiSelectionKeyCode:dt,panActivationKeyCode:ct,zoomActivationKeyCode:Be,onlyRenderVisibleElements:Si,defaultViewport:go,translateExtent:bl,minZoom:ei,maxZoom:gn,preventScrolling:Lr,zoomOnScroll:ch,zoomOnPinch:Ks,zoomOnDoubleClick:tn,panOnScroll:hs,panOnScrollSpeed:qn,panOnScrollMode:kr,panOnDrag:us,onPaneClick:Xr,onPaneMouseEnter:Dn,onPaneMouseMove:Yg,onPaneMouseLeave:_c,onPaneScroll:X,onPaneContextMenu:wl,paneClickDistance:Cn,nodeClickDistance:Ii,onSelectionContextMenu:K,onSelectionStart:z,onSelectionEnd:j,onReconnect:Qe,onReconnectStart:dh,onReconnectEnd:fi,onEdgeContextMenu:gi,onEdgeDoubleClick:Ra,onEdgeMouseEnter:Jo,onEdgeMouseMove:po,onEdgeMouseLeave:er,reconnectRadius:id,defaultMarkerColor:vl,noDragClassName:mo,noWheelClassName:Wu,noPanClassName:Hn,rfId:T_,disableKeyboardA11y:Rn,nodeExtent:td,viewport:wx,onViewportChange:Cl}),y.jsx(KDe,{nodes:n,edges:e,defaultNodes:t,defaultEdges:i,onConnect:f,onConnectStart:g,onConnectEnd:p,onClickConnectStart:m,onClickConnectEnd:b,nodesDraggable:In,autoPanOnNodeFocus:Nn,nodesConnectable:Os,nodesFocusable:Da,edgesFocusable:_l,edgesReconnectable:Ta,elementsSelectable:xr,elevateNodesOnSelect:rt,elevateEdgesOnSelect:Et,minZoom:ei,maxZoom:gn,nodeExtent:td,onNodesChange:Tn,onEdgesChange:Er,snapToGrid:tt,snapGrid:Tt,connectionMode:Y,translateExtent:bl,connectOnClick:Zg,defaultEdgeOptions:Ee,fitView:nd,fitViewOptions:hh,onNodesDelete:R,onEdgesDelete:M,onDelete:A,onNodeDragStart:x,onNodeDrag:E,onNodeDragStop:I,onSelectionDrag:B,onSelectionDragStart:P,onSelectionDragStop:V,onMove:d,onMoveStart:h,onMoveEnd:u,noPanClassName:Hn,nodeOrigin:Mo,rfId:T_,autoPanOnConnect:li,autoPanOnNodeDrag:Ls,autoPanSpeed:ks,onError:Qn,connectionRadius:Ir,isValidConnection:Hu,selectNodesOnDrag:Vt,nodeDragThreshold:I_,connectionDragThreshold:vx,onBeforeDelete:Q,debug:N_,ariaLabelConfig:zu,zIndexMode:Jw}),y.jsx(jDe,{onSelectionChange:W}),Qr,y.jsx(BDe,{proOptions:ae,position:Ct}),y.jsx(FDe,{rfId:T_,disableKeyboardA11y:Rn})]})})}var _2e=ffe(m2e);function b2e({dimensions:n,lineWidth:e,variant:t,className:i}){return y.jsx("path",{strokeWidth:e,d:`M${n[0]/2} 0 V${n[1]} M0 ${n[1]/2} H${n[0]}`,className:uo(["react-flow__background-pattern",t,i])})}function v2e({radius:n,className:e}){return y.jsx("circle",{cx:n,cy:n,r:n,className:uo(["react-flow__background-pattern","dots",e])})}var ig;(function(n){n.Lines="lines",n.Dots="dots",n.Cross="cross"})(ig||(ig={}));const w2e={[ig.Dots]:1,[ig.Lines]:1,[ig.Cross]:6},C2e=n=>({transform:n.transform,patternId:`pattern-${n.rfId}`});function Ffe({id:n,variant:e=ig.Dots,gap:t=20,size:i,lineWidth:s=1,offset:o=0,color:r,bgColor:a,style:l,className:c,patternClassName:d}){const h=$.useRef(null),{transform:u,patternId:f}=Mi(C2e,as),g=i||w2e[e],p=e===ig.Dots,m=e===ig.Cross,b=Array.isArray(t)?t:[t,t],v=[b[0]*u[2]||1,b[1]*u[2]||1],w=g*u[2],C=Array.isArray(o)?o:[o,o],S=m?[w,w]:v,L=[C[0]*u[2]||1+S[0]/2,C[1]*u[2]||1+S[1]/2],x=`${f}${n||""}`;return y.jsxs("svg",{className:uo(["react-flow__background",c]),style:{...l,...k5,"--xy-background-color-props":a,"--xy-background-pattern-color-props":r},ref:h,"data-testid":"rf__background",children:[y.jsx("pattern",{id:x,x:u[0]%v[0],y:u[1]%v[1],width:v[0],height:v[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${L[0]},-${L[1]})`,children:p?y.jsx(v2e,{radius:w/2,className:d}):y.jsx(b2e,{dimensions:S,lineWidth:s,variant:e,className:d})}),y.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${x})`})]})}Ffe.displayName="Background";const y2e=$.memo(Ffe);function S2e(){return y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:y.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function x2e(){return y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:y.jsx("path",{d:"M0 0h32v4.2H0z"})})}function L2e(){return y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:y.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function k2e(){return y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:y.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function E2e(){return y.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:y.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function LT({children:n,className:e,...t}){return y.jsx("button",{type:"button",className:uo(["react-flow__controls-button",e]),...t,children:n})}const I2e=n=>({isInteractive:n.nodesDraggable||n.nodesConnectable||n.elementsSelectable,minZoomReached:n.transform[2]<=n.minZoom,maxZoomReached:n.transform[2]>=n.maxZoom,ariaLabelConfig:n.ariaLabelConfig});function Bfe({style:n,showZoom:e=!0,showFitView:t=!0,showInteractive:i=!0,fitViewOptions:s,onZoomIn:o,onZoomOut:r,onFitView:a,onInteractiveChange:l,className:c,children:d,position:h="bottom-left",orientation:u="vertical","aria-label":f}){const g=ds(),{isInteractive:p,minZoomReached:m,maxZoomReached:b,ariaLabelConfig:v}=Mi(I2e,as),{zoomIn:w,zoomOut:C,fitView:S}=_G(),L=()=>{w(),o==null||o()},x=()=>{C(),r==null||r()},E=()=>{S(s),a==null||a()},I=()=>{g.setState({nodesDraggable:!p,nodesConnectable:!p,elementsSelectable:!p}),l==null||l(!p)},R=u==="horizontal"?"horizontal":"vertical";return y.jsxs(L5,{className:uo(["react-flow__controls",R,c]),position:h,style:n,"data-testid":"rf__controls","aria-label":f??v["controls.ariaLabel"],children:[e&&y.jsxs(y.Fragment,{children:[y.jsx(LT,{onClick:L,className:"react-flow__controls-zoomin",title:v["controls.zoomIn.ariaLabel"],"aria-label":v["controls.zoomIn.ariaLabel"],disabled:b,children:y.jsx(S2e,{})}),y.jsx(LT,{onClick:x,className:"react-flow__controls-zoomout",title:v["controls.zoomOut.ariaLabel"],"aria-label":v["controls.zoomOut.ariaLabel"],disabled:m,children:y.jsx(x2e,{})})]}),t&&y.jsx(LT,{className:"react-flow__controls-fitview",onClick:E,title:v["controls.fitView.ariaLabel"],"aria-label":v["controls.fitView.ariaLabel"],children:y.jsx(L2e,{})}),i&&y.jsx(LT,{className:"react-flow__controls-interactive",onClick:I,title:v["controls.interactive.ariaLabel"],"aria-label":v["controls.interactive.ariaLabel"],children:p?y.jsx(E2e,{}):y.jsx(k2e,{})}),d]})}Bfe.displayName="Controls";const N2e=$.memo(Bfe);function D2e({id:n,x:e,y:t,width:i,height:s,style:o,color:r,strokeColor:a,strokeWidth:l,className:c,borderRadius:d,shapeRendering:h,selected:u,onClick:f}){const{background:g,backgroundColor:p}=o||{},m=r||g||p;return y.jsx("rect",{className:uo(["react-flow__minimap-node",{selected:u},c]),x:e,y:t,rx:d,ry:d,width:i,height:s,style:{fill:m,stroke:a,strokeWidth:l},shapeRendering:h,onClick:f?b=>f(b,n):void 0})}const T2e=$.memo(D2e),R2e=n=>n.nodes.map(e=>e.id),s7=n=>n instanceof Function?n:()=>n;function M2e({nodeStrokeColor:n,nodeColor:e,nodeClassName:t="",nodeBorderRadius:i=5,nodeStrokeWidth:s,nodeComponent:o=T2e,onClick:r}){const a=Mi(R2e,as),l=s7(e),c=s7(n),d=s7(t),h=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return y.jsx(y.Fragment,{children:a.map(u=>y.jsx(P2e,{id:u,nodeColorFunc:l,nodeStrokeColorFunc:c,nodeClassNameFunc:d,nodeBorderRadius:i,nodeStrokeWidth:s,NodeComponent:o,onClick:r,shapeRendering:h},u))})}function A2e({id:n,nodeColorFunc:e,nodeStrokeColorFunc:t,nodeClassNameFunc:i,nodeBorderRadius:s,nodeStrokeWidth:o,shapeRendering:r,NodeComponent:a,onClick:l}){const{node:c,x:d,y:h,width:u,height:f}=Mi(g=>{const p=g.nodeLookup.get(n);if(!p)return{node:void 0,x:0,y:0,width:0,height:0};const m=p.internals.userNode,{x:b,y:v}=p.internals.positionAbsolute,{width:w,height:C}=Wg(m);return{node:m,x:b,y:v,width:w,height:C}},as);return!c||c.hidden||!Pue(c)?null:y.jsx(a,{x:d,y:h,width:u,height:f,style:c.style,selected:!!c.selected,className:i(c),color:e(c),borderRadius:s,strokeColor:t(c),strokeWidth:o,shapeRendering:r,onClick:l,id:c.id})}const P2e=$.memo(A2e);var O2e=$.memo(M2e);const F2e=200,B2e=150,W2e=n=>!n.hidden,H2e=n=>{const e={x:-n.transform[0]/n.transform[2],y:-n.transform[1]/n.transform[2],width:n.width/n.transform[2],height:n.height/n.transform[2]};return{viewBB:e,boundingRect:n.nodeLookup.size>0?Aue(QN(n.nodeLookup,{filter:W2e}),e):e,rfId:n.rfId,panZoom:n.panZoom,translateExtent:n.translateExtent,flowWidth:n.width,flowHeight:n.height,ariaLabelConfig:n.ariaLabelConfig}},V2e="react-flow__minimap-desc";function Wfe({style:n,className:e,nodeStrokeColor:t,nodeColor:i,nodeClassName:s="",nodeBorderRadius:o=5,nodeStrokeWidth:r,nodeComponent:a,bgColor:l,maskColor:c,maskStrokeColor:d,maskStrokeWidth:h,position:u="bottom-right",onClick:f,onNodeClick:g,pannable:p=!1,zoomable:m=!1,ariaLabel:b,inversePan:v,zoomStep:w=1,offsetScale:C=5}){const S=ds(),L=$.useRef(null),{boundingRect:x,viewBB:E,rfId:I,panZoom:R,translateExtent:M,flowWidth:A,flowHeight:W,ariaLabelConfig:P}=Mi(H2e,as),B=(n==null?void 0:n.width)??F2e,V=(n==null?void 0:n.height)??B2e,K=x.width/B,z=x.height/V,j=Math.max(K,z),Q=j*B,Y=j*V,te=C*j,ce=x.x-(Q-x.width)/2-te,Ce=x.y-(Y-x.height)/2-te,xe=Q+te*2,je=Y+te*2,ke=`${V2e}-${I}`,Le=$.useRef(0),Ve=$.useRef();Le.current=j,$.useEffect(()=>{if(L.current&&R)return Ve.current=$Ne({domNode:L.current,panZoom:R,getTransform:()=>S.getState().transform,getViewScale:()=>Le.current}),()=>{var tt;(tt=Ve.current)==null||tt.destroy()}},[R]),$.useEffect(()=>{var tt;(tt=Ve.current)==null||tt.update({translateExtent:M,width:A,height:W,inversePan:v,pannable:p,zoomStep:w,zoomable:m})},[p,m,v,w,M,A,W]);const ct=f?tt=>{var Vt;const[Tt,Si]=((Vt=Ve.current)==null?void 0:Vt.pointer(tt))||[0,0];f(tt,{x:Tt,y:Si})}:void 0,dt=g?$.useCallback((tt,Tt)=>{const Si=S.getState().nodeLookup.get(Tt).internals.userNode;g(tt,Si)},[]):void 0,Be=b??P["minimap.ariaLabel"];return y.jsx(L5,{position:u,style:{...n,"--xy-minimap-background-color-props":typeof l=="string"?l:void 0,"--xy-minimap-mask-background-color-props":typeof c=="string"?c:void 0,"--xy-minimap-mask-stroke-color-props":typeof d=="string"?d:void 0,"--xy-minimap-mask-stroke-width-props":typeof h=="number"?h*j:void 0,"--xy-minimap-node-background-color-props":typeof i=="string"?i:void 0,"--xy-minimap-node-stroke-color-props":typeof t=="string"?t:void 0,"--xy-minimap-node-stroke-width-props":typeof r=="number"?r:void 0},className:uo(["react-flow__minimap",e]),"data-testid":"rf__minimap",children:y.jsxs("svg",{width:B,height:V,viewBox:`${ce} ${Ce} ${xe} ${je}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":ke,ref:L,onClick:ct,children:[Be&&y.jsx("title",{id:ke,children:Be}),y.jsx(O2e,{onClick:dt,nodeColor:i,nodeStrokeColor:t,nodeBorderRadius:o,nodeClassName:s,nodeStrokeWidth:r,nodeComponent:a}),y.jsx("path",{className:"react-flow__minimap-mask",d:`M${ce-te},${Ce-te}h${xe+te*2}v${je+te*2}h${-xe-te*2}z - M${E.x},${E.y}h${E.width}v${E.height}h${-E.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}Wfe.displayName="MiniMap";const z2e=$.memo(Wfe),j2e=n=>e=>n?`${Math.max(1/e.transform[2],1)}`:void 0,$2e={[tS.Line]:"right",[tS.Handle]:"bottom-right"};function U2e({nodeId:n,position:e,variant:t=tS.Handle,className:i,style:s=void 0,children:o,color:r,minWidth:a=10,minHeight:l=10,maxWidth:c=Number.MAX_VALUE,maxHeight:d=Number.MAX_VALUE,keepAspectRatio:h=!1,resizeDirection:u,autoScale:f=!0,shouldResize:g,onResizeStart:p,onResize:m,onResizeEnd:b}){const v=_fe(),w=typeof n=="string"?n:v,C=ds(),S=$.useRef(null),L=t===tS.Handle,x=Mi($.useCallback(j2e(L&&f),[L,f]),as),E=$.useRef(null),I=e??$2e[t];$.useEffect(()=>{if(!(!S.current||!w))return E.current||(E.current=sDe({domNode:S.current,nodeId:w,getStoreItems:()=>{const{nodeLookup:M,transform:A,snapGrid:W,snapToGrid:P,nodeOrigin:B,domNode:V}=C.getState();return{nodeLookup:M,transform:A,snapGrid:W,snapToGrid:P,nodeOrigin:B,paneDomNode:V}},onChange:(M,A)=>{const{triggerNodeChanges:W,nodeLookup:P,parentLookup:B,nodeOrigin:V}=C.getState(),K=[],z={x:M.x,y:M.y},j=P.get(w);if(j&&j.expandParent&&j.parentId){const Q=j.origin??V,Y=M.width??j.measured.width??0,te=M.height??j.measured.height??0,ce={id:j.id,parentId:j.parentId,rect:{width:Y,height:te,...Oue({x:M.x??j.position.x,y:M.y??j.position.y},{width:Y,height:te},j.parentId,P,Q)}},Ce=mG([ce],P,B,V);K.push(...Ce),z.x=M.x?Math.max(Q[0]*Y,M.x):void 0,z.y=M.y?Math.max(Q[1]*te,M.y):void 0}if(z.x!==void 0&&z.y!==void 0){const Q={id:w,type:"position",position:{...z}};K.push(Q)}if(M.width!==void 0&&M.height!==void 0){const Y={id:w,type:"dimensions",resizing:!0,setAttributes:u?u==="horizontal"?"width":"height":!0,dimensions:{width:M.width,height:M.height}};K.push(Y)}for(const Q of A){const Y={...Q,type:"position"};K.push(Y)}W(K)},onEnd:({width:M,height:A})=>{const W={id:w,type:"dimensions",resizing:!1,dimensions:{width:M,height:A}};C.getState().triggerNodeChanges([W])}})),E.current.update({controlPosition:I,boundaries:{minWidth:a,minHeight:l,maxWidth:c,maxHeight:d},keepAspectRatio:h,resizeDirection:u,onResizeStart:p,onResize:m,onResizeEnd:b,shouldResize:g}),()=>{var M;(M=E.current)==null||M.destroy()}},[I,a,l,c,d,h,p,m,b,g]);const R=I.split("-");return y.jsx("div",{className:uo(["react-flow__resize-control","nodrag",...R,t,i]),ref:S,style:{...s,scale:x,...r&&{[L?"backgroundColor":"borderColor"]:r}},children:o})}$.memo(U2e);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const q2e=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),Hfe=(...n)=>n.filter((e,t,i)=>!!e&&i.indexOf(e)===t).join(" ");/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var K2e={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const G2e=$.forwardRef(({color:n="currentColor",size:e=24,strokeWidth:t=2,absoluteStrokeWidth:i,className:s="",children:o,iconNode:r,...a},l)=>$.createElement("svg",{ref:l,...K2e,width:e,height:e,stroke:n,strokeWidth:i?Number(t)*24/Number(e):t,className:Hfe("lucide",s),...a},[...r.map(([c,d])=>$.createElement(c,d)),...Array.isArray(o)?o:[o]]));/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ci=(n,e)=>{const t=$.forwardRef(({className:i,...s},o)=>$.createElement(G2e,{ref:o,iconNode:e,className:Hfe(`lucide-${q2e(n)}`,i),...s}));return t.displayName=`${n}`,t};/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wR=ci("ArrowRightLeft",[["path",{d:"m16 3 4 4-4 4",key:"1x1c3m"}],["path",{d:"M20 7H4",key:"zbl0bi"}],["path",{d:"m8 21-4-4 4-4",key:"h9nckh"}],["path",{d:"M4 17h16",key:"g4d7ey"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const iv=ci("Bot",[["path",{d:"M12 8V4H8",key:"hb8ula"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2",key:"enze0r"}],["path",{d:"M2 14h2",key:"vft8re"}],["path",{d:"M20 14h2",key:"4cs60a"}],["path",{d:"M15 13v2",key:"1xurst"}],["path",{d:"M9 13v2",key:"rq6x2g"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Vfe=ci("Boxes",[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Op=ci("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const LL=ci("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const UM=ci("ChevronLeft",[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Y2e=ci("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Z2e=ci("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const X2e=ci("CircleHelp",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3",key:"1u773s"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const YE=ci("CodeXml",[["path",{d:"m18 16 4-4-4-4",key:"1inbqp"}],["path",{d:"m6 8-4 4 4 4",key:"15zrgr"}],["path",{d:"m14.5 4-5 16",key:"e7oirm"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const CR=ci("Copy",[["rect",{width:"14",height:"14",x:"8",y:"8",rx:"2",ry:"2",key:"17jyea"}],["path",{d:"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",key:"zix9uf"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Q2e=ci("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const wte=ci("FileCode2",[["path",{d:"M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",key:"1pf5j1"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"m5 12-3 3 3 3",key:"oke12k"}],["path",{d:"m9 18 3-3-3-3",key:"112psh"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Wf=ci("FileText",[["path",{d:"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z",key:"1rqfz7"}],["path",{d:"M14 2v4a2 2 0 0 0 2 2h4",key:"tnqrlb"}],["path",{d:"M10 9H8",key:"b1mrlr"}],["path",{d:"M16 13H8",key:"t4e002"}],["path",{d:"M16 17H8",key:"z1uh3a"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const J2e=ci("FolderPlus",[["path",{d:"M12 10v6",key:"1bos4e"}],["path",{d:"M9 13h6",key:"1uhe8q"}],["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const eRe=ci("GitBranch",[["line",{x1:"6",x2:"6",y1:"3",y2:"15",key:"17qcm7"}],["circle",{cx:"18",cy:"6",r:"3",key:"1h7g24"}],["circle",{cx:"6",cy:"18",r:"3",key:"fqmcym"}],["path",{d:"M18 9a9 9 0 0 1-9 9",key:"n2h4wq"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Cte=ci("Globe",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const tRe=ci("LayoutGrid",[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const iRe=ci("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const yte=ci("Maximize2",[["polyline",{points:"15 3 21 3 21 9",key:"mznyad"}],["polyline",{points:"9 21 3 21 3 15",key:"1avn1i"}],["line",{x1:"21",x2:"14",y1:"3",y2:"10",key:"ota7mn"}],["line",{x1:"3",x2:"10",y1:"21",y2:"14",key:"1atl0r"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ste=ci("Moon",[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const nRe=ci("Palette",[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const sRe=ci("Pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const s0=ci("Play",[["polygon",{points:"6 3 20 12 6 21 6 3",key:"1oa8hb"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Sp=ci("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rk=ci("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const zfe=ci("Rows3",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M21 9H3",key:"1338ky"}],["path",{d:"M21 15H3",key:"9uk58r"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const oRe=ci("Save",[["path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z",key:"1c8476"}],["path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7",key:"1ydtos"}],["path",{d:"M7 3v4a1 1 0 0 0 1 1h7",key:"t51u73"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cb=ci("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const rRe=ci("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const ZE=ci("Shield",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const aRe=ci("Square",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const xte=ci("Star",[["polygon",{points:"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2",key:"8f66p6"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Lte=ci("Sun",[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const lRe=ci("Terminal",[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const gp=ci("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kT=ci("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kL=ci("User",[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const kte=ci("Workflow",[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const cRe=ci("Wrench",[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",key:"cbrjhi"}]]);/** - * @license lucide-react v0.400.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const nv=ci("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]),jfe="/api",KB="aevatar:auth-required";function Ete(n){const e=String(n||"").toLowerCase();return e.includes("application/json")||e.includes("+json")}function Ite(n){const e=String(n||"").toLowerCase();return e.includes("text/html")||e.includes("application/xhtml+xml")}function ak(n){typeof window>"u"||window.dispatchEvent(new CustomEvent(KB,{detail:n}))}function dRe(n){if(typeof window>"u")return()=>{};const e=t=>{const i=t.detail||{};n(i)};return window.addEventListener(KB,e),()=>window.removeEventListener(KB,e)}async function Xt(n,e){const t=new Headers(e==null?void 0:e.headers);!(typeof FormData<"u"&&(e==null?void 0:e.body)instanceof FormData)&&!t.has("Content-Type")&&t.set("Content-Type","application/json");const s=await fetch(`${jfe}${n}`,{...e,headers:t}),o=s.headers.get("content-type");if(!s.ok){const a=Ete(o)?await s.json().catch(()=>({})):{message:await s.text().catch(()=>"")};throw(s.status===401||a!=null&&a.loginUrl)&&ak({loginUrl:a==null?void 0:a.loginUrl,message:(a==null?void 0:a.message)||"Sign in to continue."}),{status:s.status,...a}}if(s.status===204)return;if(Ete(o))return s.json();s.redirected&&ak({loginUrl:s.url,message:"Sign in to continue."});const r=await s.text().catch(()=>"");throw(Ite(o)||s.redirected)&&ak({loginUrl:s.redirected?s.url:null,message:"API returned HTML instead of JSON. Sign-in may be required."}),{status:s.redirected?401:s.status,message:Ite(o)?"API returned HTML instead of JSON. Sign-in may be required.":"API returned an unexpected response format.",rawBody:r}}async function Nte(n,e,t,i){const s=await fetch(`${jfe}${n}`,{method:"POST",headers:{Accept:"text/event-stream","Content-Type":"application/json"},body:JSON.stringify(e),signal:i});if(s.redirected&&ak({loginUrl:s.url,message:"Sign in to continue."}),!s.ok){const l=await s.json().catch(()=>({}));throw(s.status===401||l!=null&&l.loginUrl)&&ak({loginUrl:(l==null?void 0:l.loginUrl)||(s.redirected?s.url:null),message:(l==null?void 0:l.message)||"Sign in to continue."}),{status:s.status,...l}}if(!s.body)return;const o=s.body.getReader(),r=new TextDecoder;let a="";for(;;){const{value:l,done:c}=await o.read();a+=r.decode(l||new Uint8Array,{stream:!c});let d=a.indexOf(` - -`);for(;d>=0;){const h=a.slice(0,d);a=a.slice(d+2);const u=h.split(` -`).filter(f=>f.startsWith("data:")).map(f=>f.slice(5).trim()).join(` -`);u&&u!=="[DONE]"&&t(JSON.parse(u)),d=a.indexOf(` - -`)}if(c)break}}function Dte(n){return!n||typeof n!="object"?null:n.type?n:n.textMessageContent?{type:"TEXT_MESSAGE_CONTENT",delta:n.textMessageContent.delta||""}:n.textMessageReasoning?{type:"TEXT_MESSAGE_REASONING",delta:n.textMessageReasoning.delta||""}:n.textMessageEnd?{type:"TEXT_MESSAGE_END",message:n.textMessageEnd.message||"",delta:n.textMessageEnd.delta||""}:n.runError?{type:"RUN_ERROR",message:n.runError.message||"Assistant run failed."}:n}const ap={parseYaml:(n,e)=>Xt("/editor/parse-yaml",{method:"POST",body:JSON.stringify({yaml:n,availableWorkflowNames:e})}),serializeYaml:(n,e)=>Xt("/editor/serialize-yaml",{method:"POST",body:JSON.stringify({document:n,availableWorkflowNames:e})}),validate:(n,e)=>Xt("/editor/validate",{method:"POST",body:JSON.stringify({document:n,availableWorkflowNames:e})}),normalize:(n,e)=>Xt("/editor/normalize",{method:"POST",body:JSON.stringify({document:n,availableWorkflowNames:e})}),diff:(n,e)=>Xt("/editor/diff",{method:"POST",body:JSON.stringify({before:n,after:e})})},lp={getSettings:()=>Xt("/workspace"),updateSettings:n=>Xt("/workspace/settings",{method:"PUT",body:JSON.stringify(n)}),addDirectory:n=>Xt("/workspace/directories",{method:"POST",body:JSON.stringify(n)}),removeDirectory:n=>Xt(`/workspace/directories/${n}`,{method:"DELETE"}),listWorkflows:()=>Xt("/workspace/workflows"),getWorkflow:n=>Xt(`/workspace/workflows/${n}`),saveWorkflow:n=>Xt("/workspace/workflows",{method:"POST",body:JSON.stringify(n)})},cC={getCatalog:()=>Xt("/connectors"),saveCatalog:n=>Xt("/connectors",{method:"PUT",body:JSON.stringify(n)}),importCatalog:n=>{const e=new FormData;return e.set("file",n,n.name),Xt("/connectors/import",{method:"POST",body:e})},getDraft:()=>Xt("/connectors/draft"),saveDraft:n=>Xt("/connectors/draft",{method:"PUT",body:JSON.stringify(n)}),deleteDraft:()=>Xt("/connectors/draft",{method:"DELETE"})},dC={getCatalog:()=>Xt("/roles"),saveCatalog:n=>Xt("/roles",{method:"PUT",body:JSON.stringify(n)}),importCatalog:n=>{const e=new FormData;return e.set("file",n,n.name),Xt("/roles/import",{method:"POST",body:e})},getDraft:()=>Xt("/roles/draft"),saveDraft:n=>Xt("/roles/draft",{method:"PUT",body:JSON.stringify(n)}),deleteDraft:()=>Xt("/roles/draft",{method:"DELETE"})},ET={get:()=>Xt("/settings"),save:n=>Xt("/settings",{method:"PUT",body:JSON.stringify(n)}),testRuntime:n=>Xt("/settings/runtime/test",{method:"POST",body:JSON.stringify(n)})},z_={list:()=>Xt("/executions"),get:n=>Xt(`/executions/${n}`),start:n=>Xt("/executions",{method:"POST",body:JSON.stringify(n)}),resume:(n,e)=>Xt(`/executions/${n}/resume`,{method:"POST",body:JSON.stringify(e)}),stop:(n,e)=>Xt(`/executions/${n}/stop`,{method:"POST",body:JSON.stringify(e)})},$fe={authorWorkflow:async(n,e)=>{let t="",i="";return await Nte("/app/workflow-generator",n,s=>{var r,a,l;const o=Dte(s);if(o){if(o.type==="TEXT_MESSAGE_CONTENT"){t+=o.delta||"",(r=e==null?void 0:e.onText)==null||r.call(e,t);return}if(o.type==="TEXT_MESSAGE_REASONING"){i+=o.delta||"",(a=e==null?void 0:e.onReasoning)==null||a.call(e,i);return}if(o.type==="TEXT_MESSAGE_END"){t=t||o.message||o.delta||"",(l=e==null?void 0:e.onText)==null||l.call(e,t);return}if(o.type==="RUN_ERROR")throw new Error(o.message||"Assistant run failed.")}},e==null?void 0:e.signal),t},authorScript:async(n,e)=>{let t="",i="",s=null,o="";return await Nte("/app/scripts/generator",n,r=>{var l,c,d;const a=Dte(r);if(a){if(a.type==="TEXT_MESSAGE_CONTENT"){t+=a.delta||"",(l=e==null?void 0:e.onText)==null||l.call(e,t);return}if(a.type==="TEXT_MESSAGE_REASONING"){i+=a.delta||"",(c=e==null?void 0:e.onReasoning)==null||c.call(e,i);return}if(a.type==="TEXT_MESSAGE_END"){t=t||a.message||a.delta||"",s=a.scriptPackage||null,o=a.currentFilePath||"",(d=e==null?void 0:e.onText)==null||d.call(e,t);return}if(a.type==="RUN_ERROR")throw new Error(a.message||"Assistant run failed.")}},e==null?void 0:e.signal),{text:t,scriptPackage:s,currentFilePath:o}}},hRe={getSession:()=>Xt("/auth/me")},xl={getContext:()=>Xt("/app/context"),validateDraftScript:(n,e)=>Xt("/app/scripts/validate",{method:"POST",body:JSON.stringify(n),signal:e}),listScripts:(n=!1)=>Xt(`/app/scripts?includeSource=${n?"true":"false"}`),getScript:n=>Xt(`/app/scripts/${encodeURIComponent(n)}`),getScriptCatalog:n=>Xt(`/app/scripts/${encodeURIComponent(n)}/catalog`),listScriptRuntimes:(n=24)=>Xt(`/app/scripts/runtimes?take=${n}`),getEvolutionDecision:n=>Xt(`/app/scripts/evolutions/${encodeURIComponent(n)}`),getRuntimeReadModel:n=>Xt(`/app/scripts/runtimes/${encodeURIComponent(n)}/readmodel`),saveScript:n=>Xt("/app/scripts",{method:"POST",body:JSON.stringify(n)}),runDraftScript:n=>Xt("/app/scripts/draft-run",{method:"POST",body:JSON.stringify(n)})},uRe={getReadModel:n=>Xt(`/app/scripts/runtimes/${encodeURIComponent(n)}/readmodel`),proposeEvolution:n=>Xt("/app/scripts/evolutions/proposals",{method:"POST",body:JSON.stringify(n)})};function Tte(n,e){(e==null||e>n.length)&&(e=n.length);for(var t=0,i=Array(e);t=n.length?n.apply(this,s):function(){for(var r=arguments.length,a=new Array(r),l=0;l1&&arguments[1]!==void 0?arguments[1]:{};IT.initial(n),IT.handler(e);var t={current:n},i=EL(ORe)(t,e),s=EL(PRe)(t),o=EL(IT.changes)(n),r=EL(ARe)(t);function a(){var c=arguments.length>0&&arguments[0]!==void 0?arguments[0]:function(d){return d};return IT.selector(c),c(t.current)}function l(c){xRe(i,s,o,r)(c)}return[a,l]}function ARe(n,e){return XE(e)?e(n.current):e}function PRe(n,e){return n.current=Pte(Pte({},n.current),e),e}function ORe(n,e,t){return XE(e)?e(n.current):Object.keys(t).forEach(function(i){var s;return(s=e[i])===null||s===void 0?void 0:s.call(e,n.current[i])}),t}var FRe={create:MRe},BRe={paths:{vs:"https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs"}};function WRe(n){return function e(){for(var t=this,i=arguments.length,s=new Array(i),o=0;o=n.length?n.apply(this,s):function(){for(var r=arguments.length,a=new Array(r),l=0;l{i.current=!1}:n,e)}var Al=hMe;function lk(){}function o0(n,e,t,i){return uMe(n,i)||fMe(n,e,t,i)}function uMe(n,e){return n.editor.getModel(Xfe(n,e))}function fMe(n,e,t,i){return n.editor.createModel(e,t,i?Xfe(n,i):void 0)}function Xfe(n,e){return n.Uri.parse(e)}function gMe({original:n,modified:e,language:t,originalLanguage:i,modifiedLanguage:s,originalModelPath:o,modifiedModelPath:r,keepCurrentOriginalModel:a=!1,keepCurrentModifiedModel:l=!1,theme:c="light",loading:d="Loading...",options:h={},height:u="100%",width:f="100%",className:g,wrapperProps:p={},beforeMount:m=lk,onMount:b=lk}){let[v,w]=$.useState(!1),[C,S]=$.useState(!0),L=$.useRef(null),x=$.useRef(null),E=$.useRef(null),I=$.useRef(b),R=$.useRef(m),M=$.useRef(!1);Zfe(()=>{let B=vG.init();return B.then(V=>(x.current=V)&&S(!1)).catch(V=>(V==null?void 0:V.type)!=="cancelation"&&console.error("Monaco initialization: error:",V)),()=>L.current?P():B.cancel()}),Al(()=>{if(L.current&&x.current){let B=L.current.getOriginalEditor(),V=o0(x.current,n||"",i||t||"text",o||"");V!==B.getModel()&&B.setModel(V)}},[o],v),Al(()=>{if(L.current&&x.current){let B=L.current.getModifiedEditor(),V=o0(x.current,e||"",s||t||"text",r||"");V!==B.getModel()&&B.setModel(V)}},[r],v),Al(()=>{let B=L.current.getModifiedEditor();B.getOption(x.current.editor.EditorOption.readOnly)?B.setValue(e||""):e!==B.getValue()&&(B.executeEdits("",[{range:B.getModel().getFullModelRange(),text:e||"",forceMoveMarkers:!0}]),B.pushUndoStop())},[e],v),Al(()=>{var B,V;(V=(B=L.current)==null?void 0:B.getModel())==null||V.original.setValue(n||"")},[n],v),Al(()=>{let{original:B,modified:V}=L.current.getModel();x.current.editor.setModelLanguage(B,i||t||"text"),x.current.editor.setModelLanguage(V,s||t||"text")},[t,i,s],v),Al(()=>{var B;(B=x.current)==null||B.editor.setTheme(c)},[c],v),Al(()=>{var B;(B=L.current)==null||B.updateOptions(h)},[h],v);let A=$.useCallback(()=>{var K;if(!x.current)return;R.current(x.current);let B=o0(x.current,n||"",i||t||"text",o||""),V=o0(x.current,e||"",s||t||"text",r||"");(K=L.current)==null||K.setModel({original:B,modified:V})},[t,e,s,n,i,o,r]),W=$.useCallback(()=>{var B;!M.current&&E.current&&(L.current=x.current.editor.createDiffEditor(E.current,{automaticLayout:!0,...h}),A(),(B=x.current)==null||B.editor.setTheme(c),w(!0),M.current=!0)},[h,c,A]);$.useEffect(()=>{v&&I.current(L.current,x.current)},[v]),$.useEffect(()=>{!C&&!v&&W()},[C,v,W]);function P(){var V,K,z,j;let B=(V=L.current)==null?void 0:V.getModel();a||((K=B==null?void 0:B.original)==null||K.dispose()),l||((z=B==null?void 0:B.modified)==null||z.dispose()),(j=L.current)==null||j.dispose()}return hm.createElement(Yfe,{width:f,height:u,isEditorReady:v,loading:d,_ref:E,className:g,wrapperProps:p})}var pMe=gMe;$.memo(pMe);function mMe(n){let e=$.useRef();return $.useEffect(()=>{e.current=n},[n]),e.current}var _Me=mMe,NT=new Map;function bMe({defaultValue:n,defaultLanguage:e,defaultPath:t,value:i,language:s,path:o,theme:r="light",line:a,loading:l="Loading...",options:c={},overrideServices:d={},saveViewState:h=!0,keepCurrentModel:u=!1,width:f="100%",height:g="100%",className:p,wrapperProps:m={},beforeMount:b=lk,onMount:v=lk,onChange:w,onValidate:C=lk}){let[S,L]=$.useState(!1),[x,E]=$.useState(!0),I=$.useRef(null),R=$.useRef(null),M=$.useRef(null),A=$.useRef(v),W=$.useRef(b),P=$.useRef(),B=$.useRef(i),V=_Me(o),K=$.useRef(!1),z=$.useRef(!1);Zfe(()=>{let Y=vG.init();return Y.then(te=>(I.current=te)&&E(!1)).catch(te=>(te==null?void 0:te.type)!=="cancelation"&&console.error("Monaco initialization: error:",te)),()=>R.current?Q():Y.cancel()}),Al(()=>{var te,ce,Ce,xe;let Y=o0(I.current,n||i||"",e||s||"",o||t||"");Y!==((te=R.current)==null?void 0:te.getModel())&&(h&&NT.set(V,(ce=R.current)==null?void 0:ce.saveViewState()),(Ce=R.current)==null||Ce.setModel(Y),h&&((xe=R.current)==null||xe.restoreViewState(NT.get(o))))},[o],S),Al(()=>{var Y;(Y=R.current)==null||Y.updateOptions(c)},[c],S),Al(()=>{!R.current||i===void 0||(R.current.getOption(I.current.editor.EditorOption.readOnly)?R.current.setValue(i):i!==R.current.getValue()&&(z.current=!0,R.current.executeEdits("",[{range:R.current.getModel().getFullModelRange(),text:i,forceMoveMarkers:!0}]),R.current.pushUndoStop(),z.current=!1))},[i],S),Al(()=>{var te,ce;let Y=(te=R.current)==null?void 0:te.getModel();Y&&s&&((ce=I.current)==null||ce.editor.setModelLanguage(Y,s))},[s],S),Al(()=>{var Y;a!==void 0&&((Y=R.current)==null||Y.revealLine(a))},[a],S),Al(()=>{var Y;(Y=I.current)==null||Y.editor.setTheme(r)},[r],S);let j=$.useCallback(()=>{var Y;if(!(!M.current||!I.current)&&!K.current){W.current(I.current);let te=o||t,ce=o0(I.current,i||n||"",e||s||"",te||"");R.current=(Y=I.current)==null?void 0:Y.editor.create(M.current,{model:ce,automaticLayout:!0,...c},d),h&&R.current.restoreViewState(NT.get(te)),I.current.editor.setTheme(r),a!==void 0&&R.current.revealLine(a),L(!0),K.current=!0}},[n,e,t,i,s,o,c,d,h,r,a]);$.useEffect(()=>{S&&A.current(R.current,I.current)},[S]),$.useEffect(()=>{!x&&!S&&j()},[x,S,j]),B.current=i,$.useEffect(()=>{var Y,te;S&&w&&((Y=P.current)==null||Y.dispose(),P.current=(te=R.current)==null?void 0:te.onDidChangeModelContent(ce=>{z.current||w(R.current.getValue(),ce)}))},[S,w]),$.useEffect(()=>{if(S){let Y=I.current.editor.onDidChangeMarkers(te=>{var Ce;let ce=(Ce=R.current.getModel())==null?void 0:Ce.uri;if(ce&&te.find(xe=>xe.path===ce.path)){let xe=I.current.editor.getModelMarkers({resource:ce});C==null||C(xe)}});return()=>{Y==null||Y.dispose()}}return()=>{}},[S,C]);function Q(){var Y,te;(Y=P.current)==null||Y.dispose(),u?h&&NT.set(o,R.current.saveViewState()):(te=R.current.getModel())==null||te.dispose(),R.current.dispose()}return hm.createElement(Yfe,{width:f,height:g,isEditorReady:S,loading:l,_ref:M,className:p,wrapperProps:m})}var vMe=bMe,wMe=$.memo(vMe),CMe=wMe;function yMe(n){if(n.length===0)throw new Error("Invalid tail call");return[n.slice(0,n.length-1),n[n.length-1]]}function Bi(n,e,t=(i,s)=>i===s){if(n===e)return!0;if(!n||!e||n.length!==e.length)return!1;for(let i=0,s=n.length;it(n[i],e))}function wG(n,e){let t=0,i=n-1;for(;t<=i;){const s=(t+i)/2|0,o=e(s);if(o<0)t=s+1;else if(o>0)i=s-1;else return s}return-(t+1)}function GB(n,e,t){if(n=n|0,n>=e.length)throw new TypeError("invalid index");const i=e[Math.floor(e.length*Math.random())],s=[],o=[],r=[];for(const a of e){const l=t(a,i);l<0?s.push(a):l>0?o.push(a):r.push(a)}return n!!e)}function Bte(n){let e=0;for(let t=0;t0}function bg(n,e=t=>t){const t=new Set;return n.filter(i=>{const s=e(i);return t.has(s)?!1:(t.add(s),!0)})}function or(n,e){let t=typeof e=="number"?n:0;typeof e=="number"?t=n:(t=0,e=n);const i=[];if(t<=e)for(let s=t;se;s--)i.push(s);return i}function N5(n,e,t){const i=n.slice(0,e),s=n.slice(e);return i.concat(t,s)}function l7(n,e){const t=n.indexOf(e);t>-1&&(n.splice(t,1),n.unshift(e))}function DT(n,e){const t=n.indexOf(e);t>-1&&(n.splice(t,1),n.push(e))}function YB(n,e){for(const t of e)n.push(t)}function LMe(n,e){const t=[];for(const i of n){const s=e(i);s!==void 0&&t.push(s)}return t}function yG(n){return Array.isArray(n)?n:[n]}function kMe(n,e,t){const i=ege(n,e),s=n.length,o=t.length;n.length=s+o;for(let r=s-1;r>=i;r--)n[r+o]=n[r];for(let r=0;r0}n.isGreaterThan=i;function s(o){return o===0}n.isNeitherLessOrGreaterThan=s,n.greaterThan=1,n.lessThan=-1,n.neitherLessOrGreaterThan=0})(Cm||(Cm={}));function lo(n,e){return(t,i)=>e(n(t),n(i))}function EMe(...n){return(e,t)=>{for(const i of n){const s=i(e,t);if(!Cm.isNeitherLessOrGreaterThan(s))return s}return Cm.neitherLessOrGreaterThan}}const pa=(n,e)=>n-e,tge=(n,e)=>pa(n?1:0,e?1:0);function ige(n){return(e,t)=>-n(e,t)}function IMe(n){return(e,t)=>e===void 0?t===void 0?Cm.neitherLessOrGreaterThan:Cm.lessThan:t===void 0?Cm.greaterThan:n(e,t)}class vg{constructor(e){this.firstIdx=0,this.items=e,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t=0&&e(this.items[t]);)t--;const i=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,i}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}}const D0=class D0{constructor(e){this.iterate=e}toArray(){const e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(e){return new D0(t=>this.iterate(i=>e(i)?t(i):!0))}map(e){return new D0(t=>this.iterate(i=>t(e(i))))}findLast(e){let t;return this.iterate(i=>(e(i)&&(t=i),!0)),t}findLastMaxBy(e){let t,i=!0;return this.iterate(s=>((i||Cm.isGreaterThan(e(s,t)))&&(i=!1,t=s),!0)),t}};D0.empty=new D0(e=>{});let Lv=D0;class YM{constructor(e){this._indexMap=e}static createSortPermutation(e,t){const i=Array.from(e.keys()).sort((s,o)=>t(e[s],e[o]));return new YM(i)}apply(e){return e.map((t,i)=>e[this._indexMap[i]])}inverse(){const e=this._indexMap.slice();for(let t=0;te+t,0)}class NMe{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?sS.isErrorNoTelemetry(e)?new sS(e.message+` - -`+e.stack):new Error(e.message+` - -`+e.stack):e},0)}}emit(e){this.listeners.forEach(t=>{t(e)})}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}}const SG=new NMe;function XM(n){SG.onUnexpectedError(n)}function Je(n){fl(n)||SG.onUnexpectedError(n)}function Bn(n){fl(n)||SG.onUnexpectedExternalError(n)}function ZB(n){if(n instanceof Error){const{name:e,message:t,cause:i}=n,s=n.stacktrace||n.stack;return{$isError:!0,name:e,message:t,stack:s,noTelemetry:sS.isErrorNoTelemetry(n),cause:i?ZB(i):void 0,code:n.code}}return n}const QM="Canceled";function fl(n){return n instanceof ic?!0:n instanceof Error&&n.name===QM&&n.message===QM}class ic extends Error{constructor(){super(QM),this.name=this.message}}function DMe(){const n=new Error(QM);return n.name=n.message,n}function Zl(n){return n?new Error(`Illegal argument: ${n}`):new Error("Illegal argument")}function JM(n){return n?new Error(`Illegal state: ${n}`):new Error("Illegal state")}class TMe extends Error{constructor(e){super("NotSupported"),e&&(this.message=e)}}class sS extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof sS)return e;const t=new sS;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name==="CodeExpectedError"}}class ze extends Error{constructor(e){super(e||"An unexpected bug occurred."),Object.setPrototypeOf(this,ze.prototype)}}function c7(n,e){if(!n)throw new Error(e?`Assertion failed (${e})`:"Assertion Failed")}function iD(n,e="Unreachable"){throw new Error(e)}function QE(n,e="unexpected state"){if(!n)throw typeof e=="string"?new ze(`Assertion Failed: ${e}`):e}function Wte(n,e="Soft Assertion Failed"){n||Je(new ze(e))}function Qm(n){if(!n()){debugger;n(),Je(new ze("Assertion Failed"))}}function nD(n,e){let t=0;for(;t"u"}function Ts(n){return!Hl(n)}function Hl(n){return ko(n)||n===null}function Ot(n,e){if(!n)throw new Error(e?`Unexpected type, expected '${e}'`:"Unexpected type")}function Kp(n){return QE(n!=null,"Argument is `undefined` or `null`."),n}function G1(n){return typeof n=="function"}function AMe(n,e){const t=Math.min(n.length,e.length);for(let i=0;i{e[t]=i&&typeof i=="object"?jh(i):i}),e}function OMe(n){if(!n||typeof n!="object")return n;const e=[n];for(;e.length>0;){const t=e.shift();Object.freeze(t);for(const i in t)if(nge.call(t,i)){const s=t[i];typeof s=="object"&&!Object.isFrozen(s)&&!MMe(s)&&e.push(s)}}return n}const nge=Object.prototype.hasOwnProperty;function sge(n,e){return JB(n,e,new Set)}function JB(n,e,t){if(Hl(n))return n;const i=e(n);if(typeof i<"u")return i;if(Array.isArray(n)){const s=[];for(const o of n)s.push(JB(o,e,t));return s}if(ns(n)){if(t.has(n))throw new Error("Cannot clone recursive data-structure");t.add(n);const s={};for(const o in n)nge.call(n,o)&&(s[o]=JB(n[o],e,t));return t.delete(n),s}return n}function D5(n,e,t=!0){return ns(n)?(ns(e)&&Object.keys(e).forEach(i=>{i in n?t&&(ns(n[i])&&ns(e[i])?D5(n[i],e[i],t):n[i]=e[i]):n[i]=e[i]}),n):e}function ma(n,e){if(n===e)return!0;if(n==null||e===null||e===void 0||typeof n!=typeof e||typeof n!="object"||Array.isArray(n)!==Array.isArray(e))return!1;let t,i;if(Array.isArray(n)){if(n.length!==e.length)return!1;for(t=0;t=0;function eA(n,e){let t;return e.length===0?t=n:t=n.replace(/\{(\d+)\}/g,(i,s)=>{const o=s[0],r=e[o];let a=i;return typeof r=="string"?a=r:(typeof r=="number"||typeof r=="boolean"||r===void 0||r===null)&&(a=String(r)),a}),FMe&&(t="["+t.replace(/[aouei]/g,"$&$&")+"]"),t}function _(n,e,...t){return eA(typeof n=="number"?rge(n,e):e,t)}function rge(n,e){var i;const t=(i=oge())==null?void 0:i[n];if(typeof t!="string"){if(typeof e=="string")return e;throw new Error(`!!! NLS MISSING: ${n} !!!`)}return t}function ie(n,e,...t){let i;typeof n=="number"?i=rge(n,e):i=e;const s=eA(i,t);return{value:s,original:e===i?s:eA(e,t)}}const sv="en";let JE=!1,eI=!1,ck=!1,age=!1,LG=!1,kG=!1,lge=!1,TT,yR=sv,Hte=sv,BMe,hd;const ng=globalThis;let Bo;var Mce;typeof ng.vscode<"u"&&typeof ng.vscode.process<"u"?Bo=ng.vscode.process:typeof process<"u"&&typeof((Mce=process==null?void 0:process.versions)==null?void 0:Mce.node)=="string"&&(Bo=process);var Ace;const WMe=typeof((Ace=Bo==null?void 0:Bo.versions)==null?void 0:Ace.electron)=="string",HMe=WMe&&(Bo==null?void 0:Bo.type)==="renderer";var Pce;if(typeof Bo=="object"){JE=Bo.platform==="win32",eI=Bo.platform==="darwin",ck=Bo.platform==="linux",ck&&Bo.env.SNAP&&Bo.env.SNAP_REVISION,Bo.env.CI||Bo.env.BUILD_ARTIFACTSTAGINGDIRECTORY||Bo.env.GITHUB_WORKSPACE,TT=sv,yR=sv;const n=Bo.env.VSCODE_NLS_CONFIG;if(n)try{const e=JSON.parse(n);TT=e.userLocale,Hte=e.osLocale,yR=e.resolvedLanguage||sv,BMe=(Pce=e.languagePack)==null?void 0:Pce.translationsConfigFile}catch{}age=!0}else typeof navigator=="object"&&!HMe?(hd=navigator.userAgent,JE=hd.indexOf("Windows")>=0,eI=hd.indexOf("Macintosh")>=0,kG=(hd.indexOf("Macintosh")>=0||hd.indexOf("iPad")>=0||hd.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,ck=hd.indexOf("Linux")>=0,lge=(hd==null?void 0:hd.indexOf("Mobi"))>=0,LG=!0,yR=xG()||sv,TT=navigator.language.toLowerCase(),Hte=TT):console.error("Unable to resolve platform.");let SR=0;eI?SR=1:JE?SR=3:ck&&(SR=2);const $s=JE,wt=eI,jr=ck,Yd=age,Du=LG,VMe=LG&&typeof ng.importScripts=="function",zMe=VMe?ng.origin:void 0,nc=kG,cge=lge,d7=SR,bu=hd,jMe=yR,$Me=typeof ng.postMessage=="function"&&!ng.importScripts,sD=(()=>{if($Me){const n=[];ng.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let i=0,s=n.length;i{const i=++e;n.push({id:i,callback:t}),ng.postMessage({vscodeScheduleAsyncWork:i},"*")}}return n=>setTimeout(n)})(),ha=eI||kG?2:JE?1:3;let Vte=!0,zte=!1;function dge(){if(!zte){zte=!0;const n=new Uint8Array(2);n[0]=1,n[1]=2,Vte=new Uint16Array(n.buffer)[0]===513}return Vte}const EG=!!(bu&&bu.indexOf("Chrome")>=0),UMe=!!(bu&&bu.indexOf("Firefox")>=0),qMe=!!(!EG&&bu&&bu.indexOf("Safari")>=0),hge=!!(bu&&bu.indexOf("Edg/")>=0),KMe=!!(bu&&bu.indexOf("Android")>=0);function Y1(n,e){const t=this;let i=!1,s;return function(){return i||(i=!0,s=n.apply(t,arguments)),s}}var Nt;(function(n){function e(x){return!!x&&typeof x=="object"&&typeof x[Symbol.iterator]=="function"}n.is=e;const t=Object.freeze([]);function i(){return t}n.empty=i;function*s(x){yield x}n.single=s;function o(x){return e(x)?x:s(x)}n.wrap=o;function r(x){return x||t}n.from=r;function*a(x){for(let E=x.length-1;E>=0;E--)yield x[E]}n.reverse=a;function l(x){return!x||x[Symbol.iterator]().next().done===!0}n.isEmpty=l;function c(x){return x[Symbol.iterator]().next().value}n.first=c;function d(x,E){let I=0;for(const R of x)if(E(R,I++))return!0;return!1}n.some=d;function h(x,E){let I=0;for(const R of x)if(!E(R,I++))return!1;return!0}n.every=h;function u(x,E){for(const I of x)if(E(I))return I}n.find=u;function*f(x,E){for(const I of x)E(I)&&(yield I)}n.filter=f;function*g(x,E){let I=0;for(const R of x)yield E(R,I++)}n.map=g;function*p(x,E){let I=0;for(const R of x)yield*E(R,I++)}n.flatMap=p;function*m(...x){for(const E of x)XB(E)?yield*E:yield E}n.concat=m;function b(x,E,I){let R=I;for(const M of x)R=E(R,M);return R}n.reduce=b;function v(x){let E=0;for(const I of x)E++;return E}n.length=v;function*w(x,E,I=x.length){for(E<-x.length&&(E=0),E<0&&(E+=x.length),I<0?I+=x.length:I>x.length&&(I=x.length);E1)throw new AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(n)?[]:n}else if(n)return n.dispose(),n}function Hc(...n){return Re(()=>Jt(n))}class GMe{constructor(e){this._isDisposed=!1,this._fn=e}dispose(){if(!this._isDisposed){if(!this._fn)throw new Error("Unbound disposable context: Need to use an arrow function to preserve the value of this");this._isDisposed=!0,this._fn()}}}function Re(n){return new GMe(n)}const f4=class f4{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(this._toDispose.size!==0)try{Jt(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e||e===G.None)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return this._isDisposed?f4.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}delete(e){if(e){if(e===this)throw new Error("Cannot dispose a disposable on itself!");this._toDispose.delete(e),e.dispose()}}};f4.DISABLE_DISPOSED_WARNING=!1;let ne=f4;const _Q=class _Q{constructor(){this._store=new ne,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}};_Q.None=Object.freeze({dispose(){}});let G=_Q;class Kt{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)==null||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)==null||e.dispose(),this._value=void 0}}class YMe{constructor(e){this._disposable=e,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}class ZMe{constructor(e){this.object=e}dispose(){}}class T5{constructor(){this._store=new Map,this._isDisposed=!1}dispose(){this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{Jt(this._store.values())}finally{this._store.clear()}}get(e){return this._store.get(e)}set(e,t,i=!1){var s;this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),i||(s=this._store.get(e))==null||s.dispose(),this._store.set(e,t)}deleteAndDispose(e){var t;(t=this._store.get(e))==null||t.dispose(),this._store.delete(e)}values(){return this._store.values()}[Symbol.iterator](){return this._store[Symbol.iterator]()}}var Yf;let fs=(Yf=class{constructor(e){this.element=e,this.next=Yf.Undefined,this.prev=Yf.Undefined}},Yf.Undefined=new Yf(void 0),Yf);class Uo{constructor(){this._first=fs.Undefined,this._last=fs.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===fs.Undefined}clear(){let e=this._first;for(;e!==fs.Undefined;){const t=e.next;e.prev=fs.Undefined,e.next=fs.Undefined,e=t}this._first=fs.Undefined,this._last=fs.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new fs(e);if(this._first===fs.Undefined)this._first=i,this._last=i;else if(t){const o=this._last;this._last=i,i.prev=o,o.next=i}else{const o=this._first;this._first=i,i.next=o,o.prev=i}this._size+=1;let s=!1;return()=>{s||(s=!0,this._remove(i))}}shift(){if(this._first!==fs.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==fs.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==fs.Undefined&&e.next!==fs.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===fs.Undefined&&e.next===fs.Undefined?(this._first=fs.Undefined,this._last=fs.Undefined):e.next===fs.Undefined?(this._last=this._last.prev,this._last.next=fs.Undefined):e.prev===fs.Undefined&&(this._first=this._first.next,this._first.prev=fs.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==fs.Undefined;)yield e.element,e=e.next}}const XMe=globalThis.performance.now.bind(globalThis.performance);class xs{static create(e){return new xs(e)}constructor(e){this._now=e===!1?Date.now:XMe,this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}}var ve;(function(n){n.None=()=>G.None;function e(A,W){return u(A,()=>{},0,void 0,!0,void 0,W)}n.defer=e;function t(A){return(W,P=null,B)=>{let V=!1,K;return K=A(z=>{if(!V)return K?K.dispose():V=!0,W.call(P,z)},null,B),V&&K.dispose(),K}}n.once=t;function i(A,W){return n.once(n.filter(A,W))}n.onceIf=i;function s(A,W,P){return d((B,V=null,K)=>A(z=>B.call(V,W(z)),null,K),P)}n.map=s;function o(A,W,P){return d((B,V=null,K)=>A(z=>{W(z),B.call(V,z)},null,K),P)}n.forEach=o;function r(A,W,P){return d((B,V=null,K)=>A(z=>W(z)&&B.call(V,z),null,K),P)}n.filter=r;function a(A){return A}n.signal=a;function l(...A){return(W,P=null,B)=>{const V=Hc(...A.map(K=>K(z=>W.call(P,z))));return h(V,B)}}n.any=l;function c(A,W,P,B){let V=P;return s(A,K=>(V=W(V,K),V),B)}n.reduce=c;function d(A,W){let P;const B={onWillAddFirstListener(){P=A(V.fire,V)},onDidRemoveLastListener(){P==null||P.dispose()}},V=new q(B);return W==null||W.add(V),V.event}function h(A,W){return W instanceof Array?W.push(A):W&&W.add(A),A}function u(A,W,P=100,B=!1,V=!1,K,z){let j,Q,Y,te=0,ce;const Ce={leakWarningThreshold:K,onWillAddFirstListener(){j=A(je=>{te++,Q=W(Q,je),B&&!Y&&(xe.fire(Q),Q=void 0),ce=()=>{const ke=Q;Q=void 0,Y=void 0,(!B||te>1)&&xe.fire(ke),te=0},typeof P=="number"?(Y&&clearTimeout(Y),Y=setTimeout(ce,P)):Y===void 0&&(Y=null,queueMicrotask(ce))})},onWillRemoveListener(){V&&te>0&&(ce==null||ce())},onDidRemoveLastListener(){ce=void 0,j.dispose()}},xe=new q(Ce);return z==null||z.add(xe),xe.event}n.debounce=u;function f(A,W=0,P){return n.debounce(A,(B,V)=>B?(B.push(V),B):[V],W,void 0,!0,void 0,P)}n.accumulate=f;function g(A,W=(B,V)=>B===V,P){let B=!0,V;return r(A,K=>{const z=B||!W(K,V);return B=!1,V=K,z},P)}n.latch=g;function p(A,W,P){return[n.filter(A,W,P),n.filter(A,B=>!W(B),P)]}n.split=p;function m(A,W=!1,P=[],B){let V=P.slice(),K=A(Q=>{V?V.push(Q):j.fire(Q)});B&&B.add(K);const z=()=>{V==null||V.forEach(Q=>j.fire(Q)),V=null},j=new q({onWillAddFirstListener(){K||(K=A(Q=>j.fire(Q)),B&&B.add(K))},onDidAddFirstListener(){V&&(W?setTimeout(z):z())},onDidRemoveLastListener(){K&&K.dispose(),K=null}});return B&&B.add(j),j.event}n.buffer=m;function b(A,W){return(B,V,K)=>{const z=W(new w);return A(function(j){const Q=z.evaluate(j);Q!==v&&B.call(V,Q)},void 0,K)}}n.chain=b;const v=Symbol("HaltChainable");class w{constructor(){this.steps=[]}map(W){return this.steps.push(W),this}forEach(W){return this.steps.push(P=>(W(P),P)),this}filter(W){return this.steps.push(P=>W(P)?P:v),this}reduce(W,P){let B=P;return this.steps.push(V=>(B=W(B,V),B)),this}latch(W=(P,B)=>P===B){let P=!0,B;return this.steps.push(V=>{const K=P||!W(V,B);return P=!1,B=V,K?V:v}),this}evaluate(W){for(const P of this.steps)if(W=P(W),W===v)break;return W}}function C(A,W,P=B=>B){const B=(...j)=>z.fire(P(...j)),V=()=>A.on(W,B),K=()=>A.removeListener(W,B),z=new q({onWillAddFirstListener:V,onDidRemoveLastListener:K});return z.event}n.fromNodeEventEmitter=C;function S(A,W,P=B=>B){const B=(...j)=>z.fire(P(...j)),V=()=>A.addEventListener(W,B),K=()=>A.removeEventListener(W,B),z=new q({onWillAddFirstListener:V,onDidRemoveLastListener:K});return z.event}n.fromDOMEventEmitter=S;function L(A,W){let P;const B=new Promise((V,K)=>{const z=t(A)(V,null,W);P=()=>z.dispose()});return B.cancel=P,B}n.toPromise=L;function x(A,W){return A(P=>W.fire(P))}n.forward=x;function E(A,W,P){return W(P),A(B=>W(B))}n.runAndSubscribe=E;class I{constructor(W,P){this._observable=W,this._counter=0,this._hasChanged=!1;const B={onWillAddFirstListener:()=>{W.addObserver(this),this._observable.reportChanges()},onDidRemoveLastListener:()=>{W.removeObserver(this)}};this.emitter=new q(B),P&&P.add(this.emitter)}beginUpdate(W){this._counter++}handlePossibleChange(W){}handleChange(W,P){this._hasChanged=!0}endUpdate(W){this._counter--,this._counter===0&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}function R(A,W){return new I(A,W).emitter.event}n.fromObservable=R;function M(A){return(W,P,B)=>{let V=0,K=!1;const z={beginUpdate(){V++},endUpdate(){V--,V===0&&(A.reportChanges(),K&&(K=!1,W.call(P)))},handlePossibleChange(){},handleChange(){K=!0}};A.addObserver(z),A.reportChanges();const j={dispose(){A.removeObserver(z)}};return B instanceof ne?B.add(j):Array.isArray(B)&&B.push(j),j}}n.fromObservableLight=M})(ve||(ve={}));const T0=class T0{constructor(e){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${e}_${T0._idPool++}`,T0.all.add(this)}start(e){this._stopWatch=new xs,this.listenerCount=e}stop(){if(this._stopWatch){const e=this._stopWatch.elapsed();this.durations.push(e),this.elapsedOverall+=e,this.invocationCount+=1,this._stopWatch=void 0}}};T0.all=new Set,T0._idPool=0;let eW=T0,QMe=-1;const g4=class g4{constructor(e,t,i=(g4._idPool++).toString(16).padStart(3,"0")){this._errorHandler=e,this.threshold=t,this.name=i,this._warnCountdown=0}dispose(){var e;(e=this._stacks)==null||e.clear()}check(e,t){const i=this.threshold;if(i<=0||t{const o=this._stacks.get(e.value)||0;this._stacks.set(e.value,o-1)}}getMostFrequentStack(){if(!this._stacks)return;let e,t=0;for(const[i,s]of this._stacks)(!e||t{var a,l,c,d,h,u,f;if(this._leakageMon&&this._size>this._leakageMon.threshold**2){const g=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(g);const p=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],m=new eAe(`${g}. HINT: Stack shows most frequent listener (${p[1]}-times)`,p[0]);return(((a=this._options)==null?void 0:a.onListenerError)||Je)(m),G.None}if(this._disposed)return G.None;t&&(e=e.bind(t));const s=new h7(e);let o;this._leakageMon&&this._size>=Math.ceil(this._leakageMon.threshold*.2)&&(s.stack=IG.create(),o=this._leakageMon.check(s.stack,this._size+1)),this._listeners?this._listeners instanceof h7?(this._deliveryQueue??(this._deliveryQueue=new uge),this._listeners=[this._listeners,s]):this._listeners.push(s):((c=(l=this._options)==null?void 0:l.onWillAddFirstListener)==null||c.call(l,this),this._listeners=s,(h=(d=this._options)==null?void 0:d.onDidAddFirstListener)==null||h.call(d,this)),(f=(u=this._options)==null?void 0:u.onDidAddListener)==null||f.call(u,this),this._size++;const r=Re(()=>{o==null||o(),this._removeListener(s)});return i instanceof ne?i.add(r):Array.isArray(i)&&i.push(r),r}),this._event}_removeListener(e){var o,r,a,l;if((r=(o=this._options)==null?void 0:o.onWillRemoveListener)==null||r.call(o,this),!this._listeners)return;if(this._size===1){this._listeners=void 0,(l=(a=this._options)==null?void 0:a.onDidRemoveLastListener)==null||l.call(a,this),this._size=0;return}const t=this._listeners,i=t.indexOf(e);if(i===-1)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[i]=void 0;const s=this._deliveryQueue.current===this;if(this._size*tAe<=t.length){let c=0;for(let d=0;d0}};const iAe=()=>new uge;class uge{constructor(){this.i=-1,this.end=0}enqueue(e,t,i){this.i=0,this.end=i,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}class Z1 extends q{constructor(e){super(e),this._isPaused=0,this._eventQueue=new Uo,this._mergeFn=e==null?void 0:e.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){if(this._eventQueue.size>0){const e=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(e))}}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(e){this._size&&(this._isPaused!==0?this._eventQueue.push(e):super.fire(e))}}class fge extends Z1{constructor(e){super(e),this._delay=e.delay??100}fire(e){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(e)}}class nAe extends q{constructor(e){super(e),this._queuedEvents=[],this._mergeFn=e==null?void 0:e.merge}fire(e){this.hasListeners()&&(this._queuedEvents.push(e),this._queuedEvents.length===1&&queueMicrotask(()=>{this._mergeFn?super.fire(this._mergeFn(this._queuedEvents)):this._queuedEvents.forEach(t=>super.fire(t)),this._queuedEvents=[]}))}}class sAe{constructor(){this.hasListeners=!1,this.events=[],this.emitter=new q({onWillAddFirstListener:()=>this.onFirstListenerAdd(),onDidRemoveLastListener:()=>this.onLastListenerRemove()})}get event(){return this.emitter.event}add(e){const t={event:e,listener:null};return this.events.push(t),this.hasListeners&&this.hook(t),Re(Y1(()=>{this.hasListeners&&this.unhook(t);const s=this.events.indexOf(t);this.events.splice(s,1)}))}onFirstListenerAdd(){this.hasListeners=!0,this.events.forEach(e=>this.hook(e))}onLastListenerRemove(){this.hasListeners=!1,this.events.forEach(e=>this.unhook(e))}hook(e){e.listener=e.event(t=>this.emitter.fire(t))}unhook(e){var t;(t=e.listener)==null||t.dispose(),e.listener=null}dispose(){var e;this.emitter.dispose();for(const t of this.events)(e=t.listener)==null||e.dispose();this.events=[]}}class oD{constructor(){this.data=[]}wrapEvent(e,t,i){return(s,o,r)=>e(a=>{const l=this.data[this.data.length-1];if(!t){l?l.buffers.push(()=>s.call(o,a)):s.call(o,a);return}const c=l;if(!c){s.call(o,t(i,a));return}c.items??(c.items=[]),c.items.push(a),c.buffers.length===0&&l.buffers.push(()=>{c.reducedResult??(c.reducedResult=i?c.items.reduce(t,i):c.items.reduce(t)),s.call(o,c.reducedResult)})},void 0,r)}bufferEvents(e){const t={buffers:new Array};this.data.push(t);const i=e();return this.data.pop(),t.buffers.forEach(s=>s()),i}}class Bx{constructor(){this.listening=!1,this.inputEvent=ve.None,this.inputEventListener=G.None,this.emitter=new q({onDidAddFirstListener:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onDidRemoveLastListener:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}const Vl=new class{constructor(){this._zoomLevel=0,this._onDidChangeZoomLevel=new q,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event}getZoomLevel(){return this._zoomLevel}setZoomLevel(n){n=Math.min(Math.max(-5,n),20),this._zoomLevel!==n&&(this._zoomLevel=n,this._onDidChangeZoomLevel.fire(this._zoomLevel))}},oAe=wt?1.5:1.35,u7=8;class X1{static _create(e,t,i,s,o,r,a,l,c){r===0?r=oAe*i:r/?";function dAe(n=""){let e="(-?\\d*\\.\\d\\w*)|([^";for(const t of iA)n.indexOf(t)>=0||(e+="\\"+t);return e+="\\s]+)",new RegExp(e,"g")}const NG=dAe();function DG(n){let e=NG;if(n&&n instanceof RegExp)if(n.global)e=n;else{let t="g";n.ignoreCase&&(t+="i"),n.multiline&&(t+="m"),n.unicode&&(t+="u"),e=new RegExp(n.source,t)}return e.lastIndex=0,e}const mge=new Uo;mge.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function tI(n,e,t,i,s){if(e=DG(e),s||(s=Nt.first(mge)),t.length>s.maxLen){let c=n-s.maxLen/2;return c<0?c=0:i+=c,t=t.substring(c,n+s.maxLen/2),tI(n,e,t,i,s)}const o=Date.now(),r=n-1-i;let a=-1,l=null;for(let c=1;!(Date.now()-o>=s.timeBudget);c++){const d=r-s.windowSize*c;e.lastIndex=Math.max(0,d);const h=hAe(e,t,r,a);if(!h&&l||(l=h,d<=0))break;a=d}if(l){const c={word:l[0],startColumn:i+1+l.index,endColumn:i+1+l.index+l[0].length};return e.lastIndex=0,c}return null}function hAe(n,e,t,i){let s;for(;s=n.exec(e);){const o=s.index||0;if(o<=t&&n.lastIndex>=t)return s;if(i>0&&o>i)return null}return null}const Lh=8;class _ge{constructor(e){this._values=e}hasChanged(e){return this._values[e]}}class bge{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}class $i{constructor(e,t,i,s){this.id=e,this.name=t,this.defaultValue=i,this.schema=s}applyUpdate(e,t){return R5(e,t)}compute(e,t,i){return i}}class dk{constructor(e,t){this.newValue=e,this.didChange=t}}function R5(n,e){if(typeof n!="object"||typeof e!="object"||!n||!e)return new dk(e,n!==e);if(Array.isArray(n)||Array.isArray(e)){const i=Array.isArray(n)&&Array.isArray(e)&&Bi(n,e);return new dk(e,!i)}let t=!1;for(const i in e)if(e.hasOwnProperty(i)){const s=R5(n[i],e[i]);s.didChange&&(n[i]=s.newValue,t=!0)}return new dk(n,t)}class b_{constructor(e,t){this.schema=void 0,this.id=e,this.name="_never_",this.defaultValue=t}applyUpdate(e,t){return R5(e,t)}validate(e){return this.defaultValue}}class qS{constructor(e,t,i,s){this.id=e,this.name=t,this.defaultValue=i,this.schema=s}applyUpdate(e,t){return R5(e,t)}compute(e,t,i){return i}}function Fe(n,e){return typeof n>"u"?e:n==="false"?!1:!!n}class bt extends qS{constructor(e,t,i,s=void 0){typeof s<"u"&&(s.type="boolean",s.default=i),super(e,t,i,s)}validate(e){return Fe(e,this.defaultValue)}}function xf(n,e,t,i){if(typeof n=="string"&&(n=parseInt(n,10)),typeof n!="number"||isNaN(n))return e;let s=n;return s=Math.max(t,s),s=Math.min(i,s),s|0}class oi extends qS{static clampedInt(e,t,i,s){return xf(e,t,i,s)}constructor(e,t,i,s,o,r=void 0){typeof r<"u"&&(r.type="integer",r.default=i,r.minimum=s,r.maximum=o),super(e,t,i,r),this.minimum=s,this.maximum=o}validate(e){return oi.clampedInt(e,this.defaultValue,this.minimum,this.maximum)}}function uAe(n,e,t,i){if(typeof n>"u")return e;const s=Br.float(n,e);return Br.clamp(s,t,i)}class Br extends qS{static clamp(e,t,i){return ei?i:e}static float(e,t){return typeof e=="string"&&(e=parseFloat(e)),typeof e!="number"||isNaN(e)?t:e}constructor(e,t,i,s,o,r,a){typeof o<"u"&&(o.type="number",o.default=i,o.minimum=r,o.maximum=a),super(e,t,i,o),this.validationFn=s,this.minimum=r,this.maximum=a}validate(e){return this.validationFn(Br.float(e,this.defaultValue))}}class Vo extends qS{static string(e,t){return typeof e!="string"?t:e}constructor(e,t,i,s=void 0){typeof s<"u"&&(s.type="string",s.default=i),super(e,t,i,s)}validate(e){return Vo.string(e,this.defaultValue)}}function Di(n,e,t,i){return typeof n!="string"?e:i&&n in i?i[n]:t.indexOf(n)===-1?e:n}class zi extends qS{constructor(e,t,i,s,o=void 0){typeof o<"u"&&(o.type="string",o.enum=s.slice(0),o.default=i),super(e,t,i,o),this._allowedValues=s}validate(e){return Di(e,this.defaultValue,this._allowedValues)}}class Wx extends $i{constructor(e,t,i,s,o,r,a=void 0){typeof a<"u"&&(a.type="string",a.enum=o,a.default=s),super(e,t,i,a),this._allowedValues=o,this._convert=r}validate(e){return typeof e!="string"?this.defaultValue:this._allowedValues.indexOf(e)===-1?this.defaultValue:this._convert(e)}}function fAe(n){switch(n){case"none":return 0;case"keep":return 1;case"brackets":return 2;case"advanced":return 3;case"full":return 4}}class gAe extends $i{constructor(){super(2,"accessibilitySupport",0,{type:"string",enum:["auto","on","off"],enumDescriptions:[_(201,"Use platform APIs to detect when a Screen Reader is attached."),_(202,"Optimize for usage with a Screen Reader."),_(203,"Assume a screen reader is not attached.")],default:"auto",tags:["accessibility"],description:_(204,"Controls if the UI should run in a mode where it is optimized for screen readers.")})}validate(e){switch(e){case"auto":return 0;case"off":return 1;case"on":return 2}return this.defaultValue}compute(e,t,i){return i===0?e.accessibilitySupport:i}}class pAe extends $i{constructor(){const e={insertSpace:!0,ignoreEmptyLines:!0};super(29,"comments",e,{"editor.comments.insertSpace":{type:"boolean",default:e.insertSpace,description:_(205,"Controls whether a space character is inserted when commenting.")},"editor.comments.ignoreEmptyLines":{type:"boolean",default:e.ignoreEmptyLines,description:_(206,"Controls if empty lines should be ignored with toggle, add or remove actions for line comments.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{insertSpace:Fe(t.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:Fe(t.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function mAe(n){switch(n){case"blink":return 1;case"smooth":return 2;case"phase":return 3;case"expand":return 4;case"solid":return 5}}var ms;(function(n){n[n.Line=1]="Line",n[n.Block=2]="Block",n[n.Underline=3]="Underline",n[n.LineThin=4]="LineThin",n[n.BlockOutline=5]="BlockOutline",n[n.UnderlineThin=6]="UnderlineThin"})(ms||(ms={}));function jte(n){switch(n){case"line":return ms.Line;case"block":return ms.Block;case"underline":return ms.Underline;case"line-thin":return ms.LineThin;case"block-outline":return ms.BlockOutline;case"underline-thin":return ms.UnderlineThin}}class _Ae extends b_{constructor(){super(162,"")}compute(e,t,i){const s=["monaco-editor"];return t.get(48)&&s.push(t.get(48)),e.extraEditorClassName&&s.push(e.extraEditorClassName),t.get(82)==="default"?s.push("mouse-default"):t.get(82)==="copy"&&s.push("mouse-copy"),t.get(127)&&s.push("showUnused"),t.get(157)&&s.push("showDeprecated"),s.join(" ")}}class bAe extends bt{constructor(){super(45,"emptySelectionClipboard",!0,{description:_(207,"Controls whether copying without a selection copies the current line.")})}compute(e,t,i){return i&&e.emptySelectionClipboard}}class vAe extends $i{constructor(){const e={cursorMoveOnType:!0,findOnType:!0,seedSearchStringFromSelection:"always",autoFindInSelection:"never",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0,history:"workspace",replaceHistory:"workspace"};super(50,"find",e,{"editor.find.cursorMoveOnType":{type:"boolean",default:e.cursorMoveOnType,description:_(208,"Controls whether the cursor should jump to find matches while typing.")},"editor.find.seedSearchStringFromSelection":{type:"string",enum:["never","always","selection"],default:e.seedSearchStringFromSelection,enumDescriptions:[_(209,"Never seed search string from the editor selection."),_(210,"Always seed search string from the editor selection, including word at cursor position."),_(211,"Only seed search string from the editor selection.")],description:_(212,"Controls whether the search string in the Find Widget is seeded from the editor selection.")},"editor.find.autoFindInSelection":{type:"string",enum:["never","always","multiline"],default:e.autoFindInSelection,enumDescriptions:[_(213,"Never turn on Find in Selection automatically (default)."),_(214,"Always turn on Find in Selection automatically."),_(215,"Turn on Find in Selection automatically when multiple lines of content are selected.")],description:_(216,"Controls the condition for turning on Find in Selection automatically.")},"editor.find.globalFindClipboard":{type:"boolean",default:e.globalFindClipboard,description:_(217,"Controls whether the Find Widget should read or modify the shared find clipboard on macOS."),included:wt},"editor.find.addExtraSpaceOnTop":{type:"boolean",default:e.addExtraSpaceOnTop,description:_(218,"Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.")},"editor.find.loop":{type:"boolean",default:e.loop,description:_(219,"Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.")},"editor.find.history":{type:"string",enum:["never","workspace"],default:"workspace",enumDescriptions:[_(220,"Do not store search history from the find widget."),_(221,"Store search history across the active workspace")],description:_(222,"Controls how the find widget history should be stored")},"editor.find.replaceHistory":{type:"string",enum:["never","workspace"],default:"workspace",enumDescriptions:[_(223,"Do not store history from the replace widget."),_(224,"Store replace history across the active workspace")],description:_(225,"Controls how the replace widget history should be stored")},"editor.find.findOnType":{type:"boolean",default:e.findOnType,description:_(226,"Controls whether the Find Widget should search as you type.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{cursorMoveOnType:Fe(t.cursorMoveOnType,this.defaultValue.cursorMoveOnType),findOnType:Fe(t.findOnType,this.defaultValue.findOnType),seedSearchStringFromSelection:typeof t.seedSearchStringFromSelection=="boolean"?t.seedSearchStringFromSelection?"always":"never":Di(t.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,["never","always","selection"]),autoFindInSelection:typeof t.autoFindInSelection=="boolean"?t.autoFindInSelection?"always":"never":Di(t.autoFindInSelection,this.defaultValue.autoFindInSelection,["never","always","multiline"]),globalFindClipboard:Fe(t.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:Fe(t.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:Fe(t.loop,this.defaultValue.loop),history:Di(t.history,this.defaultValue.history,["never","workspace"]),replaceHistory:Di(t.replaceHistory,this.defaultValue.replaceHistory,["never","workspace"])}}}const bf=class bf extends $i{constructor(){super(60,"fontLigatures",bf.OFF,{anyOf:[{type:"boolean",description:_(227,"Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.")},{type:"string",description:_(228,"Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.")}],description:_(229,"Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"||e.length===0?bf.OFF:e==="true"?bf.ON:e:e?bf.ON:bf.OFF}};bf.OFF='"liga" off, "calt" off',bf.ON='"liga" on, "calt" on';let Cg=bf;const vf=class vf extends $i{constructor(){super(63,"fontVariations",vf.OFF,{anyOf:[{type:"boolean",description:_(230,"Enables/Disables the translation from font-weight to font-variation-settings. Change this to a string for fine-grained control of the 'font-variation-settings' CSS property.")},{type:"string",description:_(231,"Explicit 'font-variation-settings' CSS property. A boolean can be passed instead if one only needs to translate font-weight to font-variation-settings.")}],description:_(232,"Configures font variations. Can be either a boolean to enable/disable the translation from font-weight to font-variation-settings or a string for the value of the CSS 'font-variation-settings' property."),default:!1})}validate(e){return typeof e>"u"?this.defaultValue:typeof e=="string"?e==="false"?vf.OFF:e==="true"?vf.TRANSLATE:e:e?vf.TRANSLATE:vf.OFF}compute(e,t,i){return e.fontInfo.fontVariationSettings}};vf.OFF=gge,vf.TRANSLATE=pge;let iW=vf;class wAe extends b_{constructor(){super(59,new tA({pixelRatio:0,fontFamily:"",fontWeight:"",fontSize:0,fontFeatureSettings:"",fontVariationSettings:"",lineHeight:0,letterSpacing:0,isMonospace:!1,typicalHalfwidthCharacterWidth:0,typicalFullwidthCharacterWidth:0,canUseHalfwidthRightwardsArrow:!1,spaceWidth:0,middotWidth:0,wsmiddotWidth:0,maxDigitWidth:0},!1))}compute(e,t,i){return e.fontInfo}}class CAe extends b_{constructor(){super(161,ms.Line)}compute(e,t,i){return e.inputMode==="overtype"?t.get(92):t.get(34)}}class yAe extends b_{constructor(){super(170,!1)}compute(e,t){return e.editContextSupported&&t.get(44)}}class SAe extends b_{constructor(){super(172,!1)}compute(e,t){return e.accessibilitySupport===2?t.get(7):t.get(6)}}class xAe extends qS{constructor(){super(61,"fontSize",Hr.fontSize,{type:"number",minimum:6,maximum:100,default:Hr.fontSize,description:_(233,"Controls the font size in pixels.")})}validate(e){const t=Br.float(e,this.defaultValue);return t===0?Hr.fontSize:Br.clamp(t,6,100)}compute(e,t,i){return e.fontInfo.fontSize}}const Mh=class Mh extends $i{constructor(){super(62,"fontWeight",Hr.fontWeight,{anyOf:[{type:"number",minimum:Mh.MINIMUM_VALUE,maximum:Mh.MAXIMUM_VALUE,errorMessage:_(234,'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.')},{type:"string",pattern:"^(normal|bold|1000|[1-9][0-9]{0,2})$"},{enum:Mh.SUGGESTION_VALUES}],default:Hr.fontWeight,description:_(235,'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.')})}validate(e){return e==="normal"||e==="bold"?e:String(oi.clampedInt(e,Hr.fontWeight,Mh.MINIMUM_VALUE,Mh.MAXIMUM_VALUE))}};Mh.SUGGESTION_VALUES=["normal","bold","100","200","300","400","500","600","700","800","900"],Mh.MINIMUM_VALUE=1,Mh.MAXIMUM_VALUE=1e3;let nW=Mh;class LAe extends $i{constructor(){const e={multiple:"peek",multipleDefinitions:"peek",multipleTypeDefinitions:"peek",multipleDeclarations:"peek",multipleImplementations:"peek",multipleReferences:"peek",multipleTests:"peek",alternativeDefinitionCommand:"editor.action.goToReferences",alternativeTypeDefinitionCommand:"editor.action.goToReferences",alternativeDeclarationCommand:"editor.action.goToReferences",alternativeImplementationCommand:"",alternativeReferenceCommand:"",alternativeTestsCommand:""},t={type:"string",enum:["peek","gotoAndPeek","goto"],default:e.multiple,enumDescriptions:[_(236,"Show Peek view of the results (default)"),_(237,"Go to the primary result and show a Peek view"),_(238,"Go to the primary result and enable Peek-less navigation to others")]},i=["","editor.action.referenceSearch.trigger","editor.action.goToReferences","editor.action.peekImplementation","editor.action.goToImplementation","editor.action.peekTypeDefinition","editor.action.goToTypeDefinition","editor.action.peekDeclaration","editor.action.revealDeclaration","editor.action.peekDefinition","editor.action.revealDefinitionAside","editor.action.revealDefinition"];super(67,"gotoLocation",e,{"editor.gotoLocation.multiple":{deprecationMessage:_(239,"This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.")},"editor.gotoLocation.multipleDefinitions":{description:_(240,"Controls the behavior the 'Go to Definition'-command when multiple target locations exist."),...t},"editor.gotoLocation.multipleTypeDefinitions":{description:_(241,"Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist."),...t},"editor.gotoLocation.multipleDeclarations":{description:_(242,"Controls the behavior the 'Go to Declaration'-command when multiple target locations exist."),...t},"editor.gotoLocation.multipleImplementations":{description:_(243,"Controls the behavior the 'Go to Implementations'-command when multiple target locations exist."),...t},"editor.gotoLocation.multipleReferences":{description:_(244,"Controls the behavior the 'Go to References'-command when multiple target locations exist."),...t},"editor.gotoLocation.alternativeDefinitionCommand":{type:"string",default:e.alternativeDefinitionCommand,enum:i,description:_(245,"Alternative command id that is being executed when the result of 'Go to Definition' is the current location.")},"editor.gotoLocation.alternativeTypeDefinitionCommand":{type:"string",default:e.alternativeTypeDefinitionCommand,enum:i,description:_(246,"Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.")},"editor.gotoLocation.alternativeDeclarationCommand":{type:"string",default:e.alternativeDeclarationCommand,enum:i,description:_(247,"Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.")},"editor.gotoLocation.alternativeImplementationCommand":{type:"string",default:e.alternativeImplementationCommand,enum:i,description:_(248,"Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.")},"editor.gotoLocation.alternativeReferenceCommand":{type:"string",default:e.alternativeReferenceCommand,enum:i,description:_(249,"Alternative command id that is being executed when the result of 'Go to Reference' is the current location.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{multiple:Di(t.multiple,this.defaultValue.multiple,["peek","gotoAndPeek","goto"]),multipleDefinitions:Di(t.multipleDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleTypeDefinitions:Di(t.multipleTypeDefinitions,"peek",["peek","gotoAndPeek","goto"]),multipleDeclarations:Di(t.multipleDeclarations,"peek",["peek","gotoAndPeek","goto"]),multipleImplementations:Di(t.multipleImplementations,"peek",["peek","gotoAndPeek","goto"]),multipleReferences:Di(t.multipleReferences,"peek",["peek","gotoAndPeek","goto"]),multipleTests:Di(t.multipleTests,"peek",["peek","gotoAndPeek","goto"]),alternativeDefinitionCommand:Vo.string(t.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:Vo.string(t.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:Vo.string(t.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:Vo.string(t.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:Vo.string(t.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand),alternativeTestsCommand:Vo.string(t.alternativeTestsCommand,this.defaultValue.alternativeTestsCommand)}}}class kAe extends $i{constructor(){const e={enabled:!0,delay:300,hidingDelay:300,sticky:!0,above:!0};super(69,"hover",e,{"editor.hover.enabled":{type:"boolean",default:e.enabled,description:_(250,"Controls whether the hover is shown.")},"editor.hover.delay":{type:"number",default:e.delay,minimum:0,maximum:1e4,description:_(251,"Controls the delay in milliseconds after which the hover is shown.")},"editor.hover.sticky":{type:"boolean",default:e.sticky,description:_(252,"Controls whether the hover should remain visible when mouse is moved over it.")},"editor.hover.hidingDelay":{type:"integer",minimum:0,default:e.hidingDelay,markdownDescription:_(253,"Controls the delay in milliseconds after which the hover is hidden. Requires `#editor.hover.sticky#` to be enabled.")},"editor.hover.above":{type:"boolean",default:e.above,description:_(254,"Prefer showing hovers above the line, if there's space.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Fe(t.enabled,this.defaultValue.enabled),delay:oi.clampedInt(t.delay,this.defaultValue.delay,0,1e4),sticky:Fe(t.sticky,this.defaultValue.sticky),hidingDelay:oi.clampedInt(t.hidingDelay,this.defaultValue.hidingDelay,0,6e5),above:Fe(t.above,this.defaultValue.above)}}}class J0 extends b_{constructor(){super(165,{width:0,height:0,glyphMarginLeft:0,glyphMarginWidth:0,glyphMarginDecorationLaneCount:0,lineNumbersLeft:0,lineNumbersWidth:0,decorationsLeft:0,decorationsWidth:0,contentLeft:0,contentWidth:0,minimap:{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:0,minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:0},viewportColumn:0,isWordWrapMinified:!1,isViewportWrapping:!1,wrappingColumn:-1,verticalScrollbarWidth:0,horizontalScrollbarHeight:0,overviewRuler:{top:0,width:0,height:0,right:0}})}compute(e,t,i){return J0.computeLayout(t,{memory:e.memory,outerWidth:e.outerWidth,outerHeight:e.outerHeight,isDominatedByLongLines:e.isDominatedByLongLines,lineHeight:e.fontInfo.lineHeight,viewLineCount:e.viewLineCount,lineNumbersDigitCount:e.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:e.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:e.fontInfo.maxDigitWidth,pixelRatio:e.pixelRatio,glyphMarginDecorationLaneCount:e.glyphMarginDecorationLaneCount})}static computeContainedMinimapLineCount(e){const t=e.height/e.lineHeight,i=Math.floor(e.paddingTop/e.lineHeight);let s=Math.floor(e.paddingBottom/e.lineHeight);e.scrollBeyondLastLine&&(s=Math.max(s,t-1));const o=(i+e.viewLineCount+s)/(e.pixelRatio*e.height),r=Math.floor(e.viewLineCount/o);return{typicalViewportLineCount:t,extraLinesBeforeFirstLine:i,extraLinesBeyondLastLine:s,desiredRatio:o,minimapLineCount:r}}static _computeMinimapLayout(e,t){const i=e.outerWidth,s=e.outerHeight,o=e.pixelRatio;if(!e.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(o*s),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:s};const r=t.stableMinimapLayoutInput,a=r&&e.outerHeight===r.outerHeight&&e.lineHeight===r.lineHeight&&e.typicalHalfwidthCharacterWidth===r.typicalHalfwidthCharacterWidth&&e.pixelRatio===r.pixelRatio&&e.scrollBeyondLastLine===r.scrollBeyondLastLine&&e.paddingTop===r.paddingTop&&e.paddingBottom===r.paddingBottom&&e.minimap.enabled===r.minimap.enabled&&e.minimap.side===r.minimap.side&&e.minimap.size===r.minimap.size&&e.minimap.showSlider===r.minimap.showSlider&&e.minimap.renderCharacters===r.minimap.renderCharacters&&e.minimap.maxColumn===r.minimap.maxColumn&&e.minimap.scale===r.minimap.scale&&e.verticalScrollbarWidth===r.verticalScrollbarWidth&&e.isViewportWrapping===r.isViewportWrapping,l=e.lineHeight,c=e.typicalHalfwidthCharacterWidth,d=e.scrollBeyondLastLine,h=e.minimap.renderCharacters;let u=o>=2?Math.round(e.minimap.scale*2):e.minimap.scale;const f=e.minimap.maxColumn,g=e.minimap.size,p=e.minimap.side,m=e.verticalScrollbarWidth,b=e.viewLineCount,v=e.remainingWidth,w=e.isViewportWrapping,C=h?2:3;let S=Math.floor(o*s);const L=S/o;let x=!1,E=!1,I=C*u,R=u/o,M=1;if(g==="fill"||g==="fit"){const{typicalViewportLineCount:z,extraLinesBeforeFirstLine:j,extraLinesBeyondLastLine:Q,desiredRatio:Y,minimapLineCount:te}=J0.computeContainedMinimapLineCount({viewLineCount:b,scrollBeyondLastLine:d,paddingTop:e.paddingTop,paddingBottom:e.paddingBottom,height:s,lineHeight:l,pixelRatio:o});if(b/te>1)x=!0,E=!0,u=1,I=1,R=u/o;else{let Ce=!1,xe=u+1;if(g==="fit"){const je=Math.ceil((j+b+Q)*I);w&&a&&v<=t.stableFitRemainingWidth?(Ce=!0,xe=t.stableFitMaxMinimapScale):Ce=je>S}if(g==="fill"||Ce){x=!0;const je=u;I=Math.min(l*o,Math.max(1,Math.floor(1/Y))),w&&a&&v<=t.stableFitRemainingWidth&&(xe=t.stableFitMaxMinimapScale),u=Math.min(xe,Math.max(1,Math.floor(I/C))),u>je&&(M=Math.min(2,u/je)),R=u/o/M,S=Math.ceil(Math.max(z,j+b+Q)*I),w?(t.stableMinimapLayoutInput=e,t.stableFitRemainingWidth=v,t.stableFitMaxMinimapScale=u):(t.stableMinimapLayoutInput=null,t.stableFitRemainingWidth=0)}}}const A=Math.floor(f*R),W=Math.min(A,Math.max(0,Math.floor((v-m-2)*R/(c+R)))+Lh);let P=Math.floor(o*W);const B=P/o;P=Math.floor(P*M);const V=h?1:2,K=p==="left"?0:i-W-m;return{renderMinimap:V,minimapLeft:K,minimapWidth:W,minimapHeightIsEditorHeight:x,minimapIsSampling:E,minimapScale:u,minimapLineHeight:I,minimapCanvasInnerWidth:P,minimapCanvasInnerHeight:S,minimapCanvasOuterWidth:B,minimapCanvasOuterHeight:L}}static computeLayout(e,t){const i=t.outerWidth|0,s=t.outerHeight|0,o=t.lineHeight|0,r=t.lineNumbersDigitCount|0,a=t.typicalHalfwidthCharacterWidth,l=t.maxDigitWidth,c=t.pixelRatio,d=t.viewLineCount,h=e.get(154),u=h==="inherit"?e.get(153):h,f=u==="inherit"?e.get(149):u,g=e.get(152),p=t.isDominatedByLongLines,m=e.get(66),b=e.get(76).renderType!==0,v=e.get(77),w=e.get(119),C=e.get(96),S=e.get(81),L=e.get(117),x=L.verticalScrollbarSize,E=L.verticalHasArrows,I=L.arrowSize,R=L.horizontalScrollbarSize,M=e.get(52),A=e.get(126)!=="never";let W=e.get(74);M&&A&&(W+=16);let P=0;if(b){const Le=Math.max(r,v);P=Math.round(Le*l)}let B=0;m&&(B=o*t.glyphMarginDecorationLaneCount);let V=0,K=V+B,z=K+P,j=z+W;const Q=i-B-P-W;let Y=!1,te=!1,ce=-1;e.get(2)===2&&u==="inherit"&&p?(Y=!0,te=!0):f==="on"||f==="bounded"?te=!0:f==="wordWrapColumn"&&(ce=g);const Ce=J0._computeMinimapLayout({outerWidth:i,outerHeight:s,lineHeight:o,typicalHalfwidthCharacterWidth:a,pixelRatio:c,scrollBeyondLastLine:w,paddingTop:C.top,paddingBottom:C.bottom,minimap:S,verticalScrollbarWidth:x,viewLineCount:d,remainingWidth:Q,isViewportWrapping:te},t.memory||new bge);Ce.renderMinimap!==0&&Ce.minimapLeft===0&&(V+=Ce.minimapWidth,K+=Ce.minimapWidth,z+=Ce.minimapWidth,j+=Ce.minimapWidth);const xe=Q-Ce.minimapWidth,je=Math.max(1,Math.floor((xe-x-2)/a)),ke=E?I:0;return te&&(ce=Math.max(1,je),f==="bounded"&&(ce=Math.min(ce,g))),{width:i,height:s,glyphMarginLeft:V,glyphMarginWidth:B,glyphMarginDecorationLaneCount:t.glyphMarginDecorationLaneCount,lineNumbersLeft:K,lineNumbersWidth:P,decorationsLeft:z,decorationsWidth:W,contentLeft:j,contentWidth:xe,minimap:Ce,viewportColumn:je,isWordWrapMinified:Y,isViewportWrapping:te,wrappingColumn:ce,verticalScrollbarWidth:x,horizontalScrollbarHeight:R,overviewRuler:{top:ke,width:x,height:s-2*ke,right:0}}}}class EAe extends $i{constructor(){super(156,"wrappingStrategy","simple",{"editor.wrappingStrategy":{enumDescriptions:[_(255,"Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width."),_(256,"Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.")],type:"string",enum:["simple","advanced"],default:"simple",description:_(257,"Controls the algorithm that computes wrapping points. Note that when in accessibility mode, advanced will be used for the best experience.")}})}validate(e){return Di(e,"simple",["simple","advanced"])}compute(e,t,i){return t.get(2)===2?"advanced":i}}var Dc;(function(n){n.Off="off",n.OnCode="onCode",n.On="on"})(Dc||(Dc={}));class IAe extends $i{constructor(){const e={enabled:Dc.OnCode};super(73,"lightbulb",e,{"editor.lightbulb.enabled":{type:"string",enum:[Dc.Off,Dc.OnCode,Dc.On],default:e.enabled,enumDescriptions:[_(258,"Disable the code action menu."),_(259,"Show the code action menu when the cursor is on lines with code."),_(260,"Show the code action menu when the cursor is on lines with code or on empty lines.")],description:_(261,"Enables the Code Action lightbulb in the editor.")}})}validate(e){return!e||typeof e!="object"?this.defaultValue:{enabled:Di(e.enabled,this.defaultValue.enabled,[Dc.Off,Dc.OnCode,Dc.On])}}}class NAe extends $i{constructor(){const e={enabled:!0,maxLineCount:5,defaultModel:"outlineModel",scrollWithEditor:!0};super(131,"stickyScroll",e,{"editor.stickyScroll.enabled":{type:"boolean",default:e.enabled,description:_(262,"Shows the nested current scopes during the scroll at the top of the editor.")},"editor.stickyScroll.maxLineCount":{type:"number",default:e.maxLineCount,minimum:1,maximum:20,description:_(263,"Defines the maximum number of sticky lines to show.")},"editor.stickyScroll.defaultModel":{type:"string",enum:["outlineModel","foldingProviderModel","indentationModel"],default:e.defaultModel,description:_(264,"Defines the model to use for determining which lines to stick. If the outline model does not exist, it will fall back on the folding provider model which falls back on the indentation model. This order is respected in all three cases.")},"editor.stickyScroll.scrollWithEditor":{type:"boolean",default:e.scrollWithEditor,description:_(265,"Enable scrolling of Sticky Scroll with the editor's horizontal scrollbar.")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return{enabled:Fe(t.enabled,this.defaultValue.enabled),maxLineCount:oi.clampedInt(t.maxLineCount,this.defaultValue.maxLineCount,1,20),defaultModel:Di(t.defaultModel,this.defaultValue.defaultModel,["outlineModel","foldingProviderModel","indentationModel"]),scrollWithEditor:Fe(t.scrollWithEditor,this.defaultValue.scrollWithEditor)}}}class DAe extends $i{constructor(){const e={enabled:"on",fontSize:0,fontFamily:"",padding:!1,maximumLength:43};super(159,"inlayHints",e,{"editor.inlayHints.enabled":{type:"string",default:e.enabled,description:_(266,"Enables the inlay hints in the editor."),enum:["on","onUnlessPressed","offUnlessPressed","off"],markdownEnumDescriptions:[_(267,"Inlay hints are enabled"),_(268,"Inlay hints are showing by default and hide when holding {0}",wt?"Ctrl+Option":"Ctrl+Alt"),_(269,"Inlay hints are hidden by default and show when holding {0}",wt?"Ctrl+Option":"Ctrl+Alt"),_(270,"Inlay hints are disabled")]},"editor.inlayHints.fontSize":{type:"number",default:e.fontSize,markdownDescription:_(271,"Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.","`#editor.fontSize#`","`5`")},"editor.inlayHints.fontFamily":{type:"string",default:e.fontFamily,markdownDescription:_(272,"Controls font family of inlay hints in the editor. When set to empty, the {0} is used.","`#editor.fontFamily#`")},"editor.inlayHints.padding":{type:"boolean",default:e.padding,description:_(273,"Enables the padding around the inlay hints in the editor.")},"editor.inlayHints.maximumLength":{type:"number",default:e.maximumLength,markdownDescription:_(274,"Maximum overall length of inlay hints, for a single line, before they get truncated by the editor. Set to `0` to never truncate")}})}validate(e){if(!e||typeof e!="object")return this.defaultValue;const t=e;return typeof t.enabled=="boolean"&&(t.enabled=t.enabled?"on":"off"),{enabled:Di(t.enabled,this.defaultValue.enabled,["on","off","offUnlessPressed","onUnlessPressed"]),fontSize:oi.clampedInt(t.fontSize,this.defaultValue.fontSize,0,100),fontFamily:Vo.string(t.fontFamily,this.defaultValue.fontFamily),padding:Fe(t.padding,this.defaultValue.padding),maximumLength:oi.clampedInt(t.maximumLength,this.defaultValue.maximumLength,0,Number.MAX_SAFE_INTEGER)}}}class TAe extends $i{constructor(){super(74,"lineDecorationsWidth",10)}validate(e){return typeof e=="string"&&/^\d+(\.\d+)?ch$/.test(e)?-parseFloat(e.substring(0,e.length-2)):oi.clampedInt(e,this.defaultValue,0,1e3)}compute(e,t,i){return i<0?oi.clampedInt(-i*e.fontInfo.typicalHalfwidthCharacterWidth,this.defaultValue,0,1e3):i}}class RAe extends Br{constructor(){super(75,"lineHeight",Hr.lineHeight,e=>Br.clamp(e,0,150),{markdownDescription:_(275,`Controls the line height. - - Use 0 to automatically compute the line height from the font size. - - Values between 0 and 8 will be used as a multiplier with the font size. - - Values greater than or equal to 8 will be used as effective values.`)},0,150)}compute(e,t,i){return e.fontInfo.lineHeight}}class MAe extends $i{constructor(){const e={enabled:!0,size:"proportional",side:"right",showSlider:"mouseover",autohide:"none",renderCharacters:!0,maxColumn:120,scale:1,showRegionSectionHeaders:!0,showMarkSectionHeaders:!0,markSectionHeaderRegex:"\\bMARK:\\s*(?-?)\\s*(?