From 5dd88c0b610ffec28fa8ecb6ba57193f088818be Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:15:30 -0400 Subject: [PATCH 01/24] feat: pass legacy license keys to Herald for updates and downloads Lets customers with legacy per-plugin license keys (reported via the lw-harbor/legacy_licenses filter) receive update checks and download their packages via Herald's /legacy/download endpoint, even without a Unified key. Active legacy entries grant catalog feature availability for their matching slug and take precedence over Unified URLs in Herald_Url_Builder. The legacy key must be non-empty and is_active must be true for the grant to apply. --- .../Features/Resolve_Feature_Collection.php | 48 ++- src/Harbor/Features/Update/Plugin_Handler.php | 29 +- src/Harbor/Features/Update/Theme_Handler.php | 29 +- src/Harbor/Portal/Herald_Url_Builder.php | 63 +++- .../Features/Feature_RepositoryTest.php | 3 +- .../Resolve_Feature_CollectionTest.php | 317 ++++++++++++++++++ .../Features/Update/Plugin_HandlerTest.php | 148 +++++++- .../Features/Update/Theme_HandlerTest.php | 142 +++++++- .../wpunit/Portal/Herald_Url_BuilderTest.php | 140 +++++++- 9 files changed, 875 insertions(+), 44 deletions(-) create mode 100644 tests/wpunit/Features/Resolve_Feature_CollectionTest.php diff --git a/src/Harbor/Features/Resolve_Feature_Collection.php b/src/Harbor/Features/Resolve_Feature_Collection.php index 929706f4..87e87733 100644 --- a/src/Harbor/Features/Resolve_Feature_Collection.php +++ b/src/Harbor/Features/Resolve_Feature_Collection.php @@ -10,6 +10,7 @@ use LiquidWeb\Harbor\Features\Types\Plugin; use LiquidWeb\Harbor\Features\Types\Service; use LiquidWeb\Harbor\Features\Types\Theme; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\Enums\Validation_Status; use LiquidWeb\Harbor\Licensing\Error_Code as Licensing_Error_Code; use LiquidWeb\Harbor\Licensing\License_Manager; @@ -24,6 +25,8 @@ * For each catalog feature, computes is_available and in_catalog_tier by checking * the product entry's capabilities array and the user's licensed tier rank. * dot.org and free-tier (rank 0) features are unconditionally available regardless of capabilities. + * An active legacy license whose slug matches the catalog feature also grants availability + * (and counts as in-tier), regardless of Unified capabilities or tier rank. * * @since 1.0.0 */ @@ -58,6 +61,15 @@ class Resolve_Feature_Collection { */ private Data $site_data; + /** + * The legacy license repository. + * + * @since TBD + * + * @var Legacy_License_Repository + */ + private Legacy_License_Repository $legacy_repository; + /** * Map of catalog type strings to Feature subclass names. * @@ -76,18 +88,21 @@ class Resolve_Feature_Collection { * * @since 1.0.0 * - * @param Catalog_Repository $catalog The catalog repository. - * @param License_Manager $licensing The license manager. - * @param Data $site_data The site data provider. + * @param Catalog_Repository $catalog The catalog repository. + * @param License_Manager $licensing The license manager. + * @param Data $site_data The site data provider. + * @param Legacy_License_Repository $legacy_repository The legacy license repository. */ public function __construct( Catalog_Repository $catalog, License_Manager $licensing, - Data $site_data + Data $site_data, + Legacy_License_Repository $legacy_repository ) { - $this->catalog = $catalog; - $this->licensing = $licensing; - $this->site_data = $site_data; + $this->catalog = $catalog; + $this->licensing = $licensing; + $this->site_data = $site_data; + $this->legacy_repository = $legacy_repository; } /** @@ -248,7 +263,9 @@ private function is_license_invalid( ?string $validation_status ): bool { * and computes is_available and in_catalog_tier. * * dot.org and free-tier (rank 0) features are unconditionally available regardless of capabilities. - * When capabilities is null (no license), all paid-tier features are unavailable and not in tier. + * An active legacy license whose slug matches the catalog feature also grants availability and + * counts as in-tier, regardless of Unified capabilities or tier rank. The legacy key must be + * non-empty for the grant to apply. * * @since 1.0.0 * @@ -282,17 +299,22 @@ private function hydrate_feature( $minimum_tier = $product->get_tier_by_slug( $catalog_feature->get_minimum_tier() ); $minimum_rank = $minimum_tier !== null ? $minimum_tier->get_rank() : PHP_INT_MAX; + $legacy_license = $this->legacy_repository->find( $catalog_feature->get_slug() ); + $has_legacy_grant = $legacy_license !== null + && $legacy_license->is_active + && $legacy_license->key !== ''; + if ( $catalog_feature->is_wporg() || $minimum_rank === 0 ) { // WordPress.org and free-tier features are unconditionally available — capabilities and tier are irrelevant. $is_available = true; $in_catalog_tier = true; } elseif ( $capabilities === null ) { - // No license: paid-tier features are neither available nor in tier. - $is_available = false; - $in_catalog_tier = false; + // No Unified license: paid-tier features only available when a legacy key covers them. + $is_available = $has_legacy_grant; + $in_catalog_tier = $has_legacy_grant; } else { - $is_available = in_array( $catalog_feature->get_slug(), $capabilities, true ); - $in_catalog_tier = ( $license_tier_rank >= $minimum_rank ); + $is_available = in_array( $catalog_feature->get_slug(), $capabilities, true ) || $has_legacy_grant; + $in_catalog_tier = $license_tier_rank >= $minimum_rank || $has_legacy_grant; } $data = [ diff --git a/src/Harbor/Features/Update/Plugin_Handler.php b/src/Harbor/Features/Update/Plugin_Handler.php index ab14fc85..252f08c3 100644 --- a/src/Harbor/Features/Update/Plugin_Handler.php +++ b/src/Harbor/Features/Update/Plugin_Handler.php @@ -5,6 +5,7 @@ use LiquidWeb\Harbor\Features\Contracts\Installable; use LiquidWeb\Harbor\Features\Feature_Repository; use LiquidWeb\Harbor\Features\Types\Feature; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\License_Manager; use LiquidWeb\Harbor\Traits\With_Debugging; use stdClass; @@ -49,25 +50,37 @@ class Plugin_Handler { */ private License_Manager $license_manager; + /** + * The legacy license repository. + * + * @since TBD + * + * @var Legacy_License_Repository + */ + private Legacy_License_Repository $legacy_repository; + /** * Constructor for the consolidated update handler. * * @since 1.0.0 * - * @param Resolve_Update_Data $resolver The update data resolver. - * @param Feature_Repository $feature_repository The feature repository. - * @param License_Manager $license_manager The license manager. + * @param Resolve_Update_Data $resolver The update data resolver. + * @param Feature_Repository $feature_repository The feature repository. + * @param License_Manager $license_manager The license manager. + * @param Legacy_License_Repository $legacy_repository The legacy license repository. * * @return void */ public function __construct( Resolve_Update_Data $resolver, Feature_Repository $feature_repository, - License_Manager $license_manager + License_Manager $license_manager, + Legacy_License_Repository $legacy_repository ) { $this->resolver = $resolver; $this->feature_repository = $feature_repository; $this->license_manager = $license_manager; + $this->legacy_repository = $legacy_repository; } /** @@ -88,7 +101,9 @@ public function filter_plugins_api( $result, ?string $action = null, $args = nul return $result; } - if ( empty( $this->license_manager->get_key() ) ) { + // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. + // The downstream resolver still checks is_active per-feature before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { return $result; } @@ -167,7 +182,9 @@ public function filter_update_check( $transient ) { $transient = new stdClass(); } - if ( empty( $this->license_manager->get_key() ) ) { + // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. + // The downstream resolver still checks is_active per-feature before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { return $transient; } diff --git a/src/Harbor/Features/Update/Theme_Handler.php b/src/Harbor/Features/Update/Theme_Handler.php index a2fef26a..5e373b48 100644 --- a/src/Harbor/Features/Update/Theme_Handler.php +++ b/src/Harbor/Features/Update/Theme_Handler.php @@ -5,6 +5,7 @@ use LiquidWeb\Harbor\Features\Contracts\Installable; use LiquidWeb\Harbor\Features\Feature_Repository; use LiquidWeb\Harbor\Features\Types\Feature; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\License_Manager; use LiquidWeb\Harbor\Traits\With_Debugging; use stdClass; @@ -50,25 +51,37 @@ class Theme_Handler { */ private License_Manager $license_manager; + /** + * The legacy license repository. + * + * @since TBD + * + * @var Legacy_License_Repository + */ + private Legacy_License_Repository $legacy_repository; + /** * Constructor for the consolidated theme update handler. * * @since 1.0.0 * - * @param Resolve_Update_Data $resolver The update data resolver. - * @param Feature_Repository $feature_repository The feature repository. - * @param License_Manager $license_manager The license manager. + * @param Resolve_Update_Data $resolver The update data resolver. + * @param Feature_Repository $feature_repository The feature repository. + * @param License_Manager $license_manager The license manager. + * @param Legacy_License_Repository $legacy_repository The legacy license repository. * * @return void */ public function __construct( Resolve_Update_Data $resolver, Feature_Repository $feature_repository, - License_Manager $license_manager + License_Manager $license_manager, + Legacy_License_Repository $legacy_repository ) { $this->resolver = $resolver; $this->feature_repository = $feature_repository; $this->license_manager = $license_manager; + $this->legacy_repository = $legacy_repository; } /** @@ -89,7 +102,9 @@ public function filter_themes_api( $result, ?string $action = null, $args = null return $result; } - if ( empty( $this->license_manager->get_key() ) ) { + // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. + // The downstream resolver still checks is_active per-feature before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { return $result; } @@ -156,7 +171,9 @@ public function filter_update_check( $transient ) { $transient = new stdClass(); } - if ( empty( $this->license_manager->get_key() ) ) { + // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. + // The downstream resolver still checks is_active per-feature before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { return $transient; } diff --git a/src/Harbor/Portal/Herald_Url_Builder.php b/src/Harbor/Portal/Herald_Url_Builder.php index 410969c7..d73f9f90 100644 --- a/src/Harbor/Portal/Herald_Url_Builder.php +++ b/src/Harbor/Portal/Herald_Url_Builder.php @@ -3,6 +3,7 @@ namespace LiquidWeb\Harbor\Portal; use LiquidWeb\Harbor\Config; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\Repositories\License_Repository; use LiquidWeb\Harbor\Portal\Contracts\Download_Url_Builder; use LiquidWeb\Harbor\Site\Data; @@ -10,19 +11,21 @@ /** * Builds Herald download URLs for catalog features. * - * Herald is the StellarWP download service. It accepts the license key as a - * path segment and the site domain as a query parameter, which allows Harbor - * to construct authenticated download URLs entirely from local data without - * relying on the catalog API response. + * Herald is the StellarWP download service. Two URL formats are produced depending + * on which license type covers the requested slug: * - * URL format: {herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} + * - Unified license: {herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} + * - Legacy license: {herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site={domain} + * + * Legacy keys take precedence when both are present so a legacy-only customer's + * stored key drives their downloads even when a Unified key is also installed. * * @since 1.0.0 */ final class Herald_Url_Builder implements Download_Url_Builder { /** - * The license key provider. + * The Unified license key provider. * * @since 1.0.0 * @@ -30,6 +33,15 @@ final class Herald_Url_Builder implements Download_Url_Builder { */ private License_Repository $license_repository; + /** + * The legacy license repository. + * + * @since TBD + * + * @var Legacy_License_Repository + */ + private Legacy_License_Repository $legacy_repository; + /** * Site data provider. * @@ -44,18 +56,27 @@ final class Herald_Url_Builder implements Download_Url_Builder { * * @since 1.0.0 * - * @param License_Repository $license_repository The license key provider. - * @param Data $site_data Site data provider. + * @param License_Repository $license_repository The Unified license key provider. + * @param Legacy_License_Repository $legacy_repository The legacy license repository. + * @param Data $site_data Site data provider. */ - public function __construct( License_Repository $license_repository, Data $site_data ) { + public function __construct( + License_Repository $license_repository, + Legacy_License_Repository $legacy_repository, + Data $site_data + ) { $this->license_repository = $license_repository; + $this->legacy_repository = $legacy_repository; $this->site_data = $site_data; } /** * Builds a Herald download URL for the given feature slug. * - * Returns an empty string if no license key is stored or no domain is available. + * Returns the legacy `/legacy/download` URL when a matching active legacy + * license exists for the slug. Otherwise falls back to the Unified + * `/download/{slug}/latest/{key}/zip` URL. Returns an empty string when + * neither a license nor a domain is available. * * @since 1.0.0 * @@ -64,10 +85,28 @@ public function __construct( License_Repository $license_repository, Data $site_ * @return string */ public function build( string $slug ): string { + $domain = $this->site_data->get_domain(); + + if ( $domain === '' ) { + return ''; + } + + $legacy = $this->legacy_repository->find( $slug ); + + if ( $legacy !== null && $legacy->is_active && $legacy->key !== '' ) { + return add_query_arg( + [ + 'plugin' => rawurlencode( $slug ), + 'key' => rawurlencode( $legacy->key ), + 'site' => rawurlencode( $domain ), + ], + Config::get_herald_base_url() . '/legacy/download' + ); + } + $license_key = $this->license_repository->get_key(); - $domain = $this->site_data->get_domain(); - if ( $license_key === null || $domain === '' ) { + if ( $license_key === null ) { return ''; } diff --git a/tests/wpunit/Features/Feature_RepositoryTest.php b/tests/wpunit/Features/Feature_RepositoryTest.php index 3974ac89..41d91475 100644 --- a/tests/wpunit/Features/Feature_RepositoryTest.php +++ b/tests/wpunit/Features/Feature_RepositoryTest.php @@ -14,6 +14,7 @@ use LiquidWeb\Harbor\Features\Feature_Repository; use LiquidWeb\Harbor\Features\Resolve_Feature_Collection; use LiquidWeb\Harbor\Features\Types\Plugin; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Tests\Licensing\Fixture_Client as Licensing_Fixture; use LiquidWeb\Harbor\Licensing\License_Manager; use LiquidWeb\Harbor\Licensing\Registry\Product_Registry; @@ -60,7 +61,7 @@ private function make_resolver( License_Manager $licensing ): Resolve_Feature_Collection { $site_data = $this->makeEmpty( \LiquidWeb\Harbor\Site\Data::class, [ 'get_domain' => 'example.com' ] ); - $resolver = new Resolve_Feature_Collection( $catalog, $licensing, $site_data ); + $resolver = new Resolve_Feature_Collection( $catalog, $licensing, $site_data, new Legacy_License_Repository() ); $resolver->register_type( 'plugin', Plugin::class ); $resolver->register_type( 'theme', Plugin::class ); diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php new file mode 100644 index 00000000..6a15d174 --- /dev/null +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -0,0 +1,317 @@ + $overrides Field overrides applied to the default entry. + * + * @return void + */ + private function register_legacy_license( array $overrides = [] ): void { + $defaults = [ + 'key' => 'legacy-key-1234', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + $entry = array_merge( $defaults, $overrides ); + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $entry ) { + $licenses[] = $entry; + + return $licenses; + } + ); + } + + /** + * Builds a minimal Product_Catalog with one paid-tier plugin feature at the + * "basic" tier (rank 1) of the "kadence" product, and an optional free-tier + * feature so the wporg / free-tier path can be exercised. + * + * @return Catalog_Collection + */ + private function make_catalog(): Catalog_Collection { + $product = Product_Catalog::from_array( + [ + 'product_id' => 'prod-1', + 'product_slug' => 'kadence', + 'product_name' => 'Kadence', + 'tiers' => [ + [ + 'tier_slug' => 'free', + 'name' => 'Free', + 'rank' => 0, + ], + [ + 'tier_slug' => 'basic', + 'name' => 'Basic', + 'rank' => 1, + ], + [ + 'tier_slug' => 'pro', + 'name' => 'Pro', + 'rank' => 2, + ], + ], + 'features' => [ + [ + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'description' => 'Pro-only blocks.', + 'kind' => 'plugin', + 'minimum_tier' => 'basic', + 'version' => '1.0.0', + ], + [ + 'slug' => 'kadence-blocks', + 'name' => 'Kadence Blocks', + 'description' => 'Free blocks.', + 'kind' => 'plugin', + 'minimum_tier' => 'free', + 'wporg_slug' => 'kadence-blocks', + 'version' => '3.4.6', + ], + ], + ] + ); + + $catalog = new Catalog_Collection(); + $catalog->add( $product ); + + return $catalog; + } + + /** + * Builds a License_Manager stub whose get_products() returns the supplied + * Product_Collection regardless of domain. + * + * @param Product_Collection $products The product collection to return. + * + * @return License_Manager + */ + private function make_license_manager_returning( Product_Collection $products ): License_Manager { + return $this->makeEmpty( + License_Manager::class, + [ 'get_products' => $products ] + ); + } + + /** + * Builds a Catalog_Repository stub whose get() returns the supplied collection. + * + * @param Catalog_Collection $catalog The catalog collection to return. + * + * @return Catalog_Repository + */ + private function make_catalog_repository_returning( Catalog_Collection $catalog ): Catalog_Repository { + return $this->makeEmpty( + Catalog_Repository::class, + [ 'get' => $catalog ] + ); + } + + /** + * Builds a Resolve_Feature_Collection wired with the supplied catalog and + * licensing product collection. Uses a real Legacy_License_Repository so + * the `lw-harbor/legacy_licenses` filter drives behavior. + * + * @param Catalog_Collection $catalog The catalog collection. + * @param Product_Collection $products The licensing products to expose. + * + * @return Resolve_Feature_Collection + */ + private function make_resolver( + Catalog_Collection $catalog, + Product_Collection $products + ): Resolve_Feature_Collection { + $resolver = new Resolve_Feature_Collection( + $this->make_catalog_repository_returning( $catalog ), + $this->make_license_manager_returning( $products ), + $this->makeEmpty( Data::class, [ 'get_domain' => 'example.com' ] ), + new Legacy_License_Repository() + ); + + $resolver->register_type( Feature::TYPE_PLUGIN, Plugin::class ); + $resolver->register_type( Feature::TYPE_THEME, Theme::class ); + + return $resolver; + } + + /** + * @return Product_Entry + */ + private function make_product_entry( string $tier, array $capabilities, string $validation_status = 'valid' ): Product_Entry { + return Product_Entry::from_array( + [ + 'product_slug' => 'kadence', + 'tier' => $tier, + 'status' => 'active', + 'expires' => '2026-12-31 23:59:59', + 'validation_status' => $validation_status, + 'activated_here' => true, + 'capabilities' => $capabilities, + ] + ); + } + + /** + * Asserts the resolved feature for `$slug` has the expected availability flags. + * + * @param Resolve_Feature_Collection $resolver + * @param string $slug + * @param bool $expected_available + * @param bool $expected_in_tier + */ + private function assert_resolved_feature_flags( + Resolve_Feature_Collection $resolver, + string $slug, + bool $expected_available, + bool $expected_in_tier + ): void { + $collection = ( $resolver )(); + + $this->assertInstanceOf( Feature_Collection::class, $collection ); + + $feature = $collection->get( $slug ); + + $this->assertNotNull( $feature, sprintf( 'Feature "%s" should exist in the resolved collection.', $slug ) ); + $this->assertSame( $expected_available, $feature->is_available(), 'is_available mismatch.' ); + $this->assertSame( $expected_in_tier, $feature->is_in_catalog_tier(), 'in_catalog_tier mismatch.' ); + } + + public function test_paid_feature_active_legacy_with_no_unified_license_is_available(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); + } + + public function test_paid_feature_inactive_legacy_with_no_unified_license_is_unavailable(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'is_active' => false, + ] + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); + } + + public function test_paid_feature_legacy_with_empty_key_does_not_grant_availability(): void { + $this->register_legacy_license( + [ + 'key' => '', + 'slug' => 'kad-blocks-pro', + ] + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); + } + + public function test_paid_feature_legacy_slug_mismatch_does_not_grant_availability(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'some-other-plugin', + ] + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); + } + + public function test_paid_feature_active_legacy_overrides_missing_capability(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + // Unified license at the right tier rank but capability list omits the feature. + $products = new Product_Collection(); + $products->add( $this->make_product_entry( 'basic', [ 'some-other-capability' ] ) ); + + $resolver = $this->make_resolver( $this->make_catalog(), $products ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); + } + + public function test_paid_feature_active_legacy_overrides_insufficient_tier_rank(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + // Unified license has the capability but is below the catalog minimum tier (free vs basic). + $products = new Product_Collection(); + $products->add( $this->make_product_entry( 'free', [ 'kad-blocks-pro' ] ) ); + + $resolver = $this->make_resolver( $this->make_catalog(), $products ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); + } + + public function test_free_tier_feature_is_available_regardless_of_legacy_state(): void { + // No legacy license registered. The free-tier (rank 0) feature should still be available. + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kadence-blocks', true, true ); + } + + public function test_paid_feature_without_legacy_or_unified_license_is_unavailable(): void { + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); + } +} diff --git a/tests/wpunit/Features/Update/Plugin_HandlerTest.php b/tests/wpunit/Features/Update/Plugin_HandlerTest.php index 8237d6cc..ab5fb685 100644 --- a/tests/wpunit/Features/Update/Plugin_HandlerTest.php +++ b/tests/wpunit/Features/Update/Plugin_HandlerTest.php @@ -7,6 +7,7 @@ use LiquidWeb\Harbor\Features\Feature_Collection; use LiquidWeb\Harbor\Features\Types\Plugin; use LiquidWeb\Harbor\Features\Update\Plugin_Handler; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\License_Manager; use LiquidWeb\Harbor\Tests\HarborTestCase; use stdClass; @@ -35,7 +36,8 @@ protected function setUp(): void { $this->handler = new Plugin_Handler( $resolver, $feature_repository, - $this->container->get( License_Manager::class ) + $this->container->get( License_Manager::class ), + new Legacy_License_Repository() ); $this->create_test_plugin(); @@ -48,6 +50,7 @@ protected function setUp(): void { */ protected function tearDown(): void { $this->remove_test_plugin(); + remove_all_filters( 'lw-harbor/legacy_licenses' ); parent::tearDown(); } @@ -119,7 +122,8 @@ private function handler_with_feature( $check_updates_return ): Plugin_Handler { return new Plugin_Handler( $resolver, $feature_repository, - $license_manager + $license_manager, + new Legacy_License_Repository() ); } @@ -159,7 +163,8 @@ private function handler_with_wporg_feature( string $wporg_slug ): Plugin_Handle return new Plugin_Handler( $resolver, $feature_repository, - $license_manager + $license_manager, + new Legacy_License_Repository() ); } @@ -489,4 +494,141 @@ public function test_filter_update_check_skips_uninstalled_plugin(): void { $this->assertArrayNotHasKey( 'my-plugin/my-plugin.php', $result->response, 'Uninstalled plugin must not appear in response.' ); $this->assertArrayNotHasKey( 'my-plugin/my-plugin.php', $result->no_update, 'Uninstalled plugin must not appear in no_update.' ); } + + /** + * Registers a single active legacy license entry for a given slug. + * + * @param string $slug The slug to report. + * @param string $key The license key value. + * + * @return void + */ + private function register_legacy_license( string $slug, string $key = 'legacy-key-123' ): void { + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $slug, $key ) { + $licenses[] = [ + 'key' => $key, + 'slug' => $slug, + 'name' => 'Legacy ' . $slug, + 'product' => 'legacy-product', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + return $licenses; + } + ); + } + + /** + * Builds a Plugin_Handler that has NO Unified key but DOES expose the + * given feature through the Feature_Repository. + * + * @param array|WP_Error $check_updates_return The Resolve_Update_Data return value. + * + * @return Plugin_Handler + */ + private function handler_with_feature_and_no_unified_key( $check_updates_return ): Plugin_Handler { + $feature = new Plugin( + [ + 'slug' => 'my-plugin', + 'product' => 'test', + 'tier' => 'basic', + 'name' => 'My Plugin', + 'description' => 'A test plugin.', + 'plugin_file' => 'my-plugin/my-plugin.php', + 'is_available' => true, + ] + ); + + $features = new Feature_Collection(); + $features->add( $feature ); + + $resolver = $this->makeEmpty( Resolve_Update_Data::class, [ '__invoke' => $check_updates_return ] ); + $feature_repository = $this->makeEmpty( Feature_Repository::class, [ 'get' => $features ] ); + + $license_manager = $this->container->get( License_Manager::class ); + $license_manager->delete_key(); + + return new Plugin_Handler( + $resolver, + $feature_repository, + $license_manager, + new Legacy_License_Repository() + ); + } + + /** + * Tests filter_plugins_api proceeds past the early-return guard when no + * Unified key is stored but at least one legacy license entry exists. + * + * @return void + */ + public function test_filter_plugins_api_proceeds_when_only_legacy_license_present(): void { + $this->register_legacy_license( 'my-plugin' ); + + $update_data = [ + 'my-plugin' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-plugin.zip', + 'name' => 'My Plugin', + 'plugin_file' => 'my-plugin/my-plugin.php', + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $args = new stdClass(); + $args->slug = 'my-plugin'; + + $result = $handler->filter_plugins_api( false, 'plugin_information', $args ); + + $this->assertInstanceOf( stdClass::class, $result, 'Legacy-only state should let plugins_api populate a response.' ); + $this->assertSame( 'my-plugin', $result->slug ); + $this->assertSame( '2.0.0', $result->version ); + } + + /** + * Tests filter_update_check proceeds past the early-return guard when no + * Unified key is stored but at least one legacy license entry exists. + * + * @return void + */ + public function test_filter_update_check_proceeds_when_only_legacy_license_present(): void { + $this->register_legacy_license( 'my-plugin' ); + + $update_data = [ + 'my-plugin' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-plugin.zip', + 'plugin_file' => 'my-plugin/my-plugin.php', + 'has_update' => true, + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $result = $handler->filter_update_check( new stdClass() ); + + $this->assertObjectHasProperty( 'response', $result ); + $this->assertArrayHasKey( 'my-plugin/my-plugin.php', $result->response ); + $this->assertSame( '2.0.0', $result->response['my-plugin/my-plugin.php']->new_version ); + } + + /** + * Tests filter_update_check short-circuits when neither a Unified key nor + * any legacy entries exist, leaving the transient untouched. + * + * @return void + */ + public function test_filter_update_check_returns_transient_when_no_unified_key_and_no_legacy(): void { + $transient = new stdClass(); + $transient->response = []; + + $result = $this->handler->filter_update_check( $transient ); + + $this->assertSame( $transient, $result ); + } } diff --git a/tests/wpunit/Features/Update/Theme_HandlerTest.php b/tests/wpunit/Features/Update/Theme_HandlerTest.php index 9b9ec0d4..b0702d8b 100644 --- a/tests/wpunit/Features/Update/Theme_HandlerTest.php +++ b/tests/wpunit/Features/Update/Theme_HandlerTest.php @@ -7,6 +7,7 @@ use LiquidWeb\Harbor\Features\Feature_Collection; use LiquidWeb\Harbor\Features\Types\Theme; use LiquidWeb\Harbor\Features\Update\Theme_Handler; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\License_Manager; use LiquidWeb\Harbor\Tests\HarborTestCase; use stdClass; @@ -42,7 +43,8 @@ protected function setUp(): void { $this->handler = new Theme_Handler( $resolver, $feature_repository, - $this->container->get( License_Manager::class ) + $this->container->get( License_Manager::class ), + new Legacy_License_Repository() ); $this->create_test_theme(); @@ -55,6 +57,7 @@ protected function setUp(): void { */ protected function tearDown(): void { $this->remove_test_theme(); + remove_all_filters( 'lw-harbor/legacy_licenses' ); parent::tearDown(); } @@ -146,7 +149,8 @@ private function handler_with_feature( $check_updates_return ): Theme_Handler { return new Theme_Handler( $resolver, $feature_repository, - $license_manager + $license_manager, + new Legacy_License_Repository() ); } @@ -433,4 +437,138 @@ public function test_filter_update_check_skips_uninstalled_theme(): void { $this->assertArrayNotHasKey( 'my-theme', $result->response, 'Uninstalled theme must not appear in response.' ); $this->assertArrayNotHasKey( 'my-theme', $result->no_update, 'Uninstalled theme must not appear in no_update.' ); } + + /** + * Registers a single active legacy license entry for a given slug. + * + * @param string $slug The slug to report. + * @param string $key The license key value. + * + * @return void + */ + private function register_legacy_license( string $slug, string $key = 'legacy-key-123' ): void { + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $slug, $key ) { + $licenses[] = [ + 'key' => $key, + 'slug' => $slug, + 'name' => 'Legacy ' . $slug, + 'product' => 'legacy-product', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + return $licenses; + } + ); + } + + /** + * Builds a Theme_Handler that has NO Unified key but DOES expose the + * given feature through the Feature_Repository. + * + * @param array|WP_Error $check_updates_return The Resolve_Update_Data return value. + * + * @return Theme_Handler + */ + private function handler_with_feature_and_no_unified_key( $check_updates_return ): Theme_Handler { + $feature = new Theme( + [ + 'slug' => 'my-theme', + 'product' => 'test', + 'tier' => 'basic', + 'name' => 'My Theme', + 'description' => 'A test theme.', + 'is_available' => true, + ] + ); + + $features = new Feature_Collection(); + $features->add( $feature ); + + $resolver = $this->makeEmpty( Resolve_Update_Data::class, [ '__invoke' => $check_updates_return ] ); + $feature_repository = $this->makeEmpty( Feature_Repository::class, [ 'get' => $features ] ); + + $license_manager = $this->container->get( License_Manager::class ); + $license_manager->delete_key(); + + return new Theme_Handler( + $resolver, + $feature_repository, + $license_manager, + new Legacy_License_Repository() + ); + } + + /** + * Tests filter_themes_api proceeds past the early-return guard when no + * Unified key is stored but at least one legacy license entry exists. + * + * @return void + */ + public function test_filter_themes_api_proceeds_when_only_legacy_license_present(): void { + $this->register_legacy_license( 'my-theme' ); + + $update_data = [ + 'my-theme' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-theme.zip', + 'name' => 'My Theme', + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $args = new stdClass(); + $args->slug = 'my-theme'; + + $result = $handler->filter_themes_api( false, 'theme_information', $args ); + + $this->assertInstanceOf( stdClass::class, $result, 'Legacy-only state should let themes_api populate a response.' ); + $this->assertSame( 'my-theme', $result->slug ); + $this->assertSame( '2.0.0', $result->version ); + } + + /** + * Tests filter_update_check proceeds past the early-return guard when no + * Unified key is stored but at least one legacy license entry exists. + * + * @return void + */ + public function test_filter_update_check_proceeds_when_only_legacy_license_present(): void { + $this->register_legacy_license( 'my-theme' ); + + $update_data = [ + 'my-theme' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-theme.zip', + 'has_update' => true, + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $result = $handler->filter_update_check( new stdClass() ); + + $this->assertObjectHasProperty( 'response', $result ); + $this->assertArrayHasKey( 'my-theme', $result->response ); + $this->assertSame( '2.0.0', $result->response['my-theme']['new_version'] ); + } + + /** + * Tests filter_update_check short-circuits when neither a Unified key nor + * any legacy entries exist, leaving the transient untouched. + * + * @return void + */ + public function test_filter_update_check_returns_transient_when_no_unified_key_and_no_legacy(): void { + $transient = new stdClass(); + $transient->response = []; + + $result = $this->handler->filter_update_check( $transient ); + + $this->assertSame( $transient, $result ); + } } diff --git a/tests/wpunit/Portal/Herald_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Url_BuilderTest.php index 598c5590..466c7efc 100644 --- a/tests/wpunit/Portal/Herald_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Url_BuilderTest.php @@ -3,6 +3,7 @@ namespace LiquidWeb\Harbor\Tests\Portal; use LiquidWeb\Harbor\Config; +use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\Repositories\License_Repository; use LiquidWeb\Harbor\Portal\Herald_Url_Builder; use LiquidWeb\Harbor\Site\Data; @@ -21,6 +22,7 @@ protected function setUp(): void { protected function tearDown(): void { delete_option( License_Repository::KEY_OPTION_NAME ); + remove_all_filters( 'lw-harbor/legacy_licenses' ); Config::reset(); parent::tearDown(); } @@ -37,7 +39,35 @@ private function make_builder( ?string $license_key, string $domain ): Herald_Ur [ 'get_domain' => $domain ] ); - return new Herald_Url_Builder( new License_Repository(), $site_data ); + return new Herald_Url_Builder( new License_Repository(), new Legacy_License_Repository(), $site_data ); + } + + /** + * Registers a single legacy license entry via the filter. + * + * @param array $overrides Field overrides on the default entry. + */ + private function register_legacy_license( array $overrides = [] ): void { + $defaults = [ + 'key' => 'legacy-key-1234', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + $entry = array_merge( $defaults, $overrides ); + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $entry ) { + $licenses[] = $entry; + + return $licenses; + } + ); } public function test_build_returns_correct_url(): void { @@ -101,4 +131,112 @@ public function test_build_strips_trailing_slash_from_base_url(): void { $this->assertStringStartsWith( 'https://herald.example.com/download/', $url ); $this->assertStringNotContainsString( '//download/', $url ); } + + public function test_build_returns_legacy_url_for_matching_active_legacy_license(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( null, self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertSame( + self::TEST_HERALD_BASE . '/legacy/download?plugin=kad-blocks-pro&key=legacy-key-abc&site=' . self::TEST_DOMAIN, + $url + ); + } + + public function test_build_prefers_legacy_url_when_both_legacy_and_unified_present(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/legacy/download?', $url ); + $this->assertStringContainsString( 'key=legacy-key-abc', $url ); + $this->assertStringNotContainsString( self::TEST_LICENSE_KEY, $url ); + } + + public function test_build_falls_back_to_unified_url_when_legacy_is_inactive(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'is_active' => false, + ] + ); + + $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); + $this->assertStringNotContainsString( '/legacy/download', $url ); + } + + public function test_build_falls_back_to_unified_url_when_legacy_key_is_empty(): void { + $this->register_legacy_license( + [ + 'key' => '', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); + $this->assertStringNotContainsString( '/legacy/download', $url ); + } + + public function test_build_legacy_url_returns_unified_when_slug_does_not_match(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'some-other-plugin', + ] + ); + + $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); + $this->assertStringNotContainsString( '/legacy/download', $url ); + } + + public function test_build_legacy_url_rawurlencodes_all_params(): void { + $this->register_legacy_license( + [ + 'key' => 'KEY WITH SPACES', + 'slug' => 'slug with spaces', + ] + ); + + $builder = $this->make_builder( null, 'my site.example.com' ); + $url = $builder->build( 'slug with spaces' ); + + $this->assertStringContainsString( 'plugin=slug%20with%20spaces', $url ); + $this->assertStringContainsString( 'key=KEY%20WITH%20SPACES', $url ); + $this->assertStringContainsString( 'site=my%20site.example.com', $url ); + } + + public function test_build_returns_empty_when_domain_is_empty_even_with_legacy_license(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_LICENSE_KEY, '' ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } } From aafb5928418736d7a1c12190e5baa467c6162cbb Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:15:54 -0400 Subject: [PATCH 02/24] tweak: drop malformed legacy license entries at repository intake The lw-harbor/legacy_licenses filter contract requires both key and slug. Entries missing either field were previously cached and surfaced inconsistently (UI/notices showed them while access paths defensively rejected them). Drop them in License_Repository::all() so they never reach any downstream consumer. --- src/Harbor/Legacy/License_Repository.php | 18 +++++++-- .../wpunit/Legacy/License_RepositoryTest.php | 37 +++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/Harbor/Legacy/License_Repository.php b/src/Harbor/Legacy/License_Repository.php index de4d07b5..d0610ea0 100644 --- a/src/Harbor/Legacy/License_Repository.php +++ b/src/Harbor/Legacy/License_Repository.php @@ -34,10 +34,22 @@ public function all(): array { $licenses = []; foreach ( $filtered_licenses as $license ) { - if ( is_array( $license ) ) { - /** @var array $license */ - $licenses[] = Legacy_License::from_data( $license ); + if ( ! is_array( $license ) ) { + continue; } + + /** @var array $license */ + $candidate = Legacy_License::from_data( $license ); + + // Reject malformed entries that violate the integration contract. + // Both `key` and `slug` are documented as required; entries missing + // either are dropped here so they never reach UI, notices, or any + // downstream consumer. + if ( $candidate->key === '' || $candidate->slug === '' ) { + continue; + } + + $licenses[] = $candidate; } $this->cache = $licenses; diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index 736b91d9..b72e0fe2 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -133,6 +133,43 @@ static function ( array $licenses ) { $this->assertSame( 'valid-plugin', $result[0]->slug ); } + /** + * @since TBD + */ + public function test_drops_entries_with_empty_key_or_slug(): void { + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) { + $licenses[] = [ + 'key' => '', + 'slug' => 'missing-key', + 'name' => 'Missing Key', + 'product' => 'P', + ]; + $licenses[] = [ + 'key' => 'orphan', + 'slug' => '', + 'name' => 'Missing Slug', + 'product' => 'P', + ]; + $licenses[] = [ + 'key' => 'valid-key', + 'slug' => 'valid-plugin', + 'name' => 'Valid', + 'product' => 'P', + ]; + + return $licenses; + } + ); + + $result = $this->repository->all(); + + $this->assertCount( 1, $result, 'Malformed entries (empty key or empty slug) must be dropped at repository intake.' ); + $this->assertSame( 'valid-plugin', $result[0]->slug ); + $this->assertSame( 'valid-key', $result[0]->key ); + } + /** * @since 1.0.0 */ From f0fc769e3f76f76e00a613c3d050c8aed04b98bb Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:16:15 -0400 Subject: [PATCH 03/24] docs: describe legacy license behavior in availability and downloads Document how reported legacy keys feed into Resolve_Feature_Collection (availability grant), Plugin_Handler/Theme_Handler (update checks), and Herald_Url_Builder (download URL with precedence over Unified). Also clarify the semantics of is_active and what happens to malformed entries. --- docs/guides/integration.md | 12 ++++++++++++ docs/subsystems/features.md | 10 +++++++--- docs/subsystems/portal.md | 11 ++++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/guides/integration.md b/docs/guides/integration.md index 484c5ae6..7751bda0 100644 --- a/docs/guides/integration.md +++ b/docs/guides/integration.md @@ -130,6 +130,18 @@ add_filter('lw-harbor/legacy_licenses', function (array $licenses): array { > **Tip:** If a single license key covers multiple add-ons, emit one entry per add-on slug so each slug can display a legacy license badge on the Feature Manager page. +### How Harbor uses reported legacy keys + +Beyond surfacing legacy entries in the unified license UI, Harbor wires the reported key into feature availability and updates: + +1. **Availability.** An `is_active = true` entry marks the catalog feature matching its `slug` as available and in-tier, even when no unified license is installed (or when the installed unified tier does not include that feature). +2. **Updates.** Update checks proceed for matching slugs, and the package URL routes through Herald's `/legacy/download` endpoint using the reported key. Harbor does not depend on a legacy licensing server to validate or serve the download. +3. **Inactive entries.** An entry with `is_active = false` is treated as informational only. It surfaces in admin notices urging the user to renew or reactivate, but does not grant availability or updates. + +**What `is_active` means.** Harbor takes this flag at face value from your plugin. It should reflect whatever your existing licensing system already considers a valid, in-good-standing license: for example, the result of a recent successful validation against your licensing server. Harbor does not (and cannot) independently verify the key; it trusts the reporting plugin to decide whether the customer is currently entitled to use the product. Regardless of the `is_active` value reported here, Herald validates the key server-side when serving the actual ZIP download, so a falsely-reported `is_active = true` cannot be used to obtain a package the customer is not entitled to. + +**Malformed entries.** `key` and `slug` are both required (see the table above). Entries missing either field are not considered legacy licenses at all. They are dropped at repository intake and never appear in the UI, notices, availability checks, or download URLs. Only emit entries you have a real key for. + ### Admin notices for inactive legacy licenses Once you report licenses via this filter, Harbor automatically displays consolidated admin notices for any inactive licenses that are not already covered by a StellarWP v3 unified license. Notices are grouped by product, shown only to administrators, and are dismissible per user for 7 days. diff --git a/docs/subsystems/features.md b/docs/subsystems/features.md index 6063438e..f046d1e2 100644 --- a/docs/subsystems/features.md +++ b/docs/subsystems/features.md @@ -66,15 +66,18 @@ flowchart TD HasLicense -->|No| FreeTier{"min_tier at\nrank 0 (free)?"} InCaps -->|Yes| Available["Available"] - InCaps -->|No| Unavailable["Unavailable"] + InCaps -->|No| LegacyCheck{"Active legacy license\nfor this slug?"} FreeTier -->|Yes| AvailableFallback["Available\n(fallback)"] - FreeTier -->|No| UnavailableFallback["Unavailable"] + FreeTier -->|No| LegacyCheck + + LegacyCheck -->|Yes| AvailableLegacy["Available\n(legacy grant)"] + LegacyCheck -->|No| Unavailable["Unavailable"] Available --> EnabledCheck Unavailable --> EnabledCheck AvailableFallback --> EnabledCheck - UnavailableFallback --> EnabledCheck + AvailableLegacy --> EnabledCheck EnabledCheck{"Check local enabled state\n(per strategy)"} @@ -99,6 +102,7 @@ Edge cases: - No licensing entry for a product (unlicensed): the resolver falls back to tier rank comparison using rank 0, making only free-tier features (`minimum_tier` at rank 0) available. Paid-tier features are unavailable. - A feature capable but outside the catalog tier: it is available — capabilities override the catalog tier. - A feature in the customer's catalog tier but absent from capabilities: it is unavailable — capabilities are the authority. +- An active legacy license whose `slug` matches a catalog feature marks that feature as available and in-tier, even with no Unified license or with a Unified tier that doesn't include the feature. The legacy `key` must be non-empty and `is_active` must be `true` for the grant to apply. This lets legacy customers continue to receive updates through Harbor without a Unified key. See [Portal: Download URL Builder](portal.md#download-url-builder) for how the matching download URL is built. ## The Manager diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index 77180b33..366ed1aa 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -210,13 +210,18 @@ The catalog is the menu. Licensing is the receipt. Feature resolution is the wai Download URLs for exclusive (non-WordPress.org) features are not stored in the catalog response. They are built at runtime by an implementation of the `Download_Url_Builder` contract (`Portal\Contracts\Download_Url_Builder`). The contract is intentionally minimal — a single `build( string $slug ): string` method — so the download backend can be swapped without touching consumers. -The default implementation is `Herald_Url_Builder`, which constructs Herald download URLs using local data: +The default implementation is `Herald_Url_Builder`, which produces one of two URL formats depending on which license type covers the requested slug: ``` -{herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} +Unified: {herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} +Legacy: {herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site={domain} ``` -It reads the license key via the `License_Key_Provider` contract (satisfied by `License_Repository`) and the site domain from `Site\Data`. If either is unavailable (no key stored, or empty domain), it returns an empty string. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. +`Herald_Url_Builder` reads three inputs: the Unified license key via `Licensing\Repositories\License_Repository`, the active legacy license (if any) by slug via `Legacy\License_Repository::find()`, and the site domain from `Site\Data`. + +**Precedence.** An active legacy license whose `slug` matches the requested feature wins over a stored Unified key. This is intentional: a legacy-only customer who later installs a Unified key (or has one auto-stored from a sibling Harbor instance) should still route through Herald's `/legacy/download` endpoint for slugs covered by their legacy entitlement. A legacy entry only takes precedence when its `is_active` flag is `true` and its `key` is non-empty; otherwise the builder falls back to the Unified URL. + +`build()` returns an empty string when the domain is empty, or when neither a matching active legacy key nor a Unified key is available. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. The Portal `Provider` binds `Download_Url_Builder` to `Herald_Url_Builder` in the container. To swap implementations (for example, to point at a different download service or to inject a test double), register a different binding for `Download_Url_Builder::class`. From b3ca0959fe89fcdbfb6fa7193a087baca83201a0 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:17:52 -0400 Subject: [PATCH 04/24] fix(tests): rename it_* methods to test_* in License_RepositoryTest PHPUnit only picks up methods prefixed with test_. The it_* prefix is the Codeception .cest format, so the 11 existing methods in this file were silently skipped by the wpunit suite. Renaming them brings 11 previously-dormant tests into the suite (37 new assertions, all passing). --- .../wpunit/Legacy/License_RepositoryTest.php | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index b72e0fe2..d0e08db1 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -29,14 +29,14 @@ protected function tearDown(): void { /** * @since 1.0.0 */ - public function it_returns_empty_array_when_no_filter_adds_licenses(): void { + public function test_returns_empty_array_when_no_filter_adds_licenses(): void { $this->assertSame( [], $this->repository->all() ); } /** * @since 1.0.0 */ - public function it_normalizes_array_items_to_legacy_license_instances(): void { + public function test_normalizes_array_items_to_legacy_license_instances(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -67,7 +67,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_merges_licenses_from_multiple_filter_callbacks(): void { + public function test_merges_licenses_from_multiple_filter_callbacks(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -111,7 +111,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_ignores_non_array_items(): void { + public function test_ignores_non_array_items(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -173,7 +173,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_finds_license_by_slug(): void { + public function test_finds_license_by_slug(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -213,7 +213,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_returns_null_when_slug_not_found(): void { + public function test_returns_null_when_slug_not_found(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -237,7 +237,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_caches_results_across_multiple_calls(): void { + public function test_caches_results_across_multiple_calls(): void { $call_count = 0; add_filter( @@ -270,7 +270,7 @@ static function ( array $licenses ) use ( &$call_count ) { /** * @since 1.0.0 */ - public function it_all_active_returns_only_active_licenses(): void { + public function test_all_active_returns_only_active_licenses(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -305,7 +305,7 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_all_inactive_returns_only_inactive_licenses(): void { + public function test_all_inactive_returns_only_inactive_licenses(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { @@ -348,14 +348,14 @@ static function ( array $licenses ) { /** * @since 1.0.0 */ - public function it_returns_false_for_has_any_when_empty(): void { + public function test_returns_false_for_has_any_when_empty(): void { $this->assertFalse( $this->repository->has_any() ); } /** * @since 1.0.0 */ - public function it_returns_true_for_has_any_when_licenses_exist(): void { + public function test_returns_true_for_has_any_when_licenses_exist(): void { add_filter( 'lw-harbor/legacy_licenses', static function ( array $licenses ) { From d1b0a23f3e8c02862d9f15af9265b16b5ab85824 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:27:08 -0400 Subject: [PATCH 05/24] docs: explain why URL builder inverts the resolver's Unified/Legacy order Resolution prefers Unified because it is the canonical source of entitlement; URL building prefers Legacy because legacy keys are scoped to a specific slug while the Unified key only authenticates features in its capabilities array (which the URL builder does not consult). Preferring legacy when present avoids generating Unified URLs that Herald would reject for slugs the Unified tier does not include but a legacy add-on does. --- docs/subsystems/features.md | 2 +- docs/subsystems/portal.md | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/subsystems/features.md b/docs/subsystems/features.md index f046d1e2..5c06ca64 100644 --- a/docs/subsystems/features.md +++ b/docs/subsystems/features.md @@ -102,7 +102,7 @@ Edge cases: - No licensing entry for a product (unlicensed): the resolver falls back to tier rank comparison using rank 0, making only free-tier features (`minimum_tier` at rank 0) available. Paid-tier features are unavailable. - A feature capable but outside the catalog tier: it is available — capabilities override the catalog tier. - A feature in the customer's catalog tier but absent from capabilities: it is unavailable — capabilities are the authority. -- An active legacy license whose `slug` matches a catalog feature marks that feature as available and in-tier, even with no Unified license or with a Unified tier that doesn't include the feature. The legacy `key` must be non-empty and `is_active` must be `true` for the grant to apply. This lets legacy customers continue to receive updates through Harbor without a Unified key. See [Portal: Download URL Builder](portal.md#download-url-builder) for how the matching download URL is built. +- An active legacy license whose `slug` matches a catalog feature marks that feature as available and in-tier, even with no Unified license or with a Unified tier that doesn't include the feature. The legacy `key` must be non-empty and `is_active` must be `true` for the grant to apply. This lets legacy customers continue to receive updates through Harbor without a Unified key. Resolution checks Unified entitlement first and treats legacy as a fallback grant; download URL construction uses the inverse order so the legacy key authenticates downloads for its specific slug. See [Portal: Download URL Builder](portal.md#download-url-builder) for the rationale and the resulting URL format. ## The Manager diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index 366ed1aa..33f34e03 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -219,7 +219,14 @@ Legacy: {herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site= `Herald_Url_Builder` reads three inputs: the Unified license key via `Licensing\Repositories\License_Repository`, the active legacy license (if any) by slug via `Legacy\License_Repository::find()`, and the site domain from `Site\Data`. -**Precedence.** An active legacy license whose `slug` matches the requested feature wins over a stored Unified key. This is intentional: a legacy-only customer who later installs a Unified key (or has one auto-stored from a sibling Harbor instance) should still route through Herald's `/legacy/download` endpoint for slugs covered by their legacy entitlement. A legacy entry only takes precedence when its `is_active` flag is `true` and its `key` is non-empty; otherwise the builder falls back to the Unified URL. +**Precedence.** An active legacy license whose `slug` matches the requested feature wins over a stored Unified key. This is intentional and deliberately inverts the order used during feature resolution (see [Features: Resolution](features.md#resolution), where Unified is the primary and Legacy is the fallback grant). + +The two orders answer different questions: + +- *Resolution* asks "should this feature be shown as available at all?" Either source of entitlement is sufficient, and Unified is checked first because it is the canonical, modern source. +- *URL building* asks "which key should authenticate the actual ZIP fetch?" Legacy keys are scoped to a specific slug via their `slug` field, so when a matching legacy entry exists, Harbor knows Herald will accept that key for that slug. The Unified key only authenticates features inside its `capabilities` array, and the URL builder does not consult licensing state to find out which features that includes. Preferring legacy when present therefore avoids generating Unified URLs that Herald would reject in mixed-entitlement scenarios (for example, a customer on a Unified tier that does not include a legacy add-on they still hold). + +A legacy entry only takes precedence when its `is_active` flag is `true` and its `key` is non-empty. Otherwise the builder falls back to the Unified URL. `build()` returns an empty string when the domain is empty, or when neither a matching active legacy key nor a Unified key is available. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. From f1d962af541bb1e6b9f542f5776bee3fe54f3706 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Fri, 15 May 2026 16:36:36 -0400 Subject: [PATCH 06/24] Add rawurlencodes to cspell --- tests/wpunit/Portal/Herald_Url_BuilderTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/wpunit/Portal/Herald_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Url_BuilderTest.php index 466c7efc..814989d9 100644 --- a/tests/wpunit/Portal/Herald_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Url_BuilderTest.php @@ -1,5 +1,7 @@ Date: Mon, 18 May 2026 13:05:58 -0400 Subject: [PATCH 07/24] refactor(features): evaluate legacy grant first to simplify availability branches Promote $has_legacy_grant into the unconditional-true branch alongside wporg and free-tier, then collapse the remaining elseif/else into a single else guarded by $capabilities !== null short-circuit. The null guard the original elseif provided against in_array() is preserved. --- src/Harbor/Features/Resolve_Feature_Collection.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Harbor/Features/Resolve_Feature_Collection.php b/src/Harbor/Features/Resolve_Feature_Collection.php index 87e87733..e75d2a6c 100644 --- a/src/Harbor/Features/Resolve_Feature_Collection.php +++ b/src/Harbor/Features/Resolve_Feature_Collection.php @@ -304,17 +304,13 @@ private function hydrate_feature( && $legacy_license->is_active && $legacy_license->key !== ''; - if ( $catalog_feature->is_wporg() || $minimum_rank === 0 ) { - // WordPress.org and free-tier features are unconditionally available — capabilities and tier are irrelevant. + if ( $has_legacy_grant || $catalog_feature->is_wporg() || $minimum_rank === 0 ) { + // An active legacy grant, WordPress.org, and free-tier features are all unconditionally available. $is_available = true; $in_catalog_tier = true; - } elseif ( $capabilities === null ) { - // No Unified license: paid-tier features only available when a legacy key covers them. - $is_available = $has_legacy_grant; - $in_catalog_tier = $has_legacy_grant; } else { - $is_available = in_array( $catalog_feature->get_slug(), $capabilities, true ) || $has_legacy_grant; - $in_catalog_tier = $license_tier_rank >= $minimum_rank || $has_legacy_grant; + $is_available = $capabilities !== null && in_array( $catalog_feature->get_slug(), $capabilities, true ); + $in_catalog_tier = $capabilities !== null && $license_tier_rank >= $minimum_rank; } $data = [ From 23ba58beb4fedb404183057e5ac4b396f91ca946 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 13:06:42 -0400 Subject: [PATCH 08/24] tweak(legacy): use generic truthiness check for required license fields Both fields are typed strings, so the empty-string comparison and the truthiness check are equivalent. The tighter form reads better and was the form requested in review. --- src/Harbor/Legacy/License_Repository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Harbor/Legacy/License_Repository.php b/src/Harbor/Legacy/License_Repository.php index d0610ea0..257c445a 100644 --- a/src/Harbor/Legacy/License_Repository.php +++ b/src/Harbor/Legacy/License_Repository.php @@ -45,7 +45,7 @@ public function all(): array { // Both `key` and `slug` are documented as required; entries missing // either are dropped here so they never reach UI, notices, or any // downstream consumer. - if ( $candidate->key === '' || $candidate->slug === '' ) { + if ( ! ( $candidate->key && $candidate->slug ) ) { continue; } From 901a6e2fb785002dc10b4577f676bd947ef1c47c Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 13:07:53 -0400 Subject: [PATCH 09/24] refactor(portal): extract herald URL composition into dedicated helpers build() now decides which license type covers the slug; the legacy and Unified URL string assembly each live in their own private helper, and both go through a single herald_url() composer that owns the base-URL concatenation and add_query_arg() call. The public Download_Url_Builder contract is unchanged. --- src/Harbor/Portal/Herald_Url_Builder.php | 93 +++++++++++++++++++----- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/src/Harbor/Portal/Herald_Url_Builder.php b/src/Harbor/Portal/Herald_Url_Builder.php index d73f9f90..8df0a4ac 100644 --- a/src/Harbor/Portal/Herald_Url_Builder.php +++ b/src/Harbor/Portal/Herald_Url_Builder.php @@ -91,17 +91,10 @@ public function build( string $slug ): string { return ''; } - $legacy = $this->legacy_repository->find( $slug ); + $legacy_key = $this->resolve_active_legacy_key( $slug ); - if ( $legacy !== null && $legacy->is_active && $legacy->key !== '' ) { - return add_query_arg( - [ - 'plugin' => rawurlencode( $slug ), - 'key' => rawurlencode( $legacy->key ), - 'site' => rawurlencode( $domain ), - ], - Config::get_herald_base_url() . '/legacy/download' - ); + if ( $legacy_key !== null ) { + return $this->build_legacy_url( $slug, $legacy_key, $domain ); } $license_key = $this->license_repository->get_key(); @@ -110,18 +103,78 @@ public function build( string $slug ): string { return ''; } - $url = Config::get_herald_base_url() - . '/download/' - . rawurlencode( $slug ) - . '/latest/' - . rawurlencode( $license_key ) - . '/zip'; + return $this->build_unified_url( $slug, $license_key, $domain ); + } + + /** + * Returns the active legacy license key for a slug, or null when none applies. + * + * @since TBD + * + * @param string $slug The catalog feature slug. + * + * @return string|null + */ + private function resolve_active_legacy_key( string $slug ): ?string { + $legacy = $this->legacy_repository->find( $slug ); - return add_query_arg( + if ( $legacy === null || ! $legacy->is_active || $legacy->key === '' ) { + return null; + } + + return $legacy->key; + } + + /** + * Builds the legacy Herald download URL for a slug + legacy key + domain. + * + * @since TBD + * + * @param string $slug The catalog feature slug. + * @param string $key The legacy license key. + * @param string $domain The site domain. + * + * @return string + */ + private function build_legacy_url( string $slug, string $key, string $domain ): string { + return $this->herald_url( + '/legacy/download', [ - 'site' => rawurlencode( $domain ), - ], - $url + 'plugin' => rawurlencode( $slug ), + 'key' => rawurlencode( $key ), + 'site' => rawurlencode( $domain ), + ] ); } + + /** + * Builds the Unified Herald download URL for a slug + Unified key + domain. + * + * @since TBD + * + * @param string $slug The catalog feature slug. + * @param string $key The Unified license key. + * @param string $domain The site domain. + * + * @return string + */ + private function build_unified_url( string $slug, string $key, string $domain ): string { + $path = '/download/' . rawurlencode( $slug ) . '/latest/' . rawurlencode( $key ) . '/zip'; + + return $this->herald_url( $path, [ 'site' => rawurlencode( $domain ) ] ); + } + + /** + * Composes a Herald URL from the configured base URL, a path, and query args. + * + * @since TBD + * + * @param string $path The path appended to the Herald base URL. + * @param array $query The query string arguments (already encoded by the caller). + * + * @return string + */ + private function herald_url( string $path, array $query ): string { + return add_query_arg( $query, Config::get_herald_base_url() . $path ); + } } From 86e9ff06e75080324404a4cebb7a23d2b9db0e62 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 13:08:18 -0400 Subject: [PATCH 10/24] tweak(portal): use truthy domain check to allow future nullability Site\Data::get_domain() returns string today, so the existing === '' check is functionally identical. Swapping to ! $domain future-proofs the guard against the return type ever loosening to ?string. --- src/Harbor/Portal/Herald_Url_Builder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Harbor/Portal/Herald_Url_Builder.php b/src/Harbor/Portal/Herald_Url_Builder.php index 8df0a4ac..b691ee50 100644 --- a/src/Harbor/Portal/Herald_Url_Builder.php +++ b/src/Harbor/Portal/Herald_Url_Builder.php @@ -87,7 +87,7 @@ public function __construct( public function build( string $slug ): string { $domain = $this->site_data->get_domain(); - if ( $domain === '' ) { + if ( ! $domain ) { return ''; } From 84974eea0cd188284dfe7fc942d6c064e2e91125 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 13:55:04 -0400 Subject: [PATCH 11/24] refactor(portal): keep Herald_Url_Builder constructor compatible by splitting legacy out The earlier change added Legacy_License_Repository as a required third argument to Herald_Url_Builder, altering the class's expected constructor shape and breaking the public contract for any caller that instantiates it directly. Restore the original Herald_Url_Builder( License_Repository, Data ) signature and move the new behavior into sibling classes: - Herald_Url_Builder: Unified license URL only -- original 2-arg signature preserved verbatim from main - Herald_Legacy_Url_Builder: legacy license URL only - Herald_Routing_Url_Builder: implements Download_Url_Builder, holds both and returns the first non-empty result (legacy first, Unified fallback) Portal Provider now binds Download_Url_Builder to Herald_Routing_Url_Builder, so consumers of the contract get the same end-to-end behavior the previous design provided, without Herald_Url_Builder itself being touched. --- docs/subsystems/portal.md | 19 +- .../Portal/Herald_Legacy_Url_Builder.php | 91 ++++++++ .../Portal/Herald_Routing_Url_Builder.php | 69 ++++++ src/Harbor/Portal/Herald_Url_Builder.php | 126 ++--------- src/Harbor/Portal/Provider.php | 4 +- .../Portal/Herald_Legacy_Url_BuilderTest.php | 212 ++++++++++++++++++ .../Portal/Herald_Routing_Url_BuilderTest.php | 127 +++++++++++ .../wpunit/Portal/Herald_Url_BuilderTest.php | 176 ++++----------- 8 files changed, 566 insertions(+), 258 deletions(-) create mode 100644 src/Harbor/Portal/Herald_Legacy_Url_Builder.php create mode 100644 src/Harbor/Portal/Herald_Routing_Url_Builder.php create mode 100644 tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php create mode 100644 tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index 33f34e03..60a0ceac 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -210,14 +210,15 @@ The catalog is the menu. Licensing is the receipt. Feature resolution is the wai Download URLs for exclusive (non-WordPress.org) features are not stored in the catalog response. They are built at runtime by an implementation of the `Download_Url_Builder` contract (`Portal\Contracts\Download_Url_Builder`). The contract is intentionally minimal — a single `build( string $slug ): string` method — so the download backend can be swapped without touching consumers. -The default implementation is `Herald_Url_Builder`, which produces one of two URL formats depending on which license type covers the requested slug: +Harbor ships three Herald implementations of the contract, each with a single, focused responsibility: -``` -Unified: {herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} -Legacy: {herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site={domain} -``` +| Class | URL format | Inputs | +| --- | --- | --- | +| `Herald_Url_Builder` | `{base}/download/{slug}/latest/{license_key}/zip?site={domain}` | Unified key via `Licensing\Repositories\License_Repository`, domain via `Site\Data` | +| `Herald_Legacy_Url_Builder` | `{base}/legacy/download?plugin={slug}&key={legacy_key}&site={domain}` | Active legacy entry via `Legacy\License_Repository::find()`, domain via `Site\Data` | +| `Herald_Routing_Url_Builder` | Delegates to one of the above | The two builders above | -`Herald_Url_Builder` reads three inputs: the Unified license key via `Licensing\Repositories\License_Repository`, the active legacy license (if any) by slug via `Legacy\License_Repository::find()`, and the site domain from `Site\Data`. +`Herald_Routing_Url_Builder` is the implementation bound to `Download_Url_Builder` in the container. It tries the legacy builder first, then falls back to the Unified builder when legacy returns an empty string. Each underlying builder returns an empty string when it cannot satisfy the slug (no covering legacy entry, no Unified key, or no domain), so the routing class needs no licensing state of its own — the policy is "first non-empty wins." **Precedence.** An active legacy license whose `slug` matches the requested feature wins over a stored Unified key. This is intentional and deliberately inverts the order used during feature resolution (see [Features: Resolution](features.md#resolution), where Unified is the primary and Legacy is the fallback grant). @@ -226,11 +227,11 @@ The two orders answer different questions: - *Resolution* asks "should this feature be shown as available at all?" Either source of entitlement is sufficient, and Unified is checked first because it is the canonical, modern source. - *URL building* asks "which key should authenticate the actual ZIP fetch?" Legacy keys are scoped to a specific slug via their `slug` field, so when a matching legacy entry exists, Harbor knows Herald will accept that key for that slug. The Unified key only authenticates features inside its `capabilities` array, and the URL builder does not consult licensing state to find out which features that includes. Preferring legacy when present therefore avoids generating Unified URLs that Herald would reject in mixed-entitlement scenarios (for example, a customer on a Unified tier that does not include a legacy add-on they still hold). -A legacy entry only takes precedence when its `is_active` flag is `true` and its `key` is non-empty. Otherwise the builder falls back to the Unified URL. +A legacy entry only contributes a URL when its `is_active` flag is `true` and its `key` is non-empty. Otherwise `Herald_Legacy_Url_Builder` returns an empty string and the router falls through to `Herald_Url_Builder`. -`build()` returns an empty string when the domain is empty, or when neither a matching active legacy key nor a Unified key is available. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. +The router returns an empty string when neither builder can produce a URL — typically because the domain is empty, or because there is no matching active legacy key and no Unified key. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. -The Portal `Provider` binds `Download_Url_Builder` to `Herald_Url_Builder` in the container. To swap implementations (for example, to point at a different download service or to inject a test double), register a different binding for `Download_Url_Builder::class`. +To swap the download backend entirely (point at a different service, inject a test double), register a different binding for `Download_Url_Builder::class`. `Resolve_Update_Data` depends on the contract and passes the resolved instance into `Plugin::get_update_data()` and `Theme::get_update_data()`, which call `build()` internally to populate the `package` field. diff --git a/src/Harbor/Portal/Herald_Legacy_Url_Builder.php b/src/Harbor/Portal/Herald_Legacy_Url_Builder.php new file mode 100644 index 00000000..afb75979 --- /dev/null +++ b/src/Harbor/Portal/Herald_Legacy_Url_Builder.php @@ -0,0 +1,91 @@ +legacy_repository = $legacy_repository; + $this->site_data = $site_data; + } + + /** + * Builds the legacy Herald download URL for the given feature slug. + * + * @since TBD + * + * @param string $slug The catalog feature slug. + * + * @return string + */ + public function build( string $slug ): string { + $domain = $this->site_data->get_domain(); + + if ( ! $domain ) { + return ''; + } + + $legacy = $this->legacy_repository->find( $slug ); + + if ( $legacy === null || ! $legacy->is_active || $legacy->key === '' ) { + return ''; + } + + return add_query_arg( + [ + 'plugin' => rawurlencode( $slug ), + 'key' => rawurlencode( $legacy->key ), + 'site' => rawurlencode( $domain ), + ], + Config::get_herald_base_url() . '/legacy/download' + ); + } +} diff --git a/src/Harbor/Portal/Herald_Routing_Url_Builder.php b/src/Harbor/Portal/Herald_Routing_Url_Builder.php new file mode 100644 index 00000000..b9dfe27a --- /dev/null +++ b/src/Harbor/Portal/Herald_Routing_Url_Builder.php @@ -0,0 +1,69 @@ +unified = $unified; + $this->legacy = $legacy; + } + + /** + * Routes the slug to the legacy builder first, falling back to Unified. + * + * @since TBD + * + * @param string $slug The catalog feature slug. + * + * @return string The first non-empty URL produced by a held builder, or an empty string. + */ + public function build( string $slug ): string { + $url = $this->legacy->build( $slug ); + + if ( $url !== '' ) { + return $url; + } + + return $this->unified->build( $slug ); + } +} diff --git a/src/Harbor/Portal/Herald_Url_Builder.php b/src/Harbor/Portal/Herald_Url_Builder.php index b691ee50..2f78be33 100644 --- a/src/Harbor/Portal/Herald_Url_Builder.php +++ b/src/Harbor/Portal/Herald_Url_Builder.php @@ -3,22 +3,21 @@ namespace LiquidWeb\Harbor\Portal; use LiquidWeb\Harbor\Config; -use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\Repositories\License_Repository; use LiquidWeb\Harbor\Portal\Contracts\Download_Url_Builder; use LiquidWeb\Harbor\Site\Data; /** - * Builds Herald download URLs for catalog features. + * Builds Herald download URLs authenticated by the Unified license key. * - * Herald is the StellarWP download service. Two URL formats are produced depending - * on which license type covers the requested slug: + * Herald is the StellarWP download service. This implementation authenticates + * downloads with the per-site Unified license key. * - * - Unified license: {herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain} - * - Legacy license: {herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site={domain} + * URL format: `{herald_base_url}/download/{slug}/latest/{license_key}/zip?site={domain}` * - * Legacy keys take precedence when both are present so a legacy-only customer's - * stored key drives their downloads even when a Unified key is also installed. + * Returns an empty string when either the Unified key or the domain is missing. + * Legacy license keys are handled by `Herald_Legacy_Url_Builder`; routing + * between the two implementations is the job of `Herald_Routing_Url_Builder`. * * @since 1.0.0 */ @@ -33,15 +32,6 @@ final class Herald_Url_Builder implements Download_Url_Builder { */ private License_Repository $license_repository; - /** - * The legacy license repository. - * - * @since TBD - * - * @var Legacy_License_Repository - */ - private Legacy_License_Repository $legacy_repository; - /** * Site data provider. * @@ -56,27 +46,16 @@ final class Herald_Url_Builder implements Download_Url_Builder { * * @since 1.0.0 * - * @param License_Repository $license_repository The Unified license key provider. - * @param Legacy_License_Repository $legacy_repository The legacy license repository. - * @param Data $site_data Site data provider. + * @param License_Repository $license_repository The Unified license key provider. + * @param Data $site_data Site data provider. */ - public function __construct( - License_Repository $license_repository, - Legacy_License_Repository $legacy_repository, - Data $site_data - ) { + public function __construct( License_Repository $license_repository, Data $site_data ) { $this->license_repository = $license_repository; - $this->legacy_repository = $legacy_repository; $this->site_data = $site_data; } /** - * Builds a Herald download URL for the given feature slug. - * - * Returns the legacy `/legacy/download` URL when a matching active legacy - * license exists for the slug. Otherwise falls back to the Unified - * `/download/{slug}/latest/{key}/zip` URL. Returns an empty string when - * neither a license nor a domain is available. + * Builds the Unified Herald download URL for the given feature slug. * * @since 1.0.0 * @@ -91,90 +70,17 @@ public function build( string $slug ): string { return ''; } - $legacy_key = $this->resolve_active_legacy_key( $slug ); - - if ( $legacy_key !== null ) { - return $this->build_legacy_url( $slug, $legacy_key, $domain ); - } - $license_key = $this->license_repository->get_key(); if ( $license_key === null ) { return ''; } - return $this->build_unified_url( $slug, $license_key, $domain ); - } - - /** - * Returns the active legacy license key for a slug, or null when none applies. - * - * @since TBD - * - * @param string $slug The catalog feature slug. - * - * @return string|null - */ - private function resolve_active_legacy_key( string $slug ): ?string { - $legacy = $this->legacy_repository->find( $slug ); - - if ( $legacy === null || ! $legacy->is_active || $legacy->key === '' ) { - return null; - } - - return $legacy->key; - } - - /** - * Builds the legacy Herald download URL for a slug + legacy key + domain. - * - * @since TBD - * - * @param string $slug The catalog feature slug. - * @param string $key The legacy license key. - * @param string $domain The site domain. - * - * @return string - */ - private function build_legacy_url( string $slug, string $key, string $domain ): string { - return $this->herald_url( - '/legacy/download', - [ - 'plugin' => rawurlencode( $slug ), - 'key' => rawurlencode( $key ), - 'site' => rawurlencode( $domain ), - ] - ); - } - - /** - * Builds the Unified Herald download URL for a slug + Unified key + domain. - * - * @since TBD - * - * @param string $slug The catalog feature slug. - * @param string $key The Unified license key. - * @param string $domain The site domain. - * - * @return string - */ - private function build_unified_url( string $slug, string $key, string $domain ): string { - $path = '/download/' . rawurlencode( $slug ) . '/latest/' . rawurlencode( $key ) . '/zip'; + $url = Config::get_herald_base_url() + . '/download/' . rawurlencode( $slug ) + . '/latest/' . rawurlencode( $license_key ) + . '/zip'; - return $this->herald_url( $path, [ 'site' => rawurlencode( $domain ) ] ); - } - - /** - * Composes a Herald URL from the configured base URL, a path, and query args. - * - * @since TBD - * - * @param string $path The path appended to the Herald base URL. - * @param array $query The query string arguments (already encoded by the caller). - * - * @return string - */ - private function herald_url( string $path, array $query ): string { - return add_query_arg( $query, Config::get_herald_base_url() . $path ); + return add_query_arg( [ 'site' => rawurlencode( $domain ) ], $url ); } } diff --git a/src/Harbor/Portal/Provider.php b/src/Harbor/Portal/Provider.php index 1aa0de01..6c58d9f2 100644 --- a/src/Harbor/Portal/Provider.php +++ b/src/Harbor/Portal/Provider.php @@ -34,7 +34,9 @@ function () { $this->container->singleton( Catalog_Repository::class ); $this->container->singleton( Herald_Url_Builder::class ); - $this->container->singleton( Download_Url_Builder::class, Herald_Url_Builder::class ); + $this->container->singleton( Herald_Legacy_Url_Builder::class ); + $this->container->singleton( Herald_Routing_Url_Builder::class ); + $this->container->singleton( Download_Url_Builder::class, Herald_Routing_Url_Builder::class ); add_action( 'lw-harbor/unified_license_key_changed', diff --git a/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php new file mode 100644 index 00000000..a0e4d83f --- /dev/null +++ b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php @@ -0,0 +1,212 @@ +makeEmpty( + Data::class, + [ 'get_domain' => $domain ] + ); + + return new Herald_Legacy_Url_Builder( new Legacy_License_Repository(), $site_data ); + } + + /** + * Registers a single legacy license entry via the filter. + * + * @param array $overrides Field overrides on the default entry. + */ + private function register_legacy_license( array $overrides = [] ): void { + $defaults = [ + 'key' => 'legacy-key-1234', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + $entry = array_merge( $defaults, $overrides ); + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $entry ) { + $licenses[] = $entry; + + return $licenses; + } + ); + } + + /** + * Tests that the builder composes the expected legacy Herald URL for an active matching entry. + * + * @return void + */ + public function test_build_returns_legacy_url_for_matching_active_legacy_license(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertSame( + self::TEST_HERALD_BASE . '/legacy/download?plugin=kad-blocks-pro&key=legacy-key-abc&site=' . self::TEST_DOMAIN, + $url + ); + } + + /** + * Tests that an inactive legacy entry produces no URL. + * + * @return void + */ + public function test_build_returns_empty_when_legacy_is_inactive(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'is_active' => false, + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that a legacy entry with an empty key produces no URL. + * + * @return void + */ + public function test_build_returns_empty_when_legacy_key_is_empty(): void { + $this->register_legacy_license( + [ + 'key' => '', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that a legacy entry with a non-matching slug produces no URL. + * + * @return void + */ + public function test_build_returns_empty_when_slug_does_not_match(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'some-other-plugin', + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that an empty legacy repository produces no URL. + * + * @return void + */ + public function test_build_returns_empty_when_no_legacy_entries_registered(): void { + $builder = $this->make_builder( self::TEST_DOMAIN ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that an empty domain short-circuits even when a matching legacy entry exists. + * + * @return void + */ + public function test_build_returns_empty_when_domain_is_empty(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( '' ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that the slug, key, and domain are rawurlencoded into the URL. + * + * @return void + */ + public function test_build_rawurlencodes_all_params(): void { + $this->register_legacy_license( + [ + 'key' => 'KEY WITH SPACES', + 'slug' => 'slug with spaces', + ] + ); + + $builder = $this->make_builder( 'my site.example.com' ); + $url = $builder->build( 'slug with spaces' ); + + $this->assertStringContainsString( 'plugin=slug%20with%20spaces', $url ); + $this->assertStringContainsString( 'key=KEY%20WITH%20SPACES', $url ); + $this->assertStringContainsString( 'site=my%20site.example.com', $url ); + } + + /** + * Tests that the builder uses the Herald base URL configured on Config. + * + * @return void + */ + public function test_build_uses_configured_herald_base_url(): void { + Config::set_herald_base_url( 'https://custom-herald.example.com' ); + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + $url = $builder->build( 'kad-blocks-pro' ); + + $this->assertStringStartsWith( 'https://custom-herald.example.com/legacy/download', $url ); + } +} diff --git a/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php new file mode 100644 index 00000000..9ad198ed --- /dev/null +++ b/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php @@ -0,0 +1,127 @@ + 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', + ]; + + return $licenses; + } + ); + } + + $site_data = $this->makeEmpty( Data::class, [ 'get_domain' => self::TEST_DOMAIN ] ); + + $unified = new Herald_Url_Builder( new License_Repository(), $site_data ); + $legacy = new Herald_Legacy_Url_Builder( new Legacy_License_Repository(), $site_data ); + + return new Herald_Routing_Url_Builder( $unified, $legacy ); + } + + /** + * Tests that the legacy URL is returned when a matching legacy entry exists, + * even when a Unified key is also stored. + * + * @return void + */ + public function test_returns_legacy_url_when_legacy_matches(): void { + $router = $this->make_router( self::TEST_LICENSE_KEY, true ); + + $url = $router->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/legacy/download', $url ); + $this->assertStringContainsString( 'key=legacy-key-abc', $url ); + $this->assertStringNotContainsString( self::TEST_LICENSE_KEY, $url ); + } + + /** + * Tests that the router returns the Unified URL when no legacy entry covers the slug. + * + * @return void + */ + public function test_falls_back_to_unified_when_no_legacy_match(): void { + $router = $this->make_router( self::TEST_LICENSE_KEY, false ); + + $url = $router->build( 'kad-blocks-pro' ); + + $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); + $this->assertStringNotContainsString( '/legacy/download', $url ); + } + + /** + * Tests that the router returns an empty string when neither builder can produce a URL. + * + * @return void + */ + public function test_returns_empty_when_neither_builder_produces_a_url(): void { + $router = $this->make_router( null, false ); + + $this->assertSame( '', $router->build( 'kad-blocks-pro' ) ); + } + + /** + * Tests that the routing class satisfies the Download_Url_Builder contract. + * + * @return void + */ + public function test_implements_download_url_builder_contract(): void { + $router = $this->make_router( null, false ); + + $this->assertInstanceOf( Download_Url_Builder::class, $router ); + } +} diff --git a/tests/wpunit/Portal/Herald_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Url_BuilderTest.php index 814989d9..e67abb40 100644 --- a/tests/wpunit/Portal/Herald_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Url_BuilderTest.php @@ -1,11 +1,8 @@ $domain ] ); - return new Herald_Url_Builder( new License_Repository(), new Legacy_License_Repository(), $site_data ); + return new Herald_Url_Builder( new License_Repository(), $site_data ); } /** - * Registers a single legacy license entry via the filter. + * Tests that the builder composes the expected Unified Herald download URL. * - * @param array $overrides Field overrides on the default entry. + * @return void */ - private function register_legacy_license( array $overrides = [] ): void { - $defaults = [ - 'key' => 'legacy-key-1234', - 'slug' => 'kad-blocks-pro', - 'name' => 'Kadence Blocks Pro', - 'product' => 'kadence', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', - ]; - - $entry = array_merge( $defaults, $overrides ); - - add_filter( - 'lw-harbor/legacy_licenses', - static function ( array $licenses ) use ( $entry ) { - $licenses[] = $entry; - - return $licenses; - } - ); - } - public function test_build_returns_correct_url(): void { $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); $url = $builder->build( 'kad-blocks-pro' ); @@ -82,6 +55,11 @@ public function test_build_returns_correct_url(): void { ); } + /** + * Tests that the slug path segment is rawurlencoded. + * + * @return void + */ public function test_build_url_encodes_slug(): void { $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); $url = $builder->build( 'slug with spaces' ); @@ -89,6 +67,11 @@ public function test_build_url_encodes_slug(): void { $this->assertStringContainsString( '/download/slug%20with%20spaces/', $url ); } + /** + * Tests that the license key path segment is rawurlencoded. + * + * @return void + */ public function test_build_url_encodes_license_key(): void { $builder = $this->make_builder( 'KEY WITH SPACES', self::TEST_DOMAIN ); $url = $builder->build( 'some-plugin' ); @@ -96,6 +79,11 @@ public function test_build_url_encodes_license_key(): void { $this->assertStringContainsString( '/latest/KEY%20WITH%20SPACES/', $url ); } + /** + * Tests that the domain query parameter is rawurlencoded. + * + * @return void + */ public function test_build_url_encodes_domain(): void { $builder = $this->make_builder( self::TEST_LICENSE_KEY, 'my site.example.com' ); $url = $builder->build( 'some-plugin' ); @@ -103,18 +91,33 @@ public function test_build_url_encodes_domain(): void { $this->assertStringContainsString( '?site=my%20site.example.com', $url ); } + /** + * Tests that the builder returns an empty string when no Unified license key is stored. + * + * @return void + */ public function test_build_returns_empty_when_no_license_key(): void { $builder = $this->make_builder( null, self::TEST_DOMAIN ); $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); } + /** + * Tests that the builder returns an empty string when the domain is empty. + * + * @return void + */ public function test_build_returns_empty_when_domain_is_empty(): void { $builder = $this->make_builder( self::TEST_LICENSE_KEY, '' ); $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); } + /** + * Tests that the builder uses the Herald base URL configured on Config. + * + * @return void + */ public function test_build_uses_configured_herald_base_url(): void { Config::set_herald_base_url( 'https://custom-herald.example.com' ); @@ -124,6 +127,11 @@ public function test_build_uses_configured_herald_base_url(): void { $this->assertStringStartsWith( 'https://custom-herald.example.com/', $url ); } + /** + * Tests that a trailing slash on the configured base URL is normalized away. + * + * @return void + */ public function test_build_strips_trailing_slash_from_base_url(): void { Config::set_herald_base_url( 'https://herald.example.com/' ); @@ -133,112 +141,4 @@ public function test_build_strips_trailing_slash_from_base_url(): void { $this->assertStringStartsWith( 'https://herald.example.com/download/', $url ); $this->assertStringNotContainsString( '//download/', $url ); } - - public function test_build_returns_legacy_url_for_matching_active_legacy_license(): void { - $this->register_legacy_license( - [ - 'key' => 'legacy-key-abc', - 'slug' => 'kad-blocks-pro', - ] - ); - - $builder = $this->make_builder( null, self::TEST_DOMAIN ); - $url = $builder->build( 'kad-blocks-pro' ); - - $this->assertSame( - self::TEST_HERALD_BASE . '/legacy/download?plugin=kad-blocks-pro&key=legacy-key-abc&site=' . self::TEST_DOMAIN, - $url - ); - } - - public function test_build_prefers_legacy_url_when_both_legacy_and_unified_present(): void { - $this->register_legacy_license( - [ - 'key' => 'legacy-key-abc', - 'slug' => 'kad-blocks-pro', - ] - ); - - $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); - $url = $builder->build( 'kad-blocks-pro' ); - - $this->assertStringContainsString( '/legacy/download?', $url ); - $this->assertStringContainsString( 'key=legacy-key-abc', $url ); - $this->assertStringNotContainsString( self::TEST_LICENSE_KEY, $url ); - } - - public function test_build_falls_back_to_unified_url_when_legacy_is_inactive(): void { - $this->register_legacy_license( - [ - 'key' => 'legacy-key-abc', - 'slug' => 'kad-blocks-pro', - 'is_active' => false, - ] - ); - - $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); - $url = $builder->build( 'kad-blocks-pro' ); - - $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); - $this->assertStringNotContainsString( '/legacy/download', $url ); - } - - public function test_build_falls_back_to_unified_url_when_legacy_key_is_empty(): void { - $this->register_legacy_license( - [ - 'key' => '', - 'slug' => 'kad-blocks-pro', - ] - ); - - $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); - $url = $builder->build( 'kad-blocks-pro' ); - - $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); - $this->assertStringNotContainsString( '/legacy/download', $url ); - } - - public function test_build_legacy_url_returns_unified_when_slug_does_not_match(): void { - $this->register_legacy_license( - [ - 'key' => 'legacy-key-abc', - 'slug' => 'some-other-plugin', - ] - ); - - $builder = $this->make_builder( self::TEST_LICENSE_KEY, self::TEST_DOMAIN ); - $url = $builder->build( 'kad-blocks-pro' ); - - $this->assertStringContainsString( '/download/kad-blocks-pro/latest/' . self::TEST_LICENSE_KEY . '/zip', $url ); - $this->assertStringNotContainsString( '/legacy/download', $url ); - } - - public function test_build_legacy_url_rawurlencodes_all_params(): void { - $this->register_legacy_license( - [ - 'key' => 'KEY WITH SPACES', - 'slug' => 'slug with spaces', - ] - ); - - $builder = $this->make_builder( null, 'my site.example.com' ); - $url = $builder->build( 'slug with spaces' ); - - $this->assertStringContainsString( 'plugin=slug%20with%20spaces', $url ); - $this->assertStringContainsString( 'key=KEY%20WITH%20SPACES', $url ); - $this->assertStringContainsString( 'site=my%20site.example.com', $url ); - } - - public function test_build_returns_empty_when_domain_is_empty_even_with_legacy_license(): void { - $this->register_legacy_license( - [ - 'key' => 'legacy-key-abc', - 'slug' => 'kad-blocks-pro', - ] - ); - - $builder = $this->make_builder( self::TEST_LICENSE_KEY, '' ); - - $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); - } } From 21341acde24dbf139d1fac7f71ad74208433a8e8 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 14:00:06 -0400 Subject: [PATCH 12/24] refactor(features): make Legacy_License_Repository constructor argument optional Resolve_Feature_Collection previously required Legacy_License_Repository as a fourth constructor argument, breaking the original three-argument shape any caller would have been relying on. Make the new argument nullable with a null default and lazily build a fresh Legacy_License_Repository when omitted. Both the container-managed singleton and the default fresh instance read the same `lw-harbor/legacy_licenses` filter, so callers using the three-arg form still see legacy entries registered elsewhere in the request. A new test instantiates the resolver without the optional argument and asserts that a filter-registered legacy entry still grants availability, guarding the compatibility shim against future regressions. --- .../Features/Resolve_Feature_Collection.php | 12 +++---- .../Resolve_Feature_CollectionTest.php | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/Harbor/Features/Resolve_Feature_Collection.php b/src/Harbor/Features/Resolve_Feature_Collection.php index e75d2a6c..18a3c7f4 100644 --- a/src/Harbor/Features/Resolve_Feature_Collection.php +++ b/src/Harbor/Features/Resolve_Feature_Collection.php @@ -88,21 +88,21 @@ class Resolve_Feature_Collection { * * @since 1.0.0 * - * @param Catalog_Repository $catalog The catalog repository. - * @param License_Manager $licensing The license manager. - * @param Data $site_data The site data provider. - * @param Legacy_License_Repository $legacy_repository The legacy license repository. + * @param Catalog_Repository $catalog The catalog repository. + * @param License_Manager $licensing The license manager. + * @param Data $site_data The site data provider. + * @param Legacy_License_Repository|null $legacy_repository The legacy license repository. Default null, which creates a new instance for backwards compatibility. */ public function __construct( Catalog_Repository $catalog, License_Manager $licensing, Data $site_data, - Legacy_License_Repository $legacy_repository + ?Legacy_License_Repository $legacy_repository = null ) { $this->catalog = $catalog; $this->licensing = $licensing; $this->site_data = $site_data; - $this->legacy_repository = $legacy_repository; + $this->legacy_repository = $legacy_repository ?? new Legacy_License_Repository(); } /** diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php index 6a15d174..bc837523 100644 --- a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -314,4 +314,35 @@ public function test_paid_feature_without_legacy_or_unified_license_is_unavailab $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); } + + /** + * Tests that the resolver still picks up legacy entries from the global filter + * when constructed without the optional Legacy_License_Repository argument. + * + * Guards the three-argument constructor compatibility shim: callers that + * predate the legacy feature must keep working, and the default repository + * the resolver builds for itself must read the same `lw-harbor/legacy_licenses` + * filter as the container-managed singleton. + * + * @return void + */ + public function test_resolver_without_legacy_repo_argument_uses_filter_backed_default(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + ] + ); + + $resolver = new Resolve_Feature_Collection( + $this->make_catalog_repository_returning( $this->make_catalog() ), + $this->make_license_manager_returning( new Product_Collection() ), + $this->makeEmpty( Data::class, [ 'get_domain' => 'example.com' ] ) + ); + + $resolver->register_type( Feature::TYPE_PLUGIN, Plugin::class ); + $resolver->register_type( Feature::TYPE_THEME, Theme::class ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); + } } From 0a5dc39ecbf75c61c4f41c7dbff4a662739ee1b2 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 14:05:03 -0400 Subject: [PATCH 13/24] docs(tests): add Tests/@return docblocks to new test methods on this branch Eight new methods in Resolve_Feature_CollectionTest and one new method in License_RepositoryTest (test_drops_entries_with_empty_key_or_slug) were introduced without the project's PHPDoc convention. Each now leads with a "Tests..." sentence and declares @return void, matching the form used elsewhere in the suite. Pre-existing tests on main are left untouched. --- .../Resolve_Feature_CollectionTest.php | 45 +++++++++++++++++++ .../wpunit/Legacy/License_RepositoryTest.php | 4 ++ 2 files changed, 49 insertions(+) diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php index bc837523..0b95ff8d 100644 --- a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -215,6 +215,16 @@ private function assert_resolved_feature_flags( $this->assertSame( $expected_in_tier, $feature->is_in_catalog_tier(), 'in_catalog_tier mismatch.' ); } + /** + * Tests that an active legacy license alone (no Unified license) makes a paid feature available. + * + * @return void + */ + /** + * Tests that an active legacy license alone (no Unified license) makes a paid feature available. + * + * @return void + */ public function test_paid_feature_active_legacy_with_no_unified_license_is_available(): void { $this->register_legacy_license( [ @@ -228,6 +238,11 @@ public function test_paid_feature_active_legacy_with_no_unified_license_is_avail $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); } + /** + * Tests that an inactive legacy license does not grant availability when no Unified license covers the feature. + * + * @return void + */ public function test_paid_feature_inactive_legacy_with_no_unified_license_is_unavailable(): void { $this->register_legacy_license( [ @@ -242,6 +257,11 @@ public function test_paid_feature_inactive_legacy_with_no_unified_license_is_una $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); } + /** + * Tests that a legacy entry with an empty key does not grant availability. + * + * @return void + */ public function test_paid_feature_legacy_with_empty_key_does_not_grant_availability(): void { $this->register_legacy_license( [ @@ -255,6 +275,11 @@ public function test_paid_feature_legacy_with_empty_key_does_not_grant_availabil $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); } + /** + * Tests that a legacy entry whose slug does not match the catalog feature is ignored. + * + * @return void + */ public function test_paid_feature_legacy_slug_mismatch_does_not_grant_availability(): void { $this->register_legacy_license( [ @@ -268,6 +293,11 @@ public function test_paid_feature_legacy_slug_mismatch_does_not_grant_availabili $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); } + /** + * Tests that an active legacy entry grants availability even when the Unified license's capabilities omit the feature. + * + * @return void + */ public function test_paid_feature_active_legacy_overrides_missing_capability(): void { $this->register_legacy_license( [ @@ -285,6 +315,11 @@ public function test_paid_feature_active_legacy_overrides_missing_capability(): $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); } + /** + * Tests that an active legacy entry grants in-tier status even when the Unified license is below the feature's minimum tier rank. + * + * @return void + */ public function test_paid_feature_active_legacy_overrides_insufficient_tier_rank(): void { $this->register_legacy_license( [ @@ -302,6 +337,11 @@ public function test_paid_feature_active_legacy_overrides_insufficient_tier_rank $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); } + /** + * Tests that free-tier (rank 0) features are unconditionally available regardless of legacy or Unified state. + * + * @return void + */ public function test_free_tier_feature_is_available_regardless_of_legacy_state(): void { // No legacy license registered. The free-tier (rank 0) feature should still be available. $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); @@ -309,6 +349,11 @@ public function test_free_tier_feature_is_available_regardless_of_legacy_state() $this->assert_resolved_feature_flags( $resolver, 'kadence-blocks', true, true ); } + /** + * Tests that a paid feature is unavailable when neither a legacy entry nor a Unified license covers it. + * + * @return void + */ public function test_paid_feature_without_legacy_or_unified_license_is_unavailable(): void { $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index d0e08db1..5eca6173 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -134,7 +134,11 @@ static function ( array $licenses ) { } /** + * Tests that legacy entries missing either `key` or `slug` are dropped at repository intake. + * * @since TBD + * + * @return void */ public function test_drops_entries_with_empty_key_or_slug(): void { add_filter( From 27b991ec871045337b0063cf0f4b19e9f65874c8 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 14:19:20 -0400 Subject: [PATCH 14/24] chore(ci): fix spell check and markdown lint failures - Add `rawurlencoded` to the inline cspell ignore directives in both Herald_Url_BuilderTest and Herald_Legacy_Url_BuilderTest. The earlier directive only ignored `rawurlencodes` (method-name form); the new test docblocks use the past-tense form. - Realign the Herald URL builder table in docs/subsystems/portal.md so pipes line up under the header, satisfying markdownlint MD060. --- docs/subsystems/portal.md | 10 +++++----- tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php | 2 +- tests/wpunit/Portal/Herald_Url_BuilderTest.php | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index 60a0ceac..ac3dc17e 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -212,11 +212,11 @@ Download URLs for exclusive (non-WordPress.org) features are not stored in the c Harbor ships three Herald implementations of the contract, each with a single, focused responsibility: -| Class | URL format | Inputs | -| --- | --- | --- | -| `Herald_Url_Builder` | `{base}/download/{slug}/latest/{license_key}/zip?site={domain}` | Unified key via `Licensing\Repositories\License_Repository`, domain via `Site\Data` | -| `Herald_Legacy_Url_Builder` | `{base}/legacy/download?plugin={slug}&key={legacy_key}&site={domain}` | Active legacy entry via `Legacy\License_Repository::find()`, domain via `Site\Data` | -| `Herald_Routing_Url_Builder` | Delegates to one of the above | The two builders above | +| Class | URL format | Inputs | +| ---------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `Herald_Url_Builder` | `{base}/download/{slug}/latest/{license_key}/zip?site={domain}` | Unified key via `Licensing\Repositories\License_Repository`, domain via `Site\Data` | +| `Herald_Legacy_Url_Builder` | `{base}/legacy/download?plugin={slug}&key={legacy_key}&site={domain}` | Active legacy entry via `Legacy\License_Repository::find()`, domain via `Site\Data` | +| `Herald_Routing_Url_Builder` | Delegates to one of the above | The two builders above | `Herald_Routing_Url_Builder` is the implementation bound to `Download_Url_Builder` in the container. It tries the legacy builder first, then falls back to the Unified builder when legacy returns an empty string. Each underlying builder returns an empty string when it cannot satisfy the slug (no covering legacy entry, no Unified key, or no domain), so the routing class needs no licensing state of its own — the policy is "first non-empty wins." diff --git a/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php index a0e4d83f..30298463 100644 --- a/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php @@ -1,6 +1,6 @@ Date: Mon, 18 May 2026 14:43:43 -0400 Subject: [PATCH 15/24] feat: gate legacy-key Harbor updates behind use_for_updates opt-in Adds a per-entry `use_for_updates` flag (default false) to the `lw-harbor/legacy_licenses` filter payload. Only opt-in entries grant catalog feature availability, contribute a Herald `/legacy/download` URL, and trigger Plugin/Theme update handlers. Non-opt-in entries continue to appear in the licensing UI and admin notices. Protects Harbor from advertising "update available" badges for legacy keys whose backend is not Stellar Licensing v3 compatible (e.g. SolidWP API keys, some Give legacy keys), which would otherwise fail validation when the user clicks Update. Addresses PR #159 review feedback. --- docs/guides/integration.md | 44 +++++++------- docs/subsystems/features.md | 2 +- docs/subsystems/portal.md | 2 +- .../Features/Resolve_Feature_Collection.php | 15 +++-- src/Harbor/Features/Update/Plugin_Handler.php | 12 ++-- src/Harbor/Features/Update/Theme_Handler.php | 12 ++-- src/Harbor/Legacy/Legacy_License.php | 49 ++++++++++----- src/Harbor/Legacy/License_Repository.php | 21 +++++++ .../Portal/Herald_Legacy_Url_Builder.php | 9 +-- .../Resolve_Feature_CollectionTest.php | 38 +++++++++--- .../Features/Update/Plugin_HandlerTest.php | 46 +++++++++++--- .../Features/Update/Theme_HandlerTest.php | 45 +++++++++++--- .../wpunit/Legacy/License_RepositoryTest.php | 60 +++++++++++++++++++ .../Portal/Herald_Legacy_Url_BuilderTest.php | 35 ++++++++--- .../Portal/Herald_Routing_Url_BuilderTest.php | 15 ++--- 15 files changed, 308 insertions(+), 97 deletions(-) diff --git a/docs/guides/integration.md b/docs/guides/integration.md index 7751bda0..29bedee4 100644 --- a/docs/guides/integration.md +++ b/docs/guides/integration.md @@ -102,13 +102,14 @@ add_filter('lw-harbor/legacy_licenses', function (array $licenses): array { foreach ($storedLicenses as $license) { $licenses[] = [ - 'key' => $license['key'], // The license key string - 'slug' => $license['slug'], // The product/add-on slug this key covers - 'name' => $license['name'], // Human-readable product name - 'product' => 'your-product', // Product brand slug - 'is_active' => $license['is_active'], // bool - 'page_url' => admin_url('...'), // Where the user can manage this license - 'expires_at' => $license['expires'], // Optional: ISO date string e.g. "2026-01-01" + 'key' => $license['key'], // The license key string + 'slug' => $license['slug'], // The product/add-on slug this key covers + 'name' => $license['name'], // Human-readable product name + 'product' => 'your-product', // Product brand slug + 'is_active' => $license['is_active'], // bool + 'use_for_updates' => true, // Opt-in: route updates and downloads via Herald. See below. + 'page_url' => admin_url('...'), // Where the user can manage this license + 'expires_at' => $license['expires'], // Optional: ISO date string e.g. "2026-01-01" ]; } @@ -118,25 +119,28 @@ add_filter('lw-harbor/legacy_licenses', function (array $licenses): array { **Legacy license array fields:** -| Field | Required | Description | -| ------------ | -------- | ------------------------------------------------- | -| `key` | Yes | The license key string. | -| `slug` | Yes | The product/add-on slug this key applies to. | -| `name` | Yes | Human-readable product name. | -| `product` | Yes | Product brand slug (e.g. `givewp`, `kadence`). | -| `is_active` | Yes | Whether the license is currently active (`bool`). | -| `page_url` | Yes | Admin URL where the user can manage this license. | -| `expires_at` | No | Expiry date string (e.g. `"2026-01-01"`). | +| Field | Required | Description | +| ----------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | +| `key` | Yes | The license key string. | +| `slug` | Yes | The product/add-on slug this key applies to. | +| `name` | Yes | Human-readable product name. | +| `product` | Yes | Product brand slug (e.g. `givewp`, `kadence`). | +| `is_active` | Yes | Whether the license is currently active (`bool`). | +| `use_for_updates` | No | Opt-in (`bool`, default `false`). Set to `true` only when the key is compatible with Stellar Licensing v3 / Herald. | +| `page_url` | Yes | Admin URL where the user can manage this license. | +| `expires_at` | No | Expiry date string (e.g. `"2026-01-01"`). | > **Tip:** If a single license key covers multiple add-ons, emit one entry per add-on slug so each slug can display a legacy license badge on the Feature Manager page. ### How Harbor uses reported legacy keys -Beyond surfacing legacy entries in the unified license UI, Harbor wires the reported key into feature availability and updates: +Reported entries always appear in the unified license UI and feed admin notices. Whether they also feed Harbor's update pipeline (feature availability and download URLs) depends on the `use_for_updates` opt-in: -1. **Availability.** An `is_active = true` entry marks the catalog feature matching its `slug` as available and in-tier, even when no unified license is installed (or when the installed unified tier does not include that feature). -2. **Updates.** Update checks proceed for matching slugs, and the package URL routes through Herald's `/legacy/download` endpoint using the reported key. Harbor does not depend on a legacy licensing server to validate or serve the download. -3. **Inactive entries.** An entry with `is_active = false` is treated as informational only. It surfaces in admin notices urging the user to renew or reactivate, but does not grant availability or updates. +1. **Opt-in entries (`use_for_updates = true`).** When such an entry is `is_active = true` with a non-empty `key`, it marks the catalog feature matching its `slug` as available and in-tier (even with no unified license installed, or when the installed unified tier does not include that feature). Update checks proceed for that slug, and the package URL routes through Herald's `/legacy/download` endpoint using the reported key. +2. **Opt-out or omitted (`use_for_updates = false`, the default).** The entry is informational only. It appears in the licensing UI and admin notices, but does not grant availability, does not show "update available" badges, and is never sent to Herald. +3. **Inactive entries (`is_active = false`).** Same informational-only treatment, plus the entry surfaces in admin notices urging the user to renew or reactivate. + +**When to set `use_for_updates = true`.** Only when the legacy key is compatible with Stellar Licensing v3 (the system Herald authenticates against on `/legacy/download`). Plugins whose legacy keys are issued by a separate licensing backend (for example, SolidWP API keys, or some Give legacy keys) should leave it `false`: surfacing an "update available" badge for a key Herald cannot validate would lead to download failures during install. When in doubt, leave it off and the entry continues to display in the UI/notices without breaking anything. **What `is_active` means.** Harbor takes this flag at face value from your plugin. It should reflect whatever your existing licensing system already considers a valid, in-good-standing license: for example, the result of a recent successful validation against your licensing server. Harbor does not (and cannot) independently verify the key; it trusts the reporting plugin to decide whether the customer is currently entitled to use the product. Regardless of the `is_active` value reported here, Herald validates the key server-side when serving the actual ZIP download, so a falsely-reported `is_active = true` cannot be used to obtain a package the customer is not entitled to. diff --git a/docs/subsystems/features.md b/docs/subsystems/features.md index 5c06ca64..4786b697 100644 --- a/docs/subsystems/features.md +++ b/docs/subsystems/features.md @@ -102,7 +102,7 @@ Edge cases: - No licensing entry for a product (unlicensed): the resolver falls back to tier rank comparison using rank 0, making only free-tier features (`minimum_tier` at rank 0) available. Paid-tier features are unavailable. - A feature capable but outside the catalog tier: it is available — capabilities override the catalog tier. - A feature in the customer's catalog tier but absent from capabilities: it is unavailable — capabilities are the authority. -- An active legacy license whose `slug` matches a catalog feature marks that feature as available and in-tier, even with no Unified license or with a Unified tier that doesn't include the feature. The legacy `key` must be non-empty and `is_active` must be `true` for the grant to apply. This lets legacy customers continue to receive updates through Harbor without a Unified key. Resolution checks Unified entitlement first and treats legacy as a fallback grant; download URL construction uses the inverse order so the legacy key authenticates downloads for its specific slug. See [Portal: Download URL Builder](portal.md#download-url-builder) for the rationale and the resulting URL format. +- A legacy license whose `slug` matches a catalog feature can grant availability (and in-tier status) even with no Unified license, or with a Unified tier that doesn't include the feature. All four conditions must hold for the grant to apply: the entry's `key` is non-empty, `is_active` is `true`, and the reporting plugin has opted in with `use_for_updates = true`. The opt-in protects Harbor from advertising updates for legacy keys whose backend is not Stellar Licensing v3 compatible (e.g. SolidWP API keys), which would otherwise fail validation at Herald during download. Resolution checks Unified entitlement first and treats legacy as a fallback grant; download URL construction uses the inverse order so the legacy key authenticates downloads for its specific slug. See [Portal: Download URL Builder](portal.md#download-url-builder) for the rationale and the resulting URL format. ## The Manager diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index ac3dc17e..d203c49b 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -227,7 +227,7 @@ The two orders answer different questions: - *Resolution* asks "should this feature be shown as available at all?" Either source of entitlement is sufficient, and Unified is checked first because it is the canonical, modern source. - *URL building* asks "which key should authenticate the actual ZIP fetch?" Legacy keys are scoped to a specific slug via their `slug` field, so when a matching legacy entry exists, Harbor knows Herald will accept that key for that slug. The Unified key only authenticates features inside its `capabilities` array, and the URL builder does not consult licensing state to find out which features that includes. Preferring legacy when present therefore avoids generating Unified URLs that Herald would reject in mixed-entitlement scenarios (for example, a customer on a Unified tier that does not include a legacy add-on they still hold). -A legacy entry only contributes a URL when its `is_active` flag is `true` and its `key` is non-empty. Otherwise `Herald_Legacy_Url_Builder` returns an empty string and the router falls through to `Herald_Url_Builder`. +A legacy entry only contributes a URL when its `is_active` flag is `true`, its `key` is non-empty, and the reporting plugin has opted in with `use_for_updates = true`. The opt-in keeps Harbor from routing downloads for legacy keys whose backend is not Stellar Licensing v3 compatible. Otherwise `Herald_Legacy_Url_Builder` returns an empty string and the router falls through to `Herald_Url_Builder`. The router returns an empty string when neither builder can produce a URL — typically because the domain is empty, or because there is no matching active legacy key and no Unified key. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. diff --git a/src/Harbor/Features/Resolve_Feature_Collection.php b/src/Harbor/Features/Resolve_Feature_Collection.php index 18a3c7f4..ca8a6a19 100644 --- a/src/Harbor/Features/Resolve_Feature_Collection.php +++ b/src/Harbor/Features/Resolve_Feature_Collection.php @@ -25,8 +25,10 @@ * For each catalog feature, computes is_available and in_catalog_tier by checking * the product entry's capabilities array and the user's licensed tier rank. * dot.org and free-tier (rank 0) features are unconditionally available regardless of capabilities. - * An active legacy license whose slug matches the catalog feature also grants availability - * (and counts as in-tier), regardless of Unified capabilities or tier rank. + * A legacy license whose slug matches the catalog feature also grants availability (and counts + * as in-tier) when it is active, has a non-empty key, and has opted in via `use_for_updates`. + * The opt-in prevents Harbor from advertising updates for legacy keys whose backend is not + * compatible with Herald's `/legacy/download` endpoint. * * @since 1.0.0 */ @@ -263,9 +265,9 @@ private function is_license_invalid( ?string $validation_status ): bool { * and computes is_available and in_catalog_tier. * * dot.org and free-tier (rank 0) features are unconditionally available regardless of capabilities. - * An active legacy license whose slug matches the catalog feature also grants availability and - * counts as in-tier, regardless of Unified capabilities or tier rank. The legacy key must be - * non-empty for the grant to apply. + * A legacy license whose slug matches the catalog feature also grants availability and counts as + * in-tier, regardless of Unified capabilities or tier rank, when the entry is active, has a + * non-empty key, and has opted in via `use_for_updates`. * * @since 1.0.0 * @@ -302,7 +304,8 @@ private function hydrate_feature( $legacy_license = $this->legacy_repository->find( $catalog_feature->get_slug() ); $has_legacy_grant = $legacy_license !== null && $legacy_license->is_active - && $legacy_license->key !== ''; + && $legacy_license->key !== '' + && $legacy_license->use_for_updates; if ( $has_legacy_grant || $catalog_feature->is_wporg() || $minimum_rank === 0 ) { // An active legacy grant, WordPress.org, and free-tier features are all unconditionally available. diff --git a/src/Harbor/Features/Update/Plugin_Handler.php b/src/Harbor/Features/Update/Plugin_Handler.php index 252f08c3..b656a08d 100644 --- a/src/Harbor/Features/Update/Plugin_Handler.php +++ b/src/Harbor/Features/Update/Plugin_Handler.php @@ -101,9 +101,9 @@ public function filter_plugins_api( $result, ?string $action = null, $args = nul return $result; } - // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. - // The downstream resolver still checks is_active per-feature before granting availability. - if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { + // Cheap gate: skip when there is neither a Unified key nor any legacy entry opted into updates. + // The downstream resolver still confirms each legacy entry's grant before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->any_used_for_updates() ) { return $result; } @@ -182,9 +182,9 @@ public function filter_update_check( $transient ) { $transient = new stdClass(); } - // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. - // The downstream resolver still checks is_active per-feature before granting availability. - if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { + // Cheap gate: skip when there is neither a Unified key nor any legacy entry opted into updates. + // The downstream resolver still confirms each legacy entry's grant before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->any_used_for_updates() ) { return $transient; } diff --git a/src/Harbor/Features/Update/Theme_Handler.php b/src/Harbor/Features/Update/Theme_Handler.php index 5e373b48..e40ca32f 100644 --- a/src/Harbor/Features/Update/Theme_Handler.php +++ b/src/Harbor/Features/Update/Theme_Handler.php @@ -102,9 +102,9 @@ public function filter_themes_api( $result, ?string $action = null, $args = null return $result; } - // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. - // The downstream resolver still checks is_active per-feature before granting availability. - if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { + // Cheap gate: skip when there is neither a Unified key nor any legacy entry opted into updates. + // The downstream resolver still confirms each legacy entry's grant before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->any_used_for_updates() ) { return $result; } @@ -171,9 +171,9 @@ public function filter_update_check( $transient ) { $transient = new stdClass(); } - // Cheap gate: any legacy entry (active or not) is enough to attempt resolution. - // The downstream resolver still checks is_active per-feature before granting availability. - if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->has_any() ) { + // Cheap gate: skip when there is neither a Unified key nor any legacy entry opted into updates. + // The downstream resolver still confirms each legacy entry's grant before granting availability. + if ( empty( $this->license_manager->get_key() ) && ! $this->legacy_repository->any_used_for_updates() ) { return $transient; } diff --git a/src/Harbor/Legacy/Legacy_License.php b/src/Harbor/Legacy/Legacy_License.php index 81c474e1..06ea34bc 100644 --- a/src/Harbor/Legacy/Legacy_License.php +++ b/src/Harbor/Legacy/Legacy_License.php @@ -50,6 +50,25 @@ class Legacy_License { */ public bool $is_active; + /** + * Whether the reporting plugin opts this entry into Harbor's update pipeline. + * + * When true, the key is treated as compatible with Herald's `/legacy/download` + * endpoint (Stellar Licensing v3): it grants catalog feature availability for + * its slug and is used to build the download URL. When false (the default), + * the entry is informational only and continues to appear in the licensing UI + * and admin notices, but has no effect on feature availability or updates. + * + * Default false to avoid surfacing "update available" badges for keys whose + * legacy licensing backend is not Stellar/Herald-compatible, which would + * otherwise fail the actual server-side download. + * + * @since TBD + * + * @var bool + */ + public bool $use_for_updates; + /** * @since 1.0.0 * @@ -71,13 +90,14 @@ class Legacy_License { */ public function to_array(): array { return [ - 'key' => $this->key, - 'slug' => $this->slug, - 'name' => $this->name, - 'product' => $this->product, - 'is_active' => $this->is_active, - 'page_url' => $this->page_url, - 'expires_at' => $this->expires_at, + 'key' => $this->key, + 'slug' => $this->slug, + 'name' => $this->name, + 'product' => $this->product, + 'is_active' => $this->is_active, + 'use_for_updates' => $this->use_for_updates, + 'page_url' => $this->page_url, + 'expires_at' => $this->expires_at, ]; } @@ -89,13 +109,14 @@ public function to_array(): array { public static function from_data( array $data ): Legacy_License { $self = new self(); - $self->key = Cast::to_string( $data['key'] ?? '' ); - $self->slug = Cast::to_string( $data['slug'] ?? '' ); - $self->name = Cast::to_string( $data['name'] ?? '' ); - $self->product = Cast::to_string( $data['product'] ?? '' ); - $self->is_active = (bool) ( $data['is_active'] ?? false ); - $self->page_url = Cast::to_string( $data['page_url'] ?? '' ); - $self->expires_at = Cast::to_string( $data['expires_at'] ?? '' ); + $self->key = Cast::to_string( $data['key'] ?? '' ); + $self->slug = Cast::to_string( $data['slug'] ?? '' ); + $self->name = Cast::to_string( $data['name'] ?? '' ); + $self->product = Cast::to_string( $data['product'] ?? '' ); + $self->is_active = (bool) ( $data['is_active'] ?? false ); + $self->use_for_updates = (bool) ( $data['use_for_updates'] ?? false ); + $self->page_url = Cast::to_string( $data['page_url'] ?? '' ); + $self->expires_at = Cast::to_string( $data['expires_at'] ?? '' ); return $self; } diff --git a/src/Harbor/Legacy/License_Repository.php b/src/Harbor/Legacy/License_Repository.php index 257c445a..90564496 100644 --- a/src/Harbor/Legacy/License_Repository.php +++ b/src/Harbor/Legacy/License_Repository.php @@ -122,4 +122,25 @@ public function find( string $slug ): ?Legacy_License { public function has_any(): bool { return count( $this->all() ) > 0; } + + /** + * Whether any reported legacy license has opted into Harbor's update pipeline. + * + * Used as the cheap pre-check for update handlers: if no reported entry has + * `use_for_updates = true`, there is no work to do regardless of how many + * informational legacy entries exist. + * + * @since TBD + * + * @return bool + */ + public function any_used_for_updates(): bool { + foreach ( $this->all() as $license ) { + if ( $license->use_for_updates ) { + return true; + } + } + + return false; + } } diff --git a/src/Harbor/Portal/Herald_Legacy_Url_Builder.php b/src/Harbor/Portal/Herald_Legacy_Url_Builder.php index afb75979..e5a0aa67 100644 --- a/src/Harbor/Portal/Herald_Legacy_Url_Builder.php +++ b/src/Harbor/Portal/Herald_Legacy_Url_Builder.php @@ -18,9 +18,10 @@ * URL format: `{herald_base_url}/legacy/download?plugin={slug}&key={legacy_key}&site={domain}` * * Returns an empty string when the domain is missing, when no legacy entry - * matches the slug, when the matched entry is inactive, or when its key is - * empty. `Herald_Routing_Url_Builder` treats an empty return as "no legacy - * URL available for this slug" and falls back to the Unified builder. + * matches the slug, when the matched entry is inactive, when its key is empty, + * or when the entry has not opted in via `use_for_updates`. + * `Herald_Routing_Url_Builder` treats an empty return as "no legacy URL + * available for this slug" and falls back to the Unified builder. * * @since TBD */ @@ -75,7 +76,7 @@ public function build( string $slug ): string { $legacy = $this->legacy_repository->find( $slug ); - if ( $legacy === null || ! $legacy->is_active || $legacy->key === '' ) { + if ( $legacy === null || ! $legacy->is_active || $legacy->key === '' || ! $legacy->use_for_updates ) { return ''; } diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php index 0b95ff8d..f1f652ec 100644 --- a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -38,13 +38,14 @@ protected function tearDown(): void { */ private function register_legacy_license( array $overrides = [] ): void { $defaults = [ - 'key' => 'legacy-key-1234', - 'slug' => 'kad-blocks-pro', - 'name' => 'Kadence Blocks Pro', - 'product' => 'kadence', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', + 'key' => 'legacy-key-1234', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'use_for_updates' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', ]; $entry = array_merge( $defaults, $overrides ); @@ -360,6 +361,29 @@ public function test_paid_feature_without_legacy_or_unified_license_is_unavailab $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); } + /** + * Tests that an active legacy entry without `use_for_updates` opt-in does not grant availability. + * + * Covers the case where a plugin reports a legacy license whose backend is not + * compatible with Harbor's update pipeline (e.g. SolidWP API keys): Harbor must + * not advertise updates for these slugs because the download would fail validation. + * + * @return void + */ + public function test_paid_feature_legacy_without_use_for_updates_opt_in_is_unavailable(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'use_for_updates' => false, + ] + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', false, false ); + } + /** * Tests that the resolver still picks up legacy entries from the global filter * when constructed without the optional Legacy_License_Repository argument. diff --git a/tests/wpunit/Features/Update/Plugin_HandlerTest.php b/tests/wpunit/Features/Update/Plugin_HandlerTest.php index ab5fb685..d16b49c8 100644 --- a/tests/wpunit/Features/Update/Plugin_HandlerTest.php +++ b/tests/wpunit/Features/Update/Plugin_HandlerTest.php @@ -503,18 +503,19 @@ public function test_filter_update_check_skips_uninstalled_plugin(): void { * * @return void */ - private function register_legacy_license( string $slug, string $key = 'legacy-key-123' ): void { + private function register_legacy_license( string $slug, string $key = 'legacy-key-123', bool $use_for_updates = true ): void { add_filter( 'lw-harbor/legacy_licenses', - static function ( array $licenses ) use ( $slug, $key ) { + static function ( array $licenses ) use ( $slug, $key, $use_for_updates ) { $licenses[] = [ - 'key' => $key, - 'slug' => $slug, - 'name' => 'Legacy ' . $slug, - 'product' => 'legacy-product', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', + 'key' => $key, + 'slug' => $slug, + 'name' => 'Legacy ' . $slug, + 'product' => 'legacy-product', + 'is_active' => true, + 'use_for_updates' => $use_for_updates, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', ]; return $licenses; @@ -631,4 +632,31 @@ public function test_filter_update_check_returns_transient_when_no_unified_key_a $this->assertSame( $transient, $result ); } + + /** + * Tests filter_update_check short-circuits when no Unified key is stored and + * the only legacy entries present have not opted into updates. + * + * @return void + */ + public function test_filter_update_check_returns_transient_when_legacy_has_not_opted_in(): void { + $this->register_legacy_license( 'my-plugin', 'legacy-key-123', false ); + + $update_data = [ + 'my-plugin' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-plugin.zip', + 'plugin_file' => 'my-plugin/my-plugin.php', + 'has_update' => true, + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $transient = new stdClass(); + + $result = $handler->filter_update_check( $transient ); + + $this->assertObjectNotHasProperty( 'response', $result, 'Handler should bail before populating response when only opt-out legacy entries exist.' ); + } } diff --git a/tests/wpunit/Features/Update/Theme_HandlerTest.php b/tests/wpunit/Features/Update/Theme_HandlerTest.php index b0702d8b..4a86ac54 100644 --- a/tests/wpunit/Features/Update/Theme_HandlerTest.php +++ b/tests/wpunit/Features/Update/Theme_HandlerTest.php @@ -446,18 +446,19 @@ public function test_filter_update_check_skips_uninstalled_theme(): void { * * @return void */ - private function register_legacy_license( string $slug, string $key = 'legacy-key-123' ): void { + private function register_legacy_license( string $slug, string $key = 'legacy-key-123', bool $use_for_updates = true ): void { add_filter( 'lw-harbor/legacy_licenses', - static function ( array $licenses ) use ( $slug, $key ) { + static function ( array $licenses ) use ( $slug, $key, $use_for_updates ) { $licenses[] = [ - 'key' => $key, - 'slug' => $slug, - 'name' => 'Legacy ' . $slug, - 'product' => 'legacy-product', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', + 'key' => $key, + 'slug' => $slug, + 'name' => 'Legacy ' . $slug, + 'product' => 'legacy-product', + 'is_active' => true, + 'use_for_updates' => $use_for_updates, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', ]; return $licenses; @@ -571,4 +572,30 @@ public function test_filter_update_check_returns_transient_when_no_unified_key_a $this->assertSame( $transient, $result ); } + + /** + * Tests filter_update_check short-circuits when no Unified key is stored and + * the only legacy entries present have not opted into updates. + * + * @return void + */ + public function test_filter_update_check_returns_transient_when_legacy_has_not_opted_in(): void { + $this->register_legacy_license( 'my-theme', 'legacy-key-123', false ); + + $update_data = [ + 'my-theme' => [ + 'version' => '2.0.0', + 'package' => 'https://example.com/my-theme.zip', + 'has_update' => true, + ], + ]; + + $handler = $this->handler_with_feature_and_no_unified_key( $update_data ); + + $transient = new stdClass(); + + $result = $handler->filter_update_check( $transient ); + + $this->assertObjectNotHasProperty( 'response', $result, 'Handler should bail before populating response when only opt-out legacy entries exist.' ); + } } diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index 5eca6173..787d8c9a 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -379,4 +379,64 @@ static function ( array $licenses ) { $this->assertTrue( $this->repository->has_any() ); } + + /** + * @since TBD + */ + public function test_any_used_for_updates_returns_false_when_no_entry_opts_in(): void { + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) { + $licenses[] = [ + 'key' => 'k1', + 'slug' => 's1', + 'name' => 'N', + 'product' => 'B', + 'is_active' => true, + 'use_for_updates' => false, + ]; + $licenses[] = [ + 'key' => 'k2', + 'slug' => 's2', + 'name' => 'N', + 'product' => 'B', + ]; + + return $licenses; + } + ); + + $this->assertFalse( $this->repository->any_used_for_updates() ); + } + + /** + * @since TBD + */ + public function test_any_used_for_updates_returns_true_when_at_least_one_entry_opts_in(): void { + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) { + $licenses[] = [ + 'key' => 'k1', + 'slug' => 's1', + 'name' => 'N', + 'product' => 'B', + 'is_active' => true, + 'use_for_updates' => false, + ]; + $licenses[] = [ + 'key' => 'k2', + 'slug' => 's2', + 'name' => 'N', + 'product' => 'B', + 'is_active' => true, + 'use_for_updates' => true, + ]; + + return $licenses; + } + ); + + $this->assertTrue( $this->repository->any_used_for_updates() ); + } } diff --git a/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php index 30298463..8d5b7a09 100644 --- a/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Legacy_Url_BuilderTest.php @@ -42,13 +42,14 @@ private function make_builder( string $domain ): Herald_Legacy_Url_Builder { */ private function register_legacy_license( array $overrides = [] ): void { $defaults = [ - 'key' => 'legacy-key-1234', - 'slug' => 'kad-blocks-pro', - 'name' => 'Kadence Blocks Pro', - 'product' => 'kadence', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', + 'key' => 'legacy-key-1234', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'use_for_updates' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', ]; $entry = array_merge( $defaults, $overrides ); @@ -190,6 +191,26 @@ public function test_build_rawurlencodes_all_params(): void { $this->assertStringContainsString( 'site=my%20site.example.com', $url ); } + /** + * Tests that an entry without `use_for_updates` opt-in produces no URL, + * even when otherwise active and matching. + * + * @return void + */ + public function test_build_returns_empty_when_legacy_has_not_opted_into_updates(): void { + $this->register_legacy_license( + [ + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'use_for_updates' => false, + ] + ); + + $builder = $this->make_builder( self::TEST_DOMAIN ); + + $this->assertSame( '', $builder->build( 'kad-blocks-pro' ) ); + } + /** * Tests that the builder uses the Herald base URL configured on Config. * diff --git a/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php b/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php index 9ad198ed..d9b166ac 100644 --- a/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php +++ b/tests/wpunit/Portal/Herald_Routing_Url_BuilderTest.php @@ -51,13 +51,14 @@ private function make_router( ?string $unified_key, bool $with_matching_legacy ) 'lw-harbor/legacy_licenses', static function ( array $licenses ): array { $licenses[] = [ - 'key' => 'legacy-key-abc', - 'slug' => 'kad-blocks-pro', - 'name' => 'Kadence Blocks Pro', - 'product' => 'kadence', - 'is_active' => true, - 'page_url' => 'https://example.com/manage', - 'expires_at' => '', + 'key' => 'legacy-key-abc', + 'slug' => 'kad-blocks-pro', + 'name' => 'Kadence Blocks Pro', + 'product' => 'kadence', + 'is_active' => true, + 'use_for_updates' => true, + 'page_url' => 'https://example.com/manage', + 'expires_at' => '', ]; return $licenses; From ef6d83cb9955c67edb3bf971ac3611d293984e65 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 14:47:38 -0400 Subject: [PATCH 16/24] docs(tests): add Tests/@return docblocks to any_used_for_updates tests --- tests/wpunit/Legacy/License_RepositoryTest.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index 787d8c9a..f8d74ca3 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -381,7 +381,9 @@ static function ( array $licenses ) { } /** - * @since TBD + * Tests that any_used_for_updates() returns false when every registered legacy entry omits or opts out of use_for_updates. + * + * @return void */ public function test_any_used_for_updates_returns_false_when_no_entry_opts_in(): void { add_filter( @@ -410,7 +412,9 @@ static function ( array $licenses ) { } /** - * @since TBD + * Tests that any_used_for_updates() returns true when at least one registered legacy entry has use_for_updates set to true. + * + * @return void */ public function test_any_used_for_updates_returns_true_when_at_least_one_entry_opts_in(): void { add_filter( From 169d2dd043b76acbaf2aa84fa17e3ee4bcd44e65 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Mon, 18 May 2026 14:51:26 -0400 Subject: [PATCH 17/24] docs(portal): drop em dashes from URL builder section --- docs/subsystems/portal.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/subsystems/portal.md b/docs/subsystems/portal.md index d203c49b..855a468f 100644 --- a/docs/subsystems/portal.md +++ b/docs/subsystems/portal.md @@ -218,7 +218,7 @@ Harbor ships three Herald implementations of the contract, each with a single, f | `Herald_Legacy_Url_Builder` | `{base}/legacy/download?plugin={slug}&key={legacy_key}&site={domain}` | Active legacy entry via `Legacy\License_Repository::find()`, domain via `Site\Data` | | `Herald_Routing_Url_Builder` | Delegates to one of the above | The two builders above | -`Herald_Routing_Url_Builder` is the implementation bound to `Download_Url_Builder` in the container. It tries the legacy builder first, then falls back to the Unified builder when legacy returns an empty string. Each underlying builder returns an empty string when it cannot satisfy the slug (no covering legacy entry, no Unified key, or no domain), so the routing class needs no licensing state of its own — the policy is "first non-empty wins." +`Herald_Routing_Url_Builder` is the implementation bound to `Download_Url_Builder` in the container. It tries the legacy builder first, then falls back to the Unified builder when legacy returns an empty string. Each underlying builder returns an empty string when it cannot satisfy the slug (no covering legacy entry, no Unified key, or no domain), so the routing class needs no licensing state of its own; the policy is simply "first non-empty wins." **Precedence.** An active legacy license whose `slug` matches the requested feature wins over a stored Unified key. This is intentional and deliberately inverts the order used during feature resolution (see [Features: Resolution](features.md#resolution), where Unified is the primary and Legacy is the fallback grant). @@ -229,7 +229,7 @@ The two orders answer different questions: A legacy entry only contributes a URL when its `is_active` flag is `true`, its `key` is non-empty, and the reporting plugin has opted in with `use_for_updates = true`. The opt-in keeps Harbor from routing downloads for legacy keys whose backend is not Stellar Licensing v3 compatible. Otherwise `Herald_Legacy_Url_Builder` returns an empty string and the router falls through to `Herald_Url_Builder`. -The router returns an empty string when neither builder can produce a URL — typically because the domain is empty, or because there is no matching active legacy key and no Unified key. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. +The router returns an empty string when neither builder can produce a URL. That typically means the domain is empty, or that there is no matching active legacy key and no Unified key. The Herald base URL defaults to `https://herald.stellarwp.com` and is configurable via `Config::set_herald_base_url()`. To swap the download backend entirely (point at a different service, inject a test double), register a different binding for `Download_Url_Builder::class`. From 1d6299f76fd6ddd08d7e26b0e718a418e0348b2d Mon Sep 17 00:00:00 2001 From: d4mation <7770631+d4mation@users.noreply.github.com> Date: Mon, 18 May 2026 19:51:52 +0000 Subject: [PATCH 18/24] Build frontend assets --- build-dev/index-rtl.css | 5 +++++ build-dev/index.asset.php | 2 +- build-dev/index.css | 5 +++++ build-dev/index.css.map | 2 +- build/index-rtl.css | 2 +- build/index.asset.php | 2 +- build/index.css | 2 +- 7 files changed, 15 insertions(+), 5 deletions(-) diff --git a/build-dev/index-rtl.css b/build-dev/index-rtl.css index e177a716..7e9b1eba 100644 --- a/build-dev/index-rtl.css +++ b/build-dev/index-rtl.css @@ -1260,6 +1260,11 @@ .lw-harbor-ui .filter { filter: var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,) !important; } + .lw-harbor-ui .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --lw-harbor-tw-gradient-from, --lw-harbor-tw-gradient-via, --lw-harbor-tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, backdrop-filter, display, content-visibility, overlay, pointer-events !important; + transition-timing-function: var(--lw-harbor-tw-ease, var(--default-transition-timing-function)) !important; + transition-duration: var(--lw-harbor-tw-duration, var(--default-transition-duration)) !important; + } .lw-harbor-ui .transition-\[border-radius\] { transition-property: border-radius !important; transition-timing-function: var(--lw-harbor-tw-ease, var(--default-transition-timing-function)) !important; diff --git a/build-dev/index.asset.php b/build-dev/index.asset.php index b22a7169..7196a288 100644 --- a/build-dev/index.asset.php +++ b/build-dev/index.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'f86224dd411ed4993f5f'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '33c1bc733d782aa2a48c'); diff --git a/build-dev/index.css b/build-dev/index.css index f4e5dde4..828d0fc8 100644 --- a/build-dev/index.css +++ b/build-dev/index.css @@ -1260,6 +1260,11 @@ .lw-harbor-ui .filter { filter: var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,) !important; } + .lw-harbor-ui .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --lw-harbor-tw-gradient-from, --lw-harbor-tw-gradient-via, --lw-harbor-tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, backdrop-filter, display, content-visibility, overlay, pointer-events !important; + transition-timing-function: var(--lw-harbor-tw-ease, var(--default-transition-timing-function)) !important; + transition-duration: var(--lw-harbor-tw-duration, var(--default-transition-duration)) !important; + } .lw-harbor-ui .transition-\[border-radius\] { transition-property: border-radius !important; transition-timing-function: var(--lw-harbor-tw-ease, var(--default-transition-timing-function)) !important; diff --git a/build-dev/index.css.map b/build-dev/index.css.map index 0dfbfd6e..4f28390d 100644 --- a/build-dev/index.css.map +++ b/build-dev/index.css.map @@ -1 +1 @@ -{"version":3,"file":"index.css","mappings":"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","sources":["webpack://@stellarwp/harbor/","webpack://@stellarwp/harbor/./node_modules/tailwindcss/index.css","webpack://@stellarwp/harbor/./resources/css/globals.css"],"sourcesContent":[null,"@layer theme, base, components, utilities;\n\n@layer theme {\n @theme default {\n --font-sans:\n ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-serif: ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif;\n --font-mono:\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-200: oklch(88.5% 0.062 18.334);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-red-800: oklch(44.4% 0.177 26.899);\n --color-red-900: oklch(39.6% 0.141 25.723);\n --color-red-950: oklch(25.8% 0.092 26.042);\n\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-100: oklch(95.4% 0.038 75.164);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-300: oklch(83.7% 0.128 66.29);\n --color-orange-400: oklch(75% 0.183 55.934);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-600: oklch(64.6% 0.222 41.116);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-orange-800: oklch(47% 0.157 37.304);\n --color-orange-900: oklch(40.8% 0.123 38.172);\n --color-orange-950: oklch(26.6% 0.079 36.259);\n\n --color-amber-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\n --color-amber-200: oklch(92.4% 0.12 95.746);\n --color-amber-300: oklch(87.9% 0.169 91.605);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-amber-900: oklch(41.4% 0.112 45.904);\n --color-amber-950: oklch(27.9% 0.077 45.635);\n\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-100: oklch(97.3% 0.071 103.193);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-300: oklch(90.5% 0.182 98.111);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-500: oklch(79.5% 0.184 86.047);\n --color-yellow-600: oklch(68.1% 0.162 75.834);\n --color-yellow-700: oklch(55.4% 0.135 66.442);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n --color-lime-50: oklch(98.6% 0.031 120.757);\n --color-lime-100: oklch(96.7% 0.067 122.328);\n --color-lime-200: oklch(93.8% 0.127 124.321);\n --color-lime-300: oklch(89.7% 0.196 126.665);\n --color-lime-400: oklch(84.1% 0.238 128.85);\n --color-lime-500: oklch(76.8% 0.233 130.85);\n --color-lime-600: oklch(64.8% 0.2 131.684);\n --color-lime-700: oklch(53.2% 0.157 131.589);\n --color-lime-800: oklch(45.3% 0.124 130.933);\n --color-lime-900: oklch(40.5% 0.101 131.063);\n --color-lime-950: oklch(27.4% 0.072 132.109);\n\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-300: oklch(87.1% 0.15 154.449);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-green-900: oklch(39.3% 0.095 152.535);\n --color-green-950: oklch(26.6% 0.065 152.934);\n\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\n --color-emerald-200: oklch(90.5% 0.093 164.15);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-emerald-800: oklch(43.2% 0.095 166.913);\n --color-emerald-900: oklch(37.8% 0.077 168.94);\n --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n --color-teal-50: oklch(98.4% 0.014 180.72);\n --color-teal-100: oklch(95.3% 0.051 180.801);\n --color-teal-200: oklch(91% 0.096 180.426);\n --color-teal-300: oklch(85.5% 0.138 181.071);\n --color-teal-400: oklch(77.7% 0.152 181.912);\n --color-teal-500: oklch(70.4% 0.14 182.503);\n --color-teal-600: oklch(60% 0.118 184.704);\n --color-teal-700: oklch(51.1% 0.096 186.391);\n --color-teal-800: oklch(43.7% 0.078 188.216);\n --color-teal-900: oklch(38.6% 0.063 188.416);\n --color-teal-950: oklch(27.7% 0.046 192.524);\n\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-200: oklch(91.7% 0.08 205.041);\n --color-cyan-300: oklch(86.5% 0.127 207.078);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-500: oklch(71.5% 0.143 215.221);\n --color-cyan-600: oklch(60.9% 0.126 221.723);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-cyan-800: oklch(45% 0.085 224.283);\n --color-cyan-900: oklch(39.8% 0.07 227.392);\n --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n --color-sky-50: oklch(97.7% 0.013 236.62);\n --color-sky-100: oklch(95.1% 0.026 236.824);\n --color-sky-200: oklch(90.1% 0.058 230.902);\n --color-sky-300: oklch(82.8% 0.111 230.318);\n --color-sky-400: oklch(74.6% 0.16 232.661);\n --color-sky-500: oklch(68.5% 0.169 237.323);\n --color-sky-600: oklch(58.8% 0.158 241.966);\n --color-sky-700: oklch(50% 0.134 242.749);\n --color-sky-800: oklch(44.3% 0.11 240.79);\n --color-sky-900: oklch(39.1% 0.09 240.876);\n --color-sky-950: oklch(29.3% 0.066 243.157);\n\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-300: oklch(80.9% 0.105 251.813);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n\n --color-indigo-50: oklch(96.2% 0.018 272.314);\n --color-indigo-100: oklch(93% 0.034 272.788);\n --color-indigo-200: oklch(87% 0.065 274.039);\n --color-indigo-300: oklch(78.5% 0.115 274.713);\n --color-indigo-400: oklch(67.3% 0.182 276.935);\n --color-indigo-500: oklch(58.5% 0.233 277.117);\n --color-indigo-600: oklch(51.1% 0.262 276.966);\n --color-indigo-700: oklch(45.7% 0.24 277.023);\n --color-indigo-800: oklch(39.8% 0.195 277.366);\n --color-indigo-900: oklch(35.9% 0.144 278.697);\n --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n --color-violet-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\n --color-violet-200: oklch(89.4% 0.057 293.283);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-violet-800: oklch(43.2% 0.232 292.759);\n --color-violet-900: oklch(38% 0.189 293.745);\n --color-violet-950: oklch(28.3% 0.141 291.089);\n\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-300: oklch(82.7% 0.119 306.383);\n --color-purple-400: oklch(71.4% 0.203 305.504);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-600: oklch(55.8% 0.288 302.321);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-purple-800: oklch(43.8% 0.218 303.724);\n --color-purple-900: oklch(38.1% 0.176 304.987);\n --color-purple-950: oklch(29.1% 0.149 302.717);\n\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-300: oklch(82.3% 0.12 346.018);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-900: oklch(40.8% 0.153 2.432);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-200: oklch(89.2% 0.058 10.001);\n --color-rose-300: oklch(81% 0.117 11.638);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-500: oklch(64.5% 0.246 16.439);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-rose-800: oklch(45.5% 0.188 13.697);\n --color-rose-900: oklch(41% 0.159 10.272);\n --color-rose-950: oklch(27.1% 0.105 12.094);\n\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-slate-800: oklch(27.9% 0.041 260.031);\n --color-slate-900: oklch(20.8% 0.042 265.755);\n --color-slate-950: oklch(12.9% 0.042 264.695);\n\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-gray-950: oklch(13% 0.028 261.692);\n\n --color-zinc-50: oklch(98.5% 0 0);\n --color-zinc-100: oklch(96.7% 0.001 286.375);\n --color-zinc-200: oklch(92% 0.004 286.32);\n --color-zinc-300: oklch(87.1% 0.006 286.286);\n --color-zinc-400: oklch(70.5% 0.015 286.067);\n --color-zinc-500: oklch(55.2% 0.016 285.938);\n --color-zinc-600: oklch(44.2% 0.017 285.786);\n --color-zinc-700: oklch(37% 0.013 285.805);\n --color-zinc-800: oklch(27.4% 0.006 286.033);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n --color-neutral-50: oklch(98.5% 0 0);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-200: oklch(92.2% 0 0);\n --color-neutral-300: oklch(87% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-neutral-600: oklch(43.9% 0 0);\n --color-neutral-700: oklch(37.1% 0 0);\n --color-neutral-800: oklch(26.9% 0 0);\n --color-neutral-900: oklch(20.5% 0 0);\n --color-neutral-950: oklch(14.5% 0 0);\n\n --color-stone-50: oklch(98.5% 0.001 106.423);\n --color-stone-100: oklch(97% 0.001 106.424);\n --color-stone-200: oklch(92.3% 0.003 48.717);\n --color-stone-300: oklch(86.9% 0.005 56.366);\n --color-stone-400: oklch(70.9% 0.01 56.259);\n --color-stone-500: oklch(55.3% 0.013 58.071);\n --color-stone-600: oklch(44.4% 0.011 73.639);\n --color-stone-700: oklch(37.4% 0.01 67.558);\n --color-stone-800: oklch(26.8% 0.007 34.298);\n --color-stone-900: oklch(21.6% 0.006 56.043);\n --color-stone-950: oklch(14.7% 0.004 49.25);\n\n --color-mauve-50: oklch(98.5% 0 0);\n --color-mauve-100: oklch(96% 0.003 325.6);\n --color-mauve-200: oklch(92.2% 0.005 325.62);\n --color-mauve-300: oklch(86.5% 0.012 325.68);\n --color-mauve-400: oklch(71.1% 0.019 323.02);\n --color-mauve-500: oklch(54.2% 0.034 322.5);\n --color-mauve-600: oklch(43.5% 0.029 321.78);\n --color-mauve-700: oklch(36.4% 0.029 323.89);\n --color-mauve-800: oklch(26.3% 0.024 320.12);\n --color-mauve-900: oklch(21.2% 0.019 322.12);\n --color-mauve-950: oklch(14.5% 0.008 326);\n\n --color-olive-50: oklch(98.8% 0.003 106.5);\n --color-olive-100: oklch(96.6% 0.005 106.5);\n --color-olive-200: oklch(93% 0.007 106.5);\n --color-olive-300: oklch(88% 0.011 106.6);\n --color-olive-400: oklch(73.7% 0.021 106.9);\n --color-olive-500: oklch(58% 0.031 107.3);\n --color-olive-600: oklch(46.6% 0.025 107.3);\n --color-olive-700: oklch(39.4% 0.023 107.4);\n --color-olive-800: oklch(28.6% 0.016 107.4);\n --color-olive-900: oklch(22.8% 0.013 107.4);\n --color-olive-950: oklch(15.3% 0.006 107.1);\n\n --color-mist-50: oklch(98.7% 0.002 197.1);\n --color-mist-100: oklch(96.3% 0.002 197.1);\n --color-mist-200: oklch(92.5% 0.005 214.3);\n --color-mist-300: oklch(87.2% 0.007 219.6);\n --color-mist-400: oklch(72.3% 0.014 214.4);\n --color-mist-500: oklch(56% 0.021 213.5);\n --color-mist-600: oklch(45% 0.017 213.2);\n --color-mist-700: oklch(37.8% 0.015 216);\n --color-mist-800: oklch(27.5% 0.011 216.9);\n --color-mist-900: oklch(21.8% 0.008 223.9);\n --color-mist-950: oklch(14.8% 0.004 228.8);\n\n --color-taupe-50: oklch(98.6% 0.002 67.8);\n --color-taupe-100: oklch(96% 0.002 17.2);\n --color-taupe-200: oklch(92.2% 0.005 34.3);\n --color-taupe-300: oklch(86.8% 0.007 39.5);\n --color-taupe-400: oklch(71.4% 0.014 41.2);\n --color-taupe-500: oklch(54.7% 0.021 43.1);\n --color-taupe-600: oklch(43.8% 0.017 39.3);\n --color-taupe-700: oklch(36.7% 0.016 35.7);\n --color-taupe-800: oklch(26.8% 0.011 36.5);\n --color-taupe-900: oklch(21.4% 0.009 43.1);\n --color-taupe-950: oklch(14.7% 0.004 49.3);\n\n --color-black: #000;\n --color-white: #fff;\n\n --spacing: 0.25rem;\n\n --breakpoint-sm: 40rem;\n --breakpoint-md: 48rem;\n --breakpoint-lg: 64rem;\n --breakpoint-xl: 80rem;\n --breakpoint-2xl: 96rem;\n\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-6xl: 3.75rem;\n --text-6xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--line-height: 1;\n --text-8xl: 6rem;\n --text-8xl--line-height: 1;\n --text-9xl: 8rem;\n --text-9xl--line-height: 1;\n\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md:\n 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg:\n 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl:\n 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075),\n 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1),\n 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1),\n 0px 4px 8px rgb(0 0 0 / 0.1);\n\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n @keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n }\n\n @keyframes bounce {\n 0%,\n 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n }\n\n --blur-xs: 4px;\n --blur-sm: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n\n --perspective-dramatic: 100px;\n --perspective-near: 300px;\n --perspective-normal: 500px;\n --perspective-midrange: 800px;\n --perspective-distant: 1200px;\n\n --aspect-video: 16 / 9;\n\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: --theme(--font-sans, initial);\n --default-font-feature-settings: --theme(\n --font-sans--font-feature-settings,\n initial\n );\n --default-font-variation-settings: --theme(\n --font-sans--font-variation-settings,\n initial\n );\n --default-mono-font-family: --theme(--font-mono, initial);\n --default-mono-font-feature-settings: --theme(\n --font-mono--font-feature-settings,\n initial\n );\n --default-mono-font-variation-settings: --theme(\n --font-mono--font-variation-settings,\n initial\n );\n }\n\n /* Deprecated */\n @theme default inline reference {\n --blur: 8px;\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n --radius: 0.25rem;\n --max-width-prose: 65ch;\n }\n}\n\n@layer base {\n /*\n 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n 2. Remove default margins and padding\n 3. Reset all borders.\n*/\n\n *,\n ::after,\n ::before,\n ::backdrop,\n ::file-selector-button {\n box-sizing: border-box; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 2 */\n border: 0 solid; /* 3 */\n }\n\n /*\n 1. Use a consistent sensible line-height in all browsers.\n 2. Prevent adjustments of font size after orientation changes in iOS.\n 3. Use a more readable tab size.\n 4. Use the user's configured `sans` font-family by default.\n 5. Use the user's configured `sans` font-feature-settings by default.\n 6. Use the user's configured `sans` font-variation-settings by default.\n 7. Disable tap highlights on iOS.\n*/\n\n html,\n :host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n tab-size: 4; /* 3 */\n font-family: --theme(\n --default-font-family,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n ); /* 4 */\n font-feature-settings: --theme(\n --default-font-feature-settings,\n normal\n ); /* 5 */\n font-variation-settings: --theme(\n --default-font-variation-settings,\n normal\n ); /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n }\n\n /*\n 1. Add the correct height in Firefox.\n 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n 3. Reset the default border style to a 1px solid border.\n*/\n\n hr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n }\n\n /*\n Add the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n\n /*\n Remove the default font size and weight for headings.\n*/\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n\n /*\n Reset links to optimize for opt-in styling instead of opt-out.\n*/\n\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n\n /*\n Add the correct font weight in Edge and Safari.\n*/\n\n b,\n strong {\n font-weight: bolder;\n }\n\n /*\n 1. Use the user's configured `mono` font-family by default.\n 2. Use the user's configured `mono` font-feature-settings by default.\n 3. Use the user's configured `mono` font-variation-settings by default.\n 4. Correct the odd `em` font sizing in all browsers.\n*/\n\n code,\n kbd,\n samp,\n pre {\n font-family: --theme(\n --default-mono-font-family,\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n \"Liberation Mono\",\n \"Courier New\",\n monospace\n ); /* 1 */\n font-feature-settings: --theme(\n --default-mono-font-feature-settings,\n normal\n ); /* 2 */\n font-variation-settings: --theme(\n --default-mono-font-variation-settings,\n normal\n ); /* 3 */\n font-size: 1em; /* 4 */\n }\n\n /*\n Add the correct font size in all browsers.\n*/\n\n small {\n font-size: 80%;\n }\n\n /*\n Prevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n /*\n 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n 3. Remove gaps between table borders by default.\n*/\n\n table {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n }\n\n /*\n Use the modern Firefox focus style for all focusable elements.\n*/\n\n :-moz-focusring {\n outline: auto;\n }\n\n /*\n Add the correct vertical alignment in Chrome and Firefox.\n*/\n\n progress {\n vertical-align: baseline;\n }\n\n /*\n Add the correct display in Chrome and Safari.\n*/\n\n summary {\n display: list-item;\n }\n\n /*\n Make lists unstyled by default.\n*/\n\n ol,\n ul,\n menu {\n list-style: none;\n }\n\n /*\n 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\n img,\n svg,\n video,\n canvas,\n audio,\n iframe,\n embed,\n object {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n }\n\n /*\n Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\n img,\n video {\n max-width: 100%;\n height: auto;\n }\n\n /*\n 1. Inherit font styles in all browsers.\n 2. Remove border radius in all browsers.\n 3. Remove background color in all browsers.\n 4. Ensure consistent opacity for disabled states in all browsers.\n*/\n\n button,\n input,\n select,\n optgroup,\n textarea,\n ::file-selector-button {\n font: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n border-radius: 0; /* 2 */\n background-color: transparent; /* 3 */\n opacity: 1; /* 4 */\n }\n\n /*\n Restore default font weight.\n*/\n\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n\n /*\n Restore indentation.\n*/\n\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n\n /*\n Restore space after button.\n*/\n\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n\n /*\n Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n*/\n\n ::placeholder {\n opacity: 1;\n }\n\n /*\n Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\n crash when using `color-mix(…)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\n*/\n\n @supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\n (contain-intrinsic-size: 1px) /* Safari 17+ */ {\n ::placeholder {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n\n /*\n Prevent resizing textareas horizontally by default.\n*/\n\n textarea {\n resize: vertical;\n }\n\n /*\n Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n /*\n 1. Ensure date/time inputs have the same height when empty in iOS Safari.\n 2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\n*/\n\n ::-webkit-date-and-time-value {\n min-height: 1lh; /* 1 */\n text-align: inherit; /* 2 */\n }\n\n /*\n Prevent height from changing on date/time inputs in macOS Safari when the input is set to `display: block`.\n*/\n\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n\n /*\n Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\n*/\n\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n\n ::-webkit-datetime-edit,\n ::-webkit-datetime-edit-year-field,\n ::-webkit-datetime-edit-month-field,\n ::-webkit-datetime-edit-day-field,\n ::-webkit-datetime-edit-hour-field,\n ::-webkit-datetime-edit-minute-field,\n ::-webkit-datetime-edit-second-field,\n ::-webkit-datetime-edit-millisecond-field,\n ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n\n /*\n Center dropdown marker shown on inputs with paired ``s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\n*/\n\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n\n /*\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n :-moz-ui-invalid {\n box-shadow: none;\n }\n\n /*\n Correct the inability to style the border radius in iOS Safari.\n*/\n\n button,\n input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]),\n ::file-selector-button {\n appearance: button;\n }\n\n /*\n Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n ::-webkit-inner-spin-button,\n ::-webkit-outer-spin-button {\n height: auto;\n }\n\n /*\n Make elements with the HTML hidden attribute stay hidden by default.\n*/\n\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n\n@layer utilities {\n @tailwind utilities;\n}\n","@import \"tailwindcss\" important;\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n\t--color-background: oklch(1 0 0);\n\t--color-foreground: oklch(0.145 0 0);\n\t--color-card: oklch(1 0 0);\n\t--color-card-foreground: oklch(0.145 0 0);\n\t--color-popover: oklch(1 0 0);\n\t--color-popover-foreground: oklch(0.145 0 0);\n\t--color-primary: oklch(0.205 0.08 265);\n\t--color-primary-foreground: oklch(0.985 0 0);\n\t--font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu,\n\tCantarell, \"Helvetica Neue\", sans-serif;\n\t--color-secondary: oklch(0.965 0 0);\n\t--color-secondary-foreground: oklch(0.205 0 0);\n\t--color-muted: oklch(0.955 0 0);\n\t--color-muted-foreground: oklch(0.45 0 0);\n\t--color-accent: oklch(0.965 0 0);\n\t--color-accent-foreground: oklch(0.205 0 0);\n\t--color-destructive: oklch(0.577 0.245 27.325);\n\t--color-destructive-foreground: oklch(0.577 0.245 27.325);\n\t--color-border: oklch(0.9 0 0);\n\t--color-input: oklch(0.9 0 0);\n\t--color-ring: oklch(0.708 0.165 254.624);\n\t--color-chart-1: oklch(0.646 0.222 41.116);\n\t--color-chart-2: oklch(0.6 0.118 184.704);\n\t--color-chart-3: oklch(0.398 0.07 227.392);\n\t--color-chart-4: oklch(0.828 0.189 84.429);\n\t--color-chart-5: oklch(0.769 0.188 70.08);\n\t--color-sidebar: oklch(0.985 0 0);\n\t--color-sidebar-foreground: oklch(0.145 0 0);\n\t--color-sidebar-primary: oklch(0.205 0.08 265);\n\t--color-sidebar-primary-foreground: oklch(0.985 0 0);\n\t--color-sidebar-accent: oklch(0.965 0 0);\n\t--color-sidebar-accent-foreground: oklch(0.205 0 0);\n\t--color-sidebar-border: oklch(0.922 0 0);\n\t--color-sidebar-ring: oklch(0.708 0.165 254.624);\n\t--radius-sm: 0.25rem;\n\t--radius-md: 0.375rem;\n\t--radius-lg: 0.5rem;\n\t--radius-xl: 0.75rem;\n\t--radius-2xl: calc(var(--radius) + 8px);\n\t--radius-3xl: calc(var(--radius) + 12px);\n\t--radius-4xl: calc(var(--radius) + 16px);\n}\n\n.lw-harbor-ui {\n\t--radius: 0.625rem;\n\t--background: oklch(1 0 0);\n\t--foreground: oklch(0.145 0 0);\n\t--card: oklch(1 0 0);\n\t--card-foreground: oklch(0.145 0 0);\n\t--popover: oklch(1 0 0);\n\t--popover-foreground: oklch(0.145 0 0);\n\t--primary: oklch(0.205 0 0);\n\t--primary-foreground: oklch(0.985 0 0);\n\t--secondary: oklch(0.97 0 0);\n\t--secondary-foreground: oklch(0.205 0 0);\n\t--muted: oklch(0.955 0 0);\n\t--muted-foreground: oklch(0.45 0 0);\n\t--accent: oklch(0.97 0 0);\n\t--accent-foreground: oklch(0.205 0 0);\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--border: oklch(0.9 0 0);\n\t--input: oklch(0.9 0 0);\n\t--ring: oklch(0.708 0 0);\n\t--chart-1: oklch(0.646 0.222 41.116);\n\t--chart-2: oklch(0.6 0.118 184.704);\n\t--chart-3: oklch(0.398 0.07 227.392);\n\t--chart-4: oklch(0.828 0.189 84.429);\n\t--chart-5: oklch(0.769 0.188 70.08);\n\t--sidebar: oklch(0.985 0 0);\n\t--sidebar-foreground: oklch(0.145 0 0);\n\t--sidebar-primary: oklch(0.205 0 0);\n\t--sidebar-primary-foreground: oklch(0.985 0 0);\n\t--sidebar-accent: oklch(0.97 0 0);\n\t--sidebar-accent-foreground: oklch(0.205 0 0);\n\t--sidebar-border: oklch(0.922 0 0);\n\t--sidebar-ring: oklch(0.708 0 0);\n}\n\n.lw-harbor-ui .dark {\n\t--background: oklch(0.145 0 0);\n\t--foreground: oklch(0.985 0 0);\n\t--card: oklch(0.205 0 0);\n\t--card-foreground: oklch(0.985 0 0);\n\t--popover: oklch(0.205 0 0);\n\t--popover-foreground: oklch(0.985 0 0);\n\t--primary: oklch(0.922 0 0);\n\t--primary-foreground: oklch(0.205 0 0);\n\t--secondary: oklch(0.269 0 0);\n\t--secondary-foreground: oklch(0.985 0 0);\n\t--muted: oklch(0.269 0 0);\n\t--muted-foreground: oklch(0.708 0 0);\n\t--accent: oklch(0.269 0 0);\n\t--accent-foreground: oklch(0.985 0 0);\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--border: oklch(1 0 0 / 10%);\n\t--input: oklch(1 0 0 / 15%);\n\t--ring: oklch(0.556 0 0);\n\t--chart-1: oklch(0.488 0.243 264.376);\n\t--chart-2: oklch(0.696 0.17 162.48);\n\t--chart-3: oklch(0.769 0.188 70.08);\n\t--chart-4: oklch(0.627 0.265 303.9);\n\t--chart-5: oklch(0.645 0.246 16.439);\n\t--sidebar: oklch(0.205 0 0);\n\t--sidebar-foreground: oklch(0.985 0 0);\n\t--sidebar-primary: oklch(0.488 0.243 264.376);\n\t--sidebar-primary-foreground: oklch(0.985 0 0);\n\t--sidebar-accent: oklch(0.269 0 0);\n\t--sidebar-accent-foreground: oklch(0.985 0 0);\n\t--sidebar-border: oklch(1 0 0 / 10%);\n\t--sidebar-ring: oklch(0.556 0 0);\n}\n\n.lw-harbor-ui {\n\tbackground-color: var(--color-background);\n\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tcolor: var(--color-foreground);\n}\n\n.lw-harbor-ui * {\n\tborder-color: var(--color-border);\n}\n\n#wpcontent:has(.lw-harbor-ui) {\n\tpadding-left: 0;\n}\n\n#wpcontent:has(.lw-harbor-ui) #wpbody-content {\n\tpadding-bottom: 0;\n}\n\n#wpcontent:has(.lw-harbor-ui) + #wpfooter {\n\tdisplay: none;\n}\n\n.wrap:has(> .lw-harbor-ui) {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n@layer base {\n\t* {\n\t\t@apply border-border box-border outline-ring/50;\n\t}\n\tbody {\n\t\t@apply bg-background text-foreground;\n\t}\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"index.css","mappings":"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","sources":["webpack://@stellarwp/harbor/","webpack://@stellarwp/harbor/./node_modules/tailwindcss/index.css","webpack://@stellarwp/harbor/./resources/css/globals.css"],"sourcesContent":[null,"@layer theme, base, components, utilities;\n\n@layer theme {\n @theme default {\n --font-sans:\n ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\",\n \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --font-serif: ui-serif, Georgia, Cambria, \"Times New Roman\", Times, serif;\n --font-mono:\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\",\n \"Courier New\", monospace;\n\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-200: oklch(88.5% 0.062 18.334);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-red-800: oklch(44.4% 0.177 26.899);\n --color-red-900: oklch(39.6% 0.141 25.723);\n --color-red-950: oklch(25.8% 0.092 26.042);\n\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-100: oklch(95.4% 0.038 75.164);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-300: oklch(83.7% 0.128 66.29);\n --color-orange-400: oklch(75% 0.183 55.934);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-600: oklch(64.6% 0.222 41.116);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-orange-800: oklch(47% 0.157 37.304);\n --color-orange-900: oklch(40.8% 0.123 38.172);\n --color-orange-950: oklch(26.6% 0.079 36.259);\n\n --color-amber-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\n --color-amber-200: oklch(92.4% 0.12 95.746);\n --color-amber-300: oklch(87.9% 0.169 91.605);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-amber-900: oklch(41.4% 0.112 45.904);\n --color-amber-950: oklch(27.9% 0.077 45.635);\n\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-100: oklch(97.3% 0.071 103.193);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-300: oklch(90.5% 0.182 98.111);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-500: oklch(79.5% 0.184 86.047);\n --color-yellow-600: oklch(68.1% 0.162 75.834);\n --color-yellow-700: oklch(55.4% 0.135 66.442);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n --color-lime-50: oklch(98.6% 0.031 120.757);\n --color-lime-100: oklch(96.7% 0.067 122.328);\n --color-lime-200: oklch(93.8% 0.127 124.321);\n --color-lime-300: oklch(89.7% 0.196 126.665);\n --color-lime-400: oklch(84.1% 0.238 128.85);\n --color-lime-500: oklch(76.8% 0.233 130.85);\n --color-lime-600: oklch(64.8% 0.2 131.684);\n --color-lime-700: oklch(53.2% 0.157 131.589);\n --color-lime-800: oklch(45.3% 0.124 130.933);\n --color-lime-900: oklch(40.5% 0.101 131.063);\n --color-lime-950: oklch(27.4% 0.072 132.109);\n\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-300: oklch(87.1% 0.15 154.449);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-green-900: oklch(39.3% 0.095 152.535);\n --color-green-950: oklch(26.6% 0.065 152.934);\n\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\n --color-emerald-200: oklch(90.5% 0.093 164.15);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-emerald-800: oklch(43.2% 0.095 166.913);\n --color-emerald-900: oklch(37.8% 0.077 168.94);\n --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n --color-teal-50: oklch(98.4% 0.014 180.72);\n --color-teal-100: oklch(95.3% 0.051 180.801);\n --color-teal-200: oklch(91% 0.096 180.426);\n --color-teal-300: oklch(85.5% 0.138 181.071);\n --color-teal-400: oklch(77.7% 0.152 181.912);\n --color-teal-500: oklch(70.4% 0.14 182.503);\n --color-teal-600: oklch(60% 0.118 184.704);\n --color-teal-700: oklch(51.1% 0.096 186.391);\n --color-teal-800: oklch(43.7% 0.078 188.216);\n --color-teal-900: oklch(38.6% 0.063 188.416);\n --color-teal-950: oklch(27.7% 0.046 192.524);\n\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-200: oklch(91.7% 0.08 205.041);\n --color-cyan-300: oklch(86.5% 0.127 207.078);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-500: oklch(71.5% 0.143 215.221);\n --color-cyan-600: oklch(60.9% 0.126 221.723);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-cyan-800: oklch(45% 0.085 224.283);\n --color-cyan-900: oklch(39.8% 0.07 227.392);\n --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n --color-sky-50: oklch(97.7% 0.013 236.62);\n --color-sky-100: oklch(95.1% 0.026 236.824);\n --color-sky-200: oklch(90.1% 0.058 230.902);\n --color-sky-300: oklch(82.8% 0.111 230.318);\n --color-sky-400: oklch(74.6% 0.16 232.661);\n --color-sky-500: oklch(68.5% 0.169 237.323);\n --color-sky-600: oklch(58.8% 0.158 241.966);\n --color-sky-700: oklch(50% 0.134 242.749);\n --color-sky-800: oklch(44.3% 0.11 240.79);\n --color-sky-900: oklch(39.1% 0.09 240.876);\n --color-sky-950: oklch(29.3% 0.066 243.157);\n\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-300: oklch(80.9% 0.105 251.813);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n\n --color-indigo-50: oklch(96.2% 0.018 272.314);\n --color-indigo-100: oklch(93% 0.034 272.788);\n --color-indigo-200: oklch(87% 0.065 274.039);\n --color-indigo-300: oklch(78.5% 0.115 274.713);\n --color-indigo-400: oklch(67.3% 0.182 276.935);\n --color-indigo-500: oklch(58.5% 0.233 277.117);\n --color-indigo-600: oklch(51.1% 0.262 276.966);\n --color-indigo-700: oklch(45.7% 0.24 277.023);\n --color-indigo-800: oklch(39.8% 0.195 277.366);\n --color-indigo-900: oklch(35.9% 0.144 278.697);\n --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n --color-violet-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\n --color-violet-200: oklch(89.4% 0.057 293.283);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-violet-800: oklch(43.2% 0.232 292.759);\n --color-violet-900: oklch(38% 0.189 293.745);\n --color-violet-950: oklch(28.3% 0.141 291.089);\n\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-300: oklch(82.7% 0.119 306.383);\n --color-purple-400: oklch(71.4% 0.203 305.504);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-600: oklch(55.8% 0.288 302.321);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-purple-800: oklch(43.8% 0.218 303.724);\n --color-purple-900: oklch(38.1% 0.176 304.987);\n --color-purple-950: oklch(29.1% 0.149 302.717);\n\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-300: oklch(82.3% 0.12 346.018);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-900: oklch(40.8% 0.153 2.432);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-200: oklch(89.2% 0.058 10.001);\n --color-rose-300: oklch(81% 0.117 11.638);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-500: oklch(64.5% 0.246 16.439);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-rose-800: oklch(45.5% 0.188 13.697);\n --color-rose-900: oklch(41% 0.159 10.272);\n --color-rose-950: oklch(27.1% 0.105 12.094);\n\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-slate-800: oklch(27.9% 0.041 260.031);\n --color-slate-900: oklch(20.8% 0.042 265.755);\n --color-slate-950: oklch(12.9% 0.042 264.695);\n\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-gray-950: oklch(13% 0.028 261.692);\n\n --color-zinc-50: oklch(98.5% 0 0);\n --color-zinc-100: oklch(96.7% 0.001 286.375);\n --color-zinc-200: oklch(92% 0.004 286.32);\n --color-zinc-300: oklch(87.1% 0.006 286.286);\n --color-zinc-400: oklch(70.5% 0.015 286.067);\n --color-zinc-500: oklch(55.2% 0.016 285.938);\n --color-zinc-600: oklch(44.2% 0.017 285.786);\n --color-zinc-700: oklch(37% 0.013 285.805);\n --color-zinc-800: oklch(27.4% 0.006 286.033);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n --color-neutral-50: oklch(98.5% 0 0);\n --color-neutral-100: oklch(97% 0 0);\n --color-neutral-200: oklch(92.2% 0 0);\n --color-neutral-300: oklch(87% 0 0);\n --color-neutral-400: oklch(70.8% 0 0);\n --color-neutral-500: oklch(55.6% 0 0);\n --color-neutral-600: oklch(43.9% 0 0);\n --color-neutral-700: oklch(37.1% 0 0);\n --color-neutral-800: oklch(26.9% 0 0);\n --color-neutral-900: oklch(20.5% 0 0);\n --color-neutral-950: oklch(14.5% 0 0);\n\n --color-stone-50: oklch(98.5% 0.001 106.423);\n --color-stone-100: oklch(97% 0.001 106.424);\n --color-stone-200: oklch(92.3% 0.003 48.717);\n --color-stone-300: oklch(86.9% 0.005 56.366);\n --color-stone-400: oklch(70.9% 0.01 56.259);\n --color-stone-500: oklch(55.3% 0.013 58.071);\n --color-stone-600: oklch(44.4% 0.011 73.639);\n --color-stone-700: oklch(37.4% 0.01 67.558);\n --color-stone-800: oklch(26.8% 0.007 34.298);\n --color-stone-900: oklch(21.6% 0.006 56.043);\n --color-stone-950: oklch(14.7% 0.004 49.25);\n\n --color-mauve-50: oklch(98.5% 0 0);\n --color-mauve-100: oklch(96% 0.003 325.6);\n --color-mauve-200: oklch(92.2% 0.005 325.62);\n --color-mauve-300: oklch(86.5% 0.012 325.68);\n --color-mauve-400: oklch(71.1% 0.019 323.02);\n --color-mauve-500: oklch(54.2% 0.034 322.5);\n --color-mauve-600: oklch(43.5% 0.029 321.78);\n --color-mauve-700: oklch(36.4% 0.029 323.89);\n --color-mauve-800: oklch(26.3% 0.024 320.12);\n --color-mauve-900: oklch(21.2% 0.019 322.12);\n --color-mauve-950: oklch(14.5% 0.008 326);\n\n --color-olive-50: oklch(98.8% 0.003 106.5);\n --color-olive-100: oklch(96.6% 0.005 106.5);\n --color-olive-200: oklch(93% 0.007 106.5);\n --color-olive-300: oklch(88% 0.011 106.6);\n --color-olive-400: oklch(73.7% 0.021 106.9);\n --color-olive-500: oklch(58% 0.031 107.3);\n --color-olive-600: oklch(46.6% 0.025 107.3);\n --color-olive-700: oklch(39.4% 0.023 107.4);\n --color-olive-800: oklch(28.6% 0.016 107.4);\n --color-olive-900: oklch(22.8% 0.013 107.4);\n --color-olive-950: oklch(15.3% 0.006 107.1);\n\n --color-mist-50: oklch(98.7% 0.002 197.1);\n --color-mist-100: oklch(96.3% 0.002 197.1);\n --color-mist-200: oklch(92.5% 0.005 214.3);\n --color-mist-300: oklch(87.2% 0.007 219.6);\n --color-mist-400: oklch(72.3% 0.014 214.4);\n --color-mist-500: oklch(56% 0.021 213.5);\n --color-mist-600: oklch(45% 0.017 213.2);\n --color-mist-700: oklch(37.8% 0.015 216);\n --color-mist-800: oklch(27.5% 0.011 216.9);\n --color-mist-900: oklch(21.8% 0.008 223.9);\n --color-mist-950: oklch(14.8% 0.004 228.8);\n\n --color-taupe-50: oklch(98.6% 0.002 67.8);\n --color-taupe-100: oklch(96% 0.002 17.2);\n --color-taupe-200: oklch(92.2% 0.005 34.3);\n --color-taupe-300: oklch(86.8% 0.007 39.5);\n --color-taupe-400: oklch(71.4% 0.014 41.2);\n --color-taupe-500: oklch(54.7% 0.021 43.1);\n --color-taupe-600: oklch(43.8% 0.017 39.3);\n --color-taupe-700: oklch(36.7% 0.016 35.7);\n --color-taupe-800: oklch(26.8% 0.011 36.5);\n --color-taupe-900: oklch(21.4% 0.009 43.1);\n --color-taupe-950: oklch(14.7% 0.004 49.3);\n\n --color-black: #000;\n --color-white: #fff;\n\n --spacing: 0.25rem;\n\n --breakpoint-sm: 40rem;\n --breakpoint-md: 48rem;\n --breakpoint-lg: 64rem;\n --breakpoint-xl: 80rem;\n --breakpoint-2xl: 96rem;\n\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-6xl: 3.75rem;\n --text-6xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--line-height: 1;\n --text-8xl: 6rem;\n --text-8xl--line-height: 1;\n --text-9xl: 8rem;\n --text-9xl--line-height: 1;\n\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md:\n 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg:\n 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl:\n 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075),\n 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1),\n 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1),\n 0px 4px 8px rgb(0 0 0 / 0.1);\n\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n @keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n }\n\n @keyframes bounce {\n 0%,\n 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n }\n\n --blur-xs: 4px;\n --blur-sm: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n\n --perspective-dramatic: 100px;\n --perspective-near: 300px;\n --perspective-normal: 500px;\n --perspective-midrange: 800px;\n --perspective-distant: 1200px;\n\n --aspect-video: 16 / 9;\n\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: --theme(--font-sans, initial);\n --default-font-feature-settings: --theme(\n --font-sans--font-feature-settings,\n initial\n );\n --default-font-variation-settings: --theme(\n --font-sans--font-variation-settings,\n initial\n );\n --default-mono-font-family: --theme(--font-mono, initial);\n --default-mono-font-feature-settings: --theme(\n --font-mono--font-feature-settings,\n initial\n );\n --default-mono-font-variation-settings: --theme(\n --font-mono--font-variation-settings,\n initial\n );\n }\n\n /* Deprecated */\n @theme default inline reference {\n --blur: 8px;\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n --radius: 0.25rem;\n --max-width-prose: 65ch;\n }\n}\n\n@layer base {\n /*\n 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n 2. Remove default margins and padding\n 3. Reset all borders.\n*/\n\n *,\n ::after,\n ::before,\n ::backdrop,\n ::file-selector-button {\n box-sizing: border-box; /* 1 */\n margin: 0; /* 2 */\n padding: 0; /* 2 */\n border: 0 solid; /* 3 */\n }\n\n /*\n 1. Use a consistent sensible line-height in all browsers.\n 2. Prevent adjustments of font size after orientation changes in iOS.\n 3. Use a more readable tab size.\n 4. Use the user's configured `sans` font-family by default.\n 5. Use the user's configured `sans` font-feature-settings by default.\n 6. Use the user's configured `sans` font-variation-settings by default.\n 7. Disable tap highlights on iOS.\n*/\n\n html,\n :host {\n line-height: 1.5; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n tab-size: 4; /* 3 */\n font-family: --theme(\n --default-font-family,\n ui-sans-serif,\n system-ui,\n sans-serif,\n \"Apple Color Emoji\",\n \"Segoe UI Emoji\",\n \"Segoe UI Symbol\",\n \"Noto Color Emoji\"\n ); /* 4 */\n font-feature-settings: --theme(\n --default-font-feature-settings,\n normal\n ); /* 5 */\n font-variation-settings: --theme(\n --default-font-variation-settings,\n normal\n ); /* 6 */\n -webkit-tap-highlight-color: transparent; /* 7 */\n }\n\n /*\n 1. Add the correct height in Firefox.\n 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n 3. Reset the default border style to a 1px solid border.\n*/\n\n hr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n border-top-width: 1px; /* 3 */\n }\n\n /*\n Add the correct text decoration in Chrome, Edge, and Safari.\n*/\n\n abbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n }\n\n /*\n Remove the default font size and weight for headings.\n*/\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n font-size: inherit;\n font-weight: inherit;\n }\n\n /*\n Reset links to optimize for opt-in styling instead of opt-out.\n*/\n\n a {\n color: inherit;\n -webkit-text-decoration: inherit;\n text-decoration: inherit;\n }\n\n /*\n Add the correct font weight in Edge and Safari.\n*/\n\n b,\n strong {\n font-weight: bolder;\n }\n\n /*\n 1. Use the user's configured `mono` font-family by default.\n 2. Use the user's configured `mono` font-feature-settings by default.\n 3. Use the user's configured `mono` font-variation-settings by default.\n 4. Correct the odd `em` font sizing in all browsers.\n*/\n\n code,\n kbd,\n samp,\n pre {\n font-family: --theme(\n --default-mono-font-family,\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n \"Liberation Mono\",\n \"Courier New\",\n monospace\n ); /* 1 */\n font-feature-settings: --theme(\n --default-mono-font-feature-settings,\n normal\n ); /* 2 */\n font-variation-settings: --theme(\n --default-mono-font-variation-settings,\n normal\n ); /* 3 */\n font-size: 1em; /* 4 */\n }\n\n /*\n Add the correct font size in all browsers.\n*/\n\n small {\n font-size: 80%;\n }\n\n /*\n Prevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\n sub,\n sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n /*\n 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n 3. Remove gaps between table borders by default.\n*/\n\n table {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n border-collapse: collapse; /* 3 */\n }\n\n /*\n Use the modern Firefox focus style for all focusable elements.\n*/\n\n :-moz-focusring {\n outline: auto;\n }\n\n /*\n Add the correct vertical alignment in Chrome and Firefox.\n*/\n\n progress {\n vertical-align: baseline;\n }\n\n /*\n Add the correct display in Chrome and Safari.\n*/\n\n summary {\n display: list-item;\n }\n\n /*\n Make lists unstyled by default.\n*/\n\n ol,\n ul,\n menu {\n list-style: none;\n }\n\n /*\n 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\n img,\n svg,\n video,\n canvas,\n audio,\n iframe,\n embed,\n object {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n }\n\n /*\n Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\n img,\n video {\n max-width: 100%;\n height: auto;\n }\n\n /*\n 1. Inherit font styles in all browsers.\n 2. Remove border radius in all browsers.\n 3. Remove background color in all browsers.\n 4. Ensure consistent opacity for disabled states in all browsers.\n*/\n\n button,\n input,\n select,\n optgroup,\n textarea,\n ::file-selector-button {\n font: inherit; /* 1 */\n font-feature-settings: inherit; /* 1 */\n font-variation-settings: inherit; /* 1 */\n letter-spacing: inherit; /* 1 */\n color: inherit; /* 1 */\n border-radius: 0; /* 2 */\n background-color: transparent; /* 3 */\n opacity: 1; /* 4 */\n }\n\n /*\n Restore default font weight.\n*/\n\n :where(select:is([multiple], [size])) optgroup {\n font-weight: bolder;\n }\n\n /*\n Restore indentation.\n*/\n\n :where(select:is([multiple], [size])) optgroup option {\n padding-inline-start: 20px;\n }\n\n /*\n Restore space after button.\n*/\n\n ::file-selector-button {\n margin-inline-end: 4px;\n }\n\n /*\n Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n*/\n\n ::placeholder {\n opacity: 1;\n }\n\n /*\n Set the default placeholder color to a semi-transparent version of the current text color in browsers that do not\n crash when using `color-mix(…)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)\n*/\n\n @supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or\n (contain-intrinsic-size: 1px) /* Safari 17+ */ {\n ::placeholder {\n color: color-mix(in oklab, currentcolor 50%, transparent);\n }\n }\n\n /*\n Prevent resizing textareas horizontally by default.\n*/\n\n textarea {\n resize: vertical;\n }\n\n /*\n Remove the inner padding in Chrome and Safari on macOS.\n*/\n\n ::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n /*\n 1. Ensure date/time inputs have the same height when empty in iOS Safari.\n 2. Ensure text alignment can be changed on date/time inputs in iOS Safari.\n*/\n\n ::-webkit-date-and-time-value {\n min-height: 1lh; /* 1 */\n text-align: inherit; /* 2 */\n }\n\n /*\n Prevent height from changing on date/time inputs in macOS Safari when the input is set to `display: block`.\n*/\n\n ::-webkit-datetime-edit {\n display: inline-flex;\n }\n\n /*\n Remove excess padding from pseudo-elements in date/time inputs to ensure consistent height across browsers.\n*/\n\n ::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n }\n\n ::-webkit-datetime-edit,\n ::-webkit-datetime-edit-year-field,\n ::-webkit-datetime-edit-month-field,\n ::-webkit-datetime-edit-day-field,\n ::-webkit-datetime-edit-hour-field,\n ::-webkit-datetime-edit-minute-field,\n ::-webkit-datetime-edit-second-field,\n ::-webkit-datetime-edit-millisecond-field,\n ::-webkit-datetime-edit-meridiem-field {\n padding-block: 0;\n }\n\n /*\n Center dropdown marker shown on inputs with paired ``s in Chrome. (https://github.com/tailwindlabs/tailwindcss/issues/18499)\n*/\n\n ::-webkit-calendar-picker-indicator {\n line-height: 1;\n }\n\n /*\n Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n :-moz-ui-invalid {\n box-shadow: none;\n }\n\n /*\n Correct the inability to style the border radius in iOS Safari.\n*/\n\n button,\n input:where([type=\"button\"], [type=\"reset\"], [type=\"submit\"]),\n ::file-selector-button {\n appearance: button;\n }\n\n /*\n Correct the cursor style of increment and decrement buttons in Safari.\n*/\n\n ::-webkit-inner-spin-button,\n ::-webkit-outer-spin-button {\n height: auto;\n }\n\n /*\n Make elements with the HTML hidden attribute stay hidden by default.\n*/\n\n [hidden]:where(:not([hidden=\"until-found\"])) {\n display: none !important;\n }\n}\n\n@layer utilities {\n @tailwind utilities;\n}\n","@import \"tailwindcss\" important;\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n\t--color-background: oklch(1 0 0);\n\t--color-foreground: oklch(0.145 0 0);\n\t--color-card: oklch(1 0 0);\n\t--color-card-foreground: oklch(0.145 0 0);\n\t--color-popover: oklch(1 0 0);\n\t--color-popover-foreground: oklch(0.145 0 0);\n\t--color-primary: oklch(0.205 0.08 265);\n\t--color-primary-foreground: oklch(0.985 0 0);\n\t--font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu,\n\tCantarell, \"Helvetica Neue\", sans-serif;\n\t--color-secondary: oklch(0.965 0 0);\n\t--color-secondary-foreground: oklch(0.205 0 0);\n\t--color-muted: oklch(0.955 0 0);\n\t--color-muted-foreground: oklch(0.45 0 0);\n\t--color-accent: oklch(0.965 0 0);\n\t--color-accent-foreground: oklch(0.205 0 0);\n\t--color-destructive: oklch(0.577 0.245 27.325);\n\t--color-destructive-foreground: oklch(0.577 0.245 27.325);\n\t--color-border: oklch(0.9 0 0);\n\t--color-input: oklch(0.9 0 0);\n\t--color-ring: oklch(0.708 0.165 254.624);\n\t--color-chart-1: oklch(0.646 0.222 41.116);\n\t--color-chart-2: oklch(0.6 0.118 184.704);\n\t--color-chart-3: oklch(0.398 0.07 227.392);\n\t--color-chart-4: oklch(0.828 0.189 84.429);\n\t--color-chart-5: oklch(0.769 0.188 70.08);\n\t--color-sidebar: oklch(0.985 0 0);\n\t--color-sidebar-foreground: oklch(0.145 0 0);\n\t--color-sidebar-primary: oklch(0.205 0.08 265);\n\t--color-sidebar-primary-foreground: oklch(0.985 0 0);\n\t--color-sidebar-accent: oklch(0.965 0 0);\n\t--color-sidebar-accent-foreground: oklch(0.205 0 0);\n\t--color-sidebar-border: oklch(0.922 0 0);\n\t--color-sidebar-ring: oklch(0.708 0.165 254.624);\n\t--radius-sm: 0.25rem;\n\t--radius-md: 0.375rem;\n\t--radius-lg: 0.5rem;\n\t--radius-xl: 0.75rem;\n\t--radius-2xl: calc(var(--radius) + 8px);\n\t--radius-3xl: calc(var(--radius) + 12px);\n\t--radius-4xl: calc(var(--radius) + 16px);\n}\n\n.lw-harbor-ui {\n\t--radius: 0.625rem;\n\t--background: oklch(1 0 0);\n\t--foreground: oklch(0.145 0 0);\n\t--card: oklch(1 0 0);\n\t--card-foreground: oklch(0.145 0 0);\n\t--popover: oklch(1 0 0);\n\t--popover-foreground: oklch(0.145 0 0);\n\t--primary: oklch(0.205 0 0);\n\t--primary-foreground: oklch(0.985 0 0);\n\t--secondary: oklch(0.97 0 0);\n\t--secondary-foreground: oklch(0.205 0 0);\n\t--muted: oklch(0.955 0 0);\n\t--muted-foreground: oklch(0.45 0 0);\n\t--accent: oklch(0.97 0 0);\n\t--accent-foreground: oklch(0.205 0 0);\n\t--destructive: oklch(0.577 0.245 27.325);\n\t--border: oklch(0.9 0 0);\n\t--input: oklch(0.9 0 0);\n\t--ring: oklch(0.708 0 0);\n\t--chart-1: oklch(0.646 0.222 41.116);\n\t--chart-2: oklch(0.6 0.118 184.704);\n\t--chart-3: oklch(0.398 0.07 227.392);\n\t--chart-4: oklch(0.828 0.189 84.429);\n\t--chart-5: oklch(0.769 0.188 70.08);\n\t--sidebar: oklch(0.985 0 0);\n\t--sidebar-foreground: oklch(0.145 0 0);\n\t--sidebar-primary: oklch(0.205 0 0);\n\t--sidebar-primary-foreground: oklch(0.985 0 0);\n\t--sidebar-accent: oklch(0.97 0 0);\n\t--sidebar-accent-foreground: oklch(0.205 0 0);\n\t--sidebar-border: oklch(0.922 0 0);\n\t--sidebar-ring: oklch(0.708 0 0);\n}\n\n.lw-harbor-ui .dark {\n\t--background: oklch(0.145 0 0);\n\t--foreground: oklch(0.985 0 0);\n\t--card: oklch(0.205 0 0);\n\t--card-foreground: oklch(0.985 0 0);\n\t--popover: oklch(0.205 0 0);\n\t--popover-foreground: oklch(0.985 0 0);\n\t--primary: oklch(0.922 0 0);\n\t--primary-foreground: oklch(0.205 0 0);\n\t--secondary: oklch(0.269 0 0);\n\t--secondary-foreground: oklch(0.985 0 0);\n\t--muted: oklch(0.269 0 0);\n\t--muted-foreground: oklch(0.708 0 0);\n\t--accent: oklch(0.269 0 0);\n\t--accent-foreground: oklch(0.985 0 0);\n\t--destructive: oklch(0.704 0.191 22.216);\n\t--border: oklch(1 0 0 / 10%);\n\t--input: oklch(1 0 0 / 15%);\n\t--ring: oklch(0.556 0 0);\n\t--chart-1: oklch(0.488 0.243 264.376);\n\t--chart-2: oklch(0.696 0.17 162.48);\n\t--chart-3: oklch(0.769 0.188 70.08);\n\t--chart-4: oklch(0.627 0.265 303.9);\n\t--chart-5: oklch(0.645 0.246 16.439);\n\t--sidebar: oklch(0.205 0 0);\n\t--sidebar-foreground: oklch(0.985 0 0);\n\t--sidebar-primary: oklch(0.488 0.243 264.376);\n\t--sidebar-primary-foreground: oklch(0.985 0 0);\n\t--sidebar-accent: oklch(0.269 0 0);\n\t--sidebar-accent-foreground: oklch(0.985 0 0);\n\t--sidebar-border: oklch(1 0 0 / 10%);\n\t--sidebar-ring: oklch(0.556 0 0);\n}\n\n.lw-harbor-ui {\n\tbackground-color: var(--color-background);\n\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n\tfont-size: 14px;\n\tline-height: 1.5;\n\tcolor: var(--color-foreground);\n}\n\n.lw-harbor-ui * {\n\tborder-color: var(--color-border);\n}\n\n#wpcontent:has(.lw-harbor-ui) {\n\tpadding-left: 0;\n}\n\n#wpcontent:has(.lw-harbor-ui) #wpbody-content {\n\tpadding-bottom: 0;\n}\n\n#wpcontent:has(.lw-harbor-ui) + #wpfooter {\n\tdisplay: none;\n}\n\n.wrap:has(> .lw-harbor-ui) {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n@layer base {\n\t* {\n\t\t@apply border-border box-border outline-ring/50;\n\t}\n\tbody {\n\t\t@apply bg-background text-foreground;\n\t}\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/index-rtl.css b/build/index-rtl.css index 9c273e1b..03924cf1 100644 --- a/build/index-rtl.css +++ b/build/index-rtl.css @@ -35,6 +35,6 @@ .lw-harbor-ui .m-0{margin:calc(var(--spacing) * 0)!important}.lw-harbor-ui .-mx-1{margin-inline:calc(var(--spacing) * -1)!important}.lw-harbor-ui .my-1{margin-block:calc(var(--spacing) * 1)!important}.lw-harbor-ui .\!mt-8{margin-top:calc(var(--spacing) * 8)!important}.lw-harbor-ui .mt-0{margin-top:calc(var(--spacing) * 0)!important}.lw-harbor-ui .mt-0\.5{margin-top:calc(var(--spacing) * .5)!important}.lw-harbor-ui .mt-1{margin-top:calc(var(--spacing) * 1)!important}.lw-harbor-ui .mt-1\.5{margin-top:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .mt-2{margin-top:calc(var(--spacing) * 2)!important}.lw-harbor-ui .mt-8{margin-top:calc(var(--spacing) * 8)!important}.lw-harbor-ui .mt-\[0\.75em\]\!{margin-top:.75em!important}.lw-harbor-ui .mt-auto{margin-top:auto!important}.lw-harbor-ui .\!mb-6{margin-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .mb-0, .lw-harbor-ui .mb-0\!{margin-bottom:calc(var(--spacing) * 0)!important}.lw-harbor-ui .mb-4{margin-bottom:calc(var(--spacing) * 4)!important}.lw-harbor-ui .ml-1{margin-right:calc(var(--spacing) * 1)!important}.lw-harbor-ui .ml-2{margin-right:calc(var(--spacing) * 2)!important}.lw-harbor-ui .ml-4{margin-right:calc(var(--spacing) * 4)!important}.lw-harbor-ui .ml-auto{margin-right:auto!important}.lw-harbor-ui .block{display:block!important}.lw-harbor-ui .contents{display:contents!important}.lw-harbor-ui .flex{display:flex!important}.lw-harbor-ui .grid{display:grid!important}.lw-harbor-ui .hidden{display:none!important}.lw-harbor-ui .inline{display:inline!important}.lw-harbor-ui .inline-flex{display:inline-flex!important}.lw-harbor-ui .table{display:table!important}.lw-harbor-ui .size-1\.5{width:calc(var(--spacing) * 1.5)!important;height:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .size-6{width:calc(var(--spacing) * 6)!important;height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .size-8{width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .size-9{width:calc(var(--spacing) * 9)!important;height:calc(var(--spacing) * 9)!important}.lw-harbor-ui .size-10{width:calc(var(--spacing) * 10)!important;height:calc(var(--spacing) * 10)!important}.lw-harbor-ui .h-0{height:calc(var(--spacing) * 0)!important}.lw-harbor-ui .h-1\.5{height:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .h-3{height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .h-3\.5{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .h-4{height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .h-5{height:calc(var(--spacing) * 5)!important}.lw-harbor-ui .h-6{height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .h-7{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .h-8{height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .h-9{height:calc(var(--spacing) * 9)!important}.lw-harbor-ui .h-10{height:calc(var(--spacing) * 10)!important}.lw-harbor-ui .h-18{height:calc(var(--spacing) * 18)!important}.lw-harbor-ui .h-\[calc\(100vh-32px\)\]{height:calc(100vh - 32px)!important}.lw-harbor-ui .h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)!important}.lw-harbor-ui .h-px{height:1px!important}.lw-harbor-ui .max-h-96{max-height:calc(var(--spacing) * 96)!important}.lw-harbor-ui .max-h-\[90vh\]{max-height:90vh!important}.lw-harbor-ui .min-h-0{min-height:calc(var(--spacing) * 0)!important}.lw-harbor-ui .w-1\.5{width:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .w-3{width:calc(var(--spacing) * 3)!important}.lw-harbor-ui .w-3\.5{width:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .w-4{width:calc(var(--spacing) * 4)!important}.lw-harbor-ui .w-5{width:calc(var(--spacing) * 5)!important}.lw-harbor-ui .w-6{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .w-8{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .w-9{width:calc(var(--spacing) * 9)!important}.lw-harbor-ui .w-12{width:calc(var(--spacing) * 12)!important}.lw-harbor-ui .w-14{width:calc(var(--spacing) * 14)!important}.lw-harbor-ui .w-18{width:calc(var(--spacing) * 18)!important}.lw-harbor-ui .w-25{width:calc(var(--spacing) * 25)!important}.lw-harbor-ui .w-32{width:calc(var(--spacing) * 32)!important}.lw-harbor-ui .w-36{width:calc(var(--spacing) * 36)!important}.lw-harbor-ui .w-\[130px\]{width:130px!important}.lw-harbor-ui .w-\[168px\]{width:168px!important}.lw-harbor-ui .w-\[260px\]{width:260px!important}.lw-harbor-ui .w-\[285px\]{width:285px!important}.lw-harbor-ui .w-fit{width:-moz-fit-content!important;width:fit-content!important}.lw-harbor-ui .w-full{width:100%!important}.lw-harbor-ui .max-w-104{max-width:calc(var(--spacing) * 104)!important}.lw-harbor-ui .max-w-full{max-width:100%!important}.lw-harbor-ui .max-w-lg{max-width:var(--container-lg)!important}.lw-harbor-ui .max-w-md{max-width:var(--container-md)!important}.lw-harbor-ui .max-w-xl{max-width:var(--container-xl)!important}.lw-harbor-ui .max-w-xs{max-width:var(--container-xs)!important}.lw-harbor-ui .min-w-0{min-width:calc(var(--spacing) * 0)!important}.lw-harbor-ui .min-w-\[8rem\]{min-width:8rem!important}.lw-harbor-ui .min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)!important}.lw-harbor-ui .flex-1{flex:1!important}.lw-harbor-ui .shrink-0{flex-shrink:0!important}.lw-harbor-ui .-translate-y-1\/2{--lw-harbor-tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .-translate-y-px{--lw-harbor-tw-translate-y:-1px;translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .transform{transform:var(--lw-harbor-tw-rotate-x,) var(--lw-harbor-tw-rotate-y,) var(--lw-harbor-tw-rotate-z,) var(--lw-harbor-tw-skew-x,) var(--lw-harbor-tw-skew-y,)!important}.lw-harbor-ui .animate-pulse{animation:var(--animate-pulse)!important}.lw-harbor-ui .animate-spin{animation:var(--animate-spin)!important}.lw-harbor-ui .cursor-default{cursor:default!important}.lw-harbor-ui .cursor-pointer{cursor:pointer!important}.lw-harbor-ui .scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)!important}.lw-harbor-ui .auto-rows-min{grid-auto-rows:min-content!important}.lw-harbor-ui .grid-rows-\[auto_auto\]{grid-template-rows:auto auto!important}.lw-harbor-ui .flex-col{flex-direction:column!important}.lw-harbor-ui .flex-wrap{flex-wrap:wrap!important}.lw-harbor-ui .items-center{align-items:center!important}.lw-harbor-ui .items-end{align-items:flex-end!important}.lw-harbor-ui .items-start{align-items:flex-start!important}.lw-harbor-ui .justify-between{justify-content:space-between!important}.lw-harbor-ui .justify-center{justify-content:center!important}.lw-harbor-ui .justify-end{justify-content:flex-end!important}.lw-harbor-ui .gap-0\.5{gap:calc(var(--spacing) * .5)!important}.lw-harbor-ui .gap-1{gap:calc(var(--spacing) * 1)!important}.lw-harbor-ui .gap-1\.5{gap:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .gap-2{gap:calc(var(--spacing) * 2)!important}.lw-harbor-ui .gap-2\.5{gap:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .gap-3{gap:calc(var(--spacing) * 3)!important}.lw-harbor-ui .gap-6{gap:calc(var(--spacing) * 6)!important}.lw-harbor-ui .gap-8{gap:calc(var(--spacing) * 8)!important}.lw-harbor-ui :where(.-space-y-1>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * -1) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * -1) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-1>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-2>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-3>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-6>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-8>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui .self-start{align-self:flex-start!important}.lw-harbor-ui .justify-self-end{justify-self:flex-end!important}.lw-harbor-ui .truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.lw-harbor-ui .overflow-hidden{overflow:hidden!important}.lw-harbor-ui .overflow-y-auto{overflow-y:auto!important}.lw-harbor-ui .rounded{border-radius:.25rem!important}.lw-harbor-ui .rounded-full{border-radius:3.40282e38px!important}.lw-harbor-ui .rounded-lg{border-radius:.5rem!important}.lw-harbor-ui .rounded-md{border-radius:.375rem!important}.lw-harbor-ui .rounded-sm{border-radius:.25rem!important}.lw-harbor-ui .rounded-xl{border-radius:.75rem!important}.lw-harbor-ui .rounded-t-lg{border-top-right-radius:.5rem!important;border-top-left-radius:.5rem!important}.lw-harbor-ui .rounded-b-lg{border-bottom-left-radius:.5rem!important;border-bottom-right-radius:.5rem!important}.lw-harbor-ui .border{border-style:var(--lw-harbor-tw-border-style)!important;border-width:1px!important}.lw-harbor-ui .border-0{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .border-x{border-inline-style:var(--lw-harbor-tw-border-style)!important;border-inline-width:1px!important}.lw-harbor-ui .border-t{border-top-style:var(--lw-harbor-tw-border-style)!important;border-top-width:1px!important}.lw-harbor-ui .border-t-0{border-top-style:var(--lw-harbor-tw-border-style)!important;border-top-width:0!important}.lw-harbor-ui .\!border-b-0{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}.lw-harbor-ui .border-b{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:1px!important}.lw-harbor-ui .border-l{border-right-style:var(--lw-harbor-tw-border-style)!important;border-right-width:1px!important}.lw-harbor-ui .border-l-2{border-right-style:var(--lw-harbor-tw-border-style)!important;border-right-width:2px!important}.lw-harbor-ui .border-amber-200{border-color:var(--color-amber-200)!important}.lw-harbor-ui .border-blue-200{border-color:var(--color-blue-200)!important}.lw-harbor-ui .border-border{border-color:oklch(90% 0 0)!important}.lw-harbor-ui .border-emerald-200{border-color:var(--color-emerald-200)!important}.lw-harbor-ui .border-green-200{border-color:var(--color-green-200)!important}.lw-harbor-ui .border-input{border-color:oklch(90% 0 0)!important}.lw-harbor-ui .border-neutral-200{border-color:var(--color-neutral-200)!important}.lw-harbor-ui .border-neutral-800{border-color:var(--color-neutral-800)!important}.lw-harbor-ui .border-red-200{border-color:var(--color-red-200)!important}.lw-harbor-ui .border-transparent{border-color:#0000!important}.lw-harbor-ui .border-white\/40{border-color:#fff6!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .border-white\/40{border-color:color-mix(in oklab, var(--color-white) 40%, transparent)!important}}.lw-harbor-ui .bg-amber-50{background-color:var(--color-amber-50)!important}.lw-harbor-ui .bg-amber-100{background-color:var(--color-amber-100)!important}.lw-harbor-ui .bg-amber-500{background-color:var(--color-amber-500)!important}.lw-harbor-ui .bg-background{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-black\/50{background-color:#00000080!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)!important}}.lw-harbor-ui .bg-blue-50{background-color:var(--color-blue-50)!important}.lw-harbor-ui .bg-blue-100{background-color:var(--color-blue-100)!important}.lw-harbor-ui .bg-card{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-destructive{background-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .bg-emerald-100{background-color:var(--color-emerald-100)!important}.lw-harbor-ui .bg-gray-100{background-color:var(--color-gray-100)!important}.lw-harbor-ui .bg-green-50{background-color:var(--color-green-50)!important}.lw-harbor-ui .bg-green-500{background-color:var(--color-green-500)!important}.lw-harbor-ui .bg-muted{background-color:oklch(95.5% 0 0)!important}.lw-harbor-ui .bg-muted\/30{background-color:oklab(95.5% 0 0/.3)!important}.lw-harbor-ui .bg-muted\/50{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .bg-neutral-50{background-color:var(--color-neutral-50)!important}.lw-harbor-ui .bg-neutral-100{background-color:var(--color-neutral-100)!important}.lw-harbor-ui .bg-neutral-800{background-color:var(--color-neutral-800)!important}.lw-harbor-ui .bg-popover{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-primary{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .bg-red-50{background-color:var(--color-red-50)!important}.lw-harbor-ui .bg-secondary{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .bg-transparent{background-color:#0000!important}.lw-harbor-ui .bg-white{background-color:var(--color-white)!important}.lw-harbor-ui .bg-gradient-to-r{--lw-harbor-tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--lw-harbor-tw-gradient-stops))!important}.lw-harbor-ui .from-emerald-500{--lw-harbor-tw-gradient-from:var(--color-emerald-500);--lw-harbor-tw-gradient-stops:var(--lw-harbor-tw-gradient-via-stops,var(--lw-harbor-tw-gradient-position), var(--lw-harbor-tw-gradient-from) var(--lw-harbor-tw-gradient-from-position), var(--lw-harbor-tw-gradient-to) var(--lw-harbor-tw-gradient-to-position))}.lw-harbor-ui .to-emerald-600{--lw-harbor-tw-gradient-to:var(--color-emerald-600);--lw-harbor-tw-gradient-stops:var(--lw-harbor-tw-gradient-via-stops,var(--lw-harbor-tw-gradient-position), var(--lw-harbor-tw-gradient-from) var(--lw-harbor-tw-gradient-from-position), var(--lw-harbor-tw-gradient-to) var(--lw-harbor-tw-gradient-to-position))}.lw-harbor-ui .\!p-0, .lw-harbor-ui .p-0{padding:calc(var(--spacing) * 0)!important}.lw-harbor-ui .p-1{padding:calc(var(--spacing) * 1)!important}.lw-harbor-ui .p-4{padding:calc(var(--spacing) * 4)!important}.lw-harbor-ui .p-6{padding:calc(var(--spacing) * 6)!important}.lw-harbor-ui .px-2{padding-inline:calc(var(--spacing) * 2)!important}.lw-harbor-ui .px-3{padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .px-4{padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .px-6{padding-inline:calc(var(--spacing) * 6)!important}.lw-harbor-ui .px-8{padding-inline:calc(var(--spacing) * 8)!important}.lw-harbor-ui .py-0\.5{padding-block:calc(var(--spacing) * .5)!important}.lw-harbor-ui .py-1{padding-block:calc(var(--spacing) * 1)!important}.lw-harbor-ui .py-1\.5{padding-block:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .py-2{padding-block:calc(var(--spacing) * 2)!important}.lw-harbor-ui .py-2\.5{padding-block:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .py-3{padding-block:calc(var(--spacing) * 3)!important}.lw-harbor-ui .py-4{padding-block:calc(var(--spacing) * 4)!important}.lw-harbor-ui .py-6{padding-block:calc(var(--spacing) * 6)!important}.lw-harbor-ui .pt-4{padding-top:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pr-8{padding-left:calc(var(--spacing) * 8)!important}.lw-harbor-ui .pr-11{padding-left:calc(var(--spacing) * 11)!important}.lw-harbor-ui .pb-3{padding-bottom:calc(var(--spacing) * 3)!important}.lw-harbor-ui .pb-4{padding-bottom:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pb-6{padding-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .pl-2{padding-right:calc(var(--spacing) * 2)!important}.lw-harbor-ui .pl-4{padding-right:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pl-10{padding-right:calc(var(--spacing) * 10)!important}.lw-harbor-ui .pl-11{padding-right:calc(var(--spacing) * 11)!important}.lw-harbor-ui .text-center{text-align:center!important}.lw-harbor-ui .text-left{text-align:right!important}.lw-harbor-ui .text-right{text-align:left!important}.lw-harbor-ui .font-mono{font-family:var(--font-mono)!important}.lw-harbor-ui .\!text-2xl, -.lw-harbor-ui .text-2xl{font-size:var(--text-2xl)!important;line-height:var(--lw-harbor-tw-leading,var(--text-2xl--line-height))!important}.lw-harbor-ui .text-base{font-size:var(--text-base)!important;line-height:var(--lw-harbor-tw-leading,var(--text-base--line-height))!important}.lw-harbor-ui .text-lg{font-size:var(--text-lg)!important;line-height:var(--lw-harbor-tw-leading,var(--text-lg--line-height))!important}.lw-harbor-ui .text-sm{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .text-xs{font-size:var(--text-xs)!important;line-height:var(--lw-harbor-tw-leading,var(--text-xs--line-height))!important}.lw-harbor-ui .text-\[10px\]{font-size:10px!important}.lw-harbor-ui .text-\[11px\]{font-size:11px!important}.lw-harbor-ui .text-\[13px\]{font-size:13px!important}.lw-harbor-ui .leading-6{--lw-harbor-tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .leading-8{--lw-harbor-tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .leading-none{--lw-harbor-tw-leading:1;line-height:1!important}.lw-harbor-ui .leading-relaxed{--lw-harbor-tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)!important}.lw-harbor-ui .\!font-normal{--lw-harbor-tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)!important}.lw-harbor-ui .font-bold{--lw-harbor-tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)!important}.lw-harbor-ui .font-medium{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .font-semibold{--lw-harbor-tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)!important}.lw-harbor-ui .tracking-\[-0\.08px\]{--lw-harbor-tw-tracking:-.08px;letter-spacing:-.08px!important}.lw-harbor-ui .tracking-wide{--lw-harbor-tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)!important}.lw-harbor-ui .tracking-wider{--lw-harbor-tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)!important}.lw-harbor-ui .whitespace-nowrap{white-space:nowrap!important}.lw-harbor-ui .text-amber-600{color:var(--color-amber-600)!important}.lw-harbor-ui .text-amber-800{color:var(--color-amber-800)!important}.lw-harbor-ui .text-blue-800{color:var(--color-blue-800)!important}.lw-harbor-ui .text-blue-900{color:var(--color-blue-900)!important}.lw-harbor-ui .text-card-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-destructive{color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .text-emerald-800{color:var(--color-emerald-800)!important}.lw-harbor-ui .text-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-gray-500{color:var(--color-gray-500)!important}.lw-harbor-ui .text-green-600{color:var(--color-green-600)!important}.lw-harbor-ui .text-green-800{color:var(--color-green-800)!important}.lw-harbor-ui .text-muted-foreground{color:oklch(45% 0 0)!important}.lw-harbor-ui .text-neutral-950{color:var(--color-neutral-950)!important}.lw-harbor-ui .text-popover-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-primary{color:oklch(20.5% .08 265)!important}.lw-harbor-ui .text-primary-foreground{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .text-red-800{color:var(--color-red-800)!important}.lw-harbor-ui .text-secondary-foreground{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .text-white{color:var(--color-white)!important}.lw-harbor-ui .text-white\/70{color:#ffffffb3!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)!important}}.lw-harbor-ui .lowercase{text-transform:lowercase!important}.lw-harbor-ui .uppercase{text-transform:uppercase!important}.lw-harbor-ui .line-through{text-decoration-line:line-through!important}.lw-harbor-ui .underline{text-decoration-line:underline!important}.lw-harbor-ui .underline-offset-2{text-underline-offset:2px!important}.lw-harbor-ui .underline-offset-4{text-underline-offset:4px!important}.lw-harbor-ui .opacity-50{opacity:.5!important}.lw-harbor-ui .opacity-60{opacity:.6!important}.lw-harbor-ui .opacity-75{opacity:.75!important}.lw-harbor-ui .shadow-lg{--lw-harbor-tw-shadow:0 10px 15px -3px var(--lw-harbor-tw-shadow-color,#0000001a), 0 4px 6px -4px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-md{--lw-harbor-tw-shadow:0 4px 6px -1px var(--lw-harbor-tw-shadow-color,#0000001a), 0 2px 4px -2px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-sm{--lw-harbor-tw-shadow:0 1px 3px 0 var(--lw-harbor-tw-shadow-color,#0000001a), 0 1px 2px -1px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xl{--lw-harbor-tw-shadow:0 20px 25px -5px var(--lw-harbor-tw-shadow-color,#0000001a), 0 8px 10px -6px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xs{--lw-harbor-tw-shadow:0 1px 2px 0 var(--lw-harbor-tw-shadow-color,#0000000d);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .ring-0{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(0px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .outline{outline-style:var(--lw-harbor-tw-outline-style)!important;outline-width:1px!important}.lw-harbor-ui .filter{filter:var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,)!important}.lw-harbor-ui .transition-\[border-radius\]{transition-property:border-radius!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[color\,box-shadow\]{transition-property:color,box-shadow!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-all{transition-property:all!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-opacity{transition-property:opacity!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-transform{transition-property:transform,translate,scale,rotate!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .duration-150{--lw-harbor-tw-duration:.15s;transition-duration:.15s!important}.lw-harbor-ui .outline-none{--lw-harbor-tw-outline-style:none;outline-style:none!important}.lw-harbor-ui .select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.lw-harbor-ui .select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5!important}.lw-harbor-ui .group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed!important}.lw-harbor-ui .peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5!important}.lw-harbor-ui .selection\:bg-primary ::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary ::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:text-primary-foreground ::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground ::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .file\:inline-flex::file-selector-button{display:inline-flex!important}.lw-harbor-ui .file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .file\:border-0::file-selector-button{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .file\:bg-transparent::file-selector-button{background-color:#0000!important}.lw-harbor-ui .file\:text-sm::file-selector-button{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .file\:font-medium::file-selector-button{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .file\:text-foreground::file-selector-button{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::-moz-placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .last\:border-b-0:last-child{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}@media (hover:hover){.lw-harbor-ui .hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .hover\:bg-amber-100:hover{background-color:var(--color-amber-100)!important}.lw-harbor-ui .hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui .hover\:bg-muted\/50:hover{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui .hover\:bg-secondary\/80:hover{background-color:oklab(96.5% 0 0/.8)!important}.lw-harbor-ui .hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .hover\:text-foreground:hover{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .hover\:no-underline:hover{text-decoration-line:none!important}.lw-harbor-ui .hover\:underline:hover{text-decoration-line:underline!important}.lw-harbor-ui .hover\:opacity-75:hover{opacity:.75!important}.lw-harbor-ui .hover\:opacity-80:hover{opacity:.8!important}.lw-harbor-ui .hover\:opacity-100:hover{opacity:1!important}}.lw-harbor-ui .focus\:bg-accent:focus{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .focus\:text-accent-foreground:focus{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .focus-visible\:border-ring:focus-visible{border-color:oklch(70.8% .165 254.624)!important}.lw-harbor-ui .focus-visible\:ring-\[3px\]:focus-visible{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(3px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .focus-visible\:ring-destructive\/20:focus-visible{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .focus-visible\:ring-ring\/50:focus-visible{--lw-harbor-tw-ring-color:oklab(70.8% -.0437502 -.159094/.5)}.lw-harbor-ui .disabled\:pointer-events-none:disabled{pointer-events:none!important}.lw-harbor-ui .disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.lw-harbor-ui .disabled\:opacity-50:disabled{opacity:.5!important}.lw-harbor-ui .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto!important}.lw-harbor-ui .has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .aria-invalid\:border-destructive[aria-invalid=true]{border-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none!important}.lw-harbor-ui .data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5!important}.lw-harbor-ui .data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--lw-harbor-tw-translate-y:calc(var(--spacing) * 1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[side\=top\]\:-translate-y-1[data-side=top]{--lw-harbor-tw-translate-y:calc(var(--spacing) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem!important}.lw-harbor-ui .data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--lw-harbor-tw-translate-x:calc(100% - 2px);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--lw-harbor-tw-translate-x:calc(var(--spacing) * 0);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:border-input:is(.dark *){border-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:bg-destructive\/60:is(.dark *){background-color:oklab(57.7% .217662 .112464/.6)!important}.lw-harbor-ui .dark\:bg-input\/30:is(.dark *){background-color:oklab(90% 0 0/.3)!important}@media (hover:hover){.lw-harbor-ui .dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:oklab(96.5% 0 0/.5)!important}.lw-harbor-ui .dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:oklab(90% 0 0/.5)!important}}.lw-harbor-ui .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible, +.lw-harbor-ui .text-2xl{font-size:var(--text-2xl)!important;line-height:var(--lw-harbor-tw-leading,var(--text-2xl--line-height))!important}.lw-harbor-ui .text-base{font-size:var(--text-base)!important;line-height:var(--lw-harbor-tw-leading,var(--text-base--line-height))!important}.lw-harbor-ui .text-lg{font-size:var(--text-lg)!important;line-height:var(--lw-harbor-tw-leading,var(--text-lg--line-height))!important}.lw-harbor-ui .text-sm{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .text-xs{font-size:var(--text-xs)!important;line-height:var(--lw-harbor-tw-leading,var(--text-xs--line-height))!important}.lw-harbor-ui .text-\[10px\]{font-size:10px!important}.lw-harbor-ui .text-\[11px\]{font-size:11px!important}.lw-harbor-ui .text-\[13px\]{font-size:13px!important}.lw-harbor-ui .leading-6{--lw-harbor-tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .leading-8{--lw-harbor-tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .leading-none{--lw-harbor-tw-leading:1;line-height:1!important}.lw-harbor-ui .leading-relaxed{--lw-harbor-tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)!important}.lw-harbor-ui .\!font-normal{--lw-harbor-tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)!important}.lw-harbor-ui .font-bold{--lw-harbor-tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)!important}.lw-harbor-ui .font-medium{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .font-semibold{--lw-harbor-tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)!important}.lw-harbor-ui .tracking-\[-0\.08px\]{--lw-harbor-tw-tracking:-.08px;letter-spacing:-.08px!important}.lw-harbor-ui .tracking-wide{--lw-harbor-tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)!important}.lw-harbor-ui .tracking-wider{--lw-harbor-tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)!important}.lw-harbor-ui .whitespace-nowrap{white-space:nowrap!important}.lw-harbor-ui .text-amber-600{color:var(--color-amber-600)!important}.lw-harbor-ui .text-amber-800{color:var(--color-amber-800)!important}.lw-harbor-ui .text-blue-800{color:var(--color-blue-800)!important}.lw-harbor-ui .text-blue-900{color:var(--color-blue-900)!important}.lw-harbor-ui .text-card-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-destructive{color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .text-emerald-800{color:var(--color-emerald-800)!important}.lw-harbor-ui .text-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-gray-500{color:var(--color-gray-500)!important}.lw-harbor-ui .text-green-600{color:var(--color-green-600)!important}.lw-harbor-ui .text-green-800{color:var(--color-green-800)!important}.lw-harbor-ui .text-muted-foreground{color:oklch(45% 0 0)!important}.lw-harbor-ui .text-neutral-950{color:var(--color-neutral-950)!important}.lw-harbor-ui .text-popover-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-primary{color:oklch(20.5% .08 265)!important}.lw-harbor-ui .text-primary-foreground{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .text-red-800{color:var(--color-red-800)!important}.lw-harbor-ui .text-secondary-foreground{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .text-white{color:var(--color-white)!important}.lw-harbor-ui .text-white\/70{color:#ffffffb3!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)!important}}.lw-harbor-ui .lowercase{text-transform:lowercase!important}.lw-harbor-ui .uppercase{text-transform:uppercase!important}.lw-harbor-ui .line-through{text-decoration-line:line-through!important}.lw-harbor-ui .underline{text-decoration-line:underline!important}.lw-harbor-ui .underline-offset-2{text-underline-offset:2px!important}.lw-harbor-ui .underline-offset-4{text-underline-offset:4px!important}.lw-harbor-ui .opacity-50{opacity:.5!important}.lw-harbor-ui .opacity-60{opacity:.6!important}.lw-harbor-ui .opacity-75{opacity:.75!important}.lw-harbor-ui .shadow-lg{--lw-harbor-tw-shadow:0 10px 15px -3px var(--lw-harbor-tw-shadow-color,#0000001a), 0 4px 6px -4px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-md{--lw-harbor-tw-shadow:0 4px 6px -1px var(--lw-harbor-tw-shadow-color,#0000001a), 0 2px 4px -2px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-sm{--lw-harbor-tw-shadow:0 1px 3px 0 var(--lw-harbor-tw-shadow-color,#0000001a), 0 1px 2px -1px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xl{--lw-harbor-tw-shadow:0 20px 25px -5px var(--lw-harbor-tw-shadow-color,#0000001a), 0 8px 10px -6px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xs{--lw-harbor-tw-shadow:0 1px 2px 0 var(--lw-harbor-tw-shadow-color,#0000000d);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .ring-0{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(0px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .outline{outline-style:var(--lw-harbor-tw-outline-style)!important;outline-width:1px!important}.lw-harbor-ui .filter{filter:var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,)!important}.lw-harbor-ui .transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[border-radius\]{transition-property:border-radius!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[color\,box-shadow\]{transition-property:color,box-shadow!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-all{transition-property:all!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-opacity{transition-property:opacity!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-transform{transition-property:transform,translate,scale,rotate!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .duration-150{--lw-harbor-tw-duration:.15s;transition-duration:.15s!important}.lw-harbor-ui .outline-none{--lw-harbor-tw-outline-style:none;outline-style:none!important}.lw-harbor-ui .select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.lw-harbor-ui .select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5!important}.lw-harbor-ui .group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed!important}.lw-harbor-ui .peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5!important}.lw-harbor-ui .selection\:bg-primary ::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary ::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:text-primary-foreground ::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground ::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .file\:inline-flex::file-selector-button{display:inline-flex!important}.lw-harbor-ui .file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .file\:border-0::file-selector-button{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .file\:bg-transparent::file-selector-button{background-color:#0000!important}.lw-harbor-ui .file\:text-sm::file-selector-button{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .file\:font-medium::file-selector-button{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .file\:text-foreground::file-selector-button{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::-moz-placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .last\:border-b-0:last-child{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}@media (hover:hover){.lw-harbor-ui .hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .hover\:bg-amber-100:hover{background-color:var(--color-amber-100)!important}.lw-harbor-ui .hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui .hover\:bg-muted\/50:hover{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui .hover\:bg-secondary\/80:hover{background-color:oklab(96.5% 0 0/.8)!important}.lw-harbor-ui .hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .hover\:text-foreground:hover{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .hover\:no-underline:hover{text-decoration-line:none!important}.lw-harbor-ui .hover\:underline:hover{text-decoration-line:underline!important}.lw-harbor-ui .hover\:opacity-75:hover{opacity:.75!important}.lw-harbor-ui .hover\:opacity-80:hover{opacity:.8!important}.lw-harbor-ui .hover\:opacity-100:hover{opacity:1!important}}.lw-harbor-ui .focus\:bg-accent:focus{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .focus\:text-accent-foreground:focus{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .focus-visible\:border-ring:focus-visible{border-color:oklch(70.8% .165 254.624)!important}.lw-harbor-ui .focus-visible\:ring-\[3px\]:focus-visible{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(3px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .focus-visible\:ring-destructive\/20:focus-visible{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .focus-visible\:ring-ring\/50:focus-visible{--lw-harbor-tw-ring-color:oklab(70.8% -.0437502 -.159094/.5)}.lw-harbor-ui .disabled\:pointer-events-none:disabled{pointer-events:none!important}.lw-harbor-ui .disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.lw-harbor-ui .disabled\:opacity-50:disabled{opacity:.5!important}.lw-harbor-ui .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto!important}.lw-harbor-ui .has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .aria-invalid\:border-destructive[aria-invalid=true]{border-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none!important}.lw-harbor-ui .data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5!important}.lw-harbor-ui .data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--lw-harbor-tw-translate-y:calc(var(--spacing) * 1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[side\=top\]\:-translate-y-1[data-side=top]{--lw-harbor-tw-translate-y:calc(var(--spacing) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem!important}.lw-harbor-ui .data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--lw-harbor-tw-translate-x:calc(100% - 2px);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--lw-harbor-tw-translate-x:calc(var(--spacing) * 0);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:border-input:is(.dark *){border-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:bg-destructive\/60:is(.dark *){background-color:oklab(57.7% .217662 .112464/.6)!important}.lw-harbor-ui .dark\:bg-input\/30:is(.dark *){background-color:oklab(90% 0 0/.3)!important}@media (hover:hover){.lw-harbor-ui .dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:oklab(96.5% 0 0/.5)!important}.lw-harbor-ui .dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:oklab(90% 0 0/.5)!important}}.lw-harbor-ui .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible, .lw-harbor-ui .dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.4)}.lw-harbor-ui .dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:oklch(98.5% 0 0)!important}.lw-harbor-ui .dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:oklch(14.5% 0 0)!important}.lw-harbor-ui .dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:oklab(90% 0 0/.8)!important}.lw-harbor-ui .\[\&_svg\]\:pointer-events-none svg{pointer-events:none!important}.lw-harbor-ui .\[\&_svg\]\:shrink-0 svg{flex-shrink:0!important}.lw-harbor-ui .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)!important}.lw-harbor-ui .\[\&\>div\]\:bg-primary>div{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1!important;-webkit-box-orient:vertical!important;display:-webkit-box!important;overflow:hidden!important}.lw-harbor-ui .\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none!important}.lw-harbor-ui .\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}@media (hover:hover){.lw-harbor-ui a.\[a\&\]\:hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:oklab(96.5% 0 0/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline!important}}}.lw-harbor-ui{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(95.5% 0 0);--muted-foreground:oklch(45% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(90% 0 0);--input:oklch(90% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.lw-harbor-ui .dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}.lw-harbor-ui{background-color:var(--color-background);color:var(--color-foreground);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;line-height:1.5}.lw-harbor-ui *{border-color:var(--color-border)}#wpcontent:has(.lw-harbor-ui){padding-right:0}#wpcontent:has(.lw-harbor-ui) #wpbody-content{padding-bottom:0}#wpcontent:has(.lw-harbor-ui)+#wpfooter{display:none}.wrap:has(>.lw-harbor-ui){margin:0;padding:0}@property --lw-harbor-tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-rotate-x{syntax:"*";inherits:false}@property --lw-harbor-tw-rotate-y{syntax:"*";inherits:false}@property --lw-harbor-tw-rotate-z{syntax:"*";inherits:false}@property --lw-harbor-tw-skew-x{syntax:"*";inherits:false}@property --lw-harbor-tw-skew-y{syntax:"*";inherits:false}@property --lw-harbor-tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --lw-harbor-tw-gradient-position{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-stops{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-via-stops{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --lw-harbor-tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --lw-harbor-tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-leading{syntax:"*";inherits:false}@property --lw-harbor-tw-font-weight{syntax:"*";inherits:false}@property --lw-harbor-tw-tracking{syntax:"*";inherits:false}@property --lw-harbor-tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-inset-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-ring-color{syntax:"*";inherits:false}@property --lw-harbor-tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-inset-ring-color{syntax:"*";inherits:false}@property --lw-harbor-tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-ring-inset{syntax:"*";inherits:false}@property --lw-harbor-tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --lw-harbor-tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --lw-harbor-tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --lw-harbor-tw-blur{syntax:"*";inherits:false}@property --lw-harbor-tw-brightness{syntax:"*";inherits:false}@property --lw-harbor-tw-contrast{syntax:"*";inherits:false}@property --lw-harbor-tw-grayscale{syntax:"*";inherits:false}@property --lw-harbor-tw-hue-rotate{syntax:"*";inherits:false}@property --lw-harbor-tw-invert{syntax:"*";inherits:false}@property --lw-harbor-tw-opacity{syntax:"*";inherits:false}@property --lw-harbor-tw-saturate{syntax:"*";inherits:false}@property --lw-harbor-tw-sepia{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-drop-shadow-size{syntax:"*";inherits:false}@property --lw-harbor-tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(-360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/build/index.asset.php b/build/index.asset.php index bf309976..ae0e7d3d 100644 --- a/build/index.asset.php +++ b/build/index.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'd50596f2fb801d5f99cc'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'df0453971c645deac65f'); diff --git a/build/index.css b/build/index.css index f48af28c..1209d988 100644 --- a/build/index.css +++ b/build/index.css @@ -35,6 +35,6 @@ .lw-harbor-ui .m-0{margin:calc(var(--spacing) * 0)!important}.lw-harbor-ui .-mx-1{margin-inline:calc(var(--spacing) * -1)!important}.lw-harbor-ui .my-1{margin-block:calc(var(--spacing) * 1)!important}.lw-harbor-ui .\!mt-8{margin-top:calc(var(--spacing) * 8)!important}.lw-harbor-ui .mt-0{margin-top:calc(var(--spacing) * 0)!important}.lw-harbor-ui .mt-0\.5{margin-top:calc(var(--spacing) * .5)!important}.lw-harbor-ui .mt-1{margin-top:calc(var(--spacing) * 1)!important}.lw-harbor-ui .mt-1\.5{margin-top:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .mt-2{margin-top:calc(var(--spacing) * 2)!important}.lw-harbor-ui .mt-8{margin-top:calc(var(--spacing) * 8)!important}.lw-harbor-ui .mt-\[0\.75em\]\!{margin-top:.75em!important}.lw-harbor-ui .mt-auto{margin-top:auto!important}.lw-harbor-ui .\!mb-6{margin-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .mb-0, .lw-harbor-ui .mb-0\!{margin-bottom:calc(var(--spacing) * 0)!important}.lw-harbor-ui .mb-4{margin-bottom:calc(var(--spacing) * 4)!important}.lw-harbor-ui .ml-1{margin-left:calc(var(--spacing) * 1)!important}.lw-harbor-ui .ml-2{margin-left:calc(var(--spacing) * 2)!important}.lw-harbor-ui .ml-4{margin-left:calc(var(--spacing) * 4)!important}.lw-harbor-ui .ml-auto{margin-left:auto!important}.lw-harbor-ui .block{display:block!important}.lw-harbor-ui .contents{display:contents!important}.lw-harbor-ui .flex{display:flex!important}.lw-harbor-ui .grid{display:grid!important}.lw-harbor-ui .hidden{display:none!important}.lw-harbor-ui .inline{display:inline!important}.lw-harbor-ui .inline-flex{display:inline-flex!important}.lw-harbor-ui .table{display:table!important}.lw-harbor-ui .size-1\.5{width:calc(var(--spacing) * 1.5)!important;height:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .size-6{width:calc(var(--spacing) * 6)!important;height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .size-8{width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .size-9{width:calc(var(--spacing) * 9)!important;height:calc(var(--spacing) * 9)!important}.lw-harbor-ui .size-10{width:calc(var(--spacing) * 10)!important;height:calc(var(--spacing) * 10)!important}.lw-harbor-ui .h-0{height:calc(var(--spacing) * 0)!important}.lw-harbor-ui .h-1\.5{height:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .h-3{height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .h-3\.5{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .h-4{height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .h-5{height:calc(var(--spacing) * 5)!important}.lw-harbor-ui .h-6{height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .h-7{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .h-8{height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .h-9{height:calc(var(--spacing) * 9)!important}.lw-harbor-ui .h-10{height:calc(var(--spacing) * 10)!important}.lw-harbor-ui .h-18{height:calc(var(--spacing) * 18)!important}.lw-harbor-ui .h-\[calc\(100vh-32px\)\]{height:calc(100vh - 32px)!important}.lw-harbor-ui .h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)!important}.lw-harbor-ui .h-px{height:1px!important}.lw-harbor-ui .max-h-96{max-height:calc(var(--spacing) * 96)!important}.lw-harbor-ui .max-h-\[90vh\]{max-height:90vh!important}.lw-harbor-ui .min-h-0{min-height:calc(var(--spacing) * 0)!important}.lw-harbor-ui .w-1\.5{width:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .w-3{width:calc(var(--spacing) * 3)!important}.lw-harbor-ui .w-3\.5{width:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .w-4{width:calc(var(--spacing) * 4)!important}.lw-harbor-ui .w-5{width:calc(var(--spacing) * 5)!important}.lw-harbor-ui .w-6{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .w-8{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .w-9{width:calc(var(--spacing) * 9)!important}.lw-harbor-ui .w-12{width:calc(var(--spacing) * 12)!important}.lw-harbor-ui .w-14{width:calc(var(--spacing) * 14)!important}.lw-harbor-ui .w-18{width:calc(var(--spacing) * 18)!important}.lw-harbor-ui .w-25{width:calc(var(--spacing) * 25)!important}.lw-harbor-ui .w-32{width:calc(var(--spacing) * 32)!important}.lw-harbor-ui .w-36{width:calc(var(--spacing) * 36)!important}.lw-harbor-ui .w-\[130px\]{width:130px!important}.lw-harbor-ui .w-\[168px\]{width:168px!important}.lw-harbor-ui .w-\[260px\]{width:260px!important}.lw-harbor-ui .w-\[285px\]{width:285px!important}.lw-harbor-ui .w-fit{width:-moz-fit-content!important;width:fit-content!important}.lw-harbor-ui .w-full{width:100%!important}.lw-harbor-ui .max-w-104{max-width:calc(var(--spacing) * 104)!important}.lw-harbor-ui .max-w-full{max-width:100%!important}.lw-harbor-ui .max-w-lg{max-width:var(--container-lg)!important}.lw-harbor-ui .max-w-md{max-width:var(--container-md)!important}.lw-harbor-ui .max-w-xl{max-width:var(--container-xl)!important}.lw-harbor-ui .max-w-xs{max-width:var(--container-xs)!important}.lw-harbor-ui .min-w-0{min-width:calc(var(--spacing) * 0)!important}.lw-harbor-ui .min-w-\[8rem\]{min-width:8rem!important}.lw-harbor-ui .min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)!important}.lw-harbor-ui .flex-1{flex:1!important}.lw-harbor-ui .shrink-0{flex-shrink:0!important}.lw-harbor-ui .-translate-y-1\/2{--lw-harbor-tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .-translate-y-px{--lw-harbor-tw-translate-y:-1px;translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .transform{transform:var(--lw-harbor-tw-rotate-x,) var(--lw-harbor-tw-rotate-y,) var(--lw-harbor-tw-rotate-z,) var(--lw-harbor-tw-skew-x,) var(--lw-harbor-tw-skew-y,)!important}.lw-harbor-ui .animate-pulse{animation:var(--animate-pulse)!important}.lw-harbor-ui .animate-spin{animation:var(--animate-spin)!important}.lw-harbor-ui .cursor-default{cursor:default!important}.lw-harbor-ui .cursor-pointer{cursor:pointer!important}.lw-harbor-ui .scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)!important}.lw-harbor-ui .auto-rows-min{grid-auto-rows:min-content!important}.lw-harbor-ui .grid-rows-\[auto_auto\]{grid-template-rows:auto auto!important}.lw-harbor-ui .flex-col{flex-direction:column!important}.lw-harbor-ui .flex-wrap{flex-wrap:wrap!important}.lw-harbor-ui .items-center{align-items:center!important}.lw-harbor-ui .items-end{align-items:flex-end!important}.lw-harbor-ui .items-start{align-items:flex-start!important}.lw-harbor-ui .justify-between{justify-content:space-between!important}.lw-harbor-ui .justify-center{justify-content:center!important}.lw-harbor-ui .justify-end{justify-content:flex-end!important}.lw-harbor-ui .gap-0\.5{gap:calc(var(--spacing) * .5)!important}.lw-harbor-ui .gap-1{gap:calc(var(--spacing) * 1)!important}.lw-harbor-ui .gap-1\.5{gap:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .gap-2{gap:calc(var(--spacing) * 2)!important}.lw-harbor-ui .gap-2\.5{gap:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .gap-3{gap:calc(var(--spacing) * 3)!important}.lw-harbor-ui .gap-6{gap:calc(var(--spacing) * 6)!important}.lw-harbor-ui .gap-8{gap:calc(var(--spacing) * 8)!important}.lw-harbor-ui :where(.-space-y-1>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * -1) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * -1) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-1>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-2>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-3>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-6>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui :where(.space-y-8>:not(:last-child)){--lw-harbor-tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--lw-harbor-tw-space-y-reverse))!important;margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--lw-harbor-tw-space-y-reverse)))!important}.lw-harbor-ui .self-start{align-self:flex-start!important}.lw-harbor-ui .justify-self-end{justify-self:flex-end!important}.lw-harbor-ui .truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.lw-harbor-ui .overflow-hidden{overflow:hidden!important}.lw-harbor-ui .overflow-y-auto{overflow-y:auto!important}.lw-harbor-ui .rounded{border-radius:.25rem!important}.lw-harbor-ui .rounded-full{border-radius:3.40282e38px!important}.lw-harbor-ui .rounded-lg{border-radius:.5rem!important}.lw-harbor-ui .rounded-md{border-radius:.375rem!important}.lw-harbor-ui .rounded-sm{border-radius:.25rem!important}.lw-harbor-ui .rounded-xl{border-radius:.75rem!important}.lw-harbor-ui .rounded-t-lg{border-top-left-radius:.5rem!important;border-top-right-radius:.5rem!important}.lw-harbor-ui .rounded-b-lg{border-bottom-right-radius:.5rem!important;border-bottom-left-radius:.5rem!important}.lw-harbor-ui .border{border-style:var(--lw-harbor-tw-border-style)!important;border-width:1px!important}.lw-harbor-ui .border-0{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .border-x{border-inline-style:var(--lw-harbor-tw-border-style)!important;border-inline-width:1px!important}.lw-harbor-ui .border-t{border-top-style:var(--lw-harbor-tw-border-style)!important;border-top-width:1px!important}.lw-harbor-ui .border-t-0{border-top-style:var(--lw-harbor-tw-border-style)!important;border-top-width:0!important}.lw-harbor-ui .\!border-b-0{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}.lw-harbor-ui .border-b{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:1px!important}.lw-harbor-ui .border-l{border-left-style:var(--lw-harbor-tw-border-style)!important;border-left-width:1px!important}.lw-harbor-ui .border-l-2{border-left-style:var(--lw-harbor-tw-border-style)!important;border-left-width:2px!important}.lw-harbor-ui .border-amber-200{border-color:var(--color-amber-200)!important}.lw-harbor-ui .border-blue-200{border-color:var(--color-blue-200)!important}.lw-harbor-ui .border-border{border-color:oklch(90% 0 0)!important}.lw-harbor-ui .border-emerald-200{border-color:var(--color-emerald-200)!important}.lw-harbor-ui .border-green-200{border-color:var(--color-green-200)!important}.lw-harbor-ui .border-input{border-color:oklch(90% 0 0)!important}.lw-harbor-ui .border-neutral-200{border-color:var(--color-neutral-200)!important}.lw-harbor-ui .border-neutral-800{border-color:var(--color-neutral-800)!important}.lw-harbor-ui .border-red-200{border-color:var(--color-red-200)!important}.lw-harbor-ui .border-transparent{border-color:#0000!important}.lw-harbor-ui .border-white\/40{border-color:#fff6!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .border-white\/40{border-color:color-mix(in oklab, var(--color-white) 40%, transparent)!important}}.lw-harbor-ui .bg-amber-50{background-color:var(--color-amber-50)!important}.lw-harbor-ui .bg-amber-100{background-color:var(--color-amber-100)!important}.lw-harbor-ui .bg-amber-500{background-color:var(--color-amber-500)!important}.lw-harbor-ui .bg-background{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-black\/50{background-color:#00000080!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)!important}}.lw-harbor-ui .bg-blue-50{background-color:var(--color-blue-50)!important}.lw-harbor-ui .bg-blue-100{background-color:var(--color-blue-100)!important}.lw-harbor-ui .bg-card{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-destructive{background-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .bg-emerald-100{background-color:var(--color-emerald-100)!important}.lw-harbor-ui .bg-gray-100{background-color:var(--color-gray-100)!important}.lw-harbor-ui .bg-green-50{background-color:var(--color-green-50)!important}.lw-harbor-ui .bg-green-500{background-color:var(--color-green-500)!important}.lw-harbor-ui .bg-muted{background-color:oklch(95.5% 0 0)!important}.lw-harbor-ui .bg-muted\/30{background-color:oklab(95.5% 0 0/.3)!important}.lw-harbor-ui .bg-muted\/50{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .bg-neutral-50{background-color:var(--color-neutral-50)!important}.lw-harbor-ui .bg-neutral-100{background-color:var(--color-neutral-100)!important}.lw-harbor-ui .bg-neutral-800{background-color:var(--color-neutral-800)!important}.lw-harbor-ui .bg-popover{background-color:oklch(100% 0 0)!important}.lw-harbor-ui .bg-primary{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .bg-red-50{background-color:var(--color-red-50)!important}.lw-harbor-ui .bg-secondary{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .bg-transparent{background-color:#0000!important}.lw-harbor-ui .bg-white{background-color:var(--color-white)!important}.lw-harbor-ui .bg-gradient-to-r{--lw-harbor-tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--lw-harbor-tw-gradient-stops))!important}.lw-harbor-ui .from-emerald-500{--lw-harbor-tw-gradient-from:var(--color-emerald-500);--lw-harbor-tw-gradient-stops:var(--lw-harbor-tw-gradient-via-stops,var(--lw-harbor-tw-gradient-position), var(--lw-harbor-tw-gradient-from) var(--lw-harbor-tw-gradient-from-position), var(--lw-harbor-tw-gradient-to) var(--lw-harbor-tw-gradient-to-position))}.lw-harbor-ui .to-emerald-600{--lw-harbor-tw-gradient-to:var(--color-emerald-600);--lw-harbor-tw-gradient-stops:var(--lw-harbor-tw-gradient-via-stops,var(--lw-harbor-tw-gradient-position), var(--lw-harbor-tw-gradient-from) var(--lw-harbor-tw-gradient-from-position), var(--lw-harbor-tw-gradient-to) var(--lw-harbor-tw-gradient-to-position))}.lw-harbor-ui .\!p-0, .lw-harbor-ui .p-0{padding:calc(var(--spacing) * 0)!important}.lw-harbor-ui .p-1{padding:calc(var(--spacing) * 1)!important}.lw-harbor-ui .p-4{padding:calc(var(--spacing) * 4)!important}.lw-harbor-ui .p-6{padding:calc(var(--spacing) * 6)!important}.lw-harbor-ui .px-2{padding-inline:calc(var(--spacing) * 2)!important}.lw-harbor-ui .px-3{padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .px-4{padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .px-6{padding-inline:calc(var(--spacing) * 6)!important}.lw-harbor-ui .px-8{padding-inline:calc(var(--spacing) * 8)!important}.lw-harbor-ui .py-0\.5{padding-block:calc(var(--spacing) * .5)!important}.lw-harbor-ui .py-1{padding-block:calc(var(--spacing) * 1)!important}.lw-harbor-ui .py-1\.5{padding-block:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .py-2{padding-block:calc(var(--spacing) * 2)!important}.lw-harbor-ui .py-2\.5{padding-block:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .py-3{padding-block:calc(var(--spacing) * 3)!important}.lw-harbor-ui .py-4{padding-block:calc(var(--spacing) * 4)!important}.lw-harbor-ui .py-6{padding-block:calc(var(--spacing) * 6)!important}.lw-harbor-ui .pt-4{padding-top:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pr-8{padding-right:calc(var(--spacing) * 8)!important}.lw-harbor-ui .pr-11{padding-right:calc(var(--spacing) * 11)!important}.lw-harbor-ui .pb-3{padding-bottom:calc(var(--spacing) * 3)!important}.lw-harbor-ui .pb-4{padding-bottom:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pb-6{padding-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .pl-2{padding-left:calc(var(--spacing) * 2)!important}.lw-harbor-ui .pl-4{padding-left:calc(var(--spacing) * 4)!important}.lw-harbor-ui .pl-10{padding-left:calc(var(--spacing) * 10)!important}.lw-harbor-ui .pl-11{padding-left:calc(var(--spacing) * 11)!important}.lw-harbor-ui .text-center{text-align:center!important}.lw-harbor-ui .text-left{text-align:left!important}.lw-harbor-ui .text-right{text-align:right!important}.lw-harbor-ui .font-mono{font-family:var(--font-mono)!important}.lw-harbor-ui .\!text-2xl, -.lw-harbor-ui .text-2xl{font-size:var(--text-2xl)!important;line-height:var(--lw-harbor-tw-leading,var(--text-2xl--line-height))!important}.lw-harbor-ui .text-base{font-size:var(--text-base)!important;line-height:var(--lw-harbor-tw-leading,var(--text-base--line-height))!important}.lw-harbor-ui .text-lg{font-size:var(--text-lg)!important;line-height:var(--lw-harbor-tw-leading,var(--text-lg--line-height))!important}.lw-harbor-ui .text-sm{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .text-xs{font-size:var(--text-xs)!important;line-height:var(--lw-harbor-tw-leading,var(--text-xs--line-height))!important}.lw-harbor-ui .text-\[10px\]{font-size:10px!important}.lw-harbor-ui .text-\[11px\]{font-size:11px!important}.lw-harbor-ui .text-\[13px\]{font-size:13px!important}.lw-harbor-ui .leading-6{--lw-harbor-tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .leading-8{--lw-harbor-tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .leading-none{--lw-harbor-tw-leading:1;line-height:1!important}.lw-harbor-ui .leading-relaxed{--lw-harbor-tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)!important}.lw-harbor-ui .\!font-normal{--lw-harbor-tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)!important}.lw-harbor-ui .font-bold{--lw-harbor-tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)!important}.lw-harbor-ui .font-medium{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .font-semibold{--lw-harbor-tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)!important}.lw-harbor-ui .tracking-\[-0\.08px\]{--lw-harbor-tw-tracking:-.08px;letter-spacing:-.08px!important}.lw-harbor-ui .tracking-wide{--lw-harbor-tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)!important}.lw-harbor-ui .tracking-wider{--lw-harbor-tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)!important}.lw-harbor-ui .whitespace-nowrap{white-space:nowrap!important}.lw-harbor-ui .text-amber-600{color:var(--color-amber-600)!important}.lw-harbor-ui .text-amber-800{color:var(--color-amber-800)!important}.lw-harbor-ui .text-blue-800{color:var(--color-blue-800)!important}.lw-harbor-ui .text-blue-900{color:var(--color-blue-900)!important}.lw-harbor-ui .text-card-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-destructive{color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .text-emerald-800{color:var(--color-emerald-800)!important}.lw-harbor-ui .text-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-gray-500{color:var(--color-gray-500)!important}.lw-harbor-ui .text-green-600{color:var(--color-green-600)!important}.lw-harbor-ui .text-green-800{color:var(--color-green-800)!important}.lw-harbor-ui .text-muted-foreground{color:oklch(45% 0 0)!important}.lw-harbor-ui .text-neutral-950{color:var(--color-neutral-950)!important}.lw-harbor-ui .text-popover-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-primary{color:oklch(20.5% .08 265)!important}.lw-harbor-ui .text-primary-foreground{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .text-red-800{color:var(--color-red-800)!important}.lw-harbor-ui .text-secondary-foreground{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .text-white{color:var(--color-white)!important}.lw-harbor-ui .text-white\/70{color:#ffffffb3!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)!important}}.lw-harbor-ui .lowercase{text-transform:lowercase!important}.lw-harbor-ui .uppercase{text-transform:uppercase!important}.lw-harbor-ui .line-through{text-decoration-line:line-through!important}.lw-harbor-ui .underline{text-decoration-line:underline!important}.lw-harbor-ui .underline-offset-2{text-underline-offset:2px!important}.lw-harbor-ui .underline-offset-4{text-underline-offset:4px!important}.lw-harbor-ui .opacity-50{opacity:.5!important}.lw-harbor-ui .opacity-60{opacity:.6!important}.lw-harbor-ui .opacity-75{opacity:.75!important}.lw-harbor-ui .shadow-lg{--lw-harbor-tw-shadow:0 10px 15px -3px var(--lw-harbor-tw-shadow-color,#0000001a), 0 4px 6px -4px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-md{--lw-harbor-tw-shadow:0 4px 6px -1px var(--lw-harbor-tw-shadow-color,#0000001a), 0 2px 4px -2px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-sm{--lw-harbor-tw-shadow:0 1px 3px 0 var(--lw-harbor-tw-shadow-color,#0000001a), 0 1px 2px -1px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xl{--lw-harbor-tw-shadow:0 20px 25px -5px var(--lw-harbor-tw-shadow-color,#0000001a), 0 8px 10px -6px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xs{--lw-harbor-tw-shadow:0 1px 2px 0 var(--lw-harbor-tw-shadow-color,#0000000d);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .ring-0{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(0px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .outline{outline-style:var(--lw-harbor-tw-outline-style)!important;outline-width:1px!important}.lw-harbor-ui .filter{filter:var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,)!important}.lw-harbor-ui .transition-\[border-radius\]{transition-property:border-radius!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[color\,box-shadow\]{transition-property:color,box-shadow!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-all{transition-property:all!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-opacity{transition-property:opacity!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-transform{transition-property:transform,translate,scale,rotate!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .duration-150{--lw-harbor-tw-duration:.15s;transition-duration:.15s!important}.lw-harbor-ui .outline-none{--lw-harbor-tw-outline-style:none;outline-style:none!important}.lw-harbor-ui .select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.lw-harbor-ui .select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5!important}.lw-harbor-ui .group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed!important}.lw-harbor-ui .peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5!important}.lw-harbor-ui .selection\:bg-primary ::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary ::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:text-primary-foreground ::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground ::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .file\:inline-flex::file-selector-button{display:inline-flex!important}.lw-harbor-ui .file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .file\:border-0::file-selector-button{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .file\:bg-transparent::file-selector-button{background-color:#0000!important}.lw-harbor-ui .file\:text-sm::file-selector-button{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .file\:font-medium::file-selector-button{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .file\:text-foreground::file-selector-button{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::-moz-placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .last\:border-b-0:last-child{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}@media (hover:hover){.lw-harbor-ui .hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .hover\:bg-amber-100:hover{background-color:var(--color-amber-100)!important}.lw-harbor-ui .hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui .hover\:bg-muted\/50:hover{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui .hover\:bg-secondary\/80:hover{background-color:oklab(96.5% 0 0/.8)!important}.lw-harbor-ui .hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .hover\:text-foreground:hover{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .hover\:no-underline:hover{text-decoration-line:none!important}.lw-harbor-ui .hover\:underline:hover{text-decoration-line:underline!important}.lw-harbor-ui .hover\:opacity-75:hover{opacity:.75!important}.lw-harbor-ui .hover\:opacity-80:hover{opacity:.8!important}.lw-harbor-ui .hover\:opacity-100:hover{opacity:1!important}}.lw-harbor-ui .focus\:bg-accent:focus{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .focus\:text-accent-foreground:focus{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .focus-visible\:border-ring:focus-visible{border-color:oklch(70.8% .165 254.624)!important}.lw-harbor-ui .focus-visible\:ring-\[3px\]:focus-visible{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(3px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .focus-visible\:ring-destructive\/20:focus-visible{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .focus-visible\:ring-ring\/50:focus-visible{--lw-harbor-tw-ring-color:oklab(70.8% -.0437502 -.159094/.5)}.lw-harbor-ui .disabled\:pointer-events-none:disabled{pointer-events:none!important}.lw-harbor-ui .disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.lw-harbor-ui .disabled\:opacity-50:disabled{opacity:.5!important}.lw-harbor-ui .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto!important}.lw-harbor-ui .has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .aria-invalid\:border-destructive[aria-invalid=true]{border-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none!important}.lw-harbor-ui .data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5!important}.lw-harbor-ui .data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--lw-harbor-tw-translate-y:calc(var(--spacing) * 1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[side\=top\]\:-translate-y-1[data-side=top]{--lw-harbor-tw-translate-y:calc(var(--spacing) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem!important}.lw-harbor-ui .data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--lw-harbor-tw-translate-x:calc(100% - 2px);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--lw-harbor-tw-translate-x:calc(var(--spacing) * 0);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:border-input:is(.dark *){border-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:bg-destructive\/60:is(.dark *){background-color:oklab(57.7% .217662 .112464/.6)!important}.lw-harbor-ui .dark\:bg-input\/30:is(.dark *){background-color:oklab(90% 0 0/.3)!important}@media (hover:hover){.lw-harbor-ui .dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:oklab(96.5% 0 0/.5)!important}.lw-harbor-ui .dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:oklab(90% 0 0/.5)!important}}.lw-harbor-ui .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible, +.lw-harbor-ui .text-2xl{font-size:var(--text-2xl)!important;line-height:var(--lw-harbor-tw-leading,var(--text-2xl--line-height))!important}.lw-harbor-ui .text-base{font-size:var(--text-base)!important;line-height:var(--lw-harbor-tw-leading,var(--text-base--line-height))!important}.lw-harbor-ui .text-lg{font-size:var(--text-lg)!important;line-height:var(--lw-harbor-tw-leading,var(--text-lg--line-height))!important}.lw-harbor-ui .text-sm{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .text-xs{font-size:var(--text-xs)!important;line-height:var(--lw-harbor-tw-leading,var(--text-xs--line-height))!important}.lw-harbor-ui .text-\[10px\]{font-size:10px!important}.lw-harbor-ui .text-\[11px\]{font-size:11px!important}.lw-harbor-ui .text-\[13px\]{font-size:13px!important}.lw-harbor-ui .leading-6{--lw-harbor-tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)!important}.lw-harbor-ui .leading-8{--lw-harbor-tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8)!important}.lw-harbor-ui .leading-none{--lw-harbor-tw-leading:1;line-height:1!important}.lw-harbor-ui .leading-relaxed{--lw-harbor-tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)!important}.lw-harbor-ui .\!font-normal{--lw-harbor-tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)!important}.lw-harbor-ui .font-bold{--lw-harbor-tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)!important}.lw-harbor-ui .font-medium{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .font-semibold{--lw-harbor-tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)!important}.lw-harbor-ui .tracking-\[-0\.08px\]{--lw-harbor-tw-tracking:-.08px;letter-spacing:-.08px!important}.lw-harbor-ui .tracking-wide{--lw-harbor-tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)!important}.lw-harbor-ui .tracking-wider{--lw-harbor-tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)!important}.lw-harbor-ui .whitespace-nowrap{white-space:nowrap!important}.lw-harbor-ui .text-amber-600{color:var(--color-amber-600)!important}.lw-harbor-ui .text-amber-800{color:var(--color-amber-800)!important}.lw-harbor-ui .text-blue-800{color:var(--color-blue-800)!important}.lw-harbor-ui .text-blue-900{color:var(--color-blue-900)!important}.lw-harbor-ui .text-card-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-destructive{color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .text-emerald-800{color:var(--color-emerald-800)!important}.lw-harbor-ui .text-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-gray-500{color:var(--color-gray-500)!important}.lw-harbor-ui .text-green-600{color:var(--color-green-600)!important}.lw-harbor-ui .text-green-800{color:var(--color-green-800)!important}.lw-harbor-ui .text-muted-foreground{color:oklch(45% 0 0)!important}.lw-harbor-ui .text-neutral-950{color:var(--color-neutral-950)!important}.lw-harbor-ui .text-popover-foreground{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .text-primary{color:oklch(20.5% .08 265)!important}.lw-harbor-ui .text-primary-foreground{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .text-red-800{color:var(--color-red-800)!important}.lw-harbor-ui .text-secondary-foreground{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .text-white{color:var(--color-white)!important}.lw-harbor-ui .text-white\/70{color:#ffffffb3!important}@supports (color:color-mix(in lab, red, red)){.lw-harbor-ui .text-white\/70{color:color-mix(in oklab, var(--color-white) 70%, transparent)!important}}.lw-harbor-ui .lowercase{text-transform:lowercase!important}.lw-harbor-ui .uppercase{text-transform:uppercase!important}.lw-harbor-ui .line-through{text-decoration-line:line-through!important}.lw-harbor-ui .underline{text-decoration-line:underline!important}.lw-harbor-ui .underline-offset-2{text-underline-offset:2px!important}.lw-harbor-ui .underline-offset-4{text-underline-offset:4px!important}.lw-harbor-ui .opacity-50{opacity:.5!important}.lw-harbor-ui .opacity-60{opacity:.6!important}.lw-harbor-ui .opacity-75{opacity:.75!important}.lw-harbor-ui .shadow-lg{--lw-harbor-tw-shadow:0 10px 15px -3px var(--lw-harbor-tw-shadow-color,#0000001a), 0 4px 6px -4px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-md{--lw-harbor-tw-shadow:0 4px 6px -1px var(--lw-harbor-tw-shadow-color,#0000001a), 0 2px 4px -2px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-sm{--lw-harbor-tw-shadow:0 1px 3px 0 var(--lw-harbor-tw-shadow-color,#0000001a), 0 1px 2px -1px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xl{--lw-harbor-tw-shadow:0 20px 25px -5px var(--lw-harbor-tw-shadow-color,#0000001a), 0 8px 10px -6px var(--lw-harbor-tw-shadow-color,#0000001a);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .shadow-xs{--lw-harbor-tw-shadow:0 1px 2px 0 var(--lw-harbor-tw-shadow-color,#0000000d);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .ring-0{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(0px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .outline{outline-style:var(--lw-harbor-tw-outline-style)!important;outline-width:1px!important}.lw-harbor-ui .filter{filter:var(--lw-harbor-tw-blur,) var(--lw-harbor-tw-brightness,) var(--lw-harbor-tw-contrast,) var(--lw-harbor-tw-grayscale,) var(--lw-harbor-tw-hue-rotate,) var(--lw-harbor-tw-invert,) var(--lw-harbor-tw-saturate,) var(--lw-harbor-tw-sepia,) var(--lw-harbor-tw-drop-shadow,)!important}.lw-harbor-ui .transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[border-radius\]{transition-property:border-radius!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-\[color\,box-shadow\]{transition-property:color,box-shadow!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-all{transition-property:all!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--lw-harbor-tw-gradient-from,--lw-harbor-tw-gradient-via,--lw-harbor-tw-gradient-to!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-opacity{transition-property:opacity!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .transition-transform{transition-property:transform,translate,scale,rotate!important;transition-timing-function:var(--lw-harbor-tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--lw-harbor-tw-duration,var(--default-transition-duration))!important}.lw-harbor-ui .duration-150{--lw-harbor-tw-duration:.15s;transition-duration:.15s!important}.lw-harbor-ui .outline-none{--lw-harbor-tw-outline-style:none;outline-style:none!important}.lw-harbor-ui .select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.lw-harbor-ui .select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none!important}.lw-harbor-ui .group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5!important}.lw-harbor-ui .group-data-\[size\=default\]\/switch\:size-4:is(:where(.group\/switch)[data-size=default] *){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .group-data-\[size\=sm\]\/switch\:size-3:is(:where(.group\/switch)[data-size=sm] *){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed!important}.lw-harbor-ui .peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5!important}.lw-harbor-ui .selection\:bg-primary ::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary ::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::-moz-selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:bg-primary::selection{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .selection\:text-primary-foreground ::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground ::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::-moz-selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .selection\:text-primary-foreground::selection{color:oklch(98.5% 0 0)!important}.lw-harbor-ui .file\:inline-flex::file-selector-button{display:inline-flex!important}.lw-harbor-ui .file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)!important}.lw-harbor-ui .file\:border-0::file-selector-button{border-style:var(--lw-harbor-tw-border-style)!important;border-width:0!important}.lw-harbor-ui .file\:bg-transparent::file-selector-button{background-color:#0000!important}.lw-harbor-ui .file\:text-sm::file-selector-button{font-size:var(--text-sm)!important;line-height:var(--lw-harbor-tw-leading,var(--text-sm--line-height))!important}.lw-harbor-ui .file\:font-medium::file-selector-button{--lw-harbor-tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)!important}.lw-harbor-ui .file\:text-foreground::file-selector-button{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::-moz-placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .placeholder\:text-muted-foreground::placeholder{color:oklch(45% 0 0)!important}.lw-harbor-ui .last\:border-b-0:last-child{border-bottom-style:var(--lw-harbor-tw-border-style)!important;border-bottom-width:0!important}@media (hover:hover){.lw-harbor-ui .hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .hover\:bg-amber-100:hover{background-color:var(--color-amber-100)!important}.lw-harbor-ui .hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui .hover\:bg-muted\/50:hover{background-color:oklab(95.5% 0 0/.5)!important}.lw-harbor-ui .hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui .hover\:bg-secondary\/80:hover{background-color:oklab(96.5% 0 0/.8)!important}.lw-harbor-ui .hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .hover\:text-foreground:hover{color:oklch(14.5% 0 0)!important}.lw-harbor-ui .hover\:no-underline:hover{text-decoration-line:none!important}.lw-harbor-ui .hover\:underline:hover{text-decoration-line:underline!important}.lw-harbor-ui .hover\:opacity-75:hover{opacity:.75!important}.lw-harbor-ui .hover\:opacity-80:hover{opacity:.8!important}.lw-harbor-ui .hover\:opacity-100:hover{opacity:1!important}}.lw-harbor-ui .focus\:bg-accent:focus{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui .focus\:text-accent-foreground:focus{color:oklch(20.5% 0 0)!important}.lw-harbor-ui .focus-visible\:border-ring:focus-visible{border-color:oklch(70.8% .165 254.624)!important}.lw-harbor-ui .focus-visible\:ring-\[3px\]:focus-visible{--lw-harbor-tw-ring-shadow:var(--lw-harbor-tw-ring-inset,) 0 0 0 calc(3px + var(--lw-harbor-tw-ring-offset-width)) var(--lw-harbor-tw-ring-color,currentcolor);box-shadow:var(--lw-harbor-tw-inset-shadow), var(--lw-harbor-tw-inset-ring-shadow), var(--lw-harbor-tw-ring-offset-shadow), var(--lw-harbor-tw-ring-shadow), var(--lw-harbor-tw-shadow)!important}.lw-harbor-ui .focus-visible\:ring-destructive\/20:focus-visible{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .focus-visible\:ring-ring\/50:focus-visible{--lw-harbor-tw-ring-color:oklab(70.8% -.0437502 -.159094/.5)}.lw-harbor-ui .disabled\:pointer-events-none:disabled{pointer-events:none!important}.lw-harbor-ui .disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.lw-harbor-ui .disabled\:opacity-50:disabled{opacity:.5!important}.lw-harbor-ui .has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto!important}.lw-harbor-ui .has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)!important}.lw-harbor-ui .has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)!important}.lw-harbor-ui .has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)!important}.lw-harbor-ui .aria-invalid\:border-destructive[aria-invalid=true]{border-color:oklch(57.7% .245 27.325)!important}.lw-harbor-ui .aria-invalid\:ring-destructive\/20[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.2)}.lw-harbor-ui .data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none!important}.lw-harbor-ui .data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5!important}.lw-harbor-ui .data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--lw-harbor-tw-translate-y:calc(var(--spacing) * 1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[side\=top\]\:-translate-y-1[data-side=top]{--lw-harbor-tw-translate-y:calc(var(--spacing) * -1);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[size\=default\]\:h-\[1\.15rem\][data-size=default]{height:1.15rem!important}.lw-harbor-ui .data-\[size\=default\]\:w-8[data-size=default]{width:calc(var(--spacing) * 8)!important}.lw-harbor-ui .data-\[size\=sm\]\:h-3\.5[data-size=sm]{height:calc(var(--spacing) * 3.5)!important}.lw-harbor-ui .data-\[size\=sm\]\:w-6[data-size=sm]{width:calc(var(--spacing) * 6)!important}.lw-harbor-ui .data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--lw-harbor-tw-translate-x:calc(100% - 2px);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--lw-harbor-tw-translate-x:calc(var(--spacing) * 0);translate:var(--lw-harbor-tw-translate-x) var(--lw-harbor-tw-translate-y)!important}.lw-harbor-ui .data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:border-input:is(.dark *){border-color:oklch(90% 0 0)!important}.lw-harbor-ui .dark\:bg-destructive\/60:is(.dark *){background-color:oklab(57.7% .217662 .112464/.6)!important}.lw-harbor-ui .dark\:bg-input\/30:is(.dark *){background-color:oklab(90% 0 0/.3)!important}@media (hover:hover){.lw-harbor-ui .dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:oklab(96.5% 0 0/.5)!important}.lw-harbor-ui .dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:oklab(90% 0 0/.5)!important}}.lw-harbor-ui .dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible, .lw-harbor-ui .dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--lw-harbor-tw-ring-color:oklab(57.7% .217662 .112464/.4)}.lw-harbor-ui .dark\:data-\[state\=checked\]\:bg-primary-foreground:is(.dark *)[data-state=checked]{background-color:oklch(98.5% 0 0)!important}.lw-harbor-ui .dark\:data-\[state\=unchecked\]\:bg-foreground:is(.dark *)[data-state=unchecked]{background-color:oklch(14.5% 0 0)!important}.lw-harbor-ui .dark\:data-\[state\=unchecked\]\:bg-input\/80:is(.dark *)[data-state=unchecked]{background-color:oklab(90% 0 0/.8)!important}.lw-harbor-ui .\[\&_svg\]\:pointer-events-none svg{pointer-events:none!important}.lw-harbor-ui .\[\&_svg\]\:shrink-0 svg{flex-shrink:0!important}.lw-harbor-ui .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.lw-harbor-ui .\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4)!important;height:calc(var(--spacing) * 4)!important}.lw-harbor-ui .\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)!important}.lw-harbor-ui .\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)!important}.lw-harbor-ui .\[\&\>div\]\:bg-primary>div{background-color:oklch(20.5% .08 265)!important}.lw-harbor-ui .\[\&\>span\]\:line-clamp-1>span{-webkit-line-clamp:1!important;-webkit-box-orient:vertical!important;display:-webkit-box!important;overflow:hidden!important}.lw-harbor-ui .\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none!important}.lw-harbor-ui .\[\&\>svg\]\:size-3>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}@media (hover:hover){.lw-harbor-ui a.\[a\&\]\:hover\:bg-accent:hover{background-color:oklch(96.5% 0 0)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-destructive\/90:hover{background-color:oklab(57.7% .217662 .112464/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-primary\/90:hover{background-color:oklab(20.5% -.00697246 -.0796956/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:bg-secondary\/90:hover{background-color:oklab(96.5% 0 0/.9)!important}.lw-harbor-ui a.\[a\&\]\:hover\:text-accent-foreground:hover{color:oklch(20.5% 0 0)!important}.lw-harbor-ui a.\[a\&\]\:hover\:underline:hover{text-decoration-line:underline!important}}}.lw-harbor-ui{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(20.5% 0 0);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(95.5% 0 0);--muted-foreground:oklch(45% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(90% 0 0);--input:oklch(90% 0 0);--ring:oklch(70.8% 0 0);--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0)}.lw-harbor-ui .dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(92.2% 0 0);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(55.6% 0 0);--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(48.8% .243 264.376);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}.lw-harbor-ui{background-color:var(--color-background);color:var(--color-foreground);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;line-height:1.5}.lw-harbor-ui *{border-color:var(--color-border)}#wpcontent:has(.lw-harbor-ui){padding-left:0}#wpcontent:has(.lw-harbor-ui) #wpbody-content{padding-bottom:0}#wpcontent:has(.lw-harbor-ui)+#wpfooter{display:none}.wrap:has(>.lw-harbor-ui){margin:0;padding:0}@property --lw-harbor-tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-rotate-x{syntax:"*";inherits:false}@property --lw-harbor-tw-rotate-y{syntax:"*";inherits:false}@property --lw-harbor-tw-rotate-z{syntax:"*";inherits:false}@property --lw-harbor-tw-skew-x{syntax:"*";inherits:false}@property --lw-harbor-tw-skew-y{syntax:"*";inherits:false}@property --lw-harbor-tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --lw-harbor-tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --lw-harbor-tw-gradient-position{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --lw-harbor-tw-gradient-stops{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-via-stops{syntax:"*";inherits:false}@property --lw-harbor-tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --lw-harbor-tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --lw-harbor-tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-leading{syntax:"*";inherits:false}@property --lw-harbor-tw-font-weight{syntax:"*";inherits:false}@property --lw-harbor-tw-tracking{syntax:"*";inherits:false}@property --lw-harbor-tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-inset-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-ring-color{syntax:"*";inherits:false}@property --lw-harbor-tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-inset-ring-color{syntax:"*";inherits:false}@property --lw-harbor-tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-ring-inset{syntax:"*";inherits:false}@property --lw-harbor-tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --lw-harbor-tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --lw-harbor-tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --lw-harbor-tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --lw-harbor-tw-blur{syntax:"*";inherits:false}@property --lw-harbor-tw-brightness{syntax:"*";inherits:false}@property --lw-harbor-tw-contrast{syntax:"*";inherits:false}@property --lw-harbor-tw-grayscale{syntax:"*";inherits:false}@property --lw-harbor-tw-hue-rotate{syntax:"*";inherits:false}@property --lw-harbor-tw-invert{syntax:"*";inherits:false}@property --lw-harbor-tw-opacity{syntax:"*";inherits:false}@property --lw-harbor-tw-saturate{syntax:"*";inherits:false}@property --lw-harbor-tw-sepia{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow-color{syntax:"*";inherits:false}@property --lw-harbor-tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --lw-harbor-tw-drop-shadow-size{syntax:"*";inherits:false}@property --lw-harbor-tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} From 8cacfe2f8830954ac1e65bdcb69f3bc6439aba17 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Tue, 19 May 2026 09:33:35 -0400 Subject: [PATCH 19/24] fix(legacy): guard License_Repository against filter re-entry recursion Solid Backups' lw-harbor/legacy_licenses callback consults lw_harbor_is_feature_available, which since 5dd88c0b routes through feature resolution back into License_Repository::all() before the outer apply_filters dispatch has completed. WordPress does not detect a hook re-dispatching itself, so WP_Hook re-fires every registered callback at a new nesting level until the PHP call stack is exhausted. Add a per-instance applying_filter flag wrapped around the apply_filters call so re-entrant calls during dispatch return an empty array and break the cycle. Re-entrant callers are answered from Unified data alone, which is the only consistent source while dispatch is in progress. --- src/Harbor/Legacy/License_Repository.php | 47 +++++++- .../wpunit/Legacy/License_RepositoryTest.php | 102 ++++++++++++++++++ 2 files changed, 144 insertions(+), 5 deletions(-) diff --git a/src/Harbor/Legacy/License_Repository.php b/src/Harbor/Legacy/License_Repository.php index 90564496..85188da4 100644 --- a/src/Harbor/Legacy/License_Repository.php +++ b/src/Harbor/Legacy/License_Repository.php @@ -17,6 +17,19 @@ class License_Repository { */ private ?array $cache = null; + /** + * Whether `apply_filters( 'lw-harbor/legacy_licenses' )` is currently dispatching. + * + * Used by `all()` to detect re-entry and short-circuit before `apply_filters` + * is called a second time on the same hook within the same call stack. + * WordPress does not prevent that on its own: `WP_Hook` would re-fire every + * registered callback at a new nesting level until the PHP call stack is + * exhausted. + * + * @var bool + */ + private bool $applying_filter = false; + /** * Get all legacy licenses reported across all Harbor instances. * @@ -29,7 +42,31 @@ public function all(): array { return $this->cache; } - $filtered_licenses = (array) apply_filters( 'lw-harbor/legacy_licenses', [] ); + /* + * Break recursion on `apply_filters( 'lw-harbor/legacy_licenses' )`. + * + * WordPress does not guard against a hook re-dispatching itself: if a + * registered callback (directly or through any function it calls) ends + * up triggering the same hook again, `WP_Hook::apply_filters()` happily + * re-fires every callback at a new nesting level, blowing the PHP call + * stack. + * + * Returning an empty array on re-entry short-circuits that recursion at + * the source. Re-entrant callers are forced to answer from Unified + * data alone, which is the only consistent source while dispatch is in + * progress. + */ + if ( $this->applying_filter ) { + return []; + } + + $this->applying_filter = true; + + try { + $filtered_licenses = (array) apply_filters( 'lw-harbor/legacy_licenses', [] ); + } finally { + $this->applying_filter = false; + } $licenses = []; @@ -70,8 +107,8 @@ public function all_active(): array { $this->all(), static function ( Legacy_License $l ): bool { return $l->is_active; - } - ) + } + ) ); } @@ -88,8 +125,8 @@ public function all_inactive(): array { $this->all(), static function ( Legacy_License $l ): bool { return ! $l->is_active; - } - ) + } + ) ); } diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index f8d74ca3..222aa31b 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -443,4 +443,106 @@ static function ( array $licenses ) { $this->assertTrue( $this->repository->any_used_for_updates() ); } + + /** + * Tests that a filter callback which re-enters the repository (e.g. via feature + * resolution) does not trigger another filter dispatch, gets an empty array + * during the in-flight dispatch, and that the outer call still produces the + * real filtered result. + * + * Regression coverage for the Solid Backups updater chain: + * `apply_filters( 'lw-harbor/legacy_licenses' )` -> `is_product_managed()` -> + * `lw_harbor_is_feature_available()` -> feature resolution -> `all()` -> + * `apply_filters( 'lw-harbor/legacy_licenses' )` -> ... + * + * The callback caps its own re-entry depth at 3 so that a missing guard fails + * the assertion cleanly with a small count rather than blowing the PHP call + * stack and segfaulting the test runner. + * + * @return void + */ + public function test_filter_callback_that_calls_all_does_not_redispatch_filter(): void { + $repository = $this->repository; + $reentrant_result = null; + $dispatch_count = 0; + $bailout_depth = 3; + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( $repository, &$reentrant_result, &$dispatch_count, $bailout_depth ) { + ++$dispatch_count; + + // Stop calling back into the repository once we've proved the dispatch + // re-fires. Without this cap a missing guard would recurse until the + // PHP stack blows up and the test process segfaults. + if ( $dispatch_count < $bailout_depth ) { + $reentrant_result = $repository->all(); + } + + return array_merge( + $licenses, + [ + [ + 'key' => 'outer-key', + 'slug' => 'outer-plugin', + 'name' => 'Outer', + 'product' => 'B', + ], + ] + ); + } + ); + + $result = $this->repository->all(); + + $this->assertSame( + 1, + $dispatch_count, + 'Filter must dispatch exactly once even when its callback re-enters all() mid-dispatch. ' + . 'A count > 1 means the recursion guard is missing; the filter re-fired its own callbacks.' + ); + $this->assertSame( [], $reentrant_result, 'The re-entrant all() call must return an empty array to break the recursion chain.' ); + $this->assertCount( 1, $result, 'Outer call must still return the real filtered result after re-entry.' ); + $this->assertSame( 'outer-plugin', $result[0]->slug ); + } + + /** + * Tests that the re-entry guard is cleared after filter dispatch completes, + * so a subsequent fresh call on a new repository instance still applies the filter. + * + * @return void + */ + public function test_recursion_guard_clears_after_dispatch(): void { + $call_count = 0; + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( &$call_count ) { + ++$call_count; + + return array_merge( + $licenses, + [ + [ + 'key' => 'k1', + 'slug' => 's1', + 'name' => 'N', + 'product' => 'B', + ], + ] + ); + } + ); + + // First instance dispatches; cache then short-circuits subsequent calls. + $this->repository->all(); + $this->repository->all(); + + // A fresh instance must be able to dispatch again; the guard is per-instance. + $fresh = new License_Repository(); + $result = $fresh->all(); + + $this->assertSame( 2, $call_count, 'Filter must dispatch once per repository instance, not be stuck in the guarded state.' ); + $this->assertCount( 1, $result ); + } } From 015d9306b84454b9d0eb86c83ca137c8b2fa6943 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Tue, 19 May 2026 09:38:29 -0400 Subject: [PATCH 20/24] refactor(features): resolve legacy licenses once per feature collection Previously hydrate_feature() called legacy_repository->find() once per catalog feature, which dispatched the lw-harbor/legacy_licenses filter on every iteration. Beyond the wasted work that hurt scaling with catalog size, it widened the surface for re-entrant filter callbacks: any callback consulting Harbor itself (e.g. Solid Backups via lw_harbor_is_feature_available) compounded that cost per feature. Hoist the lookup to __invoke(), build a slug => Legacy_License map once, and pass each feature's match (or null) into hydrate_feature(). Filter dispatches drop from O(features) to O(1) per resolution, and any re-entry guard in License_Repository now only has to cover a single dispatch window. Existing reflection-based hydrate_feature() tests in Feature_RepositoryTest pass the new fifth argument as null since they exercise paths that don't touch the legacy grant. --- .../Features/Resolve_Feature_Collection.php | 42 ++++++++++++++---- .../Features/Feature_RepositoryTest.php | 6 +-- .../Resolve_Feature_CollectionTest.php | 43 +++++++++++++++++++ 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/Harbor/Features/Resolve_Feature_Collection.php b/src/Harbor/Features/Resolve_Feature_Collection.php index ca8a6a19..3eebdecd 100644 --- a/src/Harbor/Features/Resolve_Feature_Collection.php +++ b/src/Harbor/Features/Resolve_Feature_Collection.php @@ -10,6 +10,7 @@ use LiquidWeb\Harbor\Features\Types\Plugin; use LiquidWeb\Harbor\Features\Types\Service; use LiquidWeb\Harbor\Features\Types\Theme; +use LiquidWeb\Harbor\Legacy\Legacy_License; use LiquidWeb\Harbor\Legacy\License_Repository as Legacy_License_Repository; use LiquidWeb\Harbor\Licensing\Enums\Validation_Status; use LiquidWeb\Harbor\Licensing\Error_Code as Licensing_Error_Code; @@ -158,7 +159,8 @@ public function __invoke() { } } - $collection = new Feature_Collection(); + $collection = new Feature_Collection(); + $legacy_licenses = $this->build_legacy_license_map(); foreach ( $catalog as $product ) { if ( ! $product instanceof Product_Catalog ) { @@ -169,7 +171,8 @@ public function __invoke() { $license_tier_rank = $this->resolve_license_tier_rank( $product, $products ); foreach ( $product->get_features() as $catalog_feature ) { - $feature = $this->hydrate_feature( $catalog_feature, $product, $capabilities, $license_tier_rank ); + $legacy_license = $legacy_licenses[ $catalog_feature->get_slug() ] ?? null; + $feature = $this->hydrate_feature( $catalog_feature, $product, $capabilities, $license_tier_rank, $legacy_license ); if ( is_wp_error( $feature ) ) { static::debug_log( $feature->get_error_message() ); @@ -183,6 +186,28 @@ public function __invoke() { return $collection; } + /** + * Builds a `slug => Legacy_License` map from the legacy repository. + * + * Resolved once per `__invoke()` call so the `lw-harbor/legacy_licenses` + * filter dispatches once per resolution rather than once per catalog + * feature. This also narrows the surface for filter re-entry: only one + * dispatch can be in-flight while hydrate_feature() iterates. + * + * @since TBD + * + * @return array + */ + private function build_legacy_license_map(): array { + $map = []; + + foreach ( $this->legacy_repository->all() as $license ) { + $map[ $license->slug ] = $license; + } + + return $map; + } + /** * Resolves the capabilities granted by the license for a given product. * @@ -271,10 +296,11 @@ private function is_license_invalid( ?string $validation_status ): bool { * * @since 1.0.0 * - * @param Catalog_Feature $catalog_feature The catalog feature entry. - * @param Product_Catalog $product The parent catalog product. - * @param string[]|null $capabilities The license capabilities, or null if unlicensed. - * @param int $license_tier_rank The user's licensed tier rank, or -1 if unlicensed. + * @param Catalog_Feature $catalog_feature The catalog feature entry. + * @param Product_Catalog $product The parent catalog product. + * @param string[]|null $capabilities The license capabilities, or null if unlicensed. + * @param int $license_tier_rank The user's licensed tier rank, or -1 if unlicensed. + * @param Legacy_License|null $legacy_license The legacy license entry whose slug matches this feature, or null if none. * * @return Feature|WP_Error The hydrated feature, or WP_Error for unknown types. */ @@ -282,7 +308,8 @@ private function hydrate_feature( Catalog_Feature $catalog_feature, Product_Catalog $product, ?array $capabilities, - int $license_tier_rank + int $license_tier_rank, + ?Legacy_License $legacy_license ) { $catalog_kind = $catalog_feature->get_kind(); $class = $this->type_map[ $catalog_kind ] ?? null; @@ -301,7 +328,6 @@ private function hydrate_feature( $minimum_tier = $product->get_tier_by_slug( $catalog_feature->get_minimum_tier() ); $minimum_rank = $minimum_tier !== null ? $minimum_tier->get_rank() : PHP_INT_MAX; - $legacy_license = $this->legacy_repository->find( $catalog_feature->get_slug() ); $has_legacy_grant = $legacy_license !== null && $legacy_license->is_active && $legacy_license->key !== '' diff --git a/tests/wpunit/Features/Feature_RepositoryTest.php b/tests/wpunit/Features/Feature_RepositoryTest.php index 41d91475..c93ce130 100644 --- a/tests/wpunit/Features/Feature_RepositoryTest.php +++ b/tests/wpunit/Features/Feature_RepositoryTest.php @@ -342,7 +342,7 @@ public function test_hydrate_feature_returns_wp_error_for_unknown_type(): void { $method = new ReflectionMethod( Resolve_Feature_Collection::class, 'hydrate_feature' ); $method->setAccessible( true ); // Required for PHP < 8.1. - $result = $method->invoke( $resolver, $catalog_feature, $product, null, -1 ); + $result = $method->invoke( $resolver, $catalog_feature, $product, null, -1, null ); $this->assertInstanceOf( WP_Error::class, $result ); $this->assertSame( Error_Code::UNKNOWN_FEATURE_TYPE, $result->get_error_code() ); @@ -388,7 +388,7 @@ public function test_hydrate_feature_returns_feature_for_known_type(): void { $method = new ReflectionMethod( Resolve_Feature_Collection::class, 'hydrate_feature' ); $method->setAccessible( true ); // Required for PHP < 8.1. - $result = $method->invoke( $resolver, $catalog_feature, $product, [ 'test-plugin' ], 1 ); + $result = $method->invoke( $resolver, $catalog_feature, $product, [ 'test-plugin' ], 1, null ); $this->assertInstanceOf( Plugin::class, $result ); $this->assertSame( 'test-plugin', $result->get_slug() ); @@ -445,7 +445,7 @@ public function test_free_tier_feature_available_for_licensed_user_regardless_of // Omit the free feature from capabilities, simulating a Commerce Portal that only // lists paid features. The resolver must still mark it available and in tier. - $result = $method->invoke( $resolver, $catalog_feature, $product, [ 'some-paid-feature' ], 1 ); + $result = $method->invoke( $resolver, $catalog_feature, $product, [ 'some-paid-feature' ], 1, null ); $this->assertInstanceOf( Plugin::class, $result ); $this->assertTrue( $result->is_available(), 'Free-tier feature must be available regardless of capabilities.' ); diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php index f1f652ec..bae5cd51 100644 --- a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -414,4 +414,47 @@ public function test_resolver_without_legacy_repo_argument_uses_filter_backed_de $this->assert_resolved_feature_flags( $resolver, 'kad-blocks-pro', true, true ); } + + /** + * Tests that resolving a catalog with multiple features dispatches the + * `lw-harbor/legacy_licenses` filter exactly once. + * + * Before the legacy lookup was hoisted out of hydrate_feature(), the filter + * fired once per catalog feature. That meant every consumer hooked to the + * filter ran N times on every resolution, and any callback that consults + * Harbor itself (e.g. Solid Backups via lw_harbor_is_feature_available) + * compounded that cost N-fold. Hoisting the lookup to once per __invoke() + * is what this test pins down. + * + * @return void + */ + public function test_legacy_filter_dispatches_once_per_resolution_not_per_feature(): void { + $dispatch_count = 0; + + add_filter( + 'lw-harbor/legacy_licenses', + static function ( array $licenses ) use ( &$dispatch_count ) { + ++$dispatch_count; + + return $licenses; + } + ); + + $resolver = $this->make_resolver( $this->make_catalog(), new Product_Collection() ); + + $collection = ( $resolver )(); + + $this->assertInstanceOf( Feature_Collection::class, $collection ); + $this->assertGreaterThan( + 1, + $collection->count(), + 'Sanity: the fixture catalog must contain more than one feature for this test to be meaningful.' + ); + $this->assertSame( + 1, + $dispatch_count, + 'The lw-harbor/legacy_licenses filter must fire exactly once per resolution, ' + . 'not once per catalog feature.' + ); + } } From d11e388f9ab359b86d74b2c3113356cebfb642bb Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Tue, 19 May 2026 09:45:10 -0400 Subject: [PATCH 21/24] docs(tests): reframe legacy-filter dispatch test as design intent The previous docblock framed the test as a regression guard against a prior behavior ("Before the legacy lookup was hoisted out of hydrate_feature()..."), but the per-feature lookup it described was only ever present in-progress on this feature branch and never shipped. Rephrase as forward-looking design intent: the resolver must dispatch the filter once per __invoke() and any naive per-feature implementation is what this test prevents. --- .../Features/Resolve_Feature_CollectionTest.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php index bae5cd51..6980e05d 100644 --- a/tests/wpunit/Features/Resolve_Feature_CollectionTest.php +++ b/tests/wpunit/Features/Resolve_Feature_CollectionTest.php @@ -419,12 +419,13 @@ public function test_resolver_without_legacy_repo_argument_uses_filter_backed_de * Tests that resolving a catalog with multiple features dispatches the * `lw-harbor/legacy_licenses` filter exactly once. * - * Before the legacy lookup was hoisted out of hydrate_feature(), the filter - * fired once per catalog feature. That meant every consumer hooked to the - * filter ran N times on every resolution, and any callback that consults - * Harbor itself (e.g. Solid Backups via lw_harbor_is_feature_available) - * compounded that cost N-fold. Hoisting the lookup to once per __invoke() - * is what this test pins down. + * The resolver must look up legacy licenses once per `__invoke()` call and + * reuse that result across every catalog feature it hydrates. if it calls + * into the legacy repository per feature would dispatch the filter once per + * feature instead, which (a) multiplies the work of every consumer hooked + * to the filter by the catalog size, and (b) widens the re-entry surface + * for callbacks that consult Harbor themselves + * (e.g. Solid Backups via `lw_harbor_is_feature_available`). * * @return void */ From ae5f2a2daac5a3f6a93acd2b530dedc32b3cb428 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Tue, 19 May 2026 09:47:46 -0400 Subject: [PATCH 22/24] cspell fix --- tests/wpunit/Legacy/License_RepositoryTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/wpunit/Legacy/License_RepositoryTest.php b/tests/wpunit/Legacy/License_RepositoryTest.php index 222aa31b..45fc7bcc 100644 --- a/tests/wpunit/Legacy/License_RepositoryTest.php +++ b/tests/wpunit/Legacy/License_RepositoryTest.php @@ -457,11 +457,11 @@ static function ( array $licenses ) { * * The callback caps its own re-entry depth at 3 so that a missing guard fails * the assertion cleanly with a small count rather than blowing the PHP call - * stack and segfaulting the test runner. + * stack and causing a segmentation fault and crashing the test runner. * * @return void */ - public function test_filter_callback_that_calls_all_does_not_redispatch_filter(): void { + public function test_filter_callback_that_calls_all_does_not_dispatch_filter_again(): void { $repository = $this->repository; $reentrant_result = null; $dispatch_count = 0; From 561a0fdd82d9c7a8867966459f5044f6d7bfe9f8 Mon Sep 17 00:00:00 2001 From: Eric Defore Date: Tue, 19 May 2026 11:30:10 -0400 Subject: [PATCH 23/24] Improve tooltip message for available but not installable updates They _do_ get updates and support with a Legacy License --- resources/js/components/molecules/FeatureRow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/js/components/molecules/FeatureRow.tsx b/resources/js/components/molecules/FeatureRow.tsx index d74ee9f7..b79ab534 100644 --- a/resources/js/components/molecules/FeatureRow.tsx +++ b/resources/js/components/molecules/FeatureRow.tsx @@ -88,7 +88,7 @@ export function FeatureRow( { feature, upgradeTierName }: FeatureRowProps ) { pendingAction={ pendingAction } installableBusy={ installableBusy } upgradeLabel={ licenseBadgeType === 'legacy' - ? __( 'Upgrade your license to receive updates and support.', '%TEXTDOMAIN%' ) + ? __( 'Upgrade your license to manage updates from the Software License Manager.', '%TEXTDOMAIN%' ) : undefined } onUpdate={ licenseBadgeType === 'legacy' || licenseBadgeType === 'revoked' ? undefined : handleUpdate } From ae6161b54397b39d8347726e44b4cdac24f4dd0d Mon Sep 17 00:00:00 2001 From: d4mation <7770631+d4mation@users.noreply.github.com> Date: Tue, 19 May 2026 15:31:14 +0000 Subject: [PATCH 24/24] Build frontend assets --- build-dev/index.asset.php | 2 +- build-dev/index.js | 2 +- build-dev/index.js.map | 2 +- build/index.asset.php | 2 +- build/index.js | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build-dev/index.asset.php b/build-dev/index.asset.php index 7196a288..f73d4c28 100644 --- a/build-dev/index.asset.php +++ b/build-dev/index.asset.php @@ -1 +1 @@ - array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '33c1bc733d782aa2a48c'); + array('react', 'react-dom', 'react-jsx-runtime', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '485019c0ccf8491204de'); diff --git a/build-dev/index.js b/build-dev/index.js index f7d5a682..1983eae1 100644 --- a/build-dev/index.js +++ b/build-dev/index.js @@ -1396,7 +1396,7 @@ function FeatureRow({ feature: feature, pendingAction: pendingAction, installableBusy: installableBusy, - upgradeLabel: licenseBadgeType === 'legacy' ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Upgrade your license to receive updates and support.', '%TEXTDOMAIN%') : undefined, + upgradeLabel: licenseBadgeType === 'legacy' ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_1__.__)('Upgrade your license to manage updates from the Software License Manager.', '%TEXTDOMAIN%') : undefined, onUpdate: licenseBadgeType === 'legacy' || licenseBadgeType === 'revoked' ? undefined : handleUpdate }), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__.jsx)(_components_atoms_StatusBadge__WEBPACK_IMPORTED_MODULE_7__.StatusBadge, { status: badgeStatus diff --git a/build-dev/index.js.map b/build-dev/index.js.map index 32726cf3..3a5d6136 100644 --- a/build-dev/index.js.map +++ b/build-dev/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","mappings":"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,eAAe,gDAAmB;AACrC;AACA;AACA,GAAG;AACH;AAC4C;AAC5C,iEAAe,oBAAoB,g3HAAg3H,E;;;;;;;;;;;;;;;;;AC/Cn5H;AACA,sBAAsB,wEAAwE,gBAAgB,sBAAsB,OAAO,sBAAsB,oBAAoB,gDAAgD,WAAW;AACjN;AAC/B;AACA,sBAAsB,gDAAmB;AACzC;AACA;AACA;AACA;AACA,GAAG,yCAAyC,gDAAmB;AAC/D;AACA;AACA;AACA;AACA,GAAG;AACH;AAC4C;AAC5C,iEAAe,oBAAoB,4oJAA4oJ,E;;;;;;;;;;;;;;;;;ACjB/qJ;AACA,sBAAsB,wEAAwE,gBAAgB,sBAAsB,OAAO,sBAAsB,oBAAoB,gDAAgD,WAAW;AACjN;AAC/B;AACA,sBAAsB,gDAAmB;AACzC;AACA;AACA;AACA;AACA;AACA,GAAG,yCAAyC,gDAAmB;AAC/D;AACA;AACA,GAAG,qCAAqC,gDAAmB;AAC3D;AACA;AACA;AACA;AACA,GAAG;AACH;AACwC;AACxC,iEAAe,oBAAoB,4jXAA4jX,E;;;;;;;;;;;;;;;;;ACrB/lX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+BAA+B,oBAAoB;AACnD;AACA;AACA;AACA,WAAW,qBAAqB;AAChC;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,YAAY,MAAM;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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AAChC,IAAI,4CAAe;AACnB;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA,0BAA0B,oDAAa;AACvC,4CAA4C,6DAA6D;AACzG;AACA;AACA,gDAAgD,gEAAgE;AAChH;AACA;AACA;AACA,KAAK;AACL,4BAA4B,8CAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,sEAAuB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,sEAAuB;AAClE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,2DAAY;AAC3B,KAAK;AACL,wBAAwB,8CAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,2EAA2E,iIAAiI;AAC5M;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,qCAAqC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,uBAAuB,8CAAiB;AACxC,sBAAsB;AACtB;AACA;AACA,0FAA0F,qBAAqB;AAC/G,SAAS;AACT,KAAK;AACL,2BAA2B,8CAAiB;AAC5C;AACA;AACA,KAAK;AACL,sBAAsB,8CAAiB;AACvC;AACA,KAAK;AACL,0BAA0B,8CAAiB;AAC3C;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,0DAA0D,yDAAU;AACpE,8DAA8D,yDAAU;AACxE,kEAAkE,yDAAU;AAC5E;AACA,2DAA2D,wBAAwB;AACnF,iEAAiE,yDAAU;AAC3E,qEAAqE,yDAAU;AAC/E,yEAAyE,yDAAU;AACnF;AACA,KAAK;AACL;AACA,YAAY,gDAAmB,CAAC,2CAAc;AAC9C,gBAAgB,gDAAmB,UAAU,2BAA2B;AACxE,0BAA0B,gDAAmB,CAAC,oEAAe,IAAI,sDAAsD;AACvH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;ACnKyC;AACV;AAC4D;AAC3C;AACX;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAAgB;AACnC,cAAc,yCAAY;AAC1B,aAAa,2CAAc;AAC3B;AACA;AACA;AACA,KAAK;AACL,waAAwa,6CAAM;AAC9a;AACA,uBAAuB,8DAAY;AACnC,yBAAyB,+CAAQ,CAAC,+CAAQ,GAAG;AAC7C,YAAY,gDAAmB,CAAC,2CAAc;AAC9C,oBAAoB,gDAAmB,YAAY,SAAS,8CAAS,kNAAkN;AACvR,wBAAwB,+CAAkB,CAAC,2CAAc,iBAAiB,+CAAQ,CAAC,+CAAQ,GAAG,qBAAqB,mBAAmB,OAAO,gDAAmB,YAAY,+CAAQ,GAAG,oBAAoB,yCAAyC;AACpP,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,iFAAkB;AACjC,eAAe,iFAAkB;AACjC;AACwB;;;;;;;;;;;;;;;ACnCxB;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,sCAAsC,iBAAiB;;;;;;;;;;;;;;;;AClB9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD;AAChD,gDAAgD;AACzC;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;AC3GkD;AAC3C,gBAAgB,gEAAmB;;;;;;;;;;;;;;;;;;ACDE;AACO;AACd;AACrC,iEAAe,0DAAa,CAAC,8CAAS,EAAE,4DAAmB,CAAC,EAAC;;;;;;;;;;;;;;;;ACHjB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACO;AACP,mBAAmB,yDAAkB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACf+B;AACmB;AAClD;AACA;AACA,SAAS,sBAAsB;AAC/B;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACO;AACP,gBAAgB,+DAAmB;AACnC;AACA,QAAQ,4CAAe;AACvB;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;;;;ACrB6C;AACK;AACN;;;;;;;;;;;;;;;;ACFP;AACrC;AACA;AACA;AACA;AACA;AACA,gBAAgB,mDAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;AC/CA;AACA;AACA,WAAW,WAAW;AACtB;AACA;AACA;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;ACrB+B;AACS;AACE;AAC1C,gEAAgE,kDAAqB,GAAG,4CAAe;AACvG;AACA;AACA;AACA,WAAW,eAAe;AAC1B,aAAa,kBAAkB,8CAA8C;AAC7E;AACA,SAAS,iBAAiB;AAC1B;AACA;AACA;AACA;AACA,iDAAiD;AACjD,sBAAsB,OAAO;AAC7B;AACA;AACO;AACP,sBAAsB,uDAAc;AACpC,6CAA6C,OAAO,qDAAS,kBAAkB;AAC/E,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA,aAAa;AACb;AACA;AACA,oBAAoB,qDAAS;AAC7B;AACA,aAAa;AACb;AACA;AACA,KAAK;AACL;AACA;;;;;;;;;;;;;;;;;AC5CiC;AACjC;AACA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACO;AACP,cAAc,+CAAQ,eAAe;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT,KAAK,IAAI;AACT;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;ACtCyC;AACV;AAC/B;AACA,qCAAqC,6CAAM;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,gDAAmB,SAAS,+CAAQ,GAAG;AAClD;AACA;AACO;AACP;AACA;AACA;;;;;;;;;;;;;;;;;ACjBiC;AACjC;AACA;AACA;AACA;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,sDAAsD,oBAAoB;AAC1E;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,eAAe;AACpD,sCAAsC,gBAAgB;AACtD;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC;AACtC;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;AACT;AACA;AACA;AACO;AACP,iCAAiC;AACjC;AACA;AACA;AACO;AACP,8BAA8B;AAC9B;AACA,qBAAqB,+CAAQ,GAAG,yBAAyB;AACzD;AACA;;;;;;;;;;;AC7EA,iC;;;;;;;;;;ACAA,oC;;;;;;;;;;ACAA,2C;;;;;;;;;;ACAA,0C;;;;;;;;;;ACAA,4C;;;;;;;;;;ACAA,sC;;;;;;;;;;ACAA,yC;;;;;;;;;;ACAA,sC;;;;;;;;;;;;;;;;;;;;;;;;;;ACAsU;AAChR;;AAEtD;AACA;AACA;AACA;AACA,IAAI;AACJ,mBAAmB,+DAAW;AAC9B,wBAAwB,oEAAgB;AACxC,sBAAsB,iEAAa;AACnC,eAAe,2DAAO;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gEAAY;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,EAAE,4DAAQ;AACd,wBAAwB,oEAAgB;AACxC;AACA;AACA,6BAA6B,oEAAgB;AAC7C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,4BAA4B,oEAAgB;AAC5C;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,kBAAkB,4BAA4B;AAC9C;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM,EAAE,4DAAQ;AAChB;AACA;AACA;AACA,0BAA0B,oEAAgB;AAC1C;AACA;AACA;AACA;AACA,iBAAiB,oEAAgB;AACjC,mBAAmB,iEAAa;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,uBAAuB,uDAAG;AAC1B,uBAAuB,uDAAG;;AAE1B;AACA;AACA;AACA;AACA;AACA,mBAAmB,yDAAK;;AAExB;AACA;AACA;AACA;AACA,qDAAqD,gEAAY;AACjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA,CAAC;;AAED;AACA,mGAAmG,gEAAY,qEAAqE,gEAAY,oEAAoE,2DAAO;AAC3Q;AACA;AACA,aAAa,gEAAY,8CAA8C,iFAA6B;AACpG;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,4BAA4B,0DAAU;AACtC;AACA;AACA,QAAQ,EAAE,4DAAQ;AAClB,4EAA4E,0DAAU;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,qEAAiB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,2DAAO;AAChD;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,gEAAY;AACtC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM,gEAAY;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE,4DAAQ;;AAElB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,2DAAO;AAC1B,8BAA8B,+DAAW;AACzC,8BAA8B,2DAAO;AACrC;AACA,sGAAsG,wEAAoB,sBAAsB,yEAAqB;AACrK;AACA;AACA,mCAAmC,6EAAyB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,qEAAiB;AACvC;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA;AACA;AACA,+FAA+F,+DAAW;AAC1G;AACA;AACA;AACA,mCAAmC,+DAAW;AAC9C;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,+DAAW;AACvD;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,qDAAK;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,QAAQ,EAAE,4DAAQ;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe,uDAAG;AAClB,eAAe,uDAAG;AAClB,eAAe,uDAAG;AAClB,eAAe,uDAAG;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,4BAA4B,oEAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR,+BAA+B,KAAK;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,EAAE,4DAAQ;AAClB;AACA;AACA,uBAAuB,oEAAgB;AACvC,4BAA4B,oEAAgB;AAC5C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc,+DAAW;AACzB;AACA;AACA,0BAA0B,2DAAO;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,2DAAO;AACpC,2BAA2B,uDAAG;AAC9B,0BAA0B,uDAAG;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,eAAe,2DAAO;AACtB,oBAAoB,gEAAY;AAChC,qBAAqB,+DAAW;AAChC;AACA;AACA,mBAAmB,4DAAQ;;AAE3B;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,QAAQ,EAAE,4DAAQ;AAClB;AACA;AACA;AACA;AACA;AACA,wBAAwB,+DAAW,CAAC,2DAAO;AAC3C,uBAAuB,mEAAe;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,yDAAK;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yDAAK;AAC9B;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA,QAAQ,EAAE,4DAAQ;AAClB;AACA;AACA;AACA;AACA,wBAAwB,+DAAW;AACnC,uBAAuB,mEAAe;AACtC;AACA;AACA,wBAAwB,4DAAQ;AAChC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,2DAAO;AACpD;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,wBAAwB;AACxB;AACA,QAAQ,EAAE,4DAAQ;AAClB;AACA,mBAAmB,2DAAO;AAC1B,wBAAwB,gEAAY;AACpC,sBAAsB,+DAAW;AACjC;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA,sCAAsC,uDAAG;AACzC,qCAAqC,uDAAG;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,uDAAG;AACxB,qBAAqB,uDAAG;AACxB,qBAAqB,uDAAG;AACxB,qBAAqB,uDAAG;AACxB;AACA,iFAAiF,uDAAG;AACpF,UAAU;AACV,mFAAmF,uDAAG;AACtF;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEsH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9hCmM;AAC/O;AACwQ;AACpR;;AAE9D;AACA,cAAc,wEAAkB;AAChC;AACA;AACA;AACA;AACA,oBAAoB,qEAAa;AACjC;AACA;AACA,yBAAyB,wDAAK,2BAA2B,wDAAK;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,UAAU,iEAAS;AACnB;;AAEA;AACA;AACA,OAAO,qEAAa;AACpB,WAAW,+DAAY;AACvB;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,eAAe,wDAAK;AACpB,eAAe,wDAAK;;AAEpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,+DAAY;AAC3C;AACA,cAAc,iEAAS;AACvB,OAAO,gEAAQ;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE,iEAAS;AAC5E;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAY;AAC1B;AACA;AACA,UAAU,iEAAS;AACnB;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,2HAA2H,+DAAY;AACvI;AACA;AACA;AACA;AACA;AACA,gBAAgB,iEAAS;AACzB,sCAAsC,iEAAS,iBAAiB,iEAAS;AACzE;AACA,wBAAwB,uEAAe;AACvC;AACA;AACA;AACA,kBAAkB,wEAAkB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iEAAS;AAC5B,sBAAsB,uEAAe;AACrC;AACA;AACA,SAAS,mEAAgB;AACzB;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,qBAAqB,qEAAa;AAClC;AACA,iCAAiC,0EAAkB;AACnD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,0BAA0B,0EAAkB;AAC5C,8BAA8B,kEAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,+DAAY;AAC1B,kBAAkB,+DAAY;AAC9B,kCAAkC,qEAAa;AAC/C;AACA,QAAQ,mEAAW,6BAA6B,yEAAiB;AACjE,eAAe,qEAAa;AAC5B;AACA,QAAQ,qEAAa;AACrB;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,+DAAY;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe,0EAAkB;AACjC,iBAAiB,qEAAa;AAC9B;AACA,gBAAgB,sDAAG;AACnB,iBAAiB,sDAAG;AACpB;AACA;AACA,MAAM,wEAAkB;AACxB,SAAS,sDAAG;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc,iEAAS;AACvB,eAAe,0EAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,gEAAQ;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB,qEAAa,gCAAgC,+DAAY;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,2BAA2B,0EAAkB;AAC7C,IAAI,SAAS,iEAAS;AACtB;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,mEAAgB;AACzB;AACA;AACA,qBAAqB,qEAAa;AAClC,kCAAkC,iEAAS,gBAAgB,6EAAqB;AAChF;AACA;AACA,SAAS,wEAAkB;AAC3B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,4EAAoB,kCAAkC,iEAAS,QAAQ,mEAAW;AACjG;AACA,yBAAyB,wEAAkB;AAC3C,qCAAqC,qEAAa;;AAElD;AACA,SAAS,iEAAS,kBAAkB,6EAAqB;AACzD,0BAA0B,wEAAkB;AAC5C,oCAAoC,yEAAiB;AACrD;AACA;AACA;AACA,uSAAuS,yEAAiB;AACxT;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,kBAAkB,qEAAa;AAC/B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,sEAAsE,kEAAU;AAChF;AACA;AACA;AACA;AACA,kBAAkB,sDAAG;AACrB,oBAAoB,sDAAG;AACvB,qBAAqB,sDAAG;AACxB,mBAAmB,sDAAG;AACtB;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,kCAAkC,qEAAa;AAC/C,0BAA0B,0EAAkB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,+DAAY;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,mEAAW,6BAA6B,yEAAiB;AACjE,eAAe,qEAAa;AAC5B;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,wHAAwH,+DAAY;AACpI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,wEAAkB;AAC3B;;AAEA;AACA,OAAO,qEAAa,aAAa,wEAAkB;AACnD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM,0EAAkB;AACxB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc,iEAAS;AACvB,MAAM,kEAAU;AAChB;AACA;AACA,OAAO,qEAAa;AACpB,0BAA0B,qEAAa;AACvC,+BAA+B,6EAAqB;AACpD,UAAU,iEAAS;AACnB;AACA;AACA,wBAAwB,qEAAa;AACrC;AACA;AACA;AACA;AACA,yBAAyB,sEAAc;AACvC;AACA;AACA,sBAAsB,6EAAqB,uDAAuD,yEAAiB;AACnH;AACA;AACA,yBAAyB,0EAAkB;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAAS,wEAAkB;AAC3B;;AAEA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe,0EAAkB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,wDAAK;AAC1B,uBAAuB,wDAAK;AAC5B,wBAAwB,wDAAK;AAC7B,sBAAsB,wDAAK;AAC3B;AACA;AACA;AACA,iBAAiB,sDAAG,IAAI,sDAAG;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,0EAA0E,4EAAoB,wBAAwB,4EAAoB;AAC1I;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,6DAAgB;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAQ;;AAEvB;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,4DAAe;;AAErC;AACA;AACA;AACA;AACA;AACA,cAAc,oDAAO;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mDAAM;;AAEnB;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,mDAAM;;AAEnB;AACA;AACA;AACA;AACA;AACA,aAAa,mDAAM;;AAEnB;AACA;AACA;AACA;AACA;AACA,cAAc,oDAAO;;AAErB;AACA;AACA;AACA;AACA;AACA,eAAe,qDAAQ;;AAEvB;AACA;AACA;AACA,mBAAmB,yDAAY;;AAE/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,kEAAiB;AAC1B;AACA;AACA,GAAG;AACH;;AAE4I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxwB5I;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEgV;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChKhV;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEyW;;;;;;;;;;;;;;;AC1IzW;AACA;AACA;AACA;AAGE;AACF;;;;;;;;;;;;;;;;;;;;ACPA;AACA;AACA,uEAAuE,kCAAkC,IAAI;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAQE;AACF;;;;;;;;;;;;;;;;;;;ACpDA;AAC+B;AACuB;AACd;AACxC;AACA,YAAY,6CAAgB;AAC5B,UAAU,kDAAkD;AAC5D,yBAAyB,sDAAG;AAC5B,IAAI,gEAAS;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,sDAAG,cAAc,0BAA0B;AACtG;AACA;AACA,CAAC;AACD;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;;;;AC1BA;;AAEA;AAC0B;AACmC;AACE;AACb;AACV;AACxC;AACA;AACA,2DAA2D,2EAAkB;AAC7E;AACA;AACA,MAAM,iBAAiB,eAAe;AACtC;AACA;AACA,YAAY,kBAAkB;AAC9B,gBAAgB,yCAAY;AAC5B,oBAAoB,yCAAY;AAChC,2BAA2B,sDAAG,2BAA2B,8CAA8C;AACvG;AACA;AACA;AACA,6BAA6B,gEAAU;AACvC,yBAAyB,6CAAgB;AACzC;AACA,cAAc,kBAAkB;AAChC;AACA,2BAA2B,6EAAe;AAC1C,6BAA6B,sDAAG,uBAAuB,6BAA6B;AACpF;AACA;AACA;AACA;AACA;AACA,iCAAiC,gEAAU;AAC3C,6BAA6B,6CAAgB;AAC7C;AACA,cAAc,+BAA+B;AAC7C,kBAAkB,yCAAY;AAC9B,2BAA2B,6EAAe;AAC1C;AACA,MAAM,4CAAe;AACrB,mCAAmC,kBAAkB;AACrD;AACA,OAAO;AACP,6BAA6B,sDAAG,2BAA2B,KAAK,sBAAsB,+BAA+B;AACrH;AACA;AACA;AACA;AACA;AACA,qBAAqB,8CAAiB;AACtC;AACA;AACA,0EAA0E,eAAe;AACzF;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,MAAM,kFAAkF;AACxF;AACA;AACA;AACA;;AAEA;AAC2B;AACyD;AACD;AAClB;;AAEjE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,YAAY;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,eAAe;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACgD;AAChD;AACA;AACA,2DAA2D,2EAAmB;AAC9E;AACA;AACA;AACA;AACA,uBAAuB,eAAe;AACtC,6BAA6B,eAAe;AAC5C;AACA;AACA;AACA;AACA,gCAAgC,iBAAiB;AACjD,mCAAmC,sDAAI,2BAA2B,iBAAiB,oBAAoB,sDAAI,mBAAmB,UAAU;AACxI;AACA;AACA;AACA;AACA,2BAA2B,sDAAI,2BAA2B,iBAAiB;AAC3E;AACA;AACA;AACA,YAAY,yBAAyB;AACrC,gBAAgB,yCAAa;AAC7B,sDAAsD,2CAAe;AACrE;AACA;AACA,wBAAwB,6EAAgB;AACxC;AACA,IAAI,4CAAgB;AACpB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL,2BAA2B,sDAAI;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gEAAW;AACxC,yBAAyB,6CAAiB;AAC1C;AACA,cAAc,kBAAkB;AAChC;AACA,2BAA2B,6EAAgB;AAC3C,6BAA6B,sDAAI,uBAAuB,6BAA6B;AACrF;AACA;AACA;AACA;AACA;AACA,iCAAiC,gEAAW;AAC5C,6BAA6B,6CAAiB;AAC9C;AACA,cAAc,+BAA+B;AAC7C,kBAAkB,yCAAa;AAC/B,oCAAoC,2CAAe;AACnD,2BAA2B,6EAAgB;AAC3C;AACA,cAAc,aAAa;AAC3B,0BAA0B,yCAAa;AACvC;AACA;AACA;AACA;AACA,MAAM,4CAAgB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA,+BAA+B,uBAAuB;AACtD;AACA;AACA,oCAAoC,uBAAuB;AAC3D,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,OAAO;AACP,6BAA6B,sDAAI,2BAA2B,KAAK,sBAAsB,+BAA+B;AACtH;AACA;AACA;AACA;AACA,WAAW,2CAAe;AAC1B;AACA;AACA,YAAY,UAAU;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,kFAAkF;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;AChiBA;AAC+B;AAC/B;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,wBAAwB,qBAAqB;AAC7C;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,8CAAiB;AAC1B;AAIE;AACF;;;;;;;;;;;;;;;;;;ACxCA;AAC+B;AACS;AACxC;AACA,kBAAkB,gDAAmB;AACrC;AACA,YAAY,uBAAuB;AACnC,kBAAkB,0CAAa;AAC/B,2BAA2B,sDAAG,qBAAqB,iBAAiB;AACpE;AACA;AACA;AACA,oBAAoB,6CAAgB;AACpC;AACA;AACA,yBAAyB,aAAa,2BAA2B,kBAAkB;AACnF;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,gDAAmB;AAC3C;AACA;AACA;AACA,cAAc,8BAA8B;AAC5C;AACA,oBAAoB,0CAAa;AACjC,6BAA6B,sDAAG,qBAAqB,iBAAiB;AACtE;AACA;AACA;AACA;AACA,sBAAsB,6CAAgB;AACtC;AACA;AACA,2BAA2B,aAAa,2BAA2B,kBAAkB;AACrF;AACA;AACA;AACA;AACA;AACA,aAAa,gDAAmB;AAChC,KAAK;AACL;AACA;AACA,aAAa,0CAAa;AAC1B,iBAAiB,WAAW,UAAU,MAAM,mCAAmC;AAC/E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,2DAA2D,qBAAqB;AAChF;AACA,kDAAkD,UAAU;AAC5D,iBAAiB;AACjB,OAAO,IAAI;AACX,aAAa,0CAAa,UAAU,WAAW,oBAAoB,gBAAgB;AACnF;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;;AChFA;AAC+B;AACS;AACxC,uBAAuB,gDAAmB;AAC1C;AACA,UAAU,gBAAgB;AAC1B,yBAAyB,sDAAG,8BAA8B,sBAAsB;AAChF;AACA;AACA,oBAAoB,6CAAgB;AACpC;AACA;AACA;AAKE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;AClBA;;AAEA;AAC+B;AAC4B;AACwB;AACpB;AACG;AACI;AAC9B;AACxC;AACA;AACA;AACA;AACA;AACA,8BAA8B,gDAAmB;AACjD;AACA;AACA;AACA,CAAC;AACD,uBAAuB,6CAAgB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,oBAAoB,6CAAgB;AACpC,4BAA4B,2CAAc;AAC1C;AACA,sBAAsB,2CAAc,GAAG;AACvC,yBAAyB,6EAAe;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,oFAAgB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,IAAI,4CAAe;AACnB,yCAAyC;AACzC;AACA;AACA,KAAK;AACL,2BAA2B,sDAAG;AAC9B,MAAM,gEAAS;AACf;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,wBAAwB,yEAAoB;AAC5C,uBAAuB,yEAAoB;AAC3C,8BAA8B,yEAAoB;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,6CAAgB;AAC7C,kBAAkB,6CAAgB;AAClC,cAAc,yCAAY;AAC1B,uBAAuB,6EAAe;AACtC,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,yBAAyB,sDAAG,CAAC,gEAAS,QAAQ,6BAA6B;AAC3E,CAAC;AACD;AACA;AACA,mCAAmC,gFAAc;AACjD,sCAAsC,yCAAY;AAClD,yBAAyB,yCAAY;AACrC,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,8BAA8B;AAC9B;AACA;AACA;AACA,4EAA4E,YAAY;AACxF,UAAU;AACV;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,gFAAc;AAC3C,oCAAoC,yCAAY;AAChD,EAAE,4CAAe;AACjB;AACA;AACA,8BAA8B;AAC9B;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,UAAU;AACzE;AACA,wCAAwC,0CAA0C;AAClF,wDAAwD,YAAY;AACpE;AACA,IAAI,sFAA2B;AAC/B,IAAI;AACJ;AACA;AACA;AACA;AACA;AAME;AACF;;;;;;;;;;;;;;;;;;AC5NA;;AAEA;AAC+B;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAKE;AACF;;;;;;;;;;;;;;;;;;;;;ACtCA;;AAEA;AAC+B;AACgC;AACT;AACY;AAC1B;AACxC;AACA;AACA,sBAAsB;AACtB;AACA,iBAAiB,6CAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,oCAAoC,2CAAc;AAClD,2BAA2B,gFAAc;AACzC,6BAA6B,gFAAc;AAC3C,gCAAgC,yCAAY;AAC5C,uBAAuB,6EAAe;AACtC,qBAAqB,yCAAY;AACjC;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV,iDAAiD,cAAc;AAC/D;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,iDAAiD,cAAc;AAC/D;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2DAA2D,gCAAgC;AAC3F;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sEAAsE,cAAc;AACpF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D,cAAc;AAC7E;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,GAAG;AACH,wBAAwB,8CAAiB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,qCAAqC,cAAc;AACnD,YAAY;AACZ;AACA,oCAAoC,cAAc;AAClD;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,yBAAyB,sDAAG,CAAC,gEAAS,QAAQ,0EAA0E;AACxH,CAAC;AACD;AACA,kCAAkC,iBAAiB,IAAI;AACvD;AACA;AACA,uBAAuB,QAAQ;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,6BAA6B,iBAAiB;AAC9C;AACA;AACA,0BAA0B,MAAM;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,iBAAiB,IAAI;AAC/C;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;ACrNA;AAC+B;AACqC;AACpE,iBAAiB,yLAAK;AACtB;AACA;AACA,sBAAsB,2CAAc;AACpC,EAAE,kFAAe;AACjB;AACA,GAAG;AACH,2CAA2C,GAAG;AAC9C;AAGE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACfA;;AAEA;AAC+B;AAWC;AACwB;AACO;AACF;AACP;AACY;AACE;AACjB;AACX;AACxC;AACA;AACA;AACA,+CAA+C,2EAAkB;AACjE;AACA;AACA,UAAU,0BAA0B;AACpC,8BAA8B,2CAAc;AAC5C,yBAAyB,uDAAG,mBAAmB,mEAAmE;AAClH;AACA;AACA;AACA,mBAAmB,6CAAgB;AACnC;AACA,YAAY,4CAA4C;AACxD;AACA,gBAAgB,yCAAY;AAC5B,yBAAyB,6EAAe;AACxC,sBAAsB,yCAAY;AAClC,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,+CAA+C,uDAAG,CAAC,gEAAS,QAAQ,mCAAmC;AACvG;AACA;AACA;AACA;AACA;AACA,oBAAoB,6CAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,kCAAkC,2CAAc;AAChD,yBAAyB,6EAAe;AACxC,8BAA8B,2CAAc;AAC5C,sBAAsB,iEAAO;AAC7B;AACA;AACA;AACA,iGAAiG;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,gEAAgE,EAAE,mEAAW;AACzF;AACA;AACA;AACA;AACA,wBAAwB,kEAAU;AAClC;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA,OAAO;AACP;AACA,QAAQ,8DAAM,GAAG,gEAAgE;AACjF,2BAA2B,6DAAK;AAChC;AACA;AACA,0CAA0C,kEAAU;AACpD;AACA,SAAS;AACT,2BAA2B,4DAAI,GAAG,0BAA0B;AAC5D,QAAQ,4DAAI;AACZ;AACA,oBAAoB,kDAAkD;AACtE,oBAAoB,2CAA2C;AAC/D;AACA,0EAA0E,eAAe;AACzF,2EAA2E,gBAAgB;AAC3F,uEAAuE,YAAY;AACnF,wEAAwE,aAAa;AACrF;AACA,SAAS;AACT,iBAAiB,6DAAe,GAAG,uCAAuC;AAC1E,0BAA0B,yBAAyB;AACnD,4BAA4B,4DAAI,GAAG,uDAAuD;AAC1F;AACA,KAAK;AACL;AACA,yBAAyB,gFAAc;AACvC,IAAI,kFAAe;AACnB;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,8CAA8C,2CAAc;AAC5D,IAAI,kFAAe;AACnB;AACA,KAAK;AACL,2BAA2B,uDAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,kCAAkC,uDAAG;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uDAAG;AACzC,cAAc,gEAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC,UAAU,+BAA+B;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uDAAG;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT,kCAAkC,uDAAG;AACrC,UAAU,uDAAmB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY,mCAAmC;AAC/C;AACA;AACA;AACA;AACA;AACA,2BAA2B,yCAAyC;AACpE;AACA;AACA;AACA;AACA;AACA,4CAA4C,aAAa;AACzD,aAAa,aAAa;AAC1B,MAAM;AACN,4CAA4C,aAAa;AACzD,aAAa,oCAAoC;AACjD,MAAM;AACN,aAAa,aAAa;AAC1B,4CAA4C,aAAa;AACzD,MAAM;AACN,aAAa,mCAAmC;AAChD,4CAA4C,aAAa;AACzD;AACA,aAAa,QAAQ;AACrB;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAaE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnT6O;AAC9H;AAChF;AACS;AACF;;AAEtC;;AAEA;AACA,uBAAuB,kDAAe;;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,UAAU;AAC/B,aAAa;AACb;AACA;AACA;AACA,qBAAqB,UAAU;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,cAAc,yCAAY;AAC1B;AACA;AACA,GAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI;AACV;AACA;AACA;AACA,IAAI;AACJ,0BAA0B,2CAAc;AACxC;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,GAAG;AACH,kDAAkD,2CAAc;AAChE;AACA;AACA;AACA,sCAAsC,2CAAc;AACpD,oCAAoC,2CAAc;AAClD,uBAAuB,8CAAiB;AACxC;AACA;AACA;AACA;AACA,GAAG;AACH,sBAAsB,8CAAiB;AACvC;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,uBAAuB,yCAAY;AACnC,sBAAsB,yCAAY;AAClC,kBAAkB,yCAAY;AAC9B;AACA;AACA;AACA;AACA,iBAAiB,8CAAiB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,iEAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ,gDAAkB;AAC1B;AACA,SAAS;AACT;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,GAAG;AACH,uBAAuB,yCAAY;AACnC;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,eAAe,0CAAa;AAC5B;AACA;AACA;AACA;AACA,GAAG;AACH,mBAAmB,0CAAa;AAChC;AACA;AACA,GAAG;AACH,yBAAyB,0CAAa;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,SAAS,0CAAa;AACtB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,iBAAiB,uDAAO;AACxB;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,eAAe,uDAAO;AACtB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,wDAAQ;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,uDAAO;AACZ;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,KAAK,4DAAY;AACjB;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,sDAAM;AACX;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,sDAAM;AACX;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,+DAAe;AACpB;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,sDAAM;AACX;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,KAAK,wDAAQ;AACb;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAEiG;;;;;;;;;;;;;;;;;;;;;AClXlG;;AAEA;AAC+B;AACE;AACqB;AACc;AAC5B;AACxC;AACA,aAAa,6CAAgB;AAC7B,UAAU,2CAA2C;AACrD,gCAAgC,2CAAc;AAC9C,EAAE,kFAAe;AACjB;AACA,qBAAqB,mDAAqB,iBAAiB,sDAAG,CAAC,gEAAS,QAAQ,mCAAmC;AACnH,CAAC;AACD;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;;ACtBA;;AAEA;AACgC;AAC+B;AACK;;AAEpE;AAC+B;AAC/B;AACA,SAAS,6CAAgB;AACzB;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA,UAAU,oBAAoB;AAC9B;AACA,4DAA4D,6BAA6B,IAAI,2CAAe;AAC5G,cAAc,6EAAe;AAC7B;AACA,4CAA4C,+CAAmB,UAAU,KAAK;AAC9E;AACA;AACA;AACA,0BAA0B,2CAAe;AACzC,oBAAoB,yCAAa;AACjC,yBAAyB,yCAAa;AACtC,+BAA+B,yCAAa;AAC5C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,GAAG;AACH,EAAE,4CAAgB;AAClB;AACA;AACA,GAAG;AACH,EAAE,kFAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE,kFAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA,SAAS,8CAAkB;AAC3B;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;;;;AC1IA;AAC+B;AACO;AACY;AACV;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,gEAAU,cAAc,KAAK;AAC5C,eAAe,6CAAgB;AAC/B,YAAY,6BAA6B;AACzC;AACA;AACA;AACA;AACA,2BAA2B,sDAAG,SAAS,sCAAsC;AAC7E,GAAG;AACH,kCAAkC,KAAK;AACvC,WAAW;AACX,CAAC,IAAI;AACL;AACA,cAAc,gDAAkB;AAChC;AACA;AAKE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9CA;;AAEA;AAC+B;AACO;AACG;AACkB;AACG;AACC;AACF;AACJ;AACY;AACP;AACL;AACd;AACe;AACC;AACQ;AACb;AACJ;AACgB;AACY;AACV;AACT;AACc;AAChC;AACU;AACK;AACxD;AACA;AACA;AACA,yDAAyD,4EAAgB;AACzE,+CAA+C,2EAAkB;AACjE;AACA,EAAE,sEAAiB;AACnB;AACA,qBAAqB,0EAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,gCAAgC,2CAAc;AAC9C,oCAAoC,2CAAc;AAClD,0DAA0D,2CAAc;AACxE,oBAAoB,uEAAY;AAChC,0BAA0B,6FAAoB;AAC9C;AACA;AACA;AACA;AACA,GAAG;AACH,4BAA4B,6FAAoB;AAChD;AACA;AACA;AACA;AACA,GAAG;AACH,mCAAmC,yCAAY;AAC/C;AACA,kDAAkD,2CAAc;AAChE,kGAAkG;AAClG,yBAAyB,uDAAG,CAAC,yDAAoB,IAAI,0CAA0C,wDAAI;AACnG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,0DAAK;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,uDAAG,wBAAwB,gDAAgD,uDAAG;AACtG;AACA;AACA;AACA,+BAA+B,8CAAiB;AAChD;AACA,aAAa;AACb,kCAAkC,8CAAiB;AACnD;AACA;AACA;AACA;AACA,eAAe;AACf,aAAa;AACb;AACA;AACA,WAAW;AACX,wCAAwC,wDAAI;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAiD,uDAAG,aAAa,WAAW;AAC5E;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,oBAAoB,6CAAgB;AACpC;AACA,YAAY,mDAAmD;AAC/D;AACA;AACA;AACA,yBAAyB,6EAAe;AACxC;AACA,2BAA2B,yCAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,uDAAG,CAAC,2DAAsB,IAAI,yDAAyD,uDAAG;AACrH,MAAM,iEAAS;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,yEAAoB;AACrC;AACA;AACA;AACA;AACA,SAAS;AACT,uBAAuB,yEAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,mBAAmB,yEAAoB;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC;AACA,YAAY,6EAA6E;AACzF;AACA,YAAY,+BAA+B;AAC3C;AACA,yBAAyB,6EAAe;AACxC,IAAI,mFAAe;AACnB;AACA,KAAK;AACL,2BAA2B,uDAAG;AAC9B,MAAM,iEAAS;AACf;AACA;AACA;AACA,iBAAiB,uBAAuB;AACxC,yEAAyE,uDAAG,CAAC,wDAAQ,IAAI,uBAAuB;AAChH;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,6CAAgB;AACjC;AACA,YAAY,wCAAwC;AACpD,2BAA2B,uDAAG,CAAC,iEAAS,SAAS,sFAAsF;AACvI;AACA;AACA;AACA;AACA;AACA,yBAAyB,uDAAG,CAAC,2DAAe,IAAI,yBAAyB;AACzE;AACA;AACA;AACA,oBAAoB,6CAAgB;AACpC;AACA;AACA,oCAAoC,2CAAc;AAClD,IAAI,mFAAe;AACnB;AACA,KAAK;AACL;AACA;AACA,oBAAoB,mDAAqB;AACzC,wBAAwB,uDAAG,0BAA0B,sDAAsD,uDAAG,oBAAoB,sDAAsD,uDAAG,UAAU,0BAA0B,GAAG,GAAG;AACrO;AACA;AACA;AACA,2BAA2B,uDAAG,sBAAsB,6BAA6B;AACjF;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,iEAAU;AACrB,wBAAwB,6CAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,kCAAkC,2CAAc;AAChD,oCAAoC,2CAAc;AAClD,yBAAyB,6EAAe;AACxC,4CAA4C,2CAAc;AAC1D,oDAAoD,2CAAc;AAClE;AACA;AACA;AACA,4CAA4C,2CAAc;AAC1D,mCAAmC,yCAAY;AAC/C,IAAI,4CAAe;AACnB,0BAA0B,wDAAU;AACpC,KAAK;AACL,IAAI,4EAAc;AAClB,uBAAuB,8CAAiB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,kBAAkB;AACxD;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,8BAA8B,8CAAiB;AAC/C;AACA;AACA;AACA,IAAI,4CAAe;AACnB;AACA;AACA;AACA,KAAK;AACL,YAAY,yCAAyC;AACrD,IAAI,4CAAe;AACnB;AACA,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oEAAoE,2BAA2B;AAC/F;AACA;AACA;AACA,uEAAuE,eAAe;AACtF;AACA;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,4BAA4B,8CAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,4BAA4B,8CAAiB;AAC7C,gCAAgC,8CAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,2BAA2B,uDAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,uDAAG,CAAC,4DAAY,IAAI,0DAA0D,uDAAG;AACnH,UAAU,oEAAU;AACpB;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,gCAAgC,yEAAoB;AACpD,uCAAuC,qBAAqB;AAC5D;AACA,aAAa;AACb,sCAAsC,uDAAG;AACzC,cAAc,+EAAgB;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,uDAAG;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB,+BAA+B,yEAAoB;AACnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,6CAAgB;AAChD,UAAU,0CAA0C;AACpD;AACA;AACA,8CAA8C,2CAAc;AAC5D,gCAAgC,2CAAc;AAC9C,uBAAuB,6EAAe;AACtC;AACA,kCAAkC,yCAAY;AAC9C,8BAA8B,yCAAY;AAC1C,UAAU,8DAA8D;AACxE,mBAAmB,8CAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,uDAAK;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,uDAAK;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uCAAuC,eAAe;AACtD;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,mFAAe;AACjB,4CAA4C,2CAAc;AAC1D,EAAE,mFAAe;AACjB;AACA,GAAG;AACH,mCAAmC,8CAAiB;AACpD;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,yBAAyB,uDAAG;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA,gCAAgC,uDAAG;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,oCAAoC,uDAAG;AACvC,YAAY,iEAAS;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,2BAA2B,6CAAgB;AAC3C;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,yBAAyB,uDAAG;AAC5B,IAAI,4DAAuB;AAC3B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,6FAA6F;AAC7F;AACA,qBAAqB,6CAAgB;AACrC;AACA,YAAY,yCAAyC;AACrD;AACA;AACA,yBAAyB,6EAAe;AACxC,6BAA6B,yCAAY;AACzC,2BAA2B,wDAAI,CAAC,wDAAQ,IAAI;AAC5C,sBAAsB,uDAAG;AACzB;AACA;AACA;AACA,kDAAkD,qBAAqB,wBAAwB,kCAAkC,gDAAgD,aAAa;AAC9L,WAAW;AACX;AACA;AACA;AACA,sBAAsB,uDAAG,oBAAoB,gDAAgD,uDAAG;AAChG,QAAQ,iEAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX,oBAAoB,yEAAoB;AACxC;AACA,oBAAoB,0CAA0C;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC;AACA,YAAY,+BAA+B;AAC3C,oBAAoB,0DAAK;AACzB,2BAA2B,uDAAG,+BAA+B,6DAA6D,uDAAG,CAAC,iEAAS,QAAQ,6EAA6E,GAAG;AAC/N;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC;AACA,YAAY,+BAA+B;AAC3C;AACA,2BAA2B,uDAAG,CAAC,iEAAS,QAAQ,uDAAuD;AACvG;AACA;AACA;AACA;AACA;AACA,iBAAiB,6CAAgB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,sCAAsC,2CAAc;AACpD,sCAAsC,2CAAc;AACpD,yBAAyB,6EAAe;AACxC;AACA;AACA;AACA,mBAAmB,0DAAK;AACxB,2BAA2B,yCAAY;AACvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,uDAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,8CAAiB;AAC3C;AACA,SAAS;AACT,kCAAkC,uDAAG;AACrC;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,uDAAG;AACzC,cAAc,iEAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,yEAAoB;AAC7C,wBAAwB,yEAAoB;AAC5C,yBAAyB,yEAAoB;AAC7C;AACA,iBAAiB;AACjB,6BAA6B,yEAAoB;AACjD;AACA,iBAAiB;AACjB,+BAA+B,yEAAoB;AACnD;AACA,iBAAiB;AACjB,+BAA+B,yEAAoB;AACnD;AACA;AACA;AACA,oBAAoB;AACpB,gDAAgD,qBAAqB;AACrE;AACA,iBAAiB;AACjB,gCAAgC,yEAAoB;AACpD;AACA;AACA;AACA,iBAAiB;AACjB,2BAA2B,yEAAoB;AAC/C;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB,6CAAgB;AACrC;AACA,YAAY,oDAAoD;AAChE;AACA;AACA;AACA;AACA,4CAA4C,2CAAc;AAC1D,yBAAyB,6EAAe;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,0CAAa;AACtC,4BAA4B,uDAAG,aAAa,iFAAiF;AAC7H;AACA;AACA,YAAY,0CAA0C;AACtD,IAAI,mFAAe;AACnB;AACA;AACA,KAAK;AACL,2BAA2B,wDAAI,CAAC,wDAAQ,IAAI;AAC5C,sBAAsB,uDAAG,CAAC,iEAAS,SAAS,6DAA6D;AACzG,qFAAqF,mDAAqB;AAC1G,OAAO;AACP;AACA;AACA;AACA;AACA,0BAA0B,6CAAgB;AAC1C;AACA,YAAY,uCAAuC;AACnD;AACA,oDAAoD,uDAAG,CAAC,iEAAS,SAAS,+DAA+D;AACzI;AACA;AACA;AACA;AACA,2BAA2B,6CAAgB;AAC3C;AACA;AACA,wCAAwC,2CAAc;AACtD,uBAAuB,6EAAe;AACtC,EAAE,mFAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,uCAAuC,uDAAG;AAC1C;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA,6BAA6B,6CAAgB;AAC7C;AACA;AACA,4CAA4C,2CAAc;AAC1D,uBAAuB,6EAAe;AACtC,EAAE,mFAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,yCAAyC,uDAAG;AAC5C;AACA;AACA;AACA;AACA;AACA,gBAAgB,yBAAyB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,6BAA6B,6CAAgB;AAC7C,UAAU,uDAAuD;AACjE;AACA,6BAA6B,yCAAY;AACzC;AACA,+BAA+B,8CAAiB;AAChD;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA,GAAG;AACH,EAAE,mFAAe;AACjB;AACA,8CAA8C,kBAAkB;AAChE,GAAG;AACH,yBAAyB,uDAAG;AAC5B,IAAI,iEAAS;AACb;AACA;AACA;AACA;AACA,eAAe,8CAA8C;AAC7D,qBAAqB,yEAAoB;AACzC;AACA;AACA;AACA,OAAO;AACP,qBAAqB,yEAAoB;AACzC;AACA;AACA;AACA;AACA,OAAO;AACP,sBAAsB,yEAAoB;AAC1C;AACA,OAAO;AACP;AACA;AACA,CAAC;AACD;AACA,sBAAsB,6CAAgB;AACtC;AACA,YAAY,mCAAmC;AAC/C,2BAA2B,uDAAG,CAAC,iEAAS,QAAQ,2DAA2D;AAC3G;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC;AACA,YAAY,+BAA+B;AAC3C;AACA;AACA;AACA,kFAAkF,uDAAG,CAAC,0DAAqB,IAAI,kDAAkD;AACjK;AACA;AACA;AACA;AACA,wBAAwB,6CAAgB;AACxC,KAAK,gCAAgC;AACrC,gBAAgB,yCAAY;AAC5B,yBAAyB,6EAAe;AACxC,sBAAsB,0EAAW;AACjC,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4CAA4C,eAAe;AAC3D;AACA;AACA;AACA,KAAK;AACL,2BAA2B,uDAAG;AAC9B,MAAM,iEAAS;AACf;AACA;AACA,iBAAiB,GAAG,oFAAsB,kBAAkB;AAC5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,iFAAc;AAC3C,oBAAoB,yCAAY;AAChC,mBAAmB,yCAAY;AAC/B,gCAAgC,8CAAiB;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,yBAAyB,8CAAiB;AAC1C;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAmCE;AACF;;;;;;;;;;;;;;;;;;;;;;AC3qCA;AAC+B;AAC4B;AACI;AAC/D;AACA;AACA;AACA,gBAAgB,6CAAgB;AAChC,YAAY,yBAAyB;AACrC,0BAA0B,2CAAc;AACxC;AACA;AACA;AACA;AACA;AACA,cAAc,2CAAc,+BAA+B,2CAAc;AACzE,iBAAiB,iDAAoB;AACrC,UAAU;AACV;AACA;AACA,OAAO;AACP,6BAA6B,sDAAG,cAAc,2CAA2C,iDAAoB,eAAe,+CAAkB,0CAA0C;AACxL;AACA,2BAA2B,sDAAG,cAAc,2CAA2C;AACvF,GAAG;AACH,yBAAyB,UAAU;AACnC;AACA;AACA;AACA;AACA;AACA,oBAAoB,6CAAgB;AACpC,YAAY,yBAAyB;AACrC,QAAQ,iDAAoB;AAC5B;AACA;AACA,4BAA4B,2CAAc;AAC1C,oCAAoC,yEAAW;AAC/C;AACA,aAAa,+CAAkB;AAC/B;AACA,WAAW,2CAAc,uBAAuB,2CAAc;AAC9D,GAAG;AACH,6BAA6B,UAAU;AACvC;AACA;AACA;AACA;AACA;AACA,wBAAwB,UAAU;AAClC,2BAA2B,sDAAG,CAAC,uDAAS,IAAI,UAAU;AACtD;AACA,8BAA8B,UAAU;AACxC;AACA;AACA;AACA;AACA;AACA,SAAS,iDAAoB;AAC7B;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN,kCAAkC;AAClC,MAAM;AACN;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxGA;;AAEA;AAC+B;AAC4B;AACI;AACF;AACiB;AACnB;AACR;AACG;AACR;AAC9C;AACA,+CAA+C,2EAAkB;AACjE;AACA,aAAa,6CAAgB;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,gCAAgC,2CAAc;AAC9C,yBAAyB,6EAAe;AACxC,6CAA6C,yCAAY;AACzD;AACA,kCAAkC,4FAAoB;AACtD;AACA;AACA;AACA;AACA,KAAK;AACL,2BAA2B,uDAAI,mBAAmB;AAClD,sBAAsB,sDAAG;AACzB,QAAQ,gEAAS;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,yEAAoB;AACvC;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA,uCAAuC,sDAAG;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,kBAAkB,6CAAgB;AAClC;AACA,YAAY,+BAA+B;AAC3C;AACA,2BAA2B,sDAAG;AAC9B,MAAM,gEAAS;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,6CAAgB;AACxC;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,gBAAgB,yCAAY;AAC5B,yBAAyB,6EAAe;AACxC,wBAAwB,yEAAW;AACnC,wBAAwB,iEAAO;AAC/B,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,SAAS;AACpD;AACA;AACA;AACA,KAAK;AACL,2BAA2B,sDAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/JA;;AAEA;AAC+B;AAC4B;AACI;AACF;AACQ;AAC1B;AACe;AACC;AACQ;AACf;AACE;AACC;AACuB;AACH;AAC7B;AAC9C,iDAAiD,2EAAkB;AACnE,EAAE,qEAAiB;AACnB;AACA,qBAAqB,yEAAiB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,2BAA2B,yCAAY;AACvC,gCAAgC,yCAAY;AAC5C,4BAA4B,yCAAY;AACxC,EAAE,4CAAe;AACjB;AACA;AACA,GAAG;AACH,yBAAyB,uDAAG;AAC5B;AACA;AACA;AACA;AACA;AACA,cAAc,8CAAiB;AAC/B;AACA;AACA,OAAO;AACP,eAAe,8CAAiB;AAChC;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,gCAAgC,8CAAiB;AACjD;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,gCAAgC,2CAAc;AAC9C,oBAAoB,yDAAK;AACzB,uBAAuB,yCAAY;AACnC;AACA;AACA,4BAA4B,yCAAY;AACxC,0BAA0B,6FAAoB;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH,yBAAyB,0CAAa;AACtC;AACA,GAAG;AACH,qBAAqB,8CAAiB;AACtC;AACA;AACA;AACA;AACA,GAAG;AACH,sBAAsB,8CAAiB;AACvC;AACA;AACA;AACA,GAAG;AACH,4BAA4B,8CAAiB;AAC7C;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,yBAAyB,uDAAG,CAAC,wDAAoB,IAAI,0CAA0C,uDAAG;AAClG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB,8CAAiB;AACvC;AACA;AACA,OAAO;AACP,sBAAsB,8CAAiB;AACvC;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,qBAAqB,6CAAgB;AACrC;AACA,YAAY,kCAAkC;AAC9C;AACA;AACA;AACA,gBAAgB,yCAAY;AAC5B,yBAAyB,6EAAe;AACxC,6BAA6B,yCAAY;AACzC,oCAAoC,yCAAY;AAChD,4BAA4B,8CAAiB;AAC7C,IAAI,4CAAe;AACnB;AACA,KAAK;AACL,2BAA2B,uDAAG,CAAC,0DAAsB,IAAI,yDAAyD,uDAAG;AACrH,MAAM,gEAAS;AACf;AACA;AACA;AACA;AACA;AACA,uBAAuB,yEAAoB;AAC3C;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,wBAAwB,yEAAoB;AAC5C;AACA;AACA,SAAS;AACT,uBAAuB,yEAAoB;AAC3C;AACA;AACA;AACA;AACA,oEAAoE,YAAY;AAChF,SAAS;AACT,iBAAiB,yEAAoB;AACrC;AACA,SAAS;AACT,gBAAgB,yEAAoB;AACpC,iBAAiB,yEAAoB;AACrC;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,UAAU,kDAAkD;AAC5D;AACA,yBAAyB,uDAAG,mBAAmB,6DAA6D,uDAAG,CAAC,8DAAQ,IAAI,+DAA+D,uDAAG,CAAC,0DAAe,IAAI,oCAAoC,GAAG,GAAG;AAC5P;AACA;AACA;AACA,qBAAqB,6CAAgB;AACrC;AACA;AACA,YAAY,uEAAuE;AACnF;AACA,2BAA2B,uDAAG,CAAC,8DAAQ,IAAI,iGAAiG,uDAAG,uBAAuB,0CAA0C,oBAAoB,uDAAG,4BAA4B,0CAA0C,GAAG;AAChT;AACA;AACA,8BAA8B,6CAAgB;AAC9C;AACA;AACA,cAAc,yCAAY;AAC1B,uBAAuB,6EAAe;AACtC,kDAAkD,2CAAc;AAChE,UAAU,mBAAmB;AAC7B;AACA,UAAU,2BAA2B;AACrC,gCAAgC,8CAAiB;AACjD;AACA;AACA,GAAG;AACH,gCAAgC,8CAAiB;AACjD;AACA;AACA,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,EAAE,4CAAe;AACjB;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,yBAAyB,uDAAG,uBAAuB,6BAA6B;AAChF,CAAC;AACD,mHAAmH,iBAAiB;AACpI,gBAAgB,sEAAe;AAC/B,yBAAyB,6CAAgB;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,YAAY,UAAU;AACtB,IAAI,4CAAe;AACnB;AACA;AACA,KAAK;AACL,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA,0DAA0D,eAAe;AACzE,0EAA0E,eAAe;AACzF;AACA,KAAK;AACL,2BAA2B,uDAAG;AAC9B,MAAM,+EAAgB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,wDAAI;AACtC,UAAU,2DAAuB;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,8BAA8B,uDAAG,cAAc,UAAU;AACzD,8BAA8B,uDAAG,yCAAyC,iEAAiE,uDAAG,CAAC,kEAA4B,IAAI,yEAAyE,GAAG;AAC3P;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,6CAAgB;AACnC;AACA,YAAY,gCAAgC;AAC5C;AACA;AACA;AACA;AACA;AACA,0EAA0E,uDAAG,CAAC,yDAAqB,IAAI,kDAAkD;AACzJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D,UAAU;AACV;AACA;AACA;AACA;AACA,UAAU,oDAAoD;AAC9D,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,2BAA2B;AACrC;AACA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB;AACxB,MAAM,qBAAqB;AAC3B,MAAM;AACN;AACA;AACA;AACA,UAAU,OAAO;AACjB;AACA,0CAA0C,oBAAoB;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,kBAAkB,mBAAmB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAeE;AACF;;;;;;;;;;;;;;;;AC3fA;AAC+B;AAC/B;AACA,sBAAsB,yCAAY;AAClC,EAAE,4CAAe;AACjB;AACA,GAAG;AACH,SAAS,0CAAa;AACtB;AAGE;AACF;;;;;;;;;;;;;;;;;;;;ACZA;AAC+B;AACqC;AACpE,yBAAyB,yLAAK,8CAA8C,8EAAe;AAC3F;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,CAAC;AACD;AACA;AACA;AACA,GAAG;AACH;AACA;AACA,MAAM,IAAI;AACV,4BAA4B,yCAAY;AACxC,IAAI,4CAAe;AACnB;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ,mBAAmB,MAAM,KAAK,GAAG;AACtD;AACA;AACA;AACA,KAAK;AACL;AACA,mBAAmB,8CAAiB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,4BAA4B,2CAAc;AAC1C,uBAAuB,yCAAY;AACnC,sBAAsB,yCAAY;AAClC;AACA;AACA,GAAG;AACH,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACgC;AACkC;AAClE;AACA;AACA,UAAU,qEAAqE;AAC/E;AACA,mBAAmB,gFAAc;AACjC,MAAM,IAAI;AACV,4BAA4B,yCAAa;AACzC,IAAI,4CAAgB;AACpB;AACA;AACA;AACA;AACA;AACA,aAAa,QAAQ,mBAAmB,MAAM,KAAK,GAAG;AACtD;AACA;AACA;AACA,KAAK;AACL;AACA,kBAAkB,mCAAmC;AACrD;AACA;AACA;AACA,oCAAoC,6CAAiB;AACrD;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,uBAAuB,yCAAa;AACpC,EAAE,4CAAgB;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,gBAAgB,0CAAc;AAC9B;AACA;AACA,eAAe;AACf;AACA;AACA,GAAG;AACH,EAAE,4CAAgB;AAClB;AACA,iBAAiB,0CAA0C;AAC3D;AACA,GAAG;AACH;AACA;AAIE;AACF;;;;;;;;;;;;;;;;;;ACvIA;AACoE;AACrC;AAC/B,0BAA0B,yLAAK;AAC/B,8BAA8B,yLAAK;AACnC;AACA;AACA;AACA;AACA,cAAc,yCAAY;AAC1B;AACA,GAAG;AACH;AACA;AACA;AACA,KAAK;AACL,IAAI;AACJ,IAAI,kFAAe;AACnB;AACA,KAAK;AACL;AACA,SAAS,0CAAa;AACtB;AAGE;AACF;;;;;;;;;;;;;;;;;AC1BA;AAC+B;AACmC;AAClE;AACA,0BAA0B,gFAAc;AACxC,EAAE,4CAAe;AACjB;AACA;AACA;AACA;AACA;AACA,+DAA+D,eAAe;AAC9E,+EAA+E,eAAe;AAC9F,GAAG;AACH;AAGE;AACF;;;;;;;;;;;;;;;;AClBA;AAC+B;AAC/B,8CAA8C,kDAAqB;AACnE;AAGE;AACF;;;;;;;;;;;;;;;;ACPA;AAC+B;AAC/B;AACA,cAAc,yCAAY,GAAG,wBAAwB;AACrD,SAAS,0CAAa;AACtB;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AAGE;AACF;;;;;;;;;;;;;;;;;ACfA;AAC+B;AACqC;AACpE;AACA,0BAA0B,2CAAc;AACxC,EAAE,kFAAe;AACjB;AACA,gBAAgB,0DAA0D;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA,kBAAkB,eAAe;AACjC,OAAO;AACP,wCAAwC,mBAAmB;AAC3D;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AAGE;AACF;;;;;;;;;;;;;;;;;;;;ACxCA;AAC+B;AACuB;AACd;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,qBAAqB,6CAAgB;AACrC;AACA,2BAA2B,sDAAG;AAC9B,MAAM,gEAAS;AACf;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA;AAKE;AACF;;;;;;;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA,oBAAoB;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAgC;AAChC,+DAA+D,MAAM;AAC9D,WAAW,sCAAI;AACf;AACP;AACA;AACA,gBAAgB,4BAA4B;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,IAAI;AACb;AACA,kBAAkB,oEAAoE;AACtF;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;;;;;;;;;;;;;;;;ACtDA,cAAc,aAAa,+CAA+C,gDAAgD,eAAe,QAAQ,IAAI,0CAA0C,yCAAyC,SAAgB,gBAAgB,wCAAwC,IAAI,mDAAmD,SAAS,iEAAe,IAAI,E;;;;;;;;;;;;;;;;;;;;;ACAnY;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,OAAO,mBAAmB,kBAAkB,aAAa;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0CAA0C,YAAY;AACtD;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,2BAA2B;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kBAAkB,gBAAgB;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,CAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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ACA;AACA;AACA;;AAEO;AACP;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,MAAM,oBAAoB,YAAY;AAC5E,qBAAqB,8CAA8C;AACnE;AACA;AACA,qBAAqB,aAAa;AAClC;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uFAAuF,SAAS,gBAAgB;AAChH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA,iEAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,EAAC;;;;;;;UChZF;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;UACA;;;;;WC5BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,sDAAsD;WACtD,sCAAsC,mGAAmG;WACzI;WACA;WACA;WACA;WACA;WACA,E;;;;;WCzBA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA,E;;;;;WCPA,wF;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA,mC;;;;;;;;;;;;;;;;;ACA8C;AACA;AAClB;AACF;AAAA;AAE1B6lB,2DAAmB,CAAC,CAAC;AAErB,MAAMqD,WAAW,GAAGxS,QAAQ,CAACM,cAAc,CAAE,gBAAiB,CAAC;AAE/D,IAAKkS,WAAW,EAAG;EAClB;EACA9b,MAAM,CAACuJ,gBAAgB,CAAE,kBAAkB,EAAE,MAAM;IAClDsS,4DAAU,CAAEC,WAAY,CAAC,CAACjrB,MAAM,cAAEhB,sDAAA,CAACS,qCAAG,IAAE,CAAE,CAAC;EAC5C,CAAE,CAAC;AACJ,C","sources":["webpack://@stellarwp/harbor/./resources/img/logo-give.svg","webpack://@stellarwp/harbor/./resources/img/logo-givewp-nobg.svg","webpack://@stellarwp/harbor/./resources/img/logo-kadence-nobg.svg","webpack://@stellarwp/harbor/./resources/img/logo-kadence.svg","webpack://@stellarwp/harbor/./resources/img/logo-learndash-nobg.svg","webpack://@stellarwp/harbor/./resources/img/logo-learndash.svg","webpack://@stellarwp/harbor/./resources/img/logo-lw.svg","webpack://@stellarwp/harbor/./resources/img/logo-nexcess.svg","webpack://@stellarwp/harbor/./resources/img/logo-tec-nobg.svg","webpack://@stellarwp/harbor/./resources/img/logo-tec.svg","webpack://@stellarwp/harbor/./node_modules/aria-hidden/dist/es2015/index.js","webpack://@stellarwp/harbor/./resources/js/App.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/ErrorBoundary.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/ErrorItem.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/FeatureIcon.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/LicenseBadge.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/LicenseKeyInputSkeleton.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/NexcessLogo.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/ProductLogo.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/PurchaseLink.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/SectionHeader.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/StatusBadge.tsx","webpack://@stellarwp/harbor/./resources/js/components/atoms/UpdateButton.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/FeatureRow.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/FilterBar.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/LegacyLicenseBanner.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/LicenseKeyInput.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/LicenseProductCard.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/NotActivatedBanner.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/ReloadBanner.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/TierGroup.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/UpsellCard.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/VersionDisplay.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/WelcomeLicenseForm.tsx","webpack://@stellarwp/harbor/./resources/js/components/molecules/WelcomeNoticeBanner.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/AppLoader.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/ErrorModal.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/LicensePanel.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/LicenseSection.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/ProductSection.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/ProductSectionSkeleton.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/UpsellSection.tsx","webpack://@stellarwp/harbor/./resources/js/components/organisms/WelcomeScreen.tsx","webpack://@stellarwp/harbor/./resources/js/components/templates/AppShell.tsx","webpack://@stellarwp/harbor/./resources/js/components/templates/Shell.tsx","webpack://@stellarwp/harbor/./resources/js/components/templates/WelcomeShell.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/badge.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/button.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/dialog.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/input.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/select.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/switch.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/toast.tsx","webpack://@stellarwp/harbor/./resources/js/components/ui/tooltip.tsx","webpack://@stellarwp/harbor/./resources/js/context/error-modal-context.tsx","webpack://@stellarwp/harbor/./resources/js/context/filter-context.tsx","webpack://@stellarwp/harbor/./resources/js/context/harbor-data-context.tsx","webpack://@stellarwp/harbor/./resources/js/context/reload-banner-context.tsx","webpack://@stellarwp/harbor/./resources/js/context/toast-context.tsx","webpack://@stellarwp/harbor/./resources/js/data/products.ts","webpack://@stellarwp/harbor/./resources/js/errors/error-code.ts","webpack://@stellarwp/harbor/./resources/js/errors/harbor-error.ts","webpack://@stellarwp/harbor/./resources/js/errors/index.ts","webpack://@stellarwp/harbor/./resources/js/errors/utils.ts","webpack://@stellarwp/harbor/./resources/js/hooks/use-resolvable-select/use-resolvable-select.ts","webpack://@stellarwp/harbor/./resources/js/hooks/useFeatureRow.ts","webpack://@stellarwp/harbor/./resources/js/hooks/useFilteredFeatures.ts","webpack://@stellarwp/harbor/./resources/js/hooks/useProductFeatureGroups.ts","webpack://@stellarwp/harbor/./resources/js/hooks/useWelcomeLicenseForm.ts","webpack://@stellarwp/harbor/./resources/js/lib/activation-url.ts","webpack://@stellarwp/harbor/./resources/js/lib/feature-utils.ts","webpack://@stellarwp/harbor/./resources/js/lib/forward-resolver.ts","webpack://@stellarwp/harbor/./resources/js/lib/group-license-products.ts","webpack://@stellarwp/harbor/./resources/js/lib/harbor-data.ts","webpack://@stellarwp/harbor/./resources/js/lib/license-utils.ts","webpack://@stellarwp/harbor/./resources/js/lib/upgrade-url.ts","webpack://@stellarwp/harbor/./resources/js/lib/utils.ts","webpack://@stellarwp/harbor/./resources/js/store/actions.ts","webpack://@stellarwp/harbor/./resources/js/store/constants.ts","webpack://@stellarwp/harbor/./resources/js/store/index.ts","webpack://@stellarwp/harbor/./resources/js/store/reducer.ts","webpack://@stellarwp/harbor/./resources/js/store/resolvers.ts","webpack://@stellarwp/harbor/./resources/js/store/selectors.ts","webpack://@stellarwp/harbor/./resources/js/types/utils.ts","webpack://@stellarwp/harbor/./node_modules/get-nonce/dist/es2015/index.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/Icon.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/createLucideIcon.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/defaultAttributes.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/check.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/chevron-down.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/chevron-right.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/chevron-up.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/circle-check-big.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/download.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/external-link.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/info.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/key-round.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/loader-circle.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/lock.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/mail.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/pencil.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/refresh-cw.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/rocket.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/search.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/trash-2.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/triangle-alert.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/icons/x.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.js","webpack://@stellarwp/harbor/./node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.js","webpack://@stellarwp/harbor/./resources/css/globals.css?7ce2","webpack://@stellarwp/harbor/./node_modules/react-dom/client.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll-bar/dist/es2015/component.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll-bar/dist/es2015/constants.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll-bar/dist/es2015/index.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll-bar/dist/es2015/utils.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/Combination.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/SideEffect.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/UI.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/aggresiveCapture.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/handleScroll.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/medium.js","webpack://@stellarwp/harbor/./node_modules/react-remove-scroll/dist/es2015/sidecar.js","webpack://@stellarwp/harbor/./node_modules/react-style-singleton/dist/es2015/component.js","webpack://@stellarwp/harbor/./node_modules/react-style-singleton/dist/es2015/hook.js","webpack://@stellarwp/harbor/./node_modules/react-style-singleton/dist/es2015/index.js","webpack://@stellarwp/harbor/./node_modules/react-style-singleton/dist/es2015/singleton.js","webpack://@stellarwp/harbor/./node_modules/use-callback-ref/dist/es2015/assignRef.js","webpack://@stellarwp/harbor/./node_modules/use-callback-ref/dist/es2015/useMergeRef.js","webpack://@stellarwp/harbor/./node_modules/use-callback-ref/dist/es2015/useRef.js","webpack://@stellarwp/harbor/./node_modules/use-sidecar/dist/es2015/exports.js","webpack://@stellarwp/harbor/./node_modules/use-sidecar/dist/es2015/medium.js","webpack://@stellarwp/harbor/external window \"React\"","webpack://@stellarwp/harbor/external window \"ReactDOM\"","webpack://@stellarwp/harbor/external window \"ReactJSXRuntime\"","webpack://@stellarwp/harbor/external window [\"wp\",\"apiFetch\"]","webpack://@stellarwp/harbor/external window [\"wp\",\"components\"]","webpack://@stellarwp/harbor/external window [\"wp\",\"data\"]","webpack://@stellarwp/harbor/external window [\"wp\",\"element\"]","webpack://@stellarwp/harbor/external window [\"wp\",\"i18n\"]","webpack://@stellarwp/harbor/./node_modules/@floating-ui/core/dist/floating-ui.core.mjs","webpack://@stellarwp/harbor/./node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","webpack://@stellarwp/harbor/./node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","webpack://@stellarwp/harbor/./node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/number/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/primitive/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-arrow/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-collection/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-compose-refs/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-context/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-direction/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-focus-guards/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-focus-scope/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-id/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-popper/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-popper/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-portal/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-presence/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-primitive/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-select/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-slot/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-switch/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-tooltip/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-controllable-state/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-effect-event/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-escape-keydown/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-previous/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-use-size/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/@radix-ui/react-visually-hidden/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/class-variance-authority/dist/index.mjs","webpack://@stellarwp/harbor/./node_modules/clsx/dist/clsx.mjs","webpack://@stellarwp/harbor/./node_modules/tailwind-merge/dist/bundle-mjs.mjs","webpack://@stellarwp/harbor/./node_modules/tslib/tslib.es6.mjs","webpack://@stellarwp/harbor/webpack/bootstrap","webpack://@stellarwp/harbor/webpack/runtime/compat get default export","webpack://@stellarwp/harbor/webpack/runtime/create fake namespace object","webpack://@stellarwp/harbor/webpack/runtime/define property getters","webpack://@stellarwp/harbor/webpack/runtime/hasOwnProperty shorthand","webpack://@stellarwp/harbor/webpack/runtime/make namespace object","webpack://@stellarwp/harbor/webpack/runtime/nonce","webpack://@stellarwp/harbor/./resources/js/index.tsx"],"sourcesContent":["var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoGive = function SvgLogoGive(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 46,\n height: 46,\n fill: \"none\",\n \"aria-labelledby\": \"give-title\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#3D7BF5\",\n d: \"M0 9.857C0 4.413 4.413 0 9.857 0h26.286C41.587 0 46 4.413 46 9.857v26.286C46 41.587 41.587 46 36.143 46H9.857C4.413 46 0 41.587 0 36.143z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FEFBF2\",\n d: \"M41.071 22.372c-4.885.202-4.245.147-18.419.22-.133 0-.399.056-.399.32 0 .226.013 1.895.02 2.38 0 .079-.033.159.17.159.171 0 6.995-.068 11.754-.454-.843 5.09-5.399 8.98-10.892 8.98-5.494 0-10.385-4.183-10.974-9.544 0-.031-.006-.056-.006-.086a9.6 9.6 0 0 1-.007-2.037c.165-1.594.71-3.19 1.603-4.612l.038-.056c.133-.208.279-.41.425-.607.101-.135.202-.276.316-.405q.088-.11.184-.22a11.12 11.12 0 0 1 7.274-3.73 10.488 10.488 0 0 1 2.23.006c.102.013.197.019.298.031q.465.056.913.147c.164.037.316.074.475.117a11.564 11.564 0 0 1 1.375.442c.038.012.07.03.107.042q.419.167.799.362c.221.11.45.221.665.35a10.873 10.873 0 0 1 2.68 2.202l3.003-2.208c-2.87-3.638-7.375-5.956-12.437-5.956-7.477 0-13.73 5.066-15.308 11.844q-.02.08-.038.172c-.032.147-.057.294-.089.441q-.039.184-.07.369c-.019.104-.031.214-.044.319-.019.153-.044.306-.063.466-.013.116-.02.233-.032.355q-.02.211-.032.43-.018.398-.019.803c0 8.391 7.027 15.194 15.695 15.194 8.173 0 14.877-6.048 15.625-13.764q.039-.148.07-.295c2.863-.178 2.984 0 2.984 0\"\n })));\n};\nexport { SvgLogoGive as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDYiIGhlaWdodD0iNDYiIHZpZXdCb3g9IjAgMCA0NiA0NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0iZ2l2ZS10aXRsZSI+Cjx0aXRsZSBpZD0iZ2l2ZS10aXRsZSI+R2l2ZVdQIGxvZ288L3RpdGxlPgo8cGF0aCBkPSJNMCA5Ljg1NzE0QzAgNC40MTMxOSA0LjQxMzE5IDAgOS44NTcxNCAwSDM2LjE0MjlDNDEuNTg2OCAwIDQ2IDQuNDEzMTkgNDYgOS44NTcxNFYzNi4xNDI5QzQ2IDQxLjU4NjggNDEuNTg2OCA0NiAzNi4xNDI5IDQ2SDkuODU3MTRDNC40MTMxOSA0NiAwIDQxLjU4NjggMCAzNi4xNDI5VjkuODU3MTRaIiBmaWxsPSIjM0Q3QkY1Ii8+CjxwYXRoIGQ9Ik00MS4wNzEzIDIyLjM3MTZDMzYuMTg2MiAyMi41NzQgMzYuODI2MSAyMi41MTg4IDIyLjY1MjMgMjIuNTkyNEMyMi41MTkyIDIyLjU5MjQgMjIuMjUzMSAyMi42NDc2IDIyLjI1MzEgMjIuOTExNEMyMi4yNTMxIDIzLjEzODMgMjIuMjY1OCAyNC44MDY3IDIyLjI3MjEgMjUuMjkxM0MyMi4yNzIxIDI1LjM3MSAyMi4yNDA0IDI1LjQ1MDggMjIuNDQzMiAyNS40NTA4QzIyLjYxNDMgMjUuNDUwOCAyOS40MzgyIDI1LjM4MzMgMzQuMTk2NiAyNC45OTY5QzMzLjM1MzkgMzAuMDg3OSAyOC43OTgzIDMzLjk3NjcgMjMuMzA0OSAzMy45NzY3QzE3LjgxMTUgMzMuOTc2NyAxMi45MiAyOS43OTM1IDEyLjMzMDggMjQuNDMyNkMxMi4zMzA4IDI0LjQwMTkgMTIuMzI0NSAyNC4zNzczIDEyLjMyNDUgMjQuMzQ2N0MxMi4yODY0IDI0LjAwMzIgMTIuMjY3NCAyMy42NDc0IDEyLjI2NzQgMjMuMjk3OEMxMi4yNjc0IDIyLjk2NjYgMTIuMjg2NCAyMi42MzU0IDEyLjMxODEgMjIuMzEwM0MxMi40ODI5IDIwLjcxNTUgMTMuMDI3OCAxOS4xMjA3IDEzLjkyMTIgMTcuNjk3N0MxMy45MzM4IDE3LjY3OTMgMTMuOTQ2NSAxNy42NjA5IDEzLjk1OTIgMTcuNjQyNUMxNC4wOTIyIDE3LjQzMzkgMTQuMjM4IDE3LjIzMTUgMTQuMzgzNyAxNy4wMzUyQzE0LjQ4NTEgMTYuOTAwMyAxNC41ODY0IDE2Ljc1OTIgMTQuNzAwNSAxNi42MzA0QzE0Ljc1NzUgMTYuNTU2OCAxNC44MjA5IDE2LjQ4MzIgMTQuODg0MiAxNi40MDk2QzE2LjY3NzMgMTQuMzYwOSAxOS4yNDk4IDEyLjk2ODUgMjIuMTU4MSAxMi42ODAyQzIyLjUzMTkgMTIuNjQzNCAyMi45MTIxIDEyLjYyNSAyMy4zMDQ5IDEyLjYyNUMyMy42NzI0IDEyLjYyNSAyNC4wMzM1IDEyLjY0OTYgMjQuMzg4NCAxMi42ODY0QzI0LjQ4OTcgMTIuNjk4NiAyNC41ODQ4IDEyLjcwNDggMjQuNjg2MiAxMi43MTdDMjQuOTk2NiAxMi43NTM4IDI1LjMwMDggMTIuODAyOSAyNS41OTg2IDEyLjg2NDJDMjUuNzYzMyAxMi45MDEgMjUuOTE1NCAxMi45Mzc5IDI2LjA3MzggMTIuOTgwOEMyNi4yMDA1IDEzLjAxMTUgMjYuMzMzNSAxMy4wNDgzIDI2LjQ2MDMgMTMuMDg1MUMyNi44MDI0IDEzLjE4MzIgMjcuMTMxOSAxMy4yOTk3IDI3LjQ0ODcgMTMuNDIyNEMyNy40ODY3IDEzLjQzNDcgMjcuNTE4NCAxMy40NTMxIDI3LjU1NjQgMTMuNDY1NEMyNy44MzUyIDEzLjU3NTggMjguMTAxMyAxMy42OTg0IDI4LjM1NDggMTMuODI3MkMyOC41NzY1IDEzLjkzNzcgMjguODA0NiAxNC4wNDgxIDI5LjAyIDE0LjE3NjlDMjkuMDI2NCAxNC4xNzY5IDI5LjAzOTEgMTQuMTgzIDI5LjA0NTQgMTQuMTg5MUMzMC4wNDY1IDE0Ljc3OCAzMC45NDYyIDE1LjUyMDIgMzEuNzAwMiAxNi4zNzg5TDM0LjcwMzUgMTQuMTcwN0MzMS44MzMzIDEwLjUzMzQgMjcuMzI4MyA4LjIxNDg0IDIyLjI2NTggOC4yMTQ4NEMxNC43ODkyIDguMjE0ODQgOC41MzU0OCAxMy4yODEzIDYuOTU3NzkgMjAuMDU5MkM2Ljk0NTEyIDIwLjExNDQgNi45MzI0NSAyMC4xNjk2IDYuOTE5NzcgMjAuMjMwOUM2Ljg4ODA5IDIwLjM3ODEgNi44NjI3NSAyMC41MjUzIDYuODMxMDcgMjAuNjcyNUM2LjgwNTcyIDIwLjc5NTIgNi43ODAzOCAyMC45MTc5IDYuNzYxMzcgMjEuMDQwNkM2Ljc0MjM2IDIxLjE0NDggNi43Mjk2OSAyMS4yNTUzIDYuNzE3MDIgMjEuMzU5NUM2LjY5ODAxIDIxLjUxMjkgNi42NzI2NyAyMS42NjYyIDYuNjUzNjYgMjEuODI1N0M2LjY0MDk5IDIxLjk0MjIgNi42MzQ2NSAyMi4wNTg4IDYuNjIxOTggMjIuMTgxNUM2LjYwOTMxIDIyLjMyMjUgNi41OTY2MyAyMi40NjM2IDYuNTkwMyAyMi42MTA4QzYuNTc3NjMgMjIuODc0NiA2LjU3MTI5IDIzLjE0NDUgNi41NzEyOSAyMy40MTQzQzYuNTcxMjkgMzEuODA1MyAxMy41OTggMzguNjA3NyAyMi4yNjU4IDM4LjYwNzdDMzAuNDM5MyAzOC42MDc3IDM3LjE0MjkgMzIuNTU5OCAzNy44OTA2IDI0Ljg0MzVDMzcuOTE1OSAyNC43NDU0IDM3Ljk0MTMgMjQuNjQ3MiAzNy45NjAzIDI0LjU0OTFDNDAuODI0MiAyNC4zNzEyIDQwLjk0NDYgMjQuNTQ5MSA0MC45NDQ2IDI0LjU0OTEiIGZpbGw9IiNGRUZCRjIiLz4KPC9zdmc+Cg==\";","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoGivewpNobg = function SvgLogoGivewpNobg(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 32,\n height: 32,\n fill: \"none\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M16 5c5.658 0 10.32 4.278 10.93 9.773-2.24.837-5.56 1.749-9.433 1.749 0 0 .013.137.066.26.044.096.132.178.136.182 1.946.24 4.7-.026 6.802-.313-1.204 2.584-3.352 4.316-5.337 4.316-3.697 0-6.562-4.491-6.562-4.491 1.146-1.016 3.04-4.316 5.774-4.316 2.723 0 3.91 1.486 3.919 1.497l.306-.481c-.01-.034-1.29-4.465-4.89-4.465-3.611 0-7.445 5.916-9.69 7.283 0 0 3.085 7.31 9.822 7.31 5.662 0 7.08-5.41 7.347-6.75.755-.11 1.38-.222 1.797-.293q.004-.007.006-.016C26.863 22.205 21.991 27 16 27 9.927 27 5 22.073 5 16S9.927 5 16 5\"\n })), /*#__PURE__*/React.createElement(\"mask\", {\n id: \"logo-givewp-nobg_svg__a\",\n width: 22,\n height: 22,\n x: 5,\n y: 5,\n maskUnits: \"userSpaceOnUse\",\n style: {\n maskType: \"alpha\"\n }\n }, _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n d: \"M27 16c0-6.073-4.927-11-11-11S5 9.927 5 16s4.927 11 11 11 11-4.927 11-11\"\n }))));\n};\nexport { SvgLogoGivewpNobg as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE2IDVDMjEuNjU4MiA1IDI2LjMxOTIgOS4yNzc1NSAyNi45Mjk3IDE0Ljc3MzRDMjQuNjkgMTUuNjA5OCAyMS4zNjk4IDE2LjUyMTUgMTcuNDk3MSAxNi41MjE1QzE3LjQ5NzEgMTYuNTIxNSAxNy41MTA0IDE2LjY1ODYgMTcuNTYyNSAxNi43ODIyQzE3LjYwNyAxNi44Nzc1IDE3LjY5NTIgMTYuOTYwMSAxNy42OTkyIDE2Ljk2MzlDMTkuNjQ1NCAxNy4yMDQ3IDIyLjM5ODYgMTYuOTM3OCAyNC41MDEgMTYuNjUxNEMyMy4yOTcgMTkuMjM1MiAyMS4xNDkyIDIwLjk2NjYgMTkuMTY0MSAyMC45NjY4QzE1LjQ2NyAyMC45NjY4IDEyLjYwMjUgMTYuNDc1NiAxMi42MDI1IDE2LjQ3NTZDMTMuNzQ4MSAxNS40NjAxIDE1LjY0MjQgMTIuMTYwMyAxOC4zNzYgMTIuMTYwMkMyMS4wOTkzIDEyLjE2MDIgMjIuMjg2IDEzLjY0NTkgMjIuMjk0OSAxMy42NTcyTDIyLjYwMDYgMTMuMTc1OEMyMi41OTA5IDEzLjE0MjIgMjEuMzEwNiA4LjcxMDk0IDE3LjcxMTkgOC43MTA5NEMxNC4wOTk2IDguNzExMjcgMTAuMjY2IDE0LjYyNzIgOC4wMjA1MSAxNS45OTQxQzguMDIwNTEgMTUuOTk0MSAxMS4xMDYxIDIzLjMwMzcgMTcuODQyOCAyMy4zMDM3QzIzLjUwNTIgMjMuMzAzNSAyNC45MjM2IDE3Ljg5NDUgMjUuMTkwNCAxNi41NTM3QzI1Ljk0NTUgMTYuNDQzMSAyNi41NzA3IDE2LjMzMjMgMjYuOTg3MyAxNi4yNjA3QzI2Ljk4OTUgMTYuMjU1NyAyNi45OTEgMTYuMjUwMyAyNi45OTMyIDE2LjI0NTFDMjYuODYyNiAyMi4yMDQ3IDIxLjk5MDkgMjcgMTYgMjdDOS45MjcyNCAyNyA1LjAwMDAyIDIyLjA3MjcgNSAxNkM1IDkuOTI3MjQgOS45MjcyMiA1IDE2IDVaIiBmaWxsPSJibGFjayIvPgo8bWFzayBpZD0ibWFzazBfNjVfMjQzOTUiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjUiIHk9IjUiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiI+CjxwYXRoIGQ9Ik0yNyAxNkMyNyA5LjkyNzIgMjIuMDcyOCA1IDE2IDVDOS45MjcyMiA1IDUgOS45MjcyIDUgMTZDNSAyMi4wNzI3IDkuOTI3MjIgMjcgMTYgMjdDMjIuMDcyOCAyNyAyNyAyMi4wNzI3IDI3IDE2WiIgZmlsbD0iYmxhY2siLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzY1XzI0Mzk1KSI+CjwvZz4KPC9zdmc+Cg==\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoKadenceNobg = function SvgLogoKadenceNobg(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 32,\n height: 32,\n fill: \"none\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n fillRule: \"evenodd\",\n d: \"M21.858 25.098h-5.273a1.035 1.035 0 0 1 0-2.069h3.444a1.035 1.035 0 0 0-.071-2.066h-5.39a1.034 1.034 0 0 1 0-2.066h.65v-.001h.966a1.033 1.033 0 0 0 0-2.065h-2.432v-.001H8.65a1.033 1.033 0 0 1 0-2.065h5.102v-.003h1.997a1.032 1.032 0 0 0 0-2.064h-2.576a1.033 1.033 0 0 1 0-2.066h4.898l.072.003h1.752a1.035 1.035 0 0 0 0-2.069H17.32a1.035 1.035 0 0 1 .075-2.066h8.848l-8.375 9.148L28 25.099h-6.115l-.001-.001zm-9.925-2.069a1.031 1.031 0 0 1 0 2.062H8.151a1.031 1.031 0 0 1 0-2.062zm-1.497-4.132a1.034 1.034 0 1 1-.002 2.069 1.034 1.034 0 0 1 .002-2.069m-5.402-4.132a1.034 1.034 0 1 1-.001 2.068 1.034 1.034 0 0 1 0-2.068m4.006-4.133a1.034 1.034 0 1 1 0 2.07 1.034 1.034 0 0 1 0-2.07M12.748 6.5a1.031 1.031 0 0 1 0 2.062h-2.391a1.031 1.031 0 0 1 0-2.062z\",\n clipRule: \"evenodd\"\n })));\n};\nexport { SvgLogoKadenceNobg as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yMS44NTc5IDI1LjA5ODRIMTYuNTg1QzE2LjAxNDEgMjUuMDk4NCAxNS41NTA2IDI0LjYzNDggMTUuNTUwNiAyNC4wNjM4QzE1LjU1MDYgMjMuNDkzIDE2LjAxNDEgMjMuMDI5NCAxNi41ODUgMjMuMDI5NEgyMC4wMjk0QzIwLjU2NjkgMjIuOTkyNSAyMC45OTIgMjIuNTQ0MyAyMC45OTIgMjEuOTk3NkMyMC45OTIgMjEuNDI2NiAyMC41Mjg2IDIwLjk2MzIgMTkuOTU3NiAyMC45NjMySDE3LjQzOTRWMjAuOTYzMUgxNC41Njc5QzEzLjk5NzggMjAuOTYzMSAxMy41MzQ5IDIwLjUwMDIgMTMuNTM0OSAxOS45MzAyQzEzLjUzNDkgMTkuMzYgMTMuOTk3OCAxOC44OTcgMTQuNTY3OSAxOC44OTdIMTUuMjE4NUwxNS4yMTcxIDE4Ljg5NThIMTYuMTg0NEMxNi43NTQzIDE4Ljg5NTggMTcuMjE2OSAxOC40MzMyIDE3LjIxNjkgMTcuODYzM0MxNy4yMTY5IDE3LjI5MzUgMTYuNzU0MyAxNi44MzA5IDE2LjE4NDQgMTYuODMwOUgxMy43NTE2VjE2LjgyOTlIOC42NDk5MkM4LjA4MDA5IDE2LjgyOTkgNy42MTczNCAxNi4zNjcyIDcuNjE3MzQgMTUuNzk3M0M3LjYxNzM0IDE1LjIyNzQgOC4wODAwOSAxNC43NjQ3IDguNjQ5OTIgMTQuNzY0N0gxMy43NTE2VjE0Ljc2MThIMTUuNzQ5MUMxNi4zMTg0IDE0Ljc2MTggMTYuNzgwNyAxNC4yOTk2IDE2Ljc4MDcgMTMuNzMwMkMxNi43ODA3IDEzLjE2MDggMTYuMzE4NCAxMi42OTg1IDE1Ljc0OTEgMTIuNjk4NUgxNS4yOTM4TDE1LjI5MzkgMTIuNjk4NEgxMy4xNzI2QzEyLjYwMjQgMTIuNjk4NCAxMi4xMzk2IDEyLjIzNTUgMTIuMTM5NiAxMS42NjU0QzEyLjEzOTYgMTEuMDk1MyAxMi42MDI0IDEwLjYzMjMgMTMuMTcyNiAxMC42MzIzSDE4LjA3MUMxOC4wOTU0IDEwLjYzMjMgMTguMTE5NSAxMC42MzMyIDE4LjE0MzUgMTAuNjM0OEgxOS44OTQ1QzIwLjQ2NTMgMTAuNjM0OCAyMC45Mjg3IDEwLjE3MTQgMjAuOTI4NyA5LjYwMDUxQzIwLjkyODcgOS4wMjk2MiAyMC40NjUzIDguNTY2MTggMTkuODk0NSA4LjU2NjE4SDE3LjMyMDZDMTYuNzg1IDguNTI3MzMgMTYuMzYxOSA4LjA3OTg4IDE2LjM2MTkgNy41MzQ0NEMxNi4zNjE5IDYuOTYzNTUgMTYuODI1NCA2LjUgMTcuMzk2NCA2LjVIMjEuNDUwN0MyMS40NTUyIDYuNSAyMS40NTk2IDYuNSAyMS40NjQ0IDYuNTAwMTFIMjYuMjQ0OUwxNy44Njg2IDE1LjY0NzdMMjggMjUuMDk5M0gyMS44ODUzTDIxLjg4MzkgMjUuMDk3OUMyMS44NzUzIDI1LjA5ODIgMjEuODY2NyAyNS4wOTg0IDIxLjg1NzkgMjUuMDk4NFpNMTEuOTMzMSAyMy4wMjk0QzEyLjUwMiAyMy4wMjk0IDEyLjk2MzkgMjMuNDkxMyAxMi45NjM5IDI0LjA2MDFDMTIuOTYzOSAyNC42MjkxIDEyLjUwMiAyNS4wOTA4IDExLjkzMzEgMjUuMDkwOEg4LjE1MDUyQzcuNTgxNjkgMjUuMDkwOCA3LjExOTgxIDI0LjYyOTEgNy4xMTk4MSAyNC4wNjAxQzcuMTE5ODEgMjMuNDkxMyA3LjU4MTY5IDIzLjAyOTQgOC4xNTA1MiAyMy4wMjk0SDExLjkzMzFaTTEwLjQzNTYgMTguODk3QzExLjAwNjIgMTguODk3IDExLjQ2OTQgMTkuMzYwMyAxMS40Njk0IDE5LjkzMUMxMS40Njk0IDIwLjUwMTQgMTEuMDA2MiAyMC45NjQ4IDEwLjQzNTYgMjAuOTY0OEM5Ljg2NDk0IDIwLjk2NDggOS40MDE2OSAyMC41MDE0IDkuNDAxNjkgMTkuOTMxQzkuNDAxNjkgMTkuMzYwMyA5Ljg2NDk0IDE4Ljg5NyAxMC40MzU2IDE4Ljg5N1pNNS4wMzM4IDE0Ljc2NDdDNS42MDQ0NyAxNC43NjQ3IDYuMDY3NzEgMTUuMjI3OSA2LjA2NzcxIDE1Ljc5ODZDNi4wNjc3MSAxNi4zNjkyIDUuNjA0NDcgMTYuODMyNCA1LjAzMzggMTYuODMyNEM0LjQ2MzI1IDE2LjgzMjQgNCAxNi4zNjkyIDQgMTUuNzk4NkM0IDE1LjIyNzkgNC40NjMyNSAxNC43NjQ3IDUuMDMzOCAxNC43NjQ3Wk05LjA0MDMxIDEwLjYzMjNDOS42MTA4OSAxMC42MzIzIDEwLjA3NDIgMTEuMDk1NiAxMC4wNzQyIDExLjY2NjJDMTAuMDc0MiAxMi4yMzY4IDkuNjEwODkgMTIuNzAwMSA5LjA0MDMxIDEyLjcwMDFDOC40Njk3NSAxMi43MDAxIDguMDA2NCAxMi4yMzY4IDguMDA2NCAxMS42NjYyQzguMDA2NCAxMS4wOTU2IDguNDY5NzUgMTAuNjMyMyA5LjA0MDMxIDEwLjYzMjNaTTEyLjc0OCA2LjVDMTMuMzE2OSA2LjUgMTMuNzc4NyA2Ljk2MTg4IDEzLjc3ODcgNy41MzA3MUMxMy43Nzg3IDguMDk5NjMgMTMuMzE2OSA4LjU2MTUxIDEyLjc0OCA4LjU2MTUxSDEwLjM1N0M5Ljc4ODE5IDguNTYxNTEgOS4zMjYyOCA4LjA5OTYzIDkuMzI2MjggNy41MzA3MUM5LjMyNjI4IDYuOTYxODggOS43ODgwOCA2LjUgMTAuMzU3IDYuNUgxMi43NDhaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K\";","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoKadence = function SvgLogoKadence(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 46,\n height: 46,\n fill: \"none\",\n \"aria-labelledby\": \"kadence-title\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#3D7BF5\",\n d: \"M0 9.857C0 4.413 4.413 0 9.857 0H36.14C41.585 0 46 4.413 46 9.857v26.286C46 41.587 41.585 46 36.141 46H9.857C4.413 46 0 41.587 0 36.143z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FEFBF2\",\n fillRule: \"evenodd\",\n d: \"M30.808 36.142H23.41a1.457 1.457 0 0 1-1.451-1.462c0-.807.65-1.462 1.451-1.462h4.833a1.46 1.46 0 0 0 1.351-1.458c0-.807-.65-1.462-1.451-1.462h-7.564c-.8 0-1.449-.654-1.449-1.46s.65-1.46 1.45-1.46h.913l-.002-.002h1.357c.8 0 1.449-.654 1.449-1.46s-.65-1.458-1.449-1.458h-3.414v-.002h-7.158c-.8 0-1.45-.654-1.45-1.459s.65-1.46 1.45-1.46h7.158v-.003h2.803c.8 0 1.448-.654 1.448-1.458 0-.805-.649-1.458-1.448-1.458h-3.615c-.8 0-1.45-.655-1.45-1.46 0-.806.65-1.46 1.45-1.46h6.873q.052 0 .102.003h2.457c.801 0 1.451-.655 1.451-1.462s-.65-1.462-1.45-1.462H24.44a1.46 1.46 0 0 1-1.345-1.458c0-.807.65-1.462 1.452-1.462h12.416L25.21 22.787l14.217 13.357h-8.58l-.002-.002zm-13.926-2.924c.798 0 1.446.653 1.446 1.457s-.648 1.456-1.447 1.456h-5.307a1.45 1.45 0 0 1-1.446-1.456c0-.804.648-1.457 1.446-1.457zm-2.102-5.84c.8 0 1.451.654 1.451 1.461 0 .806-.65 1.461-1.45 1.461-.802 0-1.452-.655-1.452-1.461 0-.807.65-1.461 1.451-1.461m-7.58-5.84c.801 0 1.451.654 1.451 1.46 0 .807-.65 1.462-1.45 1.462-.801 0-1.451-.655-1.451-1.461 0-.807.65-1.461 1.45-1.461m5.622-5.84c.801 0 1.451.654 1.451 1.46 0 .807-.65 1.462-1.45 1.462-.801 0-1.451-.655-1.451-1.461 0-.807.65-1.461 1.45-1.461m5.203-5.84c.798 0 1.446.652 1.446 1.456s-.648 1.457-1.446 1.457H14.67a1.45 1.45 0 0 1-1.446-1.457c0-.804.648-1.457 1.446-1.457z\",\n clipRule: \"evenodd\"\n })));\n};\nexport { SvgLogoKadence as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDYiIGhlaWdodD0iNDYiIHZpZXdCb3g9IjAgMCA0NiA0NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0ia2FkZW5jZS10aXRsZSI+Cjx0aXRsZSBpZD0ia2FkZW5jZS10aXRsZSI+S2FkZW5jZSBsb2dvPC90aXRsZT4KPHBhdGggZD0iTTAgOS44NTcxNEMwIDQuNDEzMTkgNC40MTI5OSAwIDkuODU2NyAwSDM2LjE0MTJDNDEuNTg0OSAwIDQ2IDQuNDEzMTkgNDYgOS44NTcxNFYzNi4xNDI5QzQ2IDQxLjU4NjggNDEuNTg0OSA0NiAzNi4xNDEyIDQ2SDkuODU2N0M0LjQxMjk5IDQ2IDAgNDEuNTg2OCAwIDM2LjE0MjlWOS44NTcxNFoiIGZpbGw9IiMzRDdCRjUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zMC44MDgyIDM2LjE0MTlIMjMuNDA5MkMyMi42MDggMzYuMTQxOSAyMS45NTc3IDM1LjQ4NjcgMjEuOTU3NyAzNC42Nzk4QzIxLjk1NzcgMzMuODczMSAyMi42MDggMzMuMjE3OSAyMy40MDkyIDMzLjIxNzlIMjguMjQyM0MyOC45OTY2IDMzLjE2NTggMjkuNTkzMiAzMi41MzI0IDI5LjU5MzIgMzEuNzU5N0MyOS41OTMyIDMwLjk1MjggMjguOTQyOCAzMC4yOTc4IDI4LjE0MTYgMzAuMjk3OEgyNC42MDhWMzAuMjk3NkgyMC41Nzg3QzE5Ljc3ODcgMzAuMjk3NiAxOS4xMjkyIDI5LjY0MzUgMTkuMTI5MiAyOC44Mzc4QzE5LjEyOTIgMjguMDMyMSAxOS43Nzg3IDI3LjM3NzggMjAuNTc4NyAyNy4zNzc4SDIxLjQ5MTdMMjEuNDg5OCAyNy4zNzZIMjIuODQ3MUMyMy42NDY3IDI3LjM3NiAyNC4yOTU5IDI2LjcyMjIgMjQuMjk1OSAyNS45MTY4QzI0LjI5NTkgMjUuMTExNSAyMy42NDY3IDI0LjQ1NzcgMjIuODQ3MSAyNC40NTc3SDE5LjQzMzNWMjQuNDU2NEgxMi4yNzQ2QzExLjQ3NSAyNC40NTY0IDEwLjgyNTcgMjMuODAyNSAxMC44MjU3IDIyLjk5N0MxMC44MjU3IDIyLjE5MTYgMTEuNDc1IDIxLjUzNzYgMTIuMjc0NiAyMS41Mzc2SDE5LjQzMzNWMjEuNTMzNkgyMi4yMzYzQzIzLjAzNTEgMjEuNTMzNiAyMy42ODM3IDIwLjg4MDMgMjMuNjgzNyAyMC4wNzU2QzIzLjY4MzcgMTkuMjcwOSAyMy4wMzUxIDE4LjYxNzcgMjIuMjM2MyAxOC42MTc3SDIxLjU5NzNMMjEuNTk3NSAxOC42MTc0SDE4LjYyMDhDMTcuODIwOCAxOC42MTc0IDE3LjE3MTQgMTcuOTYzMiAxNy4xNzE0IDE3LjE1NzZDMTcuMTcxNCAxNi4zNTE3IDE3LjgyMDggMTUuNjk3NiAxOC42MjA4IDE1LjY5NzZIMjUuNDk0M0MyNS41Mjg2IDE1LjY5NzYgMjUuNTYyNSAxNS42OTg3IDI1LjU5NjEgMTUuNzAxMUgyOC4wNTMxQzI4Ljg1NCAxNS43MDExIDI5LjUwNDQgMTUuMDQ2MSAyOS41MDQ0IDE0LjIzOTJDMjkuNTA0NCAxMy40MzI0IDI4Ljg1NCAxMi43Nzc1IDI4LjA1MzEgMTIuNzc3NUgyNC40NDE0QzIzLjY4OTcgMTIuNzIyNiAyMy4wOTYyIDEyLjA5MDMgMjMuMDk2MiAxMS4zMTk0QzIzLjA5NjIgMTAuNTEyNSAyMy43NDY1IDkuODU3NDIgMjQuNTQ3NiA5Ljg1NzQySDMwLjIzNjhDMzAuMjQzMSA5Ljg1NzQyIDMwLjI0OTIgOS44NTc0MiAzMC4yNTYgOS44NTc1NUgzNi45NjM5TDI1LjIxMDMgMjIuNzg1NkwzOS40MjY4IDM2LjE0MzFIMzAuODQ2NkwzMC44NDQ2IDM2LjE0MTJDMzAuODMyNiAzNi4xNDE3IDMwLjgyMDQgMzYuMTQxOSAzMC44MDgyIDM2LjE0MTlaTTE2Ljg4MTUgMzMuMjE3OUMxNy42Nzk4IDMzLjIxNzkgMTguMzI3OSAzMy44NzA3IDE4LjMyNzkgMzQuNjc0NkMxOC4zMjc5IDM1LjQ3ODcgMTcuNjc5OCAzNi4xMzEzIDE2Ljg4MTUgMzYuMTMxM0gxMS41NzM5QzEwLjc3NTcgMzYuMTMxMyAxMC4xMjc2IDM1LjQ3ODcgMTAuMTI3NiAzNC42NzQ2QzEwLjEyNzYgMzMuODcwNyAxMC43NzU3IDMzLjIxNzkgMTEuNTczOSAzMy4yMTc5SDE2Ljg4MTVaTTE0Ljc4MDMgMjcuMzc3OEMxNS41ODA5IDI3LjM3NzggMTYuMjMxIDI4LjAzMjQgMTYuMjMxIDI4LjgzOUMxNi4yMzEgMjkuNjQ1MiAxNS41ODA5IDMwLjMgMTQuNzgwMyAzMC4zQzEzLjk3OTUgMzAuMyAxMy4zMjk1IDI5LjY0NTIgMTMuMzI5NSAyOC44MzlDMTMuMzI5NSAyOC4wMzI0IDEzLjk3OTUgMjcuMzc3OCAxNC43ODAzIDI3LjM3NzhaTTcuMjAwNDIgMjEuNTM3NkM4LjAwMTIgMjEuNTM3NiA4LjY1MTIyIDIyLjE5MjMgOC42NTEyMiAyMi45OTg4QzguNjUxMjIgMjMuODA1MiA4LjAwMTIgMjQuNDU5OSA3LjIwMDQyIDI0LjQ1OTlDNi4zOTk3OCAyNC40NTk5IDUuNzQ5NzYgMjMuODA1MiA1Ljc0OTc2IDIyLjk5ODhDNS43NDk3NiAyMi4xOTIzIDYuMzk5NzggMjEuNTM3NiA3LjIwMDQyIDIxLjUzNzZaTTEyLjgyMjQgMTUuNjk3NkMxMy42MjMxIDE1LjY5NzYgMTQuMjczMiAxNi4zNTIzIDE0LjI3MzIgMTcuMTU4OEMxNC4yNzMyIDE3Ljk2NTIgMTMuNjIzMSAxOC42MTk3IDEyLjgyMjQgMTguNjE5N0MxMi4wMjE4IDE4LjYxOTcgMTEuMzcxNiAxNy45NjUyIDExLjM3MTYgMTcuMTU4OEMxMS4zNzE2IDE2LjM1MjMgMTIuMDIxOCAxNS42OTc2IDEyLjgyMjQgMTUuNjk3NlpNMTguMDI1IDkuODU3NDJDMTguODIzNCA5Ljg1NzQyIDE5LjQ3MTQgMTAuNTEwMiAxOS40NzE0IDExLjMxNDFDMTkuNDcxNCAxMi4xMTgyIDE4LjgyMzQgMTIuNzcwOSAxOC4wMjUgMTIuNzcwOUgxNC42N0MxMy44NzE4IDEyLjc3MDkgMTMuMjIzNyAxMi4xMTgyIDEzLjIyMzcgMTEuMzE0MUMxMy4yMjM3IDEwLjUxMDIgMTMuODcxNyA5Ljg1NzQyIDE0LjY3IDkuODU3NDJIMTguMDI1WiIgZmlsbD0iI0ZFRkJGMiIvPgo8L3N2Zz4K\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoLearndashNobg = function SvgLogoLearndashNobg(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 32,\n height: 32,\n fill: \"none\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#1E1E1E\",\n d: \"M16 9.83c-.303-.002-.604.06-.884.182s-.534.3-.749.526a2.4 2.4 0 0 0-.5.788 2.5 2.5 0 0 0-.174.93v14.032c.004.118.05.23.129.313.079.084.186.132.298.135a4.1 4.1 0 0 0 2.958-1.292 4.53 4.53 0 0 0 1.228-3.113V12.256a2.5 2.5 0 0 0-.174-.93 2.4 2.4 0 0 0-.5-.788 2.3 2.3 0 0 0-.749-.526A2.2 2.2 0 0 0 16 9.83M9.306 16.687c-.303-.001-.603.061-.883.183-.28.121-.535.3-.749.526a2.4 2.4 0 0 0-.5.788c-.115.294-.175.61-.174.93v7.437c.003.118.05.23.128.314.08.083.186.131.298.135a4.1 4.1 0 0 0 2.958-1.293 4.53 4.53 0 0 0 1.229-3.112v-3.482c0-.319-.059-.635-.175-.93a2.4 2.4 0 0 0-.5-.787 2.3 2.3 0 0 0-.748-.526 2.2 2.2 0 0 0-.884-.184M22.694 4c-.303 0-.604.062-.884.183-.28.122-.534.3-.749.526a2.4 2.4 0 0 0-.5.788c-.115.295-.174.61-.174.93v20.02c.003.117.05.23.128.313.08.083.186.131.298.134a4.1 4.1 0 0 0 2.959-1.292A4.53 4.53 0 0 0 25 22.49V6.427c0-.32-.059-.635-.174-.93a2.4 2.4 0 0 0-.5-.788 2.3 2.3 0 0 0-.749-.526A2.2 2.2 0 0 0 22.694 4\"\n })));\n};\nexport { SvgLogoLearndashNobg as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE1Ljk5OTcgOS44MjkxMUMxNS42OTY3IDkuODI4NDEgMTUuMzk2NSA5Ljg5MDcgMTUuMTE2MyAxMC4wMTI0QzE0LjgzNjIgMTAuMTM0MSAxNC41ODE3IDEwLjMxMjggMTQuMzY3NCAxMC41MzgzQzE0LjE1MzEgMTAuNzYzOCAxMy45ODMzIDExLjAzMTUgMTMuODY3NiAxMS4zMjYzQzEzLjc1MTkgMTEuNjIxIDEzLjY5MjcgMTEuOTM2OSAxMy42OTM0IDEyLjI1NTdWMjYuMjg3OEMxMy42OTY1IDI2LjQwNTcgMTMuNzQyNCAyNi41MTc4IDEzLjgyMTcgMjYuNjAxMkMxMy45MDA5IDI2LjY4NDYgMTQuMDA3NSAyNi43MzI5IDE0LjExOTUgMjYuNzM2MkMxNS4yMjkzIDI2LjczNDEgMTYuMjkzIDI2LjI2OTQgMTcuMDc3NyAyNS40NDM4QzE3Ljg2MjQgMjQuNjE4MiAxOC4zMDQxIDIzLjQ5OSAxOC4zMDYxIDIyLjMzMTRWMTIuMjU1N0MxOC4zMDY4IDExLjkzNjkgMTguMjQ3NiAxMS42MjEgMTguMTMxOSAxMS4zMjYzQzE4LjAxNjIgMTEuMDMxNSAxNy44NDY0IDEwLjc2MzggMTcuNjMyMSAxMC41MzgzQzE3LjQxNzggMTAuMzEyOCAxNy4xNjMzIDEwLjEzNDEgMTYuODgzMSAxMC4wMTI0QzE2LjYwMyA5Ljg5MDcgMTYuMzAyOCA5LjgyODQxIDE1Ljk5OTcgOS44MjkxMVoiIGZpbGw9IiMxRTFFMUUiLz4KPHBhdGggZD0iTTkuMzA2MzggMTYuNjg2NUM5LjAwMzMyIDE2LjY4NTggOC43MDMxMSAxNi43NDgxIDguNDIyOTkgMTYuODY5OEM4LjE0Mjg3IDE2Ljk5MTUgNy44ODgzNSAxNy4xNzAyIDcuNjc0MDUgMTcuMzk1N0M3LjQ1OTc2IDE3LjYyMTIgNy4yODk4OSAxNy44ODkgNy4xNzQyMiAxOC4xODM3QzcuMDU4NTUgMTguNDc4NCA2Ljk5OTM0IDE4Ljc5NDMgNy4wMDAwMSAxOS4xMTMxVjI2LjU1MTJDNy4wMDMxNiAyNi42NjkxIDcuMDQ5MDggMjYuNzgxMiA3LjEyODMzIDI2Ljg2NDZDNy4yMDc1OCAyNi45NDggNy4zMTQxNSAyNi45OTYzIDcuNDI2MTggMjYuOTk5NkM4LjUzNTkyIDI2Ljk5NzUgOS41OTk2NCAyNi41MzI4IDEwLjM4NDMgMjUuNzA3MkMxMS4xNjkxIDI0Ljg4MTYgMTEuNjEwOCAyMy43NjI0IDExLjYxMjggMjIuNTk0OFYxOS4xMTMxQzExLjYxMzQgMTguNzk0MyAxMS41NTQyIDE4LjQ3ODQgMTEuNDM4NSAxOC4xODM3QzExLjMyMjkgMTcuODg5IDExLjE1MyAxNy42MjEyIDEwLjkzODcgMTcuMzk1N0MxMC43MjQ0IDE3LjE3MDIgMTAuNDY5OSAxNi45OTE1IDEwLjE4OTggMTYuODY5OEM5LjkwOTY2IDE2Ljc0ODEgOS42MDk0NSAxNi42ODU4IDkuMzA2MzggMTYuNjg2NVoiIGZpbGw9IiMxRTFFMUUiLz4KPHBhdGggZD0iTTIyLjY5MzYgNC4wMDAwMUMyMi4zOTA1IDMuOTk5MzEgMjIuMDkwMyA0LjA2MTYgMjEuODEwMiA0LjE4MzNDMjEuNTMwMSA0LjMwNTAxIDIxLjI3NTYgNC40ODM3MiAyMS4wNjEzIDQuNzA5MTlDMjAuODQ3IDQuOTM0NjYgMjAuNjc3MSA1LjIwMjQ1IDIwLjU2MTQgNS40OTcxN0MyMC40NDU4IDUuNzkxODkgMjAuMzg2NiA2LjEwNzc1IDIwLjM4NzIgNi40MjY2MVYyNi40NDYxQzIwLjM5MDQgMjYuNTY0IDIwLjQzNjMgMjYuNjc2MSAyMC41MTU1IDI2Ljc1OTVDMjAuNTk0OCAyNi44NDI5IDIwLjcwMTQgMjYuODkxMiAyMC44MTM0IDI2Ljg5NDVDMjEuOTIzMSAyNi44OTI0IDIyLjk4NjggMjYuNDI3NyAyMy43NzE2IDI1LjYwMjFDMjQuNTU2MyAyNC43NzY1IDI0Ljk5OCAyMy42NTczIDI1IDIyLjQ4OTdWNi40MjY2MUMyNS4wMDA2IDYuMTA3NzUgMjQuOTQxNCA1Ljc5MTg5IDI0LjgyNTggNS40OTcxN0MyNC43MTAxIDUuMjAyNDUgMjQuNTQwMiA0LjkzNDY2IDI0LjMyNTkgNC43MDkxOUMyNC4xMTE2IDQuNDgzNzIgMjMuODU3MSA0LjMwNTAxIDIzLjU3NyA0LjE4MzNDMjMuMjk2OSA0LjA2MTYgMjIuOTk2NyAzLjk5OTMxIDIyLjY5MzYgNC4wMDAwMVoiIGZpbGw9IiMxRTFFMUUiLz4KPC9zdmc+Cg==\";","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoLearndash = function SvgLogoLearndash(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 46,\n height: 46,\n fill: \"none\",\n \"aria-labelledby\": \"learndash-title\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#3D7BF5\",\n d: \"M0 9.857C0 4.413 4.413 0 9.857 0H36.14C41.585 0 46 4.413 46 9.857v26.286C46 41.587 41.585 46 36.141 46H9.857C4.413 46 0 41.587 0 36.143z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FEFBF2\",\n d: \"M22.67 16.099c-.388-.001-.773.079-1.133.235-.359.156-.685.385-.96.674s-.492.633-.64 1.01a3.3 3.3 0 0 0-.224 1.193V37.21a.6.6 0 0 0 .165.402.55.55 0 0 0 .381.173c1.423-.002 2.787-.599 3.793-1.657a5.81 5.81 0 0 0 1.575-3.992V19.21c.001-.409-.075-.814-.223-1.192a3.1 3.1 0 0 0-.641-1.01 2.9 2.9 0 0 0-.96-.675 2.8 2.8 0 0 0-1.133-.235M12.814 23.984c-.389 0-.774.083-1.133.246s-.685.402-.96.703c-.275.302-.493.66-.64 1.055a3.5 3.5 0 0 0-.224 1.243v9.953a.65.65 0 0 0 .164.42.54.54 0 0 0 .382.18c1.423-.002 2.787-.624 3.793-1.73 1.006-1.104 1.572-2.601 1.575-4.164v-4.659c0-.426-.075-.849-.224-1.243a3.3 3.3 0 0 0-.64-1.055 2.95 2.95 0 0 0-.96-.703 2.7 2.7 0 0 0-1.133-.246M32.527 8.214c-.389-.001-.773.08-1.133.237-.359.157-.685.388-.96.679a3.2 3.2 0 0 0-.64 1.018 3.3 3.3 0 0 0-.224 1.2v25.858a.61.61 0 0 0 .165.405c.101.108.238.17.381.174 1.423-.003 2.787-.603 3.793-1.67s1.572-2.511 1.575-4.02V11.349c0-.412-.075-.82-.223-1.2a3.2 3.2 0 0 0-.641-1.018 2.95 2.95 0 0 0-.96-.68 2.8 2.8 0 0 0-1.133-.236\"\n })));\n};\nexport { SvgLogoLearndash as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDYiIGhlaWdodD0iNDYiIHZpZXdCb3g9IjAgMCA0NiA0NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0ibGVhcm5kYXNoLXRpdGxlIj4KPHRpdGxlIGlkPSJsZWFybmRhc2gtdGl0bGUiPkxlYXJuRGFzaCBsb2dvPC90aXRsZT4KPHBhdGggZD0iTTAgOS44NTcxNEMwIDQuNDEzMTkgNC40MTMwMSAwIDkuODU2NzQgMEgzNi4xNDE0QzQxLjU4NTEgMCA0NiA0LjQxMzE5IDQ2IDkuODU3MTRWMzYuMTQyOUM0NiA0MS41ODY4IDQxLjU4NTEgNDYgMzYuMTQxNCA0Nkg5Ljg1Njc0QzQuNDEzMDEgNDYgMCA0MS41ODY4IDAgMzYuMTQyOVY5Ljg1NzE0WiIgZmlsbD0iIzNEN0JGNSIvPgo8cGF0aCBkPSJNMjIuNjcwMSAxNi4wOTg2QzIyLjI4MTYgMTYuMDk3NyAyMS44OTY3IDE2LjE3NzYgMjEuNTM3NSAxNi4zMzM3QzIxLjE3ODQgMTYuNDg5OCAyMC44NTIxIDE2LjcxOTEgMjAuNTc3MyAxNy4wMDgzQzIwLjMwMjYgMTcuMjk3NSAyMC4wODQ4IDE3LjY0MDkgMTkuOTM2NSAxOC4wMTg5QzE5Ljc4ODIgMTguMzk3IDE5LjcxMjMgMTguODAyMSAxOS43MTMxIDE5LjIxMTFWMzcuMjA5MUMxOS43MTcyIDM3LjM2MDMgMTkuNzc2MSAzNy41MDQxIDE5Ljg3NzcgMzcuNjExMUMxOS45NzkzIDM3LjcxOCAyMC4xMTU5IDM3Ljc4IDIwLjI1OTUgMzcuNzg0MlYzNy43ODQyQzIxLjY4MjMgMzcuNzgxNiAyMy4wNDYxIDM3LjE4NTUgMjQuMDUyMiAzNi4xMjY1QzI1LjA1ODIgMzUuMDY3NSAyNS42MjQ2IDMzLjYzMjEgMjUuNjI3MSAzMi4xMzQ1VjE5LjIxMTFDMjUuNjI4IDE4LjgwMjEgMjUuNTUyMSAxOC4zOTcgMjUuNDAzOCAxOC4wMTg5QzI1LjI1NTUgMTcuNjQwOSAyNS4wMzc3IDE3LjI5NzUgMjQuNzYyOSAxNy4wMDgzQzI0LjQ4ODIgMTYuNzE5MSAyNC4xNjE5IDE2LjQ4OTggMjMuODAyNyAxNi4zMzM3QzIzLjQ0MzYgMTYuMTc3NiAyMy4wNTg3IDE2LjA5NzcgMjIuNjcwMSAxNi4wOTg2VjE2LjA5ODZaIiBmaWxsPSIjRkVGQkYyIi8+CjxwYXRoIGQ9Ik0xMi44MTM3IDIzLjk4NDRDMTIuNDI1MSAyMy45ODM1IDEyLjA0MDIgMjQuMDY2OCAxMS42ODExIDI0LjIyOTdDMTEuMzIyIDI0LjM5MjUgMTAuOTk1NiAyNC42MzE2IDEwLjcyMDkgMjQuOTMzM0MxMC40NDYxIDI1LjIzNSAxMC4yMjg0IDI1LjU5MzQgMTAuMDgwMSAyNS45ODc3QzkuOTMxNzYgMjYuMzgyMSA5Ljg1NTg1IDI2LjgwNDggOS44NTY3IDI3LjIzMTRWMzcuMTg0M0M5Ljg2MDc0IDM3LjM0MiA5LjkxOTYxIDM3LjQ5MjEgMTAuMDIxMiAzNy42MDM3QzEwLjEyMjggMzcuNzE1MiAxMC4yNTk1IDM3Ljc3OTkgMTAuNDAzMSAzNy43ODQzVjM3Ljc4NDNDMTEuODI1OSAzNy43ODE1IDEzLjE4OTcgMzcuMTU5NiAxNC4xOTU3IDM2LjA1NDlDMTUuMjAxOCAzNC45NTAxIDE1Ljc2ODEgMzMuNDUyNiAxNS43NzA3IDMxLjg5MDJWMjcuMjMxNEMxNS43NzE1IDI2LjgwNDggMTUuNjk1NiAyNi4zODIxIDE1LjU0NzMgMjUuOTg3N0MxNS4zOTkgMjUuNTkzNCAxNS4xODEyIDI1LjIzNSAxNC45MDY1IDI0LjkzMzNDMTQuNjMxNyAyNC42MzE2IDE0LjMwNTQgMjQuMzkyNSAxMy45NDYzIDI0LjIyOTdDMTMuNTg3MSAyNC4wNjY4IDEzLjIwMjIgMjMuOTgzNSAxMi44MTM3IDIzLjk4NDRWMjMuOTg0NFoiIGZpbGw9IiNGRUZCRjIiLz4KPHBhdGggZD0iTTMyLjUyNzEgOC4yMTM4N0MzMi4xMzg1IDguMjEyOTggMzEuNzUzNiA4LjI5MzQzIDMxLjM5NDUgOC40NTA2M0MzMS4wMzUzIDguNjA3ODIgMzAuNzA5IDguODM4NjYgMzAuNDM0MyA5LjEyOTg4QzMwLjE1OTUgOS40MjExMSAyOS45NDE3IDkuNzY2OTggMjkuNzkzNCAxMC4xNDc3QzI5LjY0NTEgMTAuNTI4MyAyOS41NjkyIDEwLjkzNjMgMjkuNTcwMSAxMS4zNDgyVjM3LjIwNkMyOS41NzQxIDM3LjM1ODIgMjkuNjMzIDM3LjUwMzEgMjkuNzM0NiAzNy42MTA4QzI5LjgzNjIgMzcuNzE4NSAyOS45NzI4IDM3Ljc4MDkgMzAuMTE2NSAzNy43ODUyQzMxLjUzOTMgMzcuNzgyNCAzMi45MDMxIDM3LjE4MjIgMzMuOTA5MSAzNi4xMTU4QzM0LjkxNTIgMzUuMDQ5NCAzNS40ODE1IDMzLjYwMzggMzUuNDg0MSAzMi4wOTU3VjExLjM0ODJDMzUuNDg0OSAxMC45MzYzIDM1LjQwOSAxMC41MjgzIDM1LjI2MDcgMTAuMTQ3N0MzNS4xMTI0IDkuNzY2OTggMzQuODk0NiA5LjQyMTExIDM0LjYxOTkgOS4xMjk4OEMzNC4zNDUxIDguODM4NjYgMzQuMDE4OCA4LjYwNzgyIDMzLjY1OTcgOC40NTA2M0MzMy4zMDA1IDguMjkzNDMgMzIuOTE1NiA4LjIxMjk4IDMyLjUyNzEgOC4yMTM4N1Y4LjIxMzg3WiIgZmlsbD0iI0ZFRkJGMiIvPgo8L3N2Zz4K\";","var _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoLw = function SvgLogoLw(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 103,\n height: 23\n }, props), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#041C1E\",\n fillRule: \"evenodd\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M0 14.754c0 .138.111.25.249.25h9.63a.25.25 0 0 0 .248-.25V13.27a.25.25 0 0 0-.248-.25H2.337V.25A.25.25 0 0 0 2.09 0H.249A.25.25 0 0 0 0 .25zM11.554 2.63c0 .138.111.25.249.25h1.806a.25.25 0 0 0 .249-.25V.508a.25.25 0 0 0-.249-.25h-1.806a.25.25 0 0 0-.249.25zm.037 12.124c0 .138.11.25.248.25h1.763a.25.25 0 0 0 .249-.25V4.494a.25.25 0 0 0-.25-.252H11.84a.25.25 0 0 0-.248.251zm14.575-10.26a.25.25 0 0 0-.25-.252h-1.711a.25.25 0 0 0-.249.251v.939c-.591-.759-1.644-1.423-3.363-1.423s-2.62.474-3.519 1.43c-.89.956-1.412 2.362-1.412 4.192s.521 3.225 1.412 4.181 2.133 1.43 3.519 1.43 2.738-.654 3.313-1.361v4.913c0 .14.11.25.248.25h1.763a.25.25 0 0 0 .249-.25zm11.701 0a.25.25 0 0 0-.248-.252h-1.763a.25.25 0 0 0-.249.251v5.923c0 1.01-.326 1.733-.82 2.207-.498.474-1.174.725-1.928.725-.753 0-1.19-.173-1.54-.492-.35-.318-.573-.827-.573-1.578V4.49a.25.25 0 0 0-.248-.25h-1.763a.25.25 0 0 0-.249.25v6.899c0 1.233.387 2.206 1.096 2.863.703.654 1.696.982 2.85.982s1.85-.267 2.405-.637c.35-.233.608-.501.804-.75v.906c0 .138.111.25.249.25h1.712a.25.25 0 0 0 .248-.25V4.494zm2.405-1.864c0 .138.111.25.249.25h1.806a.25.25 0 0 0 .249-.25V.508a.25.25 0 0 0-.249-.25h-1.806a.25.25 0 0 0-.249.25zm.024 12.124c0 .138.112.25.25.25h1.762a.25.25 0 0 0 .249-.25V4.494a.25.25 0 0 0-.25-.252h-1.762a.25.25 0 0 0-.249.251zM54.874.25A.25.25 0 0 0 54.625 0h-1.762a.25.25 0 0 0-.25.25v5.124c-.571-.708-1.59-1.363-3.312-1.363s-2.62.475-3.518 1.43c-.891.957-1.413 2.363-1.413 4.192s.522 3.226 1.413 4.182c.89.956 2.132 1.43 3.518 1.43s2.765-.664 3.364-1.423v.94c0 .138.11.25.248.25h1.712a.25.25 0 0 0 .249-.25zm6.788.301v.061l3.45 14.202c.027.112.128.19.24.19h2.267a.25.25 0 0 0 .239-.18l3.149-11.298 3.148 11.297c.034.112.128.18.24.18h2.276a.246.246 0 0 0 .24-.19L80.36.614V.251A.246.246 0 0 0 80.115 0h-1.763a.24.24 0 0 0-.239.19L75.416 11.7 72.24.18a.24.24 0 0 0-.239-.18h-1.943a.25.25 0 0 0-.24.18L66.627 11.7 63.93.19A.246.246 0 0 0 63.69 0h-1.772a.25.25 0 0 0-.25.25v.302h-.009zm28.493 9.701a.25.25 0 0 0 .249-.25v-.827c0-1.552-.42-2.854-1.258-3.768-.838-.915-2.072-1.414-3.63-1.414s-2.842.492-3.74 1.458c-.898.965-1.386 2.379-1.386 4.164 0 1.786.488 3.209 1.396 4.175s2.2 1.457 3.75 1.457 2.687-.492 3.431-1.173a3.93 3.93 0 0 0 1.224-2.19v-.345a.25.25 0 0 0-.248-.25h-1.575a.256.256 0 0 0-.248.207c-.068.44-.293.914-.703 1.277s-1.02.63-1.9.63c-.882 0-1.626-.329-2.116-.898-.454-.525-.736-1.294-.797-2.26h7.549v.01zm2.072 4.5c0 .14.111.251.249.251h1.712a.25.25 0 0 0 .248-.25v-.94c.592.76 1.645 1.424 3.357 1.424s2.62-.474 3.509-1.43 1.412-2.363 1.412-4.182-.521-3.233-1.412-4.192c-.891-.956-2.133-1.43-3.51-1.43s-2.737.654-3.312 1.362V.251A.25.25 0 0 0 94.23 0h-1.763a.25.25 0 0 0-.248.25v14.504h.01zM20.952 5.907c.908 0 1.652.329 2.166.94.522.612.838 1.544.838 2.775s-.316 2.155-.838 2.768c-.521.613-1.258.94-2.166.94s-1.651-.33-2.166-.94c-.521-.613-.838-1.535-.838-2.768s.317-2.165.838-2.776c.522-.613 1.258-.939 2.166-.939m28.709 0c.908 0 1.651.329 2.166.94.521.612.838 1.544.838 2.775s-.317 2.155-.838 2.768c-.522.613-1.258.94-2.166.94s-1.652-.33-2.166-.94c-.522-.613-.838-1.535-.838-2.768s.316-2.165.838-2.776c.521-.613 1.258-.939 2.166-.939m38.553 2.552h-5.557c.104-.759.377-1.389.797-1.827.471-.491 1.147-.793 2.055-.793s1.584.295 2.021.776c.404.44.633 1.07.676 1.847h.01zm9.226 4.882c-.915 0-1.651-.328-2.173-.939-.522-.613-.838-1.534-.838-2.768s.316-2.165.838-2.775c.522-.613 1.268-.94 2.173-.94.906 0 1.652.329 2.166.94.522.613.839 1.544.839 2.775s-.317 2.155-.839 2.768c-.521.614-1.258.94-2.166.94\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"nonzero\",\n d: \"m77.008 18.646 1.618 2.708h.12v-2.708h.66v3.657h-1.002l-1.618-2.708h-.12v2.708h-.667v-3.657zM83.076 18.646v.587h-2.19v.922h1.927v.569h-1.927v.992h2.217v.587h-2.936v-3.657zM84.369 18.646l.932 1.302h.222l.915-1.302h.76l-1.257 1.803 1.335 1.854h-.83l-.986-1.355h-.232l-.949 1.355h-.76l1.301-1.854-1.292-1.803h.838zM89.36 18.595c1.026 0 1.702.492 1.702 1.43v.052h-.72v-.051c0-.536-.36-.803-.985-.803h-.128c-.615 0-.992.294-.992.914v.665c0 .647.377.931.992.931h.128c.626 0 .993-.267.993-.81v-.034h.72v.034c0 .956-.694 1.44-1.72 1.44h-.128c-1.002 0-1.72-.491-1.72-1.552v-.664c0-1.034.71-1.544 1.72-1.544h.128l.01-.01zM94.691 18.646v.587h-2.19v.922h1.927v.569h-1.927v.992h2.217v.587h-2.936v-3.657zM96.968 18.604c.915 0 1.54.397 1.54 1.122v.233h-.702v-.233c0-.37-.326-.552-.848-.552h-.094c-.531 0-.838.18-.838.457v.051c0 .312.266.38 1.13.535.969.18 1.413.458 1.413 1.07v.061c0 .604-.538 1.027-1.591 1.027h-.094c-1.063 0-1.609-.43-1.609-1.165v-.234h.703v.234c0 .44.316.603.915.603h.085c.582 0 .89-.156.89-.447v-.052c0-.294-.282-.406-1.137-.552-.898-.155-1.395-.396-1.395-1.034v-.068c0-.647.591-1.034 1.54-1.034h.095v-.017zM100.81 18.596c.916 0 1.54.396 1.54 1.121v.234h-.702v-.234c0-.37-.326-.552-.847-.552h-.094c-.532 0-.839.18-.839.457v.051c0 .312.266.38 1.13.536.969.18 1.413.457 1.413 1.07v.06c0 .604-.538 1.027-1.591 1.027h-.094c-1.063 0-1.609-.43-1.609-1.165v-.233h.703v.233c0 .44.317.603.915.603h.085c.582 0 .89-.155.89-.447v-.051c0-.295-.281-.407-1.136-.553-.9-.155-1.396-.396-1.396-1.033v-.069c0-.647.591-1.033 1.54-1.033h.095V18.6zM68.327 22.356v-3.708h1.318q.668-.002 1.002.241t.333.76c0 .345-.033.294-.094.413a.62.62 0 0 1-.292.275.9.9 0 0 1-.444.104v-.017c.309 0 .555.095.727.258s.265.38.265.647c0 .268-.11.596-.333.76-.222.172-.548.257-.959.257h-1.514zm.565-2.121h.753c.249 0 .437-.044.572-.14a.46.46 0 0 0 .206-.396.47.47 0 0 0-.198-.406q-.196-.13-.582-.129h-.754v1.078-.01zm0 1.612h.941q.347-.001.539-.146a.5.5 0 0 0 .198-.423.5.5 0 0 0-.198-.423q-.195-.157-.539-.156h-.941v1.148M72.48 22.356v-1.491l-1.291-2.217h.642l.925 1.657.932-1.657h.642l-1.291 2.217v1.49h-.556z\"\n }))));\n};\nexport { SvgLogoLw as ReactComponent };\nexport default \"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTAzcHgiIGhlaWdodD0iMjNweCIgdmlld0JveD0iMCAwIDEwMyAyMyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5Hcm91cDwvdGl0bGU+CiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xNzEuMDAwMDAwLCAtMTgxLjAwMDAwMCkiIGZpbGw9IiMwNDFDMUUiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE3MS4wMDAwMDAsIDE4MS4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0tNy4xMDU0MjczNmUtMTUsMTQuNzUzODUgQy03LjEwNTQyNzM2ZS0xNSwxNC44OTI0NSAwLjExMTA3NjE2LDE1LjAwNDM1IDAuMjQ4NzE0MTYsMTUuMDA0MzUgTDkuODc4NTI1MTYsMTUuMDA0MzUgQzEwLjAxNjEzNTIsMTUuMDA0MzUgMTAuMTI3MjM1MiwxNC44OTI0NSAxMC4xMjcyMzUyLDE0Ljc1Mzg1IEwxMC4xMjcyMzUyLDEzLjI2OTk1IEMxMC4xMjcyMzUyLDEzLjEzMTI1IDEwLjAxNjEzNTIsMTMuMDE5MzUgOS44Nzg1MjUxNiwxMy4wMTkzNSBMMi4zMzc0MjUxNiwxMy4wMTkzNSBMMi4zMzc0MjUxNiwwLjI1MDU2IEMyLjMzNzQyNTE2LDAuMTExOSAyLjIyNjM0NTE2LDAgMi4wODg3MTUxNiwwIEwwLjI0ODcxNDE2LDAgQzAuMTExMDc2MTYsMCAtNy4xMDU0MjczNmUtMTUsMC4xMTE5IC03LjEwNTQyNzM2ZS0xNSwwLjI1MDU2IEwtNy4xMDU0MjczNmUtMTUsMTQuNzUzODUgWiBNMTEuNTU0MzM1MiwyLjYyOTY2IEMxMS41NTQzMzUyLDIuNzY4MzIgMTEuNjY1NDM1MiwyLjg4MDIyIDExLjgwMzAzNTIsMi44ODAyMiBMMTMuNjA5MjM1MiwyLjg4MDIyIEMxMy43NDY4MzUyLDIuODgwMjIgMTMuODU3OTM1MiwyLjc2ODMyIDEzLjg1NzkzNTIsMi42Mjk2NiBMMTMuODU3OTM1MiwwLjUwODQyIEMxMy44NTc5MzUyLDAuMzY5NzYgMTMuNzQ2ODM1MiwwLjI1Nzg2IDEzLjYwOTIzNTIsMC4yNTc4NiBMMTEuODAzMDM1MiwwLjI1Nzg2IEMxMS42NjU0MzUyLDAuMjU3ODYgMTEuNTU0MzM1MiwwLjM2OTc2IDExLjU1NDMzNTIsMC41MDg0MiBMMTEuNTU0MzM1MiwyLjYyOTY2IFogTTExLjU5MDUzNTIsMTQuNzUzODUgQzExLjU5MDUzNTIsMTQuODkyNDUgMTEuNzAxNjM1MiwxNS4wMDQzNSAxMS44MzkyMzUyLDE1LjAwNDM1IEwxMy42MDE5MzUyLDE1LjAwNDM1IEMxMy43Mzk2MzUyLDE1LjAwNDM1IDEzLjg1MDczNTIsMTQuODkyNDUgMTMuODUwNzM1MiwxNC43NTM4NSBMMTMuODUwNzM1Miw0LjQ5MzA1IEMxMy44NTA3MzUyLDQuMzU0MzkgMTMuNzM5NjM1Miw0LjI0MjQ5IDEzLjYwMTkzNTIsNC4yNDI0OSBMMTEuODM5MjM1Miw0LjI0MjQ5IEMxMS43MDE2MzUyLDQuMjQyNDkgMTEuNTkwNTM1Miw0LjM1NDM5IDExLjU5MDUzNTIsNC40OTMwNSBMMTEuNTkwNTM1MiwxNC43NTM4NSBaIE0yNi4xNjU2MzUyLDQuNDkzMDUgQzI2LjE2NTYzNTIsNC4zNTQzOSAyNi4wNTQ1MzUyLDQuMjQyNDkgMjUuOTE2OTM1Miw0LjI0MjQ5IEwyNC4yMDQ5MzUyLDQuMjQyNDkgQzI0LjA2NzIzNTIsNC4yNDI0OSAyMy45NTYyMzUyLDQuMzU0MzkgMjMuOTU2MjM1Miw0LjQ5MzA1IEwyMy45NTYyMzUyLDUuNDMyMDQgQzIzLjM2NDYzNTIsNC42NzMwNiAyMi4zMTE4MzUyLDQuMDA4OTYgMjAuNTkyNTM1Miw0LjAwODk2IEMxOC44NzMyMzUyLDQuMDA4OTYgMTcuOTcyNjM1Miw0LjQ4MzMyIDE3LjA3NDMzNTIsNS40MzkzNCBDMTYuMTgzMzM1Miw2LjM5NTM2IDE1LjY2MTczNTIsNy44MDE0NSAxNS42NjE3MzUyLDkuNjMwNzUgQzE1LjY2MTczNTIsMTEuNDYwMDUgMTYuMTgzMzM1MiwxMi44NTYzNSAxNy4wNzQzMzUyLDEzLjgxMjQ1IEMxNy45NjUzMzUyLDE0Ljc2ODQ1IDE5LjIwNjUzNTIsMTUuMjQyNzUgMjAuNTkyNTM1MiwxNS4yNDI3NSBDMjEuOTc4NTM1MiwxNS4yNDI3NSAyMy4zMzA4MzUyLDE0LjU4ODQ1IDIzLjkwNTUzNTIsMTMuODgwNTUgTDIzLjkwNTUzNTIsMTguNzk0NDUgQzIzLjkwNTUzNTIsMTguOTMzMDUgMjQuMDE2NTM1MiwxOS4wNDQ5NSAyNC4xNTQyMzUyLDE5LjA0NDk1IEwyNS45MTY5MzUyLDE5LjA0NDk1IEMyNi4wNTQ1MzUyLDE5LjA0NDk1IDI2LjE2NTYzNTIsMTguOTMzMDUgMjYuMTY1NjM1MiwxOC43OTQ0NSBMMjYuMTY1NjM1Miw0LjQ5MzA1IFogTTM3Ljg2NzIzNTIsNC40OTMwNSBDMzcuODY3MjM1Miw0LjM1NDM5IDM3Ljc1NjIzNTIsNC4yNDI0OSAzNy42MTg1MzUyLDQuMjQyNDkgTDM1Ljg1NTgzNTIsNC4yNDI0OSBDMzUuNzE4MjM1Miw0LjI0MjQ5IDM1LjYwNzEzNTIsNC4zNTQzOSAzNS42MDcxMzUyLDQuNDkzMDUgTDM1LjYwNzEzNTIsMTAuNDE2NDUgQzM1LjYwNzEzNTIsMTEuNDI2MDUgMzUuMjgxMTM1MiwxMi4xNDg1NSAzNC43ODYxMzUyLDEyLjYyMjg1IEMzNC4yODg3MzUyLDEzLjA5NzI1IDMzLjYxMjUzNTIsMTMuMzQ3NzUgMzIuODU5MjM1MiwxMy4zNDc3NSBDMzIuMTA1ODM1MiwxMy4zNDc3NSAzMS42Njg3MzUyLDEzLjE3NTA1IDMxLjMxODYzNTIsMTIuODU2MzUgQzMwLjk2ODQzNTIsMTIuNTM3NzUgMzAuNzQ2MzM1MiwxMi4wMjkzNSAzMC43NDYzMzUyLDExLjI3NzY1IEwzMC43NDYzMzUyLDQuNDkwNjEgQzMwLjc0NjMzNTIsNC4zNTE5NSAzMC42MzUyMzUyLDQuMjQwMDUgMzAuNDk3NjM1Miw0LjI0MDA1IEwyOC43MzQ5MzUyLDQuMjQwMDUgQzI4LjU5NzIzNTIsNC4yNDAwNSAyOC40ODYxMzUyLDQuMzUxOTUgMjguNDg2MTM1Miw0LjQ5MDYxIEwyOC40ODYxMzUyLDExLjM4OTU1IEMyOC40ODYxMzUyLDEyLjYyMjg1IDI4Ljg3MjUzNTIsMTMuNTk1OTUgMjkuNTgyNDM1MiwxNC4yNTI3NSBDMzAuMjg1MTM1MiwxNC45MDcwNSAzMS4yNzc1MzUyLDE1LjIzNTQ1IDMyLjQzMTgzNTIsMTUuMjM1NDUgQzMzLjU4NjAzNTIsMTUuMjM1NDUgMzQuMjgxNDM1MiwxNC45Njc5NSAzNC44MzY4MzUyLDE0LjU5ODE1IEMzNS4xODY5MzUyLDE0LjM2NDY1IDM1LjQ0NTMzNTIsMTQuMDk3MDUgMzUuNjQwOTM1MiwxMy44NDg5NSBMMzUuNjQwOTM1MiwxNC43NTM4NSBDMzUuNjQwOTM1MiwxNC44OTI0NSAzNS43NTIwMzUyLDE1LjAwNDM1IDM1Ljg4OTYzNTIsMTUuMDA0MzUgTDM3LjYwMTYzNTIsMTUuMDA0MzUgQzM3LjczOTMzNTIsMTUuMDA0MzUgMzcuODUwMzM1MiwxNC44OTI0NSAzNy44NTAzMzUyLDE0Ljc1Mzg1IEwzNy44NTAzMzUyLDQuNDkzMDUgTDM3Ljg2NzIzNTIsNC40OTMwNSBaIE00MC4yNzIzMzUyLDIuNjI5NjYgQzQwLjI3MjMzNTIsMi43NjgzMiA0MC4zODMzMzUyLDIuODgwMjIgNDAuNTIxMDM1MiwyLjg4MDIyIEw0Mi4zMjcyMzUyLDIuODgwMjIgQzQyLjQ2NDgzNTIsMi44ODAyMiA0Mi41NzU5MzUyLDIuNzY4MzIgNDIuNTc1OTM1MiwyLjYyOTY2IEw0Mi41NzU5MzUyLDAuNTA4NDIgQzQyLjU3NTkzNTIsMC4zNjk3NiA0Mi40NjQ4MzUyLDAuMjU3ODYgNDIuMzI3MjM1MiwwLjI1Nzg2IEw0MC41MjEwMzUyLDAuMjU3ODYgQzQwLjM4MzMzNTIsMC4yNTc4NiA0MC4yNzIzMzUyLDAuMzY5NzYgNDAuMjcyMzM1MiwwLjUwODQyIEw0MC4yNzIzMzUyLDIuNjI5NjYgWiBNNDAuMjk2NDM1MiwxNC43NTM4NSBDNDAuMjk2NDM1MiwxNC44OTI0NSA0MC40MDc1MzUyLDE1LjAwNDM1IDQwLjU0NTEzNTIsMTUuMDA0MzUgTDQyLjMwNzkzNTIsMTUuMDA0MzUgQzQyLjQ0NTUzNTIsMTUuMDA0MzUgNDIuNTU2NjM1MiwxNC44OTI0NSA0Mi41NTY2MzUyLDE0Ljc1Mzg1IEw0Mi41NTY2MzUyLDQuNDkzMDUgQzQyLjU1NjYzNTIsNC4zNTQzOSA0Mi40NDU1MzUyLDQuMjQyNDkgNDIuMzA3OTM1Miw0LjI0MjQ5IEw0MC41NDUxMzUyLDQuMjQyNDkgQzQwLjQwNzUzNTIsNC4yNDI0OSA0MC4yOTY0MzUyLDQuMzU0MzkgNDAuMjk2NDM1Miw0LjQ5MzA1IEw0MC4yOTY0MzUyLDE0Ljc1Mzg1IFogTTU0Ljg3MzkzNTIsMC4yNTA1NiBDNTQuODczOTM1MiwwLjExMTkgNTQuNzYyOTM1MiwwIDU0LjYyNTIzNTIsMCBMNTIuODYyNTM1MiwwIEM1Mi43MjQ5MzUyLDAgNTIuNjEzODM1MiwwLjExMTkgNTIuNjEzODM1MiwwLjI1MDU2IEw1Mi42MTM4MzUyLDUuMzczNjYgQzUyLjA0MTUzNTIsNC42NjU3NiA1MS4wMjI1MzUyLDQuMDExMzkgNDkuMzAwODM1Miw0LjAxMTM5IEM0Ny41NzkxMzUyLDQuMDExMzkgNDYuNjgwOTM1Miw0LjQ4NTc1IDQ1Ljc4MjYzNTIsNS40NDE3NyBDNDQuODkxNjM1Miw2LjM5Nzc5IDQ0LjM3MDAzNTIsNy44MDM4NSA0NC4zNzAwMzUyLDkuNjMzMTUgQzQ0LjM3MDAzNTIsMTEuNDYyNTUgNDQuODkxNjM1MiwxMi44NTg4NSA0NS43ODI2MzUyLDEzLjgxNDg1IEM0Ni42NzM2MzUyLDE0Ljc3MDg1IDQ3LjkxNDgzNTIsMTUuMjQ1MjUgNDkuMzAwODM1MiwxNS4yNDUyNSBDNTAuNjg2OTM1MiwxNS4yNDUyNSA1Mi4wNjU3MzUyLDE0LjU4MTE1IDUyLjY2NDUzNTIsMTMuODIyMTUgTDUyLjY2NDUzNTIsMTQuNzYxMTUgQzUyLjY2NDUzNTIsMTQuODk5NzUgNTIuNzc1NjM1MiwxNS4wMTE2NSA1Mi45MTMyMzUyLDE1LjAxMTY1IEw1NC42MjUyMzUyLDE1LjAxMTY1IEM1NC43NjI5MzUyLDE1LjAxMTY1IDU0Ljg3MzkzNTIsMTQuODk5NzUgNTQuODczOTM1MiwxNC43NjExNSBMNTQuODczOTM1MiwwLjI1MDU2IFogTTYxLjY2MTczNTIsMC41NTIyIEw2MS42NjE3MzUyLDAuNjEzMDIgTDY1LjExMjMzNTIsMTQuODE0NjUgQzY1LjEzODgzNTIsMTQuOTI2NTUgNjUuMjQwMjM1MiwxNS4wMDQzNSA2NS4zNTEzMzUyLDE1LjAwNDM1IEw2Ny42MTg3MzUyLDE1LjAwNDM1IEM2Ny43Mjk4MzUyLDE1LjAwNDM1IDY3LjgzMzYzNTIsMTQuOTI2NTUgNjcuODU3ODM1MiwxNC44MjQzNSBMNzEuMDA2NTM1MiwzLjUyNzMgTDc0LjE1NTMzNTIsMTQuODI0MzUgQzc0LjE4OTEzNTIsMTQuOTM2MjUgNzQuMjgzMzM1MiwxNS4wMDQzNSA3NC4zOTQzMzUyLDE1LjAwNDM1IEw3Ni42NzE0MzUyLDE1LjAwNDM1IEM3Ni43ODI1MzUyLDE1LjAwNDM1IDc2Ljg4NjMzNTIsMTQuOTI2NTUgNzYuOTEwNTM1MiwxNC44MTQ2NSBMODAuMzYxMTczMywwLjYxMzAyIEw4MC4zNjExNzMzLDAuMjUwNTYgQzgwLjM2MzUzNTIsMC4xMTE5IDgwLjI1MjQzNTIsMCA4MC4xMTQ4MzUyLDAgTDc4LjM1MjAzNTIsMCBDNzguMjMxMzM1MiwwIDc4LjEzNzEzNTIsMC4wNzc4NCA3OC4xMTMwMzUyLDAuMTg5NzQgTDc1LjQxNTgzNTIsMTEuNzAwODUgTDcyLjI0MDQzNTIsMC4xODAwMSBDNzIuMjEzOTM1MiwwLjA2ODExIDcyLjExMjUzNTIsMCA3Mi4wMDE0MzUyLDAgTDcwLjA1NzYzNTIsMCBDNjkuOTQ2NTM1MiwwIDY5Ljg0MjYzNTIsMC4wNzc4NCA2OS44MTg1MzUyLDAuMTgwMDEgTDY2LjYyNjMzNTIsMTEuNzAwODUgTDYzLjkyOTAzNTIsMC4xODk3NCBDNjMuOTA0OTM1MiwwLjA3Nzg0IDYzLjgwMTEzNTIsMCA2My42OTAwMzUyLDAgTDYxLjkxNzYzNTIsMCBDNjEuNzgwMDM1MiwwIDYxLjY2ODkzNTIsMC4xMTE5IDYxLjY2ODkzNTIsMC4yNTA1NiBMNjEuNjY4OTM1MiwwLjU1MjIgTDYxLjY1OTIzNTIsMC41NTIyIEw2MS42NjE3MzUyLDAuNTUyMiBaIE05MC4xNTUxMzUyLDEwLjI1MzQ1IEM5MC4yOTI3MzUyLDEwLjI1MzQ1IDkwLjQwMzgzNTIsMTAuMTQxNTUgOTAuNDAzODM1MiwxMC4wMDI5NSBMOTAuNDAzODM1Miw5LjE3NTg1IEM5MC40MDM4MzUyLDcuNjIzODUgODkuOTgzNjM1Miw2LjMyMjM4IDg5LjE0NTczNTIsNS40MDc3MSBDODguMzA3ODM1Miw0LjQ5MzA1IDg3LjA3MzkzNTIsMy45OTQzNiA4NS41MTY0MzUyLDMuOTk0MzYgQzgzLjk1OTAzNTIsMy45OTQzNiA4Mi42NzQzMzUyLDQuNDg1NzUgODEuNzc2MTM1Miw1LjQ1MTUgQzgwLjg3NzgzNTIsNi40MTcyNSA4MC4zOTAwMzUyLDcuODMwNjUgODAuMzkwMDM1Miw5LjYxNjE1IEM4MC4zOTAwMzUyLDExLjQwMTY1IDgwLjg3NzgzNTIsMTIuODI0NzUgODEuNzg1NzM1MiwxMy43OTA1NSBDODIuNjkzNzM1MiwxNC43NTYyNSA4My45ODU1MzUyLDE1LjI0NzY1IDg1LjUzNTgzNTIsMTUuMjQ3NjUgQzg3LjA4NjAzNTIsMTUuMjQ3NjUgODguMjIzMzM1MiwxNC43NTYyNSA4OC45NjcwMzUyLDE0LjA3NTE1IEM4OS43MTA4MzUyLDEzLjQwMzc1IDkwLjA3MDYzNTIsMTIuNTU3MTUgOTAuMTkxMzM1MiwxMS44ODU3NSBMOTAuMTkxMzM1MiwxMS41NDAzNSBDOTAuMTkxMzM1MiwxMS40MDE2NSA5MC4wODAyMzUyLDExLjI4OTc1IDg5Ljk0MjYzNTIsMTEuMjg5NzUgTDg4LjM2ODIzNTIsMTEuMjg5NzUgQzg4LjI0NzUzNTIsMTEuMjg5NzUgODguMTQ2MDM1MiwxMS4zNzQ5NSA4OC4xMTk1MzUyLDExLjQ5NjU1IEM4OC4wNTE5MzUyLDExLjkzNjg1IDg3LjgyNzMzNTIsMTIuNDExMjUgODcuNDE2ODM1MiwxMi43NzM2NSBDODcuMDA2MzM1MiwxMy4xMzYxNSA4Ni4zOTc4MzUyLDEzLjQwMzc1IDg1LjUxNjQzNTIsMTMuNDAzNzUgQzg0LjYzNTEzNTIsMTMuNDAzNzUgODMuODkxNDM1MiwxMy4wNzUzNSA4My40MDEyMzUyLDEyLjUwNjA1IEM4Mi45NDcyMzUyLDExLjk4MDY1IDgyLjY2NDczNTIsMTEuMjExOTUgODIuNjA0MzM1MiwxMC4yNDYxNSBMOTAuMTUyNzM1MiwxMC4yNDYxNSBMOTAuMTUyNzM1MiwxMC4yNTU5NSBMOTAuMTU1MTM1MiwxMC4yNTM0NSBaIE05Mi4yMjY5MzUyLDE0Ljc1Mzg1IEM5Mi4yMjY5MzUyLDE0Ljg5MjQ1IDkyLjMzODAzNTIsMTUuMDA0MzUgOTIuNDc1NjM1MiwxNS4wMDQzNSBMOTQuMTg3NjM1MiwxNS4wMDQzNSBDOTQuMzI1MzM1MiwxNS4wMDQzNSA5NC40MzYzMzUyLDE0Ljg5MjQ1IDk0LjQzNjMzNTIsMTQuNzUzODUgTDk0LjQzNjMzNTIsMTMuODE0ODUgQzk1LjAyNzkzNTIsMTQuNTczODUgOTYuMDgwNzM1MiwxNS4yMzc5NSA5Ny43OTI4MzUyLDE1LjIzNzk1IEM5OS41MDQ4MzUyLDE1LjIzNzk1IDEwMC40MTI1MzUsMTQuNzYzNTUgMTAxLjMwMTUzNSwxMy44MDc1NSBDMTAyLjE4OTUzNSwxMi44NTE1NSAxMDIuNzEzNTM1LDExLjQ0NTQ1IDEwMi43MTM1MzUsOS42MjU4NSBDMTAyLjcxMzUzNSw3LjgwNjI1IDEwMi4xOTI1MzUsNi4zOTI5MiAxMDEuMzAxNTM1LDUuNDM0NDcgQzEwMC40MTA1MzUsNC40Nzg0NSA5OS4xNjkxMzUyLDQuMDA0MDkgOTcuNzkyODM1Miw0LjAwNDA5IEM5Ni40MTY0MzUyLDQuMDA0MDkgOTUuMDU0NTM1Miw0LjY1ODQ3IDk0LjQ3OTgzNTIsNS4zNjYzNiBMOTQuNDc5ODM1MiwwLjI1MDU2IEM5NC40Nzk4MzUyLDAuMTExOSA5NC4zNjg3MzUyLDAgOTQuMjMxMTM1MiwwIEw5Mi40NjgzMzUyLDAgQzkyLjMzMDczNTIsMCA5Mi4yMTk2MzUyLDAuMTExOSA5Mi4yMTk2MzUyLDAuMjUwNTYgTDkyLjIxOTYzNTIsMTQuNzUzODUgTDkyLjIyOTMzNTIsMTQuNzUzODUgTDkyLjIyNjkzNTIsMTQuNzUzODUgWiBNMjAuOTUyMzM1Miw1LjkwNjQgQzIxLjg2MDIzNTIsNS45MDY0IDIyLjYwMzkzNTIsNi4yMzQ4IDIzLjExODMzNTIsNi44NDUzOSBDMjMuNjM5ODM1Miw3LjQ1ODQxIDIzLjk1NjIzNTIsOC4zOTAxNSAyMy45NTYyMzUyLDkuNjIxMDUgQzIzLjk1NjIzNTIsMTAuODUxOTUgMjMuNjM5ODM1MiwxMS43NzYzNSAyMy4xMTgzMzUyLDEyLjM4OTM1IEMyMi41OTY3MzUyLDEzLjAwMjM1IDIxLjg2MDIzNTIsMTMuMzI4MzUgMjAuOTUyMzM1MiwxMy4zMjgzNSBDMjAuMDQ0NDM1MiwxMy4zMjgzNSAxOS4zMDA2MzUyLDEyLjk5OTk1IDE4Ljc4NjMzNTIsMTIuMzg5MzUgQzE4LjI2NDczNTIsMTEuNzc2MzUgMTcuOTQ4NDM1MiwxMC44NTQzNSAxNy45NDg0MzUyLDkuNjIxMDUgQzE3Ljk0ODQzNTIsOC4zODc2NSAxOC4yNjQ3MzUyLDcuNDU1OTggMTguNzg2MzM1Miw2Ljg0NTM5IEMxOS4zMDc5MzUyLDYuMjMyMzcgMjAuMDQ0NDM1Miw1LjkwNjQgMjAuOTUyMzM1Miw1LjkwNjQgWiBNNDkuNjYwNjM1Miw1LjkwNjQgQzUwLjU2ODUzNTIsNS45MDY0IDUxLjMxMjMzNTIsNi4yMzQ4IDUxLjgyNjYzNTIsNi44NDUzOSBDNTIuMzQ4MjM1Miw3LjQ1ODQxIDUyLjY2NDUzNTIsOC4zOTAxNSA1Mi42NjQ1MzUyLDkuNjIxMDUgQzUyLjY2NDUzNTIsMTAuODUxOTUgNTIuMzQ4MjM1MiwxMS43NzYzNSA1MS44MjY2MzUyLDEyLjM4OTM1IEM1MS4zMDUwMzUyLDEzLjAwMjM1IDUwLjU2ODUzNTIsMTMuMzI4MzUgNDkuNjYwNjM1MiwxMy4zMjgzNSBDNDguNzUyNzM1MiwxMy4zMjgzNSA0OC4wMDkwMzUyLDEyLjk5OTk1IDQ3LjQ5NDYzNTIsMTIuMzg5MzUgQzQ2Ljk3MzEzNTIsMTEuNzc2MzUgNDYuNjU2NzM1MiwxMC44NTQzNSA0Ni42NTY3MzUyLDkuNjIxMDUgQzQ2LjY1NjczNTIsOC4zODc2NSA0Ni45NzMxMzUyLDcuNDU1OTggNDcuNDk0NjM1Miw2Ljg0NTM5IEM0OC4wMTYyMzUyLDYuMjMyMzcgNDguNzUyNzM1Miw1LjkwNjQgNDkuNjYwNjM1Miw1LjkwNjQgWiBNODguMjEzNzM1Miw4LjQ1ODI1IEw4Mi42NTc0MzUyLDguNDU4MjUgQzgyLjc2MTMzNTIsNy42OTkyNSA4My4wMzQxMzUyLDcuMDY5MTkgODMuNDU0MzM1Miw2LjYzMTMyIEM4My45MjUyMzUyLDYuMTM5OTMgODQuNjAxMzM1Miw1LjgzODI5IDg1LjUwOTIzNTIsNS44MzgyOSBDODYuNDE3MTM1Miw1LjgzODI5IDg3LjA5MzIzNTIsNi4xMzI2MyA4Ny41MzAzMzUyLDYuNjE0MjkgQzg3LjkzMzUzNTIsNy4wNTQ2IDg4LjE2MjkzNTIsNy42ODQ2NSA4OC4yMDY0MzUyLDguNDYwNjUgTDg4LjIxNjEzNTIsOC40NjA2NSBMODguMjEzNzM1Miw4LjQ1ODI1IFogTTk3LjQ0MDIzNTIsMTMuMzQwNDUgQzk2LjUyNTAzNTIsMTMuMzQwNDUgOTUuNzg4NjM1MiwxMy4wMTIwNSA5NS4yNjcwMzUyLDEyLjQwMTQ1IEM5NC43NDU0MzUyLDExLjc4ODQ1IDk0LjQyOTEzNTIsMTAuODY2NTUgOTQuNDI5MTM1Miw5LjYzMzE1IEM5NC40MjkxMzUyLDguMzk5ODUgOTQuNzQ1NDM1Miw3LjQ2ODE0IDk1LjI2NzAzNTIsNi44NTc1NSBDOTUuNzg4NjM1Miw2LjI0NDUzIDk2LjUzNDczNTIsNS45MTg1NiA5Ny40NDAyMzUyLDUuOTE4NTYgQzk4LjM0NTczNTIsNS45MTg1NiA5OS4wOTE5MzUyLDYuMjQ2OTcgOTkuNjA2MjM1Miw2Ljg1NzU1IEMxMDAuMTI3NTM1LDcuNDcwNTcgMTAwLjQ0NDUzNSw4LjQwMjI1IDEwMC40NDQ1MzUsOS42MzMxNSBDMTAwLjQ0NDUzNSwxMC44NjQwNSAxMDAuMTI3NTM1LDExLjc4ODQ1IDk5LjYwNjIzNTIsMTIuNDAxNDUgQzk5LjA4NDYzNTIsMTMuMDE0NTUgOTguMzQ4MTM1MiwxMy4zNDA0NSA5Ny40NDAyMzUyLDEzLjM0MDQ1IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI3Ny4wMDgzMzUyIDE4LjY0NjQ1IDc4LjYyNjIzNTIgMjEuMzUzOTUgNzguNzQ2OTM1MiAyMS4zNTM5NSA3OC43NDY5MzUyIDE4LjY0NjQ1IDc5LjQwNjEzNTIgMTguNjQ2NDUgNzkuNDA2MTM1MiAyMi4zMDI3NSA3OC40MDQwMzUyIDIyLjMwMjc1IDc2Ljc4NjIzNTIgMTkuNTk1MjUgNzYuNjY1NDM1MiAxOS41OTUyNSA3Ni42NjU0MzUyIDIyLjMwMjc1IDc1Ljk5OTAzNTIgMjIuMzAyNzUgNzUuOTk5MDM1MiAxOC42NDY0NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI4My4wNzYyMzUyIDE4LjY0NjQ1IDgzLjA3NjIzNTIgMTkuMjMyNzUgODAuODg2MTM1MiAxOS4yMzI3NSA4MC44ODYxMzUyIDIwLjE1NDc1IDgyLjgxMzAzNTIgMjAuMTU0NzUgODIuODEzMDM1MiAyMC43MjM5NSA4MC44ODYxMzUyIDIwLjcyMzk1IDgwLjg4NjEzNTIgMjEuNzE2NDUgODMuMTAyNzM1MiAyMS43MTY0NSA4My4xMDI3MzUyIDIyLjMwMjc1IDgwLjE2NjUzNTIgMjIuMzAyNzUgODAuMTY2NTM1MiAxOC42NDY0NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI4NC4zNjg1MzUyIDE4LjY0NjQ1IDg1LjMwMDYzNTIgMTkuOTQ3OTUgODUuNTIyNzM1MiAxOS45NDc5NSA4Ni40Mzc5MzUyIDE4LjY0NjQ1IDg3LjE5ODUzNTIgMTguNjQ2NDUgODUuOTQwNTM1MiAyMC40NDkwNSA4Ny4yNzU4MzUyIDIyLjMwMjc1IDg2LjQ0NTEzNTIgMjIuMzAyNzUgODUuNDU5OTM1MiAyMC45NDc3NSA4NS4yMjgxMzUyIDIwLjk0Nzc1IDg0LjI3OTEzNTIgMjIuMzAyNzUgODMuNTE4NTM1MiAyMi4zMDI3NSA4NC44MjAwMzUyIDIwLjQ0OTA1IDgzLjUyODIzNTIgMTguNjQ2NDUgODQuMzY2MTM1MiAxOC42NDY0NSI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgPHBhdGggZD0iTTg5LjM1OTgzNTIsMTguNTk1MjUgQzkwLjM4NjAzNTIsMTguNTk1MjUgOTEuMDYyMjM1MiwxOS4wODY1NSA5MS4wNjIyMzUyLDIwLjAyNTU1IEw5MS4wNjIyMzUyLDIwLjA3NjY1IEw5MC4zNDI2MzUyLDIwLjA3NjY1IEw5MC4zNDI2MzUyLDIwLjAyNTU1IEM5MC4zNDI2MzUyLDE5LjQ5MDQ1IDg5Ljk4MjgzNTIsMTkuMjIyODUgODkuMzU3NDM1MiwxOS4yMjI4NSBMODkuMjI5NDM1MiwxOS4yMjI4NSBDODguNjEzNzM1MiwxOS4yMjI4NSA4OC4yMzcwMzUyLDE5LjUxNzE1IDg4LjIzNzAzNTIsMjAuMTM3NDUgTDg4LjIzNzAzNTIsMjAuODAxNTUgQzg4LjIzNzAzNTIsMjEuNDQ4NjUgODguNjEzNzM1MiwyMS43MzMyNSA4OS4yMjk0MzUyLDIxLjczMzI1IEw4OS4zNTc0MzUyLDIxLjczMzI1IEM4OS45ODI4MzUyLDIxLjczMzI1IDkwLjM0OTgzNTIsMjEuNDY1NjUgOTAuMzQ5ODM1MiwyMC45MjMyNSBMOTAuMzQ5ODM1MiwyMC44ODkxNSBMOTEuMDY5NDM1MiwyMC44ODkxNSBMOTEuMDY5NDM1MiwyMC45MjMyNSBDOTEuMDY5NDM1MiwyMS44NzkyNSA5MC4zNzY0MzUyLDIyLjM2MzM1IDg5LjM1MDEzNTIsMjIuMzYzMzUgTDg5LjIyMjIzNTIsMjIuMzYzMzUgQzg4LjIyMDEzNTIsMjIuMzYzMzUgODcuNTAyOTM1MiwyMS44NzE5NSA4Ny41MDI5MzUyLDIwLjgxMTM1IEw4Ny41MDI5MzUyLDIwLjE0NzI1IEM4Ny41MDI5MzUyLDE5LjExMzM1IDg4LjIxMjgzNTIsMTguNjAyNTUgODkuMjIyMjM1MiwxOC42MDI1NSBMODkuMzUwMTM1MiwxOC42MDI1NSBMODkuMzU5ODM1MiwxOC41OTI3NSBMODkuMzU5ODM1MiwxOC41OTUyNSBaIiBpZD0iUGF0aCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgZmlsbC1ydWxlPSJub256ZXJvIiBwb2ludHM9Ijk0LjY5MTQzNTIgMTguNjQ2NDUgOTQuNjkxNDM1MiAxOS4yMzI3NSA5Mi41MDEzMzUyIDE5LjIzMjc1IDkyLjUwMTMzNTIgMjAuMTU0NzUgOTQuNDI4MjM1MiAyMC4xNTQ3NSA5NC40MjgyMzUyIDIwLjcyMzk1IDkyLjUwMTMzNTIgMjAuNzIzOTUgOTIuNTAxMzM1MiAyMS43MTY0NSA5NC43MTgwMzUyIDIxLjcxNjQ1IDk0LjcxODAzNTIgMjIuMzAyNzUgOTEuNzgxNzM1MiAyMi4zMDI3NSA5MS43ODE3MzUyIDE4LjY0NjQ1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuOTY4MTM1MiwxOC42MDQ0NSBDOTcuODgzMjM1MiwxOC42MDQ0NSA5OC41MDg2MzUyLDE5LjAwMTA1IDk4LjUwODYzNTIsMTkuNzI1OTUgTDk4LjUwODYzNTIsMTkuOTU5NDUgTDk3LjgwNjAzNTIsMTkuOTU5NDUgTDk3LjgwNjAzNTIsMTkuNzI1OTUgQzk3LjgwNjAzNTIsMTkuMzU2MTUgOTcuNDgwMDM1MiwxOS4xNzM3NSA5Ni45NTg0MzUyLDE5LjE3Mzc1IEw5Ni44NjQyMzUyLDE5LjE3Mzc1IEM5Ni4zMzMwMzUyLDE5LjE3Mzc1IDk2LjAyNjMzNTIsMTkuMzUzNzUgOTYuMDI2MzM1MiwxOS42MzEwNSBMOTYuMDI2MzM1MiwxOS42ODIxNSBDOTYuMDI2MzM1MiwxOS45OTM1NSA5Ni4yOTE5MzUyLDIwLjA2MTY1IDk3LjE1NjQzNTIsMjAuMjE3MzUgQzk4LjEyNDczNTIsMjAuMzk3MzUgOTguNTY5MDM1MiwyMC42NzQ2NSA5OC41NjkwMzUyLDIxLjI4NzY1IEw5OC41NjkwMzUyLDIxLjM0ODQ1IEM5OC41NjkwMzUyLDIxLjk1MTc1IDk4LjAzMDUzNTIsMjIuMzc1MDUgOTYuOTc3NzM1MiwyMi4zNzUwNSBMOTYuODgzNTM1MiwyMi4zNzUwNSBDOTUuODIxMTM1MiwyMi4zNzUwNSA5NS4yNzU0MzUyLDIxLjk0NDQ1IDk1LjI3NTQzNTIsMjEuMjA5ODUgTDk1LjI3NTQzNTIsMjAuOTc2MjUgTDk1Ljk3ODAzNTIsMjAuOTc2MjUgTDk1Ljk3ODAzNTIsMjEuMjA5ODUgQzk1Ljk3ODAzNTIsMjEuNjUwMTUgOTYuMjk0NDM1MiwyMS44MTMxNSA5Ni44OTMyMzUyLDIxLjgxMzE1IEw5Ni45Nzc3MzUyLDIxLjgxMzE1IEM5Ny41NTk3MzUyLDIxLjgxMzE1IDk3Ljg2ODczNTIsMjEuNjU3NDUgOTcuODY4NzM1MiwyMS4zNjU1NSBMOTcuODY4NzM1MiwyMS4zMTQ0NSBDOTcuODY4NzM1MiwyMS4wMjAwNSA5Ny41ODYyMzUyLDIwLjkwODE1IDk2LjczMTQzNTIsMjAuNzYyMjUgQzk1LjgzMzEzNTIsMjAuNjA2NTUgOTUuMzM1NzM1MiwyMC4zNjU3NSA5NS4zMzU3MzUyLDE5LjcyODM1IEw5NS4zMzU3MzUyLDE5LjY2MDI1IEM5NS4zMzU3MzUyLDE5LjAxMzE1IDk1LjkyNzMzNTIsMTguNjI2MzUgOTYuODc2MzM1MiwxOC42MjYzNSBMOTYuOTcwNTM1MiwxOC42MjYzNSBMOTYuOTcwNTM1MiwxOC42MDkzNSBMOTYuOTY4MTM1MiwxOC42MDQ0NSBaIiBpZD0iUGF0aCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAwLjgwOTUzNSwxOC41OTU3NSBDMTAxLjcyNTUzNSwxOC41OTU3NSAxMDIuMzUwNTM1LDE4Ljk5MjI1IDEwMi4zNTA1MzUsMTkuNzE3MTUgTDEwMi4zNTA1MzUsMTkuOTUwNjUgTDEwMS42NDc1MzUsMTkuOTUwNjUgTDEwMS42NDc1MzUsMTkuNzE3MTUgQzEwMS42NDc1MzUsMTkuMzQ3MzUgMTAxLjMyMTUzNSwxOS4xNjQ5NSAxMDAuODAwNTM1LDE5LjE2NDk1IEwxMDAuNzA2NTM1LDE5LjE2NDk1IEMxMDAuMTc0NTM1LDE5LjE2NDk1IDk5Ljg2ODEzNTIsMTkuMzQ0OTUgOTkuODY4MTM1MiwxOS42MjIyNSBMOTkuODY4MTM1MiwxOS42NzMzNSBDOTkuODY4MTM1MiwxOS45ODQ3NSAxMDAuMTMzNTM1LDIwLjA1Mjg1IDEwMC45OTg1MzUsMjAuMjA4NTUgQzEwMS45NjY1MzUsMjAuMzg4NTUgMTAyLjQxMDUzNSwyMC42NjU4NSAxMDIuNDEwNTM1LDIxLjI3ODg1IEwxMDIuNDEwNTM1LDIxLjMzOTY1IEMxMDIuNDEwNTM1LDIxLjk0Mjk1IDEwMS44NzI1MzUsMjIuMzY2MjUgMTAwLjgxOTUzNSwyMi4zNjYyNSBMMTAwLjcyNTUzNSwyMi4zNjYyNSBDOTkuNjYyOTM1MiwyMi4zNjYyNSA5OS4xMTcyMzUyLDIxLjkzNTY1IDk5LjExNzIzNTIsMjEuMjAxMDUgTDk5LjExNzIzNTIsMjAuOTY3NTUgTDk5LjgxOTgzNTIsMjAuOTY3NTUgTDk5LjgxOTgzNTIsMjEuMjAxMDUgQzk5LjgxOTgzNTIsMjEuNjQxMzUgMTAwLjEzNjUzNSwyMS44MDQzNSAxMDAuNzM0NTM1LDIxLjgwNDM1IEwxMDAuODE5NTM1LDIxLjgwNDM1IEMxMDEuNDAxNTM1LDIxLjgwNDM1IDEwMS43MTA1MzUsMjEuNjQ4NjUgMTAxLjcxMDUzNSwyMS4zNTY3NSBMMTAxLjcxMDUzNSwyMS4zMDU2NSBDMTAxLjcxMDUzNSwyMS4wMTEyNSAxMDEuNDI4NTM1LDIwLjg5OTM1IDEwMC41NzM1MzUsMjAuNzUzNDUgQzk5LjY3NDkzNTIsMjAuNTk3NzUgOTkuMTc3NTM1MiwyMC4zNTY5NSA5OS4xNzc1MzUyLDE5LjcxOTU1IEw5OS4xNzc1MzUyLDE5LjY1MTQ1IEM5OS4xNzc1MzUyLDE5LjAwNDM1IDk5Ljc2OTEzNTIsMTguNjE3NTUgMTAwLjcxODUzNSwxOC42MTc1NSBMMTAwLjgxMjUzNSwxOC42MTc1NSBMMTAwLjgxMjUzNSwxOC42MDA1NSBMMTAwLjgwOTUzNSwxOC41OTU3NSBaIiBpZD0iUGF0aCIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjguMzI2NjM1MiwyMi4zNTU3NSBMNjguMzI2NjM1MiwxOC42NDg0NSBMNjkuNjQ1MDM1MiwxOC42NDg0NSBDNzAuMDg5NDM1MiwxOC42NDg0NSA3MC40MjUwMzUyLDE4LjcyNjI1IDcwLjY0NzEzNTIsMTguODg5MjUgQzcwLjg2OTMzNTIsMTkuMDUyMjUgNzAuOTgwNDM1MiwxOS4zMDI4NSA3MC45ODA0MzUyLDE5LjY0ODI1IEM3MC45ODA0MzUyLDE5Ljk5MzY1IDcwLjk0NjYzNTIsMTkuOTQyNTUgNzAuODg2MjM1MiwyMC4wNjE3NSBDNzAuODE4NjM1MiwyMC4xODM0NSA3MC43MjQ0MzUyLDIwLjI3ODI1IDcwLjU5NDAzNTIsMjAuMzM2NjUgQzcwLjQ2NjAzNTIsMjAuNDA0NzUgNzAuMzIxMjM1MiwyMC40NDEyNSA3MC4xNDk3MzUyLDIwLjQ0MTI1IEw3MC4xNDk3MzUyLDIwLjQyNDI1IEM3MC40NTg4MzUyLDIwLjQyNDI1IDcwLjcwNTEzNTIsMjAuNTE5MTUgNzAuODc2NTM1MiwyMC42ODIxNSBDNzEuMDQ4MDM1MiwyMC44NDUwNSA3MS4xNDIyMzUyLDIxLjA2MTU1IDcxLjE0MjIzNTIsMjEuMzI5MTUgQzcxLjE0MjIzNTIsMjEuNTk2NzUgNzEuMDMxMTM1MiwyMS45MjUxNSA3MC44MDg5MzUyLDIyLjA4ODE1IEM3MC41ODY4MzUyLDIyLjI2MDg1IDcwLjI2MDgzNTIsMjIuMzQ2MDUgNjkuODUwMzM1MiwyMi4zNDYwNSBMNjguMzM2MzM1MiwyMi4zNDYwNSBMNjguMzI2NjM1MiwyMi4zNTU3NSBaIE02OC44OTE3MzUyLDIwLjIzNDU1IEw2OS42NDUwMzUyLDIwLjIzNDU1IEM2OS44OTM4MzUyLDIwLjIzNDU1IDcwLjA4MjEzNTIsMjAuMTkwNzUgNzAuMjE3MzM1MiwyMC4wOTU4NSBDNzAuMzUyNjM1MiwyMC4wMDA5NSA3MC40MjI2MzUyLDE5Ljg3MjA1IDcwLjQyMjYzNTIsMTkuNjk5MzUgQzcwLjQyMjYzNTIsMTkuNTI2NjUgNzAuMzU1MDM1MiwxOS4zODA2NSA3MC4yMjQ2MzUyLDE5LjI5MzA1IEM3MC4wOTQyMzUyLDE5LjIwNTU1IDY5Ljg5ODYzNTIsMTkuMTY0MTUgNjkuNjQyNjM1MiwxOS4xNjQxNSBMNjguODg5MjM1MiwxOS4xNjQxNSBMNjguODg5MjM1MiwyMC4yNDE4NSBMNjguODg5MjM1MiwyMC4yMzIwNSBMNjguODkxNzM1MiwyMC4yMzQ1NSBaIE02OC44OTE3MzUyLDIxLjg0NzM1IEw2OS44MzM0MzUyLDIxLjg0NzM1IEM3MC4wNjUyMzUyLDIxLjg0NzM1IDcwLjI0MzkzNTIsMjEuNzk2MjUgNzAuMzcxOTM1MiwyMS43MDEzNSBDNzAuNDk5OTM1MiwyMS42MDY1NSA3MC41Njk5MzUyLDIxLjQ2Nzg1IDcwLjU2OTkzNTIsMjEuMjc4MDUgQzcwLjU2OTkzNTIsMjEuMDg4MzUgNzAuNTAyMzM1MiwyMC45NTk0NSA3MC4zNzE5MzUyLDIwLjg1NDg1IEM3MC4yNDE1MzUyLDIwLjc1MDI1IDcwLjA2MjgzNTIsMjAuNjk5MTUgNjkuODMzNDM1MiwyMC42OTkxNSBMNjguODkxNzM1MiwyMC42OTkxNSBMNjguODkxNzM1MiwyMS44NDQ4NSBMNjguODkxNzM1MiwyMS44NDczNSBaIiBpZD0iU2hhcGUiIGZpbGwtcnVsZT0ibm9uemVybyI+PC9wYXRoPgogICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtcnVsZT0ibm9uemVybyIgcG9pbnRzPSI3Mi40ODA4MzUyIDIyLjM1NTc1IDcyLjQ4MDgzNTIgMjAuODY0NTUgNzEuMTg4OTM1MiAxOC42NDg0NSA3MS44MzEyMzUyIDE4LjY0ODQ1IDcyLjc1NjEzNTIgMjAuMzA1MDUgNzMuNjg4MTM1MiAxOC42NDg0NSA3NC4zMzA0MzUyIDE4LjY0ODQ1IDczLjAzODYzNTIgMjAuODY0NTUgNzMuMDM4NjM1MiAyMi4zNTU3NSA3Mi40ODMyMzUyIDIyLjM1NTc1Ij48L3BvbHlnb24+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==\";","var _path, _g, _defs;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoNexcess = function SvgLogoNexcess(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 72,\n height: 72,\n fill: \"none\"\n }, props), /*#__PURE__*/React.createElement(\"g\", {\n clipPath: \"url(#logo-nexcess_svg__a)\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n clipPath: \"url(#logo-nexcess_svg__b)\"\n }, /*#__PURE__*/React.createElement(\"mask\", {\n id: \"logo-nexcess_svg__c\",\n width: 72,\n height: 72,\n x: 0,\n y: 0,\n maskUnits: \"userSpaceOnUse\",\n style: {\n maskType: \"luminance\"\n }\n }, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M72 0H0v72h72z\"\n }))), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n mask: \"url(#logo-nexcess_svg__c)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#3D7BF5\",\n d: \"m19.807 52.542-.015.03-.084.13c-.075.105-.151.196-.227.294.114-.144.235-.287.348-.431h-.015v-.015zm-.015.03-.084.13c-.075.105-.151.196-.227.294.114-.144.235-.287.348-.431h-.015l-.015.015h-.008zm45.576-35.086c-3.958-3.02-9.581-2.384-12.745 1.362a4.33 4.33 0 0 1 3.164-1.377c2.353 0 3.45 1.611 3.814 2.308s1.052 2.52-.318 4.427l-.113.167L43.01 46.979l-1.513-8.416-.583-3.254-2.468-13.66-.794-4.42-.946-5.23H26.058L5.124 41.303l-.53.742c-.053.083-.113.159-.174.242A9.16 9.16 0 0 0 6.774 54.23c3.852 2.944 9.286 2.422 12.503-1.052a4.25 4.25 0 0 1-3.088 1.302c-2.369 0-3.466-1.62-3.822-2.316-.363-.689-1.052-2.513.318-4.428l.287-.393.016-.03 15.961-22.335 1.521 8.424.583 3.254 3.27 18.081h-.008l.946 5.222H45.91l21.123-29.562.34-.484c.076-.114.152-.212.228-.333a9.19 9.19 0 0 0-2.24-12.11zM19.807 52.542l-.015.03-.084.13c-.075.105-.151.196-.227.294.114-.144.235-.287.348-.431h-.015v-.015z\"\n }), /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#0A55CC\",\n d: \"m30.834 54.124-3.02 4.269a14.3 14.3 0 0 1-11.61 5.97c-5.35 0-10.202-2.936-12.647-7.65a14.04 14.04 0 0 1 .87-14.426A9.16 9.16 0 0 0 6.783 54.23c3.852 2.944 9.286 2.422 12.503-1.052.052-.045.105-.106.158-.159q-.002-.024.03-.038c.114-.144.235-.287.349-.431h-.015l8.567-12.087 2.467 13.661zM67.616 29.587a9.19 9.19 0 0 0-2.24-12.109c-3.958-3.02-9.582-2.384-12.745 1.362-.084.106-.174.205-.25.31-.03.038-.053.069-.083.114l-8.666 12.238-2.467-13.668 3.02-4.269a14.27 14.27 0 0 1 11.617-5.971c5.343 0 10.187 2.936 12.64 7.651a14.04 14.04 0 0 1-.81 14.342z\"\n }))))), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"clipPath\", {\n id: \"logo-nexcess_svg__a\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M0 0h72v72H0z\"\n })), /*#__PURE__*/React.createElement(\"clipPath\", {\n id: \"logo-nexcess_svg__b\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M0 0h72v72H0z\"\n })))));\n};\nexport { SvgLogoNexcess as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzIiIGhlaWdodD0iNzIiIHZpZXdCb3g9IjAgMCA3MiA3MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzE2ODZfMjk2KSI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMV8xNjg2XzI5NikiPgo8bWFzayBpZD0ibWFzazBfMTY4Nl8yOTYiIHN0eWxlPSJtYXNrLXR5cGU6bHVtaW5hbmNlIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIwIiB5PSIwIiB3aWR0aD0iNzIiIGhlaWdodD0iNzIiPgo8cGF0aCBkPSJNNzIgMEgwVjcySDcyVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfMTY4Nl8yOTYpIj4KPHBhdGggZD0iTTE5LjgwNjcgNTIuNTQyM0wxOS43OTE1IDUyLjU3MjVMMTkuNzA4MyA1Mi43MDEyQzE5LjYzMjYgNTIuODA3MSAxOS41NTcgNTIuODk3OSAxOS40ODEyIDUyLjk5NjRDMTkuNTk0OCA1Mi44NTI1IDE5LjcxNTkgNTIuNzA4OCAxOS44Mjk0IDUyLjU2NDlIMTkuODE0M1Y1Mi41NDk3TDE5LjgwNjcgNTIuNTQyM1pNMTkuNzkxNSA1Mi41NzI1TDE5LjcwODMgNTIuNzAxMkMxOS42MzI2IDUyLjgwNzEgMTkuNTU3IDUyLjg5NzkgMTkuNDgxMiA1Mi45OTY0QzE5LjU5NDggNTIuODUyNSAxOS43MTU5IDUyLjcwODggMTkuODI5NCA1Mi41NjQ5SDE5LjgxNDNMMTkuNzk5MSA1Mi41ODAxSDE5Ljc5MTVWNTIuNTcyNVpNNjUuMzY4MSAxNy40ODU2QzYxLjQwOTkgMTQuNDY1OCA1NS43ODY2IDE1LjEwMTYgNTIuNjIzMSAxOC44NDhDNTMuNDMyOCAxNy45Nzc1IDU0LjU4MzMgMTcuNDcwNiA1NS43ODY2IDE3LjQ3MDZDNTguMTQwNCAxNy40NzA2IDU5LjIzNzggMTkuMDgyNSA1OS42MDExIDE5Ljc3ODhDNTkuOTY0MyAyMC40NzUxIDYwLjY1MzEgMjIuMjk5MSA1OS4yODMyIDI0LjIwNjNMNTkuMTY5NiAyNC4zNzI4TDQzLjAxMTIgNDYuOTc5NEw0MS40OTc2IDM4LjU2MzVMNDAuOTE0OCAzNS4zMDkxTDM4LjQ0NzUgMjEuNjQ4MkwzNy42NTI5IDE3LjIyODNMMzYuNzA2NyAxMS45OTg2SDI2LjA1ODJMNS4xMjQwNyA0MS4zMDMzTDQuNTk0MyA0Mi4wNDQ5QzQuNTQxMzEgNDIuMTI4MiA0LjQ4MDc3IDQyLjIwMzggNC40MjAyMiA0Mi4yODcxQzIuMDg5MTYgNDYuMjQ1NCAzLjAzNTIxIDUxLjM4NDIgNi43NzM5NyA1NC4yMjk5QzEwLjYyNjMgNTcuMTc0MSAxNi4wNjAzIDU2LjY1MTggMTkuMjc2OCA1My4xNzc5QzE4LjQ3NDcgNTQuMDE4IDE3LjM2MjEgNTQuNDc5NyAxNi4xODkgNTQuNDc5N0MxMy44MjAxIDU0LjQ3OTcgMTIuNzIyNyA1Mi44NjAxIDEyLjM2NyA1Mi4xNjM5QzEyLjAwMzcgNTEuNDc1MSAxMS4zMTUgNDkuNjUxMiAxMi42ODQ5IDQ3LjczNjNMMTIuOTcyNSA0Ny4zNDI4TDEyLjk4NzYgNDcuMzEyNEwyOC45NDkzIDI0Ljk3ODJMMzAuNDcwNCAzMy40MDE4TDMxLjA1MzIgMzYuNjU2M0wzNC4zMjI3IDU0LjczN0gzNC4zMTUxTDM1LjI2MTMgNTkuOTU5M0g0NS45MUw2Ny4wMzMyIDMwLjM5NzJMNjcuMzczNyAyOS45MTI5QzY3LjQ0OTUgMjkuNzk5MyA2Ny41MjUxIDI5LjcwMSA2Ny42MDA4IDI5LjU3OTlDNzAuMDQ1NCAyNS42MDY0IDY5LjEzNzEgMjAuMzY5MSA2NS4zNjA2IDE3LjQ3MDZMNjUuMzY4MSAxNy40ODU2Wk0xOS44MDY3IDUyLjU0MjNMMTkuNzkxNSA1Mi41NzI1TDE5LjcwODMgNTIuNzAxMkMxOS42MzI2IDUyLjgwNzEgMTkuNTU3IDUyLjg5NzkgMTkuNDgxMiA1Mi45OTY0QzE5LjU5NDggNTIuODUyNSAxOS43MTU5IDUyLjcwODggMTkuODI5NCA1Mi41NjQ5SDE5LjgxNDNWNTIuNTQ5N0wxOS44MDY3IDUyLjU0MjNaIiBmaWxsPSIjM0Q3QkY1Ii8+CjxwYXRoIGQ9Ik0zMC44MzM3IDU0LjEyNEwyNy44MTM5IDU4LjM5MjZDMjUuMTM0NyA2Mi4xMzEyIDIwLjgwNTYgNjQuMzYzOSAxNi4yMDQxIDY0LjM2MzlDMTAuODUzMyA2NC4zNjM5IDYuMDAxOTYgNjEuNDI3NCAzLjU1NzM5IDU2LjcxMjRDMS4xNTgyMiA1Mi4wODA1IDEuNDk4OCA0Ni41NzA4IDQuNDI3NzUgNDIuMjg3MUMyLjA5NjY5IDQ2LjI0NTQgMy4wNDI3NSA1MS4zODQyIDYuNzgxNSA1NC4yMjk5QzEwLjYzMzggNTcuMTc0MSAxNi4wNjc4IDU2LjY1MTggMTkuMjg0NSA1My4xNzc5QzE5LjMzNzMgNTMuMTMyNSAxOS4zOTA0IDUzLjA3MiAxOS40NDM0IDUzLjAxOUMxOS40NDM0IDUzLjAwMzggMTkuNDUxIDUyLjk4ODggMTkuNDczNiA1Mi45ODEyQzE5LjU4NzEgNTIuODM3MyAxOS43MDgzIDUyLjY5MzYgMTkuODIxOCA1Mi41NDk3SDE5LjgwNjZMMjguMzc0IDQwLjQ2MzJMMzAuODQxMyA1NC4xMjRIMzAuODMzN1oiIGZpbGw9IiMwQTU1Q0MiLz4KPHBhdGggZD0iTTY3LjYxNjEgMjkuNTg3NEM3MC4wNjA3IDI1LjYxNCA2OS4xNTI1IDIwLjM3NjcgNjUuMzc1OSAxNy40NzhDNjEuNDE3NiAxNC40NTgyIDU1Ljc5NDMgMTUuMDk0IDUyLjYzMDggMTguODQwNEM1Mi41NDc1IDE4Ljk0NjMgNTIuNDU2NyAxOS4wNDQ3IDUyLjM4MSAxOS4xNTA2QzUyLjM1MDggMTkuMTg4NCA1Mi4zMjggMTkuMjE4OCA1Mi4yOTc4IDE5LjI2NDFMNDMuNjMyMSAzMS41MDIxTDQxLjE2NDggMTcuODMzOEw0NC4xODQ2IDEzLjU2NTJDNDYuODYzOCA5LjgxMTI4IDUxLjE5MjggNy41OTM3NSA1NS44MDE5IDcuNTkzNzVDNjEuMTQ1MiA3LjU5Mzc1IDY1Ljk4ODkgMTAuNTMwMyA2OC40NDExIDE1LjI0NTNDNzAuODI1MSAxOS44Mzk0IDcwLjUwNzIgMjUuMzAzNiA2Ny42MzEzIDI5LjU4NzRINjcuNjE2MVoiIGZpbGw9IiMwQTU1Q0MiLz4KPC9nPgo8L2c+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTY4Nl8yOTYiPgo8cmVjdCB3aWR0aD0iNzIiIGhlaWdodD0iNzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjxjbGlwUGF0aCBpZD0iY2xpcDFfMTY4Nl8yOTYiPgo8cmVjdCB3aWR0aD0iNzIiIGhlaWdodD0iNzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==\";","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoTecNobg = function SvgLogoTecNobg(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 32,\n height: 32,\n fill: \"none\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#000\",\n fillRule: \"evenodd\",\n d: \"M16.57 19.647c-.781.317-1.505.488-2.03.46-.681-.038-.972-.338-.973-.451 0-.08.253-.333 1.037-.39q.186-.013.386-.014c.536 0 1.132.088 1.58.395m1.463 6.907c-2.866.79-5.893.061-7.715-1.859-1.289-1.358-1.721-3.058-1.186-4.664 1.077-3.23 6.237-5.17 9.534-5.17l.106.001c1.229.016 2.08.313 2.22.775.08.26-.107.713-.5 1.213-.691.882-1.743 1.682-2.812 2.268-.678-.743-1.766-1.082-3.157-.982-1.548.113-2.094.864-2.089 1.53.006.726.71 1.5 2.044 1.574.807.044 1.771-.205 2.74-.629.142.558.098 1.29-.134 2.162a.567.567 0 0 0 1.095.292c.316-1.185.34-2.18.071-2.97 1.265-.71 2.434-1.652 3.135-2.545.657-.84.89-1.594.692-2.243-.144-.472-.483-.846-.993-1.112.039-4.26.794-7.202 1.474-7.206h.004c.1 0 .235.023.4.187.553.55 1.211 2.351 1.211 7.82 0 5.396-.462 9.99-6.14 11.558m-5.411-12.586v-.043l-.008-.063c-.082-1.163.058-2.08.412-2.571a.95.95 0 0 1 .696-.412c.416-.05.755.058 1.039.33.55.53.872 1.674.841 2.926-.944.233-1.91.565-2.828.992a12 12 0 0 1-.152-1.159m4.884-1.975c.209-.227.475-.338.815-.338.54 0 .774.177.904.31.31.318.478.934.5 1.831a7.6 7.6 0 0 0-1.055-.069c-.511 0-1.069.045-1.651.13-.025-.823.147-1.493.487-1.864m6.255-5.621c-.34-.339-.755-.517-1.2-.517h-.01c-1.494.009-2.01 2.237-2.268 3.913-.075.491-.134.993-.179 1.479l-.067-.075c-.422-.431-1-.65-1.716-.65-.656 0-1.227.243-1.65.704-.12.131-.224.283-.318.447-.187-.492-.448-.937-.805-1.28-.531-.51-1.21-.732-1.963-.64a2.1 2.1 0 0 0-1.477.874l-.004.007c-.621-3.098-1.802-6.84-3.863-6.625-.507.053-.955.326-1.296.789-1.59 2.16-.843 8.587-.152 12.043a.567.567 0 0 0 1.112-.223c-1.158-5.787-.9-9.989-.046-11.148.2-.273.382-.321.5-.334 1.138-.118 2.54 3.856 3.131 8.872.047.622.141 1.203.232 1.656l.002.006c-1.703.981-3.11 2.324-3.668 4.002-.672 2.016-.148 4.131 1.439 5.803C11.044 27.108 13.329 28 15.729 28c.863 0 1.74-.116 2.604-.354 6.44-1.777 6.973-6.998 6.973-12.65 0-4.837-.491-7.577-1.545-8.624\",\n clipRule: \"evenodd\"\n })));\n};\nexport { SvgLogoTecNobg as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNi41Njk4IDE5LjY0NzNDMTUuNzg4NSAxOS45NjQzIDE1LjA2NTQgMjAuMTM1MyAxNC41Mzk2IDIwLjEwN0MxMy44NTg2IDIwLjA2OTEgMTMuNTY3OSAxOS43Njg3IDEzLjU2NjggMTkuNjU1N0MxMy41NjYzIDE5LjU3NTMgMTMuODIwMiAxOS4zMjM0IDE0LjYwNCAxOS4yNjY0QzE0LjcyNjkgMTkuMjU3NiAxNC44NTY2IDE5LjI1MiAxNC45OTAyIDE5LjI1MkMxNS41MjU3IDE5LjI1MiAxNi4xMjE3IDE5LjM0MDIgMTYuNTY5OCAxOS42NDczWk0xOC4wMzI2IDI2LjU1MzhDMTUuMTY3NSAyNy4zNDQxIDEyLjEzOTkgMjYuNjE1MiAxMC4zMTgzIDI0LjY5NTNDOS4wMjkxOSAyMy4zMzY4IDguNTk2OTkgMjEuNjM2NyA5LjEzMjE2IDIwLjAzMUMxMC4yMDg4IDE2LjgwMDQgMTUuMzY4NiAxNC44NjEzIDE4LjY2NjIgMTQuODYxM0MxOC43MDE3IDE0Ljg2MTMgMTguNzM3IDE0Ljg2MTQgMTguNzcxOSAxNC44NjJDMjAuMDAwNyAxNC44Nzc3IDIwLjg1MTYgMTUuMTc0NyAyMC45OTI3IDE1LjYzNzVDMjEuMDcxNyAxNS44OTY1IDIwLjg4NDggMTYuMzQ5OCAyMC40OTI3IDE2Ljg0OTlDMTkuODAwNyAxNy43MzIzIDE4Ljc0OTIgMTguNTMyIDE3LjY3OTcgMTkuMTE4NUMxNy4wMDE3IDE4LjM3NDYgMTUuOTE0MSAxOC4wMzYxIDE0LjUyMzEgMTguMTM2M0MxMi45NzQ1IDE4LjI0ODcgMTIuNDI4NyAxOS4wMDAyIDEyLjQzNDMgMTkuNjY1OUMxMi40NDA0IDIwLjM5MTkgMTMuMTQ0MyAyMS4xNjU1IDE0LjQ3NzggMjEuMjM5NkMxNS4yODQ4IDIxLjI4MzcgMTYuMjQ5NCAyMS4wMzUxIDE3LjIxOCAyMC42MTEzQzE3LjM2MDEgMjEuMTY5IDE3LjMxNjEgMjEuOTAwNyAxNy4wODM1IDIyLjc3MzFDMTcuMDAyOSAyMy4wNzU0IDE3LjE4MjcgMjMuMzg2MyAxNy40ODUxIDIzLjQ2NjlDMTcuNzg3MyAyMy41NDc1IDE4LjA5ODEgMjMuMzY3OCAxOC4xNzg5IDIzLjA2NTFDMTguNDk1IDIxLjg3OTcgMTguNTE4NCAyMC44ODU0IDE4LjI1MDIgMjAuMDk1NUMxOS41MTQ4IDE5LjM4NTkgMjAuNjgzOCAxOC40NDMxIDIxLjM4NDcgMTcuNTQ5NkMyMi4wNDI0IDE2LjcxMDkgMjIuMjc1MyAxNS45NTYzIDIyLjA3NzIgMTUuMzA2NkMyMS45MzMzIDE0LjgzNDkgMjEuNTk0NSAxNC40NjA3IDIxLjA4NCAxNC4xOTUzQzIxLjEyMyA5LjkzNTYgMjEuODc4MSA2Ljk5MzI4IDIyLjU1NzkgNi45ODkyNkgyMi41NjJDMjIuNjYxOSA2Ljk4OTI2IDIyLjc5NyA3LjAxMTY0IDIyLjk2MjYgNy4xNzYxNkMyMy41MTQ5IDcuNzI1MTQgMjQuMTczIDkuNTI3MzYgMjQuMTczIDE0Ljk5NjFDMjQuMTczIDIwLjM5MiAyMy43MTExIDI0Ljk4NjIgMTguMDMyNiAyNi41NTM4Wk0xMi42MjE5IDEzLjk2OEMxMi42MjEyIDEzLjk1MzggMTIuNjIzIDEzLjkzOTggMTIuNjIxMiAxMy45MjU1QzEyLjYxODggMTMuOTA1MSAxMi42MTYzIDEzLjg4MzQgMTIuNjEzNyAxMy44NjI0QzEyLjUzMjIgMTIuNjk5MiAxMi42NzE4IDExLjc4MjUgMTMuMDI2NSAxMS4yOTA5QzEzLjIwMjcgMTEuMDQ2OCAxMy40MjM3IDEwLjkxNiAxMy43MjIyIDEwLjg3OTNDMTQuMTM4MyAxMC44MjkyIDE0LjQ3NjggMTAuOTM2NSAxNC43NjEgMTEuMjA5NkMxNS4zMTE2IDExLjczODggMTUuNjMzIDEyLjg4MzEgMTUuNjAyNCAxNC4xMzVDMTQuNjU4NCAxNC4zNjc4IDEzLjY5MTkgMTQuNjk5NSAxMi43NzM3IDE1LjEyNjVDMTIuNzAxMyAxNC43MjAxIDEyLjY1MTMgMTQuMzMzIDEyLjYyMTkgMTMuOTY4Wk0xNy41MDYzIDExLjk5MzFDMTcuNzE1IDExLjc2NTkgMTcuOTgxMyAxMS42NTU0IDE4LjMyMSAxMS42NTU0QzE4Ljg2MDkgMTEuNjU1NCAxOS4wOTU1IDExLjgzMiAxOS4yMjUzIDExLjk2NDlDMTkuNTM1NCAxMi4yODI2IDE5LjcwMjYgMTIuODk4NyAxOS43MjU1IDEzLjc5NkMxOS40MzUxIDEzLjc1NTggMTkuMTIxOSAxMy43MzIzIDE4Ljc4NTUgMTMuNzI4MUMxOC43NDczIDEzLjcyNzYgMTguNzA5MSAxMy43Mjc0IDE4LjY3MDUgMTMuNzI3NEMxOC4xNTg4IDEzLjcyNzQgMTcuNjAxIDEzLjc3MTggMTcuMDE4OCAxMy44NTY1QzE2Ljk5MzcgMTMuMDM0MiAxNy4xNjU1IDEyLjM2NDIgMTcuNTA2MyAxMS45OTMxWk0yMy43NjExIDYuMzcxNTJDMjMuNDIxIDYuMDMzMzggMjMuMDA1OSA1Ljg1NDg4IDIyLjU2MDEgNS44NTQ4OEgyMi41NTAxQzIxLjA1NjUgNS44NjM3OSAyMC41NDEzIDguMDkyMjYgMjAuMjgzNCA5Ljc2NzcxQzIwLjIwNzkgMTAuMjU5NCAyMC4xNDk1IDEwLjc2MTEgMjAuMTA0IDExLjI0NjhDMjAuMDgxOCAxMS4yMjIgMjAuMDU5OSAxMS4xOTYzIDIwLjAzNjcgMTEuMTcyNUMxOS42MTUgMTAuNzQwNSAxOS4wMzc3IDEwLjUyMTQgMTguMzIxIDEwLjUyMTRDMTcuNjY0OSAxMC41MjE0IDE3LjA5NDQgMTAuNzY0OCAxNi42NzEzIDExLjIyNTdDMTYuNTUwNiAxMS4zNTcyIDE2LjQ0NjkgMTEuNTA5NCAxNi4zNTMyIDExLjY3MjdDMTYuMTY2MyAxMS4xODA5IDE1LjkwNSAxMC43MzU2IDE1LjU0NzggMTAuMzkyMUMxNS4wMTcgOS44ODIwNiAxNC4zMzg4IDkuNjYxMjQgMTMuNTg0OSA5Ljc1MzlDMTIuOTc3MyA5LjgyODU2IDEyLjQ2NjYgMTAuMTMwMyAxMi4xMDggMTAuNjI3MkMxMi4xMDY2IDEwLjYyOTUgMTIuMTA1NCAxMC42MzE5IDEyLjEwMzggMTAuNjMzOUMxMS40ODI2IDcuNTM1NzUgMTAuMzAxNiAzLjc5NDc4IDguMjQxIDQuMDA4NzhDNy43MzM5NyA0LjA2MjEgNy4yODU4NyA0LjMzNTAyIDYuOTQ1NDYgNC43OTc2NEM1LjM1NTg1IDYuOTU4NjIgNi4xMDE3IDEzLjM4NDYgNi43OTI4MyAxNi44NDA3QzYuODQ2ODUgMTcuMTEwMSA3LjA4MzQxIDE3LjI5NjcgNy4zNDgxMSAxNy4yOTY3QzcuMzg1IDE3LjI5NjcgNy40MjI0MiAxNy4yOTMgNy40NiAxNy4yODU1QzcuNzY2ODQgMTcuMjI0MSA3Ljk2NTk4IDE2LjkyNTUgNy45MDQ2MSAxNi42MTg1QzYuNzQ3MiAxMC44MzE0IDcuMDA1NDMgNi42Mjk0IDcuODU4ODEgNS40Njk1NEM4LjA1OTM0IDUuMTk2OTcgOC4yNDA2NSA1LjE0ODcxIDguMzU5NzEgNS4xMzYzQzkuNDk3MiA1LjAxNzkzIDEwLjg5ODUgOC45OTIzMSAxMS40OSAxNC4wMDg1QzExLjUzNzQgMTQuNjI5NyAxMS42MzE0IDE1LjIxMTQgMTEuNzIyMiAxNS42NjM1QzExLjcyMjUgMTUuNjY1NiAxMS43MjM2IDE1LjY2NzYgMTEuNzIzOSAxNS42Njk3QzEwLjAyMDUgMTYuNjUxNSA4LjYxNDggMTcuOTk0MSA4LjA1NTY3IDE5LjY3MkM3LjM4MzYgMjEuNjg3NyA3LjkwODI5IDIzLjgwMzEgOS40OTQ5MyAyNS40NzUyQzExLjA0NCAyNy4xMDc1IDEzLjMyOTQgMjggMTUuNzI4NSAyOEMxNi41OTE3IDI3Ljk5OTggMTcuNDY5OSAyNy44ODQzIDE4LjMzMzMgMjcuNjQ2QzI0Ljc3MjcgMjUuODY4NiAyNS4zMDU5IDIwLjY0NzggMjUuMzA1OSAxNC45OTU1QzI1LjMwNTkgMTAuMTU5NSAyNC44MTUgNy40MTkzMSAyMy43NjExIDYuMzcxNTJaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K\";","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nvar SvgLogoTec = function SvgLogoTec(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 46,\n height: 46,\n fill: \"none\",\n \"aria-labelledby\": \"events-calendar-title\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#3D7BF5\",\n d: \"M0 9.857C0 4.413 4.413 0 9.857 0h26.286C41.587 0 46 4.413 46 9.857v26.286C46 41.587 41.587 46 36.143 46H9.857C4.413 46 0 41.587 0 36.143z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#FEFBF2\",\n fillRule: \"evenodd\",\n d: \"M12.262 5.513c.834-.086 1.57.232 2.203.802.629.566 1.17 1.388 1.634 2.343.86 1.767 1.485 4.046 1.932 6.163a3.28 3.28 0 0 1 1.98-.97c1.167-.143 2.227.2 3.053.994.44.423.78.941 1.041 1.507q.11-.15.232-.286c.664-.723 1.56-1.103 2.578-1.103.95 0 1.759.254 2.393.769.057-.547.124-1.103.208-1.65l.075-.467c.187-1.109.462-2.341.917-3.345.516-1.14 1.308-2.071 2.543-2.08h.017c.718 0 1.382.29 1.918.824.822.817 1.393 2.256 1.764 4.33.373 2.082.552 4.848.552 8.362 0 4.1-.191 8.091-1.574 11.384-1.393 3.315-3.985 5.906-8.728 7.215a14.5 14.5 0 0 1-3.847.523c-3.54 0-6.926-1.317-9.227-3.742-2.36-2.486-3.152-5.651-2.145-8.672.821-2.464 2.85-4.422 5.282-5.855a20 20 0 0 1-.309-2.256l-.084-.676c-.434-3.353-1.115-6.338-1.878-8.502-.408-1.156-.835-2.065-1.253-2.669q-.315-.452-.592-.65c-.182-.132-.334-.172-.462-.16a.6.6 0 0 0-.222.071 1.1 1.1 0 0 0-.33.313c-.276.376-.523 1.03-.703 1.957-.18.92-.289 2.088-.308 3.47-.038 2.764.285 6.37 1.122 10.555a1.073 1.073 0 1 1-2.104.421c-.503-2.517-1.026-6.117-1.134-9.484-.054-1.684-.005-3.317.205-4.73.21-1.408.583-2.627 1.195-3.46.53-.72 1.241-1.16 2.056-1.246M13.818 33.6c.343.77.84 1.505 1.483 2.183 1.817 1.915 4.462 3.013 7.288 3.14a12 12 0 0 1-1.89-.235c-2.095-.433-3.994-1.425-5.398-2.905a8 8 0 0 1-1.28-1.768 7 7 0 0 1-.202-.416zm19.246-23.263c-.03 0-.094.018-.194.121-.099.104-.21.27-.325.506-.23.473-.456 1.179-.656 2.09-.394 1.791-.677 4.333-.713 7.348.713.405 1.21.967 1.428 1.682.322 1.058-.072 2.24-1.047 3.483-1.01 1.287-2.66 2.628-4.448 3.657.342 1.174.281 2.604-.16 4.257a1.073 1.073 0 0 1-2.072-.552c.292-1.094.367-2.01.252-2.726-1.33.55-2.66.876-3.806.814-2.017-.112-3.191-1.302-3.202-2.531-.004-.556.223-1.14.756-1.602.53-.459 1.349-.785 2.508-.869 1.974-.142 3.582.31 4.64 1.361 1.475-.83 2.902-1.931 3.844-3.132.275-.35.47-.678.584-.953.117-.284.13-.475.099-.58-.066-.216-.325-.455-.863-.643-.523-.183-1.249-.295-2.123-.306h-.15c-2.352 0-5.384.693-8.018 1.968-2.642 1.278-4.832 3.114-5.581 5.363-.744 2.232-.15 4.605 1.665 6.518 2.57 2.71 6.865 3.753 10.947 2.628 4.048-1.118 6.213-3.301 7.38-6.157 1.177-2.878 1.347-6.457 1.347-10.375 0-3.96-.238-6.58-.573-8.303-.336-1.732-.764-2.524-1.11-2.867a.7.7 0 0 0-.24-.17.4.4 0 0 0-.165-.03zM13.289 31.66q.036.33.108.656l-.043-.218a6 6 0 0 1-.065-.438m6.728-3.19c.001.163.42.594 1.398.652-.854-.05-1.281-.386-1.377-.579a.2.2 0 0 1-.021-.073m2.065-.336q-.282 0-.543.02c-.545.04-.888.146-1.086.244a1 1 0 0 0-.146.09.8.8 0 0 0 .173.136c.19.112.502.226.962.251.6.033 1.414-.131 2.33-.458-.514-.21-1.115-.283-1.69-.283m4.482-.778-.58.334c.387-.213.774-.445 1.15-.694zm-2.483-.838q.723.226 1.287.627l-.231-.154a4.6 4.6 0 0 0-1.056-.473m-1.59-.27a9 9 0 0 0-1.089.016c-.702.051-1.262.193-1.7.393l.278-.113c.39-.14.86-.24 1.422-.28a8.6 8.6 0 0 1 1.43.01zm-8.433-1.038a10 10 0 0 0 .354-.357zm16.008-.813c-.503.64-1.135 1.25-1.835 1.807l.258-.21a10.8 10.8 0 0 0 1.576-1.597m-12.84-2.34q.056.331.113.62l.003.008-.002-.008q-.057-.288-.113-.62m14.618-.817q.363.404.521.918l-.09-.25a2.4 2.4 0 0 0-.431-.668m-12.977.657v-.001m1.406-5.915a1.13 1.13 0 0 0-.836.495c-.226.313-.397.781-.494 1.393-.095.606-.117 1.337-.06 2.162l.01.091.004.067v.014q.05.635.163 1.332a23 23 0 0 1 3.663-1.272 8.2 8.2 0 0 0-.286-2.253c-.205-.715-.504-1.276-.86-1.618a1.46 1.46 0 0 0-1.11-.426zM10.98 18.9q.079.685.178 1.4l-.095-.708a55 55 0 0 1-.083-.691m15.874.976a16 16 0 0 0 .568-.011zm.061-2.768c-.43 0-.747.136-.998.409-.394.43-.633 1.218-.642 2.25a17 17 0 0 1 2.318-.151q.577.007 1.096.064c-.06-1.126-.291-1.84-.64-2.198a1.1 1.1 0 0 0-.353-.242c-.17-.073-.417-.132-.78-.132m-.688-1.83a3 3 0 0 0-.482.133 3 3 0 0 0 .649-.162zm-8.327.088-.007.007v.002q.005-.004.006-.01.05-.067.101-.131zm11.863-1.248a30 30 0 0 0-.077.538zm-7.489.43c-.652-.396-1.412-.55-2.232-.45-.44.054-.846.191-1.206.404l.137-.076q.49-.256 1.07-.327c.82-.1 1.579.053 2.232.45m8.283-3.745c-.282.739-.483 1.571-.634 2.374l.098-.484c.137-.648.31-1.3.536-1.89m4.91-.718a7 7 0 0 1 .339.715l-.109-.254a6 6 0 0 0-.23-.46m-2.414-1.645c-1.084.006-1.813.818-2.318 1.932l.098-.205c.5-1.007 1.204-1.721 2.22-1.727M9.846 7.943a9.4 9.4 0 0 0-.502 1.8l.1-.488c.109-.477.242-.918.402-1.312M34.95 9.34q.14.158.268.344l-.132-.18a4 4 0 0 0-.136-.164m-20.879-.497q.034.06.066.122a8 8 0 0 0-.229-.4zm-.848-2.985c1.049.334 1.915 1.415 2.625 2.858-.74-1.502-1.647-2.611-2.753-2.895z\",\n clipRule: \"evenodd\"\n })));\n};\nexport { SvgLogoTec as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDYiIGhlaWdodD0iNDYiIHZpZXdCb3g9IjAgMCA0NiA0NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiByb2xlPSJpbWciIGFyaWEtbGFiZWxsZWRieT0iZXZlbnRzLWNhbGVuZGFyLXRpdGxlIj4KPHRpdGxlIGlkPSJldmVudHMtY2FsZW5kYXItdGl0bGUiPlRoZSBFdmVudHMgQ2FsZW5kYXIgbG9nbzwvdGl0bGU+CjxwYXRoIGQ9Ik0wIDkuODU3MTRDMCA0LjQxMzE5IDQuNDEzMTkgMCA5Ljg1NzE0IDBIMzYuMTQyOEM0MS41ODY4IDAgNDYgNC40MTMxOSA0NiA5Ljg1NzE0VjM2LjE0MjlDNDYgNDEuNTg2OCA0MS41ODY4IDQ2IDM2LjE0MjggNDZIOS44NTcxNEM0LjQxMzE5IDQ2IDAgNDEuNTg2OCAwIDM2LjE0MjlWOS44NTcxNFoiIGZpbGw9IiMzRDdCRjUiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMi4yNjE4IDUuNTEzMDlDMTMuMDk2MyA1LjQyNjUzIDEzLjgzMTQgNS43NDUwNiAxNC40NjQ5IDYuMzE0ODVDMTUuMDk0IDYuODgwNzUgMTUuNjM0NCA3LjcwMzMzIDE2LjA5ODcgOC42NTc2MkMxNi45NTg2IDEwLjQyNSAxNy41ODQyIDEyLjcwNDMgMTguMDMxMyAxNC44MjA3QzE4LjU1OTEgMTQuMjc5NiAxOS4yMzY4IDEzLjk0NjMgMjAuMDExOCAxMy44NTFDMjEuMTc3OCAxMy43MDc3IDIyLjIzODEgMTQuMDUxMiAyMy4wNjQ1IDE0Ljg0NTFDMjMuNTAzOCAxNS4yNjc3IDIzLjg0MzIgMTUuNzg2MiAyNC4xMDU1IDE2LjM1MkMyNC4xNzc3IDE2LjI1MjYgMjQuMjU0MyAxNi4xNTU5IDI0LjMzNyAxNi4wNjU4QzI1LjAwMDggMTUuMzQyOSAyNS44OTcxIDE0Ljk2MzQgMjYuOTE1MSAxNC45NjMzQzI3Ljg2NDggMTQuOTYzMyAyOC42NzM5IDE1LjIxNzIgMjkuMzA3NyAxNS43MzE4QzI5LjM2NTMgMTUuMTg1MiAyOS40MzE2IDE0LjYyOSAyOS41MTU3IDE0LjA4MTRMMjkuNTkwOSAxMy42MTQ3QzI5Ljc3OCAxMi41MDY0IDMwLjA1MzIgMTEuMjczOCAzMC41MDc5IDEwLjI2OTlDMzEuMDIzOSA5LjEzMDkgMzEuODE1NSA4LjE5ODUzIDMzLjA1MDkgOC4xOTA4MkgzMy4wNjc1QzMzLjc4NTYgOC4xOTA5MiAzNC40NTAxIDguNDgwODEgMzQuOTg2NCA5LjAxNDA3QzM1LjgwNzggOS44MzA5NyAzNi4zNzg4IDExLjI3MDQgMzYuNzUwMSAxMy4zNDMyQzM3LjEyMzEgMTUuNDI1OCAzNy4zMDE4IDE4LjE5MTcgMzcuMzAxOCAyMS43MDY0QzM3LjMwMTggMjUuODA1OCAzNy4xMTA2IDI5Ljc5NzEgMzUuNzI3NiAzMy4wOTAyQzM0LjMzNTMgMzYuNDA1IDMxLjc0MzIgMzguOTk1OCAyNy4wMDAxIDQwLjMwNTFDMjUuNzI1NSA0MC42NTY4IDI0LjQyOCA0MC44MjczIDIzLjE1MzQgNDAuODI3NUMxOS42MTI2IDQwLjgyNzQgMTYuMjI2OCAzOS41MTA4IDEzLjkyNTkgMzcuMDg2M0MxMS41NjY2IDM0LjU5OTkgMTAuNzc0IDMxLjQzNDkgMTEuNzgxMyAyOC40MTM1QzEyLjYwMjIgMjUuOTUgMTQuNjMxNSAyMy45OTIyIDE3LjA2MjYgMjIuNTU5QzE2Ljk0MDUgMjEuOTI0NSAxNi44MTgyIDIxLjEzODkgMTYuNzU0IDIwLjMwMzFMMTYuNjcgMTkuNjI3M0MxNi4yMzU2IDE2LjI3NDQgMTUuNTU1NCAxMy4yODk0IDE0Ljc5MjEgMTEuMTI1NEMxNC4zODQzIDkuOTY5MzMgMTMuOTU3MSA5LjA2MDQzIDEzLjUzOTEgOC40NTY0NUMxMy4zMyA4LjE1NDMzIDEzLjEzMTIgNy45Mzg4NSAxMi45NDczIDcuODA2MDZDMTIuNzY0OSA3LjY3NDM0IDEyLjYxMjUgNy42MzM2NiAxMi40ODU0IDcuNjQ2ODhDMTIuNDIyNSA3LjY1MzQ4IDEyLjM0ODcgNy42NjkxNSAxMi4yNjI4IDcuNzE3MTlDMTIuMTc1MyA3Ljc2NjE4IDEyLjA2MTUgNy44NTU5MiAxMS45MzM3IDguMDI5NjlDMTEuNjU3MiA4LjQwNTY5IDExLjQxMDIgOS4wNTkzNSAxMS4yMjk2IDkuOTg2NzJDMTEuMDUwMiAxMC45MDc2IDEwLjk0MTEgMTIuMDc1NCAxMC45MjE5IDEzLjQ1NzRDMTAuODgzOCAxNi4yMjExIDExLjIwNzEgMTkuODI3MyAxMi4wNDQgMjQuMDEyMUMxMi4xNiAyNC41OTI5IDExLjc4MzggMjUuMTU4NiAxMS4yMDMyIDI1LjI3NDhDMTEuMTMyOCAyNS4yODg5IDExLjA2MTMgMjUuMjk1MyAxMC45OTEzIDI1LjI5NTNDMTAuNDkwNCAyNS4yOTUgMTAuMDQyOCAyNC45NDI1IDkuOTQwNSAyNC40MzNDOS40MzcxMyAyMS45MTU4IDguOTEzOTMgMTguMzE2MSA4LjgwNTc0IDE0Ljk0ODZDOC43NTE2NiAxMy4yNjUxIDguODAwNjEgMTEuNjMxOCA5LjAxMDgyIDEwLjIxODJDOS4yMjAxNSA4LjgxMDggOS41OTM2NCA3LjU5MjA5IDEwLjIwNjEgNi43NTkxOEMxMC43MzU4IDYuMDM5MzkgMTEuNDQ3MSA1LjU5ODk5IDEyLjI2MTggNS41MTMwOVpNMTMuODE4NCAzMy41OTlDMTQuMTYxMSAzNC4zNjgxIDE0LjY1NzggMzUuMTA0IDE1LjMwMDkgMzUuNzgxNkMxNy4xMTgyIDM3LjY5NyAxOS43NjI2IDM4Ljc5NTMgMjIuNTg4OSAzOC45MjIzQzIyLjA3NTEgMzguODk5MiAyMS41NjczIDM4Ljg0MzYgMjEuMDY5NCAzOC43NTcyQzIwLjk0NTEgMzguNzM1NyAyMC44MjE0IDM4LjcxMjQgMjAuNjk4MyAzOC42ODY5QzE4LjYwMzkgMzguMjUzNyAxNi43MDUyIDM3LjI2MTcgMTUuMzAwOSAzNS43ODE2QzE0Ljc3NDcgMzUuMjI3MSAxNC4zNDc0IDM0LjYzMyAxNC4wMjE2IDM0LjAxNDFDMTMuOTQ5MiAzMy44NzY1IDEzLjg4MTcgMzMuNzM3OSAxMy44MTk0IDMzLjU5ODFMMTMuODE4NCAzMy41OTlaTTMzLjA2MzUgMTAuMzM2M0MzMy4wMzQ2IDEwLjMzNjggMzIuOTY5OSAxMC4zNTM5IDMyLjg3MDIgMTAuNDU3NEMzMi43NzExIDEwLjU2MDYgMzIuNjYwMiAxMC43MjY3IDMyLjU0NSAxMC45NjMzQzMyLjMxNTEgMTEuNDM1NSAzMi4wODkgMTIuMTQxNiAzMS44ODg3IDEzLjA1MzFDMzEuNDk1NCAxNC44NDQyIDMxLjIxMTYgMTcuMzg2MyAzMS4xNzU5IDIwLjQwMDhDMzEuODg5IDIwLjgwNjIgMzIuMzg1MiAyMS4zNjgxIDMyLjYwMzYgMjIuMDgzNEMzMi45MjYgMjMuMTQwOSAzMi41MzIgMjQuMzIyMiAzMS41NTY3IDI1LjU2NThDMzAuNTQ2OSAyNi44NTMxIDI4Ljg5NjMgMjguMTk0MSAyNy4xMDg1IDI5LjIyMzFDMjcuNDUxNCAzMC4zOTczIDI3LjM5MDEgMzEuODI2NyAyNi45NDkzIDMzLjQ3OTlDMjYuNzk2NCAzNC4wNTIxIDI2LjIwODUgMzQuMzkzIDI1LjYzNjggMzQuMjQwNkMyNS4wNjQ2IDM0LjA4OCAyNC43MjQ5IDMzLjQ5OTggMjQuODc3IDMyLjkyODFDMjUuMTY4NyAzMS44MzM3IDI1LjI0NDUgMzAuOTE3NCAyNS4xMjkgMzAuMjAxNkMyMy43OTk1IDMwLjc1MTQgMjIuNDY4MiAzMS4wNzg1IDIxLjMyMzMgMzEuMDE2QzE5LjMwNjEgMzAuOTAzNiAxOC4xMzE3IDI5LjcxMzggMTguMTIxMiAyOC40ODQ4QzE4LjExNjYgMjcuOTI5NCAxOC4zNDM4IDI3LjM0NTIgMTguODc3IDI2Ljg4MzJDMTkuNDA3NCAyNi40MjQgMjAuMjI1NyAyNi4wOTgzIDIxLjM4NDggMjYuMDE0MUMyMy4zNTg4IDI1Ljg3MiAyNC45NjczIDI2LjMyNDQgMjYuMDI1NSAyNy4zNzU0QzI3LjUwMDMgMjYuNTQ0MyAyOC45MjcgMjUuNDQzOSAyOS44NjkyIDI0LjI0MjZDMzAuMTQ0IDIzLjg5MjIgMzAuMzM5NyAyMy41NjU0IDMwLjQ1MzIgMjMuMjkwNEMzMC41NzAzIDIzLjAwNjUgMzAuNTgzNiAyMi44MTQ5IDMwLjU1MTggMjIuNzEwNEMzMC40ODU4IDIyLjQ5MzkgMzAuMjI3NSAyMi4yNTQ3IDI5LjY4OTUgMjIuMDY2OEMyOS4xNjYzIDIxLjg4NDIgMjguNDQwNCAyMS43NzI0IDI3LjU2NTUgMjEuNzYxMUMyNy41MTY2IDIxLjc2MDQgMjcuNDY1NiAyMS43NjAyIDI3LjQxNTEgMjEuNzYwMkMyNS4wNjM5IDIxLjc2MDIgMjIuMDMyMyAyMi40NTQyIDE5LjM5NzUgMjMuNzI4OUMxNi43NTU2IDI1LjAwNzIgMTQuNTY2IDI2Ljg0MzEgMTMuODE2NSAyOS4wOTIyQzEzLjA3MyAzMS4zMjM3IDEzLjY2NjMgMzMuNjk2OCAxNS40ODE1IDM1LjYwOThDMTguMDUyMyAzOC4zMTkyIDIyLjM0NjggMzkuMzYzNCAyNi40Mjg4IDM4LjIzNzdDMzAuNDc3IDM3LjEyMDIgMzIuNjQyNCAzNC45MzY3IDMzLjgwOTYgMzIuMDgxNEMzNC45ODY0IDI5LjIwMjcgMzUuMTU2MyAyNS42MjQ1IDM1LjE1NjMgMjEuNzA2NEMzNS4xNTYzIDE3Ljc0NjYgMzQuOTE3NyAxNS4xMjYxIDM0LjU4MzEgMTMuNDAyN0MzNC4yNDY3IDExLjY3MDYgMzMuODE5NSAxMC44Nzk0IDMzLjQ3MzcgMTAuNTM1NkMzMy4zNzQzIDEwLjQzNjcgMzMuMjkzMiAxMC4zODk0IDMzLjIzMjUgMTAuMzY1NkMzMy4xNzI3IDEwLjM0MjMgMzMuMTE5OSAxMC4zMzYzIDMzLjA2ODQgMTAuMzM2M0gzMy4wNjM1Wk0xMy4yODkxIDMxLjY1ODZDMTMuMzEyOSAzMS44Nzg0IDEzLjM0OTMgMzIuMDk3MyAxMy4zOTY2IDMyLjMxNDhMMTMuMzUzNiAzMi4wOTcxQzEzLjMyNzIgMzEuOTUxNCAxMy4zMDUgMzEuODA1MiAxMy4yODkxIDMxLjY1ODZaTTIwLjAxNjcgMjguNDY5MUMyMC4wMTgzIDI4LjYzMjQgMjAuNDM2NiAyOS4wNjMzIDIxLjQxNTEgMjkuMTIxNUMyMC41NjA4IDI5LjA3MDcgMjAuMTMzOSAyOC43MzU1IDIwLjAzODIgMjguNTQyNEMyMC4wMzExIDI4LjUyODIgMjAuMDI2IDI4LjUxNDggMjAuMDIyNSAyOC41MDIzQzIwLjAxOTIgMjguNDkwMyAyMC4wMTY4IDI4LjQ3OTMgMjAuMDE2NyAyOC40NjkxWk0yMi4wODIxIDI4LjEzMzJDMjEuODk1MyAyOC4xMzMyIDIxLjcxMjYgMjguMTQwNCAyMS41MzkxIDI4LjE1MjdDMjAuOTkzOSAyOC4xOTI1IDIwLjY1MDggMjguMjk4NyAyMC40NTMyIDI4LjM5NjlDMjAuMzg2OSAyOC40Mjk4IDIwLjMzOTYgMjguNDYyMyAyMC4zMDY3IDI4LjQ4NzdDMjAuMzQyOCAyOC41MjU0IDIwLjM5ODEgMjguNTc0IDIwLjQ3OTYgMjguNjIyNUMyMC42NjkyIDI4LjczNTMgMjAuOTgyIDI4Ljg0ODcgMjEuNDQxNSAyOC44NzQ0QzIyLjA0MTIgMjguOTA2NyAyMi44NTU3IDI4Ljc0MjUgMjMuNzcxNiAyOC40MTY0QzIzLjI1ODMgMjguMjA1NyAyMi42NTcyIDI4LjEzMzIgMjIuMDgyMSAyOC4xMzMyWk0yNi41NjM1IDI3LjM1NDlMMjUuOTgzNSAyNy42ODg5QzI2LjM3MTQgMjcuNDc2MSAyNi43NTc5IDI3LjI0NCAyNy4xMzQ4IDI2Ljk5NTVMMjYuNTYzNSAyNy4zNTQ5Wk0yNC4wODExIDI2LjUxN0MyNC41NjIyIDI2LjY2NjcgMjQuOTkyOCAyNi44NzYxIDI1LjM2ODIgMjcuMTQzOUwyNS4xMzY4IDI2Ljk4OTdDMjQuODE4OSAyNi43OTQxIDI0LjQ2NiAyNi42MzY4IDI0LjA4MTEgMjYuNTE3Wk0yMi40OTEzIDI2LjI0NzVDMjIuMTQ0NiAyNi4yMzAyIDIxLjc4MTEgMjYuMjM1OCAyMS40MDI0IDI2LjI2MzFDMjAuNzAwMyAyNi4zMTQxIDIwLjE0MDIgMjYuNDU1NiAxOS43MDIyIDI2LjY1NTdMMTkuOTc5NiAyNi41NDM0QzIwLjM2OTcgMjYuNDAzMSAyMC44NDA2IDI2LjMwMzkgMjEuNDAyNCAyNi4yNjMxQzIxLjkwNzIgMjYuMjI2NyAyMi4zODQ4IDI2LjIzMDQgMjIuODMyMSAyNi4yNzI5TDIyLjQ5MTMgMjYuMjQ3NVpNMTQuMDU3NyAyNS4yMDk0QzEzLjcxMjcgMjUuNTcyOSAxMy4zOTY4IDI1Ljk1NDIgMTMuMTE1MyAyNi4zNTI5QzEzLjQ5MDYgMjUuODIxMyAxMy45MjcgMjUuMzIwNyAxNC40MTIyIDI0Ljg1MkwxNC4wNTc3IDI1LjIwOTRaTTMwLjA2NTUgMjQuMzk1OUMyOS41NjM0IDI1LjAzNjEgMjguOTMxNCAyNS42NDY4IDI4LjIzMDUgMjYuMjAzNUwyOC40ODkzIDI1Ljk5MjZDMjkuMDg2OSAyNS40OTQyIDI5LjYyNjEgMjQuOTU2MSAzMC4wNjU1IDI0LjM5NTlaTTE3LjIyNjYgMjIuMDU2MUMxNy4yNjQgMjIuMjc2MSAxNy4zMDA2IDIyLjQ4MzkgMTcuMzM4OSAyMi42NzUyQzE3LjMzOTUgMjIuNjc4MSAxNy4zNDEzIDIyLjY4MTEgMTcuMzQxOSAyMi42ODRDMTcuMzQxNCAyMi42ODExIDE3LjM0MDUgMjIuNjc5MSAxNy4zMzk5IDIyLjY3NjJDMTcuMzAxNSAyMi40ODQ2IDE3LjI2NDEgMjIuMjc2NCAxNy4yMjY2IDIyLjA1NjFaTTMxLjg0MzggMjEuMjM4N0MzMi4wODU0IDIxLjUwOCAzMi4yNjA5IDIxLjgxNDUgMzIuMzY1MyAyMi4xNTY2TDMyLjI3NDUgMjEuOTA2NkMzMi4xNjk4IDIxLjY2MzMgMzIuMDI1MSAyMS40NDA4IDMxLjg0MzggMjEuMjM4N1pNMTguODY3MyAyMS44OTU5QzE5LjM2NjggMjEuNjYzNyAxOS44NzU5IDIxLjQ1MDMgMjAuMzg5NyAyMS4yNTcyQzE5Ljg3NTcgMjEuNDUwMyAxOS4zNjU5IDIxLjY2MjYgMTguODY2MyAyMS44OTQ5TDE4Ljg2NzMgMjEuODk1OVpNMjAuMjczNSAxNS45ODA5QzE5LjkxIDE2LjAyNTcgMTkuNjUxNSAxNi4xNzg0IDE5LjQzNjYgMTYuNDc2QzE5LjIxMSAxNi43ODg3IDE5LjA0MDMgMTcuMjU3NCAxOC45NDM0IDE3Ljg2OTVDMTguODQ3NiAxOC40NzU0IDE4LjgyNTkgMTkuMjA1NyAxOC44ODI5IDIwLjAzMDdMMTguODkzNiAyMC4xMjI1TDE4Ljg5NjYgMjAuMTg4OUMxOC44OTY0IDIwLjE5NzEgMTguODk2NiAyMC4xOTg1IDE4Ljg5NjYgMjAuMjAyNUMxOC45MzA4IDIwLjYyNTggMTguOTg1IDIxLjA3MDYgMTkuMDU5NiAyMS41MzQ2QzIwLjI1NTggMjEuMDAwNSAyMS41MDA1IDIwLjU3NTYgMjIuNzIyNyAyMC4yNjMxQzIyLjcyNjUgMTkuNDQ1NyAyMi42MjUzIDE4LjY3MDcgMjIuNDM2NiAxOC4wMTAyQzIyLjIzMjMgMTcuMjk1MiAyMS45MzMgMTYuNzM0IDIxLjU3NzIgMTYuMzkyQzIxLjI2NyAxNi4wOTQxIDIwLjkxMDUgMTUuOTUzNSAyMC40Njc4IDE1Ljk2NjJMMjAuMjczNSAxNS45ODA5Wk0xMC45Nzk2IDE4LjkwMThDMTEuMDMxOSAxOS4zNTc2IDExLjA5MTYgMTkuODI0MiAxMS4xNTgzIDIwLjMwMTJMMTEuMDYzNSAxOS41OTMyQzExLjAzMzggMTkuMzYgMTEuMDA1NyAxOS4xMjk2IDEwLjk3OTYgMTguOTAxOFpNMjYuODUzNiAxOS44NzczQzI2LjY2MDIgMTkuODg1MyAyNi40NjMxIDE5Ljg5NzcgMjYuMjYyOCAxOS45MTM1QzI2LjY2MzIgMTkuODgyIDI3LjA1MDkgMTkuODY1NyAyNy40MjE5IDE5Ljg2NTZMMjYuODUzNiAxOS44NzczWk0yNi45MTUxIDE3LjEwODhDMjYuNDg0NiAxNy4xMDg5IDI2LjE2NzYgMTcuMjQ1NCAyNS45MTcxIDE3LjUxOEMyNS41MjMxIDE3Ljk0NzUgMjUuMjg0MSAxOC43MzU2IDI1LjI3NTUgMTkuNzY4QzI2LjAyNzIgMTkuNjY5NCAyNi43NTAyIDE5LjYxNTcgMjcuNDIxOSAxOS42MTU2QzI3LjQ3ODYgMTkuNjE1NiAyNy41MzU5IDE5LjYxNTggMjcuNTkyOCAxOS42MTY2QzI3Ljk3NzkgMTkuNjIxNCAyOC4zNDM2IDE5LjY0MzcgMjguNjg5NSAxOS42ODExQzI4LjYyOTYgMTguNTU1NSAyOC4zOTggMTcuODQwNyAyOC4wNDg5IDE3LjQ4MjhDMjcuOTcxMSAxNy40MDMyIDI3Ljg2NDkgMTcuMzEyNiAyNy42OTY0IDE3LjI0MDZDMjcuNTI2IDE3LjE2OCAyNy4yNzkgMTcuMTA4OCAyNi45MTUxIDE3LjEwODhaTTI2LjIyNjYgMTUuMjc4N0MyNi4xMTU5IDE1LjMwMDUgMjYuMDA3NCAxNS4zMjczIDI1LjkwMTQgMTUuMzU5OEMyNS44NDg3IDE1LjM3NTkgMjUuNzk2NyAxNS4zOTM3IDI1Ljc0NTIgMTUuNDEyNUMyNS41MTMzIDE1LjQ5NzIgMjUuMjk1MSAxNS42MDk2IDI1LjA5MDkgMTUuNzQ2NUMyNS40NzY3IDE1LjQ4NzkgMjUuOTE1MSAxNS4zMTk5IDI2LjM5MzYgMTUuMjUwNEwyNi4yMjY2IDE1LjI3ODdaTTE3Ljg5OTUgMTUuMzY2NkMxNy44OTc3IDE1LjM2OTUgMTcuODk0NyAxNS4zNzE5IDE3Ljg5MjcgMTUuMzc0NEwxNy44OTM2IDE1LjM3NjRDMTcuODk1NyAxNS4zNzM3IDE3Ljg5NzYgMTUuMzY5NyAxNy44OTk1IDE1LjM2NjZDMTcuOTMyMSAxNS4zMjE0IDE3Ljk2NTcgMTUuMjc3OCAxOC4wMDAxIDE1LjIzNDhMMTcuODk5NSAxNS4zNjY2Wk0yOS43NjI4IDE0LjExOTVDMjkuNzM1NCAxNC4yOTc4IDI5LjcwOTkgMTQuNDc3MSAyOS42ODU2IDE0LjY1NjZMMjkuNzYyOCAxNC4xMTk1Wk0yMi4yNzQ1IDE0LjU0OTJDMjEuNjIxNSAxNC4xNTMyIDIwLjg2MjQgMTMuOTk4MiAyMC4wNDIxIDE0LjA5OUMxOS42MDE1IDE0LjE1MzIgMTkuMTk2MyAxNC4yOTAyIDE4LjgzNiAxNC41MDMzTDE4Ljk3MjcgMTQuNDI3MkMxOS4yOTc5IDE0LjI1NzUgMTkuNjU3MyAxNC4xNDc0IDIwLjA0MyAxNC4xQzIwLjg2MzEgMTMuOTk5MyAyMS42MjE3IDE0LjE1MzUgMjIuMjc0NSAxNC41NDkyWk0zMC41NTY3IDEwLjgwNDFDMzAuMjc0OSAxMS41NDI5IDMwLjA3NDIgMTIuMzc1MSAyOS45MjI5IDEzLjE3ODFMMzAuMDIwNiAxMi42OTM4QzMwLjE1ODMgMTIuMDQ2MyAzMC4zMzE1IDExLjM5NDggMzAuNTU2NyAxMC44MDQxWk0zNS40Njc4IDEwLjA4NjNDMzUuNTg3NSAxMC4zMDIxIDM1LjcwMDEgMTAuNTQwMiAzNS44MDU3IDEwLjgwMTJMMzUuNjk3MyAxMC41NDczQzM1LjYyMzkgMTAuMzgzNiAzNS41NDc1IDEwLjIzIDM1LjQ2NzggMTAuMDg2M1pNMzMuMDUyOCA4LjQ0MDgyQzMxLjk2OTEgOC40NDc0OSAzMS4yNDAyIDkuMjU5MjEgMzAuNzM1NCAxMC4zNzM0TDMwLjgzMzEgMTAuMTY4NEMzMS4zMzI5IDkuMTYxMzcgMzIuMDM2OSA4LjQ0Njk1IDMzLjA1MjggOC40NDA4MlpNOS44NDU3OCA3Ljk0Mjc4QzkuNjMyOTMgOC40Njg1MSA5LjQ2NzYyIDkuMDc1NTMgOS4zNDM4MiA5Ljc0MzU2TDkuNDQ0NDEgOS4yNTUyOEM5LjU1MyA4Ljc3ODAzIDkuNjg2MTQgOC4zMzcxIDkuODQ1NzggNy45NDI3OFpNMzQuOTUxMiA5LjM0MDI0QzM1LjA0MzcgOS40NDQ5NyAzNS4xMzI3IDkuNTU5NzQgMzUuMjE4OCA5LjY4Mzk5TDM1LjA4NyA5LjUwNDNDMzUuMDQyNSA5LjQ0NzI1IDM0Ljk5NzMgOS4zOTI0NiAzNC45NTEyIDkuMzQwMjRaTTE0LjA3MjMgOC44NDMxN0MxNC4wOTQ2IDguODgyOTEgMTQuMTE1NiA4LjkyNDAyIDE0LjEzNzggOC45NjUyNEMxNC4wNjEzIDguODIzMTcgMTMuOTg2IDguNjg5MDcgMTMuOTA5MyA4LjU2NDg1TDE0LjA3MjMgOC44NDMxN1pNMTMuMjIzNyA1Ljg1NzgyQzE0LjI3MjYgNi4xOTE4NCAxNS4xMzg1IDcuMjcyNzIgMTUuODQ4NyA4LjcxNjIyQzE1LjEwOTkgNy4yMTQyMiAxNC4yMDI0IDYuMTA0OTQgMTMuMDk1OCA1LjgyMDcxTDEzLjIyMzcgNS44NTc4MloiIGZpbGw9IiNGRUZCRjIiLz4KPC9zdmc+Cg==\";","var getDefaultParent = function (originalTarget) {\n if (typeof document === 'undefined') {\n return null;\n }\n var sampleTarget = Array.isArray(originalTarget) ? originalTarget[0] : originalTarget;\n return sampleTarget.ownerDocument.body;\n};\nvar counterMap = new WeakMap();\nvar uncontrolledNodes = new WeakMap();\nvar markerMap = {};\nvar lockCount = 0;\nvar unwrapHost = function (node) {\n return node && (node.host || unwrapHost(node.parentNode));\n};\nvar correctTargets = function (parent, targets) {\n return targets\n .map(function (target) {\n if (parent.contains(target)) {\n return target;\n }\n var correctedTarget = unwrapHost(target);\n if (correctedTarget && parent.contains(correctedTarget)) {\n return correctedTarget;\n }\n console.error('aria-hidden', target, 'in not contained inside', parent, '. Doing nothing');\n return null;\n })\n .filter(function (x) { return Boolean(x); });\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @param {String} [controlAttribute] - html Attribute to control\n * @return {Undo} undo command\n */\nvar applyAttributeToOthers = function (originalTarget, parentNode, markerName, controlAttribute) {\n var targets = correctTargets(parentNode, Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n if (!markerMap[markerName]) {\n markerMap[markerName] = new WeakMap();\n }\n var markerCounter = markerMap[markerName];\n var hiddenNodes = [];\n var elementsToKeep = new Set();\n var elementsToStop = new Set(targets);\n var keep = function (el) {\n if (!el || elementsToKeep.has(el)) {\n return;\n }\n elementsToKeep.add(el);\n keep(el.parentNode);\n };\n targets.forEach(keep);\n var deep = function (parent) {\n if (!parent || elementsToStop.has(parent)) {\n return;\n }\n Array.prototype.forEach.call(parent.children, function (node) {\n if (elementsToKeep.has(node)) {\n deep(node);\n }\n else {\n try {\n var attr = node.getAttribute(controlAttribute);\n var alreadyHidden = attr !== null && attr !== 'false';\n var counterValue = (counterMap.get(node) || 0) + 1;\n var markerValue = (markerCounter.get(node) || 0) + 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n hiddenNodes.push(node);\n if (counterValue === 1 && alreadyHidden) {\n uncontrolledNodes.set(node, true);\n }\n if (markerValue === 1) {\n node.setAttribute(markerName, 'true');\n }\n if (!alreadyHidden) {\n node.setAttribute(controlAttribute, 'true');\n }\n }\n catch (e) {\n console.error('aria-hidden: cannot operate on ', node, e);\n }\n }\n });\n };\n deep(parentNode);\n elementsToKeep.clear();\n lockCount++;\n return function () {\n hiddenNodes.forEach(function (node) {\n var counterValue = counterMap.get(node) - 1;\n var markerValue = markerCounter.get(node) - 1;\n counterMap.set(node, counterValue);\n markerCounter.set(node, markerValue);\n if (!counterValue) {\n if (!uncontrolledNodes.has(node)) {\n node.removeAttribute(controlAttribute);\n }\n uncontrolledNodes.delete(node);\n }\n if (!markerValue) {\n node.removeAttribute(markerName);\n }\n });\n lockCount--;\n if (!lockCount) {\n // clear\n counterMap = new WeakMap();\n counterMap = new WeakMap();\n uncontrolledNodes = new WeakMap();\n markerMap = {};\n }\n };\n};\n/**\n * Marks everything except given node(or nodes) as aria-hidden\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var hideOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-aria-hidden'; }\n var targets = Array.from(Array.isArray(originalTarget) ? originalTarget : [originalTarget]);\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n // we should not hide aria-live elements - https://github.com/theKashey/aria-hidden/issues/10\n // and script elements, as they have no impact on accessibility.\n targets.push.apply(targets, Array.from(activeParentNode.querySelectorAll('[aria-live], script')));\n return applyAttributeToOthers(targets, activeParentNode, markerName, 'aria-hidden');\n};\n/**\n * Marks everything except given node(or nodes) as inert\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var inertOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-inert-ed'; }\n var activeParentNode = parentNode || getDefaultParent(originalTarget);\n if (!activeParentNode) {\n return function () { return null; };\n }\n return applyAttributeToOthers(originalTarget, activeParentNode, markerName, 'inert');\n};\n/**\n * @returns if current browser supports inert\n */\nexport var supportsInert = function () {\n return typeof HTMLElement !== 'undefined' && HTMLElement.prototype.hasOwnProperty('inert');\n};\n/**\n * Automatic function to \"suppress\" DOM elements - _hide_ or _inert_ in the best possible way\n * @param {Element | Element[]} originalTarget - elements to keep on the page\n * @param [parentNode] - top element, defaults to document.body\n * @param {String} [markerName] - a special attribute to mark every node\n * @return {Undo} undo command\n */\nexport var suppressOthers = function (originalTarget, parentNode, markerName) {\n if (markerName === void 0) { markerName = 'data-suppressed'; }\n return (supportsInert() ? inertOthers : hideOthers)(originalTarget, parentNode, markerName);\n};\n","/**\n * @package LiquidWeb\\Harbor\n */\nimport { useRef } from 'react';\nimport { useSelect } from '@wordpress/data';\nimport { AppShell } from '@/components/templates/AppShell';\nimport { AppLoader } from '@/components/organisms/AppLoader';\nimport { WelcomeScreen } from '@/components/organisms/WelcomeScreen';\nimport { Toaster } from '@/components/ui/toast';\nimport { ErrorBoundary } from '@/components/atoms/ErrorBoundary';\nimport { ErrorModal } from '@/components/organisms/ErrorModal';\nimport { ToastProvider } from '@/context/toast-context';\nimport { FilterProvider } from '@/context/filter-context';\nimport { ErrorModalProvider } from '@/context/error-modal-context';\nimport { HarborDataProvider } from '@/context/harbor-data-context';\nimport { ReloadBannerProvider } from '@/context/reload-banner-context';\nimport { useHarborData } from '@/context/harbor-data-context';\nimport { store as harborStore } from '@/store';\n\nfunction AppContent() {\n const { isLicenseLoading } = useHarborData();\n const hasLicense = useSelect(\n ( select ) => select( harborStore ).hasLicense(),\n []\n );\n\n // Latch: once we've ever seen a license during this mount, stay in\n // AppShell. Guards against license removal and transient refresh\n // failures bouncing the user back to the welcome screen. Mirrors the\n // hasEverResolvedRef pattern in harbor-data-context.tsx.\n const hasEverHadLicenseRef = useRef( false );\n if ( hasLicense ) {\n hasEverHadLicenseRef.current = true;\n }\n\n if ( hasEverHadLicenseRef.current ) return ;\n if ( isLicenseLoading ) return ;\n return ;\n}\n\nexport const App = () => {\n return (\n \n \n \n \n \n \n \n \n \n { /* ErrorModal sits outside ErrorBoundary so a render crash\n does not prevent the modal from opening. */ }\n \n \n \n \n \n \n );\n};\n","/**\n * React error boundary.\n *\n * Wrap any subtree to prevent a render crash from taking down the whole page.\n * Used in App.tsx and around each tab panel in AppShell.tsx.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { Component, type ReactNode } from 'react';\nimport { __ } from '@wordpress/i18n';\n\ninterface Props {\n children: ReactNode;\n /** Custom fallback UI — defaults to a generic error message. */\n fallback?: ReactNode;\n}\n\ninterface BState {\n hasError: boolean;\n}\n\n/**\n * @since 1.0.0\n */\nexport class ErrorBoundary extends Component {\n state: BState = { hasError: false };\n\n static getDerivedStateFromError(): BState {\n return { hasError: true };\n }\n\n render(): ReactNode {\n if ( this.state.hasError ) {\n return this.props.fallback ?? (\n

\n { __( 'An unexpected error occurred. Please reload the page.', '%TEXTDOMAIN%' ) }\n

\n );\n }\n\n return this.props.children;\n }\n}\n","/**\n * Displays a HarborError as a bullet item, recursively nesting the cause\n * chain beneath the top-level message.\n *\n * @package LiquidWeb\\Harbor\n */\nimport HarborError from '@/errors/harbor-error';\n\ninterface Props {\n error: HarborError;\n nested?: boolean;\n}\n\n/**\n * @since 1.0.0\n */\nexport function ErrorItem( { error, nested = false }: Props ) {\n const cause = error.cause instanceof HarborError ? error.cause : null;\n\n return (\n
  • \n \n { ! nested && }\n { error.message }\n \n { cause && (\n
      \n \n
    \n ) }\n
  • \n );\n}\n","/**\n * Feature icon resolved from a slug-based SVG asset.\n *\n * Renders a 32×32 placeholder box until per-feature SVG assets are\n * provided by the design team and added to resources/js/img/.\n *\n * @package LiquidWeb\\Harbor\n */\n\n// Feature logo assets are added here as they are delivered by design.\n// Key: feature slug. Value: imported SVG URL.\nconst FEATURE_LOGOS: Record = {};\n\ninterface FeatureIconProps {\n slug: string;\n}\n\n/**\n * @since 1.0.0\n */\nexport function FeatureIcon( { slug }: FeatureIconProps ) {\n const src = FEATURE_LOGOS[ slug ];\n\n if ( ! src ) {\n return null;\n }\n\n return (\n \n );\n}\n","/**\n * Unified badge for all license-related states.\n *\n * Covers tier name, unlicensed, legacy, and free indicators so that\n * all license badge rendering flows through a single atom.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { Badge } from '@/components/ui/badge';\nimport { cn } from '@/lib/utils';\nimport type { LicenseStatus } from '@/types/api';\n\ntype LicenseBadgeProps =\n\t| { type: 'licensed'; tierName: string; className?: string; }\n\t| { type: Exclude; tierName?: never; className?: string; };\n\nconst variantMap = {\n\tlicensed: 'gradient',\n\tunlicensed: 'outline',\n\tlegacy: 'warning',\n\tfree: 'secondary',\n\tbonus: 'warning',\n\trevoked: 'destructive',\n\tunactivated: 'warning',\n\texpired: 'destructive',\n\tcancelled: 'outline',\n\tsuspended: 'destructive',\n\tover_limit: 'warning',\n} as const;\n\nconst labelMap = {\n\tunlicensed: () => __( 'Unlicensed', '%TEXTDOMAIN%' ),\n\tlegacy: () => __( 'Legacy', '%TEXTDOMAIN%' ),\n\tfree: () => __( 'Free', '%TEXTDOMAIN%' ),\n\tbonus: () => __( 'Bonus', '%TEXTDOMAIN%' ),\n\trevoked: () => __( 'Unavailable', '%TEXTDOMAIN%' ),\n\tunactivated: () => __( 'Unactivated', '%TEXTDOMAIN%' ),\n\texpired: () => __( 'Expired', '%TEXTDOMAIN%' ),\n\tcancelled: () => __( 'Cancelled', '%TEXTDOMAIN%' ),\n\tsuspended: () => __( 'Suspended', '%TEXTDOMAIN%' ),\n\tover_limit: () => __( 'Over limit', '%TEXTDOMAIN%' ),\n} as const;\n\n/**\n * @since 1.0.0\n */\nexport function LicenseBadge( { type, tierName, className }: LicenseBadgeProps ) {\n\tconst label = type === 'licensed'\n\t\t? tierName\n\t\t: labelMap[ type ]();\n\n\treturn (\n\t\t\n\t\t\t{ label }\n\t\t\n\t);\n}\n","/**\n * Pulse-skeleton that mirrors the LicenseKeyInput locked state while the\n * license resolver is still in flight.\n *\n * @package LiquidWeb\\Harbor\n */\n\n/**\n * @since 1.0.0\n */\nexport function LicenseKeyInputSkeleton() {\n\treturn (\n\t\t
    \n\t\t\t{ /* input */ }\n\t\t\t
    \n\t\t\t{ /* edit button */ }\n\t\t\t
    \n\t\t
    \n\t);\n}\n","/**\n * Nexcess brand mark used in the welcome flow.\n *\n * Decorative — the visible \"Software License Manager\" heading carries the\n * accessible name. Uses the default URL-string export from the SVG loader,\n * matching ProductLogo and FilterBar.\n *\n * @package LiquidWeb\\Harbor\n */\nimport nexcessLogoUrl from '@img/logo-nexcess.svg';\n\ninterface NexcessLogoProps {\n className?: string;\n}\n\n/**\n * @since TBD\n */\nexport function NexcessLogo( { className }: NexcessLogoProps ) {\n return (\n \n );\n}\n","/**\n * Product logo resolved from a slug-based SVG asset.\n *\n * Falls back to a neutral placeholder box when no asset is found.\n * Use variant=\"nobg\" for the transparent (no background) logo variants.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { sprintf, __ } from '@wordpress/i18n';\nimport logoGive from '@img/logo-give.svg';\nimport logoTheEventsCalendar from '@img/logo-tec.svg';\nimport logoLearnDash from '@img/logo-learndash.svg';\nimport logoKadence from '@img/logo-kadence.svg';\nimport logoGiveNobg from '@img/logo-givewp-nobg.svg';\nimport logoLearnDashNobg from '@img/logo-learndash-nobg.svg';\nimport logoTecNobg from '@img/logo-tec-nobg.svg';\nimport logoKadenceNobg from '@img/logo-kadence-nobg.svg';\n\nconst LOGOS: Record = {\n give: logoGive,\n 'the-events-calendar': logoTheEventsCalendar,\n learndash: logoLearnDash,\n kadence: logoKadence,\n};\n\nconst LOGOS_NOBG: Record = {\n give: logoGiveNobg,\n 'the-events-calendar': logoTecNobg,\n learndash: logoLearnDashNobg,\n kadence: logoKadenceNobg,\n};\n\ninterface ProductLogoProps {\n slug: string;\n size: number;\n productName: string;\n variant?: 'default' | 'nobg';\n}\n\n/**\n * @since 1.0.0\n */\nexport function ProductLogo( { slug, size, productName, variant = 'default' }: ProductLogoProps ) {\n const src = ( variant === 'nobg' ? LOGOS_NOBG : LOGOS )[ slug ];\n\n /* translators: %s: product name (e.g. \"Kadence\", \"GiveWP\") */\n const alt = sprintf( __( '%s logo', '%TEXTDOMAIN%' ), productName );\n\n if ( ! src ) {\n return (\n \n );\n }\n\n return (\n \n );\n}\n","import { __, sprintf } from '@wordpress/i18n';\nimport { ExternalLink } from 'lucide-react';\nimport { buttonVariants } from '@/components/ui/button';\nimport { cn } from '@/lib/utils';\n\ninterface PurchaseLinkProps {\n /** Tier name to upgrade to (e.g. \"Agency\") */\n tierName: string;\n /** Upgrade destination URL */\n upgradeUrl: string;\n /** \"upgrade\" shows \"Upgrade to Tier\", \"learn-more\" shows \"Learn more\" */\n mode?: 'upgrade' | 'learn-more';\n className?: string;\n}\n\n/**\n * @since 1.0.0\n */\nexport function PurchaseLink( { tierName, upgradeUrl, mode = 'upgrade', className }: PurchaseLinkProps ) {\n const label =\n mode === 'upgrade'\n ? /* translators: %s is the name of the license tier to upgrade to */\n sprintf( __( 'Upgrade to %s', '%TEXTDOMAIN%' ), tierName )\n : __( 'Learn more', '%TEXTDOMAIN%' );\n\n return (\n \n { label }\n \n \n );\n}\n","/**\n * Sidebar section header: icon + uppercase label + optional trailing action.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { type ReactNode } from 'react';\n\ninterface SectionHeaderProps {\n\ticon: ReactNode;\n\tlabel: string;\n\taction?: ReactNode;\n}\n\n/**\n * @since 1.0.0\n */\nexport function SectionHeader( { icon, label, action }: SectionHeaderProps ) {\n\treturn (\n\t\t
    \n\t\t\t{ icon }\n\t\t\t\n\t\t\t\t{ label }\n\t\t\t\n\t\t\t{ action }\n\t\t
    \n\t);\n}\n","import { __, sprintf } from '@wordpress/i18n';\nimport { ProgressBar } from '@wordpress/components';\nimport { Lock, Loader2, Download } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\n\nexport type FeatureStatus =\n | 'enabled'\n | 'available'\n | 'included'\n | 'locked'\n | 'unlicensed'\n | 'installing'\n | 'enabling'\n | 'disabling'\n | 'updating';\n\ninterface StatusBadgeProps {\n status: FeatureStatus;\n requiredTier?: string;\n}\n\nconst SPAN_CONFIG: Record< string, { label: string; color: string } > = {\n enabling: { label: __( 'Activating\\u2026', '%TEXTDOMAIN%' ), color: 'text-primary' },\n disabling: { label: __( 'Deactivating\\u2026', '%TEXTDOMAIN%' ), color: 'text-muted-foreground' },\n enabled: { label: __( 'Activated', '%TEXTDOMAIN%' ), color: 'text-green-600' },\n available: { label: __( 'Deactivated', '%TEXTDOMAIN%' ), color: 'text-muted-foreground' },\n};\n\n/**\n * @since 1.0.0\n */\nexport function StatusBadge( { status, requiredTier }: StatusBadgeProps ) {\n if ( status === 'installing' || status === 'updating' ) {\n const label = status === 'installing'\n ? __( 'Installing\\u2026', '%TEXTDOMAIN%' )\n : __( 'Updating\\u2026', '%TEXTDOMAIN%' );\n return (\n
    \n
    \n \n div]:bg-primary\" />\n
    \n { label }\n
    \n );\n }\n\n if ( status === 'included' ) {\n return (\n \n { __( 'Included', '%TEXTDOMAIN%' ) }\n \n );\n }\n\n const config = SPAN_CONFIG[ status ];\n if ( config ) {\n const showSpinner = status === 'enabling' || status === 'disabling';\n return (\n \n { showSpinner && }\n { config.label }\n \n );\n }\n\n if ( status === 'locked' && requiredTier ) {\n return (\n \n \n {/* translators: %s is the name of the required license tier */}\n { sprintf( __( 'Requires %s', '%TEXTDOMAIN%' ), requiredTier ) }\n \n );\n }\n\n // unlicensed or locked without tier label — lock icon prepended to \"Deactivated\"\n return (\n \n \n { __( 'Deactivated', '%TEXTDOMAIN%' ) }\n \n );\n}\n","/**\n * Icon button that triggers a feature update.\n *\n * When upgradeLabel is provided the button is rendered disabled with an\n * upsell tooltip. The Tooltip component handles the span wrapper needed to\n * keep hover events working when pointer-events are disabled on the button.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { Download } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip } from '@/components/ui/tooltip';\n\ninterface UpdateButtonProps {\n\tfeatureName: string;\n\tdisabled?: boolean;\n\tonClick?: () => void;\n\t/** When set, the button is disabled and this text is shown as an upsell tooltip. */\n\tupgradeLabel?: string;\n}\n\n/**\n * @since 1.0.0\n */\nexport function UpdateButton( { featureName, disabled = false, onClick, upgradeLabel }: UpdateButtonProps ) {\n\tconst button = (\n\t\t\n\t\t\t\n\t\t\n\t);\n\n\treturn upgradeLabel\n\t\t? { button }\n\t\t: button;\n}\n","/**\n * A single feature row in the product feature list.\n *\n * Clicking the row header expands/collapses the feature description.\n * The toggle switch remains independently clickable.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useState } from 'react';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { FeatureIcon } from '@/components/atoms/FeatureIcon';\nimport { LicenseBadge } from '@/components/atoms/LicenseBadge';\nimport { StatusBadge } from '@/components/atoms/StatusBadge';\nimport { VersionDisplay } from '@/components/molecules/VersionDisplay';\nimport { Switch } from '@/components/ui/switch';\nimport { Button } from '@/components/ui/button';\nimport { Dialog, DialogHeader, DialogFooter } from '@/components/ui/dialog';\nimport { useFeatureRow } from '@/hooks/useFeatureRow';\nimport type { Feature } from '@/types/api';\nimport { isInstallableFeature } from '@/types/utils';\n\ninterface FeatureRowProps {\n\tfeature: Feature;\n\t/** Tier display name passed by TierGroup; enables the upsell tooltip on the update button. */\n\tupgradeTierName?: string;\n}\n\n/**\n * @since 1.0.0\n */\nexport function FeatureRow( { feature, upgradeTierName }: FeatureRowProps ) {\n\tconst [ expanded, setExpanded ] = useState( false );\n\tconst {\n\t\tpendingAction,\n\t\tinstallableBusy,\n\t\tbadgeStatus,\n\t\tshowSwitch,\n\t\tswitchChecked,\n\t\tlicenseBadgeType,\n\t\tshowDeactivateConfirm,\n\t\thandleToggle,\n\t\thandleUpdate,\n\t\thandleConfirmDeactivate,\n\t\thandleCancelDeactivate,\n\t} = useFeatureRow( feature );\n\n\tconst Chevron = expanded ? ChevronDown : ChevronRight;\n\n\t// Legacy-licensed and revoked features are not marked available by the API\n\t// but should render with the full available layout — controls visible, no muted style.\n\t// This override only applies to installable features (plugins/themes) since\n\t// non-installable features (services) have no controls to show.\n\tconst isVisuallyAvailable =\n\t\tfeature.is_available ||\n\t\t( isInstallableFeature( feature ) && ( licenseBadgeType === 'legacy' || licenseBadgeType === 'revoked' ) );\n\n\treturn (\n\t\t
    \n\t\t\t
    \n\t\t\t\t setExpanded( ! expanded ) }\n\t\t\t\t\tclassName=\"flex items-center gap-2 min-w-0 cursor-pointer\"\n\t\t\t\t>\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{ feature.name }\n\t\t\t\t\t\n\t\t\t\t\t{ licenseBadgeType && }\n\t\t\t\t
    \n\n\t\t\t\t{ isVisuallyAvailable ? (\n\t\t\t\t\t
    \n\t\t\t\t\t\t{ isInstallableFeature( feature ) ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t{ showSwitch && (\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t) }\n\t\t\t\t\t
    \n\t\t\t\t) : (\n\t\t\t\t\t
    \n\t\t\t\t\t\t\n\t\t\t\t\t
    \n\t\t\t\t) }\n\t\t\t
    \n\n\t\t\t{ expanded && (\n\t\t\t\t
    \n\t\t\t\t\t

    \n\t\t\t\t\t\t{ feature.description }\n\t\t\t\t\t

    \n\t\t\t\t
    \n\t\t\t) }\n\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
    \n\t);\n}\n","/**\n * Page header filter bar.\n *\n * Displays the product logo, a feature search input, and a product filter\n * dropdown. Both inputs are wired to FilterContext via useFilter().\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { Search } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '@/components/ui/select';\nimport { PRODUCTS } from '@/data/products';\nimport { useFilter } from '@/context/filter-context';\nimport logoLW from '@img/logo-lw.svg';\n\n/**\n * @since 1.0.0\n */\nexport function FilterBar() {\n const { searchQuery, setSearchQuery, productFilter, setProductFilter } = useFilter();\n\n const handleProductChange = ( slug: string ) => {\n setProductFilter( slug );\n if ( slug !== 'all' ) {\n setSearchQuery( '' );\n }\n };\n\n return (\n
    \n \n\n
    \n \n setSearchQuery( e.target.value ) }\n placeholder={ __( 'Search features…', '%TEXTDOMAIN%' ) }\n className=\"pl-10 text-sm\"\n />\n
    \n\n \n
    \n );\n}\n","/**\n * Amber warning banner shown when one or more legacy licenses are active.\n *\n * Legacy license data is fetched from the REST API via the store's\n * getLegacyLicenses resolver.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { createInterpolateElement } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { AlertTriangle } from 'lucide-react';\nimport { store as harborStore } from '@/store';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\n/**\n * @since TBD Read subscriptionsUrl through the getHarborDataValue helper.\n * @since 1.0.0\n */\nexport function LegacyLicenseBanner() {\n const hasLegacy = useSelect(\n ( select ) => select( harborStore ).hasUncoveredLegacyLicenses(),\n []\n );\n\n const portalUrl = getHarborDataValue( 'subscriptionsUrl' );\n if ( ! hasLegacy || ! portalUrl ) {\n\t\t\treturn null;\n\t\t}\n\n return (\n \n \n

    \n { createInterpolateElement(\n __( 'You have one or more legacy licenses active. They continue to receive product updates while valid. Consider switching to a unified license to manage all your products with a single key.', '%TEXTDOMAIN%' ),\n {\n a: ,\n }\n ) }\n

    \n
    \n );\n}\n","/**\n * License key input.\n *\n * Renders in three states controlled by the parent:\n * - Empty (currentKey === null): editable input with Activate button.\n * - Locked (currentKey set, !isEditing): read-only display with inline Edit button.\n * - Editing (currentKey set, isEditing): editable input pre-filled with the stored key,\n * plus Activate, Cancel, and Remove buttons.\n *\n * Wires activation to the @wordpress/data store.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useState, useEffect } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { Loader2, Pencil, Trash2 } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { store as harborStore } from '@/store';\nimport { useToast } from '@/context/toast-context';\nimport { useErrorModal } from '@/context/error-modal-context';\nimport { HarborError } from '@/errors';\nimport { getLicenseKeyPlaceholder } from '@/lib/harbor-data';\n\ninterface LicenseKeyInputProps {\n\t/** The currently stored key, or null when no license is active. */\n\tcurrentKey: string | null;\n\t/** Whether the input is in edit mode. Controlled by the parent. */\n\tisEditing: boolean;\n\t/** Called when the user clicks Edit to unlock the field. */\n\tonEdit: () => void;\n\t/** Called when the user clicks Cancel to revert to locked state. */\n\tonCancel: () => void;\n\t/** Called when the user confirms Remove. Returns null on success, HarborError on failure. */\n\tonRemove: () => Promise;\n\t/** Called on successful activation so the parent can respond (e.g. exit edit mode). */\n\tonSuccess: () => void;\n}\n\n/**\n * @since TBD Use the shared getLicenseKeyPlaceholder helper for the placeholder.\n * @since 1.0.0\n */\nexport function LicenseKeyInput( {\n\tcurrentKey,\n\tisEditing,\n\tonEdit,\n\tonCancel,\n\tonRemove,\n\tonSuccess,\n}: LicenseKeyInputProps ) {\n\tconst [ key, setKey ] = useState( currentKey || '' );\n\tconst [ localError, setLocalError ] = useState< string | null >( null );\n\n\tconst { storeLicense } = useDispatch( harborStore );\n\tconst { addToast } = useToast();\n\tconst { addError } = useErrorModal();\n\n\tconst { isStoring, canModifyLicense } = useSelect(\n\t\t( select ) => ( {\n\t\t\tisStoring: select( harborStore ).isLicenseStoring(),\n\t\t\tcanModifyLicense: select( harborStore ).canModifyLicense(),\n\t\t} ),\n\t\t[]\n\t);\n\n\t// Seed the editable value from the stored key when entering edit mode.\n\tuseEffect( () => {\n\t\tif ( isEditing && currentKey ) {\n\t\t\tsetKey( currentKey );\n\t\t}\n\t\tif ( ! isEditing ) {\n\t\t\tsetKey( currentKey || '' );\n\t\t\tsetLocalError( null );\n\t\t}\n\t}, [ isEditing, currentKey ] );\n\n\tconst handleActivate = async () => {\n\t\tconst trimmedKey = key.trim();\n\t\tif ( ! trimmedKey ) {\n\t\t\tsetLocalError( __( 'Please enter a license key.', '%TEXTDOMAIN%' ) );\n\t\t\treturn;\n\t\t}\n\t\tsetLocalError( null );\n\t\tconst result = await storeLicense( trimmedKey );\n\t\tif ( result instanceof HarborError ) {\n\t\t\taddError( result );\n\t\t} else {\n\t\t\taddToast( __( 'License activated successfully.', '%TEXTDOMAIN%' ), 'success' );\n\t\t\tsetKey( '' );\n\t\t\tonSuccess();\n\t\t}\n\t};\n\n\tconst handleRemove = async () => {\n\t\tconst error = await onRemove();\n\t\tif ( ! error ) {\n\t\t\tsetKey( '' );\n\t\t\tsetLocalError( null );\n\t\t}\n\t};\n\n\tconst inputWithActivate = (\n\t\t
    \n\t\t\t {\n\t\t\t\t\tsetKey( e.target.value.toUpperCase() );\n\t\t\t\t\tif ( localError ) setLocalError( null );\n\t\t\t\t} }\n\t\t\t\tonKeyDown={ ( e ) => e.key === 'Enter' && canModifyLicense && handleActivate() }\n\t\t\t\tclassName=\"flex-1 text-xs font-mono uppercase\"\n\t\t\t\taria-invalid={ !! localError }\n\t\t\t\taria-describedby={ localError ? 'license-key-error' : undefined }\n\t\t\t\tdisabled={ ! canModifyLicense }\n\t\t\t\t// eslint-disable-next-line jsx-a11y/no-autofocus\n\t\t\t\tautoFocus={ isEditing }\n\t\t\t/>\n\t\t\t\n\t\t\t\t{ isStoring ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t\n\t\t\t\t\t\t{ __( 'Verifying\\u2026', '%TEXTDOMAIN%' ) }\n\t\t\t\t\t\n\t\t\t\t) : (\n\t\t\t\t\t__( 'Save', '%TEXTDOMAIN%' )\n\t\t\t\t) }\n\t\t\t\n\t\t
    \n\t);\n\n\t// ----- Locked state -----\n\tif ( currentKey !== null && ! isEditing ) {\n\t\treturn (\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t{ __( 'Edit', '%TEXTDOMAIN%' ) }\n\t\t\t\t\n\t\t\t
    \n\t\t);\n\t}\n\n\t// ----- Editing state -----\n\tif ( currentKey !== null && isEditing ) {\n\t\treturn (\n\t\t\t
    \n\t\t\t\t{ inputWithActivate }\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t{ __( 'Remove license', '%TEXTDOMAIN%' ) }\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{ __( 'Cancel', '%TEXTDOMAIN%' ) }\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t\t{ localError && (\n\t\t\t\t\t

    \n\t\t\t\t\t\t{ localError }\n\t\t\t\t\t

    \n\t\t\t\t) }\n\t\t\t
    \n\t\t);\n\t}\n\n\t// ----- Empty state -----\n\treturn (\n\t\t
    \n\t\t\t\n\t\t\t{ inputWithActivate }\n\t\t\t{ isStoring && (\n\t\t\t\t

    \n\t\t\t\t\t\n\t\t\t\t\t{ __( 'Checking license with server\\u2026', '%TEXTDOMAIN%' ) }\n\t\t\t\t

    \n\t\t\t) }\n\t\t\t{ localError && (\n\t\t\t\t

    \n\t\t\t\t\t{ localError }\n\t\t\t\t

    \n\t\t\t) }\n\t\t
    \n\t);\n}\n","/**\n * Card showing a single licensed product: logo, name, tier badge, and an\n * expandable list of per-tier rows with expiry dates and Activate buttons.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useState } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { ChevronDown, ChevronUp, ExternalLink } from 'lucide-react';\nimport { LicenseBadge } from '@/components/atoms/LicenseBadge';\nimport { Button } from '@/components/ui/button';\nimport { Tooltip } from '@/components/ui/tooltip';\nimport { ProductLogo } from '@/components/atoms/ProductLogo';\nimport { buildActivationUrl } from '@/lib/activation-url';\nimport { cn } from '@/lib/utils';\nimport {\n formatDate,\n getExpiryStatus,\n expiryTextClass,\n} from '@/lib/license-utils';\nimport type { LicenseProduct, LicenseStatus } from '@/types/api';\n\ninterface LicenseProductCardProps {\n productSlug: string;\n productName: string;\n /** All tiers for this product. Must arrive pre-sorted ascending by rank. */\n tiers: LicenseProduct[];\n tierNameMap: Record;\n activationUrl: string | null;\n}\n\nfunction getStatusBadgeType( lp: LicenseProduct ): Exclude {\n switch ( lp.validation_status ) {\n case 'not_activated':\n case 'activation_required': return 'unactivated';\n case 'expired': return 'expired';\n case 'cancelled': return 'cancelled';\n case 'suspended':\n case 'license_suspended':\n case 'license_banned': return 'suspended';\n case 'out_of_activations': return 'over_limit';\n default: return 'unlicensed';\n }\n}\n\n/**\n * @since 1.0.0\n */\nexport function LicenseProductCard( {\n productSlug,\n productName,\n tiers,\n tierNameMap,\n activationUrl,\n}: LicenseProductCardProps ) {\n const activatedTiers = tiers.filter( ( lp ) => lp.is_valid && lp.activated_here === true );\n const hasActivatedTier = activatedTiers.length > 0;\n\n const [ isOpen, setIsOpen ] = useState( ! hasActivatedTier );\n\n const Chevron = isOpen ? ChevronUp : ChevronDown;\n\n const topActivatedTier = activatedTiers[ activatedTiers.length - 1 ];\n\n const headerBadge = hasActivatedTier && topActivatedTier\n ? (\n \n )\n : (\n \n );\n\n return (\n
    \n ) }\n \n );\n}\n","/**\n * Info banner shown when all licensed products are unactivated on this domain.\n *\n * Fires when every product's validation_status is 'not_activated' or\n * 'activation_required'. Links to the Liquid Web portal so the user can\n * activate their license for this domain.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { useSelect } from '@wordpress/data';\nimport { Info } from 'lucide-react';\nimport { store as harborStore } from '@/store';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\n/**\n * @since TBD Read activationUrl through the getHarborDataValue helper.\n * @since 1.0.0\n */\nexport function NotActivatedBanner() {\n\tconst allNotActivated = useSelect(\n\t\t( select ) => select( harborStore ).areAllProductsNotActivated(),\n\t\t[]\n\t);\n\tconst licenseKey = useSelect(\n\t\t( select ) => select( harborStore ).getLicenseKey(),\n\t\t[]\n\t);\n\n\tconst activationUrl = getHarborDataValue( 'activationUrl' );\n\tif ( ! allNotActivated || ! licenseKey || ! activationUrl ) return null;\n\n\treturn (\n\t\t\n\t\t\t\n\t\t\t

    \n\t\t\t\t{ __(\n\t\t\t\t\t'None of your products are activated for this domain. Activate your license to download and activate premium products.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t) }\n\t\t\t\t{ ' ' }\n\t\t\t\t\n\t\t\t\t\t{ __( 'Activate now', '%TEXTDOMAIN%' ) }\n\t\t\t\t\n\t\t\t

    \n\t\t\n\t);\n}\n","/**\n * Persistent banner shown when feature toggles require a page reload.\n *\n * Uses role=\"status\" + aria-live=\"polite\" so screen readers announce it once\n * when it appears, without interrupting the current focus.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { RefreshCw } from 'lucide-react';\nimport { useReloadBanner } from '@/context/reload-banner-context';\n\n/**\n * @since 1.0.0\n */\nexport function ReloadBanner() {\n const { needsReload } = useReloadBanner();\n\n return (\n
    \n { needsReload && (\n window.location.reload() }\n className=\"flex items-center gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-1.5 text-xs text-amber-800 hover:bg-amber-100 transition-colors\"\n >\n \n { __( 'Reload page to see changes', '%TEXTDOMAIN%' ) }\n \n ) }\n
    \n );\n}\n","/**\n * Collapsible accordion grouping locked features under a tier header.\n *\n * Shows the tier name, feature count, a lock indicator, and an upgrade\n * button. Expanding the accordion reveals the locked FeatureRow entries.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useState } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { ChevronRight, ChevronDown, Lock } from 'lucide-react';\nimport { Badge } from '@/components/ui/badge';\nimport { LicenseBadge } from '@/components/atoms/LicenseBadge';\nimport { PurchaseLink } from '@/components/atoms/PurchaseLink';\nimport { FeatureRow } from '@/components/molecules/FeatureRow';\nimport type { CatalogTier, Feature } from '@/types/api';\n\ninterface TierGroupProps {\n tier: CatalogTier;\n features: Feature[];\n forceOpen?: boolean;\n showUpgrade?: boolean;\n /**\n * When true, renders an Unactivated badge in place of the upgrade button.\n * Used when the user owns this tier but has not yet activated the license\n * on the current domain.\n */\n showUnactivated?: boolean;\n /**\n * Target URL for the upgrade button. Resolved by the parent so the\n * component doesn't need to know whether the user has an existing\n * subscription (change-plan URL) or is purchasing fresh (purchase_url).\n */\n buttonHref?: string;\n}\n\n/**\n * @since 1.0.1 Added showUnactivated prop to render an Unactivated badge in place of the upgrade button.\n * @since 1.0.0\n */\nexport function TierGroup( { tier, features, forceOpen = false, showUpgrade = true, showUnactivated = false, buttonHref }: TierGroupProps ) {\n const [ expanded, setExpanded ] = useState( false );\n const isOpen = expanded || forceOpen;\n const Chevron = isOpen ? ChevronDown : ChevronRight;\n\n return (\n <>\n
    \n setExpanded( ! expanded ) }\n className=\"flex items-center gap-2 cursor-pointer hover:opacity-80 transition-opacity\"\n >\n \n \n { tier.name } { __( 'Features', '%TEXTDOMAIN%' ) }\n \n \n { features.length }\n \n \n
    \n { showUpgrade && buttonHref && (\n \n ) }\n { showUnactivated && (\n \n ) }\n \n\n { isOpen && features.map( ( feature ) => (\n \n ) ) }\n \n );\n}\n","/**\n * Upsell card for a product not covered by the current license.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { ExternalLink } from 'lucide-react';\nimport { ProductLogo } from '@/components/atoms/ProductLogo';\nimport type { Product } from '@/types/api';\n\nconst UPSELL_TAGLINES: Record = {\n\tgive: __( 'Beautiful donation forms & fundraising', '%TEXTDOMAIN%' ),\n\t'the-events-calendar': __( 'Tickets, RSVPs & event management', '%TEXTDOMAIN%' ),\n\tlearndash: __( 'Sell courses & manage learners', '%TEXTDOMAIN%' ),\n\tkadence: __( 'Themes, blocks & design tools', '%TEXTDOMAIN%' ),\n};\n\ninterface UpsellCardProps {\n\tproduct: Product;\n\thref: string;\n}\n\n/**\n * @since 1.0.0\n */\nexport function UpsellCard( { product, href }: UpsellCardProps ) {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\t{ product.name }\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t{ UPSELL_TAGLINES[ product.slug ] ?? product.tagline }\n\t\t\t\t\n\t\t\t
    \n\t\t\t\n\t\t\n\t);\n}\n","/**\n * Displays the installed/available version of a feature, with an update\n * button when a newer version is available.\n *\n * When upgradeLabel is provided the update button is rendered fully disabled\n * (no onClick handler) with an upsell tooltip.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { sprintf, __ } from '@wordpress/i18n';\nimport { UpdateButton } from '@/components/atoms/UpdateButton';\nimport type { Feature } from '@/types/api';\n\nexport interface VersionDisplayProps {\n\tfeature: Feature;\n\t/** When set, the update button is disabled and this text is shown as an upsell tooltip. */\n\tupgradeLabel?: string;\n\tpendingAction?: 'enabling' | 'disabling' | 'installing' | 'updating' | null;\n\tinstallableBusy?: boolean;\n\t/** Required when upgradeLabel is not set and the button should be active. */\n\tonUpdate?: () => void;\n}\n\n/**\n * @since 1.0.0\n */\nexport function VersionDisplay( {\n\tfeature,\n\tupgradeLabel,\n\tpendingAction = null,\n\tinstallableBusy = false,\n\tonUpdate,\n}: VersionDisplayProps ) {\n\tif ( feature.update_version ) {\n\t\treturn (\n\t\t\t
    \n\t\t\t\t\n\t\t\t\t\tv{ feature.installed_version }\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\tv{ feature.update_version }\n\t\t\t\t\n\t\t\t\t{ ( upgradeLabel || onUpdate ) && (\n\t\t\t\t\t\n\t\t\t\t) }\n\t\t\t
    \n\t\t);\n\t}\n\n\tif ( ! feature.version && ! feature.installed_version ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t\n\t\t\t{ `v${ feature.installed_version ?? feature.version }` }\n\t\t\n\t);\n}\n","/**\n * License input + Activate button used on the welcome screen.\n *\n * Pure composition of UI primitives wired to useWelcomeLicenseForm.\n * No useState, no derived values, no async logic — the component file\n * is for layout and JSX wiring only.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { KeyRound, Loader2 } from 'lucide-react';\nimport { Input } from '@/components/ui/input';\nimport { Button } from '@/components/ui/button';\nimport { SectionHeader } from '@/components/atoms/SectionHeader';\nimport { useWelcomeLicenseForm, getNonUnifiedLicenseAdvice } from '@/hooks/useWelcomeLicenseForm';\nimport { getLicenseKeyPlaceholder } from '@/lib/harbor-data';\n\n/**\n * @since TBD\n */\nexport function WelcomeLicenseForm() {\n const {\n key,\n serverError,\n isStoring,\n canModifyLicense,\n showFormatHint,\n canSubmit,\n onKeyChange,\n onActivate,\n } = useWelcomeLicenseForm();\n\n return (\n {\n e.preventDefault();\n if ( canSubmit ) {\n onActivate();\n }\n } }\n >\n }\n label={ __( 'Unified License', '%TEXTDOMAIN%' ) }\n />\n onKeyChange( e.target.value ) }\n className=\"font-mono text-sm uppercase\"\n aria-invalid={ !! serverError }\n aria-describedby={\n serverError ? 'welcome-license-error'\n : showFormatHint ? 'welcome-license-hint'\n : undefined\n }\n disabled={ ! canModifyLicense }\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n \n { isStoring ? (\n <>\n \n { __( 'Verifying…', '%TEXTDOMAIN%' ) }\n \n ) : (\n __( 'Activate', '%TEXTDOMAIN%' )\n ) }\n \n { showFormatHint && (\n \n { __( \"This doesn't look like a unified license key.\", '%TEXTDOMAIN%' ) }\n { ' ' }\n { getNonUnifiedLicenseAdvice() }\n

    \n ) }\n { serverError && (\n \n { serverError }\n

    \n ) }\n \n );\n}\n","/**\n * Generic info callout used by the welcome flow.\n *\n * The molecule is a pure passthrough — the caller composes the message\n * (with createInterpolateElement, plain JSX, or a string) and passes\n * it as children. Reusable for any future welcome-screen message\n * without coupling to a specific copy block.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { type ReactNode } from 'react';\nimport { Info } from 'lucide-react';\n\ninterface WelcomeNoticeBannerProps {\n children: ReactNode;\n}\n\n/**\n * @since TBD\n */\nexport function WelcomeNoticeBanner( { children }: WelcomeNoticeBannerProps ) {\n return (\n
    \n \n

    { children }

    \n
    \n );\n}\n","/**\n * Boot-time loader.\n *\n * Mounted by AppContent while the license resolver is on its first\n * resolve. Borrows WelcomeShell chrome because that is the only chrome\n * available before license resolution decides which screen to show.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { Loader2 } from 'lucide-react';\nimport { WelcomeShell } from '@/components/templates/WelcomeShell';\n\n/**\n * @since TBD\n */\nexport function AppLoader() {\n return (\n \n
    \n \n { __( 'Loading…', '%TEXTDOMAIN%' ) }\n
    \n
    \n );\n}\n","/**\n * Error modal organism.\n *\n * Renders when the ErrorModalContext holds active errors. Lists each error\n * and provides a Dismiss button so the user can close the modal and interact\n * with the UI (e.g. to update the license key).\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { ExternalLink, Mail } from 'lucide-react';\nimport { useErrorModal } from '@/context/error-modal-context';\nimport { Dialog, DialogContent, DialogFooter, DialogHeader } from '@/components/ui/dialog';\nimport { ErrorItem } from '@/components/atoms/ErrorItem';\nimport { Button } from '@/components/ui/button';\n\nconst DOCS_URL = 'https://go.liquidweb.com/harbor-docs';\nconst SUPPORT_URL = 'https://go.liquidweb.com/harbor-support';\n\n/**\n * @since 1.0.0\n */\nexport function ErrorModal() {\n const { errors, clearAll } = useErrorModal();\n\n if ( errors.length === 0 ) return null;\n\n return (\n \n \n \n
      \n { errors.map( ( error ) => (\n \n ) ) }\n
    \n
    \n \n
    \n

    \n { __( 'Need help resolving this?', '%TEXTDOMAIN%' ) }\n

    \n
    \n \n { __( 'View documentation', '%TEXTDOMAIN%' ) }\n \n \n \n { __( 'Contact support', '%TEXTDOMAIN%' ) }\n \n \n
    \n
    \n \n
    \n
    \n );\n}\n","/**\n * License sidebar panel.\n *\n * Always visible. Fetches license and catalog data from the store and passes\n * it to LicenseSection and UpsellSection.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useMemo } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { LicenseSection } from '@/components/organisms/LicenseSection';\nimport { UpsellSection } from '@/components/organisms/UpsellSection';\nimport { store as harborStore } from '@/store';\nimport { PRODUCTS } from '@/data/products';\nimport { useToast } from '@/context/toast-context';\nimport { useErrorModal } from '@/context/error-modal-context';\nimport { HarborError } from '@/errors';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\n/**\n * @since TBD Read activationUrl through the getHarborDataValue helper.\n * @since 1.0.0\n */\nexport function LicensePanel() {\n const { addToast } = useToast();\n const { addError } = useErrorModal();\n const { deleteLicense, refreshLicense, refreshCatalog } = useDispatch( harborStore );\n\n const { licenseKey, licenseProducts, catalogs, isRefreshing, isLicenseLoading } = useSelect(\n ( select ) => ({\n licenseKey: select( harborStore ).getLicenseKey(),\n licenseProducts: select( harborStore ).getLicenseProducts(),\n catalogs: select( harborStore ).getCatalog(),\n isRefreshing: select( harborStore ).isLicenseRefreshing(),\n // @ts-expect-error -- hasFinishedResolution is injected at runtime by @wordpress/data but absent from the store's TypeScript surface.\n isLicenseLoading: ! select( harborStore ).hasFinishedResolution( 'getLicenseKey', [] ),\n }),\n []\n );\n\n // Flat tier slug → display name and rank lookups from all catalog tiers.\n const { tierNameMap, tierRankMap } = useMemo( () => {\n const names: Record = {};\n const ranks: Record = {};\n catalogs.forEach( ( catalog ) => {\n catalog.tiers.forEach( ( t ) => {\n names[ t.tier_slug ] = t.name;\n ranks[ t.tier_slug ] = t.rank;\n } );\n } );\n return { tierNameMap: names, tierRankMap: ranks };\n }, [ catalogs ] );\n\n const activationUrl = licenseKey ? getHarborDataValue( 'activationUrl' ) : null;\n\n // Product slug → lowest paid-tier purchase URL map from the catalog.\n const upsellUrlMap = useMemo( () => {\n const map: Record = {};\n catalogs.forEach( ( catalog ) => {\n const sorted = catalog.tiers.slice().sort( ( a, b ) => a.rank - b.rank );\n const paidTier = sorted.find( ( t ) => t.rank > 0 );\n if ( paidTier?.purchase_url ) {\n map[ catalog.product_slug ] = paidTier.purchase_url;\n }\n } );\n return map;\n }, [ catalogs ] );\n\n const licensedSlugs = new Set( licenseProducts.map( ( lp ) => lp.product_slug ) );\n const upsellProducts = PRODUCTS.filter( ( p ) => ! licensedSlugs.has( p.slug ) );\n\n const handleRemove = async (): Promise => {\n const result = await deleteLicense();\n if ( result instanceof HarborError ) {\n addError( result );\n return result;\n }\n addToast( __( 'License removed.', '%TEXTDOMAIN%' ), 'default' );\n return null;\n };\n\n const handleRefresh = async () => {\n const [ licenseResult, catalogResult ] = await Promise.all( [\n refreshLicense(),\n refreshCatalog(),\n ] );\n if ( licenseResult instanceof HarborError ) {\n addError( licenseResult );\n }\n if ( catalogResult instanceof HarborError ) {\n addError( catalogResult );\n }\n if ( ! ( licenseResult instanceof HarborError ) && ! ( catalogResult instanceof HarborError ) ) {\n addToast( __( 'License refreshed.', '%TEXTDOMAIN%' ), 'success' );\n }\n };\n\n return (\n
    \n \n { ! isLicenseLoading && (\n \n ) }\n
    \n );\n}\n","/**\n * License section: header, key input, and licensed-product cards.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useMemo, useState } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { KeyRound, Loader2, RefreshCw } from 'lucide-react';\nimport { SectionHeader } from '@/components/atoms/SectionHeader';\nimport { LicenseKeyInputSkeleton } from '@/components/atoms/LicenseKeyInputSkeleton';\nimport { LicenseKeyInput } from '@/components/molecules/LicenseKeyInput';\nimport { LicenseProductCard } from '@/components/molecules/LicenseProductCard';\nimport { PRODUCTS } from '@/data/products';\nimport { groupLicenseProducts } from '@/lib/group-license-products';\nimport type { LicenseProduct } from '@/types/api';\nimport type HarborError from '@/errors/harbor-error';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\ninterface LicenseSectionProps {\n licenseKey: string | null;\n licenseProducts: LicenseProduct[];\n tierNameMap: Record;\n tierRankMap: Record;\n onRemove: () => Promise;\n onRefresh: () => Promise;\n isRefreshing: boolean;\n isLoading: boolean;\n activationUrl: string | null;\n}\n\n/**\n * Pulse-skeleton that mirrors LicenseProductCard's layout while the license\n * resolver is still in flight.\n */\nfunction LicenseSectionSkeleton() {\n return (\n
    \n { PRODUCTS.map( ( p ) => (\n
    \n
    \n { /* logo */ }\n
    \n { /* product name */ }\n
    \n { /* tier badge */ }\n
    \n { /* chevron */ }\n
    \n
    \n
    \n ) ) }\n
    \n );\n}\n\n/**\n * @since TBD Read subscriptionsUrl through the getHarborDataValue helper.\n * @since 1.0.0\n */\nexport function LicenseSection( {\n licenseKey,\n licenseProducts,\n tierNameMap,\n tierRankMap,\n onRemove,\n onRefresh,\n isRefreshing,\n isLoading,\n activationUrl,\n}: LicenseSectionProps ) {\n const [ isEditing, setIsEditing ] = useState( false );\n\n const hasLicense = licenseKey !== null;\n const manageUrl = getHarborDataValue( 'subscriptionsUrl' );\n\n const handleRemove = async (): Promise => {\n const error = await onRemove();\n if ( ! error ) {\n setIsEditing( false );\n }\n return error;\n };\n\n const groupedProducts = useMemo(\n () => groupLicenseProducts( licenseProducts, tierRankMap ),\n [ licenseProducts, tierRankMap ],\n );\n\n return (\n
    \n }\n label={ __( 'License', '%TEXTDOMAIN%' ) }\n action={ (\n \n { isRefreshing\n ? \n : \n }\n { isRefreshing\n ? __( 'Refreshing...', '%TEXTDOMAIN%' )\n : __( 'Refresh', '%TEXTDOMAIN%' )\n }\n \n ) }\n />\n\n { isLoading ? (\n <>\n \n \n \n ) : (\n <>\n setIsEditing( true ) }\n onCancel={ () => setIsEditing( false ) }\n onRemove={ handleRemove }\n onSuccess={ () => setIsEditing( false ) }\n />\n { ! hasLicense && (\n

    \n { __( 'Enter your license key to download and activate premium products.', '%TEXTDOMAIN%' ) }\n

    \n ) }\n \n ) }\n\n { ! isLoading && hasLicense && groupedProducts.length > 0 && (\n
    \n { groupedProducts.map( ( g ) => (\n t.is_valid && t.activated_here ) }` }\n productSlug={ g.productSlug }\n productName={ g.productName }\n tiers={ g.tiers }\n tierNameMap={ tierNameMap }\n activationUrl={ activationUrl }\n />\n ) ) }\n\n { manageUrl && (\n

    \n \n { __( 'Manage license in Liquid Web', '%TEXTDOMAIN%' ) }\n \n

    \n ) }\n
    \n ) }\n
    \n );\n}\n","/**\n * Product section: sticky dark header + feature list + tier group accordions.\n *\n * Available features render as FeatureRow entries. Locked features are\n * grouped by tier and rendered inside collapsible TierGroup accordions.\n *\n * Header counts (active / deactivated) always reflect the full unfiltered\n * feature set so they remain stable while the user searches.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { useSelect } from '@wordpress/data';\nimport { LicenseBadge } from '@/components/atoms/LicenseBadge';\nimport { ProductLogo } from '@/components/atoms/ProductLogo';\nimport { FeatureRow } from '@/components/molecules/FeatureRow';\nimport { TierGroup } from '@/components/molecules/TierGroup';\nimport { store as harborStore } from '@/store';\nimport { useFilter } from '@/context/filter-context';\nimport { useProductFeatureGroups } from '@/hooks/useProductFeatureGroups';\nimport { buildUpgradeUrl } from '@/lib/upgrade-url';\nimport { getHarborDataValue } from '@/lib/harbor-data';\nimport type { Product } from '@/types/api';\n\ninterface ProductSectionProps {\n product: Product;\n}\n\n/**\n * @since TBD Read domain through the getHarborDataValue helper for upgrade URLs.\n * @since 1.0.2 Route upgrade CTA to catalog upgrade_url for existing subscribers, purchase_url for new subscribers.\n * @since 1.0.1 Show Unactivated badge on tier groups and product header for unactivated licenses.\n * @since 1.0.0\n */\nexport function ProductSection( { product }: ProductSectionProps ) {\n const { searchQuery } = useFilter();\n const isSearching = searchQuery.trim().length > 0;\n\n // Full unfiltered set — used only for header counts so they stay stable.\n const { licenseProduct, hasActiveLegacy, unactivatedLicenseProduct } = useSelect(\n ( select ) => {\n const licenseProducts = select( harborStore ).getLicenseProducts();\n const forProduct = licenseProducts.filter( ( lp ) => lp.product_slug === product.slug );\n return {\n licenseProduct: forProduct.find( ( lp ) => lp.activated_here === true ) ?? null,\n hasActiveLegacy: select( harborStore ).hasActiveLegacyLicenseForProduct( product.slug ),\n unactivatedLicenseProduct: select( harborStore ).getUnactivatedLicenseProduct( product.slug ),\n };\n },\n [ product.slug ],\n );\n\n const { availableFeatures, lockedByTier, sortedCatalogTiers, upgradeCatalogTiers, activationCatalogTiers, isUnactivatedLicense } = useProductFeatureGroups( product.slug );\n\n const activeCount = availableFeatures.filter( ( f ) => f.is_enabled ).length;\n const deactivatedCount = availableFeatures.filter( ( f ) => ! f.is_enabled ).length;\n\n // Show \"Unactivated\" in the header only when there is no activated product at all.\n // An unactivated upgrade tier alongside an active lower tier (e.g. pro active + elite\n // unactivated) should still show the active tier's name — not \"Unactivated\".\n const isNotActivated = ( licenseProduct === null && isUnactivatedLicense ) || (\n licenseProduct !== null && (\n licenseProduct.validation_status === 'not_activated' ||\n licenseProduct.validation_status === 'activation_required'\n )\n );\n\n const tierName = licenseProduct\n ? ( sortedCatalogTiers.find( ( t ) => t.tier_slug === licenseProduct.tier )?.name ?? licenseProduct.tier )\n : null;\n\n const hasContent = availableFeatures.length > 0 ||\n Object.values( lockedByTier ).some( ( f ) => f.length > 0 );\n\n return (\n
    \n\t\t\t
    \n
    \n \n

    \n { product.name }\n

    \n { isNotActivated ? (\n \n ) : tierName ? (\n \n ) : hasActiveLegacy ? (\n \n ) : (\n \n ) }\n \n { activeCount } { __( 'active', '%TEXTDOMAIN%' ) }\n { ' · ' }\n { deactivatedCount } { __( 'deactivated', '%TEXTDOMAIN%' ) }\n \n
    \n\n { isSearching && ! hasContent && (\n
    \n

    \n { __( 'No features match your search.', '%TEXTDOMAIN%' ) }\n

    \n
    \n ) }\n\n { ! isSearching && ! hasContent && (\n
    \n

    \n { __( 'No features are available for this product.', '%TEXTDOMAIN%' ) }\n

    \n
    \n ) }\n\n { hasContent && (\n
    \n { availableFeatures.map( ( feature ) => (\n \n ) ) }\n\n { activationCatalogTiers.map( ( tier ) => {\n const locked = lockedByTier[ tier.tier_slug ] ?? [];\n if ( locked.length === 0 ) return null;\n return (\n \n );\n } ) }\n\n { upgradeCatalogTiers.map( ( tier ) => {\n const locked = lockedByTier[ tier.tier_slug ] ?? [];\n if ( locked.length === 0 ) return null;\n\n const effectiveLicenseProduct = licenseProduct ?? unactivatedLicenseProduct;\n const buttonHref = effectiveLicenseProduct\n ? ( tier.upgrade_url ? buildUpgradeUrl( tier.upgrade_url, getHarborDataValue( 'domain' ) ) : undefined )\n : ( tier.purchase_url || undefined );\n\n return (\n \n );\n } ) }\n
    \n ) }\n
    \n );\n}\n","/**\n * Pulse-skeleton for a single product section, shown while the Harbor data\n * resolvers are in flight on the first page load.\n *\n * Mirrors ProductSection's DOM structure: same sticky header (with real logo\n * and product name but no badge or counters) followed by a fixed number of\n * skeleton feature rows.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { ProductLogo } from '@/components/atoms/ProductLogo';\nimport type { Product } from '@/types/api';\n\nconst SKELETON_ROW_COUNT = 3;\n\nfunction SkeletonFeatureRow( { isLast }: { isLast: boolean } ) {\n return (\n
    \n
    \n { /* chevron */ }\n
    \n { /* feature icon */ }\n
    \n { /* feature name */ }\n
    \n { /* right: status badge + switch */ }\n
    \n
    \n
    \n
    \n
    \n
    \n );\n}\n\ninterface ProductSectionSkeletonProps {\n product: Product;\n}\n\n/**\n * @since 1.0.0\n */\nexport function ProductSectionSkeleton( { product }: ProductSectionSkeletonProps ) {\n return (\n
    \n
    \n
    \n \n

    \n { product.name }\n

    \n
    \n
    \n { Array.from( { length: SKELETON_ROW_COUNT }, ( _, i ) => (\n \n ) ) }\n
    \n
    \n );\n}\n","/**\n * Upsell section: products not covered by the current license.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __ } from '@wordpress/i18n';\nimport { Rocket } from 'lucide-react';\nimport { SectionHeader } from '@/components/atoms/SectionHeader';\nimport { UpsellCard } from '@/components/molecules/UpsellCard';\nimport type { Product } from '@/types/api';\n\ninterface UpsellSectionProps {\n products: Product[];\n upsellUrlMap: Record;\n}\n\n/**\n * @since 1.0.0\n */\nexport function UpsellSection( { products, upsellUrlMap }: UpsellSectionProps ) {\n if ( products.length === 0 ) return null;\n\n return (\n <>\n
    \n\n
    \n }\n label={ __( 'Add to your plan', '%TEXTDOMAIN%' ) }\n />\n
    \n { products.map( ( p ) => (\n \n ) ) }\n
    \n
    \n \n );\n}\n","/**\n * No-license welcome screen.\n *\n * Composes WelcomeShell chrome with the hardcoded non-unified-license\n * notice and the unified license form. The notice copy lives here so\n * WelcomeNoticeBanner stays a generic container.\n *\n * createInterpolateElement turns a single translatable string with\n * marker tags into real React elements — translators see one\n * continuous sentence; React renders an actual node.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createInterpolateElement } from '@wordpress/element';\nimport { __ } from '@wordpress/i18n';\nimport { WelcomeShell } from '@/components/templates/WelcomeShell';\nimport { WelcomeNoticeBanner } from '@/components/molecules/WelcomeNoticeBanner';\nimport { WelcomeLicenseForm } from '@/components/molecules/WelcomeLicenseForm';\n\n/**\n * @since TBD\n */\nexport function WelcomeScreen() {\n return (\n \n \n { createInterpolateElement(\n __(\n 'Have a non-unified license? Licenses issued before May 12, 2026 are managed inside each plugin\\'s own settings.',\n '%TEXTDOMAIN%'\n ),\n { strong: }\n ) }\n \n \n \n );\n}\n","/**\n * Application shell — full-width two-column layout.\n *\n * Main area: FilterBar header + product sections.\n * Sidebar: license panel.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { __, sprintf } from '@wordpress/i18n';\nimport { Shell } from '@/components/templates/Shell';\nimport { FilterBar } from '@/components/molecules/FilterBar';\nimport { LicensePanel } from '@/components/organisms/LicensePanel';\nimport { LegacyLicenseBanner } from '@/components/molecules/LegacyLicenseBanner';\nimport { NotActivatedBanner } from '@/components/molecules/NotActivatedBanner';\nimport { ReloadBanner } from '@/components/molecules/ReloadBanner';\nimport { ProductSection } from '@/components/organisms/ProductSection';\nimport { ProductSectionSkeleton } from '@/components/organisms/ProductSectionSkeleton';\nimport { ErrorBoundary } from '@/components/atoms/ErrorBoundary';\nimport { PRODUCTS } from '@/data/products';\nimport { useFilter } from '@/context/filter-context';\nimport { useHarborData } from '@/context/harbor-data-context';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\n/**\n * @since TBD Read version through the getHarborDataValue helper.\n * @since 1.0.0\n */\nexport function AppShell() {\n const { isLoading } = useHarborData();\n const version = getHarborDataValue( 'version' );\n\n const { productFilter } = useFilter();\n\n const visibleProducts = productFilter === 'all'\n ? PRODUCTS\n : PRODUCTS.filter( ( p ) => p.slug === productFilter );\n\n return (\n }\n sideContent={ }\n >\n \n
    \n \n \n\n
    \n

    { __( 'Your Features', '%TEXTDOMAIN%' ) }

    \n
    \n\n { isLoading\n ? PRODUCTS.map( ( product ) => (\n \n ) )\n : visibleProducts.map( ( product ) => (\n \n ) )\n }\n
    \n\n { version && (\n
    \n

    \n\t\t\t\t\t\t\t{ /* translators: %s: plugin version number */ }\n\t\t\t\t\t\t\t{ sprintf( __( 'Version %s', '%TEXTDOMAIN%' ), version ) }\n\t\t\t\t\t\t

    \n
    \n ) }\n
    \n \n );\n}\n","/**\n * Two-column page shell: scrollable main area + sticky sidebar.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { ReactNode } from 'react';\n\ninterface ShellProps {\n /** Optional content rendered above children (FilterBar slot). */\n header?: ReactNode;\n /** Content rendered in the right sidebar. */\n sideContent?: ReactNode;\n children: ReactNode;\n}\n\n/**\n * @since 1.0.0\n */\nexport function Shell( { header, sideContent, children }: ShellProps ) {\n return (\n
    \n
    \n { header }\n
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t{ children }\n\t\t\t\t
    \n\t\t\t\t\n\t\t\t
    \n
    \n );\n}\n","/**\n * Welcome flow template.\n *\n * Centered single-column layout used by the welcome screen and the\n * boot-time AppLoader. Uses a fixed min-height because 100vh overflows\n * beneath the wp-admin bar and forces a vertical scroll.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { type ReactNode } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { NexcessLogo } from '@/components/atoms/NexcessLogo';\n\ninterface WelcomeShellProps {\n children?: ReactNode;\n}\n\n/**\n * @since TBD\n */\nexport function WelcomeShell( { children }: WelcomeShellProps ) {\n return (\n
    \n
    \n
    \n \n
    \n

    \n { __( 'Software License Manager', '%TEXTDOMAIN%' ) }\n

    \n

    \n { __( 'Liquid Web by Nexcess', '%TEXTDOMAIN%' ) }\n

    \n
    \n
    \n\t\t\t\t
    \n\t\t\t\t\t{ children }\n\t\t\t\t
    \n
    \n
    \n );\n}\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\n\nconst badgeVariants = cva(\n 'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',\n {\n variants: {\n variant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n\t\t\t\tghost:\n\t\t\t\t\t\"[a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n\t\t\t\tlink:\n\t\t\t\t\t\"text-primary underline-offset-4 [a&]:hover:underline\",\n\t\t\t\tsuccess:\n\t\t\t\t\t\"bg-emerald-100 text-emerald-800 border-emerald-200\",\n\t\t\t\tgradient:\n\t\t\t\t\t\"bg-gradient-to-r from-emerald-500 to-emerald-600 text-white border-0\",\n\t\t\t\twarning:\n\t\t\t\t\t\"bg-amber-100 text-amber-800 border-amber-200\",\n\t\t\t\tinfo:\n\t\t\t\t\t\"bg-blue-100 text-blue-800 border-blue-200\",\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes,\n VariantProps {}\n\nfunction Badge( { className, variant, ...props }: BadgeProps ) {\n return (\n \n );\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"cursor-pointer inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background text-foreground shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n xs: \"h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n \n )\n}\n\nexport { Button, buttonVariants }\n","/**\n * Custom modal dialog.\n *\n * Uses z-[100000] on the overlay so it clears the WP admin bar (z-index: 99999).\n * NOT using Radix Dialog — keeping this self-contained to control z-index.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useEffect, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { __ } from '@wordpress/i18n';\n\ninterface DialogProps {\n open: boolean;\n onClose: () => void;\n children: ReactNode;\n /** Max width class, defaults to \"max-w-lg\" */\n maxWidth?: string;\n}\n\n/**\n * Dialog overlay + panel. Traps focus via the backdrop click handler.\n * @since 1.0.0\n */\nexport function Dialog( { open, onClose, children, maxWidth = 'max-w-lg' }: DialogProps ) {\n // Close on Escape key\n useEffect( () => {\n if ( ! open ) return;\n const handleKey = ( e: KeyboardEvent ) => {\n if ( e.key === 'Escape' ) onClose();\n };\n document.addEventListener( 'keydown', handleKey );\n return () => document.removeEventListener( 'keydown', handleKey );\n }, [ open, onClose ] );\n\n // Prevent body scroll when open\n useEffect( () => {\n if ( open ) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [ open ] );\n\n if ( ! open ) return null;\n\n const portalTarget = document.getElementById( 'lw-harbor-root' ) ?? document.body;\n\n return createPortal(\n \n {/* Backdrop */}\n \n\n {/* Panel */}\n e.stopPropagation() }\n >\n { children }\n
    \n
    ,\n portalTarget\n );\n}\n\ninterface DialogHeaderProps {\n title: string;\n description?: string;\n onClose: () => void;\n}\n\nexport function DialogHeader( { title, description, onClose }: DialogHeaderProps ) {\n return (\n
    \n
    \n

    { title }

    \n { description && (\n

    { description }

    \n ) }\n
    \n \n \n \n
    \n );\n}\n\nexport function DialogContent( { children, className }: { children: ReactNode; className?: string } ) {\n return (\n
    \n { children }\n
    \n );\n}\n\nexport function DialogFooter( { children, className }: { children: ReactNode; className?: string } ) {\n return (\n
    \n { children }\n
    \n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n \n )\n}\n\nexport { Input }\n","/**\n * Radix UI Select primitives styled to the project's design system.\n *\n * Intentionally NOT using Select.Portal — portal content renders outside\n * .lw-harbor-ui and would be invisible to the PostCSS scope plugin (all Tailwind\n * utilities are scoped to .lw-harbor-ui). The Content renders in the DOM tree but\n * Radix positions it with position:fixed so it still floats above other elements.\n *\n * @package LiquidWeb\\Harbor\n */\nimport * as React from 'react';\nimport { Select as SelectPrimitive } from 'radix-ui';\nimport { ChevronDown, ChevronUp, Check } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, children, ...props }, ref ) => (\n span]:line-clamp-1',\n 'outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n ) }\n { ...props }\n >\n { children }\n \n \n \n \n) );\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, ...props }, ref ) => (\n \n \n \n) );\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, ...props }, ref ) => (\n \n \n \n) );\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, children, position = 'popper', ...props }, ref ) => (\n \n \n \n { children }\n \n \n \n) );\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, ...props }, ref ) => (\n \n) );\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, children, ...props }, ref ) => (\n \n \n \n \n \n \n { children }\n \n) );\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef,\n React.ComponentPropsWithoutRef\n>( ( { className, ...props }, ref ) => (\n \n) );\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Switch as SwitchPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n \n \n \n )\n}\n\nexport { Switch }\n","/**\n * Toast notification renderer.\n *\n * Reads from useToastStore and renders a fixed bottom-right stack.\n * Auto-dismiss is handled by the store (3.5s).\n *\n * @package LiquidWeb\\Harbor\n */\nimport { X, CheckCircle, AlertTriangle, Info } from 'lucide-react';\nimport { __ } from '@wordpress/i18n';\nimport { cn } from '@/lib/utils';\nimport { useToast, type ToastVariant } from '@/context/toast-context';\n\nconst VARIANT_STYLES: Record = {\n default: 'bg-background border border-border text-foreground',\n success: 'bg-green-50 border border-green-200 text-green-800',\n error: 'bg-red-50 border border-red-200 text-red-800',\n warning: 'bg-amber-50 border border-amber-200 text-amber-800',\n};\n\nfunction ToastIcon( { variant }: { variant: ToastVariant } ) {\n if ( variant === 'success' ) return ;\n if ( variant === 'error' ) return ;\n if ( variant === 'warning' ) return ;\n return ;\n}\n\n/**\n * Renders the toast stack. Mount as a sibling of AppShell in App.tsx.\n * @since 1.0.0\n */\nexport function Toaster() {\n const { toasts, removeToast } = useToast();\n\n return (\n \n { toasts.map( ( toast ) => (\n \n \n
    \n { toast.message }\n { toast.action && (\n { toast.action!.onClick(); removeToast( toast.id ); } }\n className=\"self-start text-xs font-medium underline underline-offset-2 hover:no-underline\"\n >\n { toast.action.label }\n \n ) }\n
    \n removeToast( toast.id ) }\n className=\"shrink-0 opacity-60 hover:opacity-100 transition-opacity\"\n aria-label={ __( 'Dismiss notification', '%TEXTDOMAIN%' ) }\n >\n \n \n
    \n ) ) }\n
    \n );\n}\n","/**\n * Single-component tooltip wrapper built on Radix UI.\n *\n * Uses a Portal + inline styles instead of Tailwind utilities because the\n * Portal teleports content outside .lw-harbor-ui, where the PostCSS scope plugin\n * would no longer apply. z-index 100001 clears the WP admin bar (99999) and\n * our dialogs (100000).\n *\n * The children are wrapped in a so that hover detection still works\n * when the child element has pointer-events disabled (e.g. a disabled button).\n *\n * Usage:\n * \n * \n * \n *\n * @package LiquidWeb\\Harbor\n */\nimport { Tooltip as TooltipPrimitive } from 'radix-ui';\n\ninterface TooltipProps {\n\tlabel: string;\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\tstyle?: React.CSSProperties;\n}\n\n/**\n * @since 1.0.0\n */\nexport function Tooltip( { label, children, className, style }: TooltipProps ) {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t{ children }\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t{ label }\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n}\n","/**\n * Error modal context — surfaces resolver and API errors in a dismissible\n * modal while keeping the full UI rendered.\n *\n * Mount once in App.tsx; consume with useErrorModal()\n * anywhere in the component tree.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createContext, useCallback, useContext, useState, type ReactNode } from 'react';\nimport type HarborError from '@/errors/harbor-error';\n\ninterface ErrorModalContextValue {\n errors: HarborError[];\n addError: ( error: HarborError ) => void;\n removeError: ( code: string ) => void;\n clearAll: () => void;\n}\n\nconst ErrorModalContext = createContext( {\n errors: [],\n addError: () => {},\n removeError: () => {},\n clearAll: () => {},\n} );\n\n/**\n * @since 1.0.0\n */\nexport function ErrorModalProvider( { children }: { children: ReactNode } ) {\n const [ errors, setErrors ] = useState( [] );\n\n const addError = useCallback( ( error: HarborError ) => {\n setErrors( ( prev ) =>\n prev.some( ( e ) => e.code === error.code ) ? prev : [ ...prev, error ]\n );\n }, [] );\n\n const removeError = useCallback( ( code: string ) => {\n setErrors( ( prev ) => prev.filter( ( e ) => e.code !== code ) );\n }, [] );\n\n const clearAll = useCallback( () => setErrors( [] ), [] );\n\n return (\n \n { children }\n \n );\n}\n\n/**\n * @since 1.0.0\n */\nexport const useErrorModal = () => useContext( ErrorModalContext );\n","/**\n * Filter context — shared search query and product filter state.\n *\n * Mount once in App.tsx; consume with useFilter() anywhere\n * in the component tree.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createContext, useContext, useState, type ReactNode } from 'react';\n\ninterface FilterContextValue {\n searchQuery: string;\n productFilter: string;\n setSearchQuery: ( q: string ) => void;\n setProductFilter: ( slug: string ) => void;\n}\n\nconst FilterContext = createContext( {\n searchQuery: '',\n productFilter: 'all',\n setSearchQuery: () => {},\n setProductFilter: () => {},\n} );\n\n/**\n * @since 1.0.0\n */\nexport function FilterProvider( { children }: { children: ReactNode } ) {\n const [ searchQuery, setSearchQuery ] = useState( '' );\n const [ productFilter, setProductFilter ] = useState( 'all' );\n\n return (\n \n { children }\n \n );\n}\n\n/**\n * @since 1.0.0\n */\nexport const useFilter = () => useContext( FilterContext );\n","/**\n * Harbor admin screen data context.\n *\n * Owns the four core resolvers for the Harbor admin screen (license, features,\n * catalog, legacy licenses). Errors from any resolver are pushed to the\n * ErrorModalContext so the error modal opens while the full UI stays rendered.\n * Errors are automatically cleared when all resolvers recover.\n *\n * Mount inside and outside\n * so it remains alive through render crashes.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { useSelect } from '@wordpress/data';\nimport { store as harborStore } from '@/store';\nimport useResolvableSelect from '@/hooks/use-resolvable-select/use-resolvable-select';\nimport HarborError from '@/errors/harbor-error';\nimport { ErrorCode } from '@/errors/error-code';\nimport { useErrorModal } from '@/context/error-modal-context';\nimport type { ResolvableSelectResponse } from '@/hooks/use-resolvable-select/types';\n\ninterface HarborDataContextValue {\n isLoading: boolean;\n isLicenseLoading: boolean;\n}\n\nconst HarborDataContext = createContext( {\n isLoading: true,\n isLicenseLoading: true,\n} );\n\ntype ResolvableRecord = Record>;\n\nconst RESOLVER_KEYS = [ 'license', 'features', 'catalog', 'legacyLicenses' ] as const;\ntype ResolverKey = typeof RESOLVER_KEYS[ number ];\n\nfunction findErrors( results: ResolvableRecord ): HarborError[] {\n const errors: HarborError[] = [];\n for ( const key in results ) {\n const entry = results[ key ];\n if ( entry.status === 'ERROR' ) {\n errors.push( HarborError.syncFrom(\n entry.error,\n ErrorCode.ResolutionFailed,\n __( 'Liquid Web Software Manager failed to load your data.', '%TEXTDOMAIN%' ),\n ) );\n }\n }\n return errors;\n}\n\n/**\n * @since TBD Expose isLicenseLoading alongside isLoading so consumers can route on the license resolver alone.\n * @since 1.0.0\n */\nexport function HarborDataProvider( { children }: { children: ReactNode } ) {\n const { addError, removeError } = useErrorModal();\n const lastErrorCodesRef = useRef( [] );\n\n const result = useResolvableSelect(\n ( resolve ) => ( {\n license: resolve( harborStore ).getLicenseKey(),\n features: resolve( harborStore ).getFeatures(),\n catalog: resolve( harborStore ).getCatalog(),\n legacyLicenses: resolve( harborStore ).getLegacyLicenses(),\n } ),\n [],\n );\n\n const hasEverResolvedRef = useRef>( {\n license: false,\n features: false,\n catalog: false,\n legacyLicenses: false,\n } );\n\n for ( const key of RESOLVER_KEYS ) {\n if ( result[ key ].hasResolved ) {\n\t\t\thasEverResolvedRef.current[ key ] = true;\n\t\t}\n }\n\n const isLoading = RESOLVER_KEYS.some( ( key ) => result[ key ].isResolving && ! hasEverResolvedRef.current[ key ] );\n // True until the license resolver has settled its first cycle. Covers both\n // the IDLE pre-fetch frame and the RESOLVING in-flight frame, so the\n // welcome screen never flashes before the resolver has had a chance to\n // report whether a key exists.\n const isLicenseLoading = ! hasEverResolvedRef.current.license;\n\n useEffect( () => {\n const found = findErrors( result );\n\n if ( found.length > 0 ) {\n lastErrorCodesRef.current = found.map( ( e ) => e.code );\n found.forEach( ( error ) => addError( error ) );\n } else if ( lastErrorCodesRef.current.length > 0 ) {\n lastErrorCodesRef.current.forEach( ( code ) => removeError( code ) );\n lastErrorCodesRef.current = [];\n }\n }, [ result, addError, removeError ] );\n\n const licenseError = useSelect(\n ( select ) => select( harborStore ).getLicenseError(),\n []\n );\n\n const lastLicenseErrorCodeRef = useRef( null );\n\n useEffect( () => {\n if ( licenseError !== null ) {\n const error = new HarborError( ErrorCode.LicenseValidateFailed, licenseError.message );\n lastLicenseErrorCodeRef.current = error.code;\n addError( error );\n } else if ( lastLicenseErrorCodeRef.current !== null ) {\n removeError( lastLicenseErrorCodeRef.current );\n lastLicenseErrorCodeRef.current = null;\n }\n }, [ licenseError, addError, removeError ] );\n\n return (\n \n { children }\n \n );\n}\n\n/**\n * @since 1.0.0\n */\nexport const useHarborData = () => useContext( HarborDataContext );\n","/**\n * @package LiquidWeb\\Harbor\n */\nimport { createContext, useContext, useState, type ReactNode } from 'react';\n\ninterface ReloadBannerContextValue {\n needsReload: boolean;\n setNeedsReload: ( value: boolean ) => void;\n}\n\nconst ReloadBannerContext = createContext( {\n needsReload: false,\n setNeedsReload: () => {},\n} );\n\n/**\n * @since 1.0.0\n */\nexport function ReloadBannerProvider( { children }: { children: ReactNode } ) {\n const [ needsReload, setNeedsReload ] = useState( false );\n\n return (\n \n { children }\n \n );\n}\n\n/**\n * @since 1.0.0\n */\nexport const useReloadBanner = () => useContext( ReloadBannerContext );\n","/**\n * Toast notification context — replaces Zustand toast-store.ts.\n *\n * Mount once in App.tsx; consume with useToast() anywhere\n * in the component tree.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createContext, useCallback, useContext, useRef, useState, type ReactNode } from 'react';\nimport { __ } from '@wordpress/i18n';\n\nexport type ToastVariant = 'default' | 'success' | 'error' | 'warning';\n\nexport interface ToastAction {\n label: string;\n onClick: () => void;\n}\n\nexport interface Toast {\n id: string;\n message: string;\n variant: ToastVariant;\n action?: ToastAction;\n}\n\ninterface ToastContextValue {\n toasts: Toast[];\n addToast: ( message: string, variant?: ToastVariant, action?: ToastAction ) => void;\n removeToast: ( id: string ) => void;\n}\n\nconst ToastContext = createContext( {\n toasts: [],\n addToast: () => {},\n removeToast: () => {},\n} );\n\n/**\n * @since 1.0.0\n */\nexport function ToastProvider( { children }: { children: ReactNode } ) {\n const [ toasts, setToasts ] = useState( [] );\n const counterRef = useRef( 0 );\n\n const removeToast = useCallback( ( id: string ) => {\n setToasts( ( prev ) => prev.filter( ( t ) => t.id !== id ) );\n }, [] );\n\n const addToast = useCallback(\n ( message: string, variant: ToastVariant = 'default', action?: ToastAction ) => {\n const id = `lw-harbor-toast-id-${ ++counterRef.current }`;\n\n setToasts( ( prev ) => [ ...prev, { id, message, variant, action } ] );\n if ( ! action ) {\n setTimeout( () => removeToast( id ), 3500 );\n }\n },\n [ removeToast ],\n );\n\n return (\n \n { children }\n \n );\n}\n\n/**\n * @since 1.0.0\n */\nexport const useToast = () => useContext( ToastContext );\n","/**\n * Product catalog data.\n *\n * Product metadata. Tier definitions and feature lists come from the\n * liquidweb/harbor/v1/catalog and liquidweb/harbor/v1/features REST\n * endpoints — not stored here.\n *\n * @package LiquidWeb\\Harbor\n */\nimport type { Product } from '@/types/api';\n\nexport const PRODUCTS: Product[] = [\n {\n slug: 'give',\n name: 'GiveWP',\n tagline: 'Donation forms and fundraising for WordPress',\n },\n {\n slug: 'the-events-calendar',\n name: 'The Events Calendar',\n tagline: 'Powerful event management for WordPress',\n },\n {\n slug: 'learndash',\n name: 'LearnDash',\n tagline: 'World-class LMS for online courses',\n },\n {\n slug: 'kadence',\n name: 'Kadence',\n tagline: 'Page builder and theme toolkit for WordPress',\n },\n];\n\n/** Lookup a product by slug */\nexport function getProduct( slug: string ): Product | undefined {\n return PRODUCTS.find( ( p ) => p.slug === slug );\n}\n","/**\n * Machine-readable error codes for HarborError instances.\n *\n * @package LiquidWeb\\Harbor\n */\nexport enum ErrorCode {\n\tFeaturesFetchFailed = 'features-fetch-failed',\n\tFeatureEnableFailed = 'feature-enable-failed',\n\tFeatureDisableFailed = 'feature-disable-failed',\n\tFeatureUpdateFailed = 'feature-update-failed',\n\tLicenseFetchFailed = 'license-fetch-failed',\n\tLicenseActionInProgress = 'license-action-in-progress',\n\tLicenseStoreFailed = 'license-store-failed',\n\tLicenseDeleteFailed = 'license-delete-failed',\n\tLicenseRefreshFailed = 'license-refresh-failed',\n\tLicenseValidateFailed = 'license-validate-failed',\n\tCatalogFetchFailed = 'catalog-fetch-failed',\n\tCatalogRefreshFailed = 'catalog-refresh-failed',\n\tLegacyLicensesFetchFailed = 'legacy-licenses-fetch-failed',\n\tResolutionFailed = 'resolution-failed',\n}\n","/**\n * HarborError -- typed wrapper around the WP REST API serialized WP_Error.\n *\n * @wordpress/api-fetch throws the parsed JSON body (a plain object) when\n * the server returns a non-2xx response. HarborError normalizes that into\n * a proper Error subclass with structured access to code, data, and any\n * additional errors.\n *\n * The entire error chain is typed. `additionalErrors` contains HarborError\n * instances (not plain WpRestError objects), so consumers get `.code`,\n * `.status`, and `.data` on every entry without casting.\n *\n * @package LiquidWeb\\Harbor\n */\n\nimport type { WpRestError } from './types';\nimport { isWpRestError } from './utils';\nimport { ErrorCode } from './error-code';\n\nexport default class HarborError extends Error {\n\t/**\n\t * Machine-readable error code from the WP_Error.\n\t */\n\treadonly code: string;\n\n\t/**\n\t * Data payload (usually contains `{ status: number }`).\n\t */\n\treadonly data: Record;\n\n\t/**\n\t * Secondary errors from a multi-code WP_Error response. This is a\n\t * deserialization concern only. Use `cause` (via `HarborError.wrap()`)\n\t * to chain errors on the frontend.\n\t */\n\treadonly additionalErrors: HarborError[];\n\n\t/**\n\t * Original cause, if this error wraps another.\n\t */\n\treadonly cause?: Error;\n\n\tconstructor(code: ErrorCode, message: string, options?: { cause?: Error });\n\tconstructor(wpError: WpRestError, options?: { cause?: Error });\n\tconstructor(\n\t\tcodeOrError: ErrorCode | WpRestError,\n\t\tmessageOrOptions?: string | { cause?: Error },\n\t\toptions?: { cause?: Error }\n\t) {\n\t\tif (typeof codeOrError === 'string') {\n\t\t\tsuper(messageOrOptions as string);\n\t\t\tthis.name = 'HarborError';\n\t\t\tthis.code = codeOrError;\n\t\t\tthis.data = {};\n\t\t\tthis.additionalErrors = [];\n\t\t\tthis.cause = options?.cause;\n\t\t} else {\n\t\t\tsuper(codeOrError.message);\n\t\t\tthis.name = 'HarborError';\n\t\t\tthis.code = codeOrError.code;\n\t\t\tthis.data = codeOrError.data ?? {};\n\t\t\tthis.additionalErrors = (codeOrError.additional_errors ?? []).map(\n\t\t\t\t(entry) => new HarborError(entry)\n\t\t\t);\n\t\t\tthis.cause = (messageOrOptions as { cause?: Error } | undefined)?.cause;\n\t\t}\n\t}\n\n\t/**\n\t * HTTP status code, if present.\n\t */\n\tget status(): number | undefined {\n\t\treturn typeof this.data.status === 'number'\n\t\t\t? this.data.status\n\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Flatten the error tree into an array. Collects this error, then its\n\t * additionalErrors (server-side siblings), then recurses into cause.\n\t */\n\ttoArray(): HarborError[] {\n\t\tconst result: HarborError[] = [this];\n\t\tfor (const additional of this.additionalErrors) {\n\t\t\tresult.push(...additional.toArray());\n\t\t}\n\t\tif (this.cause instanceof HarborError) {\n\t\t\tresult.push(...this.cause.toArray());\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * Async conversion of an unknown value into an HarborError.\n\t *\n\t * Handles everything `syncFrom` does, plus `Response` objects that\n\t * apiFetch throws when it cannot parse JSON or when `parse: false`\n\t * is used.\n\t */\n\tstatic async from(\n\t\terror: unknown,\n\t\tcode: ErrorCode,\n\t\tmessage: string\n\t): Promise {\n\t\tif (error instanceof Response) {\n\t\t\ttry {\n\t\t\t\tconst body = await error.json();\n\t\t\t\tif (isWpRestError(body)) {\n\t\t\t\t\treturn new HarborError(body);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Response body wasn't JSON, fall through.\n\t\t\t}\n\n\t\t\treturn new HarborError(code, message);\n\t\t}\n\n\t\treturn HarborError.syncFrom(error, code, message);\n\t}\n\n\t/**\n\t * Synchronous conversion of an unknown value into an HarborError.\n\t *\n\t * If the value is already an HarborError, returns it as-is. If it is\n\t * a WpRestError, hydrates it via the constructor. Anything else\n\t * (plain Error, string, etc.) produces an HarborError with the given\n\t * fallback `code` and `message`, and the original is stored as `cause`.\n\t */\n\tstatic syncFrom(\n\t\terror: unknown,\n\t\tcode: ErrorCode,\n\t\tmessage: string\n\t): HarborError {\n\t\tif (error instanceof HarborError) {\n\t\t\treturn error;\n\t\t}\n\n\t\tif (isWpRestError(error)) {\n\t\t\treturn new HarborError(error);\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn new HarborError({ code, message }, { cause: error });\n\t\t}\n\n\t\treturn new HarborError({ code, message });\n\t}\n\n\t/**\n\t * Async wrap of an unknown caught value into an HarborError with context.\n\t *\n\t * The provided `code` and `message` describe what operation failed.\n\t * The original value is preserved as `cause` so the full error chain\n\t * is available for inspection. When the original is a WpRestError,\n\t * its `data` and `additional_errors` are also carried forward.\n\t *\n\t * Handles `Response` objects that apiFetch throws when it cannot\n\t * parse JSON or when `parse: false` is used.\n\t */\n\tstatic async wrap(\n\t\terror: unknown,\n\t\tcode: ErrorCode,\n\t\tmessage: string\n\t): Promise {\n\t\tif (error instanceof Response) {\n\t\t\ttry {\n\t\t\t\tconst body = await error.json();\n\t\t\t\tif (isWpRestError(body)) {\n\t\t\t\t\treturn new HarborError(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tmessage,\n\t\t\t\t\t\t\tdata: body.data,\n\t\t\t\t\t\t\tadditional_errors: body.additional_errors,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ cause: new HarborError(body) }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Response body wasn't JSON, fall through.\n\t\t\t}\n\n\t\t\treturn new HarborError({ code, message });\n\t\t}\n\n\t\treturn HarborError.wrapSync(error, code, message);\n\t}\n\n\t/**\n\t * Synchronous wrap of an unknown caught value into an HarborError\n\t * with context.\n\t *\n\t * Same as `wrap` but cannot handle `Response` objects. Use this in\n\t * synchronous code paths where `await` is not available.\n\t */\n\tstatic wrapSync(error: unknown, code: ErrorCode, message: string): HarborError {\n\t\tif (error instanceof HarborError || error instanceof Error) {\n\t\t\treturn new HarborError({ code, message }, { cause: error });\n\t\t}\n\n\t\tif (isWpRestError(error)) {\n\t\t\treturn new HarborError(\n\t\t\t\t{\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage,\n\t\t\t\t\tdata: error.data,\n\t\t\t\t\tadditional_errors: error.additional_errors,\n\t\t\t\t},\n\t\t\t\t{ cause: new HarborError(error) }\n\t\t\t);\n\t\t}\n\n\t\treturn new HarborError({ code, message });\n\t}\n}\n","export { default as HarborError } from './harbor-error';\nexport { ErrorCode } from './error-code';\nexport { isWpRestError } from './utils';\nexport type { WpRestError } from './types';\n","/**\n * Error utility functions.\n *\n * @package LiquidWeb\\Harbor\n */\nimport type { WpRestError } from './types';\n\n/**\n * Type guard. Checks whether an unknown value matches the WP REST error shape.\n */\nexport function isWpRestError( value: unknown ): value is WpRestError {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t'code' in value &&\n\t\ttypeof ( value as WpRestError ).code === 'string' &&\n\t\t'message' in value &&\n\t\ttypeof ( value as WpRestError ).message === 'string'\n\t);\n}\n","/**\n * Like useSelect, but selectors return objects containing\n * both the original data AND the resolution info.\n *\n * Ported from sync-saas and converted to TypeScript.\n *\n * Inspired by `@wordpress/core-data` `useQuerySelect`.\n *\n * @see https://github.com/WordPress/gutenberg/blob/c97c26fe371e3d40efe197d8f398326a16cdbf46/packages/core-data/src/hooks/use-query-select.ts\n *\n * @package LiquidWeb\\Harbor\n */\nimport type { DependencyList } from 'react';\nimport { useSelect } from '@wordpress/data';\nimport type {\n\tEnrichedSelectors,\n\tMapResolvableSelect,\n\tResolvableSelectResponse,\n\tStatus,\n} from './types';\n\n/**\n * Meta selectors added by @wordpress/data that should not be enriched.\n */\nconst META_SELECTORS = [\n\t'getIsResolving',\n\t'hasStartedResolution',\n\t'hasFinishedResolution',\n\t'isResolving',\n\t'getCachedResolvers',\n];\n\n/**\n * Cache enriched selector proxies by selector object identity so we\n * don't recreate them on every useSelect call within the same render.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst cache = new WeakMap>();\n\n/**\n * Wrap store selectors so each call returns a {@link ResolvableSelectResponse}\n * with the original data and resolution metadata.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction enrichSelectors( selectors: Record ): EnrichedSelectors {\n\tconst cached = cache.get( selectors );\n\tif ( cached ) {\n\t\treturn cached;\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconst resolvers: Record = {};\n\n\tfor ( const selectorName in selectors ) {\n\t\tif ( META_SELECTORS.includes( selectorName ) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tObject.defineProperty( resolvers, selectorName, {\n\t\t\tget:\n\t\t\t\t() =>\n\t\t\t\t( ...args: unknown[] ): ResolvableSelectResponse => {\n\t\t\t\t\tconst data = selectors[ selectorName ]( ...args );\n\t\t\t\t\tconst resolutionState = selectors.getResolutionState(\n\t\t\t\t\t\tselectorName,\n\t\t\t\t\t\targs,\n\t\t\t\t\t);\n\t\t\t\t\tconst resolutionStatus: string | undefined =\n\t\t\t\t\t\tresolutionState?.status;\n\n\t\t\t\t\tlet status: Status;\n\t\t\t\t\tswitch ( resolutionStatus ) {\n\t\t\t\t\t\tcase 'resolving':\n\t\t\t\t\t\t\tstatus = 'RESOLVING';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'finished':\n\t\t\t\t\t\t\tstatus = 'SUCCESS';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tstatus = 'ERROR';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tstatus = 'IDLE';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\terror: resolutionState?.error ?? null,\n\t\t\t\t\t\tisResolving: status === 'RESOLVING',\n\t\t\t\t\t\thasStarted: status !== 'IDLE',\n\t\t\t\t\t\thasResolved:\n\t\t\t\t\t\t\tstatus === 'SUCCESS' || status === 'ERROR',\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t} );\n\t}\n\n\tcache.set( selectors, resolvers as EnrichedSelectors );\n\treturn resolvers as EnrichedSelectors;\n}\n\n/**\n * Like useSelect, but the selectors return objects containing\n * both the original data AND the resolution info.\n */\nexport default function useResolvableSelect(\n\tmapResolvableSelect: MapResolvableSelect,\n\tdeps: DependencyList,\n): T {\n\treturn useSelect(\n\t\t( select, registry ) => {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tconst resolve = ( store: any ) =>\n\t\t\t\tenrichSelectors( select( store ) );\n\t\t\treturn mapResolvableSelect( resolve, registry );\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\tdeps as unknown[],\n\t);\n}\n","/**\n * Behavior hook for FeatureRow.\n *\n * Encapsulates store wiring, async action handlers, and all derived state\n * so FeatureRow itself stays a pure composition of atoms.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useState } from 'react';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { store as harborStore } from '@/store';\nimport { getLicenseBadgeType } from '@/lib/feature-utils';\nimport type { LicenseBadgeType } from '@/lib/feature-utils';\nimport { useToast } from '@/context/toast-context';\nimport { useReloadBanner } from '@/context/reload-banner-context';\nimport { useErrorModal } from '@/context/error-modal-context';\nimport { HarborError } from '@/errors';\nimport type { Feature } from '@/types/api';\nimport { isInstallableFeature } from '@/types/utils';\nimport type { FeatureStatus } from '@/components/atoms/StatusBadge';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\nexport type PendingAction = 'enabling' | 'disabling' | 'installing' | 'updating' | null;\n\nfunction getBadgeStatus(\n pendingAction: PendingAction,\n licenseBadgeType: LicenseBadgeType | null,\n featureEnabled: boolean\n): FeatureStatus {\n if ( pendingAction ) {\n return pendingAction as FeatureStatus;\n }\n if ( licenseBadgeType === 'revoked' && ! featureEnabled ) {\n return 'locked';\n }\n return featureEnabled ? 'enabled' : 'available';\n}\n\nfunction getSwitchChecked( pendingAction: PendingAction, featureEnabled: boolean ): boolean {\n if ( pendingAction === 'enabling' || pendingAction === 'installing' ) {\n return true;\n }\n if ( pendingAction === 'disabling' ) {\n return false;\n }\n return featureEnabled;\n}\n\nexport interface FeatureRowState {\n\tpendingAction: PendingAction;\n\tinstallableBusy: boolean;\n\tbadgeStatus: FeatureStatus;\n\tshowSwitch: boolean;\n\tswitchChecked: boolean;\n\tlicenseBadgeType: LicenseBadgeType | null;\n\tshowDeactivateConfirm: boolean;\n\thandleToggle: ( checked: boolean ) => Promise;\n\thandleUpdate: () => Promise;\n\thandleConfirmDeactivate: () => Promise;\n\thandleCancelDeactivate: () => void;\n}\n\n/**\n * @since TBD Read pluginsUrl through the getHarborDataValue helper for the post-deactivate redirect.\n * @since 1.0.0\n */\nexport function useFeatureRow( feature: Feature ): FeatureRowState {\n\tconst { addToast } = useToast();\n\tconst { setNeedsReload } = useReloadBanner();\n\tconst { addError } = useErrorModal();\n\tconst { enableFeature, disableFeature, updateFeature } = useDispatch( harborStore );\n\n\tconst installableBusy = useSelect(\n\t\t( select ) =>\n\t\t\tisInstallableFeature( feature ) &&\n\t\t\tselect( harborStore ).isAnyInstallableBusy(),\n\t\t[ feature.type ]\n\t);\n\n\tconst enabledHarborHostCount = useSelect(\n\t\t( select ) => select( harborStore ).getEnabledHarborHostCount(),\n\t\t[]\n\t);\n\n\tconst harborHostBasenames = useSelect(\n\t\t( select ) => select( harborStore ).getHarborHostBasenames(),\n\t\t[]\n\t);\n\n\tconst isLegacy = useSelect(\n\t\t( select ) => {\n\t\t\tconst activeLegacy = select( harborStore ).getActiveLegacyLicense( feature.slug );\n\t\t\tif ( ! activeLegacy ) return false;\n\t\t\treturn ! select( harborStore ).isProductLicenseValid( feature.product );\n\t\t},\n\t\t[ feature.slug, feature.product ]\n\t);\n\n\tconst licenseBadgeType = getLicenseBadgeType( feature, isLegacy );\n\n\tconst [ pendingAction, setPendingAction ] = useState( null );\n\tconst [ showDeactivateConfirm, setShowDeactivateConfirm ] = useState( false );\n\n\t// Non-installable features (services) have no install/toggle/update lifecycle.\n\tif ( ! isInstallableFeature( feature ) ) {\n\t\treturn {\n\t\t\tpendingAction: null,\n\t\t\tinstallableBusy: false,\n\t\t\tbadgeStatus: 'included' as FeatureStatus,\n\t\t\tshowSwitch: false,\n\t\t\tswitchChecked: false,\n\t\t\tlicenseBadgeType,\n\t\t\tshowDeactivateConfirm: false,\n\t\t\thandleToggle: async () => {},\n\t\t\thandleUpdate: async () => {},\n\t\t\thandleConfirmDeactivate: async () => {},\n\t\t\thandleCancelDeactivate: () => {},\n\t\t};\n\t}\n\n\tconst featureEnabled = feature.is_enabled;\n\tconst featureInstalled = feature.installed_version !== null;\n\tconst isHarborHost = feature.type === 'plugin' && harborHostBasenames.includes( feature.plugin_file );\n\tconst isLastHarborHost = isHarborHost && featureEnabled && enabledHarborHostCount === 1;\n\n\tconst handleToggle = async ( checked: boolean ) => {\n\t\tif ( ! checked && isLastHarborHost ) {\n\t\t\tsetShowDeactivateConfirm( true );\n\t\t\treturn;\n\t\t}\n\n\t\tsetPendingAction( checked ? featureInstalled ? 'enabling' : 'installing' : 'disabling' );\n\t\tif ( checked ) {\n\t\t\tconst result = await enableFeature( feature.slug );\n\t\t\tif ( result instanceof HarborError ) {\n\t\t\t\taddError( result );\n\t\t\t} else {\n\t\t\t\taddToast(\n\t\t\t\t\t/* translators: %s is the name of the feature being enabled */\n\t\t\t\t\tsprintf( __( '%s enabled', '%TEXTDOMAIN%' ), feature.name ),\n\t\t\t\t\t'success',\n\t\t\t\t);\n\t\t\t\tsetNeedsReload( true );\n\t\t\t}\n\t\t} else {\n\t\t\tconst result = await disableFeature( feature.slug );\n\t\t\tif ( result instanceof HarborError ) {\n\t\t\t\taddError( result );\n\t\t\t} else {\n\t\t\t\taddToast(\n\t\t\t\t\t/* translators: %s is the name of the feature being disabled */\n\t\t\t\t\tsprintf( __( '%s disabled', '%TEXTDOMAIN%' ), feature.name ),\n\t\t\t\t\t'default',\n\t\t\t\t);\n\t\t\t\tsetNeedsReload( true );\n\t\t\t}\n\t\t}\n\t\tsetPendingAction( null );\n\t};\n\n\tconst handleConfirmDeactivate = async () => {\n\t\tsetShowDeactivateConfirm( false );\n\t\tsetPendingAction( 'disabling' );\n\t\tconst result = await disableFeature( feature.slug );\n\t\tif ( result instanceof HarborError ) {\n\t\t\taddError( result );\n\t\t} else {\n\t\t\twindow.location.href = getHarborDataValue( 'pluginsUrl' );\n\t\t}\n\t\tsetPendingAction( null );\n\t};\n\n\tconst handleCancelDeactivate = () => {\n\t\tsetShowDeactivateConfirm( false );\n\t};\n\n\tconst handleUpdate = async () => {\n\t\tsetPendingAction( 'updating' );\n\t\tconst result = await updateFeature( feature.slug );\n\t\tif ( result instanceof HarborError ) {\n\t\t\taddError( result );\n\t\t} else {\n\t\t\t/* translators: %s is the name of the feature being updated */\n\t\t\taddToast( sprintf( __( '%s updated.', '%TEXTDOMAIN%' ), feature.name ), 'success' );\n\t\t}\n\t\tsetPendingAction( null );\n\t};\n\n\tconst badgeStatus = getBadgeStatus( pendingAction, licenseBadgeType, featureEnabled );\n\tconst showSwitch = pendingAction !== 'installing' && pendingAction !== 'updating';\n\tconst switchChecked = getSwitchChecked( pendingAction, featureEnabled );\n\n\treturn {\n\t\tpendingAction,\n\t\tinstallableBusy,\n\t\tbadgeStatus,\n\t\tshowSwitch,\n\t\tswitchChecked,\n\t\tlicenseBadgeType,\n\t\tshowDeactivateConfirm,\n\t\thandleToggle,\n\t\thandleUpdate,\n\t\thandleConfirmDeactivate,\n\t\thandleCancelDeactivate,\n\t};\n}\n","/**\n * Hook that returns features for a product filtered by the active\n * search query from FilterContext.\n *\n * When the search query is empty the original selector result is returned\n * directly, so ProductSection only re-renders when features or the query\n * actually change.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useSelect } from '@wordpress/data';\nimport { useFilter } from '@/context/filter-context';\nimport { store as harborStore } from '@/store';\nimport type { Feature } from '@/types/api';\n\n/**\n * @since 1.0.0\n */\nexport function useFilteredFeatures( productSlug: string ): Feature[] {\n const { searchQuery } = useFilter();\n\n const features = useSelect(\n ( select ) => select( harborStore ).getFeaturesByProduct( productSlug ),\n [ productSlug ],\n );\n\n const query = searchQuery.trim();\n\n if ( ! query ) return features;\n\n // Try to use the query as a regex; fall back to a literal match if invalid.\n let pattern: RegExp;\n try {\n pattern = new RegExp( query, 'i' );\n } catch {\n pattern = new RegExp( query.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' ), 'i' );\n }\n\n return features.filter(\n ( f ) =>\n pattern.test( f.name ) ||\n pattern.test( f.slug ) ||\n pattern.test( f.description ),\n );\n}\n","/**\n * Partitions features for a product into available and locked groups,\n * and groups locked features by catalog tier.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useMemo } from 'react';\nimport { useSelect } from '@wordpress/data';\nimport { useFilteredFeatures } from '@/hooks/useFilteredFeatures';\nimport { store as harborStore } from '@/store';\nimport { isFreeFeature, getFeatureMismatch } from '@/lib/feature-utils';\nimport type { CatalogTier, Feature } from '@/types/api';\n\nexport interface FeatureGroups {\n availableFeatures: Feature[];\n lockedByTier: Record;\n sortedCatalogTiers: CatalogTier[]; // All tiers — used for header tier name lookup\n upgradeCatalogTiers: CatalogTier[]; // Tiers strictly above the user's rank — upgrade CTA shown\n activationCatalogTiers: CatalogTier[]; // Tiers within the user's rank, locked only because not activated — no upgrade CTA\n isUnactivatedLicense: boolean; // true when the user owns the tier but has not activated it on this domain\n}\n\n/**\n * @since 1.0.1 Detect unactivated license products and route their tiers to activationCatalogTiers instead of upgradeCatalogTiers. Exposes isUnactivatedLicense flag.\n * @since 1.0.0\n */\nexport function useProductFeatureGroups( productSlug: string ): FeatureGroups {\n const allFeatures = useFilteredFeatures( productSlug );\n\n const { catalogTiers, licenseProducts, isLicenseValid, legacyLicenses, unactivatedLicenseProduct } = useSelect(\n ( select ) => ({\n catalogTiers: select( harborStore ).getProductCatalog( productSlug )?.tiers ?? [],\n licenseProducts: select( harborStore ).getLicenseProducts(),\n isLicenseValid: select( harborStore ).isProductLicenseValid( productSlug ),\n legacyLicenses: select( harborStore ).getLegacyLicenses(),\n unactivatedLicenseProduct: select( harborStore ).getUnactivatedLicenseProduct( productSlug ),\n }),\n [ productSlug ]\n );\n\n return useMemo( () => {\n const sorted = catalogTiers.slice().sort( ( a, b ) => a.rank - b.rank );\n const forProduct = licenseProducts.filter( ( lp ) => lp.product_slug === productSlug );\n const licenseProduct = forProduct.find( ( lp ) => lp.activated_here === true );\n\n // A license is \"invalid\" when a validation status is known but not 'valid'\n // (e.g. not_activated, expired, suspended). The raw tier is still present on\n // the product, but features are locked — the user needs to activate, not upgrade.\n const isLicenseInvalid = licenseProduct !== undefined &&\n licenseProduct.validation_status !== null &&\n licenseProduct.validation_status !== 'valid';\n\n // Rank of the activated product, or -1 when none is present.\n const activatedTier = licenseProduct?.tier\n ? sorted.find( ( t ) => t.tier_slug === licenseProduct.tier )\n : null;\n const activatedRank = activatedTier?.rank ?? -1;\n\n // Rank of the unactivated product, if any.\n // An unactivated product may sit above the activated tier (e.g. user purchased an\n // upgrade to elite while pro is already active but elite not yet activated on this\n // domain). In that case both tiers exist and only elite needs the activation badge.\n const unactivatedTier = unactivatedLicenseProduct?.tier\n ? sorted.find( ( t ) => t.tier_slug === unactivatedLicenseProduct.tier )\n : null;\n const unactivatedRank = unactivatedTier?.rank ?? -1;\n\n // isUnactivatedLicense: the user owns a tier they have not activated on this domain,\n // whether because no activated product exists at all (unactivatedRank > -1 > activatedRank)\n // or because a higher purchased tier is not yet activated (unactivatedRank > activatedRank).\n const isUnactivatedLicense = unactivatedLicenseProduct !== null && unactivatedRank > activatedRank;\n\n // Effective rank = highest owned tier (activated or not).\n const rank = Math.max( activatedRank, unactivatedRank );\n\n // Tiers strictly above the highest owned rank: features here need an upgrade.\n const upgrade = sorted.filter( ( t ) => t.rank > rank );\n\n // activationTiers covers two cases:\n // 1. isLicenseInvalid: tiers within the activated rank locked due to invalid status\n // (expired, suspended, etc.) — user needs to fix the license, not upgrade.\n // 2. isUnactivatedLicense: tiers above the activated rank but within the unactivated\n // rank — user owns them but hasn't activated on this domain yet.\n // Both render without an upgrade button.\n const activationTiers = isLicenseInvalid\n ? sorted.filter( ( t ) => t.rank <= activatedRank && t.rank > 0 )\n : isUnactivatedLicense\n ? sorted.filter( ( t ) => t.rank <= rank && t.rank > activatedRank )\n : [];\n const slugs = isLicenseValid\n ? new Set()\n : new Set( legacyLicenses.filter( ( l ) => l.is_active ).map( ( l ) => l.slug ) );\n\n const isLegacyAvailable = ( f: Feature ) => slugs.has( f.slug );\n\n // Available: the standard set, PLUS revoked features.\n // Revoked features are in the user's tier but have had their capability removed.\n // They render as disabled rows in the available section (not in upgrade accordions),\n // since the user does not need to upgrade — the tier already covers them.\n const availableFeatures = allFeatures.filter( ( f ) =>\n f.is_available ||\n isFreeFeature( f.tier ) ||\n isLegacyAvailable( f ) ||\n getFeatureMismatch( f ) === 'revoked'\n );\n\n // Locked: not available, not free, not legacy, and not revoked.\n const lockedFeatures = allFeatures.filter( ( f ) =>\n ! f.is_available &&\n ! isFreeFeature( f.tier ) &&\n ! isLegacyAvailable( f ) &&\n getFeatureMismatch( f ) !== 'revoked'\n );\n\n const lockedByTier = sorted.reduce>(\n ( acc, tier ) => {\n acc[ tier.tier_slug ] = lockedFeatures.filter( ( f ) => f.tier === tier.tier_slug );\n return acc;\n },\n {}\n );\n\n return {\n availableFeatures,\n lockedByTier,\n sortedCatalogTiers: sorted,\n upgradeCatalogTiers: upgrade,\n activationCatalogTiers: activationTiers,\n isUnactivatedLicense,\n };\n }, [ allFeatures, catalogTiers, licenseProducts, isLicenseValid, legacyLicenses, productSlug, unactivatedLicenseProduct ] );\n}\n","/**\n * Behavior hook for WelcomeLicenseForm.\n *\n * Owns input state, derived validation, the storeLicense dispatch,\n * and the pickWelcomeErrorMessage helper. Mirrors the existing\n * useFeatureRow pattern so the form's component file stays JSX-only.\n *\n * Deliberately not generic — the LWSW-prefix rule and the error-message\n * composition are specific to this form. We do not reuse LicenseKeyInput\n * because that component routes failures through the global error modal\n * and exposes a tri-state UI we do not want here.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { useCallback, useState } from 'react';\nimport { __ } from '@wordpress/i18n';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { store as harborStore } from '@/store';\nimport { HarborError } from '@/errors';\nimport { getHarborDataValue } from '@/lib/harbor-data';\n\nconst SERVER_INVALID_KEY_CODE = 'lw-harbor-invalid-key';\n\n/**\n * Translated sentence that redirects a customer with a non-unified key to the\n * owning plugin's own settings page. Surfaced both as an inline format hint\n * while the user is typing and as the server-side error tail when the\n * licensing service rejects the key as unrecognized.\n *\n * Defined once so translators see a single string identity across both call\n * sites — re-translating the same advice twice risks drift.\n *\n * @since TBD\n */\nexport function getNonUnifiedLicenseAdvice(): string {\n return __(\n \"If this is a non-unified license, activate it in that plugin's own settings page.\",\n '%TEXTDOMAIN%'\n );\n}\n\n/**\n * Compose the user-facing error message for a failed activation.\n *\n * storeLicense wraps any WP_Error from the licensing service via\n * HarborError.wrap(), which preserves the server error as `cause`.\n * The outer message is the generic wrapper; the cause carries the\n * server's diagnostic code and message.\n *\n * The plugin-settings redirection is appended only when the server\n * specifically rejected the key as unrecognized — for expired or\n * suspended subscriptions that framing would be misleading.\n *\n * @since TBD\n */\nexport function pickWelcomeErrorMessage( error: HarborError ): string {\n const serverError = error.cause instanceof HarborError ? error.cause : null;\n const baseMessage = serverError?.message?.trim() || error.message;\n\n if ( serverError?.code === SERVER_INVALID_KEY_CODE ) {\n return `${ __( \"We couldn't verify this key.\", '%TEXTDOMAIN%' ) } ${ getNonUnifiedLicenseAdvice() }`;\n }\n\n return baseMessage;\n}\n\nexport interface UseWelcomeLicenseForm {\n key: string;\n serverError: string | null;\n isStoring: boolean;\n canModifyLicense: boolean;\n showFormatHint: boolean;\n canSubmit: boolean;\n onKeyChange: ( value: string ) => void;\n onActivate: () => Promise;\n}\n\n/**\n * @since TBD\n */\nexport function useWelcomeLicenseForm(): UseWelcomeLicenseForm {\n const [ key, setKey ] = useState( '' );\n const [ serverError, setServerError ] = useState( null );\n\n const { storeLicense } = useDispatch( harborStore );\n\n const { isStoring, canModifyLicense } = useSelect(\n ( select ) => ( {\n isStoring: select( harborStore ).isLicenseStoring(),\n canModifyLicense: select( harborStore ).canModifyLicense(),\n } ),\n []\n );\n\n const prefix = getHarborDataValue( 'licenseKeyPrefix' );\n const trimmed = key.trim();\n const hasInput = trimmed.length > 0;\n\tconst hasInputMinLength = trimmed.length >= prefix.length;\n const isLwswFormat = trimmed.startsWith( prefix.substring( 0, trimmed.length ) );\n const showFormatHint = hasInput && ! isLwswFormat && ! serverError;\n const canSubmit = canModifyLicense && hasInputMinLength && isLwswFormat && ! isStoring;\n\n const onKeyChange = useCallback( ( value: string ) => {\n setKey( value.toUpperCase() );\n setServerError( null );\n }, [] );\n\n const onActivate = useCallback( async () => {\n if ( ! canSubmit ) {\n return;\n }\n setServerError( null );\n const result = await storeLicense( trimmed );\n if ( result instanceof HarborError ) {\n setServerError( pickWelcomeErrorMessage( result ) );\n }\n // On success: hasLicense becomes true → AppContent re-renders to AppShell automatically.\n }, [ canSubmit, storeLicense, trimmed ] );\n\n return {\n key,\n serverError,\n isStoring,\n canModifyLicense,\n showFormatHint,\n canSubmit,\n onKeyChange,\n onActivate,\n };\n}\n","/**\n * Appends product and tier params to the base activation URL supplied by the\n * API, producing a product-scoped URL the Liquid Web portal can use to\n * pre-select the right product and tier.\n *\n * The base URL is already fully assembled by the server and includes params\n * such as portal-referral, redirect_url (percent-encoded), refresh, and\n * domain. This function only adds the two params it owns and never touches\n * the others.\n *\n * Example base URL from the API:\n * https://my.liquidweb.com/subscriptions/?portal-referral=plugin\n * &redirect_url=https%3A%2F%2Fexample.com%2Fwp-admin%2Foptions-general.php%3Fpage%3Dlw-software-manager%26refresh%3Dauto\n * &domain=example.com\n *\n * @param baseUrl The raw activationUrl string from the API.\n * @param productSlug e.g. \"givewp\"\n * @param tier e.g. \"elite\"\n *\n * @since 1.0.0\n */\nexport function buildActivationUrl(\n baseUrl: string,\n productSlug: string,\n tier: string,\n): string {\n try {\n const url = new URL( baseUrl );\n url.searchParams.set( 'sku', `${ productSlug }:${ tier }` );\n return url.toString();\n } catch {\n return baseUrl;\n }\n}\n","import type { Feature, FeatureMismatchType } from '@/types/api';\n\nexport type LicenseBadgeType = 'free' | 'legacy' | 'bonus' | 'revoked';\n\n/**\n * True when a feature requires no paid tier — either it has no tier at all\n * or its tier slug contains \"free\" (e.g. \"give-free\").\n *\n * @since 1.0.0\n */\nexport function isFreeFeature( tier: string | null ): boolean {\n return ! tier || tier.toLowerCase().includes( 'free' );\n}\n\n/**\n * Returns the single license badge type to display for a feature row, or null if none applies.\n *\n * Enforces mutual exclusivity: only the first matching condition wins.\n *\n * @since 1.0.0\n */\nexport function getLicenseBadgeType( feature: Feature, isLegacy: boolean ): LicenseBadgeType | null {\n if ( isFreeFeature( feature.tier ) ) return 'free';\n if ( isLegacy ) return 'legacy';\n return getFeatureMismatch( feature );\n}\n\n/**\n * Returns the mismatch type for a feature, or null if there is no mismatch.\n *\n * Both fields are pre-computed by the backend resolution layer.\n * No catalog or license cross-referencing is needed at call sites.\n *\n * @since 1.0.0\n */\nexport function getFeatureMismatch( feature: Feature ): FeatureMismatchType {\n if ( feature.is_available && ! feature.in_catalog_tier ) {\n return 'bonus';\n }\n if ( ! feature.is_available && feature.in_catalog_tier ) {\n return 'revoked';\n }\n return null;\n}\n","/**\n * Utilities for @wordpress/data stores.\n *\n * Ported from sync-saas @utils/data/forward-resolver.js\n *\n * @package LiquidWeb\\Harbor\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyResolver = ( ...args: any[] ) => any;\n\n/**\n * Forwards resolution to another resolver with the same arguments.\n *\n * Use when the source and target selectors share the same signature.\n */\nexport function forwardResolver( resolverName: string ): AnyResolver {\n\treturn ( ...args: unknown[] ) =>\n\t\tasync ( { resolveSelect }: Record ) => {\n\t\t\tawait resolveSelect[ resolverName ]( ...args );\n\t\t};\n}\n\n/**\n * Forwards resolution to another resolver, discarding arguments.\n *\n * Use when a derived selector (e.g. getFeature(slug)) depends on data\n * fetched by a resolver that takes no arguments (e.g. getFeatures()).\n */\nexport function forwardResolverWithoutArgs( resolverName: string ): AnyResolver {\n\treturn () =>\n\t\tasync ( { resolveSelect }: Record ) => {\n\t\t\tawait resolveSelect[ resolverName ]();\n\t\t};\n}\n","/**\n * @package LiquidWeb\\Harbor\n */\nimport { PRODUCTS } from '@/data/products';\nimport type { LicenseProduct } from '@/types/api';\n\nexport interface GroupedProduct {\n productSlug: string;\n productName: string;\n tiers: LicenseProduct[];\n}\n\n/**\n * Groups LicenseProduct entries by product_slug, sorts tiers within each group\n * (activated-here first, then ascending by rank), and orders groups by the\n * PRODUCTS constant. Products absent from licenseProducts are omitted.\n *\n * @since 1.0.0\n */\nexport function groupLicenseProducts(\n licenseProducts: LicenseProduct[],\n tierRankMap: Record,\n): GroupedProduct[] {\n const groups: Record = {};\n licenseProducts.forEach( ( lp ) => {\n if ( ! groups[ lp.product_slug ] ) {\n groups[ lp.product_slug ] = [];\n }\n groups[ lp.product_slug ].push( lp );\n } );\n\n Object.values( groups ).forEach( ( tiers ) => {\n tiers.sort( ( a, b ) => ( tierRankMap[ a.tier ] ?? 0 ) - ( tierRankMap[ b.tier ] ?? 0 ) );\n } );\n\n return PRODUCTS\n .filter( ( p ) => groups[ p.slug ] !== undefined )\n .map( ( p ) => ({ productSlug: p.slug, productName: p.name, tiers: groups[ p.slug ] }) );\n}\n","/**\n * Typed accessor for `window.harborData`.\n *\n * Single source of truth for global config access. Three lookup tiers:\n * 1. Live value at `window.harborData[ key ]`.\n * 2. Per-call `fallback` (optional).\n * 3. Built-in default from the `DEFAULTS` map.\n * 4. `null` if none of those exist.\n *\n * Defaulting to `null` rather than `undefined` matches the surrounding\n * codebase convention (LicenseSection / LicensePanel already type their\n * optional URLs as `string | null`).\n *\n * @package LiquidWeb\\Harbor\n */\nimport type { HarborData } from '@/types/harbor-data';\n\nconst DEFAULTS = {\n licenseKeyPrefix: 'LWSW-',\n pluginsUrl: '/wp-admin/plugins.php',\n} as const satisfies Partial;\n\ntype KeyWithDefault = keyof typeof DEFAULTS;\n\n/**\n * @since TBD\n */\nexport function getHarborDataValue(\n key: K\n): HarborData[K];\nexport function getHarborDataValue>(\n key: K\n): HarborData[K] | null;\nexport function getHarborDataValue(\n key: K,\n fallback: HarborData[K]\n): HarborData[K];\nexport function getHarborDataValue(\n key: K,\n fallback?: HarborData[K]\n): HarborData[K] | null {\n return (\n window.harborData?.[ key ]\n ?? fallback\n ?? ( DEFAULTS as Partial )[ key ]\n ?? null\n );\n}\n\n/**\n * Returns the placeholder string for a license-key input — the configured\n * prefix followed by five groups of four X's, matching the issued key shape\n * (e.g. `LWSW-XXXX-XXXX-XXXX-XXXX-XXXX`).\n *\n * @since TBD\n */\nexport function getLicenseKeyPlaceholder(): string {\n return `${ getHarborDataValue( 'licenseKeyPrefix' ) }XXXX-XXXX-XXXX-XXXX-XXXX`;\n}\n","/**\n * Pure utility functions for license expiry display.\n *\n * @package LiquidWeb\\Harbor\n */\n\n/**\n * @since 1.0.0\n */\nexport function formatDate( dateStr: string ): string {\n return new Date( dateStr ).toLocaleDateString( 'en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n } );\n}\n\n/**\n * @since 1.0.0\n */\nexport function getExpiryStatus( dateStr: string ): 'expired' | 'expiring-soon' | 'ok' {\n const diff = new Date( dateStr ).getTime() - Date.now();\n if ( diff <= 0 ) return 'expired';\n if ( diff <= 30 * 24 * 60 * 60 * 1000 ) return 'expiring-soon';\n return 'ok';\n}\n\nexport const expiryTextClass: Record = {\n expired: 'text-destructive font-medium',\n 'expiring-soon': 'text-amber-600 font-medium',\n ok: 'text-muted-foreground',\n};\n","/**\n * Appends portal tracking parameters to a catalog upgrade URL.\n *\n * The upgrade_url comes from the catalog tier and is a base URL without\n * site context. This function appends domain and portal-referral so the\n * portal can identify the originating site and entry point.\n *\n * Example:\n * baseUrl = https://my.liquidweb.com/upgrade/kadence/pro/\n * domain = example.com\n * → https://my.liquidweb.com/upgrade/kadence/pro/?domain=example.com&portal-referral=plugin\n *\n * @param baseUrl The upgrade_url string from the catalog tier.\n * @param domain The site domain from getHarborDataValue( 'domain' ).\n *\n * @since TBD Domain parameter is now string | null to match the getHarborDataValue helper.\n * @since 1.0.2\n */\nexport function buildUpgradeUrl(\n baseUrl: string,\n domain: string | null,\n): string {\n if ( ! domain ) {\n return baseUrl;\n }\n try {\n const url = new URL( baseUrl );\n url.searchParams.set( 'domain', domain );\n url.searchParams.set( 'portal-referral', 'plugin' );\n return url.toString();\n } catch {\n return baseUrl;\n }\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn( ...inputs: ClassValue[] ): string {\n return twMerge( clsx( inputs ) );\n}\n","/**\n * Action creators for the lw @wordpress/data store.\n *\n * @package LiquidWeb\\Harbor\n */\n\nimport apiFetch from '@wordpress/api-fetch';\nimport { __ } from '@wordpress/i18n';\nimport { HarborError, ErrorCode } from '@/errors';\nimport type { Feature, LegacyLicense, License, ProductCatalog } from '@/types/api';\nimport type { Action, Thunk } from './types';\n\n// ---------------------------------------------------------------------------\n// Plain action creators (synchronous)\n// ---------------------------------------------------------------------------\n\n/**\n * Receives the list of features from the REST API.\n *\n * @param features The list of features.\n * @since 1.0.0\n */\nexport const receiveFeatures = (features: Feature[]): Action => ({\n\ttype: 'RECEIVE_FEATURES',\n\tfeatures,\n});\n\n/**\n * Receives the list of Harbor host plugin basenames from the REST API.\n *\n * @param basenames The list of Harbor host plugin basenames.\n * @since 1.0.0\n */\nexport const receiveHarborHosts = (basenames: string[]): Action => ({\n\ttype: 'RECEIVE_HARBOR_HOSTS',\n\tbasenames,\n});\n\n/**\n * Receives the license from the REST API.\n *\n * @param license The license.\n * @since 1.0.0\n */\nexport const receiveLicense = (license: License): Action => ({\n\ttype: 'RECEIVE_LICENSE',\n\tlicense,\n});\n\n/**\n * Receives the product catalog from the REST API.\n *\n * @param catalogs The product catalog.\n * @since 1.0.0\n */\nexport const receiveCatalog = (catalogs: ProductCatalog[]): Action => ({\n\ttype: 'RECEIVE_CATALOG',\n\tcatalogs,\n});\n\n/**\n * Receives the legacy licenses from the REST API.\n *\n * @param licenses The legacy licenses.\n * @since 1.0.0\n */\nexport const receiveLegacyLicenses = (licenses: LegacyLicense[]): Action => ({\n\ttype: 'RECEIVE_LEGACY_LICENSES',\n\tlicenses,\n});\n\n// ---------------------------------------------------------------------------\n// Thunk action creators (async)\n// ---------------------------------------------------------------------------\n\n/**\n * Enable a feature via the REST API.\n *\n * @param slug\n * @since 1.0.0\n */\nexport const enableFeature =\n\t(slug: string): Thunk =>\n\tasync ({ dispatch }) => {\n\t\tdispatch({ type: 'TOGGLE_FEATURE_START', slug });\n\t\ttry {\n\t\t\tconst feature = await apiFetch({\n\t\t\t\tpath: `/liquidweb/harbor/v1/features/${slug}/enable`,\n\t\t\t\tmethod: 'POST',\n\t\t\t});\n\t\t\t// TOGGLE_FEATURE_FINISHED patches bySlug with the returned feature — no\n\t\t\t// need to invalidate getFeatures. A background re-fetch would race the\n\t\t\t// optimistic patch and could overwrite correct state with stale data,\n\t\t\t// causing the toggle flicker reproduced in https://github.com/stellarwp/harbor/pull/94.\n\t\t\tdispatch({ type: 'TOGGLE_FEATURE_FINISHED', feature });\n\t\t\t// Activation may have bootstrapped a new Harbor host plugin, so refresh\n\t\t\t// the hosts list. RECEIVE_HARBOR_HOSTS only touches harborHosts.basenames\n\t\t\t// and never overwrites bySlug, so there is no flicker risk.\n\t\t\tdispatch.invalidateResolution('getHarborHostBasenames', []);\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.FeatureEnableFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to enable your feature.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'TOGGLE_FEATURE_FAILED', slug, error });\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Disable a feature via the REST API.\n *\n * @param slug\n * @since 1.0.0\n */\nexport const disableFeature =\n\t(slug: string): Thunk =>\n\tasync ({ dispatch }) => {\n\t\tdispatch({ type: 'TOGGLE_FEATURE_START', slug });\n\t\ttry {\n\t\t\tconst feature = await apiFetch({\n\t\t\t\tpath: `/liquidweb/harbor/v1/features/${slug}/disable`,\n\t\t\t\tmethod: 'POST',\n\t\t\t});\n\t\t\t// Same reasoning as enableFeature: patch via TOGGLE_FEATURE_FINISHED,\n\t\t\t// do not invalidate getFeatures (https://github.com/stellarwp/harbor/pull/94). No hosts invalidation needed\n\t\t\t// because deactivation cannot introduce a new Harbor host.\n\t\t\tdispatch({ type: 'TOGGLE_FEATURE_FINISHED', feature });\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.FeatureDisableFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to disable your feature.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'TOGGLE_FEATURE_FAILED', slug, error });\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Update a feature via the REST API.\n *\n * @param slug\n * @since 1.0.0\n */\nexport const updateFeature =\n\t(slug: string): Thunk =>\n\tasync ({ dispatch }) => {\n\t\tdispatch({ type: 'UPDATE_FEATURE_START', slug });\n\t\ttry {\n\t\t\tconst feature = await apiFetch({\n\t\t\t\tpath: `/liquidweb/harbor/v1/features/${slug}/update`,\n\t\t\t\tmethod: 'POST',\n\t\t\t});\n\t\t\t// Same reasoning as enableFeature/disableFeature: UPDATE_FEATURE_FINISHED\n\t\t\t// patches bySlug directly — invalidating getFeatures is unnecessary and\n\t\t\t// risks the stale-overwrite flicker (https://github.com/stellarwp/harbor/pull/94).\n\t\t\tdispatch({ type: 'UPDATE_FEATURE_FINISHED', feature });\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.FeatureUpdateFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to update your feature.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'UPDATE_FEATURE_FAILED', slug, error });\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Store a license key via the REST API, then invalidate the license\n * and features resolvers so the UI refreshes with the new entitlements.\n *\n * @param key\n * @since 1.0.0\n */\nexport const storeLicense =\n\t(key: string): Thunk =>\n\tasync ({ dispatch, select }) => {\n\t\tif (!select.canModifyLicense()) {\n\t\t\treturn new HarborError(\n\t\t\t\tErrorCode.LicenseActionInProgress,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to validate your license, another action is in progress.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tdispatch({ type: 'STORE_LICENSE_START' });\n\t\ttry {\n\t\t\tconst result = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/license',\n\t\t\t\tmethod: 'POST',\n\t\t\t\tdata: { key },\n\t\t\t});\n\t\t\tdispatch({\n\t\t\t\ttype: 'STORE_LICENSE_FINISHED',\n\t\t\t\tlicense: result,\n\t\t\t});\n\t\t\t// License changes affect entitlements globally (available features, tiers,\n\t\t\t// locked state), so a full re-fetch of features is correct here — unlike\n\t\t\t// toggle/update actions where the API already returns the patched feature.\n\t\t\tdispatch.invalidateResolution('getFeatures', []);\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.LicenseStoreFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to validate your license.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'STORE_LICENSE_FAILED', error });\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Refresh the license from the upstream service via the REST API, then\n * invalidate the features resolver so the UI reflects any plan changes.\n *\n * @since 1.0.0\n */\nexport const refreshLicense =\n\t(): Thunk =>\n\tasync ({ dispatch, select }) => {\n\t\tif (!select.canModifyLicense()) {\n\t\t\treturn new HarborError(\n\t\t\t\tErrorCode.LicenseActionInProgress,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to refresh your license, another action is in progress.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tdispatch({ type: 'REFRESH_LICENSE_START' });\n\t\ttry {\n\t\t\tconst result = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/license/refresh',\n\t\t\t\tmethod: 'POST',\n\t\t\t});\n\t\t\tdispatch({ type: 'REFRESH_LICENSE_FINISHED', license: result });\n\t\t\tdispatch.invalidateResolution('getFeatures', []);\n\t\t\tif ( result.error ) {\n\t\t\t\treturn new HarborError( ErrorCode.LicenseValidateFailed, result.error.message );\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.LicenseRefreshFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to refresh your license.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'REFRESH_LICENSE_FAILED', error });\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Refresh the product catalog from the upstream service via the REST API.\n *\n * @since 1.0.0\n */\nexport const refreshCatalog =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst result = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/catalog/refresh',\n\t\t\t\tmethod: 'POST',\n\t\t\t});\n\t\t\tdispatch.receiveCatalog(result);\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.CatalogRefreshFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to refresh the product catalog.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\treturn error;\n\t\t}\n\t};\n\n/**\n * Delete the stored license key via the REST API, then invalidate the\n * features resolver so the UI refreshes.\n *\n * @since 1.0.0\n */\nexport const deleteLicense =\n\t(): Thunk =>\n\tasync ({ dispatch, select }) => {\n\t\tif (!select.canModifyLicense()) {\n\t\t\treturn new HarborError(\n\t\t\t\tErrorCode.LicenseActionInProgress,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to delete your license, another action is in progress.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\t\tdispatch({ type: 'DELETE_LICENSE_START' });\n\t\ttry {\n\t\t\tawait apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/license',\n\t\t\t\tmethod: 'DELETE',\n\t\t\t});\n\t\t\tdispatch({ type: 'DELETE_LICENSE_FINISHED' });\n\t\t\tdispatch.invalidateResolution('getFeatures', []);\n\t\t\treturn null;\n\t\t} catch (err) {\n\t\t\tconst error = await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.LicenseDeleteFailed,\n\t\t\t\t__(\n\t\t\t\t\t'Liquid Web Software Manager failed to remove your license.',\n\t\t\t\t\t'%TEXTDOMAIN%'\n\t\t\t\t)\n\t\t\t);\n\t\t\tdispatch({ type: 'DELETE_LICENSE_FAILED', error });\n\t\t\treturn error;\n\t\t}\n\t};\n","/**\n * @wordpress/data store name for the Harbor library.\n *\n * @package LiquidWeb\\Harbor\n */\nexport const STORE_NAME = 'lw/harbor' as const;\n","/**\n * Registers the lw @wordpress/data store.\n *\n * Call registerHarborStore() once before createRoot() in index.tsx.\n * Consumers import the store descriptor and use useSelect / useDispatch.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createReduxStore, register } from '@wordpress/data';\nimport { reducer } from './reducer';\nimport * as actions from './actions';\nimport * as selectors from './selectors';\nimport * as resolvers from './resolvers';\nimport { STORE_NAME } from './constants';\n\nexport const store = createReduxStore(STORE_NAME, {\n\treducer,\n\tactions,\n\tselectors,\n\tresolvers,\n});\n\nexport function registerHarborStore(): void {\n\tregister(store);\n}\n\nexport { STORE_NAME };\n","/**\n * Reducer for the lw @wordpress/data store.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { combineReducers } from '@wordpress/data';\nimport type {\n\tAction,\n\tCatalogState,\n\tFeaturesState,\n\tHarborHostsState,\n\tLegacyLicensesState,\n\tLicenseState,\n} from './types';\n\nexport const reducer = combineReducers({ features, harborHosts, license, catalog, legacyLicenses });\n\n// ---------------------------------------------------------------------------\n// Catalog\n// ---------------------------------------------------------------------------\n\nconst CATALOG_DEFAULT: CatalogState = {\n\tbyProductSlug: {},\n};\n\nfunction catalog(\n\tstate: CatalogState = CATALOG_DEFAULT,\n\taction: Action\n): CatalogState {\n\tswitch (action.type) {\n\t\tcase 'RECEIVE_CATALOG': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tbyProductSlug: Object.fromEntries(\n\t\t\t\t\taction.catalogs.map((c) => [c.product_slug, c])\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Legacy licenses\n// ---------------------------------------------------------------------------\n\nconst LEGACY_LICENSES_DEFAULT: LegacyLicensesState = {\n\tbySlug: {},\n};\n\nfunction legacyLicenses(\n\tstate: LegacyLicensesState = LEGACY_LICENSES_DEFAULT,\n\taction: Action\n): LegacyLicensesState {\n\tswitch (action.type) {\n\t\tcase 'RECEIVE_LEGACY_LICENSES': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tbySlug: Object.fromEntries(\n\t\t\t\t\taction.licenses.map((l) => [l.slug, l])\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Features\n// ---------------------------------------------------------------------------\n\nconst FEATURES_DEFAULT: FeaturesState = {\n\tbySlug: {},\n\ttoggling: {},\n\tupdating: {},\n\terrorBySlug: {},\n};\n\nfunction features(\n\tstate: FeaturesState = FEATURES_DEFAULT,\n\taction: Action\n): FeaturesState {\n\tswitch (action.type) {\n\t\tcase 'RECEIVE_FEATURES': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tbySlug: Object.fromEntries( action.features.map( ( f ) => [ f.slug, f ] ) ),\n\t\t\t};\n\t\t}\n\n\t\tcase 'TOGGLE_FEATURE_START': {\n\t\t\tconst { [action.slug]: _, ...remainingErrors } = state.errorBySlug;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoggling: { ...state.toggling, [action.slug]: true },\n\t\t\t\terrorBySlug: remainingErrors,\n\t\t\t};\n\t\t}\n\n\t\tcase 'TOGGLE_FEATURE_FINISHED': {\n\t\t\tconst { slug } = action.feature;\n\t\t\tconst { [slug]: _, ...remainingToggling } = state.toggling;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tbySlug: { ...state.bySlug, [ slug ]: action.feature },\n\t\t\t\ttoggling: remainingToggling,\n\t\t\t};\n\t\t}\n\n\t\tcase 'TOGGLE_FEATURE_FAILED': {\n\t\t\tconst { [action.slug]: _, ...remainingToggling } = state.toggling;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttoggling: remainingToggling,\n\t\t\t\terrorBySlug: {\n\t\t\t\t\t...state.errorBySlug,\n\t\t\t\t\t[action.slug]: action.error,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tcase 'UPDATE_FEATURE_START': {\n\t\t\tconst { [action.slug]: _, ...remainingErrors } = state.errorBySlug;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tupdating: { ...state.updating, [action.slug]: true },\n\t\t\t\terrorBySlug: remainingErrors,\n\t\t\t};\n\t\t}\n\n\t\tcase 'UPDATE_FEATURE_FINISHED': {\n\t\t\tconst { slug } = action.feature;\n\t\t\tconst { [slug]: _, ...remainingUpdating } = state.updating;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tbySlug: {\n\t\t\t\t\t...state.bySlug,\n\t\t\t\t\t[slug]: action.feature,\n\t\t\t\t},\n\t\t\t\tupdating: remainingUpdating,\n\t\t\t};\n\t\t}\n\n\t\tcase 'UPDATE_FEATURE_FAILED': {\n\t\t\tconst { [action.slug]: _, ...remainingUpdating } = state.updating;\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tupdating: remainingUpdating,\n\t\t\t\terrorBySlug: {\n\t\t\t\t\t...state.errorBySlug,\n\t\t\t\t\t[action.slug]: action.error,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Harbor hosts\n// ---------------------------------------------------------------------------\n\nconst HARBOR_HOSTS_DEFAULT: HarborHostsState = {\n\tbasenames: [],\n};\n\nfunction harborHosts(\n\tstate: HarborHostsState = HARBOR_HOSTS_DEFAULT,\n\taction: Action\n): HarborHostsState {\n\tswitch ( action.type ) {\n\t\tcase 'RECEIVE_HARBOR_HOSTS':\n\t\t\treturn { ...state, basenames: action.basenames };\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// License\n// ---------------------------------------------------------------------------\n\nconst LICENSE_DEFAULT: LicenseState = {\n\tlicense: { key: null, products: [], error: null },\n\tisStoring: false,\n\tisDeleting: false,\n\tisRefreshing: false,\n\tstoreError: null,\n\tdeleteError: null,\n\trefreshError: null,\n};\n\nfunction license(\n\tstate: LicenseState = LICENSE_DEFAULT,\n\taction: Action\n): LicenseState {\n\tswitch (action.type) {\n\t\tcase 'RECEIVE_LICENSE': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tlicense: action.license,\n\t\t\t};\n\t\t}\n\n\t\tcase 'STORE_LICENSE_START': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisStoring: true,\n\t\t\t\tstoreError: null,\n\t\t\t};\n\t\t}\n\n\t\tcase 'STORE_LICENSE_FINISHED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisStoring: false,\n\t\t\t\tlicense: action.license,\n\t\t\t};\n\t\t}\n\n\t\tcase 'STORE_LICENSE_FAILED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisStoring: false,\n\t\t\t\tstoreError: action.error,\n\t\t\t};\n\t\t}\n\n\t\tcase 'DELETE_LICENSE_START': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisDeleting: true,\n\t\t\t\tdeleteError: null,\n\t\t\t};\n\t\t}\n\n\t\tcase 'DELETE_LICENSE_FINISHED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisDeleting: false,\n\t\t\t\tlicense: { key: null, products: [], error: null },\n\t\t\t};\n\t\t}\n\n\t\tcase 'DELETE_LICENSE_FAILED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisDeleting: false,\n\t\t\t\tdeleteError: action.error,\n\t\t\t};\n\t\t}\n\n\t\tcase 'REFRESH_LICENSE_START': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisRefreshing: true,\n\t\t\t\trefreshError: null,\n\t\t\t};\n\t\t}\n\n\t\tcase 'REFRESH_LICENSE_FINISHED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisRefreshing: false,\n\t\t\t\tlicense: action.license,\n\t\t\t};\n\t\t}\n\n\t\tcase 'REFRESH_LICENSE_FAILED': {\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tisRefreshing: false,\n\t\t\t\trefreshError: action.error,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n","/**\n * Resolvers for the lw @wordpress/data store.\n *\n * Each resolver name matches a selector. @wordpress/data calls the resolver\n * automatically the first time the matching selector is invoked, then marks\n * it as resolved so subsequent calls hit the cache.\n *\n * @package LiquidWeb\\Harbor\n */\nimport apiFetch from '@wordpress/api-fetch';\nimport { __ } from '@wordpress/i18n';\nimport { HarborError, ErrorCode } from '@/errors';\nimport type { Feature, LegacyLicense, ProductCatalog, License } from '@/types/api';\nimport type { Thunk } from './types';\nimport { forwardResolver, forwardResolverWithoutArgs } from '@/lib/forward-resolver';\n\n/**\n * Fetches all features from the REST API and stores them.\n * Triggered automatically when getFeatures is first called.\n */\nexport const getFeatures =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst features = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/features',\n\t\t\t});\n\t\t\tdispatch.receiveFeatures(features);\n\t\t} catch (err) {\n\t\t\tthrow await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.FeaturesFetchFailed,\n\t\t\t\t__('Liquid Web Software Manager failed to load your features.', '%TEXTDOMAIN%')\n\t\t\t);\n\t\t}\n\t};\n\n/**\n * Fetches the active Harbor host plugin basenames from the REST API.\n * Triggered automatically when getHarborHostBasenames is first called, and\n * invalidated after plugin activation so the list stays current.\n */\nexport const getHarborHostBasenames =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst basenames = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/hosts',\n\t\t\t});\n\t\t\tdispatch.receiveHarborHosts(basenames);\n\t\t} catch (err) {\n\t\t\tthrow await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.FeaturesFetchFailed,\n\t\t\t\t__('Liquid Web Software Manager failed to load Harbor hosts.', '%TEXTDOMAIN%')\n\t\t\t);\n\t\t}\n\t};\n\nexport const getFeaturesByProduct = forwardResolverWithoutArgs('getFeatures');\nexport const getFeature = forwardResolverWithoutArgs('getFeatures');\nexport const isFeatureEnabled = forwardResolverWithoutArgs('getFeatures');\n\n// ---------------------------------------------------------------------------\n// Legacy licenses\n// ---------------------------------------------------------------------------\n\n/**\n * Fetches legacy licenses from the REST API.\n */\nexport const getLegacyLicenses =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst licenses = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/legacy-licenses',\n\t\t\t});\n\t\t\tdispatch.receiveLegacyLicenses(licenses);\n\t\t} catch (err) {\n\t\t\tthrow await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.LegacyLicensesFetchFailed,\n\t\t\t\t__('Liquid Web Software Manager failed to load legacy licenses.', '%TEXTDOMAIN%')\n\t\t\t);\n\t\t}\n\t};\n\nexport const getLegacyLicenseBySlug = forwardResolverWithoutArgs('getLegacyLicenses');\nexport const hasLegacyLicense = forwardResolverWithoutArgs('getLegacyLicenses');\nexport const hasLegacyLicenses = forwardResolver('getLegacyLicenses');\n\n// ---------------------------------------------------------------------------\n// Catalog\n// ---------------------------------------------------------------------------\n\n/**\n * Fetches all product catalogs from the REST API and stores them.\n * Triggered automatically when getCatalog is first called.\n */\nexport const getCatalog =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst catalogs = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/catalog',\n\t\t\t});\n\t\t\tdispatch.receiveCatalog(catalogs);\n\t\t} catch (err) {\n\t\t\tthrow await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.CatalogFetchFailed,\n\t\t\t\t__('Liquid Web Software Manager failed to load the product catalog.', '%TEXTDOMAIN%')\n\t\t\t);\n\t\t}\n\t};\n\nexport const getProductCatalog = forwardResolverWithoutArgs('getCatalog');\nexport const getProductTiers = forwardResolverWithoutArgs('getCatalog');\nexport const getCatalogTier = forwardResolverWithoutArgs('getCatalog');\n\n// ---------------------------------------------------------------------------\n// License\n// ---------------------------------------------------------------------------\n\n/**\n * Fetches the stored license from the REST API.\n * Triggered automatically when getLicenseKey is first called.\n */\nexport const getLicenseKey =\n\t(): Thunk =>\n\tasync ({ dispatch }) => {\n\t\ttry {\n\t\t\tconst result = await apiFetch({\n\t\t\t\tpath: '/liquidweb/harbor/v1/license',\n\t\t\t});\n\t\t\tdispatch.receiveLicense(result);\n\t\t} catch (err) {\n\t\t\tthrow await HarborError.wrap(\n\t\t\t\terr,\n\t\t\t\tErrorCode.LicenseFetchFailed,\n\t\t\t\t__('Liquid Web Software Manager failed to load your license.', '%TEXTDOMAIN%')\n\t\t\t);\n\t\t}\n\t};\n\nexport const hasLicense = forwardResolver( 'getLicenseKey' );\nexport const getLicenseProducts = forwardResolverWithoutArgs( 'getLicenseKey' );\n","/**\n * Selectors for the lw @wordpress/data store.\n *\n * @package LiquidWeb\\Harbor\n */\nimport { createSelector } from '@wordpress/data';\nimport type { State } from './types';\nimport type {\n\tCatalogTier,\n\tFeature,\n\tFeatureMismatchType,\n\tLegacyLicense,\n\tLicenseError,\n\tLicenseProduct,\n\tProductCatalog,\n} from '@/types/api';\nimport type HarborError from '@/errors/harbor-error';\nimport { getFeatureMismatch } from '@/lib/feature-utils';\nimport { isInstallableFeature } from '@/types/utils';\n\n// ---------------------------------------------------------------------------\n// Features\n// ---------------------------------------------------------------------------\n\nexport const getFeatures = createSelector(\n\t(state: State): Feature[] => Object.values(state.features.bySlug),\n\t(state: State) => [state.features.bySlug]\n);\n\nexport const getFeaturesByProduct = createSelector(\n\t(state: State, product: string): Feature[] =>\n\t\tObject.values(state.features.bySlug).filter((f) => f.product === product),\n\t(state: State, product: string) => [state.features.bySlug, product]\n);\n\nexport const getFeature = (state: State, slug: string): Feature | null =>\n\tstate.features.bySlug[slug] ?? null;\n\nexport const isFeatureEnabled = (state: State, slug: string): boolean =>\n\tstate.features.bySlug[slug]?.is_enabled ?? false;\n\nexport const isFeatureToggling = (state: State, slug: string): boolean =>\n\tstate.features.toggling[slug] ?? false;\n\nexport const getFeatureError = (\n\tstate: State,\n\tslug: string\n): HarborError | null => state.features.errorBySlug[slug] ?? null;\n\n/**\n * Returns the capability mismatch type for a feature, or null if there is none.\n *\n * Wraps getFeatureMismatch() for consumers that only have access to the store.\n * Hooks that already hold a Feature object should call getFeatureMismatch() directly.\n */\nexport const getFeatureMismatchType = (\n\tstate: State,\n\tslug: string\n): FeatureMismatchType => {\n\tconst feature = state.features.bySlug[ slug ];\n\tif ( ! feature ) return null;\n\treturn getFeatureMismatch( feature );\n};\n\nexport const isFeatureUpdating = (state: State, slug: string): boolean =>\n\tstate.features.updating[slug] ?? false;\n\n/**\n * Returns the plugin basenames of all active Harbor-bundled plugins.\n */\nexport const getHarborHostBasenames = ( state: State ): string[] =>\n\tstate.harborHosts.basenames;\n\n/**\n * Returns the number of Harbor host plugins that are currently enabled.\n *\n * Uses the dedicated hosts registry (accurate after activation) rather than\n * the is_harbor_host field on features (unreliable for mid-request activations).\n */\nexport const getEnabledHarborHostCount = createSelector(\n\t( state: State ): number =>\n\t\tObject.values( state.features.bySlug ).filter(\n\t\t\t( f ) =>\n\t\t\t\tf.type === 'plugin' &&\n\t\t\t\tstate.harborHosts.basenames.includes( f.plugin_file ) &&\n\t\t\t\tf.is_enabled\n\t\t).length,\n\t( state: State ) => [ state.harborHosts.basenames, state.features.bySlug ]\n);\n\n/**\n * True when any feature is being toggled or updated.\n *\n * Both toggle and update operations trigger WordPress install/activate/deactivate\n * operations that should not run concurrently.\n *\n * Memoized via createSelector so the loops only re-run when\n * the relevant sub-trees actually change.\n */\nexport const isAnyInstallableBusy = createSelector(\n\t(state: State): boolean => {\n\t\tconst { toggling, updating, bySlug } = state.features;\n\t\tconst isInstallable = (slug: string): boolean => {\n\t\t\tconst feature = bySlug[slug];\n\t\t\treturn feature !== undefined && isInstallableFeature(feature);\n\t\t};\n\t\treturn (\n\t\t\tObject.keys(toggling).some(isInstallable) ||\n\t\t\tObject.keys(updating).some(isInstallable)\n\t\t);\n\t},\n\t(state: State) => [\n\t\tstate.features.toggling,\n\t\tstate.features.updating,\n\t\tstate.features.bySlug,\n\t]\n);\n\n// ---------------------------------------------------------------------------\n// Legacy licenses\n// ---------------------------------------------------------------------------\n\nexport const getLegacyLicenses = createSelector(\n\t(state: State): LegacyLicense[] => Object.values(state.legacyLicenses.bySlug),\n\t(state: State) => [state.legacyLicenses.bySlug]\n);\n\nexport const getLegacyLicenseBySlug = (state: State, slug: string): LegacyLicense | null =>\n\tstate.legacyLicenses.bySlug[slug] ?? null;\n\nexport const hasLegacyLicense = (state: State, slug: string): boolean =>\n\tslug in state.legacyLicenses.bySlug;\n\nexport const hasLegacyLicenses = (state: State): boolean =>\n\tObject.keys(state.legacyLicenses.bySlug).length > 0;\n\n/**\n * True when at least one legacy license belongs to a product not already\n * covered by the unified license. Used to suppress the banner when the\n * unified license makes legacy notices redundant.\n */\nexport const hasUncoveredLegacyLicenses = (state: State): boolean =>\n\tObject.values(state.legacyLicenses.bySlug).some(\n\t\t(license) => !isProductUnifiedLicensed(state, license.product)\n\t);\n\n/**\n * Returns the legacy license for the given feature slug only if it is active,\n * or null if it does not exist or has expired.\n */\nexport const getActiveLegacyLicense = (state: State, slug: string): LegacyLicense | null => {\n\tconst license = state.legacyLicenses.bySlug[ slug ] ?? null;\n\treturn license !== null && license.is_active ? license : null;\n};\n\n/**\n * Returns all license products excluding those with a cancelled status.\n *\n * Cancelled products are excluded globally so they do not influence any\n * selector's output — they clutter the UI and should not affect license\n * validity or activation checks.\n */\nexport const getWithoutCancelledProducts = ( state: State ): LicenseProduct[] =>\n\tstate.license.license.products.filter( ( p ) => p.status !== 'cancelled' );\n\n/**\n * True when the unified license covers the given product slug.\n */\nexport const isProductUnifiedLicensed = (state: State, productSlug: string): boolean =>\n\tgetWithoutCancelledProducts( state ).some( ( p ) => p.product_slug === productSlug );\n\n/**\n * True when any tier entry for the given product has is_valid set to true,\n * meaning the product is activated on the current domain with an active entitlement.\n *\n * @since 1.0.0\n */\nexport const isProductLicenseValid = ( state: State, productSlug: string ): boolean =>\n\tgetWithoutCancelledProducts( state ).some( ( p ) => p.product_slug === productSlug && p.is_valid === true );\n\n/**\n * True when at least one feature belonging to the product has an active legacy license.\n */\nexport const hasActiveLegacyLicenseForProduct = createSelector(\n\t(state: State, productSlug: string): boolean =>\n\t\tObject.values( state.features.bySlug )\n\t\t\t.filter( (f) => f.product === productSlug )\n\t\t\t.some( (f) => state.legacyLicenses.bySlug[ f.slug ]?.is_active === true ),\n\t(state: State, productSlug: string) => [ state.features.bySlug, state.legacyLicenses.bySlug, productSlug ]\n);\n\n// ---------------------------------------------------------------------------\n// Catalog\n// ---------------------------------------------------------------------------\n\nexport const getCatalog = createSelector(\n\t(state: State): ProductCatalog[] =>\n\t\tObject.values(state.catalog.byProductSlug),\n\t(state: State) => [state.catalog.byProductSlug]\n);\n\nexport const getProductCatalog = (\n\tstate: State,\n\tslug: string\n): ProductCatalog | null => state.catalog.byProductSlug[slug] ?? null;\n\nexport const getProductTiers = createSelector(\n\t(state: State, slug: string): CatalogTier[] =>\n\t\tstate.catalog.byProductSlug[slug]?.tiers ?? [],\n\t(state: State, slug: string) => [state.catalog.byProductSlug, slug]\n);\n\n/**\n * Returns a single CatalogTier by product slug and tier slug, or null.\n *\n * Returns the full tier object so callers can read price, currency, etc.\n */\nexport const getCatalogTier = (\n\tstate: State,\n\tproductSlug: string,\n\ttierSlug: string\n): CatalogTier | null =>\n\tstate.catalog.byProductSlug[productSlug]?.tiers.find(\n\t\t(t) => t.tier_slug === tierSlug\n\t) ?? null;\n\n// ---------------------------------------------------------------------------\n// License\n// ---------------------------------------------------------------------------\n\nconst UNACTIVATED_STATUSES = [ 'not_activated', 'activation_required' ] as const;\n\n/**\n * True when a license is present and every non-expired product's validation_status\n * indicates it has not been activated on this domain. Expired products are excluded\n * so they don't suppress the notice for products that can still be activated.\n */\nexport const areAllProductsNotActivated = ( state: State ): boolean => {\n\tconst products = getWithoutCancelledProducts( state ).filter(\n\t\t( p ) => p.validation_status !== 'expired'\n\t);\n\treturn (\n\t\tproducts.length > 0 &&\n\t\tproducts.every(\n\t\t\t( p ) => UNACTIVATED_STATUSES.includes( p.validation_status as typeof UNACTIVATED_STATUSES[number] )\n\t\t)\n\t);\n};\n\n/**\n * Returns the first license product for the given slug that the user owns but\n * has not yet activated on this domain, or null when none exists.\n *\n * Matches entries where activated_here is not true and validation_status is\n * not_activated or activation_required — i.e. the subscription exists but the\n * current domain is not in the activations list.\n *\n * @since 1.0.1\n */\nexport const getUnactivatedLicenseProduct = (\n\tstate: State,\n\tproductSlug: string\n): LicenseProduct | null =>\n\tgetWithoutCancelledProducts( state ).find(\n\t\t( p ) =>\n\t\t\tp.product_slug === productSlug &&\n\t\t\tp.activated_here !== true &&\n\t\t\tUNACTIVATED_STATUSES.includes( p.validation_status as typeof UNACTIVATED_STATUSES[ number ] )\n\t) ?? null;\n\n/**\n * Returns the stored unified license key, or null. Triggers getLicenseKey resolver.\n * @param state\n */\nexport const getLicenseKey = (state: State): string | null =>\n\tstate.license.license.key;\n\nexport const hasLicense = (state: State): boolean =>\n\tstate.license.license.key !== null;\n\nexport const getLicenseProducts = (state: State): LicenseProduct[] =>\n\tgetWithoutCancelledProducts( state )\n\t\t.slice()\n\t\t.sort( ( a, b ) => ( b.activated_here === true ? 1 : 0 ) - ( a.activated_here === true ? 1 : 0 ) );\n\nexport const getLicenseError = (state: State): LicenseError | null =>\n\tstate.license.license.error;\n\nexport const isLicenseStoring = (state: State): boolean =>\n\tstate.license.isStoring;\n\nexport const isLicenseDeleting = (state: State): boolean =>\n\tstate.license.isDeleting;\n\nexport const isLicenseRefreshing = (state: State): boolean =>\n\tstate.license.isRefreshing;\n\nexport const canModifyLicense = (state: State): boolean =>\n\t!state.license.isStoring &&\n\t!state.license.isDeleting &&\n\t!state.license.isRefreshing;\n\nexport const getStoreLicenseError = (state: State): HarborError | null =>\n\tstate.license.storeError;\n\nexport const getDeleteLicenseError = (state: State): HarborError | null =>\n\tstate.license.deleteError;\n\nexport const getRefreshLicenseError = (state: State): HarborError | null =>\n\tstate.license.refreshError;\n","/**\n * Type guard utilities for narrowing Feature union types.\n *\n * @package LiquidWeb\\Harbor\n */\nimport type {\n\tFeature,\n\tPluginFeature,\n\tThemeFeature,\n\tServiceFeature,\n\tInstallableFeature,\n} from '@/types/api';\n\nexport function isPluginFeature( feature: Feature ): feature is PluginFeature {\n\treturn feature.type === 'plugin';\n}\n\nexport function isThemeFeature( feature: Feature ): feature is ThemeFeature {\n\treturn feature.type === 'theme';\n}\n\nexport function isServiceFeature( feature: Feature ): feature is ServiceFeature {\n\treturn feature.type === 'service';\n}\n\nexport function isInstallableFeature( feature: Feature ): feature is InstallableFeature {\n\treturn feature.type === 'plugin' || feature.type === 'theme';\n}\n","var currentNonce;\nexport var setNonce = function (nonce) {\n currentNonce = nonce;\n};\nexport var getNonce = function () {\n if (currentNonce) {\n return currentNonce;\n }\n if (typeof __webpack_nonce__ !== 'undefined') {\n return __webpack_nonce__;\n }\n return undefined;\n};\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.js';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n )\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.js';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.js';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M20 6 9 17l-5-5\", key: \"1gmf2c\" }]];\nconst Check = createLucideIcon(\"check\", __iconNode);\n\nexport { __iconNode, Check as default };\n//# sourceMappingURL=check.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"m18 15-6-6-6 6\", key: \"153udz\" }]];\nconst ChevronUp = createLucideIcon(\"chevron-up\", __iconNode);\n\nexport { __iconNode, ChevronUp as default };\n//# sourceMappingURL=chevron-up.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M21.801 10A10 10 0 1 1 17 3.335\", key: \"yps3ct\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n];\nconst CircleCheckBig = createLucideIcon(\"circle-check-big\", __iconNode);\n\nexport { __iconNode, CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15V3\", key: \"m9g1x1\" }],\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"path\", { d: \"m7 10 5 5 5-5\", key: \"brsn70\" }]\n];\nconst Download = createLucideIcon(\"download\", __iconNode);\n\nexport { __iconNode, Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 3h6v6\", key: \"1q9fwt\" }],\n [\"path\", { d: \"M10 14 21 3\", key: \"gplh6r\" }],\n [\"path\", { d: \"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\", key: \"a6xqqp\" }]\n];\nconst ExternalLink = createLucideIcon(\"external-link\", __iconNode);\n\nexport { __iconNode, ExternalLink as default };\n//# sourceMappingURL=external-link.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n];\nconst KeyRound = createLucideIcon(\"key-round\", __iconNode);\n\nexport { __iconNode, KeyRound as default };\n//# sourceMappingURL=key-round.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [[\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]];\nconst LoaderCircle = createLucideIcon(\"loader-circle\", __iconNode);\n\nexport { __iconNode, LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n 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\",\n key: \"1a8usu\"\n }\n ],\n [\"path\", { d: \"m15 5 4 4\", key: \"1mk7zo\" }]\n];\nconst Pencil = createLucideIcon(\"pencil\", __iconNode);\n\nexport { __iconNode, Pencil as default };\n//# sourceMappingURL=pencil.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\", key: \"qeys4\" }],\n [\n \"path\",\n {\n d: \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09\",\n key: \"u4xsad\"\n }\n ],\n [\n \"path\",\n {\n d: \"M9 12a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.4 22.4 0 0 1-4 2z\",\n key: \"676m9\"\n }\n ],\n [\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 .05 5 .05\", key: \"92ym6u\" }]\n];\nconst Rocket = createLucideIcon(\"rocket\", __iconNode);\n\nexport { __iconNode, Rocket as default };\n//# sourceMappingURL=rocket.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst TriangleAlert = createLucideIcon(\"triangle-alert\", __iconNode);\n\nexport { __iconNode, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.js.map\n","/**\n * @license lucide-react v0.575.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.js';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.js.map\n","// extracted by mini-css-extract-plugin\nexport {};","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","import * as React from 'react';\nimport { styleSingleton } from 'react-style-singleton';\nimport { fullWidthClassName, zeroRightClassName, noScrollbarsClassName, removedBarSizeVariable } from './constants';\nimport { getGapWidth } from './utils';\nvar Style = styleSingleton();\nexport var lockAttribute = 'data-scroll-locked';\n// important tip - once we measure scrollBar width and remove them\n// we could not repeat this operation\n// thus we are using style-singleton - only the first \"yet correct\" style will be applied.\nvar getStyles = function (_a, allowRelative, gapMode, important) {\n var left = _a.left, top = _a.top, right = _a.right, gap = _a.gap;\n if (gapMode === void 0) { gapMode = 'margin'; }\n return \"\\n .\".concat(noScrollbarsClassName, \" {\\n overflow: hidden \").concat(important, \";\\n padding-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n body[\").concat(lockAttribute, \"] {\\n overflow: hidden \").concat(important, \";\\n overscroll-behavior: contain;\\n \").concat([\n allowRelative && \"position: relative \".concat(important, \";\"),\n gapMode === 'margin' &&\n \"\\n padding-left: \".concat(left, \"px;\\n padding-top: \").concat(top, \"px;\\n padding-right: \").concat(right, \"px;\\n margin-left:0;\\n margin-top:0;\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n \"),\n gapMode === 'padding' && \"padding-right: \".concat(gap, \"px \").concat(important, \";\"),\n ]\n .filter(Boolean)\n .join(''), \"\\n }\\n \\n .\").concat(zeroRightClassName, \" {\\n right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" {\\n margin-right: \").concat(gap, \"px \").concat(important, \";\\n }\\n \\n .\").concat(zeroRightClassName, \" .\").concat(zeroRightClassName, \" {\\n right: 0 \").concat(important, \";\\n }\\n \\n .\").concat(fullWidthClassName, \" .\").concat(fullWidthClassName, \" {\\n margin-right: 0 \").concat(important, \";\\n }\\n \\n body[\").concat(lockAttribute, \"] {\\n \").concat(removedBarSizeVariable, \": \").concat(gap, \"px;\\n }\\n\");\n};\nvar getCurrentUseCounter = function () {\n var counter = parseInt(document.body.getAttribute(lockAttribute) || '0', 10);\n return isFinite(counter) ? counter : 0;\n};\nexport var useLockAttribute = function () {\n React.useEffect(function () {\n document.body.setAttribute(lockAttribute, (getCurrentUseCounter() + 1).toString());\n return function () {\n var newCounter = getCurrentUseCounter() - 1;\n if (newCounter <= 0) {\n document.body.removeAttribute(lockAttribute);\n }\n else {\n document.body.setAttribute(lockAttribute, newCounter.toString());\n }\n };\n }, []);\n};\n/**\n * Removes page scrollbar and blocks page scroll when mounted\n */\nexport var RemoveScrollBar = function (_a) {\n var noRelative = _a.noRelative, noImportant = _a.noImportant, _b = _a.gapMode, gapMode = _b === void 0 ? 'margin' : _b;\n useLockAttribute();\n /*\n gap will be measured on every component mount\n however it will be used only by the \"first\" invocation\n due to singleton nature of Math.abs(deltaY) ? 'h' : 'v';\n // allow horizontal touch move on Range inputs. They will not cause any scroll\n if ('touches' in event && moveDirection === 'h' && target.type === 'range') {\n return false;\n }\n // allow drag selection (iOS); check if selection's anchorNode is the same as target or contains target\n var selection = window.getSelection();\n var anchorNode = selection && selection.anchorNode;\n var isTouchingSelection = anchorNode ? anchorNode === target || anchorNode.contains(target) : false;\n if (isTouchingSelection) {\n return false;\n }\n var canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n if (!canBeScrolledInMainDirection) {\n return true;\n }\n if (canBeScrolledInMainDirection) {\n currentAxis = moveDirection;\n }\n else {\n currentAxis = moveDirection === 'v' ? 'h' : 'v';\n canBeScrolledInMainDirection = locationCouldBeScrolled(moveDirection, target);\n // other axis might be not scrollable\n }\n if (!canBeScrolledInMainDirection) {\n return false;\n }\n if (!activeAxis.current && 'changedTouches' in event && (deltaX || deltaY)) {\n activeAxis.current = currentAxis;\n }\n if (!currentAxis) {\n return true;\n }\n var cancelingAxis = activeAxis.current || currentAxis;\n return handleScroll(cancelingAxis, parent, event, cancelingAxis === 'h' ? deltaX : deltaY, true);\n }, []);\n var shouldPrevent = React.useCallback(function (_event) {\n var event = _event;\n if (!lockStack.length || lockStack[lockStack.length - 1] !== Style) {\n // not the last active\n return;\n }\n var delta = 'deltaY' in event ? getDeltaXY(event) : getTouchXY(event);\n var sourceEvent = shouldPreventQueue.current.filter(function (e) { return e.name === event.type && (e.target === event.target || event.target === e.shadowParent) && deltaCompare(e.delta, delta); })[0];\n // self event, and should be canceled\n if (sourceEvent && sourceEvent.should) {\n if (event.cancelable) {\n event.preventDefault();\n }\n return;\n }\n // outside or shard event\n if (!sourceEvent) {\n var shardNodes = (lastProps.current.shards || [])\n .map(extractRef)\n .filter(Boolean)\n .filter(function (node) { return node.contains(event.target); });\n var shouldStop = shardNodes.length > 0 ? shouldCancelEvent(event, shardNodes[0]) : !lastProps.current.noIsolation;\n if (shouldStop) {\n if (event.cancelable) {\n event.preventDefault();\n }\n }\n }\n }, []);\n var shouldCancel = React.useCallback(function (name, delta, target, should) {\n var event = { name: name, delta: delta, target: target, should: should, shadowParent: getOutermostShadowParent(target) };\n shouldPreventQueue.current.push(event);\n setTimeout(function () {\n shouldPreventQueue.current = shouldPreventQueue.current.filter(function (e) { return e !== event; });\n }, 1);\n }, []);\n var scrollTouchStart = React.useCallback(function (event) {\n touchStartRef.current = getTouchXY(event);\n activeAxis.current = undefined;\n }, []);\n var scrollWheel = React.useCallback(function (event) {\n shouldCancel(event.type, getDeltaXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n var scrollTouchMove = React.useCallback(function (event) {\n shouldCancel(event.type, getTouchXY(event), event.target, shouldCancelEvent(event, props.lockRef.current));\n }, []);\n React.useEffect(function () {\n lockStack.push(Style);\n props.setCallbacks({\n onScrollCapture: scrollWheel,\n onWheelCapture: scrollWheel,\n onTouchMoveCapture: scrollTouchMove,\n });\n document.addEventListener('wheel', shouldPrevent, nonPassive);\n document.addEventListener('touchmove', shouldPrevent, nonPassive);\n document.addEventListener('touchstart', scrollTouchStart, nonPassive);\n return function () {\n lockStack = lockStack.filter(function (inst) { return inst !== Style; });\n document.removeEventListener('wheel', shouldPrevent, nonPassive);\n document.removeEventListener('touchmove', shouldPrevent, nonPassive);\n document.removeEventListener('touchstart', scrollTouchStart, nonPassive);\n };\n }, []);\n var removeScrollBar = props.removeScrollBar, inert = props.inert;\n return (React.createElement(React.Fragment, null,\n inert ? React.createElement(Style, { styles: generateStyle(id) }) : null,\n removeScrollBar ? React.createElement(RemoveScrollBar, { noRelative: props.noRelative, gapMode: props.gapMode }) : null));\n}\nfunction getOutermostShadowParent(node) {\n var shadowParent = null;\n while (node !== null) {\n if (node instanceof ShadowRoot) {\n shadowParent = node.host;\n node = node.host;\n }\n node = node.parentNode;\n }\n return shadowParent;\n}\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nimport { fullWidthClassName, zeroRightClassName } from 'react-remove-scroll-bar/constants';\nimport { useMergeRefs } from 'use-callback-ref';\nimport { effectCar } from './medium';\nvar nothing = function () {\n return;\n};\n/**\n * Removes scrollbar from the page and contain the scroll within the Lock\n */\nvar RemoveScroll = React.forwardRef(function (props, parentRef) {\n var ref = React.useRef(null);\n var _a = React.useState({\n onScrollCapture: nothing,\n onWheelCapture: nothing,\n onTouchMoveCapture: nothing,\n }), callbacks = _a[0], setCallbacks = _a[1];\n var forwardProps = props.forwardProps, children = props.children, className = props.className, removeScrollBar = props.removeScrollBar, enabled = props.enabled, shards = props.shards, sideCar = props.sideCar, noRelative = props.noRelative, noIsolation = props.noIsolation, inert = props.inert, allowPinchZoom = props.allowPinchZoom, _b = props.as, Container = _b === void 0 ? 'div' : _b, gapMode = props.gapMode, rest = __rest(props, [\"forwardProps\", \"children\", \"className\", \"removeScrollBar\", \"enabled\", \"shards\", \"sideCar\", \"noRelative\", \"noIsolation\", \"inert\", \"allowPinchZoom\", \"as\", \"gapMode\"]);\n var SideCar = sideCar;\n var containerRef = useMergeRefs([ref, parentRef]);\n var containerProps = __assign(__assign({}, rest), callbacks);\n return (React.createElement(React.Fragment, null,\n enabled && (React.createElement(SideCar, { sideCar: effectCar, removeScrollBar: removeScrollBar, shards: shards, noRelative: noRelative, noIsolation: noIsolation, inert: inert, setCallbacks: setCallbacks, allowPinchZoom: !!allowPinchZoom, lockRef: ref, gapMode: gapMode })),\n forwardProps ? (React.cloneElement(React.Children.only(children), __assign(__assign({}, containerProps), { ref: containerRef }))) : (React.createElement(Container, __assign({}, containerProps, { className: className, ref: containerRef }), children))));\n});\nRemoveScroll.defaultProps = {\n enabled: true,\n removeScrollBar: true,\n inert: false,\n};\nRemoveScroll.classNames = {\n fullWidth: fullWidthClassName,\n zeroRight: zeroRightClassName,\n};\nexport { RemoveScroll };\n","var passiveSupported = false;\nif (typeof window !== 'undefined') {\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function () {\n passiveSupported = true;\n return true;\n },\n });\n // @ts-ignore\n window.addEventListener('test', options, options);\n // @ts-ignore\n window.removeEventListener('test', options, options);\n }\n catch (err) {\n passiveSupported = false;\n }\n}\nexport var nonPassive = passiveSupported ? { passive: false } : false;\n","var alwaysContainsScroll = function (node) {\n // textarea will always _contain_ scroll inside self. It only can be hidden\n return node.tagName === 'TEXTAREA';\n};\nvar elementCanBeScrolled = function (node, overflow) {\n if (!(node instanceof Element)) {\n return false;\n }\n var styles = window.getComputedStyle(node);\n return (\n // not-not-scrollable\n styles[overflow] !== 'hidden' &&\n // contains scroll inside self\n !(styles.overflowY === styles.overflowX && !alwaysContainsScroll(node) && styles[overflow] === 'visible'));\n};\nvar elementCouldBeVScrolled = function (node) { return elementCanBeScrolled(node, 'overflowY'); };\nvar elementCouldBeHScrolled = function (node) { return elementCanBeScrolled(node, 'overflowX'); };\nexport var locationCouldBeScrolled = function (axis, node) {\n var ownerDocument = node.ownerDocument;\n var current = node;\n do {\n // Skip over shadow root\n if (typeof ShadowRoot !== 'undefined' && current instanceof ShadowRoot) {\n current = current.host;\n }\n var isScrollable = elementCouldBeScrolled(axis, current);\n if (isScrollable) {\n var _a = getScrollVariables(axis, current), scrollHeight = _a[1], clientHeight = _a[2];\n if (scrollHeight > clientHeight) {\n return true;\n }\n }\n current = current.parentNode;\n } while (current && current !== ownerDocument.body);\n return false;\n};\nvar getVScrollVariables = function (_a) {\n var scrollTop = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;\n return [\n scrollTop,\n scrollHeight,\n clientHeight,\n ];\n};\nvar getHScrollVariables = function (_a) {\n var scrollLeft = _a.scrollLeft, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth;\n return [\n scrollLeft,\n scrollWidth,\n clientWidth,\n ];\n};\nvar elementCouldBeScrolled = function (axis, node) {\n return axis === 'v' ? elementCouldBeVScrolled(node) : elementCouldBeHScrolled(node);\n};\nvar getScrollVariables = function (axis, node) {\n return axis === 'v' ? getVScrollVariables(node) : getHScrollVariables(node);\n};\nvar getDirectionFactor = function (axis, direction) {\n /**\n * If the element's direction is rtl (right-to-left), then scrollLeft is 0 when the scrollbar is at its rightmost position,\n * and then increasingly negative as you scroll towards the end of the content.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft\n */\n return axis === 'h' && direction === 'rtl' ? -1 : 1;\n};\nexport var handleScroll = function (axis, endTarget, event, sourceDelta, noOverscroll) {\n var directionFactor = getDirectionFactor(axis, window.getComputedStyle(endTarget).direction);\n var delta = directionFactor * sourceDelta;\n // find scrollable target\n var target = event.target;\n var targetInLock = endTarget.contains(target);\n var shouldCancelScroll = false;\n var isDeltaPositive = delta > 0;\n var availableScroll = 0;\n var availableScrollTop = 0;\n do {\n if (!target) {\n break;\n }\n var _a = getScrollVariables(axis, target), position = _a[0], scroll_1 = _a[1], capacity = _a[2];\n var elementScroll = scroll_1 - capacity - directionFactor * position;\n if (position || elementScroll) {\n if (elementCouldBeScrolled(axis, target)) {\n availableScroll += elementScroll;\n availableScrollTop += position;\n }\n }\n var parent_1 = target.parentNode;\n // we will \"bubble\" from ShadowDom in case we are, or just to the parent in normal case\n // this is the same logic used in focus-lock\n target = (parent_1 && parent_1.nodeType === Node.DOCUMENT_FRAGMENT_NODE ? parent_1.host : parent_1);\n } while (\n // portaled content\n (!targetInLock && target !== document.body) ||\n // self content\n (targetInLock && (endTarget.contains(target) || endTarget === target)));\n // handle epsilon around 0 (non standard zoom levels)\n if (isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScroll) < 1) || (!noOverscroll && delta > availableScroll))) {\n shouldCancelScroll = true;\n }\n else if (!isDeltaPositive &&\n ((noOverscroll && Math.abs(availableScrollTop) < 1) || (!noOverscroll && -delta > availableScrollTop))) {\n shouldCancelScroll = true;\n }\n return shouldCancelScroll;\n};\n","import { createSidecarMedium } from 'use-sidecar';\nexport var effectCar = createSidecarMedium();\n","import { exportSidecar } from 'use-sidecar';\nimport { RemoveScrollSideCar } from './SideEffect';\nimport { effectCar } from './medium';\nexport default exportSidecar(effectCar, RemoveScrollSideCar);\n","import { styleHookSingleton } from './hook';\n/**\n * create a Component to add styles on demand\n * - styles are added when first instance is mounted\n * - styles are removed when the last instance is unmounted\n * - changing styles in runtime does nothing unless dynamic is set. But with multiple components that can lead to the undefined behavior\n */\nexport var styleSingleton = function () {\n var useStyle = styleHookSingleton();\n var Sheet = function (_a) {\n var styles = _a.styles, dynamic = _a.dynamic;\n useStyle(styles, dynamic);\n return null;\n };\n return Sheet;\n};\n","import * as React from 'react';\nimport { stylesheetSingleton } from './singleton';\n/**\n * creates a hook to control style singleton\n * @see {@link styleSingleton} for a safer component version\n * @example\n * ```tsx\n * const useStyle = styleHookSingleton();\n * ///\n * useStyle('body { overflow: hidden}');\n */\nexport var styleHookSingleton = function () {\n var sheet = stylesheetSingleton();\n return function (styles, isDynamic) {\n React.useEffect(function () {\n sheet.add(styles);\n return function () {\n sheet.remove();\n };\n }, [styles && isDynamic]);\n };\n};\n","export { styleSingleton } from './component';\nexport { stylesheetSingleton } from './singleton';\nexport { styleHookSingleton } from './hook';\n","import { getNonce } from 'get-nonce';\nfunction makeStyleTag() {\n if (!document)\n return null;\n var tag = document.createElement('style');\n tag.type = 'text/css';\n var nonce = getNonce();\n if (nonce) {\n tag.setAttribute('nonce', nonce);\n }\n return tag;\n}\nfunction injectStyles(tag, css) {\n // @ts-ignore\n if (tag.styleSheet) {\n // @ts-ignore\n tag.styleSheet.cssText = css;\n }\n else {\n tag.appendChild(document.createTextNode(css));\n }\n}\nfunction insertStyleTag(tag) {\n var head = document.head || document.getElementsByTagName('head')[0];\n head.appendChild(tag);\n}\nexport var stylesheetSingleton = function () {\n var counter = 0;\n var stylesheet = null;\n return {\n add: function (style) {\n if (counter == 0) {\n if ((stylesheet = makeStyleTag())) {\n injectStyles(stylesheet, style);\n insertStyleTag(stylesheet);\n }\n }\n counter++;\n },\n remove: function () {\n counter--;\n if (!counter && stylesheet) {\n stylesheet.parentNode && stylesheet.parentNode.removeChild(stylesheet);\n stylesheet = null;\n }\n },\n };\n};\n","/**\n * Assigns a value for a given ref, no matter of the ref format\n * @param {RefObject} ref - a callback function or ref object\n * @param value - a new value\n *\n * @see https://github.com/theKashey/use-callback-ref#assignref\n * @example\n * const refObject = useRef();\n * const refFn = (ref) => {....}\n *\n * assignRef(refObject, \"refValue\");\n * assignRef(refFn, \"refValue\");\n */\nexport function assignRef(ref, value) {\n if (typeof ref === 'function') {\n ref(value);\n }\n else if (ref) {\n ref.current = value;\n }\n return ref;\n}\n","import * as React from 'react';\nimport { assignRef } from './assignRef';\nimport { useCallbackRef } from './useRef';\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;\nvar currentValues = new WeakMap();\n/**\n * Merges two or more refs together providing a single interface to set their value\n * @param {RefObject|Ref} refs\n * @returns {MutableRefObject} - a new ref, which translates all changes to {refs}\n *\n * @see {@link mergeRefs} a version without buit-in memoization\n * @see https://github.com/theKashey/use-callback-ref#usemergerefs\n * @example\n * const Component = React.forwardRef((props, ref) => {\n * const ownRef = useRef();\n * const domRef = useMergeRefs([ref, ownRef]); // 👈 merge together\n * return
    ...
    \n * }\n */\nexport function useMergeRefs(refs, defaultValue) {\n var callbackRef = useCallbackRef(defaultValue || null, function (newValue) {\n return refs.forEach(function (ref) { return assignRef(ref, newValue); });\n });\n // handle refs changes - added or removed\n useIsomorphicLayoutEffect(function () {\n var oldValue = currentValues.get(callbackRef);\n if (oldValue) {\n var prevRefs_1 = new Set(oldValue);\n var nextRefs_1 = new Set(refs);\n var current_1 = callbackRef.current;\n prevRefs_1.forEach(function (ref) {\n if (!nextRefs_1.has(ref)) {\n assignRef(ref, null);\n }\n });\n nextRefs_1.forEach(function (ref) {\n if (!prevRefs_1.has(ref)) {\n assignRef(ref, current_1);\n }\n });\n }\n currentValues.set(callbackRef, refs);\n }, [refs]);\n return callbackRef;\n}\n","import { useState } from 'react';\n/**\n * creates a MutableRef with ref change callback\n * @param initialValue - initial ref value\n * @param {Function} callback - a callback to run when value changes\n *\n * @example\n * const ref = useCallbackRef(0, (newValue, oldValue) => console.log(oldValue, '->', newValue);\n * ref.current = 1;\n * // prints 0 -> 1\n *\n * @see https://reactjs.org/docs/hooks-reference.html#useref\n * @see https://github.com/theKashey/use-callback-ref#usecallbackref---to-replace-reactuseref\n * @returns {MutableRefObject}\n */\nexport function useCallbackRef(initialValue, callback) {\n var ref = useState(function () { return ({\n // value\n value: initialValue,\n // last callback\n callback: callback,\n // \"memoized\" public interface\n facade: {\n get current() {\n return ref.value;\n },\n set current(value) {\n var last = ref.value;\n if (last !== value) {\n ref.value = value;\n ref.callback(value, last);\n }\n },\n },\n }); })[0];\n // update callback\n ref.callback = callback;\n return ref.facade;\n}\n","import { __assign, __rest } from \"tslib\";\nimport * as React from 'react';\nvar SideCar = function (_a) {\n var sideCar = _a.sideCar, rest = __rest(_a, [\"sideCar\"]);\n if (!sideCar) {\n throw new Error('Sidecar: please provide `sideCar` property to import the right car');\n }\n var Target = sideCar.read();\n if (!Target) {\n throw new Error('Sidecar medium not found');\n }\n return React.createElement(Target, __assign({}, rest));\n};\nSideCar.isSideCarExport = true;\nexport function exportSidecar(medium, exported) {\n medium.useMedium(exported);\n return SideCar;\n}\n","import { __assign } from \"tslib\";\nfunction ItoI(a) {\n return a;\n}\nfunction innerCreateMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n var buffer = [];\n var assigned = false;\n var medium = {\n read: function () {\n if (assigned) {\n throw new Error('Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`.');\n }\n if (buffer.length) {\n return buffer[buffer.length - 1];\n }\n return defaults;\n },\n useMedium: function (data) {\n var item = middleware(data, assigned);\n buffer.push(item);\n return function () {\n buffer = buffer.filter(function (x) { return x !== item; });\n };\n },\n assignSyncMedium: function (cb) {\n assigned = true;\n while (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n }\n buffer = {\n push: function (x) { return cb(x); },\n filter: function () { return buffer; },\n };\n },\n assignMedium: function (cb) {\n assigned = true;\n var pendingQueue = [];\n if (buffer.length) {\n var cbs = buffer;\n buffer = [];\n cbs.forEach(cb);\n pendingQueue = buffer;\n }\n var executeQueue = function () {\n var cbs = pendingQueue;\n pendingQueue = [];\n cbs.forEach(cb);\n };\n var cycle = function () { return Promise.resolve().then(executeQueue); };\n cycle();\n buffer = {\n push: function (x) {\n pendingQueue.push(x);\n cycle();\n },\n filter: function (filter) {\n pendingQueue = pendingQueue.filter(filter);\n return buffer;\n },\n };\n },\n };\n return medium;\n}\nexport function createMedium(defaults, middleware) {\n if (middleware === void 0) { middleware = ItoI; }\n return innerCreateMedium(defaults, middleware);\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function createSidecarMedium(options) {\n if (options === void 0) { options = {}; }\n var medium = innerCreateMedium(null);\n medium.options = __assign({ async: true, ssr: false }, options);\n return medium;\n}\n","module.exports = window[\"React\"];","module.exports = window[\"ReactDOM\"];","module.exports = window[\"ReactJSXRuntime\"];","module.exports = window[\"wp\"][\"apiFetch\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n var _platform$detectOverf;\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform: {\n ...platform,\n detectOverflow: (_platform$detectOverf = platform.detectOverflow) != null ? _platform$detectOverf : detectOverflow\n },\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects,\n platform\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await platform.detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n platform\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await platform.detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the element as the offsetParent if it's non-static,\n // while Chrome and Safari return the element. The element must\n // be used to perform the correct calculations even if the element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle